Files: fix

This commit is contained in:
pavelbannov 2022-08-10 22:27:44 +03:00
parent a63ee39d36
commit c0bf10af9e

View File

@ -61,7 +61,6 @@ public class FileSecurity : IFileSecurity
private readonly AuthManager _authManager; private readonly AuthManager _authManager;
private readonly GlobalFolder _globalFolder; private readonly GlobalFolder _globalFolder;
private readonly FileSecurityCommon _fileSecurityCommon; private readonly FileSecurityCommon _fileSecurityCommon;
private readonly FilesSettingsHelper _filesSettingsHelper;
public FileSecurity( public FileSecurity(
IDaoFactory daoFactory, IDaoFactory daoFactory,
@ -70,8 +69,7 @@ public class FileSecurity : IFileSecurity
AuthContext authContext, AuthContext authContext,
AuthManager authManager, AuthManager authManager,
GlobalFolder globalFolder, GlobalFolder globalFolder,
FileSecurityCommon fileSecurityCommon, FileSecurityCommon fileSecurityCommon)
FilesSettingsHelper filesSettingsHelper)
{ {
_daoFactory = daoFactory; _daoFactory = daoFactory;
_userManager = userManager; _userManager = userManager;
@ -80,7 +78,6 @@ public class FileSecurity : IFileSecurity
_authManager = authManager; _authManager = authManager;
_globalFolder = globalFolder; _globalFolder = globalFolder;
_fileSecurityCommon = fileSecurityCommon; _fileSecurityCommon = fileSecurityCommon;
_filesSettingsHelper = filesSettingsHelper;
} }
public IAsyncEnumerable<Tuple<FileEntry<T>, bool>> CanReadAsync<T>(IAsyncEnumerable<FileEntry<T>> entries, Guid userId) public IAsyncEnumerable<Tuple<FileEntry<T>, bool>> CanReadAsync<T>(IAsyncEnumerable<FileEntry<T>> entries, Guid userId)
@ -457,7 +454,7 @@ public class FileSecurity : IFileSecurity
} }
} }
private IAsyncEnumerable<FileEntry<T>> FilterAsync<T>(IAsyncEnumerable<FileEntry<T>> entries, FilesSecurityActions action, Guid userId, IEnumerable<FileShareRecord> shares = null) private IAsyncEnumerable<FileEntry<T>> FilterAsync<T>(IAsyncEnumerable<FileEntry<T>> entries, FilesSecurityActions action, Guid userId)
{ {
var user = _userManager.GetUsers(userId); var user = _userManager.GetUsers(userId);
var isOutsider = user.IsOutsider(_userManager); var isOutsider = user.IsOutsider(_userManager);
@ -467,10 +464,10 @@ public class FileSecurity : IFileSecurity
return AsyncEnumerable.Empty<FileEntry<T>>(); return AsyncEnumerable.Empty<FileEntry<T>>();
} }
return InternalFilterAsync(entries, action, userId, shares, user, isOutsider); return InternalFilterAsync(entries, action, userId, user, isOutsider);
} }
private async IAsyncEnumerable<FileEntry<T>> InternalFilterAsync<T>(IAsyncEnumerable<FileEntry<T>> entries, FilesSecurityActions action, Guid userId, IEnumerable<FileShareRecord> shares, UserInfo user, bool isOutsider) private async IAsyncEnumerable<FileEntry<T>> InternalFilterAsync<T>(IAsyncEnumerable<FileEntry<T>> entries, FilesSecurityActions action, Guid userId, UserInfo user, bool isOutsider)
{ {
var isVisitor = user.IsVisitor(_userManager); var isVisitor = user.IsVisitor(_userManager);
var isAuthenticated = _authManager.GetAccountByID(_tenantManager.GetCurrentTenant().Id, userId).IsAuthenticated; var isAuthenticated = _authManager.GetAccountByID(_tenantManager.GetCurrentTenant().Id, userId).IsAuthenticated;
@ -478,7 +475,7 @@ public class FileSecurity : IFileSecurity
await foreach (var e in entries.Where(f => f != null)) await foreach (var e in entries.Where(f => f != null))
{ {
if (await FilterEntry(e, action, userId, shares, isOutsider, isVisitor, isAuthenticated, isAdmin)) if (await FilterEntry(e, action, userId, null, isOutsider, isVisitor, isAuthenticated, isAdmin))
{ {
yield return e; yield return e;
} }
@ -644,7 +641,7 @@ public class FileSecurity : IFileSecurity
} }
} }
if (e.RootFolderType == FolderType.COMMON && isAuthenticated) if (e.RootFolderType == FolderType.COMMON && isAdmin)
{ {
// administrator in Common has all right // administrator in Common has all right
return true; return true;
@ -661,12 +658,12 @@ public class FileSecurity : IFileSecurity
return true; return true;
} }
var subjects = new List<Guid>();
if (shares == null) if (shares == null)
{ {
var subjects = GetUserSubjects(userId); subjects = GetUserSubjects(userId);
shares = (await GetSharesAsync(e)) shares = (await GetSharesAsync(e))
.Join(subjects, r => r.Subject, s => s, (r, s) => r) .Join(subjects, r => r.Subject, s => s, (r, s) => r)
.OrderBy(r => r, new SubjectComparer(subjects))
.ToList(); .ToList();
// shares ordered by level // shares ordered by level
} }
@ -675,21 +672,23 @@ public class FileSecurity : IFileSecurity
if (e.FileEntryType == FileEntryType.File) if (e.FileEntryType == FileEntryType.File)
{ {
ace = shares ace = shares
.OrderByDescending(r => r.Share, new FileShareRecord.ShareComparer()) .OrderBy(r => r, new SubjectComparer(subjects))
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer())
.FirstOrDefault(r => Equals(r.EntryId, e.Id) && r.EntryType == FileEntryType.File); .FirstOrDefault(r => Equals(r.EntryId, e.Id) && r.EntryType == FileEntryType.File);
if (ace == null) if (ace == null)
{ {
// share on parent folders // share on parent folders
ace = shares.Where(r => Equals(r.EntryId, file.ParentId) && r.EntryType == FileEntryType.Folder) ace = shares.Where(r => Equals(r.EntryId, file.ParentId) && r.EntryType == FileEntryType.Folder)
.OrderBy(r => r.Level) .OrderBy(r => r, new SubjectComparer(subjects))
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer()) .ThenBy(r => r.Level)
.FirstOrDefault(); .FirstOrDefault();
} }
} }
else else
{ {
ace = shares.Where(r => Equals(r.EntryId, e.Id) && r.EntryType == FileEntryType.Folder) ace = shares.Where(r => Equals(r.EntryId, e.Id) && r.EntryType == FileEntryType.Folder)
.OrderBy(r => r.Level) .OrderBy(r => r, new SubjectComparer(subjects))
.ThenBy(r => r.Level)
.ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer()) .ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer())
.FirstOrDefault(); .FirstOrDefault();
} }