public ActionResult Activate(string email, string key) { try { string login = string.Empty; using (var context = new TicTacToeEntities()) { var user = context.Users.Single(x => x.Email == email && x.PassRecoveryToken == key); user.Activated = true; login = user.Login; context.SaveChanges(); } var sb = new StringBuilder(); sb.AppendLine("Вы успешно активировали свою учётную запись в игре <b>\"Крестики-нолики\"</b>.<br>"); sb.AppendLine("Теперь Вы мошете начать игру.<br>"); sb.AppendLine("Ваш логин для входа в систему: <b>" + login + "</b><br>"); Email.Send(email, "Учетная запись успешно активирована", sb.ToString(), Async: true); this.GetLog().InfoFormat("Учетная запись {0} успешно активирована", login); Common.SetSessionMessage(Session, "Ваша учетная запись успешно активирована. Теперь Вы можете начать играть. Для продолжения <a href=\"" + Url.Action("LogOn", "Accounts", new { Login = login }, Request.Url.Scheme) + "\">войдите</a> на сайт используя свои учетные данные.", "Активация учетной записи"); } catch (Exception ex) { this.GetLog().Error("Ошибка активации учетной записи", ex); Common.SetSessionMessage(Session, "Ошибка активации учетной записи.", "Активация учетной записи"); } return RedirectToAction("Result", "Home"); }
/// <summary> /// Функция запуска игры, если все игроки готовы /// </summary> public void CheckForUsersReady(object param) { using (var context = new TicTacToeEntities()) { var rooms = context.Rooms.Include(x => x.UsersInRooms).ToList(); foreach (var room in rooms) { var users = room.UsersInRooms.Where(x => !x.Spectator).ToList(); if (users.Count() != room.PlayersCount) continue; if (users.Any(x =>!x.ReadyToStart)) continue; // Если все готовы, то запускаем игру room.StartTime = DateTime.Now; // Даем ход первому игроку users.First().Turn = true; context.SaveChanges(); } } }
/// <summary> /// Обновить учетные данные пользователя /// </summary> /// <param name="user">Новые учетные данные</param> public override void UpdateUser(MembershipUser user) { if (user == null) return; try { using (var context = new TicTacToeEntities()) { var u = context.Users.Single(x => x.User_id == (int)user.ProviderUserKey); if (!ValidateEmail(user.Email)) throw new ArgumentException("Указанный Email не соответствует требованиям", "user"); if (context.Users.Any(x => x.Email == user.Email && x.User_id != (int)user.ProviderUserKey)) throw new ArgumentException("Указанный Email уже зарегистрирован", "user"); u.Activated = user.IsApproved; u.Blocked = user.IsLockedOut; u.Created = user.CreationDate; u.Description = user.Comment; u.Email = user.Email; u.LastActivityDateTime = user.LastActivityDate; u.LastLockOutDateTime = user.LastLockoutDate; u.LastLoginDateTime = user.LastLoginDate; u.LastPasswordChangedDateTime = user.LastPasswordChangedDate; context.SaveChanges(); } } catch (Exception ex) { this.GetLog().Error("Ошибка обновления учетных данных пользоваетеля", ex); throw; } }
/// <summary> /// Разблокировать пользователя /// </summary> /// <param name="userName">Логин</param> /// <returns>Удалось ли разблокирвоать пользователя</returns> public override bool UnlockUser(string userName) { try { using (var context = new TicTacToeEntities()) { var u = context.Users.Single(x => x.Login == userName); u.Blocked = false; context.SaveChanges(); return true; } } catch (Exception ex) { this.GetLog().Error("Ошибка разблокирования пользователя", ex); return false; } }
/// <summary> /// Сбросить пароль пользователя на автоматически сгененрированный новый /// </summary> /// <param name="username">Логин пользователя</param> /// <param name="answer">Ответ на контрольный вопрос</param> /// <returns>новый пароль</returns> public override string ResetPassword(string username, string answer) { string Pass = Common.GenerateRandomDigitString(15, Common.ABC); try { using (var context = new TicTacToeEntities()) { var u = context.Users.Single(x => x.Login == username); u.PassHash = Common.EncryptPasswordSHA256(Pass); context.SaveChanges(); return Pass; } } catch (Exception ex) { this.GetLog().Error("Ошибка удаления пользователя", ex); return string.Empty; } }
/// <summary> /// Пометить пользователя как удаленного /// </summary> /// <param name="username">Логин пользователя</param> /// <param name="deleteAllRelatedData">Удалить все данные связанные с пользователем</param> /// <returns>Удалось ли удалить</returns> public override bool DeleteUser(string username, bool deleteAllRelatedData) { try { using (var context = new TicTacToeEntities()) { var u = context.Users.Single(x => x.Login == username); u.Deleted = DateTime.Now; context.SaveChanges(); return true; } } catch (Exception ex) { this.GetLog().Error("Ошибка удаления пользователя", ex); return false; } }
/// <summary> /// Создает пользователя в БД /// </summary> /// <param name="username">Имя пользователя</param> /// <param name="password">Пароль пользователя</param> /// <param name="email">Email пользователя</param> /// <param name="passwordQuestion">Вопрос для восстановления пароля</param> /// <param name="passwordAnswer">Ответ для восстановления пароля</param> /// <param name="isApproved">Активирована ли учетная запись пользователя</param> /// <param name="providerUserKey">Идентификатор пользователя</param> /// <param name="status">Результат попытки создания пользователя</param> /// <returns>Учетные данные пользователя</returns> public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) { using (var context = new TicTacToeEntities()) { try { if (!ValidateLogin(username)) { status = MembershipCreateStatus.InvalidUserName; return null; } if (context.Users.Any(x=>x.Login == username)) { status = MembershipCreateStatus.DuplicateUserName; return null; } if (!ValidateEmail(email)) { status = MembershipCreateStatus.InvalidEmail; return null; } if (RequiresUniqueEmail && context.Users.Any(x => x.Email == email)) { status = MembershipCreateStatus.DuplicateEmail; return null; } var user = new Users { Login = username, PassHash = Common.EncryptPasswordSHA256(password), Email = email, Activated = !RequireActivation || isApproved, Roles = (int) RoleProvider.Roles.User, Created = DateTime.Now, PasswordQuestion = passwordQuestion, PasswordAnswer = passwordAnswer }; context.Users.Add(user); context.SaveChanges(); status = MembershipCreateStatus.Success; return GetUser(user); } catch (Exception ex) { this.GetLog().Error("User creation error", ex); status = MembershipCreateStatus.ProviderError; return null; } } }
/// <summary> /// Смена контрольных вопроса и ответа пользователем /// </summary> /// <param name="username">Логин</param> /// <param name="password">Пароль</param> /// <param name="newPasswordQuestion">Новый контрольный вопрос</param> /// <param name="newPasswordAnswer">Новый ответ на контрольный вопрос</param> /// <returns>Удалось ли сменить</returns> public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) { var hash = Common.EncryptPasswordSHA256(password); try { using (var context = new TicTacToeEntities()) { var user = context.Users.Single(u => u.Login == username && u.PassHash == hash); user.PasswordQuestion = newPasswordQuestion; user.PasswordAnswer = newPasswordAnswer; context.SaveChanges(); return true; } } catch (Exception ex) { this.GetLog().Error("User ChangePasswordQuestionAndAnswer error", ex); return false; } }
/// <summary> /// Изменить Пароль пользователя /// </summary> /// <param name="username">Логин пользователя</param> /// <param name="oldPassword">Старый пароль</param> /// <param name="newPassword">Новый пароль</param> /// <returns>Удалось ли изменить пароль</returns> public override bool ChangePassword(string username, string oldPassword, string newPassword) { var oldEncPassword = Common.EncryptPasswordSHA256(oldPassword); if (!ValidatePassword(newPassword)) return false; var newEncPassword = Common.EncryptPasswordSHA256(newPassword); try { using (var context = new TicTacToeEntities()) { var user = context.Users.Single(u => u.Login == username && u.PassHash == oldEncPassword); user.PassHash = newEncPassword; context.SaveChanges(); return true; } } catch (Exception ex) { this.GetLog().Error("User password change error", ex); return false; } }
/// <summary> /// Функция удаления пустых комнат /// </summary> public void ClearRooms(object param) { using (var context = new TicTacToeEntities()) { var rooms = context.Rooms.Include(x=>x.UsersInRooms).ToList(); foreach (var room in rooms) { if (room.UsersInRooms.Count > 0) continue; room.Deleted = true; context.SaveChanges(); } } }
public ActionResult Edit(EditCredentials model) { using (var context = new TicTacToeEntities()) { if (!UserProvider.ValidateEmail(model.Email)) ModelState.AddModelError("Email", "Email не соответствует требованиям"); if (!string.IsNullOrEmpty(model.Password) && string.IsNullOrEmpty(model.OldPassword)) ModelState.AddModelError("OldPassword", "Для смены пароля необходимо ввести старый пароль"); if (!string.IsNullOrEmpty(model.OldPassword) && !Membership.Provider.ValidateUser(model.Login, model.OldPassword)) ModelState.AddModelError("OldPassword", "Пароль не верный"); if (!string.IsNullOrEmpty(model.OldPassword) && !string.IsNullOrEmpty(model.Password) && !UserProvider.ValidatePassword(model.Password)) ModelState.AddModelError("Password", "Новый пароль не соответствует требованиям"); if (string.Compare(model.Password, model.RePassword) != 0) ModelState.AddModelError("RePassword", "Пароли не совпадают"); // проверка на смену email if (context.Users.Any(x => x.Email == model.Email && x.Login != User.Identity.Name)) ModelState.AddModelError("Email", "Такой Email уже зарегестрирован в системе"); if (!ModelState.IsValid) { model.OldPassword = string.Empty; model.Password = string.Empty; model.RePassword = string.Empty; return View(model); } var user = context.Users.FirstOrDefault(x => x.Login == User.Identity.Name); if (user == null) { this.GetLog().Error("Ошибка редактирования настроек. Не найден пользователь " + User.Identity.Name); Common.SetSessionMessage(Session, "Ошибка редактирования настроек.", "Настройки учётной записи"); return RedirectToAction("Result", "Home"); } using (var trans = new TransactionScope()) { user.Email = model.Email; context.SaveChanges(); // меняем пароль bool Changed = true; if (!string.IsNullOrEmpty(model.OldPassword) && !string.IsNullOrEmpty(model.Password)) Changed = Membership.Provider.ChangePassword(user.Login, model.OldPassword, model.Password); if (!Changed) { this.GetLog().Error("Ошибка изменения пароля пользователя. " + user.Login); Common.SetSessionMessage(Session, "Ошибка редактирования настроек.", "Настройки учётной записи"); return RedirectToAction("Result", "Home"); } trans.Complete(); } Common.SetSessionMessage(Session, "Ваши учетные данные успешно изменены.", "Настройки учётной записи"); return RedirectToAction("Result", "Home"); } }
public bool SendRestoreEmail(string email) { try { using (var context = new TicTacToeEntities()) { var user = context.Users.Single(x => x.Email == email); var token = Common.GenerateRandomDigitString(50); user.PassRecoveryToken = token; user.LastPasswordChangedDateTime = DateTime.Now; context.SaveChanges(); // формируем ссылку для активации var rurl = Url.Action("RestorePassword", "Accounts", new {login = user.Login, email = user.Email, key = token }, Request.Url.Scheme); // Формируем письмо var sb = new StringBuilder(); sb.AppendLine("Поступил запрос восстановления пароля от вашей учетной записи в игре <b>\"Крестики-нолики\"</b>.<br>"); sb.AppendLine("Для восстановления пароля пройдите по ссылке: <a href=\"" + rurl + "\">Восстановить</a>.<br>"); sb.AppendLine("Ссылка будет действительна в течение 3-х суток."); Email.Send(user.Email, "Восстановление пароля", sb.ToString()); return true; } } catch (Exception ex) { this.GetLog().Error("SendActivationEmail error", ex); return false; } }
public bool SendActivationEmail(string email, string Password) { try { using (var context = new TicTacToeEntities()) { var user = context.Users.Single(x => x.Email == email); var token = Common.GenerateRandomDigitString(50); user.PassRecoveryToken = token; context.SaveChanges(); // формируем ссылку для активации var rurl = Url.Action("Activate", "Accounts", new { email = user.Email, key = token }, Request.Url.Scheme); // Формируем письмо var sb = new StringBuilder(); sb.AppendLine("Вы зарегистрировались в игре \"Крестики-нолики\".<br>"); sb.AppendLine("Ваш логин для входа в систему: <b>" + user.Login + "</b><br>"); sb.AppendLine("Ваш пароль для входа в систему: <b>" + Password + "</b><br>"); sb.AppendLine("Для активации учетной записи пройдите по ссылке: <a href=\"" + rurl + "\">Активировать</a>"); Email.Send(user.Email, "Активация учетной записи", sb.ToString()); return true; } } catch(Exception ex) { this.GetLog().Error("SendActivationEmail error", ex); return false; } }
public ActionResult RestorePassword(string Login, string email, string key) { try { string login = string.Empty; string Password = string.Empty; using (var context = new TicTacToeEntities()) { var dt = DateTime.Now.AddDays(-3); var user = context.Users.Single(x => x.Email == email && x.Login == Login && x.PassRecoveryToken == key && x.LastPasswordChangedDateTime > dt); login = user.Login; Password = Membership.Provider.ResetPassword(Login, string.Empty); user.PassRecoveryToken = string.Empty; context.SaveChanges(); } var sb = new StringBuilder(); sb.AppendLine("Вы успешно восстановили пароль к учетной записи в игре <b>\"Крестики-нолики\"</b>.<br>"); sb.AppendLine("Ваш логин для входа в систему: <b>" + login + "</b><br>"); sb.AppendLine("Ваш новый пароль для входа в систему: <b>" + Password + "</b><br>"); sb.AppendLine("Вы всегда можете сменить его в <a href=\"" + Url.Action("Edit", "Accounts", new { Login = login }, Request.Url.Scheme) + "\">настройках</a> профиля пользователя.<br>"); Email.Send(email, "Восстановление пароля", sb.ToString()); this.GetLog().InfoFormat("Пароль {0} успешно восстановлен", login); Common.SetSessionMessage(Session, "На Ваш email выслан новый пароль к учётной записи. Вы всегда можете сменить его в <a href=\"" + Url.Action("Edit", "Accounts", new { Login = login }, Request.Url.Scheme) + "\">настройках</a> профиля пользователя.", "Восстановление пароля"); } catch (Exception ex) { this.GetLog().Error("Ошибка восстановления пароля учетной записи", ex); Common.SetSessionMessage(Session, "Ошибка восстановления учетной записи.", "Восстановление пароля учетной записи"); } return RedirectToAction("Result", "Home"); }
public ActionResult Restore(RestoreCredentials model) { string Email = string.Empty; using (var ent = new TicTacToeEntities()) { var user = ent.Users.FirstOrDefault(x => x.Login == model.Login && x.Deleted == null); if (user == null) ModelState.AddModelError("Login", "Пользователь с таким Логином не зарегистрирован в системе"); else Email = user.Email; ent.SaveChanges(); } if (!ModelState.IsValid) return View(model); if (SendRestoreEmail(Email)) Common.SetSessionMessage(Session, "На Ваш Email отправлено письмо с инструкцией по восстановлению пароля.", "Восстановление пароля"); else Common.SetSessionMessage(Session, "При попытке восстановить пароль произошла ошибка. Сообщите о ней Администрации сайта.", "Восстановление пароля"); return RedirectToAction("Result", "Home"); }