Ejemplo n.º 1
0
        // обновление всех ролей
        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);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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++;
                }
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        // аутентификация
        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);
        }
Ejemplo n.º 6
0
        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;
        }