diff --git a/src/bank-lib/bank_api_history.c b/src/bank-lib/bank_api_history.c index 902165def..fa53a5bba 100644 --- a/src/bank-lib/bank_api_history.c +++ b/src/bank-lib/bank_api_history.c @@ -78,6 +78,7 @@ parse_account_history (struct TALER_BANK_HistoryHandle *hh, const json_t *history) { json_t *history_array; + char *bank_hostname; if (NULL == (history_array = json_object_get (history, "data"))) { @@ -136,11 +137,17 @@ parse_account_history (struct TALER_BANK_HistoryHandle *hh, GNUNET_JSON_parse_free (hist_spec); return GNUNET_SYSERR; } + /* Note, bank_base_url has _always_ the protocol scheme + * and it proved to be good at this point. */ + bank_hostname = strchr (hh->bank_base_url, ':'); + GNUNET_assert (NULL != bank_hostname); + bank_hostname += 3; + GNUNET_asprintf (&td.account_url, - ('/' == hh->bank_base_url[strlen(hh->bank_base_url)-1]) + ('/' == bank_hostname[strlen(bank_hostname)-1]) ? "payto://x-taler-bank/%s%llu" : "payto://x-taler-bank/%s/%llu", - hh->bank_base_url, + bank_hostname, (unsigned long long) other_account); hh->hcb (hh->hcb_cls, MHD_HTTP_OK, diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index 6761cb519..2a8164684 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -960,6 +960,8 @@ handle_mhd_request (void *cls, /* Unexpected URL path, just close the connection. */ /* we're rather impolite here, but it's a testcase. */ + TALER_LOG_ERROR ("Breaking URL: %s\n", + url); GNUNET_break_op (0); return MHD_NO; } diff --git a/src/bank-lib/test_bank_interpreter.c b/src/bank-lib/test_bank_interpreter.c index e503bd8dc..fe6b4e1a2 100644 --- a/src/bank-lib/test_bank_interpreter.c +++ b/src/bank-lib/test_bank_interpreter.c @@ -328,7 +328,7 @@ build_history (struct InterpreterState *is, h[total].direction |= TALER_BANK_DIRECTION_CANCEL; GNUNET_asprintf (&h[total].details.account_url, "payto://x-taler-bank/%s/%llu", - "http://localhost:8080", + "localhost:8080", (unsigned long long) pos->details.admin_add_incoming.debit_account_no); } if ( (0 != (cmd->details.history.direction & TALER_BANK_DIRECTION_DEBIT)) && @@ -340,7 +340,7 @@ build_history (struct InterpreterState *is, h[total].direction |= TALER_BANK_DIRECTION_CANCEL; GNUNET_asprintf (&h[total].details.account_url, "payto://x-taler-bank/%s/%llu", - "http://localhost:8080", + "localhost:8080", (unsigned long long) pos->details.admin_add_incoming.credit_account_no); } if ( ( (0 != (cmd->details.history.direction & TALER_BANK_DIRECTION_CREDIT)) && diff --git a/src/bank-lib/testing_api_cmd_history.c b/src/bank-lib/testing_api_cmd_history.c index fa5e87395..c9f4960e7 100644 --- a/src/bank-lib/testing_api_cmd_history.c +++ b/src/bank-lib/testing_api_cmd_history.c @@ -380,6 +380,9 @@ build_history (struct TALER_TESTING_Interpreter *is, const struct TALER_TESTING_Command *pos = &is->commands[off]; int cancelled; const uint64_t *row_id; + char *bank_hostname; + const uint64_t *credit_account_no; + const uint64_t *debit_account_no; if (GNUNET_OK != TALER_TESTING_GET_TRAIT_ROW_ID (pos, &row_id)) @@ -408,8 +411,6 @@ build_history (struct TALER_TESTING_Interpreter *is, TALER_LOG_INFO ("hit limit specified by command\n"); break; } - const uint64_t *credit_account_no; - const uint64_t *debit_account_no; GNUNET_assert (GNUNET_OK == TALER_TESTING_GET_TRAIT_CREDIT_ACCOUNT @@ -444,6 +445,10 @@ build_history (struct TALER_TESTING_Interpreter *is, continue; } + bank_hostname = strchr (hs->bank_url, ':'); + GNUNET_assert (NULL != bank_hostname); + bank_hostname += 3; + if ( (0 != (hs->direction & TALER_BANK_DIRECTION_CREDIT)) && (hs->account_no == *credit_account_no)) { @@ -453,10 +458,10 @@ build_history (struct TALER_TESTING_Interpreter *is, GNUNET_asprintf (&h[total].details.account_url, - ('/' == hs->bank_url[strlen(hs->bank_url) -1]) + ('/' == bank_hostname[strlen(bank_hostname) -1]) ? "payto://x-taler-bank/%s%llu" : "payto://x-taler-bank/%s/%llu", - hs->bank_url, + bank_hostname, (unsigned long long) *debit_account_no); } if ( (0 != (hs->direction & TALER_BANK_DIRECTION_DEBIT)) && @@ -468,10 +473,10 @@ build_history (struct TALER_TESTING_Interpreter *is, GNUNET_asprintf (&h[total].details.account_url, - ('/' == hs->bank_url[strlen(hs->bank_url) -1]) + ('/' == bank_hostname[strlen(bank_hostname) -1]) ? "payto://x-taler-bank/%s%llu" : "payto://x-taler-bank/%s/%llu", - hs->bank_url, + bank_hostname, (unsigned long long) *credit_account_no); } if ( ( (0 != (hs->direction & TALER_BANK_DIRECTION_CREDIT)) && diff --git a/src/wire-plugins/plugin_wire_taler-bank.c b/src/wire-plugins/plugin_wire_taler-bank.c index 4d2d9be0f..0954fd882 100644 --- a/src/wire-plugins/plugin_wire_taler-bank.c +++ b/src/wire-plugins/plugin_wire_taler-bank.c @@ -978,6 +978,9 @@ taler_bank_get_history (void *cls, const uint64_t *start_off_b64; uint64_t start_row; struct Account account; + char *bank_base_url; + char *p; + long long unsigned port; if (0 == num_results) { @@ -1029,8 +1032,40 @@ taler_bank_get_history (void *cls, whh->hres_cb = hres_cb; whh->hres_cb_cls = hres_cb_cls; + + if (NULL != (p = strchr (account.hostname, + (unsigned char) ':'))) + { + p++; + if (1 != sscanf (p, + "%llu", + &port)) + { + GNUNET_break (0); + TALER_LOG_ERROR ("Malformed host from payto:// URI\n"); + return NULL; + } + } + + if (443 != port) + { + GNUNET_assert + (GNUNET_SYSERR != GNUNET_asprintf + (&bank_base_url, + "http://%s", + account.hostname)); + } + else + { + GNUNET_assert + (GNUNET_SYSERR != GNUNET_asprintf + (&bank_base_url, + "https://%s", + account.hostname)); + } + whh->hh = TALER_BANK_history (tc->ctx, - account.hostname, + bank_base_url, &whh->auth, (uint64_t) account.no, direction,