Example #1
0
        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();
            }
        }
Example #2
0
        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();
            }
        }