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)); }
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); }