summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/Makefile.am2
-rw-r--r--src/backend/taler-merchant-httpd.c77
-rw-r--r--src/backend/taler-merchant-httpd_private-delete-instances-ID.c1
-rw-r--r--src/backend/taler-merchant-httpd_private-delete-products-ID.c6
-rw-r--r--src/backend/taler-merchant-httpd_private-get-instances-ID.c2
-rw-r--r--src/backend/taler-merchant-httpd_private-patch-instances-ID.c16
-rw-r--r--src/backend/taler-merchant-httpd_private-post-instances.c2
7 files changed, 67 insertions, 39 deletions
diff --git a/src/backend/Makefile.am b/src/backend/Makefile.am
index 58f11ed9..e367949c 100644
--- a/src/backend/Makefile.am
+++ b/src/backend/Makefile.am
@@ -25,6 +25,8 @@ taler_merchant_httpd_SOURCES = \
taler-merchant-httpd_mhd.c taler-merchant-httpd_mhd.h \
taler-merchant-httpd_private-delete-instances-ID.c \
taler-merchant-httpd_private-delete-instances-ID.h \
+ taler-merchant-httpd_private-delete-products-ID.c \
+ taler-merchant-httpd_private-delete-products-ID.h \
taler-merchant-httpd_private-get-instances.c \
taler-merchant-httpd_private-get-instances.h \
taler-merchant-httpd_private-get-instances-ID.c \
diff --git a/src/backend/taler-merchant-httpd.c b/src/backend/taler-merchant-httpd.c
index d5bcec60..90d76811 100644
--- a/src/backend/taler-merchant-httpd.c
+++ b/src/backend/taler-merchant-httpd.c
@@ -37,6 +37,7 @@
#include "taler-merchant-httpd_private-patch-instances-ID.h"
#include "taler-merchant-httpd_private-patch-products-ID.h"
#include "taler-merchant-httpd_private-post-instances.h"
+#include "taler-merchant-httpd_private-post-products.h"
#include "taler-merchant-httpd_private-post-products-ID-lock.h"
/**
@@ -124,10 +125,18 @@ void
TMH_instance_decref (struct TMH_MerchantInstance *mi)
{
struct TMH_WireMethod *wm;
+ struct GNUNET_HashCode h_instance;
mi->rc--;
if (0 != mi->rc)
return;
+ GNUNET_CRYPTO_hash (mi->settings.id,
+ strlen (mi->settings.id),
+ &h_instance);
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONTAINER_multihashmap_remove (TMH_by_id_map,
+ &h_instance,
+ mi));
while (NULL != (wm = (mi->wm_head)))
{
GNUNET_CONTAINER_DLL_remove (mi->wm_head,
@@ -713,25 +722,6 @@ url_handler (void *cls,
void **con_cls)
{
static struct TMH_RequestHandler private_handlers[] = {
- /* GET /: */
- {
- .url_prefix = "/",
- .method = MHD_HTTP_METHOD_GET,
- .mime_type = "text/plain",
- .skip_instance = true,
- .data = "This is a GNU Taler merchant backend. See https://taler.net/.\n",
- .data_size = strlen (
- "This is a GNU Taler merchant backend. See https://taler.net/.\n"),
- .handler = &TMH_MHD_handler_static_response,
- .response_code = MHD_HTTP_OK
- },
- /* GET /agpl: */
- {
- .url_prefix = "/agpl",
- .method = MHD_HTTP_METHOD_GET,
- .skip_instance = true,
- .handler = &TMH_MHD_handler_agpl_redirect
- },
/* GET /instances: */
{
.url_prefix = "/instances",
@@ -770,30 +760,36 @@ url_handler (void *cls,
.method = MHD_HTTP_METHOD_GET,
.handler = &TMH_private_get_products
},
- /* GET /products/$ID/: */
+ /* POST /products: */
{
.url_prefix = "/products",
+ .method = MHD_HTTP_METHOD_POST,
+ .handler = &TMH_private_post_products
+ },
+ /* GET /products/$ID/: */
+ {
+ .url_prefix = "/products/",
.method = MHD_HTTP_METHOD_GET,
.have_id_segment = true,
- .handler = &TMH_private_get_instances_ID
+ .handler = &TMH_private_get_products_ID
},
/* DELETE /products/$ID/: */
{
- .url_prefix = "/products",
+ .url_prefix = "/products/",
.method = MHD_HTTP_METHOD_DELETE,
.have_id_segment = true,
- .handler = &TMH_private_delete_instances_ID
+ .handler = &TMH_private_delete_products_ID
},
/* PATCH /products/$ID/: */
{
- .url_prefix = "/products",
+ .url_prefix = "/products/",
.method = MHD_HTTP_METHOD_PATCH,
.have_id_segment = true,
.handler = &TMH_private_patch_products_ID
},
/* POST /products/$ID/lock: */
{
- .url_prefix = "/products",
+ .url_prefix = "/products/",
.url_suffix = "lock",
.method = MHD_HTTP_METHOD_POST,
.have_id_segment = true,
@@ -840,6 +836,7 @@ url_handler (void *cls,
};
struct TMH_HandlerContext *hc = *con_cls;
struct TMH_RequestHandler *handlers;
+ bool use_private = false;
(void) cls;
(void) version;
@@ -904,6 +901,18 @@ url_handler (void *cls,
MHD_HTTP_METHOD_HEAD))
method = MHD_HTTP_METHOD_GET; /* MHD will deal with the rest */
+ {
+ const char *private_prefix = "/private/";
+
+ if (0 == strncmp (url,
+ private_prefix,
+ strlen (private_prefix)))
+ {
+ use_private = true;
+ url += strlen (private_prefix) - 1;
+ }
+ }
+
/* Find out the merchant backend instance for the request.
* If there is an instance, remove the instance specification
* from the beginning of the request URL. */
@@ -920,16 +929,16 @@ url_handler (void *cls,
char *instance_id;
if (NULL == slash)
- {
- return TMH_MHD_handler_static_response (&h404,
- connection,
- hc);
- }
- instance_id = GNUNET_strndup (istart,
- slash - istart);
+ instance_id = GNUNET_strdup (istart);
+ else
+ instance_id = GNUNET_strndup (istart,
+ slash - istart);
hc->instance = TMH_lookup_instance (instance_id);
GNUNET_free (instance_id);
- url = slash;
+ if (NULL == slash)
+ url = "";
+ else
+ url = slash;
}
else
{
@@ -950,7 +959,7 @@ url_handler (void *cls,
}
else
{
- handlers = public_handlers;
+ handlers = (use_private) ? private_handlers : public_handlers;
}
}
if (0 == strcmp (url,
diff --git a/src/backend/taler-merchant-httpd_private-delete-instances-ID.c b/src/backend/taler-merchant-httpd_private-delete-instances-ID.c
index 2807318e..965de327 100644
--- a/src/backend/taler-merchant-httpd_private-delete-instances-ID.c
+++ b/src/backend/taler-merchant-httpd_private-delete-instances-ID.c
@@ -75,6 +75,7 @@ TMH_private_delete_instances_ID (const struct TMH_RequestHandler *rh,
? "Instance unknown"
: "Private key unknown");
case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+ TMH_instance_decref (mi);
return TALER_MHD_reply_static (connection,
MHD_HTTP_NO_CONTENT,
NULL,
diff --git a/src/backend/taler-merchant-httpd_private-delete-products-ID.c b/src/backend/taler-merchant-httpd_private-delete-products-ID.c
index 995d4221..fe04d765 100644
--- a/src/backend/taler-merchant-httpd_private-delete-products-ID.c
+++ b/src/backend/taler-merchant-httpd_private-delete-products-ID.c
@@ -48,7 +48,7 @@ TMH_private_delete_products_ID (const struct TMH_RequestHandler *rh,
case GNUNET_DB_STATUS_HARD_ERROR:
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_DELETE_PRODUCTS_ID_DB_HARD_FAILURE,
+ TALER_EC_PRODUCTS_DELETE_DB_HARD_FAILURE,
"Transaction failed");
case GNUNET_DB_STATUS_SOFT_ERROR:
GNUNET_break (0);
@@ -64,11 +64,11 @@ TMH_private_delete_products_ID (const struct TMH_RequestHandler *rh,
if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
- TALER_EC_DELETE_PRODUCTS_NO_SUCH_PRODUCT,
+ TALER_EC_PRODUCTS_DELETE_NO_SUCH_PRODUCT,
"Product unknown");
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_CONFLICT,
- TALER_EC_DELETE_PRODUCTS_CONFLICTING_LOCK,
+ TALER_EC_PRODUCTS_DELETE_CONFLICTING_LOCK,
"Product deletion impossible, product is locked");
case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
return TALER_MHD_reply_static (connection,
diff --git a/src/backend/taler-merchant-httpd_private-get-instances-ID.c b/src/backend/taler-merchant-httpd_private-get-instances-ID.c
index c379bfa3..b6993791 100644
--- a/src/backend/taler-merchant-httpd_private-get-instances-ID.c
+++ b/src/backend/taler-merchant-httpd_private-get-instances-ID.c
@@ -89,7 +89,7 @@ TMH_private_get_instances_ID (const struct TMH_RequestHandler *rh,
&mi->settings.default_max_wire_fee),
"default_wire_fee_amortization",
(json_int_t)
- &mi->settings.default_wire_fee_amortization,
+ mi->settings.default_wire_fee_amortization,
"default_wire_transfer_delay",
GNUNET_JSON_from_time_rel (
mi->settings.default_wire_transfer_delay),
diff --git a/src/backend/taler-merchant-httpd_private-patch-instances-ID.c b/src/backend/taler-merchant-httpd_private-patch-instances-ID.c
index 9e151493..a4104b05 100644
--- a/src/backend/taler-merchant-httpd_private-patch-instances-ID.c
+++ b/src/backend/taler-merchant-httpd_private-patch-instances-ID.c
@@ -179,6 +179,9 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh,
bool matches[GNUNET_NZL (len)];
bool matched;
+ memset (matches,
+ 0,
+ sizeof (matches));
for (struct TMH_WireMethod *wm = mi->wm_head;
NULL != wm;
wm = wm->next)
@@ -225,6 +228,9 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh,
if (! matched)
{
/* Account was REMOVED */
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Existing account `%s' not found, inactivating it.\n",
+ uri);
wm->deleting = true;
qs = TMH_db->inactivate_account (TMH_db->cls,
&wm->h_wire);
@@ -249,11 +255,14 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh,
ad.payto_uri = json_string_value (json_array_get (payto_uris,
i));
GNUNET_assert (NULL != ad.payto_uri);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Adding NEW account `%s'\n",
+ ad.payto_uri);
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE,
&ad.salt,
sizeof (ad.salt));
wm = GNUNET_new (struct TMH_WireMethod);
- wm->j_wire = json_pack ("{s:O, s:s}",
+ wm->j_wire = json_pack ("{s:s, s:o}",
"payto_uri", ad.payto_uri,
"salt", GNUNET_JSON_from_data_auto (&ad.salt));
GNUNET_assert (NULL != wm->j_wire);
@@ -265,6 +274,7 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh,
TALER_JSON_merchant_wire_signature_hash (wm->j_wire,
&wm->h_wire))
{
+ GNUNET_break_op (0);
free_wm (wm);
while (NULL != (wm = wm_head))
{
@@ -338,8 +348,12 @@ giveup:
/* Update our 'settings' */
GNUNET_free (mi->settings.name);
+ json_decref (mi->settings.address);
+ json_decref (mi->settings.jurisdiction);
is.id = mi->settings.id;
mi->settings = is;
+ mi->settings.address = json_incref (mi->settings.address);
+ mi->settings.jurisdiction = json_incref (mi->settings.jurisdiction);
mi->settings.name = GNUNET_strdup (name);
/* Add 'new' wire methods to our list */
diff --git a/src/backend/taler-merchant-httpd_private-post-instances.c b/src/backend/taler-merchant-httpd_private-post-instances.c
index 609753f1..2bfce6ba 100644
--- a/src/backend/taler-merchant-httpd_private-post-instances.c
+++ b/src/backend/taler-merchant-httpd_private-post-instances.c
@@ -339,6 +339,8 @@ TMH_private_post_instances (const struct TMH_RequestHandler *rh,
mi->wm_head = wm_head;
mi->wm_tail = wm_tail;
mi->settings = is;
+ mi->settings.address = json_incref (mi->settings.address);
+ mi->settings.jurisdiction = json_incref (mi->settings.jurisdiction);
mi->settings.id = GNUNET_strdup (is.id);
mi->settings.name = GNUNET_strdup (is.name);
GNUNET_CRYPTO_eddsa_key_create (&mi->merchant_priv.eddsa_priv);