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())); }
/// <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); }
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); } }
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); }
public ExtensionCustomsFieldsAdmin(ModuleCore moduleObject) : base(moduleObject) { }
/// <summary> /// См. <see cref="ControllerType.ErrorCannotFindControllerTypeSpecified(ModuleCore, RouteValueDictionary)"/>. /// </summary> public override string ErrorCannotFindControllerTypeSpecified(ModuleCore module, RouteValueDictionary routeValues) { return(string.Format("Модуль '{0}' не предоставляет доступ в панель управления.", module.Caption)); }
/// <summary> /// Проверяет, доступен ли вход в указанный тип контроллера для модуля <paramref name="module"/> для запроса со значениями <paramref name="routeValues"/>. /// </summary> public abstract bool CheckPermissions(ModuleCore module, RouteValueDictionary routeValues);
/// <summary> /// Возвращает ошибку, когда тип контроллера для модуля <paramref name="module"/> для запроса со значениями <paramref name="routeValues"/> не был найден. /// </summary> public abstract string ErrorCannotFindControllerTypeSpecified(ModuleCore module, RouteValueDictionary routeValues);
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; } } }
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); }
/// <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(); }
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, "Возникла ошибка во время регистрации адресов.")); } }
public override bool CheckPermissions(ModuleCore module, RouteValueDictionary routeValues) { return(true); }
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); } }