Beispiel #1
0
        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");
        }
Beispiel #2
0
 /// <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();
         }
     }
 }
Beispiel #3
0
 public ActionResult Edit()
 {
     using (var context = new TicTacToeEntities())
     {
         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");
         }
         var model = new EditCredentials{
                                             Email = user.Email,
                                             Login = user.Login
                                         };
         return View(model);
     }
 }
Beispiel #4
0
        /// <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();
                }
            }
        }
Beispiel #5
0
 /// <summary>
 /// Получить логин пользвателя по Email
 /// </summary>
 /// <param name="email">Email пользователя</param>
 /// <returns>Логин пользователя</returns>
 public override string GetUserNameByEmail(string email)
 {
     try
     {
         using (var context = new TicTacToeEntities())
             return context.Users.Single(u => u.Email == email && u.Deleted == null).Login;
     }
     catch(Exception ex)
     {
         this.GetLog().Error("GetUserNameByEmail error", ex);
         return string.Empty;
     }
 }
Beispiel #6
0
 /// <summary>
 /// Возвращает учетные данные по логину
 /// </summary>
 /// <param name="username">Логин пользователя</param>
 /// <param name="userIsOnline">Пользователь онлайн(сейчас не используется)</param>
 /// <returns>Учетные данные или null</returns>
 public override MembershipUser GetUser(string username, bool userIsOnline)
 {
     using (var ent = new TicTacToeEntities())
     {
         var user = ent.Users.FirstOrDefault(x => x.Login == username && x.Deleted == null);
         return GetUser(user);
     }
 }
Beispiel #7
0
 /// <summary>
 /// Получение пользователя по идентификатору
 /// </summary>
 /// <param name="providerUserKey">Идентификатор пользователя</param>
 /// <param name="userIsOnline">Находится ли данный пользователь в сети(не используется)</param>
 /// <returns>Полученный пользователь</returns>
 public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
 {
     using (var ent = new TicTacToeEntities())
     {
         var user = ent.Users.FirstOrDefault(x => x.User_id == (int)providerUserKey && x.Deleted == null);
         return GetUser(user);
     }
 }
Beispiel #8
0
 /// <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;
     }
 }
Beispiel #9
0
        /// <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;
                }
            }
        }
Beispiel #10
0
 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");
 }
Beispiel #11
0
        /// <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;
            }
        }
Beispiel #12
0
        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");
            }
        }
Beispiel #13
0
        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;
            }
        }
Beispiel #14
0
        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;
            }
        }
Beispiel #15
0
        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");
        }
Beispiel #16
0
        /// <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;
            }
        }
Beispiel #17
0
 /// <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;
     }
 }
Beispiel #18
0
        /// <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;
            }
        }
Beispiel #19
0
 /// <summary>
 /// Проверка учетных данных пользователя с учетом блокировок
 /// </summary>
 /// <param name="username">Логин</param>
 /// <param name="password">Пароль</param>
 /// <returns>Всё ли хорошо</returns>
 public override bool ValidateUser(string username, string password)
 {
     byte[] hash = Common.EncryptPasswordSHA256(password);
     using (var ent = new TicTacToeEntities())
         return ent.Users.Any(x => x.Login == username && x.PassHash == hash && !x.Blocked && x.Deleted == null);
 }
Beispiel #20
0
 /// <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;
     }
 }