private void HandleManifest(Manifest man, bool IsRefreshing = false) { SecureString passKey = null; if (man.Entries.Count == 0) { passKey = man.PromptSetupPasskey(Properties.strings.LoginEnterPasskey); } else if (man.Entries.Count > 0 && man.Encrypted) { bool passKeyValid = false; while (!passKeyValid) { InputForm passKeyForm = new InputForm(Properties.strings.ManifestEnterKey, true); passKeyForm.ShowDialog(this); if (!passKeyForm.Canceled) { passKey = passKeyForm.GetPassword(); passKeyValid = man.VerifyPasskey(passKey); if (!passKeyValid) { MessageBox.Show(Properties.strings.LoginInvaildPasskey); } } else { Close(); return; } } } man.SaveAccount(androidAccount, passKey != null, passKey); if (IsRefreshing) { MessageBox.Show(Properties.strings.LoginRefreshedSession); } else { MessageBox.Show(String.Format(Properties.strings.LoginSuccessfulAdd, androidAccount.RevocationCode)); } Close(); }
private void LoginUser() { string username = txtUsername.Text; SecureString password = txtPassword.SecurePassword; if (LoginReason == LoginType.Android) { FinishExtract(username, password); return; } else if (LoginReason == LoginType.Refresh) { RefreshLogin(username, password); return; } var userLogin = new UserLogin(username, password); LoginResult response = LoginResult.BadCredentials; while ((response = userLogin.DoLogin()) != LoginResult.LoginOkay) { switch (response) { case LoginResult.NeedEmail: InputForm emailForm = new InputForm(Properties.strings.LoginEnterEmailCode); emailForm.ShowDialog(this); if (emailForm.Canceled) { Close(); return; } userLogin.EmailCode = emailForm.txtBox.Text; break; case LoginResult.NeedCaptcha: Captcha captchaForm = new Captcha(userLogin.CaptchaGID); captchaForm.ShowDialog(); if (captchaForm.Canceled) { Close(); return; } userLogin.CaptchaText = captchaForm.Code; break; case LoginResult.Need2FA: MessageBox.Show(Properties.strings.LoginAleadLinked, Properties.strings.LoginErrorT, MessageBoxButton.OK, MessageBoxImage.Error); Close(); return; case LoginResult.BadRSA: MessageBox.Show(Properties.strings.LoginBadRSA, Properties.strings.LoginErrorT, MessageBoxButton.OK, MessageBoxImage.Error); Close(); return; case LoginResult.BadCredentials: MessageBox.Show(Properties.strings.LoginBadCreds, Properties.strings.LoginErrorT, MessageBoxButton.OK, MessageBoxImage.Error); Close(); return; case LoginResult.TooManyFailedLogins: MessageBox.Show(Properties.strings.LoginTooManyFailedAttempts, Properties.strings.LoginErrorT, MessageBoxButton.OK, MessageBoxImage.Error); Close(); return; case LoginResult.GeneralFailure: MessageBox.Show(Properties.strings.LoginGeneralFailure, Properties.strings.LoginErrorT, MessageBoxButton.OK, MessageBoxImage.Error); Close(); return; } } //Login succeeded SessionData session = userLogin.Session; AuthenticatorLinker linker = new AuthenticatorLinker(session); AuthenticatorLinker.LinkResult linkResponse = AuthenticatorLinker.LinkResult.GeneralFailure; while ((linkResponse = linker.AddAuthenticator()) != AuthenticatorLinker.LinkResult.AwaitingFinalization) { switch (linkResponse) { case AuthenticatorLinker.LinkResult.MustProvidePhoneNumber: string phoneNumber = ""; while (!PhoneNumberOkay(phoneNumber)) { InputForm phoneNumberForm = new InputForm(Properties.strings.LoginEnterPhoneNumber); phoneNumberForm.txtBox.Text = "+1 "; phoneNumberForm.ShowDialog(this); if (phoneNumberForm.Canceled) { Close(); return; } phoneNumber = FilterPhoneNumber(phoneNumberForm.txtBox.Text); } linker.PhoneNumber = phoneNumber; break; case AuthenticatorLinker.LinkResult.MustRemovePhoneNumber: linker.PhoneNumber = null; break; case AuthenticatorLinker.LinkResult.GeneralFailure: MessageBox.Show(Properties.strings.LoginErrorAddingNumber); Close(); return; } } Manifest manifest = Manifest.GetManifest(); SecureString passKey = null; if (manifest.Entries.Count == 0) { passKey = manifest.PromptSetupPasskey(Properties.strings.LoginEnterPasskey); } else if (manifest.Entries.Count > 0 && manifest.Encrypted) { bool passKeyValid = false; while (!passKeyValid) { InputForm passKeyForm = new InputForm(Properties.strings.ManifestEnterKey, true); passKeyForm.ShowDialog(this); if (!passKeyForm.Canceled) { passKey = passKeyForm.GetPassword(); passKeyValid = manifest.VerifyPasskey(passKey); if (!passKeyValid) { MessageBox.Show(Properties.strings.LoginInvaildPasskey); } } else { Close(); return; } } } //Save the file immediately; losing this would be bad. if (!manifest.SaveAccount(linker.LinkedAccount, passKey != null, passKey)) { manifest.RemoveAccount(linker.LinkedAccount); MessageBox.Show(Properties.strings.LoginUnableToSaveFile); Close(); return; } MessageBox.Show(String.Format(Properties.strings.LoginWriteRevocation, linker.LinkedAccount.RevocationCode)); AuthenticatorLinker.FinalizeResult finalizeResponse = AuthenticatorLinker.FinalizeResult.GeneralFailure; while (finalizeResponse != AuthenticatorLinker.FinalizeResult.Success) { InputForm smsCodeForm = new InputForm(Properties.strings.LoginEnterSMS); smsCodeForm.ShowDialog(this); if (smsCodeForm.Canceled) { manifest.RemoveAccount(linker.LinkedAccount); Close(); return; } InputForm confirmRevocationCode = new InputForm(Properties.strings.LoginEnterRevocation); confirmRevocationCode.ShowDialog(this); if (confirmRevocationCode.txtBox.Text.ToUpper() != linker.LinkedAccount.RevocationCode) { MessageBox.Show(Properties.strings.LoginRevocationIncorrect); manifest.RemoveAccount(linker.LinkedAccount); Close(); return; } string smsCode = smsCodeForm.txtBox.Text; finalizeResponse = linker.FinalizeAddAuthenticator(smsCode); switch (finalizeResponse) { case AuthenticatorLinker.FinalizeResult.BadSMSCode: continue; case AuthenticatorLinker.FinalizeResult.UnableToGenerateCorrectCodes: MessageBox.Show(String.Format(Properties.strings.LoginUnableToGenerateCodes, linker.LinkedAccount.RevocationCode)); manifest.RemoveAccount(linker.LinkedAccount); Close(); return; case AuthenticatorLinker.FinalizeResult.GeneralFailure: MessageBox.Show(String.Format(Properties.strings.LoginUnableToFinalize, linker.LinkedAccount.RevocationCode)); manifest.RemoveAccount(linker.LinkedAccount); Close(); return; } } //Linked, finally. Re-save with FullyEnrolled property. manifest.SaveAccount(linker.LinkedAccount, passKey != null, passKey); MessageBox.Show(String.Format(Properties.strings.LoginSuccessfulAdd, linker.LinkedAccount.RevocationCode)); Close(); }