public async Task <LoginResult> LoginAsync(string userIdentifier, BankLogin bankLogin) { try { var credentials = BankStatementsUtil.FormatCredentials(bankLogin, await InstitutionsAsync().ConfigureAwait(false)); var policy = Policy .Handle <FlurlHttpTimeoutException>() .RetryAsync(3, (exception, retryCount) => { Trace.TraceWarning(exception.ToString(), "BankStatement login timed out {RetryCount} times", retryCount); }); string refcode = CreateReferralCode(userIdentifier); var response = await policy.ExecuteAsync(() => (_configuration.ApiUrl + "/login") .WithHeader("X-API-KEY", _configuration.ApiKey) .WithHeader("REFERRAL-CODE", refcode) .WithHeader("Accept", "application/json") .PostJsonAsync(new { silent = 0, async = 0, credentials }).ReceiveString()).ConfigureAwait(false); var loginResponse = JsonConvert.DeserializeObject <LoginResponse>(response); loginResponse.ReferralCode = refcode; return(new LoginResult(BankStatementResponseType.LoginSuccess, loginResponse)); } catch (FlurlHttpException ex) { Trace.TraceWarning("Failed to login to bank statements for " + userIdentifier); if (ex.Call.Response == null) { throw; } var response = await ex.Call?.Response.Content.ReadAsStringAsync(); if (response == null) { return(new LoginResult(BankStatementResponseType.Failed, ex.GetInnerMostException()?.Message)); } var error = JsonConvert.DeserializeObject <BankStatementError>(response); if (error.IsInvalidLogin()) { return(new LoginResult( BankStatementResponseType.InvalidLogin, error.Error)); } return(new LoginResult(BankStatementResponseType.Failed, response)); } }
public void Format_credentials_adds_institution() { var assembly = Assembly.GetExecutingAssembly(); var resourceName = "Vita.Domain.Tests.BankStatements.bankstatements-institutions.json"; var names = assembly.GetManifestResourceNames(); foreach (var name in names) { Console.WriteLine(name); } using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); var dic = new Dictionary <string, string> { { "customer registration number", SecretMan.Get("bankstatements-cba-test-username") }, { "password", SecretMan.Get("bankstatements-cba-test-password") } }; var login = new BankLogin("anz", dic); var data = JsonConvert.DeserializeObject <Institution[]>(result); var creds = BankStatementsUtil.FormatCredentials(login, data); Assert.True(creds.ContainsKey("institution")); } }
public async Task Login_with_bad_bank_will_return_failed_response() { var bsLogin = new BankLogin("bad", "username", "wrong", "password", "wrong"); var loginResult = await Service.LoginAsync("test", bsLogin); loginResult.ResponseType.Should().Be(BankStatementResponseType.Failed); loginResult.Error.Should().NotBeNullOrEmpty(); }
public async Task Login_invalid_will_return_invalid_login_response() { var bsLogin = new BankLogin("bank_of_statements", "username", "wrong", "password", "wrong"); var loginResult = await Service.LoginAsync("test", bsLogin); loginResult.ResponseType.Should().Be(BankStatementResponseType.InvalidLogin); loginResult.Error.Should().NotBeNullOrEmpty(); }
public override async Task ExecuteAsync(BankStatementAggregate aggregate, ExtractBankStatement1Command command, CancellationToken cancellationToken) { //TODO extract bank statements var bankName = "anz"; var anz = new BankLogin("anz", "username", Environment.GetEnvironmentVariable("bankstatements-anz-cdm-username"), "password", Environment.GetEnvironmentVariable("bankstatements-anz-cdm-password")); var test = new BankLogin("bank_of_statements", "username", "12345678", "password", "TestMyMoney"); BankLogin bank; switch (bankName) { case "anz": bank = anz; break; default: // bank = test; bank = anz; break; } var result = await _bankStatementService.LoginFetchAllAsync(bankName, bank); var requests = result.ToPredictionRequests().ToArray(); if (requests.Any(x => x == null)) { throw new ApplicationException(); } if (requests.Any(x => string.IsNullOrEmpty(x.Description))) { throw new ApplicationException(); } try { await aggregate.ExtractBankStatementAsync(command, requests); } catch (Exception e) { Console.WriteLine(e); throw; } }
public static IDictionary <string, string> FormatCredentials(BankLogin bankLogin, IEnumerable <Institution> insitutions) { if (insitutions != null) { var bank = insitutions.Where(x => x.Slug.ToLowerInvariant() == bankLogin.Slug.ToLowerInvariant()); var bankRequiredCredentials = bank.SelectMany(b => b.Credentials).ToList(); var copy = bankLogin.Credentials.Where(x => !string.IsNullOrEmpty(x.Value)).ToList(); foreach (var credential in copy) { if (!string.IsNullOrEmpty(credential.Key) || (!string.IsNullOrEmpty(credential.Value))) { var fieldId = bankRequiredCredentials.SingleOrDefault( x => String.Equals(x.Name, credential.Key, StringComparison.InvariantCultureIgnoreCase)); if (fieldId != null) { // use the field id to send across to the bank bankLogin.Credentials[fieldId.FieldId] = credential.Value; // field ID needs to be passed over to bank statments } else { if (!bankLogin.Credentials.ContainsKey(credential.Key.ToLowerInvariant())) { bankLogin.Credentials.Add(credential.Key.ToLowerInvariant(), credential.Value); } } } } } if (!bankLogin.Credentials.ContainsKey("institution")) { bankLogin.Credentials["institution"] = bankLogin.Slug;// needs this here for some reason } return(bankLogin.Credentials); }
public async Task <BankStatementDownload> LoginFetchAllAsync(string userIdentifier, BankLogin bankLogin) { try { var credentials = BankStatementsUtil.FormatCredentials(bankLogin, await InstitutionsAsync().ConfigureAwait(false)); var policy = Policy .Handle <FlurlHttpTimeoutException>() .RetryAsync(3, (exception, retryCount) => { Trace.TraceWarning(exception.ToString(), "BankStatement download timed out {RetryCount} times", retryCount); }); var response = await policy.ExecuteAsync(() => (_configuration.ApiUrl + "/login_fetch_all") .WithHeader("X-API-KEY", _configuration.ApiKey) .WithHeader("REFERRAL-CODE", CreateReferralCode(userIdentifier)) .WithHeader("Accept", "application/json") .PostJsonAsync(new { silent = 0, async = 0, credentials }).ReceiveString()); return(new BankStatementDownload(response)); } catch (FlurlHttpException ex) { Debug.Write(ex, "Failed to download bank statement"); if (ex.Call.Response == null) { throw; } var response = ex.Call.Exception.Message; if (response == null) { return(BankStatementDownload.Errored(new BankStatementError { Error = "Empty response from bs.com", ReferralCode = userIdentifier })); } var deserializer = new XmlSerializer(typeof(BankStatementError)); var reader = new StringReader(response); var error = (BankStatementError)deserializer.Deserialize(reader); return(BankStatementDownload.Errored(error)); } }