// (c) Copyright Ascensio System SIA 2010-2022 // // This program is a free software product. // You can redistribute it and/or modify it under the terms // of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software // Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended // to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of // any third-party rights. // // This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see // the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html // // You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. // // The interactive user interfaces in modified source and object code versions of the Program must // display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. // // Pursuant to Section 7(b) of the License you must retain the original Product logo when // distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under // trademark law for use of our trademarks. // // All the Product's GUI elements, including illustrations and icon sets, as well as technical writing // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 // International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode namespace ASC.Files.Api; [ConstraintRoute("int")] public class SecutiryControllerInternal : SecutiryController { public SecutiryControllerInternal( FileStorageService fileStorageService, SecurityControllerHelper securityControllerHelper, FolderDtoHelper folderDtoHelper, FileDtoHelper fileDtoHelper) : base(fileStorageService, securityControllerHelper, folderDtoHelper, fileDtoHelper) { } } public class SecutiryControllerThirdparty : SecutiryController { public SecutiryControllerThirdparty( FileStorageService fileStorageService, SecurityControllerHelper securityControllerHelper, FolderDtoHelper folderDtoHelper, FileDtoHelper fileDtoHelper) : base(fileStorageService, securityControllerHelper, folderDtoHelper, fileDtoHelper) { } } public abstract class SecutiryController : ApiControllerBase { private readonly FileStorageService _fileStorageService; private readonly SecurityControllerHelper _securityControllerHelper; public SecutiryController(FileStorageService fileStorageService, SecurityControllerHelper securityControllerHelper, FolderDtoHelper folderDtoHelper, FileDtoHelper fileDtoHelper) : base(folderDtoHelper, fileDtoHelper) { _fileStorageService = fileStorageService; _securityControllerHelper = securityControllerHelper; } /// /// Returns the external link to the shared file with the ID specified in the request /// /// /// File external link /// /// File ID /// Access right /// Files /// Shared file link [HttpPut("{fileId}/sharedlinkAsync")] public async Task GenerateSharedLinkAsync(T fileId, GenerateSharedLinkRequestDto inDto) { return await _securityControllerHelper.GenerateSharedLinkAsync(fileId, inDto.Share); } /// /// Returns the detailed information about shared file with the ID specified in the request /// /// File sharing /// Sharing /// File ID /// Shared file information [HttpGet("file/{fileId}/share")] public async IAsyncEnumerable GetFileSecurityInfoAsync(T fileId) { await foreach (var s in _securityControllerHelper.GetFileSecurityInfoAsync(fileId)) { yield return s; } } /// /// Returns the detailed information about shared folder with the ID specified in the request /// /// Folder sharing /// Folder ID /// Sharing /// Shared folder information [HttpGet("folder/{folderId}/share")] public async IAsyncEnumerable GetFolderSecurityInfoAsync(T folderId) { await foreach (var s in _securityControllerHelper.GetFolderSecurityInfoAsync(folderId)) { yield return s; } } [HttpPut("{fileId}/setacelink")] public Task SetAceLinkAsync(T fileId, [FromBody] GenerateSharedLinkRequestDto inDto) { return _fileStorageService.SetAceLinkAsync(fileId, inDto.Share); } /// /// Sets sharing settings for the file with the ID specified in the request /// /// File ID /// Collection of sharing rights /// Should notify people /// Sharing message to send when notifying /// Share file /// Sharing /// /// Each of the FileShareParams must contain two parameters: 'ShareTo' - ID of the user with whom we want to share and 'Access' - access type which we want to grant to the user (Read, ReadWrite, etc) /// /// Shared file information [HttpPut("file/{fileId}/share")] public async IAsyncEnumerable SetFileSecurityInfoAsync(T fileId, SecurityInfoRequestDto inDto) { await foreach (var s in _securityControllerHelper.SetSecurityInfoAsync(new List { fileId }, new List(), inDto.Share, inDto.Notify, inDto.SharingMessage)) { yield return s; } } /// /// Sets sharing settings for the folder with the ID specified in the request /// /// Share folder /// Folder ID /// Collection of sharing rights /// Should notify people /// Sharing message to send when notifying /// /// Each of the FileShareParams must contain two parameters: 'ShareTo' - ID of the user with whom we want to share and 'Access' - access type which we want to grant to the user (Read, ReadWrite, etc) /// /// Sharing /// Shared folder information [HttpPut("folder/{folderId}/share")] public async IAsyncEnumerable SetFolderSecurityInfoAsync(T folderId, SecurityInfoRequestDto inDto) { await foreach (var s in _securityControllerHelper.SetSecurityInfoAsync(new List(), new List { folderId }, inDto.Share, inDto.Notify, inDto.SharingMessage)) { yield return s; } } [HttpGet("file/{fileId}/publickeys")] public Task> GetEncryptionAccess(T fileId) { return _fileStorageService.GetEncryptionAccessAsync(fileId); } [HttpPost("file/{fileId}/sendeditornotify")] public Task> SendEditorNotify(T fileId, MentionMessageWrapper mentionMessage) { return _fileStorageService.SendEditorNotifyAsync(fileId, mentionMessage); } } public class SecutiryControllerCommon : ApiControllerBase { private readonly FileStorageService _fileStorageServiceInt; private readonly FileStorageService _fileStorageServiceString; private readonly SecurityControllerHelper _securityControllerHelperInt; private readonly SecurityControllerHelper _securityControllerHelperString; public SecutiryControllerCommon( FileStorageService fileStorageServiceInt, FileStorageService fileStorageServiceString, SecurityControllerHelper securityControllerHelperInt, SecurityControllerHelper securityControllerHelperString, FolderDtoHelper folderDtoHelper, FileDtoHelper fileDtoHelper) : base(folderDtoHelper, fileDtoHelper) { _fileStorageServiceInt = fileStorageServiceInt; _fileStorageServiceString = fileStorageServiceString; _securityControllerHelperInt = securityControllerHelperInt; _securityControllerHelperString = securityControllerHelperString; } [HttpPost("owner")] public async IAsyncEnumerable ChangeOwnerAsync(ChangeOwnerRequestDto inDto) { var (folderIntIds, folderStringIds) = FileOperationsManager.GetIds(inDto.FolderIds); var (fileIntIds, fileStringIds) = FileOperationsManager.GetIds(inDto.FileIds); var data = AsyncEnumerable.Empty(); data = data.Concat(_fileStorageServiceInt.ChangeOwnerAsync(folderIntIds, fileIntIds, inDto.UserId)); data = data.Concat(_fileStorageServiceString.ChangeOwnerAsync(folderStringIds, fileStringIds, inDto.UserId)); await foreach (var e in data) { yield return await GetFileEntryWrapperAsync(e); } } [HttpPost("share")] public async IAsyncEnumerable GetSecurityInfoAsync(BaseBatchRequestDto inDto) { var (folderIntIds, folderStringIds) = FileOperationsManager.GetIds(inDto.FolderIds); var (fileIntIds, fileStringIds) = FileOperationsManager.GetIds(inDto.FileIds); var internalIds = _securityControllerHelperInt.GetSecurityInfoAsync(fileIntIds, folderIntIds); var thirdpartyIds = _securityControllerHelperString.GetSecurityInfoAsync(fileStringIds, folderStringIds); await foreach (var r in internalIds.Concat(thirdpartyIds)) { yield return r; } } /// /// Removes sharing rights for the group with the ID specified in the request /// /// Folders ID /// Files ID /// Remove group sharing rights /// Sharing /// Shared file information [HttpDelete("share")] public async Task RemoveSecurityInfoAsync(BaseBatchRequestDto inDto) { var (folderIntIds, folderStringIds) = FileOperationsManager.GetIds(inDto.FolderIds); var (fileIntIds, fileStringIds) = FileOperationsManager.GetIds(inDto.FileIds); await _securityControllerHelperInt.RemoveSecurityInfoAsync(fileIntIds, folderIntIds); await _securityControllerHelperString.RemoveSecurityInfoAsync(fileStringIds, folderStringIds); return true; } [HttpPut("share")] public async IAsyncEnumerable SetSecurityInfoAsync(SecurityInfoRequestDto inDto) { var (folderIntIds, folderStringIds) = FileOperationsManager.GetIds(inDto.FolderIds); var (fileIntIds, fileStringIds) = FileOperationsManager.GetIds(inDto.FileIds); var internalIds = _securityControllerHelperInt.SetSecurityInfoAsync(fileIntIds, folderIntIds, inDto.Share, inDto.Notify, inDto.SharingMessage); var thirdpartyIds = _securityControllerHelperString.SetSecurityInfoAsync(fileStringIds, folderStringIds, inDto.Share, inDto.Notify, inDto.SharingMessage); await foreach (var s in internalIds.Concat(thirdpartyIds)) { yield return s; } } }