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); } } }
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); }
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(); } }
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()); }
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))); }
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); }
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); } }