public async Task <LoginResponse> PerformRequestAsync() { try { var resp = new LoginResponse(); if (_mailClient == null && String.IsNullOrEmpty(FUTAccount.BackupCode1) && String.IsNullOrEmpty(FUTAccount.BackupCode2) && String.IsNullOrEmpty(FUTAccount.BackupCode3) && String.IsNullOrEmpty(FUTAccount.GoogleAuthCode)) { resp.Code = FUTErrorCode.UnknownEMailProvider; resp.Message = "Unknown EMailprovider"; return(resp); } HttpClient.RemoveRequestHeader(NonStandardHttpHeaders.PhishingToken); HttpClient.RemoveRequestHeader(NonStandardHttpHeaders.SessionId); UpdateStatistic("Loading Cookies and Enviromentvariables..."); HttpClient.SetCookieContainer(CookieManager.GetCookieContainer(FUTAccount, false)); UpdateStatistic("Grabbing Loginpage..."); var loggedIn = await GetLoginPageAsync().ConfigureAwait(false); var loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); if (!loggedIn.RequestMessage.RequestUri.AbsoluteUri.Contains("companion/auth.html")) { await Task.Delay(2000).ConfigureAwait(false); UpdateStatistic("Loging in to Origin..."); loggedIn = await LoginAsync(loggedIn.RequestMessage.RequestUri.AbsoluteUri).ConfigureAwait(false); loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); } var codeSentTimestamp = DateTime.Now.Subtract(new TimeSpan(0, 2, 0)); if (loggedInString.Contains("var redirectUri = 'https://signin.ea.com:443/p/web2/login?execution=")) { var redirect = Regex.Match(loggedInString, "'(.*?)';").Groups[1].Value; var red2 = Regex.Match(loggedInString, "redirectUri \\+ \"(.*?)\";").Groups[1].Value; loggedIn = await HttpClient.GetAsync(redirect + red2).ConfigureAwait(false); loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); } if (loggedInString.Contains("general-error") && !loggedInString.Contains("panel-profile-upgrade")) { resp.Code = Models.FUTErrorCode.WrongLoginData; return(resp); } if (loggedInString.Contains("panel-forewordMessage") && loggedInString.Contains("btn-continue")) { UpdateStatistic("Accepting TFACreation..."); loggedIn = await AcceptTwoFactorAsync(loggedIn.RequestMessage.RequestUri.AbsoluteUri); loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); } if (loggedInString.Contains("btnTFACreate") && loggedInString.Contains("tfa_type") && loggedInString.Contains("EMAIL")) { UpdateStatistic("Create EMail TFA..."); loggedIn = await CreateEMailTwoFactorAsync(loggedIn.RequestMessage.RequestUri.AbsoluteUri); loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); } if (loggedInString.Contains("tfa-login-link") && loggedInString.Contains("btnSendCode")) { if (!String.IsNullOrEmpty(FUTAccount.GoogleAuthCode)) { loggedIn = await SelectGoogleAuthenticatorAsync(loggedIn.RequestMessage.RequestUri.AbsoluteUri).ConfigureAwait(false); loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); } else { loggedIn = await SelectEMailTwoFactorAsync(loggedIn.RequestMessage.RequestUri.AbsoluteUri).ConfigureAwait(false); loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); } } var twoFactorCode = ""; if (loggedInString.Contains("oneTimeCode")) { if (!String.IsNullOrEmpty(FUTAccount.BackupCode1)) { twoFactorCode = FUTAccount.BackupCode1; FUTAccount.BackupCode1 = ""; FUTAccount.SaveChanges(); } else if (!String.IsNullOrEmpty(FUTAccount.BackupCode2)) { twoFactorCode = FUTAccount.BackupCode2; FUTAccount.BackupCode2 = ""; FUTAccount.SaveChanges(); } else if (!String.IsNullOrEmpty(FUTAccount.BackupCode2)) { twoFactorCode = FUTAccount.BackupCode2; FUTAccount.BackupCode3 = ""; FUTAccount.SaveChanges(); } else if (!string.IsNullOrEmpty(FUTAccount.GoogleAuthCode)) { twoFactorCode = QuickEAAuthenticator.GenerateAuthCode(FUTAccount.GoogleAuthCode); } else { var resendUri = loggedIn.RequestMessage.RequestUri.AbsoluteUri + "&_eventId=resend"; var resendUri2 = "https://signin.ea.com" + loggedInString.GetRegexBetween(" < a id=\"resend_code_link\" href=\"", "\""); UpdateStatistic("Waiting for TwoFactor Code..."); twoFactorCode = await WaitForTwoFactorCode(codeSentTimestamp, resendUri).ConfigureAwait(false); } if (twoFactorCode == "WrongUserPassword") { resp.Code = Models.FUTErrorCode.WrongEMailPassword; return(resp); } if (twoFactorCode == "GMXBlocked") { resp.Code = Models.FUTErrorCode.GMXBlocked; return(resp); } if (twoFactorCode.StartsWith("EXC")) { resp.Code = Models.FUTErrorCode.TwoFactorFailed; resp.Message = twoFactorCode.Remove(0, 3); return(resp); } if (twoFactorCode == "000000" || twoFactorCode == "") { resp.Code = Models.FUTErrorCode.TwoFactorFailed; resp.Message = "Couldn't get twoFactorCode"; return(resp); } await Task.Delay(2000).ConfigureAwait(false); loggedIn = await FillInTwoFactorAsync(loggedIn.RequestMessage.RequestUri.AbsoluteUri, twoFactorCode).ConfigureAwait(false); loggedInString = await loggedIn.Content.ReadAsStringAsync().ConfigureAwait(false); } if (loggedInString.Contains("Eingegebener Code nicht korrekt")) { resp.Code = FUTErrorCode.WrongEMailCode; resp.Message = "Wrong email code!"; return(resp); } if (!loggedIn.RequestMessage.RequestUri.AbsoluteUri.Contains("auth.html")) { resp.Code = Models.FUTErrorCode.NoRedirectToWebApp; resp.Message = "No redirect to mobile-app"; return(resp); } UpdateStatistic("Grabbing EASW ID..."); var authCode = loggedIn.RequestMessage.RequestUri.Query.Remove(0, 6); var tmpBearer = await GetBearerAuthCodeAsync(authCode); var bearer = Regex.Match(tmpBearer, "\"access_token\" : \"(.*?)\",").Groups[1].Value; var easw = await GetEaswAsync(bearer); var easwID = easw.pid.pidId.ToString(); if (string.IsNullOrEmpty(easwID)) { CookieManager.DeleteCookieContainer(FUTAccount, false); resp.Code = Models.FUTErrorCode.NoEaswID; resp.Message = "No easwID"; return(resp); } resp.NucleusID = easwID; HttpClient.AddRequestHeader(NonStandardHttpHeaders.NucleusId, easwID); HttpClient.AddRequestHeader(NonStandardHttpHeaders.EmbedError, "true"); UpdateStatistic("Grabbing Shards..."); var shards = await IsServerOnline(); if (!shards) { resp.Code = Models.FUTErrorCode.ServerMaintenance;; resp.Message = "Server offline"; return(resp); } HttpClient.AddRequestHeader(NonStandardHttpHeaders.SessionId, ""); UpdateStatistic("Grabbing UserAccounts..."); var userAccounts = await BruteforcePlatformAsync().ConfigureAwait(false); if (userAccounts == null || userAccounts.userAccountInfo == null || userAccounts.userAccountInfo.personas == null || userAccounts.userAccountInfo.personas.FirstOrDefault() == null) { resp.Code = Models.FUTErrorCode.NoUserAccounts; resp.Message = "No userAccounts"; return(resp); } var nucleusName = userAccounts.userAccountInfo.personas.FirstOrDefault().personaName; var personaID = userAccounts.userAccountInfo.personas.FirstOrDefault().personaId.ToString(); resp.NucleusName = nucleusName; resp.PersonaID = personaID; authCode = await GetAuthCodeAsync(bearer); authCode = Regex.Match(authCode, "{\"code\":\"(.*?)\"}").Groups[1].Value; if (string.IsNullOrEmpty(authCode)) { resp.Code = Models.FUTErrorCode.NoSessionID; resp.Message = "No authCode"; return(resp); } UpdateStatistic("Authing on Utas..."); var authed = await AuthAsync(authCode, personaID).ConfigureAwait(false); if (authed == null || string.IsNullOrEmpty(authed.sid)) { resp.Code = Models.FUTErrorCode.NoSessionID; resp.Message = "No sid"; return(resp); } resp.SessionID = authed.sid; HttpClient.AddRequestHeader(NonStandardHttpHeaders.SessionId, authed.sid); await Task.Delay(3000).ConfigureAwait(false); UpdateStatistic("Grabbing SecurityQuestion..."); var question = await QuestionAsync().ConfigureAwait(false); if (question.Code == FUTErrorCode.CaptchaTriggered || question.Code == FUTErrorCode.CaptchaTriggered2) { var futproxy = FUTAccount.GetFUTProxy(); var solver = new CaptchaSolver(futproxy); var result = await solver.DoAntiCaptcha(); if (result.errorId == 0) { await SolveCaptchaAsync(result.solution.token); question = await QuestionAsync().ConfigureAwait(false); } else { resp.Code = Models.FUTErrorCode.CaptchaException; resp.Message = "Captcha failed! " + result.errorDescription; return(resp); } } if (!string.IsNullOrEmpty(question.token)) { HttpClient.AddRequestHeader(NonStandardHttpHeaders.PhishingToken, question.token); resp.PhishingToken = question.token; HttpClient.RemoveRequestHeader(NonStandardHttpHeaders.NucleusId); HttpClient.RemoveRequestHeader(NonStandardHttpHeaders.Route); CollectAllCookies(); return(resp); } UpdateStatistic("Validating SecurityQuestion..."); var validate = await ValidateAsync().ConfigureAwait(false); if (string.IsNullOrEmpty(validate?.token)) { if (validate.code == "461") { resp.Code = Models.FUTErrorCode.WrongSecurityAnswer; resp.Message = "Wrong SecurityAnswer"; return(resp); } resp.Code = Models.FUTErrorCode.NoPhishingToken; resp.Message = "No phishingtoken"; return(resp); } //await QuestionAsync().ConfigureAwait(false); UpdateStatistic("Login success..."); HttpClient.AddRequestHeader(NonStandardHttpHeaders.PhishingToken, validate.token); resp.PhishingToken = validate.token; HttpClient.RemoveRequestHeader(NonStandardHttpHeaders.Route); CollectAllCookies(); return(resp); } catch (Exception e) { var resp = new LoginResponse(); resp.Message = e.ToString(); resp.Code = FUTErrorCode.BadRequest; return(resp); } }