diff options
author | Christian Grothoff <grothoff@gnunet.org> | 2023-09-06 20:16:03 +0200 |
---|---|---|
committer | Christian Grothoff <grothoff@gnunet.org> | 2023-09-06 20:16:21 +0200 |
commit | 5e2b19c64e2e8a3b84d82f1cf5c3c088e01b5c0c (patch) | |
tree | f221655cb82a870dc0ac467ce3ae5a187360c180 /src | |
parent | 68bc1dd88a4de48736c289e0ed5871f4cb72a908 (diff) |
fix #7936
Diffstat (limited to 'src')
13 files changed, 195 insertions, 14 deletions
diff --git a/src/backend/taler-merchant-httpd.h b/src/backend/taler-merchant-httpd.h index 30d84751..6e9d8793 100644 --- a/src/backend/taler-merchant-httpd.h +++ b/src/backend/taler-merchant-httpd.h @@ -456,7 +456,7 @@ struct TMH_RequestHandler /** * Required authentication scope for this request. NONE implies that - * #TMH_AS_ALL is required unless this is a #MHD_HTTP_GET method, in which + * #TMH_AS_ALL is required unless this is a #MHD_HTTP_METHOD_GET method, in which * case #TMH_AS_READ_ONLY is sufficient. */ enum TMH_AuthScope auth_scope; diff --git a/src/backend/taler-merchant-httpd_private-post-account.c b/src/backend/taler-merchant-httpd_private-post-account.c index 73abfe48..6ad3902d 100644 --- a/src/backend/taler-merchant-httpd_private-post-account.c +++ b/src/backend/taler-merchant-httpd_private-post-account.c @@ -139,6 +139,49 @@ TMH_private_post_account (const struct TMH_RequestHandler *rh, break; case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: /* conflict: account exists */ + { + struct TALER_MERCHANTDB_AccountDetails adx; + + qs = TMH_db->select_account_by_uri (TMH_db->cls, + mi->settings.id, + ad.payto_uri, + &adx); + switch (qs) + { + case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: + if ( (0 == strcmp (adx.payto_uri, + ad.payto_uri) ) && + ( (adx.credit_facade_credentials == + ad.credit_facade_credentials) || + (1 == json_equal (adx.credit_facade_credentials, + ad.credit_facade_credentials)) ) && + ( (adx.credit_facade_url == ad.credit_facade_url) || + ( (NULL != adx.credit_facade_url) && + (NULL != ad.credit_facade_url) && + (0 == strcmp (adx.credit_facade_url, + ad.credit_facade_url)) ) ) ) + { + TMH_wire_method_free (wm); + GNUNET_free (adx.payto_uri); + return TALER_MHD_REPLY_JSON_PACK (connection, + MHD_HTTP_OK, + GNUNET_JSON_pack_data_auto ("salt", + &adx.salt), + GNUNET_JSON_pack_data_auto ("h_wire", + &adx.h_wire)); + } + break; + case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: + case GNUNET_DB_STATUS_SOFT_ERROR: + case GNUNET_DB_STATUS_HARD_ERROR: + GNUNET_break (0); + TMH_wire_method_free (wm); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_FETCH_FAILED, + "select_account"); + } + } TMH_wire_method_free (wm); return TALER_MHD_reply_with_error (connection, MHD_HTTP_CONFLICT, diff --git a/src/backend/taler-merchant-httpd_private-post-instances.c b/src/backend/taler-merchant-httpd_private-post-instances.c index 398a846d..bc87ab41 100644 --- a/src/backend/taler-merchant-httpd_private-post-instances.c +++ b/src/backend/taler-merchant-httpd_private-post-instances.c @@ -237,13 +237,10 @@ TMH_private_post_instances (const struct TMH_RequestHandler *rh, NULL, 0); } - else - { - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_CONFLICT, - TALER_EC_MERCHANT_PRIVATE_POST_INSTANCES_ALREADY_EXISTS, - is.id); - } + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_CONFLICT, + TALER_EC_MERCHANT_PRIVATE_POST_INSTANCES_ALREADY_EXISTS, + is.id); } } @@ -314,6 +311,7 @@ TMH_private_post_instances (const struct TMH_RequestHandler *rh, TMH_db->rollback (TMH_db->cls); if (GNUNET_DB_STATUS_SOFT_ERROR == qs) goto retry; + GNUNET_break (0); // FIXME: distinguish better by qs ret = TALER_MHD_reply_with_error (connection, MHD_HTTP_CONFLICT, TALER_EC_MERCHANT_PRIVATE_POST_INSTANCES_ALREADY_EXISTS, diff --git a/src/backenddb/Makefile.am b/src/backenddb/Makefile.am index 778379cf..64b9883e 100644 --- a/src/backenddb/Makefile.am +++ b/src/backenddb/Makefile.am @@ -76,7 +76,8 @@ libtaler_plugin_merchantdb_postgres_la_SOURCES = \ pg_insert_login_token.h pg_insert_login_token.c \ pg_delete_login_token.h pg_delete_login_token.c \ pg_select_login_token.h pg_select_login_token.c \ -pg_lookup_reserves.h pg_lookup_reserves.c \ + pg_select_account_by_uri.h pg_select_account_by_uri.c \ + pg_lookup_reserves.h pg_lookup_reserves.c \ pg_lookup_instance_auth.h pg_lookup_instance_auth.c \ pg_insert_instance.h pg_insert_instance.c \ pg_account_kyc_set_status.h pg_account_kyc_set_status.c \ diff --git a/src/backenddb/pg_select_account.c b/src/backenddb/pg_select_account.c index abf7e9a8..29fda632 100644 --- a/src/backenddb/pg_select_account.c +++ b/src/backenddb/pg_select_account.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2022 Taler Systems SA + Copyright (C) 2023 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software diff --git a/src/backenddb/pg_select_account_by_uri.c b/src/backenddb/pg_select_account_by_uri.c new file mode 100644 index 00000000..a0fbffb3 --- /dev/null +++ b/src/backenddb/pg_select_account_by_uri.c @@ -0,0 +1,79 @@ +/* + This file is part of TALER + Copyright (C) 2023 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ +/** + * @file backenddb/pg_select_account_by_uri.c + * @brief Implementation of the select_account_by_uri function for Postgres + * @author Christian Grothoff + */ +#include "platform.h" +#include <taler/taler_error_codes.h> +#include <taler/taler_dbevents.h> +#include <taler/taler_pq_lib.h> +#include "pg_select_account_by_uri.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TMH_PG_select_account_by_uri (void *cls, + const char *id, + const char *payto_uri, + struct TALER_MERCHANTDB_AccountDetails *ad) +{ + struct PostgresClosure *pg = cls; + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_string (id), + GNUNET_PQ_query_param_string (payto_uri), + GNUNET_PQ_query_param_end + }; + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_auto_from_type ("salt", + &ad->salt), + GNUNET_PQ_result_spec_auto_from_type ("h_wire", + &ad->h_wire), + GNUNET_PQ_result_spec_allow_null ( + GNUNET_PQ_result_spec_string ("credit_facade_url", + &ad->credit_facade_url), + NULL), + GNUNET_PQ_result_spec_allow_null ( + TALER_PQ_result_spec_json ("credit_facade_credentials", + &ad->credit_facade_credentials), + NULL), + GNUNET_PQ_result_spec_bool ("active", + &ad->active), + GNUNET_PQ_result_spec_end + }; + + ad->payto_uri = GNUNET_strdup (payto_uri); + check_connection (pg); + PREPARE (pg, + "select_account", + "SELECT" + " salt" + ",h_wire" + ",credit_facade_url" + ",credit_facade_credentials" + ",active" + " FROM merchant_accounts" + " WHERE merchant_serial=" + " (SELECT merchant_serial " + " FROM merchant_instances" + " WHERE merchant_id=$1) AND " + " payto_uri=$2;"); + return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, + "select_account", + params, + rs); +} diff --git a/src/backenddb/pg_select_account_by_uri.h b/src/backenddb/pg_select_account_by_uri.h new file mode 100644 index 00000000..718209be --- /dev/null +++ b/src/backenddb/pg_select_account_by_uri.h @@ -0,0 +1,44 @@ +/* + This file is part of TALER + Copyright (C) 2023 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ +/** + * @file backenddb/pg_select_account_by_uri.h + * @brief implementation of the select_account_by_uri function for Postgres + * @author Christian Grothoff + */ +#ifndef PG_SELECT_ACCOUNT_BY_URI_H +#define PG_SELECT_ACCOUNT_BY_URI_H + +#include <taler/taler_util.h> +#include <taler/taler_json_lib.h> +#include "taler_merchantdb_plugin.h" + + +/** + * Obtain information about an instance's accounts. + * + * @param cls closure + * @param id identifier of the instance + * @param payto_uri URI of the account + * @param[out] ad account details returned + * @return database result code + */ +enum GNUNET_DB_QueryStatus +TMH_PG_select_account_by_uri (void *cls, + const char *id, + const char *payto_uri, + struct TALER_MERCHANTDB_AccountDetails *ad); + +#endif diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c index 51298334..3682e5c1 100644 --- a/src/backenddb/plugin_merchantdb_postgres.c +++ b/src/backenddb/plugin_merchantdb_postgres.c @@ -91,6 +91,7 @@ #include "pg_insert_deposit.h" #include "pg_lookup_refunds.h" #include "pg_mark_contract_paid.h" +#include "pg_select_account_by_uri.h" #include "pg_refund_coin.h" #include "pg_lookup_order_status.h" #include "pg_lookup_order_status_by_serial.h" @@ -3693,6 +3694,8 @@ libtaler_plugin_merchantdb_postgres_init (void *cls) = &TMH_PG_delete_login_token; plugin->select_login_token = &TMH_PG_select_login_token; + plugin->select_account_by_uri + = &TMH_PG_select_account_by_uri; plugin->lookup_instance_auth = &TMH_PG_lookup_instance_auth; plugin->insert_instance diff --git a/src/include/taler_merchantdb_plugin.h b/src/include/taler_merchantdb_plugin.h index e9bdcbd1..fb05bf1c 100644 --- a/src/include/taler_merchantdb_plugin.h +++ b/src/include/taler_merchantdb_plugin.h @@ -1384,6 +1384,23 @@ struct TALER_MERCHANTDB_Plugin struct TALER_MERCHANTDB_AccountDetails *ad); + /** + * Obtain detailed information about an instance's account. + * + * @param cls closure + * @param id identifier of the instance + * @param payto_uri URI of the account + * @param[out] ad account details returned + * @return database result code + */ + enum GNUNET_DB_QueryStatus + (*select_account_by_uri)( + void *cls, + const char *id, + const char *payto_uri, + struct TALER_MERCHANTDB_AccountDetails *ad); + + /** * Delete private key of an instance from our database. * diff --git a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_1/1693415204 b/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_1/1693415204 deleted file mode 100644 index a07a1ae5..00000000 --- a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_1/1693415204 +++ /dev/null @@ -1 +0,0 @@ -v*̨WG {asSH.G9FLWgPw
\ No newline at end of file diff --git a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_5/1693415204 b/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_5/1693415204 deleted file mode 100644 index e90dc31f..00000000 --- a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_5/1693415204 +++ /dev/null @@ -1 +0,0 @@ -EүCeNPvŋwgPӍ:_
\ No newline at end of file diff --git a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_ct_1/1693415204 b/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_ct_1/1693415204 deleted file mode 100644 index 9a4d704c..00000000 --- a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_ct_1/1693415204 +++ /dev/null @@ -1 +0,0 @@ -:6[goYuι=%y
\ No newline at end of file diff --git a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_ct_10/1693415204 b/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_ct_10/1693415204 deleted file mode 100644 index 341438e2..00000000 --- a/src/testing/test_merchant_api_home/taler/exchange-secmod-cs/keys/coin_eur_ct_10/1693415204 +++ /dev/null @@ -1 +0,0 @@ -I6 ;M cRAHEWp0V
\ No newline at end of file |