public XPrivilegeSet GetPrivileges(ITUser user, Guid FolderID, XStorageConnection con) { Debug.Assert(con != null); Debug.Assert(FolderID != Guid.Empty); int privileges = m_cache.GetPrivilege(user, FolderID, con); return(PrivilegesHelper.CreatePrivilegeSet((FolderPrivileges)privileges)); }
/// <summary> /// Конструирует описание пользователя по наименованию. /// Если пользователя с таким наименованием не найдено, то возвращает null /// </summary> /// <param name="sUserName">Наименование пользователя</param> /// <returns></returns> public XUser CreateUser(string sUserName) { ITUser user; using (XStorageConnection con = getConnection()) { con.Open(); XDbCommand cmd = con.CreateCommand(); cmd.CommandText = /* Получим описание пользователя (который может быть сотрудником), * системные привилегии (как выданные явно, так и полученные через роли). * Примечания: - пользователь приложения может не быть сотрудником. * - для пользователя приложения могут быть не заданы роли * - GetWorkdayDuration возвращает количество минут * */ @"SELECT su.ObjectID AS SysUserID, su.IsAdmin, su.IsServiceAccount, emp.ObjectID AS EmpID, emp.LastName, emp.FirstName, emp.EMail, su.SystemPrivileges, sr.Name as RoleName, sr.Description as RoleDescription, sr.Priviliges as RolePrivileges, dbo.GetWorkdayGlobalDuration() as WorkingMinutesInDay, CASE WHEN emp.WorkEndDate < getDate() THEN 0 ELSE 1 END as AccessPermitted FROM SystemUser su WITH (nolock) LEFT JOIN Employee emp WITH (nolock) ON emp.SystemUser = su.ObjectID LEFT JOIN (SystemUser_SystemRoles su_sr WITH (nolock) JOIN SystemRole sr WITH (nolock) ON su_sr.Value = sr.ObjectID ) ON su.ObjectID = su_sr.ObjectID WHERE su.Login = @UserLogin"; cmd.Parameters.Add("UserLogin", DbType.String, ParameterDirection.Input, false, sUserName); using (IDataReader reader = cmd.ExecuteReader()) { XRole[] roles; // массив системных ролей Guid SystemUserID; // идентификатор пользователя Guid EmployeeID = Guid.Empty; // идентификатор сотрудника string sLastName = null; // фамилия сотрудника string sFirstName = null; // имя сотрудника string sEMail = null; // email сотрудника bool bIsAdmin; // признак админа (необграниченного пользователя) bool bIsServiceAccount; // признак сервисного аккаунта int nIndex; // временная - индекс колонки int nPrivileges; // числовая маска привилегий (в БД привилегии лежат как флаги) int nWorkingMinutesInDay; // количество рабочих часов в сутках bool bAccesssPermitted = true; if (reader.Read()) { // получим маску привилегий, выданных пользователю явно nPrivileges = reader.GetInt32(reader.GetOrdinal("SystemPrivileges")); // поле SystemPrivileges - not null SystemUserID = reader.GetGuid(reader.GetOrdinal("SysUserID")); bIsAdmin = reader.GetBoolean(reader.GetOrdinal("IsAdmin")); bIsServiceAccount = reader.GetBoolean(reader.GetOrdinal("IsServiceAccount")); nWorkingMinutesInDay = reader.GetInt32(reader.GetOrdinal("WorkingMinutesInDay")); nIndex = reader.GetOrdinal("EmpID"); if (!reader.IsDBNull(nIndex)) { // если пользователь является сотрудником EmployeeID = reader.GetGuid(nIndex); sLastName = reader.GetString(reader.GetOrdinal("LastName")); sFirstName = reader.GetString(reader.GetOrdinal("FirstName")); bAccesssPermitted = reader.GetInt32(reader.GetOrdinal("AccessPermitted")) == 1; nIndex = reader.GetOrdinal("EMail"); if (!reader.IsDBNull(nIndex)) { sEMail = reader.GetString(nIndex); } } } else { // не нашли пользователя return(CreateAnonymousUser()); } // зачитаем все роли текущего юзера ArrayList aRoles = new ArrayList(); // список объектов XRole - роли пользователя int nIndex_RoleName = reader.GetOrdinal("RoleName"); int nIndex_RoleDescription = reader.GetOrdinal("RoleDescription"); int nIndex_RolePrivileges = reader.GetOrdinal("RolePrivileges"); if (!reader.IsDBNull(nIndex_RoleName)) { // по всем ролям пользователя do { string sDescription = String.Empty; if (!reader.IsDBNull(nIndex_RoleDescription)) { sDescription = reader.GetString(nIndex_RoleDescription); } // объединим маску привилегий с привилегиями текущей роли nPrivileges = nPrivileges | reader.GetInt32(nIndex_RolePrivileges); aRoles.Add(new XRole(reader.GetString(nIndex_RoleName), sDescription)); } while(reader.Read()); } roles = new XRole[aRoles.Count]; aRoles.CopyTo(roles); // превратим маску привилегий в массив объектов XPrivilegeSet privilege_set = PrivilegesHelper.CreatePrivilegeSet((SystemPrivileges)nPrivileges); // создадим описание пользователя и дополним атрибуты, специфичные для нашего приложения user = new ITUser(sUserName, roles, privilege_set); user.SystemUserID = SystemUserID; user.IsUnrestricted = bIsAdmin; user.IsServiceAccount = bIsServiceAccount; user.AccessPermitted = bAccesssPermitted; if (EmployeeID != Guid.Empty) { // если пользователь - сотрудник user.EmployeeID = EmployeeID; user.LastName = sLastName; user.FirstName = sFirstName; user.EMail = sEMail; user.WorkdayDuration = nWorkingMinutesInDay; } } readUserActivityTypes(user, con); readUserManagedOrganizations(user, con); } return(user); }