From 155b23f799fd2db5ebb7729f4f0172b06d58479f Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Wed, 2 Dec 2020 16:17:43 +0300 Subject: [PATCH] Files: GetSecurityInfo --- .../Core/Core/Entries/EncryptionKeyPair.cs | 2 +- .../ASC.Files/Core/Core/FileStorageService.cs | 40 ++++++++------- .../Services/DocumentService/Configuration.cs | 2 +- .../WCFService/IFileStorageService.cs | 2 +- .../WCFService/Wrappers/AceWrapper.cs | 6 ++- products/ASC.Files/Core/Utils/FileSharing.cs | 49 ++++++++++--------- .../Server/Controllers/FilesController.cs | 19 +++++++ .../Server/Helpers/FilesControllerHelper.cs | 27 +++++----- 8 files changed, 90 insertions(+), 57 deletions(-) diff --git a/products/ASC.Files/Core/Core/Entries/EncryptionKeyPair.cs b/products/ASC.Files/Core/Core/Entries/EncryptionKeyPair.cs index 9e754f2fb0..84e138f0d1 100644 --- a/products/ASC.Files/Core/Core/Entries/EncryptionKeyPair.cs +++ b/products/ASC.Files/Core/Core/Entries/EncryptionKeyPair.cs @@ -110,7 +110,7 @@ namespace ASC.Web.Files.Core.Entries if (!FileSecurity.CanEdit(file)) throw new System.Security.SecurityException(FilesCommonResource.ErrorMassage_SecurityException_EditFile); if (file.RootFolderType != FolderType.Privacy) throw new NotSupportedException(); - var fileShares = FileStorageService.GetSharedInfo(new ItemList { string.Format("file_{0}", fileId) }).ToList(); + var fileShares = FileStorageService.GetSharedInfo(new List { fileId }, new List { }).ToList(); fileShares = fileShares.Where(share => !share.SubjectGroup && !share.SubjectId.Equals(FileConstant.ShareLinkId) && share.Share == FileShare.ReadWrite).ToList(); diff --git a/products/ASC.Files/Core/Core/FileStorageService.cs b/products/ASC.Files/Core/Core/FileStorageService.cs index 560f2a209e..444b32945b 100644 --- a/products/ASC.Files/Core/Core/FileStorageService.cs +++ b/products/ASC.Files/Core/Core/FileStorageService.cs @@ -26,7 +26,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; @@ -1745,37 +1744,40 @@ namespace ASC.Web.Files.Services.WCFService #endregion - public ItemList GetSharedInfo(ItemList objectIds) + public ItemList GetSharedInfo(IEnumerable fileIds, IEnumerable folderIds) { - return FileSharing.GetSharedInfo(objectIds); + return FileSharing.GetSharedInfo(fileIds, folderIds); } - public ItemList GetSharedInfoShort(string objectId) + public ItemList GetSharedInfoShortFile(T fileId) { - return FileSharing.GetSharedInfoShort(objectId); + return FileSharing.GetSharedInfoShortFile(fileId); } - public ItemList SetAceObject(AceCollection aceCollection, bool notify) + public ItemList GetSharedInfoShortFolder(T folderId) + { + return FileSharing.GetSharedInfoShortFolder(folderId); + } + + public List SetAceObject(AceCollection aceCollection, bool notify) { var fileDao = GetFileDao(); var folderDao = GetFolderDao(); - var result = new ItemList(); - foreach (var objectId in aceCollection.Entries) - { - Debug.Assert(objectId != null, "objectId != null"); - var entryType = objectId.StartsWith("file_") ? FileEntryType.File : FileEntryType.Folder; - var entryId = (T)Convert.ChangeType(objectId.Substring((entryType == FileEntryType.File ? "file_" : "folder_").Length), typeof(T)); - var entry = entryType == FileEntryType.File - ? fileDao.GetFile(entryId) - : (FileEntry)folderDao.GetFolder(entryId); + var result = new List(); + var entries = new List>(); + entries.AddRange(aceCollection.Files.Select(fileId => fileDao.GetFile(fileId))); + entries.AddRange(aceCollection.Folders.Select(folderDao.GetFolder)); + + foreach (var entry in entries) + { try { var changed = FileSharingAceHelper.SetAceObject(aceCollection.Aces, entry, notify, aceCollection.Message); if (changed) { FilesMessageService.Send(entry, GetHttpHeaders(), - entryType == FileEntryType.Folder ? MessageAction.FolderUpdatedAccess : MessageAction.FileUpdatedAccess, + entry.FileEntryType == FileEntryType.Folder ? MessageAction.FolderUpdatedAccess : MessageAction.FileUpdatedAccess, entry.Title); } } @@ -1785,9 +1787,9 @@ namespace ASC.Web.Files.Services.WCFService } var securityDao = GetSecurityDao(); - if (securityDao.IsShared(entry.ID, entryType)) + if (securityDao.IsShared(entry.ID, entry.FileEntryType)) { - result.Add(objectId); + result.Add(entry.ID); } } return result; @@ -1987,7 +1989,7 @@ namespace ASC.Web.Files.Services.WCFService NotifyClient.SendEditorMentions(file, fileLink, recipients, message); - return showSharingSettings ? GetSharedInfoShort("file_" + fileId) : null; + return showSharingSettings ? GetSharedInfoShortFile(fileId) : null; } public ItemList GetEncryptionAccess(T fileId) diff --git a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs index c00070f834..847c5ec5ad 100644 --- a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs +++ b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs @@ -266,7 +266,7 @@ namespace ASC.Web.Files.Services.DocumentService try { - return FileSharing.GetSharedInfoShort(File.UniqID); + return FileSharing.GetSharedInfoShortFile(File.ID); } catch { diff --git a/products/ASC.Files/Core/Services/WCFService/IFileStorageService.cs b/products/ASC.Files/Core/Services/WCFService/IFileStorageService.cs index 460c40731a..e3ff0945eb 100644 --- a/products/ASC.Files/Core/Services/WCFService/IFileStorageService.cs +++ b/products/ASC.Files/Core/Services/WCFService/IFileStorageService.cs @@ -172,7 +172,7 @@ namespace ASC.Web.Files.Services.WCFService ItemList GetSharedInfoShort(string objectId); - ItemList SetAceObject(AceCollection aceCollection, bool notify); + List SetAceObject(AceCollection aceCollection, bool notify); void RemoveAce(ItemList items); diff --git a/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs b/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs index dcda7c3b44..5e9e75d266 100644 --- a/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs +++ b/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs @@ -25,6 +25,7 @@ using System; +using System.Collections.Generic; using System.Text.Json.Serialization; using ASC.Files.Core; @@ -33,9 +34,10 @@ using ASC.Files.Core.Security; namespace ASC.Web.Files.Services.WCFService { - public class AceCollection + public class AceCollection { - public ItemList Entries { get; set; } + public IEnumerable Files { get; set; } + public IEnumerable Folders { get; set; } public ItemList Aces { get; set; } diff --git a/products/ASC.Files/Core/Utils/FileSharing.cs b/products/ASC.Files/Core/Utils/FileSharing.cs index 02c1835b8a..d2ac7fba7a 100644 --- a/products/ASC.Files/Core/Utils/FileSharing.cs +++ b/products/ASC.Files/Core/Utils/FileSharing.cs @@ -424,7 +424,7 @@ namespace ASC.Web.Files.Utils return result; } - public ItemList GetSharedInfo(ItemList objectIds) + public ItemList GetSharedInfo(IEnumerable fileIds, IEnumerable folderIds) { if (!AuthContext.IsAuthenticated) { @@ -433,23 +433,16 @@ namespace ASC.Web.Files.Utils var result = new List(); - var folderDao = DaoFactory.GetFolderDao(); - var fileDao = DaoFactory.GetFileDao(); + var fileDao = DaoFactory.GetFileDao(); + var files = fileDao.GetFiles(fileIds); + + var folderDao = DaoFactory.GetFolderDao(); + var folders = folderDao.GetFolders(folderIds); + + var entries = files.Cast>().Concat(folders.Cast>()); - foreach (var objectId in objectIds) + foreach (var entry in entries) { - if (string.IsNullOrEmpty(objectId)) - { - throw new InvalidOperationException(FilesCommonResource.ErrorMassage_BadRequest); - } - - var entryType = objectId.StartsWith("file_") ? FileEntryType.File : FileEntryType.Folder; - var entryId = (T)Convert.ChangeType(objectId.Substring((entryType == FileEntryType.File ? "file_" : "folder_").Length), typeof(T)); - - var entry = entryType == FileEntryType.File - ? fileDao.GetFile(entryId) - : (FileEntry)folderDao.GetFolder(entryId); - IEnumerable acesForObject; try { @@ -516,7 +509,7 @@ namespace ASC.Web.Files.Utils result.Remove(meAce); AceWrapper linkAce = null; - if (objectIds.Count > 1) + if (entries.Any()) { result.RemoveAll(ace => ace.SubjectId == FileConstant.ShareLinkId); } @@ -544,13 +537,25 @@ namespace ASC.Web.Files.Utils return new ItemList(result); } - public ItemList GetSharedInfoShort(string objectId) + public ItemList GetSharedInfoShortFile(T fileID) { - var aces = GetSharedInfo(new ItemList { objectId }); + var aces = GetSharedInfo(new List { fileID}, new List()); + + return GetAceShortWrappers(aces); + } - return new ItemList( - aces.Where(aceWrapper => !aceWrapper.SubjectId.Equals(FileConstant.ShareLinkId) || aceWrapper.Share != FileShare.Restrict) - .Select(aceWrapper => new AceShortWrapper(aceWrapper))); + public ItemList GetSharedInfoShortFolder(T folderId) + { + var aces = GetSharedInfo(new List(), new List { folderId }); + + return GetAceShortWrappers(aces); + } + + private ItemList GetAceShortWrappers(ItemList aces) + { + return new ItemList(aces + .Where(aceWrapper => !aceWrapper.SubjectId.Equals(FileConstant.ShareLinkId) || aceWrapper.Share != FileShare.Restrict) + .Select(aceWrapper => new AceShortWrapper(aceWrapper))); } } } \ No newline at end of file diff --git a/products/ASC.Files/Server/Controllers/FilesController.cs b/products/ASC.Files/Server/Controllers/FilesController.cs index 567b932764..f9b317a37d 100644 --- a/products/ASC.Files/Server/Controllers/FilesController.cs +++ b/products/ASC.Files/Server/Controllers/FilesController.cs @@ -1604,6 +1604,25 @@ namespace ASC.Api.Documents return FilesControllerHelperInt.GetFolderSecurityInfo(folderId); } + [Read("share")] + public IEnumerable GetSecurityInfoFromBody([FromBody] BaseBatchModel model) + { + var result = new List(); + result.AddRange(FilesControllerHelperInt.GetSecurityInfo(model.FileIds.Where(r => r.ValueKind == JsonValueKind.Number).Select(r => r.GetInt32()), model.FolderIds.Where(r => r.ValueKind == JsonValueKind.Number).Select(r => r.GetInt32()))); + result.AddRange(FilesControllerHelperString.GetSecurityInfo(model.FileIds.Where(r => r.ValueKind == JsonValueKind.String).Select(r => r.GetString()), model.FolderIds.Where(r => r.ValueKind == JsonValueKind.String).Select(r => r.GetString()))); + return result; + } + + [Read("share")] + [Consumes("application/x-www-form-urlencoded")] + public IEnumerable GetSecurityInfoFromForm([FromForm] BaseBatchModel model) + { + var result = new List(); + result.AddRange(FilesControllerHelperInt.GetSecurityInfo(model.FileIds.Where(r => r.ValueKind == JsonValueKind.Number).Select(r => r.GetInt32()), model.FolderIds.Where(r => r.ValueKind == JsonValueKind.Number).Select(r => r.GetInt32()))); + result.AddRange(FilesControllerHelperString.GetSecurityInfo(model.FileIds.Where(r => r.ValueKind == JsonValueKind.String).Select(r => r.GetString()), model.FolderIds.Where(r => r.ValueKind == JsonValueKind.String).Select(r => r.GetString()))); + return result; + } + /// /// Sets sharing settings for the file with the ID specified in the request /// diff --git a/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs b/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs index 441c68183b..fc21e6a85f 100644 --- a/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs +++ b/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs @@ -468,13 +468,19 @@ namespace ASC.Files.Helpers public IEnumerable GetFileSecurityInfo(T fileId) { - var fileShares = FileStorageService.GetSharedInfo(new ItemList { string.Format("file_{0}", fileId) }); + var fileShares = FileStorageService.GetSharedInfo(new List { fileId }, new List { }); return fileShares.Select(FileShareWrapperHelper.Get); } public IEnumerable GetFolderSecurityInfo(T folderId) { - var fileShares = FileStorageService.GetSharedInfo(new ItemList { string.Format("folder_{0}", folderId) }); + var fileShares = FileStorageService.GetSharedInfo(new List { }, new List { folderId }); + return fileShares.Select(FileShareWrapperHelper.Get); + } + + public IEnumerable GetSecurityInfo(IEnumerable fileIds, IEnumerable folderIds) + { + var fileShares = FileStorageService.GetSharedInfo(fileIds, folderIds); return fileShares.Select(FileShareWrapperHelper.Get); } @@ -483,9 +489,9 @@ namespace ASC.Files.Helpers if (share != null && share.Any()) { var list = new ItemList(share.Select(FileShareParamsHelper.ToAceObject)); - var aceCollection = new AceCollection + var aceCollection = new AceCollection { - Entries = new ItemList { "file_" + fileId }, + Files = new List {fileId }, Aces = list, Message = sharingMessage }; @@ -499,9 +505,9 @@ namespace ASC.Files.Helpers if (share != null && share.Any()) { var list = new ItemList(share.Select(FileShareParamsHelper.ToAceObject)); - var aceCollection = new AceCollection + var aceCollection = new AceCollection { - Entries = new ItemList { "folder_" + folderId }, + Folders = new List { folderId }, Aces = list, Message = sharingMessage }; @@ -522,8 +528,7 @@ namespace ASC.Files.Helpers { var file = GetFileInfo(fileId); - var objectId = "file_" + file.Id; - var sharedInfo = FileStorageService.GetSharedInfo(new ItemList { objectId }).Find(r => r.SubjectId == FileConstant.ShareLinkId); + var sharedInfo = FileStorageService.GetSharedInfo(new List { fileId }, new List { }).Find(r => r.SubjectId == FileConstant.ShareLinkId); if (sharedInfo == null || sharedInfo.Share != share) { var list = new ItemList @@ -535,13 +540,13 @@ namespace ASC.Files.Helpers Share = share } }; - var aceCollection = new AceCollection + var aceCollection = new AceCollection { - Entries = new ItemList { objectId }, + Files = new List { fileId }, Aces = list }; FileStorageService.SetAceObject(aceCollection, false); - sharedInfo = FileStorageService.GetSharedInfo(new ItemList { objectId }).Find(r => r.SubjectId == FileConstant.ShareLinkId); + sharedInfo = FileStorageService.GetSharedInfo(new List { fileId }, new List { }).Find(r => r.SubjectId == FileConstant.ShareLinkId); } return sharedInfo.Link;