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