示例#1
0
        /// <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));
        }
示例#3
0
        /// <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));
            }
        }
示例#4
0
文件: ITUser.cs 项目: SanSay157/IT8
 /// <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;
 }
示例#5
0
        /// <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);
        }
示例#6
0
        /// <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);
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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);
                }
            }
        }
示例#9
0
        /// <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);
        }
示例#10
0
        /// <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);
        }