Ejemplo n.º 1
0
        public void SetShare(FileShareRecord r)
        {
            using (var DbManager = GetDb())
            {
                if (r.Share == FileShare.None)
                {
                    using (var tx = DbManager.BeginTransaction())
                    {
                        var files = new List<object>();

                        if (r.EntryType == FileEntryType.Folder)
                        {
                            var folders =
                                DbManager.ExecuteList(new SqlQuery("files_folder_tree").Select("folder_id").Where("parent_id", r.EntryId))
                                         .ConvertAll(o => (int) o[0]);
                            files.AddRange(DbManager.ExecuteList(Query("files_file").Select("id").Where(Exp.In("folder_id", folders))).
                                                     ConvertAll(o => o[0]));

                            var d1 = new SqlDelete("files_security")
                                .Where("tenant_id", r.Tenant)
                                .Where(Exp.In("entry_id", folders))
                                .Where("entry_type", (int) FileEntryType.Folder)
                                .Where("subject", r.Subject.ToString());

                            DbManager.ExecuteNonQuery(d1);
                        }
                        else
                        {
                            files.Add(r.EntryId);
                        }

                        if (0 < files.Count)
                        {
                            var d2 = new SqlDelete("files_security")
                                .Where("tenant_id", r.Tenant)
                                .Where(Exp.In("entry_id", files))
                                .Where("entry_type", (int) FileEntryType.File)
                                .Where("subject", r.Subject.ToString());

                            DbManager.ExecuteNonQuery(d2);
                        }

                        tx.Commit();
                    }
                }
                else
                {
                    var i = new SqlInsert("files_security", true)
                        .InColumnValue("tenant_id", r.Tenant)
                        .InColumnValue("entry_id", r.EntryId)
                        .InColumnValue("entry_type", (int) r.EntryType)
                        .InColumnValue("subject", r.Subject.ToString())
                        .InColumnValue("owner", r.Owner.ToString())
                        .InColumnValue("security", (int) r.Share)
                        .InColumnValue("timestamp", DateTime.UtcNow);

                    DbManager.ExecuteNonQuery(i);
                }
            }
        }
Ejemplo n.º 2
0
        public void Share <T>(T entryId, FileEntryType entryType, Guid @for, FileShare share)
        {
            var securityDao = daoFactory.GetSecurityDao <T>();
            var r           = new FileShareRecord
            {
                Tenant    = TenantManager.GetCurrentTenant().TenantId,
                EntryId   = entryId,
                EntryType = entryType,
                Subject   = @for,
                Owner     = AuthContext.CurrentAccount.ID,
                Share     = share,
            };

            securityDao.SetShare(r);
        }
Ejemplo n.º 3
0
 public void Share(object entryId, FileEntryType entryType, Guid @for, FileShare share)
 {
     using (var securityDao = daoFactory.GetSecurityDao())
     {
         var r = new FileShareRecord
         {
             Tenant    = TenantProvider.CurrentTenantID,
             EntryId   = entryId,
             EntryType = entryType,
             Subject   = @for,
             Owner     = SecurityContext.CurrentAccount.ID,
             Share     = share,
         };
         securityDao.SetShare(r);
     }
 }
        public void SetShare(FileShareRecord r)
        {
            using (var dbManager = new DbManager(FileConstant.DatabaseId))
            using (var tx = dbManager.BeginTransaction())
            {
                if (r.Share == FileShare.None)
                {
                    if (r.EntryType == FileEntryType.Folder)
                    {
                        var entryIDs = dbManager.ExecuteList(Query("files_thirdparty_id_mapping")
                                                                 .Select("hash_id")
                                                                 .Where(Exp.Like("id", r.EntryId.ToString(), SqlLike.StartWith)))
                                                .ConvertAll(x => x[0]);

                        dbManager.ExecuteNonQuery(Delete("files_security")
                                                      .Where(Exp.In("entry_id", entryIDs) &
                                                             Exp.Eq("subject", r.Subject.ToString())));
                    }
                    else
                    {
                        var d2 = Delete("files_security")
                            .Where(Exp.Eq("entry_id", MappingID(r.EntryId, true)))
                            .Where("entry_type", (int) FileEntryType.File)
                            .Where("subject", r.Subject.ToString());

                        dbManager.ExecuteNonQuery(d2);
                    }
                }
                else
                {
                    var i = new SqlInsert("files_security", true)
                        .InColumnValue("tenant_id", r.Tenant)
                        .InColumnValue("entry_id", MappingID(r.EntryId, true))
                        .InColumnValue("entry_type", (int) r.EntryType)
                        .InColumnValue("subject", r.Subject.ToString())
                        .InColumnValue("owner", r.Owner.ToString())
                        .InColumnValue("security", (int) r.Share)
                        .InColumnValue("timestamp", DateTime.UtcNow);

                    dbManager.ExecuteNonQuery(i);
                }

                tx.Commit();
            }
        }
Ejemplo n.º 5
0
        private IEnumerable <Guid> WhoCan <T>(FileEntry <T> entry, FilesSecurityActions action)
        {
            var shares = GetShares(entry);

            FileShareRecord defaultShareRecord;

            switch (entry.RootFolderType)
            {
            case FolderType.COMMON:
                defaultShareRecord = new FileShareRecord
                {
                    Level     = int.MaxValue,
                    EntryId   = entry.ID,
                    EntryType = entry.FileEntryType,
                    Share     = DefaultCommonShare,
                    Subject   = Constants.GroupEveryone.ID,
                    Tenant    = TenantManager.GetCurrentTenant().TenantId,
                    Owner     = AuthContext.CurrentAccount.ID
                };

                if (!shares.Any())
                {
                    if ((defaultShareRecord.Share == FileShare.Read && action == FilesSecurityActions.Read) ||
                        (defaultShareRecord.Share == FileShare.ReadWrite))
                    {
                        return(UserManager.GetUsersByGroup(defaultShareRecord.Subject)
                               .Where(x => x.Status == EmployeeStatus.Active).Select(y => y.ID).Distinct());
                    }

                    return(Enumerable.Empty <Guid>());
                }

                break;

            case FolderType.USER:
                defaultShareRecord = new FileShareRecord
                {
                    Level     = int.MaxValue,
                    EntryId   = entry.ID,
                    EntryType = entry.FileEntryType,
                    Share     = DefaultMyShare,
                    Subject   = entry.RootFolderCreator,
                    Tenant    = TenantManager.GetCurrentTenant().TenantId,
                    Owner     = entry.RootFolderCreator
                };

                if (!shares.Any())
                {
                    return new List <Guid>
                           {
                               entry.RootFolderCreator
                           }
                }
                ;

                break;

            case FolderType.Privacy:
                defaultShareRecord = new FileShareRecord
                {
                    Level     = int.MaxValue,
                    EntryId   = entry.ID,
                    EntryType = entry.FileEntryType,
                    Share     = DefaultPrivacyShare,
                    Subject   = entry.RootFolderCreator,
                    Tenant    = TenantManager.GetCurrentTenant().TenantId,
                    Owner     = entry.RootFolderCreator
                };

                if (!shares.Any())
                {
                    return new List <Guid>
                           {
                               entry.RootFolderCreator
                           }
                }
                ;

                break;

            case FolderType.BUNCH:
                if (action == FilesSecurityActions.Read)
                {
                    var folderDao = daoFactory.GetFolderDao <T>();

                    var root = folderDao.GetFolder(entry.RootFolderId);
                    if (root != null)
                    {
                        var path = folderDao.GetBunchObjectID(root.ID);

                        var adapter = FilesIntegration.GetFileSecurity(path);

                        if (adapter != null)
                        {
                            return(adapter.WhoCanRead(entry));
                        }
                    }
                }

                // TODO: For Projects and other
                defaultShareRecord = null;
                break;

            default:
                defaultShareRecord = null;
                break;
            }

            if (defaultShareRecord != null)
            {
                shares = shares.Concat(new[] { defaultShareRecord });
            }

            return(shares.SelectMany(x =>
            {
                var groupInfo = UserManager.GetGroupInfo(x.Subject);

                if (groupInfo.ID != Constants.LostGroupInfo.ID)
                {
                    return
                    UserManager.GetUsersByGroup(groupInfo.ID)
                    .Where(p => p.Status == EmployeeStatus.Active)
                    .Select(y => y.ID);
                }

                return new[] { x.Subject };
            })
                   .Distinct()
                   .Where(x => Can(entry, x, action))
                   .ToList());
        }
Ejemplo n.º 6
0
        private IEnumerable <Guid> WhoCan(FileEntry fileEntry, FilesSecurityActions action)
        {
            var shares = GetShares(fileEntry);

            FileShareRecord defaultShareRecord;

            switch (fileEntry.RootFolderType)
            {
            case FolderType.COMMON:
                defaultShareRecord = new FileShareRecord
                {
                    Level     = int.MaxValue,
                    EntryId   = fileEntry.ID,
                    EntryType = fileEntry is File ? FileEntryType.File : FileEntryType.Folder,
                    Share     = DefaultCommonShare,
                    Subject   = Constants.GroupEveryone.ID,
                    Tenant    = TenantProvider.CurrentTenantID,
                    Owner     = SecurityContext.CurrentAccount.ID
                };

                if (!shares.Any())
                {
                    if ((defaultShareRecord.Share == FileShare.Read && action == FilesSecurityActions.Read) ||
                        (defaultShareRecord.Share == FileShare.ReadWrite))
                    {
                        return(CoreContext.UserManager.GetUsersByGroup(defaultShareRecord.Subject)
                               .Where(x => x.Status == EmployeeStatus.Active).Select(y => y.ID).Distinct());
                    }

                    return(Enumerable.Empty <Guid>());
                }

                break;

            case FolderType.USER:
                defaultShareRecord = new FileShareRecord
                {
                    Level     = int.MaxValue,
                    EntryId   = fileEntry.ID,
                    EntryType = fileEntry is File ? FileEntryType.File : FileEntryType.Folder,
                    Share     = DefaultMyShare,
                    Subject   = fileEntry.RootFolderCreator,
                    Tenant    = TenantProvider.CurrentTenantID,
                    Owner     = fileEntry.RootFolderCreator
                };

                if (!shares.Any())
                {
                    return new List <Guid>
                           {
                               fileEntry.RootFolderCreator
                           }
                }
                ;

                break;

            default:
                defaultShareRecord = null;
                break;
            }
            // TODO: For Projects and other

            if (defaultShareRecord != null)
            {
                shares = shares.Concat(new[] { defaultShareRecord });
            }

            return(shares.SelectMany(x =>
            {
                var groupInfo = CoreContext.GroupManager.GetGroupInfo(x.Subject);

                if (groupInfo.ID != Constants.LostGroupInfo.ID)
                {
                    return
                    CoreContext.UserManager.GetUsersByGroup(groupInfo.ID)
                    .Where(p => p.Status == EmployeeStatus.Active)
                    .Select(y => y.ID);
                }

                return new[] { x.Subject };
            })
                   .Distinct()
                   .Where(x => Can(fileEntry, x, action)));
        }
Ejemplo n.º 7
0
        private FileShareRecord ToFileShareRecord(object[] r)
        {
            var result = new FileShareRecord
                {
                    Tenant = Convert.ToInt32(r[0]),
                    EntryId = MappingID(r[1]),
                    EntryType = (FileEntryType) Convert.ToInt32(r[2]),
                    Subject = new Guid((string) r[3]),
                    Owner = new Guid((string) r[4]),
                    Share = (FileShare) Convert.ToInt32(r[5]),
                    Level = 6 < r.Length ? Convert.ToInt32(r[6]) : 0,
                };


            return result;
        }
        public void SetShare(FileShareRecord r)
        {
            var selector = GetSelector(r.EntryId);

            selector.GetSecurityDao(r.EntryId).SetShare(r);
        }
Ejemplo n.º 9
0
 public void Share(object entryId, FileEntryType entryType, Guid @for, FileShare share)
 {
     using (var dao = daoFactory.GetSecurityDao())
     {
         var r = new FileShareRecord
                     {
                         Tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId,
                         EntryId = entryId,
                         EntryType = entryType,
                         Subject = @for,
                         Owner = SecurityContext.CurrentAccount.ID,
                         Share = share,
                     };
         dao.SetShare(r);
     }
 }