Merge branch 'release/1.0.0' of github.com:ONLYOFFICE/AppServer into release/1.0.0
This commit is contained in:
commit
d8a1bc167b
@ -6,6 +6,7 @@ using System.Threading.Tasks;
|
||||
using ASC.Common;
|
||||
using ASC.Core;
|
||||
using ASC.Web.Core;
|
||||
using ASC.Web.Core.Helpers;
|
||||
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@ -16,6 +17,7 @@ namespace ASC.Api.Core.Auth
|
||||
[Scope]
|
||||
public class CookieAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
|
||||
{
|
||||
private AuthorizationHelper AuthorizationHelper { get; }
|
||||
private SecurityContext SecurityContext { get; }
|
||||
private CookiesManager CookiesManager { get; }
|
||||
|
||||
@ -23,17 +25,20 @@ namespace ASC.Api.Core.Auth
|
||||
{
|
||||
}
|
||||
//
|
||||
public CookieAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, SecurityContext securityContext, CookiesManager cookiesManager)
|
||||
public CookieAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock,
|
||||
AuthorizationHelper authorizationHelper,
|
||||
SecurityContext securityContext,
|
||||
CookiesManager cookiesManager)
|
||||
: this(options, logger, encoder, clock)
|
||||
{
|
||||
AuthorizationHelper = authorizationHelper;
|
||||
SecurityContext = securityContext;
|
||||
CookiesManager = cookiesManager;
|
||||
}
|
||||
|
||||
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
|
||||
{
|
||||
var token = Context.Request.Cookies["asc_auth_key"] ?? Context.Request.Headers["Authorization"];
|
||||
var result = SecurityContext.AuthenticateMe(token);
|
||||
var result = AuthorizationHelper.ProcessBasicAuthorization(out _);
|
||||
|
||||
if (!result)
|
||||
{
|
||||
|
@ -45,7 +45,7 @@
|
||||
"enabled": "enabled"
|
||||
},
|
||||
"version": {
|
||||
"number": "1.0.0",
|
||||
"number": "11.5.0",
|
||||
"release": {
|
||||
"date": "",
|
||||
"sign": ""
|
||||
|
@ -117,10 +117,11 @@ class PageLayout extends React.Component {
|
||||
const isPortrait =
|
||||
isFirefox &&
|
||||
isMobileOnly &&
|
||||
screen.orientation.type === "landscape-primary";
|
||||
screen.orientation.type === "portrait-primary";
|
||||
|
||||
if ((!isEnoughWidth && isValueExist) || isPortrait) {
|
||||
this.backdropClick();
|
||||
return;
|
||||
}
|
||||
if (isEnoughWidth && isValueExist) {
|
||||
this.pinArticle();
|
||||
|
@ -25,7 +25,7 @@ const PureThirdPartyMoveContainer = ({
|
||||
setThirdPartyMoveDialogVisible,
|
||||
}) => {
|
||||
const zIndex = 310;
|
||||
const deleteAfter = true; // TODO: get from settings
|
||||
const deleteAfter = false; // TODO: get from settings
|
||||
|
||||
const onClose = () => {
|
||||
setDestFolderId(false);
|
||||
@ -51,6 +51,10 @@ const PureThirdPartyMoveContainer = ({
|
||||
fileIds,
|
||||
deleteAfter,
|
||||
isCopy,
|
||||
translations: {
|
||||
copy: t("Translations:CopyOperation"),
|
||||
move: t("Translations:MoveToOperation"),
|
||||
},
|
||||
};
|
||||
|
||||
checkOperationConflict(data);
|
||||
|
@ -5,7 +5,6 @@ import { withRouter } from "react-router";
|
||||
import queryString from "query-string";
|
||||
import history from "@appserver/common/history";
|
||||
import MediaViewer from "@appserver/common/components/MediaViewer";
|
||||
import FilesFilter from "@appserver/common/api/files/filter";
|
||||
import { createTreeFolders } from "../../../helpers/files-helpers";
|
||||
|
||||
const FilesMediaViewer = (props) => {
|
||||
@ -86,8 +85,8 @@ const FilesMediaViewer = (props) => {
|
||||
};
|
||||
|
||||
const onDownloadMediaFile = (id) => {
|
||||
if (files.length > 0) {
|
||||
let viewUrlFile = files.find((file) => file.id === id).viewUrl;
|
||||
if (playlist.length > 0) {
|
||||
let viewUrlFile = playlist.find((file) => file.fileId === id).src;
|
||||
return window.open(viewUrlFile, "_self");
|
||||
}
|
||||
};
|
||||
|
@ -28,6 +28,8 @@ const SectionBodyContent = (props) => {
|
||||
moveDragItems,
|
||||
viewAs,
|
||||
setSelection,
|
||||
tooltipPageX,
|
||||
tooltipPageY,
|
||||
} = props;
|
||||
|
||||
useEffect(() => {
|
||||
@ -68,6 +70,13 @@ const SectionBodyContent = (props) => {
|
||||
};
|
||||
|
||||
const onMouseMove = (e) => {
|
||||
if (
|
||||
Math.abs(e.pageX - tooltipPageX) < 5 &&
|
||||
Math.abs(e.pageY - tooltipPageY) < 5
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!dragging) {
|
||||
document.body.classList.add("drag-cursor");
|
||||
setDragging(true);
|
||||
@ -212,6 +221,8 @@ export default inject(
|
||||
startDrag,
|
||||
setStartDrag,
|
||||
setSelection,
|
||||
tooltipPageX,
|
||||
tooltipPageY,
|
||||
} = filesStore;
|
||||
|
||||
return {
|
||||
@ -229,6 +240,8 @@ export default inject(
|
||||
moveDragItems: filesActionsStore.moveDragItems,
|
||||
viewAs,
|
||||
setSelection,
|
||||
tooltipPageX,
|
||||
tooltipPageY,
|
||||
};
|
||||
}
|
||||
)(
|
||||
|
@ -66,7 +66,7 @@ class FilesActionStore {
|
||||
clearSecondaryProgressData,
|
||||
} = this.uploadDataStore.secondaryProgressDataStore;
|
||||
|
||||
const deleteAfter = true; //Delete after finished TODO: get from settings
|
||||
const deleteAfter = false; //Delete after finished TODO: get from settings
|
||||
const immediately = isRecycleBinFolder || isPrivacyFolder ? true : false; //Don't move to the Recycle Bin
|
||||
|
||||
const folderIds = [];
|
||||
@ -590,7 +590,7 @@ class FilesActionStore {
|
||||
moveDragItems = (destFolderId, folderTitle, translations) => {
|
||||
const folderIds = [];
|
||||
const fileIds = [];
|
||||
const deleteAfter = true;
|
||||
const deleteAfter = false;
|
||||
|
||||
const { selection } = this.filesStore;
|
||||
const { isRootFolder } = this.selectedFolderStore;
|
||||
@ -663,7 +663,7 @@ class FilesActionStore {
|
||||
try {
|
||||
await this.uploadDataStore.itemOperationToFolder(operationData);
|
||||
} catch (err) {
|
||||
return toastr.error(err.message);
|
||||
return toastr.error(err.message ? err.message : err);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -1242,7 +1242,7 @@ class FilesStore {
|
||||
}
|
||||
|
||||
const hasFiles = cbMenu.some(
|
||||
(elem) => elem !== "all" && elem !== FilterType.DocumentsOnly
|
||||
(elem) => elem !== "all" && elem !== FilterType.FoldersOnly
|
||||
);
|
||||
|
||||
if (hasFiles) cbMenu.push(FilterType.FilesOnly);
|
||||
|
@ -766,8 +766,8 @@ class UploadDataStore {
|
||||
.then((res) => {
|
||||
if (res[0]?.error) return Promise.reject(res[0].error);
|
||||
|
||||
const id = res[0] && res[0].id ? res[0].id : null;
|
||||
return this.loopFilesOperations(id, destFolderId, true);
|
||||
const data = res[0] ? res[0] : null;
|
||||
return this.loopFilesOperations(data, destFolderId, true);
|
||||
})
|
||||
.catch((err) => {
|
||||
setSecondaryProgressBarData({
|
||||
@ -801,8 +801,8 @@ class UploadDataStore {
|
||||
deleteAfter
|
||||
)
|
||||
.then((res) => {
|
||||
const id = res[0] && res[0].id ? res[0].id : null;
|
||||
this.loopFilesOperations(id, destFolderId, false);
|
||||
const data = res[0] ? res[0] : null;
|
||||
return this.loopFilesOperations(data, destFolderId, false);
|
||||
})
|
||||
.catch((err) => {
|
||||
setSecondaryProgressBarData({
|
||||
@ -853,7 +853,7 @@ class UploadDataStore {
|
||||
);
|
||||
};
|
||||
|
||||
loopFilesOperations = (id, destFolderId, isCopy) => {
|
||||
loopFilesOperations = async (data, destFolderId, isCopy) => {
|
||||
const label = this.secondaryProgressDataStore.label;
|
||||
const treeFolders = this.treeFoldersStore.treeFolders;
|
||||
|
||||
@ -862,59 +862,68 @@ class UploadDataStore {
|
||||
setSecondaryProgressBarData,
|
||||
} = this.secondaryProgressDataStore;
|
||||
|
||||
return this.getOperationProgress(id)
|
||||
.then((item) => {
|
||||
if (item && item.progress !== 100) {
|
||||
let progress = data.progress;
|
||||
|
||||
if (!data) {
|
||||
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
|
||||
return;
|
||||
}
|
||||
|
||||
while (progress !== 100) {
|
||||
await this.getOperationProgress(data.id)
|
||||
.then((item) => {
|
||||
progress = item ? item.progress : 100;
|
||||
|
||||
setSecondaryProgressBarData({
|
||||
icon: isCopy ? "duplicate" : "move",
|
||||
label,
|
||||
percent: item.progress,
|
||||
percent: progress,
|
||||
visible: true,
|
||||
alert: false,
|
||||
});
|
||||
} else {
|
||||
setSecondaryProgressBarData({
|
||||
icon: isCopy ? "duplicate" : "move",
|
||||
label,
|
||||
percent: 100,
|
||||
visible: true,
|
||||
alert: false,
|
||||
})
|
||||
.catch((err) => Promise.reject(err));
|
||||
}
|
||||
|
||||
setSecondaryProgressBarData({
|
||||
icon: isCopy ? "duplicate" : "move",
|
||||
label,
|
||||
percent: 100,
|
||||
visible: true,
|
||||
alert: false,
|
||||
});
|
||||
|
||||
getFolder(destFolderId).then((data) => {
|
||||
let newTreeFolders = treeFolders;
|
||||
let path = data.pathParts.slice(0);
|
||||
let folders = data.folders;
|
||||
let foldersCount = data.current.foldersCount;
|
||||
loopTreeFolders(path, newTreeFolders, folders, foldersCount);
|
||||
|
||||
if (!isCopy || destFolderId === this.selectedFolderStore.id) {
|
||||
this.filesStore
|
||||
.fetchFiles(
|
||||
this.selectedFolderStore.id,
|
||||
this.filesStore.filter,
|
||||
true,
|
||||
true
|
||||
)
|
||||
.finally(() => {
|
||||
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
|
||||
});
|
||||
} else {
|
||||
setSecondaryProgressBarData({
|
||||
icon: "duplicate",
|
||||
label,
|
||||
percent: 100,
|
||||
visible: true,
|
||||
alert: false,
|
||||
});
|
||||
|
||||
getFolder(destFolderId).then((data) => {
|
||||
let newTreeFolders = treeFolders;
|
||||
let path = data.pathParts.slice(0);
|
||||
let folders = data.folders;
|
||||
let foldersCount = data.current.foldersCount;
|
||||
loopTreeFolders(path, newTreeFolders, folders, foldersCount);
|
||||
|
||||
if (!isCopy || destFolderId === this.selectedFolderStore.id) {
|
||||
this.filesStore
|
||||
.fetchFiles(
|
||||
this.selectedFolderStore.id,
|
||||
this.filesStore.filter,
|
||||
true,
|
||||
true
|
||||
)
|
||||
.finally(() => {
|
||||
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
|
||||
});
|
||||
} else {
|
||||
setSecondaryProgressBarData({
|
||||
icon: "duplicate",
|
||||
label,
|
||||
percent: 100,
|
||||
visible: true,
|
||||
alert: false,
|
||||
});
|
||||
|
||||
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
|
||||
this.treeFoldersStore.setTreeFolders(newTreeFolders);
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch((err) => Promise.reject(err));
|
||||
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
|
||||
this.treeFoldersStore.setTreeFolders(newTreeFolders);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
getOperationProgress = async (id) => {
|
||||
|
@ -190,7 +190,7 @@ namespace ASC.Files.Thirdparty.Box
|
||||
CheckToken(token, id);
|
||||
|
||||
boxStorage.Open(token);
|
||||
return boxStorage;
|
||||
return Storage = boxStorage;
|
||||
}
|
||||
|
||||
private void CheckToken(OAuth20Token token, int id)
|
||||
|
@ -65,11 +65,13 @@ namespace ASC.Files.Thirdparty.GoogleDrive
|
||||
public GoogleDriveStorage(
|
||||
ConsumerFactory consumerFactory,
|
||||
FileUtility fileUtility,
|
||||
IOptionsMonitor<ILog> monitor)
|
||||
IOptionsMonitor<ILog> monitor,
|
||||
TempStream tempStream)
|
||||
{
|
||||
ConsumerFactory = consumerFactory;
|
||||
FileUtility = fileUtility;
|
||||
Log = monitor.Get("ASC.Files");
|
||||
Log = monitor.Get("ASC.Files");
|
||||
TempStream = tempStream;
|
||||
}
|
||||
|
||||
private OAuth20Token _token;
|
||||
@ -92,12 +94,7 @@ namespace ASC.Files.Thirdparty.GoogleDrive
|
||||
public ILog Log { get; }
|
||||
private TempStream TempStream { get; }
|
||||
|
||||
public const long MaxChunkedUploadFileSize = 2L * 1024L * 1024L * 1024L;
|
||||
|
||||
public GoogleDriveStorage(TempStream tempStream)
|
||||
{
|
||||
TempStream = tempStream;
|
||||
}
|
||||
public const long MaxChunkedUploadFileSize = 2L * 1024L * 1024L * 1024L;
|
||||
|
||||
public void Open(OAuth20Token token)
|
||||
{
|
||||
|
@ -286,7 +286,7 @@ namespace ASC.Files.Thirdparty.Sharpbox
|
||||
folder.FolderID = isRoot ? null : MakeId(fsEntry.Parent);
|
||||
folder.CreateOn = isRoot ? ProviderInfo.CreateOn : fsEntry.Modified;
|
||||
folder.ModifiedOn = isRoot ? ProviderInfo.CreateOn : fsEntry.Modified;
|
||||
folder.RootFolderId = MakeId(RootFolder());
|
||||
folder.RootFolderId = RootFolderMakeId();
|
||||
|
||||
folder.Title = MakeTitle(fsEntry);
|
||||
folder.TotalFiles = 0; /*fsEntry.Count - childFoldersCount NOTE: Removed due to performance isssues*/
|
||||
@ -356,7 +356,7 @@ namespace ASC.Files.Thirdparty.Sharpbox
|
||||
file.ModifiedOn = fsEntry.Modified.Kind == DateTimeKind.Utc ? TenantUtil.DateTimeFromUtc(fsEntry.Modified) : fsEntry.Modified;
|
||||
file.NativeAccessor = fsEntry;
|
||||
file.Title = MakeTitle(fsEntry);
|
||||
file.RootFolderId = MakeId(RootFolder());
|
||||
file.RootFolderId = RootFolderMakeId();
|
||||
|
||||
return file;
|
||||
}
|
||||
@ -365,6 +365,12 @@ namespace ASC.Files.Thirdparty.Sharpbox
|
||||
protected ICloudDirectoryEntry RootFolder()
|
||||
{
|
||||
return _rootFolder ??= ProviderInfo.Storage.GetRoot();
|
||||
}
|
||||
|
||||
private string _rootFolderId;
|
||||
protected string RootFolderMakeId()
|
||||
{
|
||||
return _rootFolderId ??= MakeId(RootFolder());
|
||||
}
|
||||
|
||||
protected ICloudDirectoryEntry GetFolderById(object folderId)
|
||||
|
@ -166,7 +166,7 @@ namespace ASC.Files.Thirdparty.Sharpbox
|
||||
{
|
||||
storage.Open(config, new GenericNetworkCredentials { Password = _authData.Password, UserName = _authData.Login });
|
||||
}
|
||||
return storage;
|
||||
return Storage = storage;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
|
@ -27,6 +27,7 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
using ASC.Common;
|
||||
using ASC.Core;
|
||||
using ASC.Security.Cryptography;
|
||||
|
||||
@ -34,6 +35,7 @@ using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace ASC.Web.Core.Helpers
|
||||
{
|
||||
[Scope]
|
||||
public class AuthorizationHelper
|
||||
{
|
||||
private IHttpContextAccessor HttpContextAccessor { get; }
|
||||
@ -59,7 +61,7 @@ namespace ASC.Web.Core.Helpers
|
||||
try
|
||||
{
|
||||
//Try basic
|
||||
var authorization = HttpContextAccessor.HttpContext.Request.Headers["Authorization"].ToString();
|
||||
var authorization = HttpContextAccessor.HttpContext.Request.Cookies["asc_auth_key"] ?? HttpContextAccessor.HttpContext.Request.Headers["Authorization"].ToString();
|
||||
if (string.IsNullOrEmpty(authorization))
|
||||
{
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user