internal ApplyConfigurationResult ApplyModuleConfiguration <TModule, TConfiguration>(TConfiguration configuration, ModuleConfigurationManipulator <TModule> moduleConfigurationManipulator, TModule module) where TModule : ModuleCore <TModule> where TConfiguration : ModuleConfiguration <TModule>, new() { if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } var context = AppCore.GetUserContextManager().GetCurrentUserContext(); var permissionCheck = module.CheckPermission(context, ModulesConstants.PermissionSaveConfiguration); if (permissionCheck == CheckPermissionVariant.Denied) { return(ApplyConfigurationResult.PermissionDenied); } var moduleType = typeof(TModule); var moduleCoreAttribute = moduleType.GetCustomAttribute <ModuleCoreAttribute>(); var urlNameEncoded = System.Web.HttpUtility.UrlEncode(configuration.UrlName); configuration.UrlName = urlNameEncoded; using (var db = new CoreContext()) using (var scope = db.CreateScope()) { var moduleConfig = db.Module.FirstOrDefault(x => x.IdModule == module.ID); if (moduleConfig == null) { var fullName = Utils.TypeNameHelper.GetFullNameCleared(typeof(TModule)); moduleConfig = db.Module.FirstOrDefault(x => x.UniqueKey == fullName); if (moduleConfig == null) { moduleConfig = new ModuleConfig() { UniqueKey = fullName, DateChange = DateTime.Now, IdUserChange = 0 }; db.Module.Add(moduleConfig); } } moduleConfig.Configuration = configuration._valuesProvider.Save(); moduleConfig.DateChange = DateTime.Now; moduleConfig.IdUserChange = context.IdUser; db.SaveChanges(); scope.Complete(); module.ID = moduleConfig.IdModule; module._moduleUrlName = string.IsNullOrEmpty(configuration.UrlName) ? moduleCoreAttribute.DefaultUrlName : configuration.UrlName; moduleConfigurationManipulator._valuesProviderUsable.Load(moduleConfig.Configuration); } return(ApplyConfigurationResult.Success); }
public virtual JsonResult RolesDelegateSave([Bind(Prefix = "Roles")] Dictionary <int, List <int> > model = null) { var result = JsonAnswer(); try { using (var db = new CoreContext()) using (var scope = db.CreateScope()) { var hiddenRoleList = db.Role.Where(x => x.IsHidden).Select(x => x.IdRole).ToList(); var hiddenRoleUserQuery = from role in db.Role join roleUser in db.RoleUser on role.IdRole equals roleUser.IdRole where role.IsHidden select roleUser; var hiddenRoleUserList = hiddenRoleUserQuery.ToList(); db.RoleUser.RemoveRange(db.RoleUser); var saveList = hiddenRoleUserList.Select(x => new RoleUser() { IdRole = x.IdRole, IdUser = x.IdUser, IdUserChange = x.IdUserChange, DateChange = x.DateChange }).ToList(); if (model != null) { foreach (var user in model) { user.Value?. Where(x => !hiddenRoleList.Contains(x)). ForEach(x => saveList.Add(new RoleUser() { IdRole = x, IdUser = user.Key, IdUserChange = AppCore.GetUserContextManager().GetCurrentUserContext().IdUser, DateChange = DateTime.Now.Timestamp() })); } } db.RoleUser.AddRange(saveList.ToArray()); db.SaveChanges(); scope.Complete(); result.Success = true; result.Message = "Права сохранены"; } } catch (Exception ex) { result.FromException(ex); } return(ReturnJson(result)); }
public ExecutionPermissionsResult GetPermissions(int idUser) { try { using (var db = new CoreContext()) using (var scope = db.CreateScope(TransactionScopeOption.Suppress)) { var idRoleUser = AppCore.AppConfig.RoleUser; var idRoleGuest = AppCore.AppConfig.RoleGuest; var perms2 = (from p in db.RolePermission join ru in db.RoleUser on p.IdRole equals ru.IdRole into gj from subru in gj.DefaultIfEmpty() where (subru.IdUser == idUser) || (idUser > 0 && p.IdRole == idRoleUser) || (idUser == 0 && p.IdRole == idRoleGuest) select new { p.IdModule, p.Permission }); var perms = new Dictionary <Guid, List <Guid> >(); foreach (var res in perms2) { if (!string.IsNullOrEmpty(res.Permission)) { var guidModule = GuidIdentifierGenerator.GenerateGuid(GuidType.Module, res.IdModule); if (!perms.ContainsKey(guidModule)) { perms.Add(guidModule, new List <Guid>()); } var guidPermission = res.Permission.GenerateGuid(); if (!perms[guidModule].Contains(guidPermission)) { perms[guidModule].Add(guidPermission); } // Временное двойное распознавание разрешения через строку и потенциальный гуид. if (Guid.TryParse(res.Permission, out var guidPermissionTemp) && !perms[guidModule].Contains(guidPermissionTemp)) { perms[guidModule].Add(guidPermissionTemp); } } } return(new ExecutionPermissionsResult(true, null, new UserPermissions(perms))); } } catch (Exception ex) { this.RegisterEvent(EventType.Error, "Ошибка при получении разрешений для пользователя.", $"IdUser={idUser}.", null, ex); return(new ExecutionPermissionsResult(false, "Ошибка при получении разрешений для пользователя.")); } }
public NotFound AddRoleUsers(int idRole, IEnumerable <int> userIdList) { try { using (var db = new CoreContext()) using (var scope = db.CreateScope(TransactionScopeOption.Required)) { if (db.Role.Where(x => x.IdRole == idRole).Count() == 0) { return(NotFound.NotFound); } var context = AppCore.GetUserContextManager().GetCurrentUserContext(); var IdUserChange = context.IdUser; var userIdList2 = userIdList.Distinct().ToArray(); var query = db.Users.In(userIdList2, x => x.IdUser); var usersToRole = query.ToList().Select(x => new RoleUser() { IdRole = idRole, IdUser = x.IdUser, IdUserChange = IdUserChange, DateChange = DateTime.Now.Timestamp() }).ToList(); if (usersToRole.Count > 0) { db.RoleUser. UpsertRange(usersToRole). On(x => new { x.IdUser, x.IdRole }). WhenMatched((xDb, xIns) => new RoleUser() { IdUserChange = xIns.IdUserChange, DateChange = xIns.DateChange }). Run(); } db.SaveChanges(); scope.Complete(); } return(NotFound.Success); } catch (Exception ex) { this.RegisterEvent(EventType.Error, "Ошибка при регистрации роли для списка пользователей.", $"Идентификатор роли: {idRole}\r\nИдентификаторы пользователей: {(userIdList?.Any() == true ? "не задано" : string.Join(", ", userIdList))}", ex); return(NotFound.Error); } }
public NotFound SetRoleUsers(int idRole, IEnumerable <int> userIdList) { try { using (var db = new CoreContext()) using (var scope = db.CreateScope(TransactionScopeOption.Required)) { if (db.Role.Where(x => x.IdRole == idRole).Count() == 0) { return(NotFound.NotFound); } var userIdList2 = userIdList?.Distinct()?.ToArray(); if (userIdList2?.Any() == true) { var query = db.RoleUser.Where(x => x.IdRole == idRole).NotIn(userIdList2, x => x.IdUser); db.RoleUser.RemoveRange(query); var context = AppCore.GetUserContextManager().GetCurrentUserContext(); var IdUserChange = context.IdUser; var usersInRole = db.RoleUser.Where(x => x.IdRole == idRole).Select(x => x.IdUser).ToList(); userIdList2.Where(x => !usersInRole.Contains(x)).ToList().ForEach(IdUser => { db.RoleUser.Add(new RoleUser() { IdRole = idRole, IdUser = IdUser, IdUserChange = IdUserChange, DateChange = DateTime.Now.Timestamp() }); }); } else { db.RoleUser.RemoveRange(db.RoleUser.Where(x => x.IdRole == idRole)); } db.SaveChanges(); scope.Complete(); } return(NotFound.Success); } catch (Exception ex) { this.RegisterEvent(EventType.Error, "Ошибка при замене пользователей роли.", $"Идентификатор роли: {idRole}\r\nИдентификаторы пользователей: {(userIdList?.Any() == true ? "не задано" : string.Join(", ", userIdList))}", ex); return(NotFound.Error); } }
public UserContextCreateResult CreateUserContext(int idUser, out IUserContext userContext) { userContext = null; if (idUser == GetSystemUserContext().IdUser) { return(UserContextCreateResult.NotFound); } using (var db = new CoreContext()) using (var scope = db.CreateScope(TransactionScopeOption.RequiresNew)) { try { var res = db.Users.Where(x => x.IdUser == idUser).FirstOrDefault(); if (res == null) { return(UserContextCreateResult.NotFound); } var context = new UserContext(res, true); ((IComponentStartable)context).Start(AppCore); var permissionsResult = GetPermissions(context.IdUser); if (!permissionsResult.IsSuccess) { return(UserContextCreateResult.ErrorReadingPermissions); } context.ApplyPermissions(permissionsResult.Result); userContext = context; return(UserContextCreateResult.Success); } catch (Exception ex) { this.RegisterEvent(EventType.CriticalError, "Неизвестная ошибка во время создания контекста пользователя.", $"IdUser={idUser}'.", null, ex); userContext = null; return(UserContextCreateResult.ErrorUnknown); } finally { scope.Complete(); } } }
public NotFound RemoveRoleUsers(int idRole, IEnumerable <int> userIdList) { try { using (var db = new CoreContext()) using (var scope = db.CreateScope(TransactionScopeOption.Required)) { if (db.Role.Where(x => x.IdRole == idRole).Count() == 0) { return(NotFound.NotFound); } var userIdList2 = userIdList?.Distinct()?.ToArray(); if (userIdList2?.Any() == true) { var query = db.RoleUser.Where(x => x.IdRole == idRole).In(userIdList2, x => x.IdUser); db.RoleUser.RemoveRange(query); } else { db.RoleUser.RemoveRange(db.RoleUser.Where(x => x.IdRole == idRole)); } db.SaveChanges(); scope.Complete(); } return(NotFound.Success); } catch (Exception ex) { this.RegisterEvent(EventType.Error, "Ошибка при удалении роли у пользователей.", $"Идентификатор роли: {idRole}\r\nИдентификаторы пользователей: {(userIdList?.Any() == true ? "не задано" : string.Join(", ", userIdList))}", ex); return(NotFound.Error); } }
public ResultWData <User> RegisterUser(Model.PreparedForRegister data) { var answer = new ResultWData <User>(); try { using (var db = new CoreContext()) { var hasEmail = false; var hasPhone = false; var validationResult = ValidateModel(data); if (!validationResult.ContainsKey(nameof(data.email)) && !string.IsNullOrEmpty(data.email)) { data.email = data.email.ToLower(); hasEmail = true; if (db.Users.Where(x => x.email == data.email).Count() > 0) { validationResult.AddModelError(nameof(data.email), "Пользователь с таким адресом электронной почты уже существует!"); } } if (!validationResult.ContainsKey(nameof(data.phone)) && !string.IsNullOrEmpty(data.phone)) { hasPhone = true; if (db.Users.Where(x => x.phone == data.phone).Count() > 0) { validationResult.AddModelError(nameof(data.phone), "Пользователь с таким номером телефона уже существует!"); } } if (validationResult.IsValid) { var salt = StringsHelper.GenerateRandomString("abcdefghijklmnoprstuvxyzABCDEFGHIKLMNOPRSTUVXYZ0123456789", 5); var stateConfirmation = DateTime.Now.Ticks.ToString().MD5(); var regMode = AppCore.WebConfig.register_mode; if (data.State.HasValue) { switch (data.State) { case Core.Db.UserState.Active: regMode = RegisterMode.Immediately; break; case Core.Db.UserState.RegisterWaitForModerate: regMode = RegisterMode.ManualCheck; break; case Core.Db.UserState.RegisterNeedConfirmation: regMode = RegisterMode.SelfConfirmation; break; default: throw new Exception("При регистрации пользователя нельзя указывать данное состояние учетной записи."); } } else { switch (regMode) { case RegisterMode.Immediately: data.State = Core.Db.UserState.Active; break; case RegisterMode.SelfConfirmation: data.State = Core.Db.UserState.RegisterNeedConfirmation; break; case RegisterMode.ManualCheck: data.State = Core.Db.UserState.RegisterWaitForModerate; break; } } var CommentAdmin = ""; var query = new User() { password = UsersExtensions.hashPassword(data.password), salt = salt, email = data.email?.ToLower(), State = data.State.Value, CommentAdmin = CommentAdmin, name = !string.IsNullOrEmpty(data.name) ? data.name : "", phone = data.phone, about = data.about, Comment = data.Comment, UniqueKey = data.UniqueKey, //DateReg = data.DateReg.Timestamp(), // todo добавить запись о регистрации в журнал регистраций Superuser = data.Superuser, StateConfirmation = regMode == RegisterMode.SelfConfirmation ? stateConfirmation : string.Empty, }; query.Fields.CopyValuesFrom(data.Fields); using (var scope = db.CreateScope()) { db.Users.Add(query); db.SaveChanges(); var credentitals = string.Join(" или ", new string[] { hasEmail ? "адрес электронной почты" : string.Empty, hasPhone ? "номер телефона" : string.Empty }.Where(x => !string.IsNullOrEmpty(x))); if (regMode == RegisterMode.Immediately) { if (hasEmail) { AppCore.Get <EmailService>().SendMailFromSite( data.name, data.email, "Регистрация на сайте", WebUtils.RazorRenderHelper.RenderView(this, "RegisterNotificationEmailImmediately.cshtml", query), ContentType.Html ); } if (hasPhone) { AppCore.Get <MessagingSMS.SMSService>()?.SendMessage(data.phone, "Регистрация на сайте прошла успешно."); } answer.FromSuccess($"Вы успешно зарегистрировались на сайте и можете зайти, используя {credentitals}."); } else if (regMode == RegisterMode.SelfConfirmation) { if (hasEmail) { AppCore.Get <EmailService>().SendMailFromSite( data.name, data.email, "Регистрация на сайте", WebUtils.RazorRenderHelper.RenderView(this, "RegisterNotificationEmailConfirm.cshtml", new Model.RegisterNotificationConfirm() { Data = query, ConfirmationCode = query.StateConfirmation }), ContentType.Html ); } answer.FromSuccess("Вы успешно зарегистрировались на сайте. В течение определенного времени на Ваш электронный адрес, указанный при регистрации, придет письмо с указаниями по дальнейшим действиям, необходимым для завершения регистрации."); } else if (regMode == RegisterMode.ManualCheck) { if (hasEmail) { AppCore.Get <EmailService>().SendMailFromSite( data.name, data.email, "Регистрация на сайте", WebUtils.RazorRenderHelper.RenderView(this, "RegisterNotificationEmailModerate.cshtml", query), ContentType.Html ); } answer.FromSuccess($"Заявка на регистрацию отправлена. Администратор рассмотрит Вашу заявку и примет решение, после чего Вы получите уведомление на указанный {credentitals}."); var usersToNotify = AppCore.Get <ModuleUsersManagement>().GetUsersByRolePermission <ModuleUsersManagement>(ModuleUsersManagement.PermissionReceiveRegisterModeratorNotifications); if (usersToNotify.Count > 0) { var mailAdmin = WebUtils.RazorRenderHelper.RenderView(this, "RegisterNotificationEmailAdmin.cshtml", query); usersToNotify. Where(x => !string.IsNullOrEmpty(x.email)). ForEach(x => AppCore.Get <EmailService>().SendMailFromSite(x.email, x.email, "Новая заявка на регистрацию", mailAdmin, ContentType.Html)); } } answer.Data = query; if (answer.Success) { scope.Complete(); } } } else { var errorMessages = new System.Collections.ObjectModel.Collection <string>(); validationResult.ForEach(x => x.Value.Errors.ForEach(error => errorMessages.Add(error.ErrorMessage))); answer.FromFail("Возникли ошибки во время проверки данных:\r\n - " + string.Join(";\r\n - ", errorMessages) + "."); } } } catch (ValidationException ex) { Debug.Logs("RegisterUser1: {0}", ex.CreateComplexMessage()); answer.FromFail(ex.CreateComplexMessage()); } catch (HandledException ex) { Debug.Logs("RegisterUser2: {0}", ex.Message); this.RegisterEvent(EventType.Warning, "Регистрация пользователя", "Данные: " + Newtonsoft.Json.JsonConvert.SerializeObject(data), ex); answer.FromFail("Регистрация прервана из-за ошибки: " + ex.Message); } catch (Exception ex) { Debug.Logs("RegisterUser2: {0}", ex.Message); this.RegisterEvent(EventType.Error, "Регистрация пользователя - необработанная ошибка", "Данные: " + Newtonsoft.Json.JsonConvert.SerializeObject(data), ex); answer.FromFail("Регистрация прервана из-за непредвиденной ошибки"); } return(answer); }
public ActionResult profileSave([Bind(Prefix = nameof(Design.Model.Profile.Edit))] Model.ProfileEdit model) { var answer = JsonAnswer <User>(); var prefix = nameof(Design.Model.Profile.Edit) + "."; try { //if (!this.IsReCaptchaValid && !AppCore.GetUserContextManager().GetCurrentUserContext().IsSuperuser) ModelState.AddModelError("ReCaptcha", "Вы точно не робот?"); if (model == null) { throw new Exception("Нет переданных данных."); } using (var db = new CoreContext()) using (var scope = db.CreateScope()) { var data = db.Users.Where(x => x.IdUser == model.IdUser).FirstOrDefault(); if (data == null) { throw new Exception("Указанный пользователь не найден."); } else { Module.CheckPermissionToEditOtherUser(model.ID); } if (ModelState.IsValid) { if (ModelState.Keys.Contains(prefix + nameof(model.email))) { model.email = model.email?.ToLower(); data.email = data.email?.ToLower(); if (data.email != model.email) { var others = db.Users.AsNoTracking().Where(x => x.email.ToLower() == model.email && x.IdUser != data.IdUser).Count(); if (others > 0) { ModelState.AddModelError(prefix + nameof(model.email), "Такой email-адрес уже используется!"); } else { data.email = model.email; } } } if (ModelState.Keys.Contains(prefix + nameof(model.phone))) { model.phone = model.phone?.ToLower(); data.phone = data.phone?.ToLower(); if (data.phone != model.phone) { if (string.IsNullOrEmpty(model.phone)) { model.phone = null; } else { var others = db.Users.AsNoTracking().Where(x => x.phone.ToLower() == model.phone && x.IdUser != data.IdUser).Count(); if (others > 0) { ModelState.AddModelError(prefix + nameof(model.phone), "Такой номер телефона уже используется!"); } else { var phone = PhoneBuilder.ParseString(model.phone); if (!phone.IsCorrect) { ModelState.AddModelError(prefix + nameof(model.phone), phone.Error); } else { data.phone = phone.ParsedPhoneNumber; } } } } } } if (ModelState.IsValid) { if (ModelState.Keys.Contains(prefix + nameof(model.name))) { data.name = model.name; } if (ModelState.Keys.Contains(prefix + nameof(model.IdPhoto))) { if (model.IdPhoto.HasValue) { AppCore.Get <FileManager>().UpdateExpiration(model.IdPhoto.Value, null); } data.IdPhoto = model.IdPhoto; } if (ModelState.Keys.Contains(prefix + nameof(model.Comment))) { data.Comment = model.Comment; } data.Fields.CopyValuesFrom(model.Fields, fdata => ModelState.Keys.Contains(prefix + "Fields.fieldValue_" + fdata.IdField)); data.DateChange = DateTime.Now.Timestamp(); db.SaveChanges(); scope.Complete(); answer.Data = data; answer.FromSuccess("Сохранение данных прошло успешно!"); } } } catch (Exception ex) { Debug.WriteLine("ProfileSave: {0}", ex); answer.FromException(ex); } return(ReturnJson(answer)); }