Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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, "Ошибка при получении разрешений для пользователя."));
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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();
                    }
                }
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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));
        }