Merge branch 'release/1.0.0' of github.com:ONLYOFFICE/AppServer into release/1.0.0

This commit is contained in:
Tatiana Lopaeva 2021-09-24 17:02:15 +03:00
commit d8a1bc167b
14 changed files with 112 additions and 76 deletions

View File

@ -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)
{

View File

@ -45,7 +45,7 @@
"enabled": "enabled"
},
"version": {
"number": "1.0.0",
"number": "11.5.0",
"release": {
"date": "",
"sign": ""

View File

@ -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();

View File

@ -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);

View File

@ -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");
}
};

View File

@ -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,
};
}
)(

View File

@ -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);
}
}
};

View File

@ -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);

View File

@ -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) => {

View File

@ -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)

View File

@ -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)
{

View File

@ -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)

View File

@ -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()

View File

@ -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;