Esempio n. 1
0
        public JsonResult RegisterSave(Model.Register model)
        {
            var answer = JsonAnswer <User>();

            try
            {
                if (ModelState.IsValid)
                {
                    using (var db = new CoreContext())
                    {
                        if (!string.IsNullOrEmpty(model.email))
                        {
                            if (db.Users.Where(x => x.email.ToLower() == model.email.ToLower()).Count() > 0)
                            {
                                ModelState.AddModelError(nameof(model.email), "Этот email-адрес уже используется!");
                            }
                        }

                        if (!string.IsNullOrEmpty(model.phone))
                        {
                            var phone = PhoneBuilder.ParseString(model.phone);
                            if (!phone.IsCorrect)
                            {
                                ModelState.AddModelError(nameof(model.phone), phone.Error);
                            }
                            else
                            {
                                model.phone = phone.ParsedPhoneNumber;
                                if (db.Users.Where(x => x.phone.ToLower() == model.phone.ToLower()).Count() > 0)
                                {
                                    ModelState.AddModelError(nameof(model.phone), "Этот номер телефона уже используется!");
                                }
                            }
                        }
                    }
                }

                if (ModelState.IsValid)
                {
                    var preparedData = new Model.PreparedForRegister();
                    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];
                    }

                    preparedData.salt = salt;

                    var regMode = AppCore.WebConfig.register_mode;
                    switch (regMode)
                    {
                    case RegisterMode.SelfConfirmation:
                        preparedData.State = Core.Db.UserState.RegisterNeedConfirmation;
                        break;

                    case RegisterMode.Immediately:
                        preparedData.State = Core.Db.UserState.Active;
                        break;

                    case RegisterMode.ManualCheck:
                        preparedData.State = Core.Db.UserState.RegisterWaitForModerate;
                        break;
                    }

                    preparedData.email = model.email;
                    preparedData.phone = model.phone;

                    preparedData.IP_reg   = Request.ServerVariables["REMOTE_ADDR"];
                    preparedData.password = model.password;

                    preparedData.name = model.name;

                    preparedData.DateReg = DateTime.Now;
                    preparedData.Fields.CopyValuesFrom(model.Fields);

                    preparedData.Superuser = 0;

                    var isSuperuserNeeded = AppCore.GetModulesManager().GetModule <Auth.ModuleAuth>()?.IsSuperuserNeeded() ?? false;
                    if (isSuperuserNeeded)
                    {
                        preparedData.Superuser = 1;
                        preparedData.State     = Core.Db.UserState.Active;
                    }

                    var result = Module.RegisterUser(preparedData);
                    if (isSuperuserNeeded && result.Success)
                    {
                        result.Message += " Учетная запись была помечена как \"Суперпользователь\" и немедленно активирована.";
                    }
                    answer = result;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("RegisterSave: {0}", ex.Message);
                answer.FromException(ex);
            }

            return(ReturnJson(answer));
        }
Esempio n. 2
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);
        }