示例#1
0
        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));
            }
        }
示例#2
0
        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"));
                }
        }
示例#3
0
        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();
        }
示例#4
0
        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();
        }
示例#5
0
        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;
            }
        }
示例#6
0
        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);
        }
示例#7
0
        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));
            }
        }