public ActionResult Login(UserViewModel userView, string returnUrl) { User user; MailAccount mailAccount; MailAccount existingMailAccount; ISession session = NHibernateManager.OpenSession(); ITransaction tran = session.BeginTransaction(); Boolean workingOffline = false; try { this.UpdateModel(userView); String cipherPassword = CryptoHelper.EncryptDefaultKey(userView); if (Glimpse.Models.User.IsEmail(userView.Username)) //si es un email { mailAccount = new MailAccount(userView.Username, cipherPassword); try { mailAccount.ConnectLight(); //si pasa este punto es que los datos ingresados son correctos } catch (SocketException) { workingOffline = true; mailAccount.ValidateCredentials(); } user = Glimpse.Models.User.FindByUsername(userView.Username, session); existingMailAccount = MailAccount.FindByAddress(userView.Username, session, false); if (user == null) { user = new User(userView.Username, cipherPassword); user.SaveOrUpdate(session); } else if (!CryptoHelper.PasswordsMatch(user.Entity.Password, cipherPassword)) { user.Entity.Password = cipherPassword; user.SaveOrUpdate(session); } if (existingMailAccount == null) { mailAccount.SetUser(user); mailAccount.SetOldestMailDate(); mailAccount.Deactivate(session); //llama a saveOrUpdate adentro } else { if (existingMailAccount.Entity.Password != mailAccount.Entity.Password) { existingMailAccount.Entity.Password = mailAccount.Entity.Password; existingMailAccount.SaveOrUpdate(session); } mailAccount.Entity = existingMailAccount.Entity; } if (!workingOffline) { mailAccount.UpdateLabels(session); } user.AddAccount(mailAccount); } else //si es un usuario glimpse { user = Glimpse.Models.User.FindByUsername(userView.Username, session); if (user == null) { this.ModelState.AddModelError("User", "Usuario inexistente."); tran.Rollback(); return(View(userView)); } else if (!CryptoHelper.PasswordsMatch(user.Entity.Password, cipherPassword)) { this.ModelState.AddModelError("User", "Contraseña incorrecta."); tran.Rollback(); return(View(userView)); } user.UpdateAccounts(session); //try //{ // user.ConnectLight(); // user.UpdateLabels(session); //} //catch (SocketException) { } } new CookieHelper().AddUsernameCookie(user.Entity.Username); FormsAuthentication.SetAuthCookie(userView.Username, true); tran.Commit(); Session[AccountController.USER_NAME] = user; return(RedirectToLocal(returnUrl)); } catch (InvalidOperationException) //model state invalido { tran.Rollback(); return(View(userView)); } catch (InvalidAuthenticationException) { tran.Rollback(); ModelState.AddModelError("", "La dirección de correo o la contraseña no son correctos."); return(View(userView)); } catch (Exception) { tran.Rollback(); ModelState.AddModelError("", "Existen problemas para iniciar sesión, intentalo de nuevo más tarde."); return(View(userView)); } finally { session.Close(); } }
public ActionResult EditUserAccounts(String mailAccount1, String password1, Boolean isMainAccount1, String mailAccount2, String password2, Boolean isMainAccount2, String mailAccount3, String password3, Boolean isMainAccount3) { ISession session = NHibernateManager.OpenSession(); ITransaction tran = session.BeginTransaction(); try { User sessionUser = (User)Session[AccountController.USER_NAME]; if (sessionUser == null) { throw new GlimpseException("No se encontró el usuario."); } #region Initialize UserView MailAccountViewModel mailAccountView1 = new MailAccountViewModel(); MailAccountViewModel mailAccountView2 = new MailAccountViewModel(); MailAccountViewModel mailAccountView3 = new MailAccountViewModel(); UserViewModel userView = new UserViewModel(); List <MailAccountViewModel> mailAccountsView = new List <MailAccountViewModel>(); mailAccountView1.Address = mailAccount1; mailAccountView1.Password = password1; mailAccountView1.IsMainAccount = isMainAccount1; mailAccountView2.Address = mailAccount2; mailAccountView2.Password = password2; mailAccountView2.IsMainAccount = isMainAccount2; mailAccountView3.Address = mailAccount3; mailAccountView3.Password = password3; mailAccountView3.IsMainAccount = isMainAccount3; mailAccountsView.Add(mailAccountView1); mailAccountsView.Add(mailAccountView2); mailAccountsView.Add(mailAccountView3); userView.Username = sessionUser.Entity.Username; userView.ListMailAccounts = mailAccountsView; userView.FilterInvalidAccounts(); #endregion this.ValidateUserMailAccounts(userView, sessionUser, session); //direcciones de correo y contraseñas List <MailAccount> removedMailAccounts = new List <MailAccount>(); foreach (MailAccount removedMailAccount in sessionUser.mailAccounts .Where(x => !userView.ListMailAccounts.Any(c => c.Address == x.Entity.Address))) { removedMailAccount.Disconnect(); removedMailAccount.Deactivate(session); //saveOrUpdate adentro removedMailAccounts.Add(removedMailAccount); } foreach (MailAccount removedMailAccount in removedMailAccounts) { sessionUser.mailAccounts.Remove(removedMailAccount); } foreach (MailAccountViewModel mailAccountView in userView.ListMailAccounts) { if (sessionUser.mailAccounts.Any(x => x.Entity.Address == mailAccountView.Address)) //si la cuenta ya existia { MailAccount editedMailAccount = sessionUser.mailAccounts.Single(x => x.Entity.Address == mailAccountView.Address); if (!String.IsNullOrEmpty(mailAccountView.Password)) { editedMailAccount.Entity.Password = CryptoHelper.EncryptDefaultKey(mailAccountView); } editedMailAccount.SetUser(sessionUser); editedMailAccount.ConnectLight(); if (mailAccountView.IsMainAccount) { editedMailAccount.SetAsMainAccount(true); } else { editedMailAccount.SetAsMainAccount(false); } editedMailAccount.Activate(session); //saveOrUpdate adentro } else //si la cuenta es nueva { MailAccount newMailAccount = new MailAccount(mailAccountView.Address, CryptoHelper.EncryptDefaultKey(mailAccountView.Password)); newMailAccount.SetUser(sessionUser); if (mailAccountView.IsMainAccount) { newMailAccount.SetAsMainAccount(true); } else { newMailAccount.SetAsMainAccount(false); } newMailAccount.SetOldestMailDate(); newMailAccount.Activate(session); //saveOrUpdate adentro newMailAccount.ConnectFull(session); sessionUser.AddAccount(newMailAccount); } } tran.Commit(); Session[AccountController.USER_NAME] = sessionUser; return(Json(new { success = true, url = Url.Action("Index", "Home") }, JsonRequestBehavior.AllowGet)); } catch (GlimpseException exc) { tran.Rollback(); return(Json(new { success = false, message = exc.GlimpseMessage }, JsonRequestBehavior.AllowGet)); } catch (Exception exc) { tran.Rollback(); Log.LogException(exc, "Parametros: viewAccountName1:(" + mailAccount1 + "), viewAccountPass1( " + password1 + "), viewAccountCheck1(" + isMainAccount1 + "), viewAccountName2(" + mailAccount2 + "), viewAccountPass1(" + password1 + "), viewAccountCheck2(" + isMainAccount2 + "), viewAccountName3:(" + mailAccount3 + "), viewAccountPass3( " + password3 + "), viewAccountCheck3(" + isMainAccount3 + ")."); return(Json(new { success = false, message = "Error modificando usuario." }, JsonRequestBehavior.AllowGet)); } finally { session.Close(); } }