Files: copyTo, copyFrom rights

This commit is contained in:
pavelbannov 2022-12-02 16:48:00 +03:00
parent 580c6688a3
commit 6cf303a1d4
3 changed files with 67 additions and 36 deletions

View File

@ -85,6 +85,40 @@ public abstract class FileEntryDto<T> : FileEntryDto
[Scope]
public class FileEntryDtoHelper
{
private static readonly IDictionary<FileEntryType, IEnumerable<FilesSecurityActions>> SecurityEntries =
new Dictionary<FileEntryType, IEnumerable<FilesSecurityActions>>()
{
{
FileEntryType.File, new List<FilesSecurityActions>()
{
FilesSecurityActions.Read,
FilesSecurityActions.Comment,
FilesSecurityActions.FillForms,
FilesSecurityActions.Review,
FilesSecurityActions.Edit,
FilesSecurityActions.Delete,
FilesSecurityActions.CustomFilter,
FilesSecurityActions.Rename,
FilesSecurityActions.ReadHistory,
FilesSecurityActions.Lock,
FilesSecurityActions.ChangeHistory,
}
},
{
FileEntryType.Folder, new List<FilesSecurityActions>()
{
FilesSecurityActions.Read,
FilesSecurityActions.Create,
FilesSecurityActions.Edit,
FilesSecurityActions.Delete,
FilesSecurityActions.RoomEdit,
FilesSecurityActions.Rename,
FilesSecurityActions.CopyTo,
FilesSecurityActions.CopyFrom
}
}
};
private readonly ApiDateTimeHelper _apiDateTimeHelper;
private readonly EmployeeDtoHelper _employeeWraperHelper;
private readonly FileSharingHelper _fileSharingHelper;
@ -127,7 +161,7 @@ public class FileEntryDtoHelper
ProviderId = entry.ProviderId.NullIfDefault(),
CanShare = await _fileSharingHelper.CanSetAccessAsync(entry),
CanEdit = await _fileSecurity.CanEditAsync(entry),
Security = entry.Security
Security = entry.Security.Where(r => SecurityEntries[entry.FileEntryType].Contains(r.Key)).ToDictionary(r => r.Key, r => r.Value)
};
}
}

View File

@ -101,7 +101,7 @@ public class FileSecurity : IFileSecurity
public Task<bool> CanReadHistoryAsync<T>(FileEntry<T> entry)
{
return CanAsync(entry, _authContext.CurrentAccount.ID, FilesSecurityActions.ReadHistory);
return CanReadHistoryAsync(entry, _authContext.CurrentAccount.ID);
}
public Task<bool> CanReadHistoryAsync<T>(FileEntry<T> entry, Guid userId)
@ -248,6 +248,16 @@ public class FileSecurity : IFileSecurity
return CanAsync(entry, userId, FilesSecurityActions.Lock);
}
public Task<bool> CanCopyToAsync<T>(FileEntry<T> entry)
{
return CanAsync(entry, _authContext.CurrentAccount.ID, FilesSecurityActions.CopyTo);
}
public Task<bool> CanCopyFromAsync<T>(FileEntry<T> entry)
{
return CanAsync(entry, _authContext.CurrentAccount.ID, FilesSecurityActions.CopyFrom);
}
public Task<IEnumerable<Guid>> WhoCanReadAsync<T>(FileEntry<T> entry)
{
return WhoCanAsync(entry, FilesSecurityActions.Read);
@ -724,19 +734,23 @@ public class FileSecurity : IFileSecurity
if ((e.RootFolderType == FolderType.VirtualRooms || e.RootFolderType == FolderType.Archive) && !isUser)
{
if (e.RootFolderType == FolderType.Archive &&
action != FilesSecurityActions.Read &&
action != FilesSecurityActions.Delete &&
action != FilesSecurityActions.RoomEdit &&
action != FilesSecurityActions.ReadHistory
)
if (e.RootFolderType == FolderType.Archive)
{
return false;
}
if (
action != FilesSecurityActions.Read &&
action != FilesSecurityActions.Delete &&
action != FilesSecurityActions.RoomEdit &&
action != FilesSecurityActions.ReadHistory &&
action != FilesSecurityActions.CopyFrom
)
{
return false;
}
if (action == FilesSecurityActions.Delete && e.RootFolderType == FolderType.Archive && isDocSpaceAdmin)
{
return folder != null && DocSpaceHelper.IsRoom(folder.FolderType);
if (action == FilesSecurityActions.Delete && isDocSpaceAdmin)
{
return folder != null && DocSpaceHelper.IsRoom(folder.FolderType);
}
}
if (isDocSpaceAdmin || e.CreateBy == userId)
@ -1596,6 +1610,8 @@ public class FileSecurity : IFileSecurity
Rename,
ReadHistory,
Lock,
ChangeHistory
ChangeHistory,
CopyTo,
CopyFrom
}
}

View File

@ -113,6 +113,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
{
var fileMarker = scope.ServiceProvider.GetService<FileMarker>();
var folderDao = scope.ServiceProvider.GetService<IFolderDao<TTo>>();
var fileSecurity = scope.ServiceProvider.GetService<FileSecurity>();
this[Res] += string.Format("folder_{0}{1}", _daoFolderId, SplitChar);
@ -152,28 +153,8 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
rootFrom = await FolderDao.GetRootFolderByFileAsync(Files[0]);
}
if (rootFrom != null)
{
if (rootFrom.FolderType == FolderType.TRASH)
{
throw new InvalidOperationException("Can not copy from Trash.");
}
if (rootFrom.FolderType == FolderType.Archive)
{
throw new InvalidOperationException("Can not copy from Archive.");
}
}
if (toFolder.RootFolderType == FolderType.TRASH)
{
throw new InvalidOperationException("Can not copy to Trash.");
}
if (toFolder.RootFolderType == FolderType.Archive)
{
throw new InvalidOperationException("Can not copy to Archive");
}
await fileSecurity.CanCopyFromAsync(rootFrom);
await fileSecurity.CanCopyToAsync(toFolder);
}
var needToMark = new List<FileEntry<TTo>>();