Ejemplo n.º 1
0
        public ActionResult passwordChange2(Model.UserPasschange model)
        {
            var success = false;
            var result  = new List <string>();

            try
            {
                if (!ModelState.IsValid)
                {
                    result.AddRange(ModelState.Values.Where(y => y.Errors.Count > 0).
                                    SelectMany(x => x.Errors).Select(x => x.ErrorMessage).ToList());
                }

                var data_ = AppCore.GetUserContextManager().GetCurrentUserContext().GetData();

                if (result.Count == 0)
                {
                    if (!ModelState.Keys.Contains("passwordOld"))
                    {
                        result.Add("Не указан текущий пароль.");
                    }
                    else if (UsersExtensions.hashPassword(model.passwordOld) != data_.password)
                    {
                        result.Add("Неправильный пароль.");
                    }

                    if (!ModelState.Keys.Contains("passwordNew"))
                    {
                        result.Add("Не указан новый пароль.");
                    }
                }

                //todo сделать сохранение пароля.
                if (result.Count == 0)
                {
                    data_.password = UsersExtensions.hashPassword(model.passwordNew);
                    success        = true;
                }
            }
            catch (Exception ex)
            {
                result.Add(ex.Message);
                success = false;
            }

            return(this.ReturnJson(success, result.Count > 0 ? " - " + string.Join("\r\n - ", result) : ""));
        }
Ejemplo n.º 2
0
        public ResultWData <User> RegisterUser(Model.PreparedForRegister data)
        {
            var answer = new ResultWData <User>();

            try
            {
                using (var db = this.CreateUnitOfWork())
                {
                    var validationResult = ValidateModel(data);
                    if (!validationResult.ContainsKey(nameof(data.email)) && !string.IsNullOrEmpty(data.email))
                    {
                        data.email = data.email.ToLower();
                        if (db.Users.Where(x => x.email == data.email).Count() > 0)
                        {
                            validationResult.AddModelError(nameof(data.email), "Пользователь с таким Email-адресом уже существует!");
                        }
                    }
                    if (!validationResult.ContainsKey(nameof(data.phone)) && !string.IsNullOrEmpty(data.phone))
                    {
                        if (db.Users.Where(x => x.phone == data.phone).Count() > 0)
                        {
                            validationResult.AddModelError(nameof(data.phone), "Пользователь с таким номером телефона уже существует!");
                        }
                    }

                    if (validationResult.IsValid)
                    {
                        var symbols = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

                        var random = new Random();

                        var salt = new string(Enumerable.Repeat(symbols, 5).Select(s => s[random.Next(s.Length)]).ToArray());
                        var stateConfirmation = new string(Enumerable.Repeat(symbols, 32).Select(s => s[random.Next(s.Length)]).ToArray());

                        var regMode = AppCore.Config.register_mode;
                        if (data.State.HasValue)
                        {
                            switch (data.State.Value)
                            {
                            case UserState.Active:
                                regMode = Core.Types.RegisterMode.Immediately;
                                break;

                            case UserState.RegisterWaitForModerate:
                                regMode = Core.Types.RegisterMode.ManualCheck;
                                break;

                            case UserState.RegisterNeedConfirmation:
                                regMode = Core.Types.RegisterMode.SelfConfirmation;
                                break;

                            default:
                                throw new Exception("При регистрации пользователя нельзя указывать данное состояние учетной записи.");
                            }
                        }

                        var CommentAdmin = "";

                        var query = new User()
                        {
                            password          = UsersExtensions.hashPassword(data.password),
                            salt              = salt,
                            email             = data.email?.ToLower(),
                            State             = (UserState)(short)regMode,
                            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(),
                            IP_reg            = data.IP_reg,
                            Superuser         = data.Superuser,
                            StateConfirmation = regMode == Core.Types.RegisterMode.ManualCheck ? stateConfirmation : string.Empty,
                            //IP_reg = Request.ServerVariables["REMOTE_ADDR"]
                        };

                        query.Fields.CopyValuesFrom(data.Fields);

                        using (var scope = db.CreateScope())
                        {
                            db.Users.Add(query);
                            db.SaveChanges();

                            var id  = -1;
                            var can = false;

                            {
                                id = query.id;

                                //$exts = $this->getUserManager()->getExtensionsWithMethod('register');
                                //$added = array();
                                can = true;

                                //      foreach ($exts as $k =>$v)
                                //{
                                // $res = $v->register(array(
                                //              'login'         =>  data.login"],
                                //              'pass'          =>  data.password"],
                                //              'email'         =>  data.email"],

                                //          ));
                                //          if ($res) $added[$k] = $v;
                                // else
                                // {
                                //              foreach ( $added as $k2 =>$v2) if (method_exists($v2, 'userDelete')) $v2->userDelete(data.reg_login"]);
                                //  $can = false;
                                //              break;
                                //          }
                                //      }
                            }

                            if (can)
                            {
                                var new_id = id;// = DataManager.getInsertedID();
                                if (id > 0)
                                {
                                    if (regMode == Core.Types.RegisterMode.Immediately)
                                    {
                                        answer.FromSuccess("Вы успешно зарегистрировались на сайте и можете зайти, используя логин и пароль, указанные при регистрации.");
                                    }
                                    else if (regMode == Core.Types.RegisterMode.SelfConfirmation)
                                    {
                                        answer.FromSuccess("Вы успешно зарегистрировались на сайте. В течение определенного времени на Ваш электронный адрес, указанный при регистрации, придет письмо с указаниями по дальнейшим действиям, необходимым для завершения регистрации.");
                                    }
                                    else if (regMode == Core.Types.RegisterMode.ManualCheck)
                                    {
                                        answer.FromSuccess("Заявка на регистрацию отправлена. Администратор рассмотрит Вашу заявку и примет решение, после чего Вы получите уведомление на указанный адрес электронной почты.");
                                    }

                                    //this.assign("message", string.Join("\r\n - ", result.Values));
                                    //this.assign("login", data.email);

                                    //Module.DB.RoleUser.
                                    //    AddOrUpdate(new TraceWeb.DB.RoleUser()
                                    //    {
                                    //        IdRole = 1,
                                    //        IdUser = new_id,
                                    //        IdUserChange = 0,
                                    //        DateChange = DateTime.Now.Timestamp()
                                    //    });
                                    //Module.DB.SaveChanges();

                                    //if (regMode != 2)
                                    //    Messaging.Manager.Email.sendMailFromSite(
                                    //        data.email"],
                                    //        data.email"],
                                    //        "Регистрация на сайте",
                                    //        this.displayToVar("register_mail.cshtml")
                                    //    );

                                    //if (regMode == 2)
                                    //{
                                    //    this.assign("id", id);
                                    //    this.assign("login", data.email"]);
                                    //    this.assign("comment", data.comment"]);
                                    //    Messaging.Manager.Email.sendMailToAdmin("Новая заявка на регистрацию", this.displayToVar("register_mail_admin.cshtml"));
                                    //    Messaging.Manager.Email.sendMailSubscription(1, "Новая заявка на регистрацию", this.displayToVar("register_mail_admin.cshtml"));
                                    //    Messaging.Manager.Email.sendMailFromSite(data.email"], data.email"], "Регистрация на сайте", this.displayToVar("register_mail2.cshtml"));
                                    //}

                                    //success = "<br>";
                                    answer.Data = query;
                                }
                            }
                            else
                            {
                                answer.FromFail("Ошибка во время регистрации пользователя. Обратитесь к администратору сайта.");
                            }

                            if (answer.Success)
                            {
                                scope.Commit();
                            }
                        }
                    }
                    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 (EntityValidationException ex)
            {
                Debug.Logs("RegisterUser1: {0}", ex.CreateComplexMessage());
                answer.FromFail(ex.CreateComplexMessage());
            }
            catch (Exception ex)
            {
                Debug.Logs("RegisterUser2: {0}", ex.Message);
                answer.FromException(ex);
            }

            return(answer);
        }
Ejemplo n.º 3
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.º 4
0
        private ExecutionAuthResult CheckLogin(int idUser, string login, string password, DB.CoreContext db, out DB.User outData)
        {
            outData = null;

            try
            {
                if (idUser <= 0 && string.IsNullOrEmpty(login))
                {
                    return(new ExecutionAuthResult(eAuthResult.WrongAuthData, "Не указаны реквизиты для авторизации!"));
                }

                List <DB.User> query           = null;
                bool           directAuthorize = false;

                // Если в $user передан id и $password не передан вообще.
                if (idUser > 0)
                {
                    query           = db.Users.Where(x => x.IdUser == idUser).ToList();
                    directAuthorize = true;
                }

                // Если Email
                if (query == null && login.isEmail())
                {
                    switch (AppCore.WebConfig.userAuthorizeAllowed)
                    {
                    case eUserAuthorizeAllowed.Nothing:
                        return(new ExecutionAuthResult(eAuthResult.AuthDisabled, "Авторизация запрещена."));

                    case eUserAuthorizeAllowed.OnlyPhone:
                        return(new ExecutionAuthResult(eAuthResult.AuthMethodNotAllowed, "Авторизация возможна только по номеру телефона."));

                    case eUserAuthorizeAllowed.EmailAndPhone:
                        query = (from p in db.Users where string.Compare(p.email, login, true) == 0 select p).ToList();
                        break;

                    case eUserAuthorizeAllowed.OnlyEmail:
                        query = (from p in db.Users where string.Compare(p.email, login, true) == 0 select p).ToList();
                        break;
                    }
                }

                // Если номер телефона
                if (query == null)
                {
                    var phone = PhoneBuilder.ParseString(login);
                    if (phone.IsCorrect)
                    {
                        switch (AppCore.WebConfig.userAuthorizeAllowed)
                        {
                        case eUserAuthorizeAllowed.Nothing:
                            return(new ExecutionAuthResult(eAuthResult.AuthDisabled, "Авторизация запрещена."));

                        case eUserAuthorizeAllowed.OnlyEmail:
                            return(new ExecutionAuthResult(eAuthResult.AuthMethodNotAllowed, "Авторизация возможна только через электронную почту."));

                        case eUserAuthorizeAllowed.EmailAndPhone:
                            query = (from p in db.Users where string.Compare(p.phone, phone.ParsedPhoneNumber, true) == 0 select p).ToList();
                            break;

                        case eUserAuthorizeAllowed.OnlyPhone:
                            query = (from p in db.Users where string.Compare(p.phone, phone.ParsedPhoneNumber, true) == 0 select p).ToList();
                            break;
                        }
                    }
                    else
                    {
                        if (!login.isEmail())
                        {
                            return(new ExecutionAuthResult(eAuthResult.WrongAuthData, "Переданные данные не являются ни номером телефона, ни адресом электронной почты."));
                        }
                    }
                }

                if (query == null)
                {
                    return(new ExecutionAuthResult(eAuthResult.UnknownError, "Что-то пошло не так во время авторизации."));
                }

                if (query.Count == 1)
                {
                    var res = query.First();

                    if (directAuthorize || res.password == UsersExtensions.hashPassword(password))
                    {
                        outData = res;
                        return(new ExecutionAuthResult(eAuthResult.Success));
                    }
                    else
                    {
                        return(new ExecutionAuthResult(eAuthResult.WrongPassword, "Неверный пароль."));
                    }
                }
                else if (query.Count > 1)
                {
                    AppCore.Get <MessagingManager <WebApplication> >().GetCriticalMessagesReceivers().ForEach(x => x.SendToAdmin("Одинаковые реквизиты входа!", "Найдено несколько пользователей с логином '" + login + "'"));
                    return(new ExecutionAuthResult(eAuthResult.MultipleFound, "Найдено несколько пользователей с логином '" + login + "'. Обратитесь к администратору для решения проблемы."));
                }
                else
                {
                    return(new ExecutionAuthResult(eAuthResult.NothingFound, $"Пользователь '{login}' не найден в базе данных."));
                }
            }
            catch (Exception ex)
            {
                this.RegisterEvent(EventType.Error, "Ошибка во время поиска и проверки пользователя", $"IdUser={idUser}, Login='******'.", null, ex);
                return(new ExecutionAuthResult(eAuthResult.UnknownError, "Неизвестная ошибка во время проверки авторизации."));
            }
        }
Ejemplo n.º 5
0
        public virtual JsonResult UserSave(int IdUser = 0, Model.AdminUserEdit model = null)
        {
            var result = JsonAnswer <int>();

            try
            {
                if (IdUser < 0)
                {
                    throw new Exception("Не указан пользователь!");
                }
                else
                {
                    using (var db = new CoreContext())
                    {
                        int id = 0;

                        User      data     = null;
                        UserState oldState = 0;

                        if (IdUser > 0)
                        {
                            data = db.Users.Where(u => u.IdUser == IdUser).FirstOrDefault();
                            if (data == null)
                            {
                                ModelState.AddModelError("IdUser", "Неправильно указан пользователь!");
                            }
                            else if (data.Superuser != 0 && !AppCore.GetUserContextManager().GetCurrentUserContext().IsSuperuser)
                            {
                                ModelState.AddModelError("IdUser", "У вас нет прав на редактирование суперпользователей - это могут делать только другие суперпользователи!");
                            }
                            else
                            {
                                oldState = data.State;
                                id       = IdUser;
                            }
                        }
                        else
                        {
                            data = new User()
                            {
                                salt = "",
                                //DateReg = DateTime.Now.Timestamp(),
                                // todo добавить запись о регистрации в журнал регистраций
                            };
                        }

                        var errors = new List <string>();

                        if (ModelState.ContainsKeyCorrect("User.email"))
                        {
                            data.email = model.User.email?.ToLower();
                        }
                        if (ModelState.ContainsKeyCorrect("User.phone"))
                        {
                            data.phone = model.User.phone;
                        }

                        if (ModelState.ContainsKeyCorrect("User.name"))
                        {
                            data.name = model.User.name;
                        }
                        if (Request.Form.HasKey("login") && !string.IsNullOrEmpty(Request.Form["login"]))
                        {
                            if (!Request.Form["login"].isOneStringTextOnly()
                                // todo переработать этот участок в нормальную модель || DataManager.check(Request.Form["login"])
                                )
                            {
                                errors.Add("Некорректный ввод поля login!");
                            }
                            else
                            {
                                data.name = Request.Form["login"];
                            }
                        }

                        if (ModelState.ContainsKeyCorrect("User.name"))
                        {
                            data.name = model.User.name;
                        }
                        if (ModelState.ContainsKeyCorrect("User.about"))
                        {
                            data.about = model.User.about;
                        }

                        if (ModelState.ContainsKeyCorrect("User.Superuser"))
                        {
                            if (!AppCore.GetUserContextManager().GetCurrentUserContext().IsSuperuser)
                            {
                                errors.Add("Недостаточно прав для установки или снятия признака суперпользователя!");
                            }
                            data.Superuser = (byte)(model.User.Superuser == 0 ? 0 : 1);
                        }

                        if (ModelState.ContainsKeyCorrect("User.State"))
                        {
                            switch (model.User.State)
                            {
                            case UserState.Active:
                            case UserState.RegisterNeedConfirmation:
                            case UserState.RegisterWaitForModerate:
                            case UserState.RegisterDecline:
                            case UserState.Disabled:
                                data.State = model.User.State;
                                break;

                            default:
                                ModelState.AddModelError("User.State", "Неизвестное состояние пользователя.");
                                break;
                            }
                        }

                        if (ModelState.ContainsKeyCorrect(nameof(model.IsNeedToChangePassword)) && ModelState.ContainsKeyCorrect(nameof(model.User) + "." + nameof(model.User.password)))
                        {
                            if (data.IdUser > 0 && model.IsNeedToChangePassword)
                            {
                                data.password = UsersExtensions.hashPassword(model.User.password);
                            }
                            else if (data.IdUser == 0)
                            {
                                data.password = UsersExtensions.hashPassword(model.User.password);
                            }
                        }

                        if (ModelState.ContainsKeyCorrect("User.Comment"))
                        {
                            data.Comment = model.User.Comment;
                        }
                        if (ModelState.ContainsKeyCorrect("User.CommentAdmin"))
                        {
                            data.CommentAdmin = model.User.CommentAdmin;
                        }
                        if (Request.Form.HasKey("adminComment") && !string.IsNullOrEmpty(Request.Form["adminComment"]))
                        {
                            if (!Request.Form["adminComment"].isOneStringTextOnly()
                                // todo переработать этот участок в нормальную модель || DataManager.check(Request.Form["adminComment"])
                                )
                            {
                                errors.Add("Некорректный ввод комментария администратора!");
                            }
                            else
                            {
                                data.CommentAdmin = Request.Form["adminComment"];
                            }
                        }

                        result.Message = errors.Count > 0 ? " - " + string.Join("\r\n - ", errors) : "";

                        if (errors.Count == 0 && ModelState.IsValid)
                        {
                            data.Fields.CopyValuesFrom(model.User.Fields);
                            data.DateChangeBase = DateTime.Now;
                            data.IdUserChange   = AppCore.GetUserContextManager().GetCurrentUserContext().IdUser;

                            using (var trans = new TransactionScope())
                            {
                                if (data.IdUser == 0)
                                {
                                    db.Users.Add(data);
                                }

                                if (db.SaveChanges <User>() > 0)
                                {
                                    result.Message = "Сохранение данных прошло успешно!";
                                    result.Success = true;

                                    Module.RegisterEventForItem(data, EventType.Info, JournalEventUserEdit, "Редактирование данных", $"Пользователь №{data.IdUser} '" + data.ToString() + "'");

                                    if (result.Success)
                                    {
                                        {
                                            var rolesMustHave = new List <int>(model.UserRoles ?? new List <int>());
                                            db.RoleUser.RemoveRange(db.RoleUser.Where(x => x.IdUser == data.IdUser));
                                            rolesMustHave.ForEach(x => db.RoleUser.Add(new RoleUser()
                                            {
                                                IdRole       = x,
                                                IdUser       = data.IdUser,
                                                IdUserChange = AppCore.GetUserContextManager().GetCurrentUserContext().IdUser,
                                                DateChange   = DateTime.Now.Timestamp()
                                            }));

                                            db.SaveChanges <RoleUser>();
                                        }


                                        /*
                                         * todo рассылка на мыло и по телефону
                                         * */
                                        if (oldState == UserState.RegisterWaitForModerate && data.State == UserState.Active)
                                        {
                                            this.assign("login", Request.Form["email"]);
                                            this.assign("message", "Ваша заявка была одобрена администратором, вы можете зайти на сайт, используя логин и пароль, указанные при регистрации!");

                                            AppCore.Get <EmailService>().SendMailFromSite(
                                                data.ToString(),
                                                data.email,
                                                "Успешная регистрация на сайте",
                                                this.ViewString("Register/register_mail2.cshtml"),
                                                ContentType.Html
                                                );

                                            Module.RegisterEventForItem(data, EventType.Info, JournalEventUserStateAccept, "Заявка одобрена", "Пользователь №" + data.IdUser + " '" + data.ToString() + "'");
                                        }
                                        if (oldState == UserState.RegisterWaitForModerate && data.State == UserState.RegisterDecline)
                                        {
                                            var message = ".";

                                            //Если администратор указал комментарий к отклонению заявки
                                            if (!string.IsNullOrEmpty(data.CommentAdmin))
                                            {
                                                message = " по следующей причине: " + data.CommentAdmin;
                                                this.assign("comment", data.CommentAdmin);
                                            }

                                            this.assign("login", data.email);
                                            this.assign("message", "Ваша заявка была отклонена администратором" + message);

                                            AppCore.Get <EmailService>().SendMailFromSite(
                                                data.ToString(),
                                                data.email,
                                                "Регистрация на сайте отклонена",
                                                this.ViewString("Register/register_mail_decline.cshtml"),
                                                ContentType.Html
                                                );

                                            Module.RegisterEventForItem(data, EventType.Info, JournalEventUserStateDecline, "Заявка отклонена", "Пользователь №" + data.IdUser + " '" + data.ToString() + "'. Заявка отклонена администратором" + message);
                                        }
                                        if (oldState != data.State && data.State == UserState.Disabled)
                                        {
                                            var message = ".";

                                            //Если администратор указал комментарий к отключению заявки
                                            if (Request.Form.HasKey("adminComment") && !string.IsNullOrEmpty(Request.Form["adminComment"]))
                                            {
                                                message = " по следующей причине: " + Request.Form["adminComment"];
                                                this.assign("comment", Request.Form["adminComment"]);
                                            }
                                            if (Request.Form.HasKey("CommentAdmin") && !string.IsNullOrEmpty(Request.Form["CommentAdmin"]))
                                            {
                                                message = " по следующей причине: " + Request.Form["CommentAdmin"];
                                                this.assign("comment", Request.Form["CommentAdmin"]);
                                            }

                                            this.assign("login", data.email);
                                            this.assign("message", "Ваш аккаунт заблокирован администратором" + message);
                                            AppCore.Get <EmailService>().SendMailFromSite(
                                                data.ToString(),
                                                data.email,
                                                "Аккаунт заблокирован",
                                                this.ViewString("Register/register_mail_ban.cshtml"),
                                                ContentType.Html
                                                );

                                            Module.RegisterEventForItem(data, EventType.Info, JournalEventUserStateBlocked, "Аккаунт заблокирован", "Пользователь №" + data.IdUser + " '" + data.ToString() + "'. Аккаунт заблокирован" + message);
                                        }
                                    }

                                    result.Data = data.IdUser;

                                    trans.Complete();
                                }
                                else
                                {
                                    result.Message = "Сохранение данных провалилось!";
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex) { result.FromException(ex); }

            return(ReturnJson(result));
        }
Ejemplo n.º 6
0
        public ActionResult PasswordRestoreSave(Model.PasswordRestoreSave model = null)
        {
            var answer = JsonAnswer <string>();

            try
            {
                if (ModelState.IsValid)
                {
                    using (var db = Module.CreateUnitOfWork())
                    {
                        var res = (from p in db.PasswordRemember
                                   join u in db.Users on p.user_id equals u.IdUser
                                   where p.code == model.Code
                                   select new { Password = p, User = u }).FirstOrDefault();

                        if (res == null)
                        {
                            ModelState.AddModelError(nameof(model.Code), "Некорректный код подтверждения.");
                        }
                        else
                        {
                            var symbols = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
                            var salt    = "";

                            var rand = new Random();
                            for (int i = 0; i < 5; i++)
                            {
                                var index = rand.Next(0, symbols.Length - 1);
                                salt = salt + symbols[index];
                            }

                            using (var scope = new System.Transactions.TransactionScope())
                            {
                                db.PasswordRemember.Delete(res.Password);

                                res.User.password = UsersExtensions.hashPassword(model.Password);
                                res.User.salt     = salt;

                                db.SaveChanges();

                                scope.Complete();
                            }

                            answer.FromSuccess("Новый пароль был сохранен.");
                        }
                    }
                }
            }
            catch (BehaviourException ex)
            {
                Module.RegisterEvent(EventType.Info, "Ошибка восстановления пароля при сохранении", ex.Message, ex.InnerException);
                answer.FromFail(ex.Message);
            }
            catch (Exception ex)
            {
                Module.RegisterEvent(EventType.Error, "Ошибка восстановления пароля при сохранении", "Необработанная ошибка", ex);
                answer.FromFail("Возникла ошибка во время сохранения пароля");
            }

            if (!ModelState.IsValid)
            {
                this.RegisterEventInvalidModel("Форма восстановления пароля - шаг 2");
            }

            return(ReturnJson(answer));
        }