コード例 #1
0
ファイル: Modules.cs プロジェクト: Sellec/OnWeb
 public Module(IModuleCore module)
 {
     Id = module.IdModule;
     Caption = module.Caption;
     Type = module.QueryType.FullName;
     UniqueName = module.UniqueName.ToString();
     UrlName = module.UrlName;
     IsConfigAllowed = module.ControllerAdmin() != null;
 }
コード例 #2
0
        /// <summary>
        /// См. <see cref="CheckPermissions(IModuleCore, RouteValueDictionary)"/>.
        /// </summary>
        public override bool CheckPermissions(IModuleCore module, RouteValueDictionary routeValues)
        {
            //Проверка доступа к саму панель управления. Нет прав на модуле "Admin".
            var moduleAdmin = AppCore.GetModulesManager().GetModule <Modules.Admin.ModuleAdmin>();

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

            return(true);
        }
コード例 #3
0
ファイル: Extensions.cs プロジェクト: Sellec/OnWeb
        public static NestedLinkCollection GetAdminMenuItems(this IModuleCore module)
        {
            var list = new NestedLinkCollection();

            var itemsInternal = (module as AdminForModules.Menu.IMenuProvider)?.GetModuleAdminMenuLinks();

            if (itemsInternal != null)
            {
                list.AddRange(itemsInternal);
            }

            try
            {
                if (module.ControllerAdmin() != null)
                {
                    var moduleAdmin = module.GetAppCore().Get <Admin.ModuleAdmin>();
                    var methods     = module.ControllerAdmin().GetMethods();
                    foreach (var method in methods)
                    {
                        var attr = method.GetCustomAttributes <AdminForModules.Menu.MenuActionAttribute>(true).FirstOrDefault();
                        if (attr != null)
                        {
                            var values = new RouteValueDictionary();
                            values.Add("controller", module.UrlName);
                            values.Add("action", string.IsNullOrEmpty(attr.Alias) ? method.Name : attr.Alias);

                            var link = new NestedLinkSimple(attr.Caption, new Uri($"/{moduleAdmin.UrlName}/mnadmin/{module.UrlName}/{(string.IsNullOrEmpty(attr.Alias) ? method.Name : attr.Alias)}", UriKind.Relative));
                            list.Add(link);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                throw ex;
            }

            return(list);
        }
コード例 #4
0
        private IController CreateController(ControllerType controllerType, IModuleCore module, RouteValueDictionary routeValues)
        {
            var controllerTypes = AppCore.Get <ModuleControllerTypesManager>().GetModuleControllerTypes(module.QueryType);
            var targetType      = controllerTypes.GetValueOrDefault(controllerType.ControllerTypeID);

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

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

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

            return(null);
        }
コード例 #5
0
        public IController CreateController(RequestContext requestContext, string moduleName)
        {
            requestContext.HttpContext.Items["TimeController"] = DateTime.Now;

            var isAjax = false;

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

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

            IModuleCore module = null;

            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 = (IModuleCore)AppCore.GetModulesManager().GetModule(moduleId);
                }
                else if (Guid.TryParse(moduleName, out Guid uniqueName) && uniqueName.ToString() == moduleName)
                {
                    module = (IModuleCore)AppCore.GetModulesManager().GetModule(uniqueName);
                }
                else
                {
                    module = (IModuleCore)AppCore.GetModulesManager().GetModule(moduleName);
                }

                if (module == null)
                {
                    throw new 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)
                    {
                        var moduleTmp = new ModuleInternalErrors();
                        ((IComponentStartable)moduleTmp).Start(AppCore);
                        module = moduleTmp;
                    }

                    var type       = typeof(ModuleControllerInternalErrors <>).MakeGenericType(module.GetType());
                    var controller = CreateController(module, type, requestContext.RouteData.Values);
                    (controller as 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;
                }
            }
        }
コード例 #6
0
        private IController CreateController(IModuleCore module, Type controllerType, RouteValueDictionary routeValues)
        {
            var controller = (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(ModuleActionAttribute), true);
                    if (attrs != null && attrs.Length > 0)
                    {
                        var attr = attrs.First() as 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);
        }
コード例 #7
0
ファイル: ModuleStandard.cs プロジェクト: Sellec/OnWeb
        public static NestedLinkSimple RelativeToModule(string url, string caption, IModuleCore module)
        {
            var moduleAdmin = module.GetAppCore().Get <Admin.ModuleAdmin>();

            return(new NestedLinkSimple(caption, new Uri($"/{moduleAdmin.UrlName}/mnadmin/{module.UrlName}/{url}", UriKind.Relative)));
        }
コード例 #8
0
ファイル: Extensions.cs プロジェクト: Sellec/OnWeb
 public static Type ControllerAdmin(this IModuleCore module)
 {
     return(module.GetAppCore().Get <ModuleControllerTypesManager>().GetModuleControllerTypes(module.QueryType).GetValueOrDefault(ControllerTypeAdmin.TypeID));
 }
コード例 #9
0
 public override bool CheckPermissions(IModuleCore module, RouteValueDictionary routeValues)
 {
     return(true);
 }
コード例 #10
0
 public override string ErrorCannotFindControllerTypeSpecified(IModuleCore module, RouteValueDictionary routeValues)
 {
     return(string.Format("Модуль '{0}' не предоставляет доступ в пользовательскую часть.", module.Caption));
 }
コード例 #11
0
 /// <summary>
 /// Проверяет, доступен ли вход в указанный тип контроллера для модуля <paramref name="module"/> для запроса со значениями <paramref name="routeValues"/>.
 /// </summary>
 public abstract bool CheckPermissions(IModuleCore module, RouteValueDictionary routeValues);
コード例 #12
0
 /// <summary>
 /// Возвращает ошибку, когда тип контроллера для модуля <paramref name="module"/> для запроса со значениями <paramref name="routeValues"/> не был найден.
 /// </summary>
 public abstract string ErrorCannotFindControllerTypeSpecified(IModuleCore module, RouteValueDictionary routeValues);