/// <summary> /// </summary> /// <param name="aceWrapper"></param> public FileShareWrapper(AceWrapper aceWrapper) { IsOwner = aceWrapper.Owner; IsLocked = aceWrapper.LockedRights; if (aceWrapper.SubjectGroup) { if (aceWrapper.SubjectId == FileConstant.ShareLinkId) { SharedTo = new FileShareLink { Id = aceWrapper.SubjectId, ShareLink = aceWrapper.ShortenLink ?? aceWrapper.Link }; } else { //Shared to group SharedTo = new GroupWrapperSummary(CoreContext.UserManager.GetGroupInfo(aceWrapper.SubjectId)); } } else { SharedTo = new EmployeeWraperFull(CoreContext.UserManager.GetUsers(aceWrapper.SubjectId)); } Access = aceWrapper.Share; }
public FileShareWrapper Get(AceWrapper aceWrapper) { var result = new FileShareWrapper { IsOwner = aceWrapper.Owner, IsLocked = aceWrapper.LockedRights }; if (aceWrapper.SubjectGroup) { if (aceWrapper.SubjectId == FileConstant.ShareLinkId) { result.SharedTo = new FileShareLink { Id = aceWrapper.SubjectId, ShareLink = aceWrapper.Link }; } else { //Shared to group result.SharedTo = new GroupWrapperSummary(UserManager.GetGroupInfo(aceWrapper.SubjectId), UserManager); } } else { result.SharedTo = EmployeeWraperFullHelper.GetFull(UserManager.GetUsers(aceWrapper.SubjectId)); } result.Access = aceWrapper.Share; return(result); }
/// <summary> /// </summary> /// <param name="aceWrapper"></param> public FileShareWrapper(AceWrapper aceWrapper) { IsOwner = aceWrapper.Owner; IsLocked = aceWrapper.LockedRights; if (aceWrapper.SubjectGroup) { //Shared to group SharedTo = new GroupWrapperSummary(Core.CoreContext.GroupManager.GetGroupInfo(aceWrapper.SubjectId)); } else { SharedTo = EmployeeWraper.Get(aceWrapper.SubjectId); } Access = aceWrapper.Share; }
public static List <AceWrapper> GetSharedInfo(FileEntry entry) { if (entry == null) { throw new ArgumentNullException(FilesCommonResource.ErrorMassage_BadRequest); } if (!CanSetAccess(entry)) { LogManager.GetLogger("ASC.Web.Files").ErrorFormat("User {0} can't get shared info for {1} {2}", SecurityContext.CurrentAccount.ID, (entry is File ? "file" : "folder"), entry.ID); throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException); } var linkAccess = FileShare.Restrict; var result = new List <AceWrapper>(); var fileSecurity = Global.GetFilesSecurity(); var records = fileSecurity .GetShares(entry) .GroupBy(r => r.Subject) .Select(g => g.OrderBy(r => r.Level) .ThenBy(r => r.Level) .ThenByDescending(r => r.Share).FirstOrDefault()); foreach (var r in records) { if (r.Subject == FileConstant.ShareLinkId) { linkAccess = r.Share; continue; } var u = CoreContext.UserManager.GetUsers(r.Subject); var isgroup = false; var title = u.DisplayUserName(false); if (u.ID == Constants.LostUser.ID) { var g = CoreContext.GroupManager.GetGroupInfo(r.Subject); isgroup = true; title = g.Name; if (g.ID == Constants.GroupAdmin.ID) { title = FilesCommonResource.Admin; } if (g.ID == Constants.GroupEveryone.ID) { title = FilesCommonResource.Everyone; } if (g.ID == Constants.LostGroupInfo.ID) { fileSecurity.RemoveSubject(r.Subject); continue; } } var w = new AceWrapper { SubjectId = r.Subject, SubjectName = title, SubjectGroup = isgroup, Share = r.Share, Owner = entry.RootFolderType == FolderType.USER ? entry.RootFolderCreator == r.Subject : entry.CreateBy == r.Subject, LockedRights = r.Subject == SecurityContext.CurrentAccount.ID }; result.Add(w); } if (entry is File && result.All(w => w.SubjectId != FileConstant.ShareLinkId)) { var w = new AceWrapper { SubjectId = FileConstant.ShareLinkId, SubjectName = FileShareLink.GetLink((File)entry), SubjectGroup = true, Share = linkAccess, Owner = false }; result.Add(w); } if (!result.Any(w => w.Owner)) { var ownerId = entry.RootFolderType == FolderType.USER ? entry.RootFolderCreator : entry.CreateBy; var w = new AceWrapper { SubjectId = ownerId, SubjectName = Global.GetUserName(ownerId), SubjectGroup = false, Share = FileShare.ReadWrite, Owner = true }; result.Add(w); } if (result.Any(w => w.SubjectId == SecurityContext.CurrentAccount.ID)) { result.Single(w => w.SubjectId == SecurityContext.CurrentAccount.ID).LockedRights = true; } if (entry.RootFolderType == FolderType.COMMON) { if (result.All(w => w.SubjectId != Constants.GroupAdmin.ID)) { var w = new AceWrapper { SubjectId = Constants.GroupAdmin.ID, SubjectName = FilesCommonResource.Admin, SubjectGroup = true, Share = FileShare.ReadWrite, Owner = false, LockedRights = true, }; result.Add(w); } if (result.All(w => w.SubjectId != Constants.GroupEveryone.ID)) { var w = new AceWrapper { SubjectId = Constants.GroupEveryone.ID, SubjectName = FilesCommonResource.Everyone, SubjectGroup = true, Share = fileSecurity.DefaultCommonShare, Owner = false, DisableRemove = true }; result.Add(w); } } return(result); }
public ItemList <AceWrapper> GetSharedInfo <T>(ItemList <string> objectIds) { if (!AuthContext.IsAuthenticated) { throw new InvalidOperationException(FilesCommonResource.ErrorMassage_SecurityException); } var result = new List <AceWrapper>(); var folderDao = DaoFactory.GetFolderDao <T>(); var fileDao = DaoFactory.GetFileDao <T>(); foreach (var objectId in objectIds) { if (string.IsNullOrEmpty(objectId)) { throw new InvalidOperationException(FilesCommonResource.ErrorMassage_BadRequest); } var entryType = objectId.StartsWith("file_") ? FileEntryType.File : FileEntryType.Folder; var entryId = (T)Convert.ChangeType(objectId.Substring((entryType == FileEntryType.File ? "file_" : "folder_").Length), typeof(T)); var entry = entryType == FileEntryType.File ? fileDao.GetFile(entryId) : (FileEntry <T>)folderDao.GetFolder(entryId); IEnumerable <AceWrapper> acesForObject; try { acesForObject = GetSharedInfo(entry); } catch (Exception e) { Logger.Error(e); throw new InvalidOperationException(e.Message, e); } foreach (var aceForObject in acesForObject) { var duplicate = result.FirstOrDefault(ace => ace.SubjectId == aceForObject.SubjectId); if (duplicate == null) { if (result.Any()) { aceForObject.Owner = false; aceForObject.Share = FileShare.Varies; } continue; } if (duplicate.Share != aceForObject.Share) { aceForObject.Share = FileShare.Varies; } if (duplicate.Owner != aceForObject.Owner) { aceForObject.Owner = false; aceForObject.Share = FileShare.Varies; } result.Remove(duplicate); } var withoutAce = result.Where(ace => acesForObject.FirstOrDefault(aceForObject => aceForObject.SubjectId == ace.SubjectId) == null); foreach (var ace in withoutAce) { ace.Share = FileShare.Varies; } var notOwner = result.Where(ace => ace.Owner && acesForObject.FirstOrDefault(aceForObject => aceForObject.Owner && aceForObject.SubjectId == ace.SubjectId) == null); foreach (var ace in notOwner) { ace.Owner = false; ace.Share = FileShare.Varies; } result.AddRange(acesForObject); } var ownerAce = result.FirstOrDefault(ace => ace.Owner); result.Remove(ownerAce); var meAce = result.FirstOrDefault(ace => ace.SubjectId == AuthContext.CurrentAccount.ID); result.Remove(meAce); AceWrapper linkAce = null; if (objectIds.Count > 1) { result.RemoveAll(ace => ace.SubjectId == FileConstant.ShareLinkId); } else { linkAce = result.FirstOrDefault(ace => ace.SubjectId == FileConstant.ShareLinkId); } result.Sort((x, y) => string.Compare(x.SubjectName, y.SubjectName)); if (ownerAce != null) { result = new List <AceWrapper> { ownerAce }.Concat(result).ToList(); } if (meAce != null) { result = new List <AceWrapper> { meAce }.Concat(result).ToList(); } if (linkAce != null) { result.Remove(linkAce); result = new List <AceWrapper> { linkAce }.Concat(result).ToList(); } return(new ItemList <AceWrapper>(result)); }
public static List <AceWrapper> GetSharedInfo(FileEntry entry) { if (entry == null) { throw new ArgumentNullException(FilesCommonResource.ErrorMassage_BadRequest); } if (!CanSetAccess(entry)) { Global.Logger.ErrorFormat("User {0} can't get shared info for {1} {2}", SecurityContext.CurrentAccount.ID, (entry.FileEntryType == FileEntryType.File ? "file" : "folder"), entry.ID); throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException); } var linkAccess = FileShare.Restrict; var result = new List <AceWrapper>(); var fileSecurity = Global.GetFilesSecurity(); var records = fileSecurity .GetShares(entry) .GroupBy(r => r.Subject) .Select(g => g.OrderBy(r => r.Level) .ThenBy(r => r.Level) .ThenByDescending(r => r.Share, new FileShareRecord.ShareComparer()).FirstOrDefault()); foreach (var r in records) { if (r.Subject == FileConstant.ShareLinkId) { linkAccess = r.Share; continue; } if (r.Subject == FileConstant.DenyDownloadId || r.Subject == FileConstant.DenySharingId) { continue; } var u = CoreContext.UserManager.GetUsers(r.Subject); var isgroup = false; var title = u.DisplayUserName(false); var share = r.Share; if (u.ID == Constants.LostUser.ID) { var g = CoreContext.UserManager.GetGroupInfo(r.Subject); isgroup = true; title = g.Name; if (g.ID == Constants.GroupAdmin.ID) { title = FilesCommonResource.Admin; } if (g.ID == Constants.GroupEveryone.ID) { title = FilesCommonResource.Everyone; } if (g.ID == Constants.LostGroupInfo.ID) { fileSecurity.RemoveSubject(r.Subject); continue; } } else if (u.IsVisitor() && new FileShareRecord.ShareComparer().Compare(FileShare.Read, share) > 0) { share = FileShare.Read; } var w = new AceWrapper { SubjectId = r.Subject, SubjectName = title, SubjectGroup = isgroup, Share = share, Owner = entry.RootFolderType == FolderType.USER ? entry.RootFolderCreator == r.Subject : entry.CreateBy == r.Subject, LockedRights = r.Subject == SecurityContext.CurrentAccount.ID }; result.Add(w); } if (entry.FileEntryType == FileEntryType.File && !((File)entry).Encrypted && result.All(w => w.SubjectId != FileConstant.ShareLinkId) && (linkAccess != FileShare.Restrict || CoreContext.Configuration.Standalone || !TenantExtra.GetTenantQuota().Trial || FileUtility.CanWebView(entry.Title))) { var w = new AceWrapper { SubjectId = FileConstant.ShareLinkId, Link = FilesSettings.ExternalShare ? FileShareLink.GetLink((File)entry) : string.Empty, SubjectGroup = true, Share = linkAccess, Owner = false }; result.Add(w); } if (!result.Any(w => w.Owner)) { var ownerId = entry.RootFolderType == FolderType.USER ? entry.RootFolderCreator : entry.CreateBy; var w = new AceWrapper { SubjectId = ownerId, SubjectName = Global.GetUserName(ownerId), SubjectGroup = false, Share = FileShare.ReadWrite, Owner = true }; result.Add(w); } if (result.Any(w => w.SubjectId == SecurityContext.CurrentAccount.ID)) { result.Single(w => w.SubjectId == SecurityContext.CurrentAccount.ID).LockedRights = true; } if (entry.RootFolderType == FolderType.COMMON) { if (result.All(w => w.SubjectId != Constants.GroupAdmin.ID)) { var w = new AceWrapper { SubjectId = Constants.GroupAdmin.ID, SubjectName = FilesCommonResource.Admin, SubjectGroup = true, Share = FileShare.ReadWrite, Owner = false, LockedRights = true, }; result.Add(w); } var index = result.FindIndex(w => w.SubjectId == Constants.GroupEveryone.ID); if (index == -1) { var w = new AceWrapper { SubjectId = Constants.GroupEveryone.ID, SubjectName = FilesCommonResource.Everyone, SubjectGroup = true, Share = fileSecurity.DefaultCommonShare, Owner = false, DisableRemove = true }; result.Add(w); } else { result[index].DisableRemove = true; } } return(result); }
public ItemList <AceWrapper> GetSharedInfo <T>(IEnumerable <T> fileIds, IEnumerable <T> folderIds) { if (!AuthContext.IsAuthenticated) { throw new InvalidOperationException(FilesCommonResource.ErrorMassage_SecurityException); } var result = new List <AceWrapper>(); var fileDao = DaoFactory.GetFileDao <T>(); var files = fileDao.GetFiles(fileIds); var folderDao = DaoFactory.GetFolderDao <T>(); var folders = folderDao.GetFolders(folderIds); var entries = files.Cast <FileEntry <T> >().Concat(folders.Cast <FileEntry <T> >()); foreach (var entry in entries) { IEnumerable <AceWrapper> acesForObject; try { acesForObject = GetSharedInfo(entry); } catch (Exception e) { Logger.Error(e); throw new InvalidOperationException(e.Message, e); } foreach (var aceForObject in acesForObject) { var duplicate = result.FirstOrDefault(ace => ace.SubjectId == aceForObject.SubjectId); if (duplicate == null) { if (result.Any()) { aceForObject.Owner = false; aceForObject.Share = FileShare.Varies; } continue; } if (duplicate.Share != aceForObject.Share) { aceForObject.Share = FileShare.Varies; } if (duplicate.Owner != aceForObject.Owner) { aceForObject.Owner = false; aceForObject.Share = FileShare.Varies; } result.Remove(duplicate); } var withoutAce = result.Where(ace => acesForObject.FirstOrDefault(aceForObject => aceForObject.SubjectId == ace.SubjectId) == null); foreach (var ace in withoutAce) { ace.Share = FileShare.Varies; } var notOwner = result.Where(ace => ace.Owner && acesForObject.FirstOrDefault(aceForObject => aceForObject.Owner && aceForObject.SubjectId == ace.SubjectId) == null); foreach (var ace in notOwner) { ace.Owner = false; ace.Share = FileShare.Varies; } result.AddRange(acesForObject); } var ownerAce = result.FirstOrDefault(ace => ace.Owner); result.Remove(ownerAce); var meAce = result.FirstOrDefault(ace => ace.SubjectId == AuthContext.CurrentAccount.ID); result.Remove(meAce); AceWrapper linkAce = null; if (entries.Count() > 1) { result.RemoveAll(ace => ace.SubjectId == FileConstant.ShareLinkId); } else { linkAce = result.FirstOrDefault(ace => ace.SubjectId == FileConstant.ShareLinkId); } result.Sort((x, y) => string.Compare(x.SubjectName, y.SubjectName)); if (ownerAce != null) { result = new List <AceWrapper> { ownerAce }.Concat(result).ToList(); } if (meAce != null) { result = new List <AceWrapper> { meAce }.Concat(result).ToList(); } if (linkAce != null) { result.Remove(linkAce); result = new List <AceWrapper> { linkAce }.Concat(result).ToList(); } return(new ItemList <AceWrapper>(result)); }