summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/taler-merchant-httpd_exchanges.c143
-rw-r--r--src/backend/taler-merchant-httpd_post-orders-ID-abort.c4
-rw-r--r--src/backend/taler-merchant-httpd_post-orders-ID-claim.c11
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;