Beispiel #1
0
 public ExecutionResult Register <TModuleType>(ModuleCore <TModuleType> module, int IdItem, int IdItemType, string action, IEnumerable <ActionArgument> Arguments, string Url, string UniqueKey = null)
     where TModuleType : ModuleCore <TModuleType>
 {
     return(Register(module, new RegisterItem()
     {
         IdItem = IdItem,
         IdItemType = IdItemType,
         action = action,
         Arguments = new List <ActionArgument>(Arguments),
         Url = Url,
         UniqueKey = UniqueKey,
     }.ToEnumerable()));
 }
Beispiel #2
0
        /// <summary>
        /// См. <see cref="CheckPermissions(ModuleCore, RouteValueDictionary)"/>.
        /// </summary>
        public override bool CheckPermissions(ModuleCore module, RouteValueDictionary routeValues)
        {
            //Проверка доступа к саму панель управления. Нет прав на модуле "Admin".
            var moduleAdmin = AppCore.Get <ModulesManager <ApplicationCore> >().GetModule <Plugins.Admin.ModuleAdmin>();

            if (moduleAdmin != null)
            {
                if (moduleAdmin.CheckPermission(ModulesConstants.PermissionManage) != CheckPermissionResult.Allowed)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #3
0
        public void GetProcAddressMessageBoxW()
        {
            // Arrange
            const string moduleName   = "User32.dll";
            const string functionName = "MessageBoxW";

            // Act
            try
            {
                ModuleCore.GetProcAddress(moduleName, functionName);
            }
            // Assert
            catch (Win32Exception ex)
            {
                Assert.Fail(ex.Message);
            }
        }
Beispiel #4
0
        public void LoadFreeLibrary()
        {
            // Arrange
            var dllPath = Resources.LibraryTest;

            // Act
            var module = ModuleCore.LoadLibrary(dllPath);

            // Assert
            Assert.AreEqual(module.FileName, dllPath, "The module cannot be loaded correctly.");
            Assert.IsTrue(Resources.ProcessSelf.Modules.Cast <ProcessModule>().Any(m => m.FileName == dllPath), "The module cannot be found.");

            // Act 2
            ModuleCore.FreeLibrary(module);

            // Assert 2
            Assert.IsFalse(Resources.ProcessSelf.Modules.Cast <ProcessModule>().Any(m => m.FileName == dllPath), "The module cannot be freed.");
        }
        private IController CreateController(ControllerType controllerType, ModuleCore module, RouteValueDictionary routeValues)
        {
            var targetType = module.ControllerTypes.GetValueOrDefault(controllerType.ControllerTypeID);

            if (targetType == null)
            {
                throw new NotSupportedException(controllerType.ErrorCannotFindControllerTypeSpecified(module, routeValues));
            }

            if (!controllerType.CheckPermissions(module, routeValues))
            {
                throw new Core.Exceptions.ErrorCodeException(HttpStatusCode.Forbidden, "Отсутствует доступ.");
            }

            if (targetType != null)
            {
                return(CreateController(module, targetType, routeValues));
            }

            return(null);
        }
Beispiel #6
0
 public ExtensionCustomsFieldsAdmin(ModuleCore moduleObject)
     : base(moduleObject)
 {
 }
Beispiel #7
0
 /// <summary>
 /// См. <see cref="ControllerType.ErrorCannotFindControllerTypeSpecified(ModuleCore, RouteValueDictionary)"/>.
 /// </summary>
 public override string ErrorCannotFindControllerTypeSpecified(ModuleCore module, RouteValueDictionary routeValues)
 {
     return(string.Format("Модуль '{0}' не предоставляет доступ в панель управления.", module.Caption));
 }
Beispiel #8
0
 /// <summary>
 /// Проверяет, доступен ли вход в указанный тип контроллера для модуля <paramref name="module"/> для запроса со значениями <paramref name="routeValues"/>.
 /// </summary>
 public abstract bool CheckPermissions(ModuleCore module, RouteValueDictionary routeValues);
Beispiel #9
0
 /// <summary>
 /// Возвращает ошибку, когда тип контроллера для модуля <paramref name="module"/> для запроса со значениями <paramref name="routeValues"/> не был найден.
 /// </summary>
 public abstract string ErrorCannotFindControllerTypeSpecified(ModuleCore module, RouteValueDictionary routeValues);
Beispiel #10
0
        public IController CreateController(RequestContext requestContext, string moduleName)
        {
            requestContext.HttpContext.Items["TimeController"] = DateTime.Now;

            var        isAjax = false;
            ModuleCore module = null;

            // Проверка на авторизацию. Ловим случаи, когда авторизация не сработала в HttpApplication.
            var context = AppCore.GetUserContextManager().GetCurrentUserContext();

            if (context.IsGuest)
            {
                var moduleAuth = AppCore.Get <Plugins.Auth.ModuleAuth>();
                context = moduleAuth.RestoreUserContextFromRequest();
                if (context != null && !context.IsGuest)
                {
                    moduleAuth.RegisterEvent(EventType.CriticalError, "Нарушение процесса авторизации", null);
                    AppCore.GetUserContextManager().SetCurrentUserContext(context);
                }
            }

            try
            {
                /*
                 * Определение языка и темы
                 */
                {
                    var lang = string.Format("{0}", requestContext.RouteData.Values["language"]);

                    using (var db = this.CreateUnitOfWork())
                    {
                        var query = from Language in db.Language
                                    where Language.IsDefault != 0 || Language.ShortAlias == lang
                                    orderby(Language.ShortAlias == lang? 1 : 0) descending
                                    select Language;

                        var data = query.ToList();
                        //var sql = DB.DataContext.ExecuteQuery<DB.Language>(@"
                        //    SELECT TOP(1) *
                        //    FROM Language
                        //    WHERE IsDefault <> 0 OR ShortAlias = '" + DataManager.prepare(lang) + @"'
                        //    ORDER BY CASE WHEN ShortAlias = '" + DataManager.prepare(lang) + @"' THEN 1 ELSE 0 END DESC
                        //");
                        if (data.Count > 0)
                        {
                            var res = data.First();
                            requestContext.RouteData.Values["language"] = res.ShortAlias;
                        }
                    }
                }

                /*
                 * Ищем модуль, к которому обращаются запросом.
                 * */
                if (int.TryParse(moduleName, out int moduleId) && moduleId.ToString() == moduleName)
                {
                    module = AppCore.Get <ModulesManager <ApplicationCore> >().GetModule(moduleId);
                }
                else
                {
                    module = AppCore.Get <ModulesManager <ApplicationCore> >().GetModule(moduleName);
                }

                if (module == null)
                {
                    throw new Core.Exceptions.ErrorCodeException(HttpStatusCode.NotFound, $"Адрес '{moduleName}' не найден.");
                }

                /*
                 * Ищем контроллер, который относится к модулю.
                 * */
                var controllerType = ControllerTypeFactory.RoutingPrepareURL(requestContext.HttpContext.Request, UriExtensions.MakeRelativeFromUrl(requestContext.HttpContext.Request.Url.PathAndQuery));

                if (requestContext.RouteData.Route is Route)
                {
                    /*
                     * Анализируем адрес и устанавливаем признак, если это вызов в панель управления. Пришлось пойти на такой хак.
                     * */
                    var route = requestContext.RouteData.Route as Route;
                    if (route.Url.StartsWith("admin/madmin"))
                    {
                        isAjax = true;
                    }

                    if (isAjax)
                    {
                        HttpContext.Current.Items["isAjax"] = true;
                    }
                }

                var controller = CreateController(controllerType, module, requestContext.RouteData.Values);
                HttpContext.Current.Items["RequestContextController"] = controller;
                return(controller);
            }
            catch (Exception ex)
            {
                try
                {
                    if (module == null)
                    {
                        module = new Modules.Internal.ModuleInternalErrors();
                        module.Start(AppCore);
                    }

                    var type       = typeof(Modules.Internal.ModuleControllerInternalErrors <>).MakeGenericType(module.GetType());
                    var controller = CreateController(module, type, requestContext.RouteData.Values);
                    (controller as Modules.Internal.IModuleControllerInternalErrors).SetException(ex);
                    // todo (controller as Modules.ModuleController).IsAdminController = isErrorAdmin;

                    HttpContext.Current.Items["RequestContextController"] = controller;
                    return(controller);
                }
                catch (Exception ex2)
                {
                    Debug.WriteLine("Throw: {0}", ex2.ToString());
                    throw ex;
                }
            }
        }
Beispiel #11
0
        private IController CreateController(ModuleCore module, Type controllerType, RouteValueDictionary routeValues)
        {
            var controller = (Modules.ModuleControllerBase)DependencyResolver.Current.GetService(controllerType);

            if (controller == null)
            {
                throw new Exception($"Контроллер для модуля '{module.UrlName}' не найден.");
            }

            controller.Start(AppCore);

            var method = controller.GetType().GetMethod("InitController", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance);

            method.Invoke(controller, new object[] { module });

            var methods = controller.GetType().GetMethods();
            var action  = routeValues["action"].ToString();

            method = (from p in methods where p.Name.ToLower() == action.ToLower() select p).FirstOrDefault();
            if (method == null)
            {
                foreach (var mm in methods)
                {
                    var attrs = mm.GetCustomAttributes(typeof(Modules.ModuleActionAttribute), true);
                    if (attrs != null && attrs.Length > 0)
                    {
                        var attr = attrs.First() as Modules.ModuleActionAttribute;
                        if (attr.Alias == action)
                        {
                            routeValues["action"] = mm.Name;
                            method = mm;
                            break;
                        }
                    }
                }
            }

            if (method != null && routeValues["url"] != null)
            {
                var parameters = method.GetParameters();

                var url = routeValues["url"].ToString();
                // url = url.Truncate(0, url.IndexOf('?'));
                var parts = url.Split('/');
                if (parts.Length > 0)
                {
                    int idx = 0;
                    foreach (var param in parameters)
                    {
                        if (!routeValues.ContainsKey(param.Name))
                        {
                            routeValues[param.Name] = parts[idx];
                        }

                        idx++;
                        if (idx >= parts.Length)
                        {
                            break;
                        }
                    }
                }
            }

            return(controller);
        }
Beispiel #12
0
        /// <summary>
        /// Initialises the system core, registers modules, attaches event handlers, etc.
        /// </summary>
        public void Initialise()
        {
            moduleCore = new ModuleCore();
            moduleCore.RegisterModules();
            moduleCore.CheckDependencies();

            moduleCore.AttachEventHandlers();
            if (OnEventsAttached != null)
                OnEventsAttached();

            if (OnBeforeSystemInitialised != null)
                OnBeforeSystemInitialised();

            moduleCore.InitialiseModules();
            if (OnSystemInitialised != null)
                OnSystemInitialised();
        }
Beispiel #13
0
        public ExecutionResult Register <TModuleType>(ModuleCore <TModuleType> module, IEnumerable <RegisterItem> items)
            where TModuleType : ModuleCore <TModuleType>
        {
            try
            {
                //setError(null); //todo

                if (module == null)
                {
                    throw new ArgumentNullException(nameof(module));
                }
                if (items == null)
                {
                    throw new ArgumentNullException(nameof(items));
                }
                if (items.Count() == 0)
                {
                    throw new ArgumentOutOfRangeException(nameof(items), "Должен содержать хотя бы одно значение.");
                }

                items = items.Where(x => !string.IsNullOrEmpty(x.Url));
                items.ForEach(x =>
                {
                    if (string.IsNullOrEmpty(x.action))
                    {
                        throw new ArgumentNullException(nameof(x.action));
                    }
                    if (string.IsNullOrEmpty(x.Url))
                    {
                        throw new ArgumentNullException(nameof(x.Url));
                    }
                });

                if (items.Count() == 0)
                {
                    return(new ExecutionResult(true));
                }

                var groups = items.GroupBy(x => new { x.IdItem, x.IdItemType, x.action, x.UniqueKey }, x => x).Where(x => x.ToList().Count > 1).ToList();
                if (groups.Count > 0)
                {
                    var keys = groups.Select(x => $"(IdItem={x.Key.IdItem}, IdItemType={x.Key.IdItemType}, action={x.Key.action}, UniqueKey={x.Key.UniqueKey})");
                    throw new ArgumentException("Следующие ключи повторяются несколько раз: " + string.Join(", ", keys), nameof(items));
                }

                var idUser = AppCore.GetUserContextManager().GetCurrentUserContext().IdUser;

                var itemsToRegister = items.Select(x => new Db.Routing
                {
                    IdModule      = module.ID,
                    IdItem        = x.IdItem,
                    IdItemType    = x.IdItemType,
                    Action        = x.action,
                    Arguments     = Newtonsoft.Json.JsonConvert.SerializeObject(x.Arguments),
                    UrlFull       = "/" + x.Url.Trim('/').ToLower(),
                    UniqueKey     = string.IsNullOrEmpty(x.UniqueKey) ? null : x.UniqueKey,
                    DateChange    = DateTime.Now.Timestamp(),
                    IdUserChange  = idUser,
                    IdRoutingType = Db.RoutingType.Main,
                    IsFixedLength = true,
                }).ToList();

                int sql = 0;

                try
                {
                    using (var db = new DataContext())
                        using (var scope = db.CreateScope())
                        {
                            db.QueryTimeout = 2 * 60 * 1000;

                            sql = db.Routing.
                                  UpsertRange(itemsToRegister).
                                  On(x => new
                            {
                                x.UniqueKey,
                                x.IdModule,
                                x.IdItem,
                                x.IdItemType,
                                x.Action
                            }).WhenMatched((xDb, xIns) => new Routing()
                            {
                                UrlFull       = xIns.UrlFull,
                                Arguments     = xIns.Arguments,
                                DateChange    = xIns.DateChange,
                                IdRoutingType = xIns.IdRoutingType,
                                IsFixedLength = xIns.IsFixedLength
                            }).Run();
                            scope.Complete();
                        }
                    return(new ExecutionResult(true));
                }
                catch (Exception ex)
                {
                    if (ex.GetType().FullName == "System.Data.SqlClient.SqlException")
                    {
                        Debug.WriteLineNoLog($"UrlManager.register({System.Threading.Thread.CurrentThread.ManagedThreadId}) !! with {itemsToRegister.Count} at {DateTime.Now.ToString()} with {ex.Message}");
                    }

                    throw;
                }
            }

            catch (ArgumentNullException) { throw; }
            catch (ArgumentOutOfRangeException) { throw; }
            catch (ArgumentException) { throw; }
            catch (Exception ex)
            {
                this.RegisterEvent(
                    EventType.Error,
                    "register: ошибка при регистрации адресов.",
                    $"Модуль: {(module == null ? "не указан" : module.ID.ToString())}",
                    exception: ex
                    );
                return(new ExecutionResult(false, "Возникла ошибка во время регистрации адресов."));
            }
        }
Beispiel #14
0
 public override bool CheckPermissions(ModuleCore module, RouteValueDictionary routeValues)
 {
     return(true);
 }
Beispiel #15
0
        public bool SaveChildToParentRelations(ModuleCore module, int idItemType, IEnumerable <ChildToParentRelation> relationsList)
        {
            if (module == null)
            {
                throw new ArgumentNullException(nameof(module));
            }
            if (relationsList == null)
            {
                throw new ArgumentNullException(nameof(relationsList));
            }

            try
            {
                relationsList = relationsList.ToList();
                if (relationsList.Count() == 0)
                {
                    return(true);
                }

                var toBase = new List <ParentsInternal>();

                toBase.Add(new ParentsInternal()
                {
                    item   = 0,
                    type   = idItemType,
                    parent = 0,
                    level  = 0,
                });

                var levelMax = 100;
                foreach (var pair in relationsList)
                {
                    var level = 0;

                    toBase.Add(new ParentsInternal()
                    {
                        item   = pair.IdChild,
                        type   = idItemType,
                        parent = pair.IdChild,
                        level  = level++,
                    });

                    var s = pair.IdParent > 0 ? pair.IdParent : 0;

                    while (s > 0 || level <= levelMax)
                    {
                        toBase.Add(new ParentsInternal()
                        {
                            item   = pair.IdChild,
                            type   = idItemType,
                            parent = s,
                            level  = level++,
                        });

                        if (s == 0 || level == levelMax)
                        {
                            break;
                        }

                        //$s = 0;
                        //if (isset($items[$s]) && $items[$s] > 0) $s = $items[$s];
                        var s_ = relationsList.Where(x => x.IdChild == s).FirstOrDefault();
                        if (s_ != null)
                        {
                            s = s_.IdParent;
                        }
                        else if (s_ == null && s > 0)
                        {
                            break;
                        }
                        s = s > 0 ? s : 0;
                    }
                }

                using (var db = new DataContext())
                    using (var scope = db.CreateScope())
                    {
                        foreach (var item in toBase.GroupBy(x => $"{x.item}_{x.type}_{x.parent}", x => x).Select(x => x.First()))
                        {
                            db.ItemParent.Add(new Db.ItemParent()
                            {
                                IdModule     = module.IdModule,
                                IdItem       = item.item,
                                IdItemType   = item.type,
                                IdParentItem = item.parent,
                                IdLevel      = item.level
                            });
                        }

                        db.ExecuteQuery($"DELETE FROM ItemParent WHERE IdModule='{module.IdModule}' AND IdItemType='{idItemType}'");//" AND IdItem IN (".implode(', ', $ids).")");
                        if (toBase.Count > 0)
                        {
                            db.SaveChanges();
                            scope.Complete();
                        }
                    }
                return(true);
            }
            catch (Exception ex)
            {
                this.RegisterEvent(EventType.Error, "Не удалось сохранить список пар", $"Модуль: {module.GetType().FullName}\r\nСписок пар: {relationsList.Count()}\r\nТип сущностей: {idItemType}.", null, ex);
                return(false);
            }
        }