Files: fix
This commit is contained in:
parent
a63ee39d36
commit
c0bf10af9e
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user