// обновление всех ролей public bool GetUpdateAllRoles(List <Permission> permissions, string oldController = "") { // все роли var q = from t1 in context.Objects join t2 in context.Properties on t1.Id equals t2.ObjectId join t3 in context.ObjectTypes on t1.Type equals t3.Id where t3.Name == "Group" select new { t1.Id, t1.Name, t2.Value }; // экземпляр ролей для сохранения изменений List <Role> roles = new List <Role>(); // прогоняем все роли foreach (var i in q) { // шаблоны разрешений ролей List <RolePermissionsTemplate> ro = new List <RolePermissionsTemplate>(); // десерилизуем var props = json.Deserialize(i.Value, ro.GetType()); // наполняем ro = (List <RolePermissionsTemplate>)props; // указывает нужно ли добавить в список ролей var save = 0; // прогоняем все экшены роли foreach (var j in ro.ToList()) { // поиск контроллера (если строка 'oldController' пуста, меняются только экшены) if (j.Name == permissions[0].Name && string.IsNullOrEmpty(oldController)) { // экшены из типа контента foreach (var f in permissions) { // если экшен отключен, ищем экшен в роли if (!f.Selected) { // экшены из роли foreach (var g in j.Permission.ToList()) { // поиск экшена, экшен в роли включен if (f.Name == g.Name && g.Selected) { // удаляем экшен из роли j.Permission.Remove(g); // нужно добавить в список ролей save = 1; } } } } } // поиск контроллера (если строка 'oldController' не пуста, удаляем старый контроллер из роли) else if (j.Name == oldController && !string.IsNullOrEmpty(oldController)) { // убираем весь контроллер с экшенами ro.Remove(j); // нужно добавить в список ролей save = 1; } } // добавляем в список ролей if (save == 1) { // роль Role role = new Role() { Id = i.Id, Name = i.Name, Permissions = ro }; // список roles.Add(role); } } // если список ролей не пуст, сохраняем изменения if (roles.Count() > 0) { foreach (var i in roles) { // обновляем свойства роли context.Properties.FirstOrDefault(p => p.ObjectId == i.Id).Value = json.Serialize(i.Permissions); // сохраняем изменения context.SaveChanges(); } } return(true); }
public void addNode(string newNodeName, int newNodeType, int idNodeToAdd, int defNodeObjType) { var nodeType = 0; string jsonPropEnd = ""; switch (newNodeType) { //OPC-сервер case 1: jsonPropEnd = ",\"Type\":\"\",\"Connection\":\"\",\"Connect\":false}"; nodeType = 1; break; //КТПН дальний case 2: jsonPropEnd = ",\"Address\":0,\"Driver\":\"\",\"RetrCount\":0,\"ParentGroup\":" + idNodeToAdd + ",\"PrimaryChannel\":0,\"SecondaryChannel\":0}"; nodeType = 7; break; //АГЗУ case 3: jsonPropEnd = ",\"Address\":0,\"Driver\":\"\",\"RetrCount\":0,\"ParentGroup\":" + idNodeToAdd + ",\"PrimaryChannel\":0,\"SecondaryChannel\":0}"; nodeType = 5; break; ////БДР //case 4: // jsonProp = "{\"Id\":\"\",\"Name\":\"\",\"Address\":0,\"Driver\":\"\",\"RetrCount\":0,\"ParentGroup\":0,\"PrimaryChannel\":0,\"SecondaryChannel\":0}"; // nodeType = 9; // break; //Радио канал case 5: jsonPropEnd = ",\"ChannelType\":\"Serial\",\"InterPollPause\":0,\"MaxErrorsToSwitchChannel\":3,\"MaxErrorsToBadQuality\":3,\"TimeTryGoBackToPrimary\":300,\"PortName\":\"COM1\",\"BaudRate\":115200,\"Parity\":0,\"StopBits\":1,\"WriteTimeout\":2000,\"ReadTimeout\":2000}"; nodeType = 18; break; //GPRS канал case 6: jsonPropEnd = ",\"ChannelType\":\"Tcp\",\"InterPollPause\":0,\"MaxErrorsToSwitchChannel\":3,\"MaxErrorsToBadQuality\":3,\"TimeTryGoBackToPrimary\":300,\"IpAddress\":\"127.0.0.1\",\"Port\":80,\"WriteTimeout\":2000,\"ReadTimeout\":2000}"; nodeType = 17; break; //PollingGroup case 7: jsonPropEnd = ",\"Start\":0,\"Count\":0,\"Function\":0}"; nodeType = 22; break; //Тег case 8: string ConnString = getConnectionProp(idNodeToAdd) + newNodeName; jsonPropEnd = ",\"Opc\":" + OPCID + ",\"Connection\":\"" + ConnString + "\",\"Alarm_IsPermit\":false,\"HiHiText\":null,\"HiText\":null,\"NormalText\":null,\"LoText\":null,\"LoLoText\":null"; jsonPropEnd += ",\"HiHiSeverity\":null,\"HiSeverity\":null,\"LoSeverity\":null,\"LoLoSeverity\":null,\"ControllerType\":0,\"RealType\":0,\"Register\":\"\",\"AccessType\":0,"; jsonPropEnd += "\"Order\":1,\"InMin\":0,\"InMax\":1,\"OutMin\":1,\"OutMax\":1,\"IsSpecialTag\":false,\"History_IsPermit\":false,\"RegPeriod\":0,\"Deadbend\":0.1}"; nodeType = 2; break; //Папка case 9: jsonPropEnd = ""; nodeType = 21; break; //Другое case 10: jsonPropEnd = "}"; nodeType = defNodeObjType; break; } Objects newNode = new Objects { ParentId = idNodeToAdd, Type = nodeType, Name = newNodeName }; context.Objects.Add(newNode); context.SaveChanges(); //найдем ID узла, добавленного в таблицу Objects var newNodeId = context.Objects.Select(c => c.Id).Max(); string jsonPropBegin = "{\"Id\":" + newNodeId + ",\"Name\":\"" + newNodeName + "\""; Property newNodeProps; //Если тип добавляемого узла - папка, то в таблице Properties строка с величиной будет пустая if (newNodeType == 21) { newNodeProps = new Property { ObjectId = newNodeId, PropId = 0, Value = "" }; } else { newNodeProps = new Property { ObjectId = newNodeId, PropId = 0, Value = jsonPropBegin + jsonPropEnd }; } context.Properties.Add(newNodeProps); context.SaveChanges(); }
public void pasteJsTreeNodes(int parID, int parIDCopy) { using (var context = new EFDbContext()) { //Достанем самый верхний копируемый узел var root = context.Objects.Where(c => c.Id == parID).Select(c => c).FirstOrDefault(); //var childs1 = context.Objects.Where(c => c.ParentId == parID).Select(c => c); //Извлечем все дочерние узлы var childs = from o1 in context.Objects join o2 in context.Properties on o1.Id equals o2.ObjectId where o1.ParentId == parID && o2.PropId == 0 select new { id = o1.Id, name = o1.Name, parentID = o1.ParentId, type = o1.Type, propValue = o2.Value }; int counter = 0; foreach (var child in childs) { //сохранить в базу строку с ID нового узла и его родительским узлом //а еще скопировать свойства из Properties, но учесть, что в JSON свойствах есть ID старого элемента и его надо менять //сделать запрос на макс используемый ID в базе using (var context1 = new EFDbContext()) { //проверка чтобы избежать бесконечной вставки набора копируемых узлов. // то есть if (child.parentID == nodePaste) { return; } //Добавление записи в табл Object Objects obj1 = new Objects { ParentId = parIDCopy, Type = child.type, Name = child.name }; context1.Objects.Add(obj1); context1.SaveChanges(); //ID только что вставленного элемента using (var context2 = new EFDbContext()) { maxIdForProp = context2.Objects.Select(c => c.Id).Max(); } string newPropJson = ""; //если тип узла- папка, то редактировать json свойство не нужно и посылаем пустую строку if (child.type == 13) { newPropJson = ""; } else { //поправим значение ID в строке свойств var getNewIDArr = child.propValue.Split(','); var oldID = getNewIDArr[0]; var newID = "{\"Id\":\"" + maxIdForProp + "\""; newPropJson = child.propValue.Replace(oldID, newID); if (child.type == 2) { string newConnSrt = getConnectionProp(parIDCopy) + child.name; var oldConnection = getNewIDArr[3]; var newConnection = "\"Connection\":\"" + newConnSrt + "\""; newPropJson = newPropJson.Replace(oldConnection, newConnection); var oldOPCID = getNewIDArr[2]; var newOPCID = "\"Opc\":\"" + OPCID + "\""; newPropJson = newPropJson.Replace(oldOPCID, newOPCID); } } //вставка строки со свойствами в таблицу свойств Property objProp = new Property { ObjectId = maxIdForProp, PropId = 0, Value = newPropJson }; context1.Properties.Add(objProp); context1.SaveChanges(); //Сделала новый Using, потому что возникала ошибка. Не знаю верное ли решение //{System.Data.Entity.Core.EntityException: An error occurred while starting a transaction on the provider connection. See the inner exception for details. ---> //System.InvalidOperationException: //Существует назначенный этой команде Command открытый DataReader, который требуется предварительно закрыть. //using (var db2 = new EFDbContext()) //{ // maxID = db2.Objects.Select(c => c.Id).Max(); // maxID2 =maxID; //} } pasteJsTreeNodes(child.id, maxIdForProp); counter++; } } }
public void pasteNode(int idPasteParentElem, int idCopyParentElem) { nodePaste = idPasteParentElem; int nodeCopy = idCopyParentElem; int maxID1; //var OPCName = nameOPC; using (var context = new EFDbContext()) { var rootCopy2 = context.Objects.Where(c => c.Id == nodeCopy).Select(c => c).FirstOrDefault(); //узел, в который будет произведена вставка var nodePasteName = from o1 in context.Objects where o1.Id == nodePaste select o1.Name; //Извлечем копируемый корневой узел с его свойствами var rootCopy = from o1 in context.Objects join o2 in context.Properties on o1.Id equals o2.ObjectId where o1.Id == nodeCopy && o2.PropId == 0 select new { id = o1.Id, name = o1.Name, parentID = o1.ParentId, type = o1.Type, propValue = o2.Value }; //Преобразуем в список, чтобы не использвать foreach. В дальнейшем избавиться от листа var rootCopyNode = rootCopy.ToList(); //корневой для копировани var pasteNode = nodePasteName.ToList(); //узел для вставки //подготовим корневую сущность для вставки в таблицу Objects Objects obj = new Objects { //id = maxID1++, ParentId = idPasteParentElem, Type = rootCopyNode[0].type, Name = rootCopyNode[0].name }; context.Objects.Add(obj); context.SaveChanges(); string newPropJson; //найдем ID только что вставленного корневого элемента maxID1 = context.Objects.Select(c => c.Id).Max(); if (rootCopy2.Type == 21) { newPropJson = ""; } else { //распилим свойства корневого вставляемого элемента var getNewPropArr = rootCopyNode[0].propValue.Split(','); var oldID = getNewPropArr[0]; var newID = "{\"Id\":\"" + maxID1 + "\""; //Заменим ID на актуальный в свойствах newPropJson = rootCopyNode[0].propValue.Replace(oldID, newID); if (rootCopy2.Type == 2) { string newConnSrt = getConnectionProp(idPasteParentElem) + rootCopy2.Name; var oldConnection = getNewPropArr[3]; var newConnection = "\"Connection\":\"" + newConnSrt + "\""; var oldOPCID = getNewPropArr[2]; var newOPCID = "\"Opc\":\"" + OPCID + "\""; newPropJson = newPropJson.Replace(oldOPCID, newOPCID); newPropJson = newPropJson.Replace(oldConnection, newConnection); } } Property objProp = new Property { ObjectId = maxID1, PropId = 0, Value = newPropJson }; context.Properties.Add(objProp); context.SaveChanges(); } pasteJsTreeNodes(nodeCopy, maxID1); }
// аутентификация public bool Authenticate(string username, string password) { var crypto = new SimpleCrypto.PBKDF2(); bool isValid = false; // тип объекта var objType = context.ObjectTypes.FirstOrDefault(t => t.Name == "User").Id; // ищем пользователя по логину var user = context.Objects.FirstOrDefault(u => u.Name == username && u.Type == objType); if (user != null) { // экземпляр объекта User для десереализации JSON User u = new User(); // находим серелизованную строку свойтсв пользователя var q = context.Properties.FirstOrDefault(i => i.PropId == (context.PropTypes.FirstOrDefault(j => j.Name == "JSON obj").Id) && i.ObjectId == user.Id); // десерелизуем свойства пользователя var props = json.Deserialize(q.Value, u.GetType()); // наполняем объект свойствами u = (User)props; // проверяем пароль if (u.Password == crypto.Compute(password, u.PasswordSalt)) { // если пользователь активен, то доступ в систему разрешен if (u.IsActive == 1) { // записываем время последнего входа u.LastLogin = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // серелизация User для обновления времени послед. входа q.Value = json.Serialize(u); // сохраняем изменения context.SaveChanges(); } isValid = true; } else { isValid = false; } } else { isValid = false; } return(isValid); }
public int addNode(string newNodeName, int newNodeType, int idNodeToAdd) { var nodeType = 0; int OPCId = 0; string jsonPropEnd = ""; switch (newNodeType) { //OPC-сервер case 1: jsonPropEnd = ",\"Type\":\"\",\"Connection\":\"\",\"Connect\":false}"; nodeType = 1; break; //Тег case 2: string ConnString = getConnectionProp(idNodeToAdd, out OPCId).Trim('/'); jsonPropEnd = ",\"Opc\":" + OPCId + ",\"Connection\":\"" + ConnString + "\",\"Description\":null"; jsonPropEnd += ",\"ControllerType\":0,\"RealType\":0,\"Register\":\"\",\"AccessType\":0"; jsonPropEnd += ",\"Order\":1,\"InMin\":0,\"InMax\":1,\"OutMin\":1,\"OutMax\":1,\"IsSpecialTag\":null,\"History_IsPermit\":false,\"RegPeriod\":0,\"Deadbend\":0.1,\"UpdateAnyway\":false"; jsonPropEnd += ",\"Alarms\":{\"Permit\":false,\"Enabled\":false,\"Sound\":false,\"HiHiText\":null,\"HiText\":null,\"NormalText\":null,\"LoText\":null,\"LoLoText\":null"; jsonPropEnd += ",\"HiHiSeverity\":null,\"HiSeverity\":null,\"LoSeverity\":null,\"LoLoSeverity\":null}"; jsonPropEnd += ",\"Events\":{\"Enabled\":false,\"EventMessages\":[]}}"; nodeType = 2; break; //Контроллер case 5: jsonPropEnd = ",\"Address\":0,\"Driver\":\"\",\"RetrCount\":0,\"ParentGroup\":" + idNodeToAdd + ",\"PrimaryChannel\":0,\"SecondaryChannel\":0,\"PgPause\":0}"; nodeType = 5; break; //GPRS канал case 17: jsonPropEnd = ",\"ChannelType\":\"Tcp\",\"InterPollPause\":0,\"MaxErrorsToSwitchChannel\":3,\"MaxErrorsToBadQuality\":3,\"TimeTryGoBackToPrimary\":300,\"IpAddress\":\"127.0.0.1\",\"Port\":80,\"WriteTimeout\":2000,\"ReadTimeout\":2000}"; nodeType = 17; break; //Радио канал case 18: jsonPropEnd = ",\"ChannelType\":\"Serial\",\"InterPollPause\":0,\"MaxErrorsToSwitchChannel\":3,\"MaxErrorsToBadQuality\":3,\"TimeTryGoBackToPrimary\":300,\"PortName\":\"COM1\",\"BaudRate\":115200,\"Parity\":0,\"StopBits\":1,\"WriteTimeout\":2000,\"ReadTimeout\":2000}"; nodeType = 18; break; //Папка case 21: jsonPropEnd = ""; nodeType = 21; break; //PollingGroup case 22: jsonPropEnd = ",\"Start\":0,\"Count\":0,\"Function\":0,\"UserData\":null}"; nodeType = 22; break; } Objects newNode = new Objects { ParentId = idNodeToAdd, Type = nodeType, Name = newNodeName }; context.Objects.Add(newNode); context.SaveChanges(); //найдем ID узла, добавленного в таблицу Objects var newNodeId = newNode.Id; string jsonPropBegin = "{\"Id\":" + newNodeId + ",\"Name\":\"" + newNodeName + "\""; Property newNodeProps; //Если тип добавляемого узла - папка, то в таблице Properties строка с величиной будет пустая if (newNodeType == 21) { newNodeProps = new Property { ObjectId = newNodeId, PropId = 0, Value = "" }; } else { newNodeProps = new Property { ObjectId = newNodeId, PropId = 0, Value = jsonPropBegin + jsonPropEnd }; } context.Properties.Add(newNodeProps); context.SaveChanges(); return newNodeId; }