/// <summary> /// Handles logging in to refresh session data. i.e. changing steam password. /// </summary> /// <param name="username">Steam username</param> /// <param name="password">Steam password</param> private async void RefreshLogin(string username, string password) { long steamTime = await TimeAligner.GetSteamTimeAsync(); Manifest man = Manifest.GetManifest(); account.FullyEnrolled = true; UserLogin mUserLogin = new UserLogin(username, password); LoginResult response = LoginResult.BadCredentials; while ((response = mUserLogin.DoLogin()) != LoginResult.LoginOkay) { switch (response) { case LoginResult.NeedCaptcha: CaptchaForm captchaForm = new CaptchaForm(mUserLogin.CaptchaGID); captchaForm.ShowDialog(); if (captchaForm.Canceled) { this.Close(); return; } mUserLogin.CaptchaText = captchaForm.CaptchaCode; break; case LoginResult.Need2FA: mUserLogin.TwoFactorCode = account.GenerateSteamGuardCodeForTime(steamTime); break; case LoginResult.BadRSA: MessageBox.Show("错误记录:Steam返回“BadRSA”。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.BadCredentials: MessageBox.Show("错误记录:用户名或密码不正确。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.TooManyFailedLogins: MessageBox.Show("错误记录:太多次失败的登录,稍后再试。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.GeneralFailure: MessageBox.Show("错误记录:Steam返回\"GeneralFailure\".", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; } } account.Session = mUserLogin.Session; HandleManifest(man, true); }
private void btnSteamLogin_Click(object sender, EventArgs e) { string username = txtUsername.Text; string password = txtPassword.Text; 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("Enter the code sent to your email:"); emailForm.ShowDialog(); if (emailForm.Canceled) { this.Close(); return; } userLogin.EmailCode = emailForm.txtBox.Text; break; case LoginResult.NeedCaptcha: CaptchaForm captchaForm = new CaptchaForm(userLogin.CaptchaGID); captchaForm.ShowDialog(); if (captchaForm.Canceled) { this.Close(); return; } userLogin.CaptchaText = captchaForm.CaptchaCode; break; case LoginResult.Need2FA: MessageBox.Show("此帐户已经有一个与其绑定的移动身份验证器。在添入新的验证器之前,请把您的Steam帐户从旧的验证器中删除。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.BadRSA: MessageBox.Show("错误记录:Steam返回“BadRSA”。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.BadCredentials: MessageBox.Show("错误记录:用户名或密码不正确。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.TooManyFailedLogins: MessageBox.Show("错误记录:太多次失败的登录,稍后再试。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.GeneralFailure: MessageBox.Show("错误记录:Steam返回“GeneralFailure”。", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.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("以下列格式输入您的电话号码:+{区号}电话号码。+86 12345678910"); phoneNumberForm.txtBox.Text = "+1 "; phoneNumberForm.ShowDialog(); if (phoneNumberForm.Canceled) { this.Close(); return; } phoneNumber = FilterPhoneNumber(phoneNumberForm.txtBox.Text); } linker.PhoneNumber = phoneNumber; break; case AuthenticatorLinker.LinkResult.MustRemovePhoneNumber: linker.PhoneNumber = null; break; case AuthenticatorLinker.LinkResult.MustConfirmEmail: MessageBox.Show("Steam会先发一封确认添加手机号码的邮件,请先去点击邮件中的添加手机号码按钮,然后点击确认。"); break; case AuthenticatorLinker.LinkResult.GeneralFailure: MessageBox.Show("添加电话号码时出错。Steam返回“GeneralFailure”。"); this.Close(); return; } } Manifest manifest = Manifest.GetManifest(); string passKey = null; if (manifest.Entries.Count == 0) { passKey = manifest.PromptSetupPassKey("请输入加密密码。留下空白或点击取消不加密都非常不安全。"); } else if (manifest.Entries.Count > 0 && manifest.Encrypted) { bool passKeyValid = false; while (!passKeyValid) { InputForm passKeyForm = new InputForm("请输入您当前的加密密码。"); passKeyForm.ShowDialog(); if (!passKeyForm.Canceled) { passKey = passKeyForm.txtBox.Text; passKeyValid = manifest.VerifyPasskey(passKey); if (!passKeyValid) { MessageBox.Show("此密码无效。请输入您用于其他帐户的密码。"); } } else { this.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("无法保存移动身份验证器文件。 移动身份验证器尚未连接。"); this.Close(); return; } MessageBox.Show("移动身份验证器尚未连接。 在最终确认使用桌面验证器之前,请写下您的撤销代码:" + linker.LinkedAccount.RevocationCode); AuthenticatorLinker.FinalizeResult finalizeResponse = AuthenticatorLinker.FinalizeResult.GeneralFailure; while (finalizeResponse != AuthenticatorLinker.FinalizeResult.Success) { InputForm smsCodeForm = new InputForm("请输入发送到您手机的短信代码。"); smsCodeForm.ShowDialog(); if (smsCodeForm.Canceled) { manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; } InputForm confirmRevocationCode = new InputForm("请输入您的撤销代码,以确保您已保存它。"); confirmRevocationCode.ShowDialog(); if (confirmRevocationCode.txtBox.Text.ToUpper() != linker.LinkedAccount.RevocationCode) { MessageBox.Show("撤销代码不正确;无法连接桌面验证器。"); manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; } string smsCode = smsCodeForm.txtBox.Text; finalizeResponse = linker.FinalizeAddAuthenticator(smsCode); switch (finalizeResponse) { case AuthenticatorLinker.FinalizeResult.BadSMSCode: continue; case AuthenticatorLinker.FinalizeResult.UnableToGenerateCorrectCodes: MessageBox.Show("无法生成正确的代码来完成此身份验证器。 验证器没有被连接。 应该是偶发状况,请写下你的撤销代码,因为这是最后一次看到它的机会:" + linker.LinkedAccount.RevocationCode); manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; case AuthenticatorLinker.FinalizeResult.GeneralFailure: MessageBox.Show("无法生成正确的代码来完成此身份验证器。 验证器没有被连接。 应该是偶发状况,请写下你的撤销代码,因为这是最后一次看到它的机会:" + linker.LinkedAccount.RevocationCode); manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; } } //Linked, finally. Re-save with FullyEnrolled property. manifest.SaveAccount(linker.LinkedAccount, passKey != null, passKey); MessageBox.Show("成功连接移动验证器。 请写下你的撤销代码:" + linker.LinkedAccount.RevocationCode); this.Close(); }
private void btnSteamLogin_Click(object sender, EventArgs e) { string username = txtUsername.Text; string password = txtPassword.Text; 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("Enter the code sent to your email:"); emailForm.ShowDialog(); if (emailForm.Canceled) { this.Close(); return; } userLogin.EmailCode = emailForm.txtBox.Text; break; case LoginResult.NeedCaptcha: CaptchaForm captchaForm = new CaptchaForm(userLogin.CaptchaGID); captchaForm.ShowDialog(); if (captchaForm.Canceled) { this.Close(); return; } userLogin.CaptchaText = captchaForm.CaptchaCode; break; case LoginResult.Need2FA: MessageBox.Show("This account already has a mobile authenticator linked to it.\nRemove the old authenticator from your Steam account before adding a new one.", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.BadRSA: MessageBox.Show("Error logging in: Steam returned \"BadRSA\".", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.BadCredentials: MessageBox.Show("Error logging in: Username or password was incorrect.", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.TooManyFailedLogins: MessageBox.Show("Error logging in: Too many failed logins, try again later.", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.GeneralFailure: MessageBox.Show("Error logging in: Steam returned \"GeneralFailure\".", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.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("Enter your phone number in the following format: +{cC} phoneNumber. EG, +1 123-456-7890"); phoneNumberForm.txtBox.Text = "+1 "; phoneNumberForm.ShowDialog(); if (phoneNumberForm.Canceled) { this.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("Error adding your phone number. Steam returned \"GeneralFailure\"."); this.Close(); return; } } Manifest manifest = Manifest.GetManifest(); string passKey = null; if (manifest.Entries.Count == 0) { passKey = manifest.PromptSetupPassKey("Please enter an encryption passkey. Leave blank or hit cancel to not encrypt (VERY INSECURE)."); } else if (manifest.Entries.Count > 0 && manifest.Encrypted) { bool passKeyValid = false; while (!passKeyValid) { InputForm passKeyForm = new InputForm("Please enter your current encryption passkey."); passKeyForm.ShowDialog(); if (!passKeyForm.Canceled) { passKey = passKeyForm.txtBox.Text; passKeyValid = manifest.VerifyPasskey(passKey); if (!passKeyValid) { MessageBox.Show("That passkey is invalid. Please enter the same passkey you used for your other accounts."); } } else { this.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("Unable to save mobile authenticator file. The mobile authenticator has not been linked."); this.Close(); return; } MessageBox.Show("The Mobile Authenticator has not yet been linked. Before finalizing the authenticator, please write down your revocation code: " + linker.LinkedAccount.RevocationCode); AuthenticatorLinker.FinalizeResult finalizeResponse = AuthenticatorLinker.FinalizeResult.GeneralFailure; while (finalizeResponse != AuthenticatorLinker.FinalizeResult.Success) { InputForm smsCodeForm = new InputForm("Please input the SMS code sent to your phone."); smsCodeForm.ShowDialog(); if (smsCodeForm.Canceled) { manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; } InputForm confirmRevocationCode = new InputForm("Please enter your revocation code to ensure you've saved it."); confirmRevocationCode.ShowDialog(); if (confirmRevocationCode.txtBox.Text.ToUpper() != linker.LinkedAccount.RevocationCode) { MessageBox.Show("Revocation code incorrect; the authenticator has not been linked."); manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; } string smsCode = smsCodeForm.txtBox.Text; finalizeResponse = linker.FinalizeAddAuthenticator(smsCode); switch (finalizeResponse) { case AuthenticatorLinker.FinalizeResult.BadSMSCode: continue; case AuthenticatorLinker.FinalizeResult.UnableToGenerateCorrectCodes: MessageBox.Show("Unable to generate the proper codes to finalize this authenticator. The authenticator should not have been linked. In the off-chance it was, please write down your revocation code, as this is the last chance to see it: " + linker.LinkedAccount.RevocationCode); manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; case AuthenticatorLinker.FinalizeResult.GeneralFailure: MessageBox.Show("Unable to finalize this authenticator. The authenticator should not have been linked. In the off-chance it was, please write down your revocation code, as this is the last chance to see it: " + linker.LinkedAccount.RevocationCode); manifest.RemoveAccount(linker.LinkedAccount); this.Close(); return; } } //Linked, finally. Re-save with FullyEnrolled property. manifest.SaveAccount(linker.LinkedAccount, passKey != null, passKey); MessageBox.Show("Mobile authenticator successfully linked. Please write down your revocation code: " + linker.LinkedAccount.RevocationCode); this.Close(); }
/// <summary> /// Handles logging in after data has been extracted from Android phone /// </summary> /// <param name="username">Steam username</param> /// <param name="password">Steam password</param> private async void FinishExtract(string username, string password) { long steamTime = await TimeAligner.GetSteamTimeAsync(); Manifest man = Manifest.GetManifest(); androidAccount.FullyEnrolled = true; UserLogin mUserLogin = new UserLogin(username, password); LoginResult response = LoginResult.BadCredentials; while ((response = mUserLogin.DoLogin()) != LoginResult.LoginOkay) { switch (response) { case LoginResult.NeedEmail: InputForm emailForm = new InputForm("Enter the code sent to your email:"); emailForm.ShowDialog(); if (emailForm.Canceled) { this.Close(); return; } mUserLogin.EmailCode = emailForm.txtBox.Text; break; case LoginResult.NeedCaptcha: CaptchaForm captchaForm = new CaptchaForm(mUserLogin.CaptchaGID); captchaForm.ShowDialog(); if (captchaForm.Canceled) { this.Close(); return; } mUserLogin.CaptchaText = captchaForm.CaptchaCode; break; case LoginResult.Need2FA: mUserLogin.TwoFactorCode = androidAccount.GenerateSteamGuardCodeForTime(steamTime); break; case LoginResult.BadRSA: MessageBox.Show("Error logging in: Steam returned \"BadRSA\".", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.BadCredentials: MessageBox.Show("Error logging in: Username or password was incorrect.", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.TooManyFailedLogins: MessageBox.Show("Error logging in: Too many failed logins, try again later.", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; case LoginResult.GeneralFailure: MessageBox.Show("Error logging in: Steam returned \"GeneralFailure\".", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); return; } } androidAccount.Session = mUserLogin.Session; HandleManifest(man); }