diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/taler-merchant-httpd_exchanges.c | 143 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_post-orders-ID-abort.c | 4 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_post-orders-ID-claim.c | 11 |
3 files changed, 95 insertions, 63 deletions
diff --git a/src/backend/taler-merchant-httpd_exchanges.c b/src/backend/taler-merchant-httpd_exchanges.c index f874bb99..ef5bde94 100644 --- a/src/backend/taler-merchant-httpd_exchanges.c +++ b/src/backend/taler-merchant-httpd_exchanges.c @@ -22,6 +22,7 @@ #include "platform.h" #include <taler/taler_json_lib.h> #include "taler-merchant-httpd_exchanges.h" +#include "taler-merchant-httpd.h" /** @@ -727,6 +728,70 @@ wire_task_cb (void *cls) /** + * We failed downloading /keys from @a exchange. Tell clients + * about our failure, abort pending operations and retry later. + * + * @param exchange exchange that failed + * @param hr details about the HTTP reply + * @param compat version compatibility data + */ +static void +fail_and_retry (struct Exchange *exchange, + const struct TALER_EXCHANGE_HttpResponse *hr, + enum TALER_EXCHANGE_VersionCompatibility compat) +{ + struct TMH_EXCHANGES_FindOperation *fo; + + exchange->pending = GNUNET_YES; + if (NULL != exchange->wire_request) + { + TALER_EXCHANGE_wire_cancel (exchange->wire_request); + exchange->wire_request = NULL; + } + if (NULL != exchange->wire_task) + { + GNUNET_SCHEDULER_cancel (exchange->wire_task); + exchange->wire_task = NULL; + } + while (NULL != (fo = exchange->fo_head)) + { + fo->fc (fo->fc_cls, + hr, + NULL, + NULL, + GNUNET_NO); + TMH_EXCHANGES_find_exchange_cancel (fo); + } + if (TALER_EXCHANGE_VC_INCOMPATIBLE_NEWER == compat) + { + /* Log hard error: we likely need admin help! */ + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Exchange `%s' runs an incompatible more recent version of the Taler protocol. Will not retry. This client may need to be updated.\n", + exchange->url); + /* Theoretically, the exchange could downgrade, + but let's not be too aggressive about retries + on this one. */ + exchange->retry_delay = GNUNET_TIME_relative_max (GNUNET_TIME_UNIT_HOURS, + exchange->retry_delay); + } + exchange->retry_delay = RETRY_BACKOFF (exchange->retry_delay); + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Failed to fetch /keys from `%s': %d/%u, retrying in %s\n", + exchange->url, + (int) hr->ec, + hr->http_status, + GNUNET_STRINGS_relative_time_to_string (exchange->retry_delay, + GNUNET_YES)); + GNUNET_assert (NULL == exchange->retry_task); + exchange->first_retry = GNUNET_TIME_relative_to_absolute ( + exchange->retry_delay); + exchange->retry_task = GNUNET_SCHEDULER_add_delayed (exchange->retry_delay, + &retry_exchange, + exchange); +} + + +/** * Function called with information about who is auditing * a particular exchange and what key the exchange is using. * @@ -754,54 +819,9 @@ keys_mgmt_cb (void *cls, if (NULL == keys) { - struct TMH_EXCHANGES_FindOperation *fo; - - exchange->pending = GNUNET_YES; - if (NULL != exchange->wire_request) - { - TALER_EXCHANGE_wire_cancel (exchange->wire_request); - exchange->wire_request = NULL; - } - if (NULL != exchange->wire_task) - { - GNUNET_SCHEDULER_cancel (exchange->wire_task); - exchange->wire_task = NULL; - } - while (NULL != (fo = exchange->fo_head)) - { - fo->fc (fo->fc_cls, - hr, - NULL, - NULL, - GNUNET_NO); - TMH_EXCHANGES_find_exchange_cancel (fo); - } - if (TALER_EXCHANGE_VC_INCOMPATIBLE_NEWER == compat) - { - /* Log hard error: we likely need admin help! */ - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Exchange `%s' runs an incompatible more recent version of the Taler protocol. Will not retry. This client may need to be updated.\n", - exchange->url); - /* Theoretically, the exchange could downgrade, - but let's not be too aggressive about retries - on this one. */ - exchange->retry_delay = GNUNET_TIME_relative_max (GNUNET_TIME_UNIT_HOURS, - exchange->retry_delay); - } - exchange->retry_delay = RETRY_BACKOFF (exchange->retry_delay); - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Failed to fetch /keys from `%s': %d/%u, retrying in %s\n", - exchange->url, - (int) hr->ec, - hr->http_status, - GNUNET_STRINGS_relative_time_to_string (exchange->retry_delay, - GNUNET_YES)); - GNUNET_assert (NULL == exchange->retry_task); - exchange->first_retry = GNUNET_TIME_relative_to_absolute ( - exchange->retry_delay); - exchange->retry_task = GNUNET_SCHEDULER_add_delayed (exchange->retry_delay, - &retry_exchange, - exchange); + fail_and_retry (exchange, + hr, + compat); return; } if ( (GNUNET_YES == exchange->trusted) && @@ -830,8 +850,31 @@ keys_mgmt_cb (void *cls, exchange->url); } } - // FIXME: go over keys->sign_keys and STORE - // all of those into our database! + + /* store exchange online signing keys in our DB */ + for (unsigned int i = 0; i<keys->num_sign_keys; i++) + { + struct TALER_EXCHANGE_SigningPublicKey *sign_key = &keys->sign_keys[i]; + enum GNUNET_DB_QueryStatus qs; + + TMH_db->preflight (TMH_db->cls); + qs = TMH_db->insert_exchange_signkey (TMH_db->cls, + &keys->master_pub, + &sign_key->key, + sign_key->valid_from, + sign_key->valid_until, + sign_key->valid_legal, + &sign_key->master_sig); + /* 0 is OK, we may already have the key in the DB! */ + if (0 > qs) + { + GNUNET_break (0); + fail_and_retry (exchange, + hr, + compat); + return; + } + } expire = TALER_EXCHANGE_check_keys_current (exchange->conn, GNUNET_NO, diff --git a/src/backend/taler-merchant-httpd_post-orders-ID-abort.c b/src/backend/taler-merchant-httpd_post-orders-ID-abort.c index 08773a7d..4c7960ef 100644 --- a/src/backend/taler-merchant-httpd_post-orders-ID-abort.c +++ b/src/backend/taler-merchant-httpd_post-orders-ID-abort.c @@ -741,7 +741,7 @@ begin_transaction (struct AbortContext *ac) /* Payment is complete, refuse to abort. */ TMH_db->rollback (TMH_db->cls); resume_abort_with_error (ac, - MHD_HTTP_FORBIDDEN, + MHD_HTTP_PRECONDITION_FAILED, TALER_EC_ABORT_REFUND_REFUSED_PAYMENT_COMPLETE, "Payment was complete, refusing to abort"); return; @@ -753,7 +753,7 @@ begin_transaction (struct AbortContext *ac) { GNUNET_break_op (0); resume_abort_with_error (ac, - MHD_HTTP_BAD_REQUEST, + MHD_HTTP_FORBIDDEN, TALER_EC_ABORT_CONTRACT_HASH_MISSMATCH, "Provided hash does not match order on file"); return; diff --git a/src/backend/taler-merchant-httpd_post-orders-ID-claim.c b/src/backend/taler-merchant-httpd_post-orders-ID-claim.c index 17ef0138..80c178ba 100644 --- a/src/backend/taler-merchant-httpd_post-orders-ID-claim.c +++ b/src/backend/taler-merchant-httpd_post-orders-ID-claim.c @@ -103,17 +103,6 @@ claim_order (const char *instance_id, *contract_terms = NULL; return qs; } - qs = TMH_db->delete_order (TMH_db->cls, - instance_id, - order_id); - if (0 >= qs) - { - GNUNET_break (0); - TMH_db->rollback (TMH_db->cls); - json_decref (*contract_terms); - *contract_terms = NULL; - return qs; - } qs = TMH_db->commit (TMH_db->cls); if (0 > qs) return qs; |