コード例 #1
0
ファイル: PrivilegeHelpers.cs プロジェクト: SanSay157/IT8
        public static XPrivilegeSet CreatePrivilegeSet(FolderPrivilegesItem[] values)
        {
            XPrivilegeSet set = new XPrivilegeSet();

            for (int i = 0; i < values.Length; ++i)
            {
                set.Add(new ITFolderPrivilege(values[i]));
            }
            return(set);
        }
コード例 #2
0
ファイル: InterfaceHelpers.cs プロジェクト: SanSay157/IT8
        /// <summary>
        /// Создает описание списка при первом обращении.
        /// Параметр делегата CreateCacheValue.
        /// </summary>
        /// <param name="sKey">Ключ в формате {Наименование типа}:{Наименование списка}</param>
        /// <param name="value">XStorageConnection</param>
        /// <returns>экземпляр ListInfoWithAccessCheck</returns>
        private static ListInfoWithAccessCheck createListInfo(string sKey, object value)
        {
            #region Copy-paste кода из XInterfaceObjectsHolder::createListInfo

            XStorageConnection connection      = (XStorageConnection)value;
            XMetadataManager   metadataManager = connection.MetadataManager;

            // Ключ для сохранения в реестре (кеше) XModel в данном случае
            // ДОЛЖЕН БЫТЬ в виде {Наименование типа}:{Наименование списка}
            // Разберем этот ключ - выделим наименование типа и наименование списка
            Debug.Assert(sKey.IndexOf(":") > -1, "Отсутствует символ ':' в ключе");
            int    nIndex    = sKey.IndexOf(":");
            string sTypeName = sKey.Substring(0, nIndex);
            Debug.Assert(sTypeName.Length > 0, "Не задан тип");
            string sName = sKey.Substring(nIndex + 1, sKey.Length - nIndex - 1);

            // Сформируем XPath-запрос и загрузим метаописание списка; при формировании
            // запроса учитваем что метанаименование списка - параметр необязательный
            string sXPath = "ds:type[@n='" + sTypeName + "']/i:objects-list";
            if (sName.Length > 0)
            {
                sXPath = sXPath + "[@n='" + sName + "']";
            }

            XmlElement xmlList = (XmlElement)metadataManager.SelectSingleNode(sXPath);
            if (xmlList == null)
            {
                throw new ArgumentException(
                          "Неизвестное определение списка i:objects-list с метанаименованием " +
                          "'" + sName + "', для типа '" + sTypeName + "' " +
                          "(не найдено в метаданных, XPath='" + sXPath + "')");
            }

            #endregion
            //Создаем описание списка ListInfoWithAccessCheck.
            ListInfoWithAccessCheck listInfo = new ListInfoWithAccessCheck(xmlList, connection.MetadataManager.NamespaceManager, connection.MetadataManager.XModel);
            XPrivilegeSet           privSet  = new XPrivilegeSet();

            //Зачитываем из метаданных необходимые привилегии для доступа к заданному списку и записываем их в контейнер привилегий.
            foreach (XmlElement xmlNode in xmlList.SelectNodes("it-sec:access-requirements/*", connection.MetadataManager.NamespaceManager))
            {
                string            sPrivName = xmlNode.GetAttribute("n");
                ITSystemPrivilege priv      = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName));
                privSet.Add(priv);
            }
            listInfo.AccessSecurity.SetRequiredPrivileges(privSet);
            return(listInfo);
        }
コード例 #3
0
        public override XTreePageInfo CreateTreePageInfo(XmlElement xmlTreePage)
        {
            TreePageWithAccessCheckInfo treePage = new TreePageWithAccessCheckInfo();

            base.initTreePageInfo(treePage, xmlTreePage);
            XPrivilegeSet privSet = new XPrivilegeSet();

            foreach (XmlElement xmlNode in xmlTreePage.SelectNodes("it-sec:access-requirements/*", m_mdManager.NamespaceManager))
            {
                string            sPrivName = xmlNode.GetAttribute("n");
                ITSystemPrivilege priv      = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName));
                privSet.Add(priv);
            }
            treePage.AccessSecurity.SetRequiredPrivileges(privSet);
            return(treePage);
        }
コード例 #4
0
ファイル: InterfaceHelpers.cs プロジェクト: SanSay157/IT8
 /// <summary>
 /// Метод,записывающий в контейнер набор привилегий.
 /// </summary>
 /// <param name="privilege_set">набор привилегий</param>
 public void SetRequiredPrivileges(XPrivilegeSet privilege_set)
 {
     m_requiredPrivileges = privilege_set;
 }
コード例 #5
0
ファイル: ITUser.cs プロジェクト: SanSay157/IT8
 public ITUser(string sName, XRole[] roles, XPrivilegeSet privilege_set)
     : base(sName, roles, privilege_set)
 {
 }
コード例 #6
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);
        }