/// <summary> /// Проверка на сохранение объекта в БД, поступившего от клиента, в рамках датаграммы /// </summary> /// <param name="xuser">Пользователь, сохраняющий объект</param> /// <param name="ex">Описание запрета</param> public bool HasSaveObjectPrivilege(XUser xuser, DomainObjectData xobj, out Exception ex) { ex = null; ITUser user = (ITUser)xuser; using (XStorageConnection con = getConnection()) { ObjectRightsCheckerBase checker = (ObjectRightsCheckerBase)m_ObjectRightCheckers[xobj.ObjectType]; bool bAllow; string sErrorDescription; if (checker != null) { bAllow = checker.HasSaveObjectRight(user, xobj, con, out sErrorDescription); } else { bAllow = m_coveringPrivilegesManager.HasSaveObjectRight(user, xobj, con, out sErrorDescription); } if (sErrorDescription != null && sErrorDescription.Length > 0) { ex = new XSecurityException(sErrorDescription); } return(bAllow); } }
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> /// Запрос разрешенных действий при создании объекта /// </summary> /// <param name="xuser">Пользователь</param> /// <param name="xobj"></param> /// <returns></returns> public XNewObjectRights GetRightsOnNewObject(XUser xuser, DomainObjectData xobj) { ITUser user = (ITUser)xuser; using (XStorageConnection con = getConnection()) { ObjectRightsCheckerBase checker = (ObjectRightsCheckerBase)m_ObjectRightCheckers[xobj.ObjectType]; if (checker != null) { return(checker.GetRightsOnNewObject(user, xobj, con)); } return(m_coveringPrivilegesManager.GetRightsOnNewObject(user, xobj, con)); } }
/// <summary> /// Копирует данные текущего объекта в переданный экземпляр /// ВНИМАНИЕ: копирование поверхностное (копируются ссылки на ActivityTypes и ManagedOrganizations) /// </summary> /// <remarks> /// Из базового класса копируются поля m_privileges, m_roles, m_bIsUnrestricted, m_OriginalPrincipal /// </remarks> /// <param name="user"></param> public void CopyTo(ITUser user) { user.SystemUserID = SystemUserID; user.EmployeeID = EmployeeID; user.LastName = LastName; user.FirstName = FirstName; user.EMail = EMail; user.IsServiceAccount = IsServiceAccount; user.WorkdayDuration = WorkdayDuration; user.ActivityTypes = ActivityTypes; user.ManagedOrganizations = ManagedOrganizations; user.m_privileges = m_privileges; user.m_roles = m_roles; user.m_bIsUnrestricted = m_bIsUnrestricted; user.m_OriginalPrincipal = m_OriginalPrincipal; user.m_bAccessPermitted = m_bAccessPermitted; }
/// <summary> /// Проверка перед созданием объекта (упреждающая) /// </summary> public override XNewObjectRights GetRightsOnNewObject(ITUser user, DomainObjectData xobj, XStorageConnection con) { string sPrivilege = (string)m_requiredPrivilegesForTypes[xobj.ObjectType]; if (sPrivilege != null) { if (user.PrivilegeSet.Contains(sPrivilege)) { return(XNewObjectRights.FullRights); } else { return(XNewObjectRights.EmptyRights); } } return(XNewObjectRights.FullRights); }
/// <summary> /// Проверка при сохранении нового объекта /// </summary> protected override bool hasInsertObjectRight(ITUser user, DomainObjectData xobj, XStorageConnection con, out string sErrorDescription) { sErrorDescription = null; string sPrivilege = (string)m_requiredPrivilegesForTypes[xobj.ObjectType]; if (sPrivilege != null) { if (user.PrivilegeSet.Contains(sPrivilege)) { return(true); } else { sErrorDescription = "Для права создания объекта необходима привилегия \"" + SystemPrivilegesItem.GetItem(sPrivilege).Description + "\""; return(false); } } return(true); }
private void readUserManagedOrganizations(ITUser user, XStorageConnection con) { XDbCommand cmd = con.CreateCommand(); cmd.CommandText = @" SELECT o.ObjectID FROM Organization o WITH (nolock) JOIN Organization o_p WITH (nolock) ON o_p.LIndex <= o.LIndex AND o_p.RIndex >= o.RIndex and o_p.Director = @EmployeeID " ; cmd.Parameters.Add("EmployeeID", DbType.Guid, ParameterDirection.Input, false, user.EmployeeID); using (IXDataReader reader = cmd.ExecuteXReader()) { ArrayList aOrgIDs = new ArrayList(); while (reader.Read()) { aOrgIDs.Add(reader.GetGuid(0)); } user.ManagedOrganizations = new Guid[aOrgIDs.Count]; aOrgIDs.CopyTo(user.ManagedOrganizations); } }
private void readUserActivityTypes(ITUser user, XStorageConnection con) { XDbCommand cmd = con.CreateCommand(); cmd.CommandText = @" SELECT at.ObjectID, at.Name, at.Code, at.AccountRelated, at.FolderType, at.StartDate, at.EndDate FROM dbo.SystemUser_ActivityTypes su_at WITH (nolock) JOIN dbo.ActivityType at WITH (nolock) ON su_at.Value = at.ObjectID WHERE su_at.ObjectID = @ObjectID UNION SELECT at.ObjectID, at.Name, at.Code, at.AccountRelated, at.FolderType, at.StartDate, at.EndDate FROM dbo.SystemUser_SystemRoles su_sr WITH (nolock) JOIN dbo.SystemRole_ActivityTypes sr_at WITH (nolock) ON su_sr.Value = sr_at.ObjectID JOIN dbo.ActivityType at WITH (nolock) ON sr_at.Value = at.ObjectID WHERE su_sr.ObjectID = @ObjectID " ; cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, user.SystemUserID); using (IXDataReader reader = cmd.ExecuteXReader()) { user.ActivityTypes = new Hashtable(); while (reader.Read()) { DomainObject_ActivityType xobj = new DomainObject_ActivityType(); xobj.ObjectID = reader.GetGuid(reader.GetOrdinal("ObjectID")); xobj.Name = reader.GetString(reader.GetOrdinal("Name")); xobj.Code = reader.GetString(reader.GetOrdinal("Code")); xobj.AccountRelated = reader.GetBoolean(reader.GetOrdinal("AccountRelated")); xobj.FolderType = (FolderTypeFlags)reader.GetInt16(reader.GetOrdinal("FolderType")); xobj.StartDate = reader.GetDateTime(reader.GetOrdinal("StartDate")); if (!reader.IsDBNull(reader.GetOrdinal("EndDate"))) { xobj.EndDate = reader.GetDateTime(reader.GetOrdinal("EndDate")); } user.ActivityTypes.Add(xobj.ObjectID, xobj); } } }
/// <summary> /// Обновляет описание пользователя, которое было сброшено /// </summary> /// <remarks> /// За анализ и управление свойством IsFlushed отвечает XSecurityManager. /// </remarks> /// <param name="user">Экземпляр XUser или производный, у которого свойство IsFlushed=true</param> public void UpdateUser(XUser user) { ITUser userLoaded = (ITUser)CreateUser(user.Name); userLoaded.CopyTo((ITUser)user); }
/// <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); }
public int GetPrivilege(ITUser user, Guid FolderID, XStorageConnection con) { return((int)m_cache.GetValue(packKey(user.EmployeeID, FolderID), dlgReadPrivileges, con)); }
public bool HasFolderPrivilege(ITUser user, FolderPrivileges privilege, DomainObjectData xobjFolder, XStorageConnection con) { // т.к. компонент может использоваться не только через методы XSecurityManager: GetObjectRights, HasSaveObjectRights, etc. if (user.IsUnrestricted) { return(true); } string sPrivilege = FolderPrivilegesItem.GetItem(privilege).Name; Guid orgID; Guid activityTypeID; FolderStates folderState; if (xobjFolder.IsNew) { if (!xobjFolder.HasUpdatedProp("Customer") || xobjFolder.GetUpdatedPropValue("Customer") == DBNull.Value) { return(false); } orgID = (Guid)xobjFolder.GetUpdatedPropValue("Customer"); if (!xobjFolder.HasUpdatedProp("ActivityType") || xobjFolder.GetUpdatedPropValue("ActivityType") == DBNull.Value) { return(false); } activityTypeID = (Guid)xobjFolder.GetUpdatedPropValue("ActivityType"); if (!xobjFolder.HasUpdatedProp("State") || xobjFolder.GetUpdatedPropValue("State") == DBNull.Value) { return(false); } folderState = (FolderStates)xobjFolder.GetUpdatedPropValue("State"); } else { if (!xobjFolder.HasLoadedProp("Customer") || !xobjFolder.HasLoadedProp("ActivityType") || !xobjFolder.HasLoadedProp("Parent") || !xobjFolder.HasLoadedProp("State")) { xobjFolder.Load(con); } orgID = (Guid)xobjFolder.GetLoadedPropValue("Customer"); activityTypeID = (Guid)xobjFolder.GetLoadedPropValue("ActivityType"); folderState = (FolderStates)xobjFolder.GetLoadedPropValue("State"); } // в закрытой папке ни у кого нет никаких привилегий if (folderState == FolderStates.Closed) { return(false); } if (user.ManageOrganization(orgID) || user.ManageActivityType(activityTypeID)) { return(true); } if (!xobjFolder.IsNew) { // для объекта из БД, проверим определение привилегий для участника проекта заданной и вышестоящих папок if (m_folderPrivilegesDefinitionContainer.GetPrivileges(user, xobjFolder.ObjectID, con).Contains(sPrivilege)) { return(true); } } else { // Для нового объекта зачитывать привилегии из БД бессмысленно - // проверим ссылку на родителя, если она задана, то зачитаем его привилегии object vValue = xobjFolder.GetUpdatedPropValue("Parent"); if (vValue is Guid) { if (m_folderPrivilegesDefinitionContainer.GetPrivileges(user, (Guid)vValue, con).Contains(sPrivilege)) { return(true); } } } return(false); }