allow merge into non-existent reserve if KYC is disabled

This commit is contained in:
Christian Grothoff 2022-08-16 14:36:23 +02:00
parent 94fa05ec2a
commit 68d2df88f2
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
9 changed files with 39 additions and 35 deletions

View File

@ -1,5 +1,14 @@
SUBDIRS = . SUBDIRS = .
tmplpkgdatadir = $(prefix)/share/taler/exchange/templates/
dist_tmplpkgdata_DATA = \
test.en.must
# %%.must: merchant-backoffice/%.html
# WTF: cp $< $@
# English (en) # English (en)
tosendir=$(datadir)/taler/exchange/tos/en tosendir=$(datadir)/taler/exchange/tos/en

0
contrib/test.en.must Normal file
View File

View File

@ -177,6 +177,7 @@ taler_exchange_httpd_LDADD = \
$(top_builddir)/src/mhd/libtalermhd.la \ $(top_builddir)/src/mhd/libtalermhd.la \
$(top_builddir)/src/json/libtalerjson.la \ $(top_builddir)/src/json/libtalerjson.la \
$(top_builddir)/src/exchangedb/libtalerexchangedb.la \ $(top_builddir)/src/exchangedb/libtalerexchangedb.la \
$(top_builddir)/src/templating/libtalertemplating.la \
$(top_builddir)/src/kyclogic/libtalerkyclogic.la \ $(top_builddir)/src/kyclogic/libtalerkyclogic.la \
$(top_builddir)/src/util/libtalerutil.la \ $(top_builddir)/src/util/libtalerutil.la \
$(top_builddir)/src/extensions/libtalerextensions.la \ $(top_builddir)/src/extensions/libtalerextensions.la \

View File

@ -28,6 +28,7 @@
#include <sys/resource.h> #include <sys/resource.h>
#include <limits.h> #include <limits.h>
#include "taler_kyclogic_lib.h" #include "taler_kyclogic_lib.h"
#include "taler_templating_lib.h"
#include "taler_mhd_lib.h" #include "taler_mhd_lib.h"
#include "taler-exchange-httpd_auditors.h" #include "taler-exchange-httpd_auditors.h"
#include "taler-exchange-httpd_batch-deposit.h" #include "taler-exchange-httpd_batch-deposit.h"
@ -2125,6 +2126,7 @@ do_shutdown (void *cls)
GNUNET_CURL_gnunet_rc_destroy (exchange_curl_rc); GNUNET_CURL_gnunet_rc_destroy (exchange_curl_rc);
exchange_curl_rc = NULL; exchange_curl_rc = NULL;
} }
TALER_TEMPLATING_done ();
} }
@ -2162,6 +2164,13 @@ run (void *cls,
GNUNET_SCHEDULER_shutdown (); GNUNET_SCHEDULER_shutdown ();
return; return;
} }
if (GNUNET_OK !=
TALER_TEMPLATING_init ("exchange"))
{
global_ret = EXIT_FAILURE;
GNUNET_SCHEDULER_shutdown ();
return;
}
if (GNUNET_SYSERR == if (GNUNET_SYSERR ==
TEH_plugin->preflight (TEH_plugin->cls)) TEH_plugin->preflight (TEH_plugin->cls))
{ {

View File

@ -275,7 +275,6 @@ merge_transaction (void *cls,
bool in_conflict = true; bool in_conflict = true;
bool no_balance = true; bool no_balance = true;
bool no_partner = true; bool no_partner = true;
bool no_reserve = true;
const char *required; const char *required;
required = TALER_KYCLOGIC_kyc_test_required ( required = TALER_KYCLOGIC_kyc_test_required (
@ -305,7 +304,6 @@ merge_transaction (void *cls,
&pcc->reserve_pub, &pcc->reserve_pub,
&no_partner, &no_partner,
&no_balance, &no_balance,
&no_reserve,
&in_conflict); &in_conflict);
if (qs < 0) if (qs < 0)
{ {
@ -329,15 +327,6 @@ merge_transaction (void *cls,
pcc->provider_url); pcc->provider_url);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
if (no_reserve)
{
*mhd_ret =
TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_EXCHANGE_GENERIC_RESERVE_UNKNOWN,
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (no_balance) if (no_balance)
{ {
*mhd_ret = *mhd_ret =

View File

@ -4450,10 +4450,9 @@ prepare_statements (struct PostgresClosure *pg)
"SELECT" "SELECT"
" out_no_partner AS no_partner" " out_no_partner AS no_partner"
",out_no_balance AS no_balance" ",out_no_balance AS no_balance"
",out_no_reserve AS no_reserve"
",out_conflict AS conflict" ",out_conflict AS conflict"
" FROM exchange_do_purse_merge" " FROM exchange_do_purse_merge"
" ($1, $2, $3, $4, $5, $6, $7);", " ($1, $2, $3, $4, $5, $6, $7, $8);",
7), 7),
/* Used in #postgres_do_reserve_purse() */ /* Used in #postgres_do_reserve_purse() */
GNUNET_PQ_make_prepare ( GNUNET_PQ_make_prepare (
@ -16007,7 +16006,6 @@ postgres_get_purse_deposit (
* @param reserve_pub public key of the reserve to credit * @param reserve_pub public key of the reserve to credit
* @param[out] no_partner set to true if @a partner_url is unknown * @param[out] no_partner set to true if @a partner_url is unknown
* @param[out] no_balance set to true if the @a purse_pub is not paid up yet * @param[out] no_balance set to true if the @a purse_pub is not paid up yet
* @param[out] no_reserve set to true if the @a reserve_pub is not known
* @param[out] in_conflict set to true if @a purse_pub was merged into a different reserve already * @param[out] in_conflict set to true if @a purse_pub was merged into a different reserve already
* @return transaction status code * @return transaction status code
*/ */
@ -16022,11 +16020,12 @@ postgres_do_purse_merge (
const struct TALER_ReservePublicKeyP *reserve_pub, const struct TALER_ReservePublicKeyP *reserve_pub,
bool *no_partner, bool *no_partner,
bool *no_balance, bool *no_balance,
bool *no_reserve,
bool *in_conflict) bool *in_conflict)
{ {
struct PostgresClosure *pg = cls; struct PostgresClosure *pg = cls;
struct TALER_PaytoHashP h_payto; struct TALER_PaytoHashP h_payto;
struct GNUNET_TIME_Timestamp expiration
= GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_YEARS); /* FIXME: make this configurable? */
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (purse_pub), GNUNET_PQ_query_param_auto_from_type (purse_pub),
GNUNET_PQ_query_param_auto_from_type (merge_sig), GNUNET_PQ_query_param_auto_from_type (merge_sig),
@ -16037,6 +16036,7 @@ postgres_do_purse_merge (
: GNUNET_PQ_query_param_string (partner_url), : GNUNET_PQ_query_param_string (partner_url),
GNUNET_PQ_query_param_auto_from_type (reserve_pub), GNUNET_PQ_query_param_auto_from_type (reserve_pub),
GNUNET_PQ_query_param_auto_from_type (&h_payto), GNUNET_PQ_query_param_auto_from_type (&h_payto),
GNUNET_PQ_query_param_timestamp (&expiration),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
@ -16044,8 +16044,6 @@ postgres_do_purse_merge (
no_partner), no_partner),
GNUNET_PQ_result_spec_bool ("no_balance", GNUNET_PQ_result_spec_bool ("no_balance",
no_balance), no_balance),
GNUNET_PQ_result_spec_bool ("no_reserve",
no_reserve),
GNUNET_PQ_result_spec_bool ("conflict", GNUNET_PQ_result_spec_bool ("conflict",
in_conflict), in_conflict),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end

View File

@ -1606,9 +1606,9 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_merge(
IN in_partner_url VARCHAR, IN in_partner_url VARCHAR,
IN in_reserve_pub BYTEA, IN in_reserve_pub BYTEA,
IN in_wallet_h_payto BYTEA, IN in_wallet_h_payto BYTEA,
IN in_expiration_date INT8,
OUT out_no_partner BOOLEAN, OUT out_no_partner BOOLEAN,
OUT out_no_balance BOOLEAN, OUT out_no_balance BOOLEAN,
OUT out_no_reserve BOOLEAN,
OUT out_conflict BOOLEAN) OUT out_conflict BOOLEAN)
LANGUAGE plpgsql LANGUAGE plpgsql
AS $$ AS $$
@ -1642,7 +1642,6 @@ ELSE
THEN THEN
out_no_partner=TRUE; out_no_partner=TRUE;
out_conflict=FALSE; out_conflict=FALSE;
out_no_reserve=FALSE;
RETURN; RETURN;
END IF; END IF;
END IF; END IF;
@ -1670,7 +1669,6 @@ IF NOT FOUND
THEN THEN
out_no_balance=TRUE; out_no_balance=TRUE;
out_conflict=FALSE; out_conflict=FALSE;
out_no_reserve=FALSE;
RETURN; RETURN;
END IF; END IF;
out_no_balance=FALSE; out_no_balance=FALSE;
@ -1703,29 +1701,30 @@ THEN
THEN THEN
-- Purse was merged, but to some other reserve. Not allowed. -- Purse was merged, but to some other reserve. Not allowed.
out_conflict=TRUE; out_conflict=TRUE;
out_no_reserve=FALSE;
RETURN; RETURN;
END IF; END IF;
-- "success" -- "success"
out_conflict=FALSE; out_conflict=FALSE;
out_no_reserve=FALSE;
RETURN; RETURN;
END IF; END IF;
out_conflict=FALSE; out_conflict=FALSE;
ASSERT NOT my_finished, 'internal invariant failed'; ASSERT NOT my_finished, 'internal invariant failed';
PERFORM
FROM exchange.reserves
WHERE reserve_pub=in_reserve_pub;
IF NOT FOUND -- Initialize reserve, if not yet exists.
THEN INSERT INTO reserves
out_no_reserve=TRUE; (reserve_pub
RETURN; ,expiration_date
END IF; ,gc_date)
out_no_reserve=FALSE; VALUES
(in_reserve_pub
,in_expiration_date
,in_expiration_date)
ON CONFLICT DO NOTHING;
-- Store account merge signature. -- Store account merge signature.
@ -1785,7 +1784,7 @@ RETURN;
END $$; END $$;
COMMENT ON FUNCTION exchange_do_purse_merge(BYTEA, BYTEA, INT8, BYTEA, VARCHAR, BYTEA, BYTEA) COMMENT ON FUNCTION exchange_do_purse_merge(BYTEA, BYTEA, INT8, BYTEA, VARCHAR, BYTEA, BYTEA, INT8)
IS 'Checks that the partner exists, the purse has not been merged with a different reserve and that the purse is full. If so, persists the merge data and either merges the purse with the reserve or marks it as ready for the taler-exchange-router. Caller MUST abort the transaction on failures so as to not persist data by accident.'; IS 'Checks that the partner exists, the purse has not been merged with a different reserve and that the purse is full. If so, persists the merge data and either merges the purse with the reserve or marks it as ready for the taler-exchange-router. Caller MUST abort the transaction on failures so as to not persist data by accident.';

View File

@ -5394,7 +5394,6 @@ struct TALER_EXCHANGEDB_Plugin
const struct TALER_ReservePublicKeyP *reserve_pub, const struct TALER_ReservePublicKeyP *reserve_pub,
bool *no_partner, bool *no_partner,
bool *no_balance, bool *no_balance,
bool *no_reserve,
bool *in_conflict); bool *in_conflict);

View File

@ -414,8 +414,8 @@ TALER_TEMPLATING_init (const char *subsystem)
} }
GNUNET_asprintf (&dn, GNUNET_asprintf (&dn,
"%s/%s/templates/", "%s/%s/templates/",
subsystem, path,
path); subsystem);
GNUNET_free (path); GNUNET_free (path);
} }
ret = GNUNET_DISK_directory_scan (dn, ret = GNUNET_DISK_directory_scan (dn,