示例#1
0
 /// <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;
 }
示例#2
0
        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);
        }
示例#3
0
 /// <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);
        }
示例#5
0
        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));
        }
示例#6
0
        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);
        }
示例#7
0
        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));
        }