Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix bug 65373 #130

Merged
merged 3 commits into from
Dec 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,7 @@ await PerformCrossDaoFolderCopyAsync(folder.Id, fromFolderDao, fromFileDao, from
{
var id = fromConverter(fromFolderId);
var folder = await fromFolderDao.GetFolderAsync(id);
await fromFolderDao.DeleteFolderAsync(id);
await _socketManager.DeleteFolder(folder);
await _socketManager.DeleteFolder(folder, action: async () => await fromFolderDao.DeleteFolderAsync(id));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,19 +195,19 @@ private async Task DeleteFoldersAsync(IEnumerable<T> folderIds, IServiceScope sc

if (isRoom)
{
var room = await roomLogoManager.DeleteAsync(folder.Id, checkPermissions);
await socketManager.UpdateFolderAsync(room);
await roomLogoManager.DeleteAsync(folder.Id, checkPermissions);
aces = await fileSharing.GetSharedInfoAsync(folder);
}

await FolderDao.DeleteFolderAsync(folder.Id);

if (isRoom && folder.ProviderEntry)

await socketManager.DeleteFolder(folder, action: async () =>
{
await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId);
}
await FolderDao.DeleteFolderAsync(folder.Id);

await socketManager.DeleteFolder(folder);
if (isRoom && folder.ProviderEntry)
{
await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId);
}
});

if (isRoom)
{
Expand Down Expand Up @@ -242,16 +242,17 @@ private async Task DeleteFoldersAsync(IEnumerable<T> folderIds, IServiceScope sc
await socketManager.UpdateFolderAsync(room);
aces = await fileSharing.GetSharedInfoAsync(folder);
}

await FolderDao.DeleteFolderAsync(folder.Id);

if (isRoom && folder.ProviderEntry)

await socketManager.DeleteFolder(folder, action: async () =>
{
await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId);
}

await socketManager.DeleteFolder(folder);
await FolderDao.DeleteFolderAsync(folder.Id);

if (isRoom && folder.ProviderEntry)
{
await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId);
}
});

if (isNeedSendActions)
{
if (isRoom)
Expand All @@ -267,9 +268,8 @@ private async Task DeleteFoldersAsync(IEnumerable<T> folderIds, IServiceScope sc
}
else
{
await FolderDao.MoveFolderAsync(folder.Id, _trashId, CancellationToken);
await socketManager.DeleteFolder(folder);

await socketManager.DeleteFolder(folder, action: async () => await FolderDao.MoveFolderAsync(folder.Id, _trashId, CancellationToken));

if (isNeedSendActions)
{
await filesMessageService.SendAsync(MessageAction.FolderMovedToTrash, folder, _headers, folder.Title);
Expand Down Expand Up @@ -310,7 +310,8 @@ private async Task DeleteFilesAsync(IEnumerable<T> fileIds, IServiceScope scope,
await fileMarker.RemoveMarkAsNewForAllAsync(file);
if (!_immediately && FileDao.UseTrashForRemove(file))
{
await FileDao.MoveFileAsync(file.Id, _trashId);
await socketManager.DeleteFileAsync(file, action: async () => await FileDao.MoveFileAsync(file.Id, _trashId));

if (isNeedSendActions)
{
await filesMessageService.SendAsync(MessageAction.FileMovedToTrash, file, _headers, file.Title);
Expand All @@ -322,14 +323,14 @@ private async Task DeleteFilesAsync(IEnumerable<T> fileIds, IServiceScope scope,
await FileDao.SetThumbnailStatusAsync(file, Thumbnail.NotRequired);
}

await socketManager.DeleteFileAsync(file);

}
else
{
try
{
await FileDao.DeleteFileAsync(file.Id);

await socketManager.DeleteFileAsync(file, action: async () => await FileDao.DeleteFileAsync(file.Id));
if (_headers != null)
{
if (isNeedSendActions)
Expand All @@ -341,8 +342,6 @@ private async Task DeleteFilesAsync(IEnumerable<T> fileIds, IServiceScope scope,
{
await filesMessageService.SendAsync(MessageAction.FileDeleted, file, MessageInitiator.AutoCleanUp, file.Title);
}

await socketManager.DeleteFileAsync(file);
}
catch (Exception ex)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,10 +374,7 @@ private async Task<List<Folder<TTo>>> MoveOrCopyFoldersAsync<TTo>(IServiceScope
}
else if (await FolderDao.IsEmptyAsync(folder.Id))
{
await FolderDao.DeleteFolderAsync(folder.Id);

await socketManager.DeleteFolder(folder);

await socketManager.DeleteFolder(folder, action: async () => await FolderDao.DeleteFolderAsync(folder.Id));
if (ProcessedFolder(folderId))
{
sb.Append($"folder_{newFolder.Id}{SplitChar}");
Expand Down Expand Up @@ -464,17 +461,23 @@ private async Task<List<Folder<TTo>>> MoveOrCopyFoldersAsync<TTo>(IServiceScope
{
await _semaphore.WaitAsync();
await countRoomChecker.CheckAppend();
newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken);
await socketManager.DeleteFolder(folder);


await socketManager.DeleteFolder(folder, action: async () =>
{
newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken);
});

var (name, value) = await tenantQuotaFeatureStatHelper.GetStatAsync<CountRoomFeature, int>();
_ = quotaSocketManager.ChangeQuotaUsedValueAsync(name, value);
}
else if (isRoom && toFolder.FolderType == FolderType.Archive)
{
await _semaphore.WaitAsync();
newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken);
await socketManager.DeleteFolder(folder);

await socketManager.DeleteFolder(folder, action: async () =>
{
newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken);
});

var (name, value) = await tenantQuotaFeatureStatHelper.GetStatAsync<CountRoomFeature, int>();
_ = quotaSocketManager.ChangeQuotaUsedValueAsync(name, value);
Expand Down Expand Up @@ -649,7 +652,8 @@ private async Task<List<FileEntry<TTo>>> MoveOrCopyFilesAsync<TTo>(IServiceScope
{
await fileMarker.RemoveMarkAsNewForAllAsync(file);

var newFileId = await FileDao.MoveFileAsync(file.Id, toFolderId);
TTo newFileId = default;
await socketManager.DeleteFileAsync(file, action: async () => newFileId = await FileDao.MoveFileAsync(file.Id, toFolderId));
newFile = await fileDao.GetFileAsync(newFileId);

await filesMessageService.SendAsync(MessageAction.FileMoved, file, toFolder, _headers, file.Title, parentFolder.Title, toFolder.Title);
Expand All @@ -671,8 +675,6 @@ private async Task<List<FileEntry<TTo>>> MoveOrCopyFilesAsync<TTo>(IServiceScope
needToMark.Add(newFile);
}

await socketManager.DeleteFileAsync(file);

await socketManager.CreateFileAsync(newFile);

if (ProcessedFile(fileId))
Expand Down Expand Up @@ -762,15 +764,16 @@ private async Task<List<FileEntry<TTo>>> MoveOrCopyFilesAsync<TTo>(IServiceScope
this[Err] = message;
}
else
{
await FileDao.DeleteFileAsync(file.Id);
{
await socketManager.DeleteFileAsync(file, action: async () =>
{
await FileDao.DeleteFileAsync(file.Id);

await LinkDao.DeleteAllLinkAsync(file.Id.ToString());
await LinkDao.DeleteAllLinkAsync(file.Id.ToString());
});

await filesMessageService.SendAsync(MessageAction.FileMovedWithOverwriting, file, toFolder, _headers, file.Title, parentFolder.Title, toFolder.Title);

await socketManager.DeleteFileAsync(file);

if (ProcessedFile(fileId))
{
sb.Append($"file_{newFile.Id}{SplitChar}");
Expand Down
54 changes: 0 additions & 54 deletions products/ASC.Files/Core/Utils/EntryManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1914,58 +1914,4 @@ private async Task SetOriginsAsync(IFolder parent, IEnumerable<FileEntry> entrie
fileEntry.OriginTitle = data.OriginFolder.FolderType == FolderType.USER ? FilesUCResource.MyFiles : data.OriginFolder.Title;
}
}

//Long operation
public async Task DeleteSubitemsAsync<T>(T parentId, IFolderDao<T> folderDao, IFileDao<T> fileDao, ILinkDao linkDao)
{
var folders = folderDao.GetFoldersAsync(parentId);
await foreach (var folder in folders)
{
await DeleteSubitemsAsync(folder.Id, folderDao, fileDao, linkDao);

_logger.InformationDeleteFolder(folder.Id.ToString(), parentId.ToString());
await folderDao.DeleteFolderAsync(folder.Id);
await _socketManager.DeleteFolder(folder);
}

var files = fileDao.GetFilesAsync(parentId, null, FilterType.None, false, Guid.Empty, string.Empty, null, true);
await foreach (var file in files)
{
_logger.InformationDeletefile(file.Id.ToString(), parentId.ToString());
await fileDao.DeleteFileAsync(file.Id);
await _socketManager.DeleteFileAsync(file);

await linkDao.DeleteAllLinkAsync(file.Id.ToString());
}
}

public async Task MoveSharedItemsAsync<T>(T parentId, T toId, IFolderDao<T> folderDao, IFileDao<T> fileDao)
{
var folders = folderDao.GetFoldersAsync(parentId);
await foreach (var folder in folders)
{
var shares = await _fileSecurity.GetSharesAsync(folder);
var shared = folder.Shared
&& shares.Any(record => record.Share != FileShare.Restrict);
if (shared)
{
_logger.InformationMoveSharedFolder(folder.Id.ToString(), parentId.ToString(), toId.ToString());
await folderDao.MoveFolderAsync(folder.Id, toId, null);
}
else
{
await MoveSharedItemsAsync(folder.Id, toId, folderDao, fileDao);
}
}

var files = fileDao.GetFilesAsync(parentId, null, FilterType.None, false, Guid.Empty, string.Empty, null, true)
.WhereAwait(async file => file.Shared &&
(await _fileSecurity.GetSharesAsync(file)).Any(record => record.Subject != FileConstant.ShareLinkId && record.Share != FileShare.Restrict));

await foreach (var file in files)
{
_logger.InformationMoveSharedFile(file.Id.ToString(), parentId.ToString(), toId.ToString());
await fileDao.MoveFileAsync(file.Id, toId);
}
}
}
19 changes: 17 additions & 2 deletions products/ASC.Files/Core/Utils/FileSharing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ public class FileSharingAceHelper
private readonly UserManagerWrapper _userManagerWrapper;
private readonly CountPaidUserChecker _countPaidUserChecker;
private readonly IUrlShortener _urlShortener;

private readonly SocketManager _socketManager;

private const int MaxInvitationLinks = 1;
private const int MaxAdditionalExternalLinks = 5;
private const int MaxPrimaryExternalLinks = 1;
Expand All @@ -70,7 +71,8 @@ public FileSharingAceHelper(
StudioNotifyService studioNotifyService,
UserManagerWrapper userManagerWrapper,
CountPaidUserChecker countPaidUserChecker,
IUrlShortener urlShortener)
IUrlShortener urlShortener,
SocketManager socketManager)
{
_fileSecurity = fileSecurity;
_coreBaseSettings = coreBaseSettings;
Expand All @@ -89,6 +91,7 @@ public FileSharingAceHelper(
_userManagerWrapper = userManagerWrapper;
_countPaidUserChecker = countPaidUserChecker;
_urlShortener = urlShortener;
_socketManager = socketManager;
}

public async Task<AceProcessingResult> SetAceObjectAsync<T>(List<AceWrapper> aceWrappers, FileEntry<T> entry, bool notify, string message, AceAdvancedSettingsWrapper advancedSettings, string culture = null)
Expand Down Expand Up @@ -260,6 +263,18 @@ public async Task<AceProcessingResult> SetAceObjectAsync<T>(List<AceWrapper> ace
}

await _fileSecurity.ShareAsync(entry.Id, entryType, w.Id, share, w.SubjectType, w.FileShareOptions);
if (room != null)
{
if (share == FileShare.None)
{
await _socketManager.DeleteFolder(room, new [] { w.Id });
}
else if(existedShare == null)
{
await _socketManager.CreateFolderAsync(room, new [] { w.Id });
}
}

changed = true;
handledAces.Add(new Tuple<EventType, AceWrapper>(eventType, w));

Expand Down
22 changes: 14 additions & 8 deletions products/ASC.Files/Core/Utils/SocketManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ public async Task CreateFileAsync<T>(File<T> file)
await MakeRequest("create-file", file, true);
}

public async Task CreateFolderAsync<T>(Folder<T> folder)
public async Task CreateFolderAsync<T>(Folder<T> folder, IEnumerable<Guid> users = null)
{
await MakeRequest("create-folder", folder, true);
await MakeRequest("create-folder", folder, true, users);
}

public async Task UpdateFileAsync<T>(File<T> file)
Expand All @@ -86,14 +86,14 @@ public async Task UpdateFolderAsync<T>(Folder<T> folder)
await MakeRequest("update-folder", folder, true);
}

public async Task DeleteFileAsync<T>(File<T> file)
public async Task DeleteFileAsync<T>(File<T> file, Func<Task> action = null)
{
await MakeRequest("delete-file", file);
await MakeRequest("delete-file", file, action: action);
}

public async Task DeleteFolder<T>(Folder<T> folder)
public async Task DeleteFolder<T>(Folder<T> folder, IEnumerable<Guid> users = null, Func<Task> action = null)
{
await MakeRequest("delete-folder", folder);
await MakeRequest("delete-folder", folder, users: users, action: action);
}

public async Task ExecMarkAsNewFilesAsync(IEnumerable<Tag> tags)
Expand Down Expand Up @@ -127,10 +127,16 @@ public async Task ExecMarkAsNewFoldersAsync(IEnumerable<Tag> tags)
SendNotAwaitableRequest("mark-as-new-folder", result);
}

private async Task MakeRequest<T>(string method, FileEntry<T> entry, bool withData = false)
private async Task MakeRequest<T>(string method, FileEntry<T> entry, bool withData = false, IEnumerable<Guid> users = null, Func<Task> action = null)
{
var room = await GetFolderRoomAsync(entry.ParentId);
var whoCanRead = await GetWhoCanRead(entry);
var whoCanRead = users ?? await GetWhoCanRead(entry);

if (action != null)
{
await action();
}

var data = "";

if (withData)
Expand Down
Loading