From 93943bdb5b6ab43b6bcfdb721f67674cc89250d6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 4 Jun 2022 15:19:57 +0200 Subject: add KYC errors for p2p payments --- src/exchangedb/exchange-0001-part.sql | 66 +++++++++++++++++++++++++++++ src/exchangedb/plugin_exchangedb_postgres.c | 18 ++++++++ 2 files changed, 84 insertions(+) (limited to 'src/exchangedb') diff --git a/src/exchangedb/exchange-0001-part.sql b/src/exchangedb/exchange-0001-part.sql index 52a16cd9a..0b99e25f9 100644 --- a/src/exchangedb/exchange-0001-part.sql +++ b/src/exchangedb/exchange-0001-part.sql @@ -3092,6 +3092,8 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_merge( IN in_reserve_pub BYTEA, OUT out_no_partner BOOLEAN, OUT out_no_balance BOOLEAN, + OUT out_no_kyc BOOLEAN, + OUT out_no_reserve BOOLEAN, OUT out_conflict BOOLEAN) LANGUAGE plpgsql AS $$ @@ -3121,6 +3123,8 @@ ELSE THEN out_no_partner=TRUE; out_conflict=FALSE; + out_no_kyc=FALSE; + out_no_reserve=FALSE; RETURN; END IF; END IF; @@ -3144,6 +3148,8 @@ IF NOT FOUND THEN out_no_balance=TRUE; out_conflict=FALSE; + out_no_kyc=FALSE; + out_no_reserve=FALSE; RETURN; END IF; out_no_balance=FALSE; @@ -3176,17 +3182,49 @@ THEN THEN -- Purse was merged, but to some other reserve. Not allowed. out_conflict=TRUE; + out_no_kyc=FALSE; + out_no_reserve=FALSE; RETURN; END IF; -- "success" out_conflict=FALSE; + out_no_kyc=FALSE; + out_no_reserve=FALSE; RETURN; END IF; out_conflict=FALSE; ASSERT NOT my_finished, 'internal invariant failed'; +IF in_partner_url IS NULL +THEN + -- Need to do KYC check. + SELECT NOT kyc_passed + INTO out_no_kyc + FROM reserves + WHERE reserve_pub=in_reserve_pub; + + IF NOT FOUND + THEN + out_no_kyc=TRUE; + out_no_reserve=TRUE; + RETURN; + END IF; + out_no_reserve=FALSE; + + IF (out_no_kyc) + THEN + RETURN; + END IF; +ELSE + -- KYC is not our responsibility + out_no_reserve=FALSE; + out_no_kyc=FALSE; +END IF; + + + -- Store account merge signature. INSERT INTO account_merges (reserve_pub @@ -3248,6 +3286,8 @@ CREATE OR REPLACE FUNCTION exchange_do_reserve_purse( IN in_purse_fee_frac INT4, IN in_reserve_pub BYTEA, OUT out_no_funds BOOLEAN, + OUT out_no_kyc BOOLEAN, + OUT out_no_reserve BOOLEAN, OUT out_conflict BOOLEAN) LANGUAGE plpgsql AS $$ @@ -3281,16 +3321,40 @@ THEN THEN -- Purse was merged, but to some other reserve. Not allowed. out_conflict=TRUE; + out_no_kyc=FALSE; + out_no_reserve=FALSE; + out_no_funds=FALSE; RETURN; END IF; -- "success" out_conflict=FALSE; out_no_funds=FALSE; + out_no_kyc=FALSE; + out_no_reserve=FALSE; RETURN; END IF; out_conflict=FALSE; +SELECT NOT kyc_passed + INTO out_no_kyc + FROM reserves + WHERE reserve_pub=in_reserve_pub; + +IF NOT FOUND +THEN + out_no_kyc=TRUE; + out_no_reserve=TRUE; + out_no_funds=TRUE; + RETURN; +END IF; +out_no_reserve=FALSE; + +IF (out_no_kyc) +THEN + out_no_funds=FALSE; + RETURN; +END IF; IF (in_reserve_quota) THEN @@ -3303,6 +3367,7 @@ THEN IF NOT FOUND THEN out_no_funds=TRUE; + RETURN; END IF; ELSE -- UPDATE reserves balance (and check if balance is enough to pay the fee) @@ -3328,6 +3393,7 @@ ELSE IF NOT FOUND THEN out_no_funds=TRUE; + RETURN; END IF; END IF; diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index 3a269c6de..01869d592 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -3973,6 +3973,8 @@ prepare_statements (struct PostgresClosure *pg) "SELECT" " out_no_partner AS no_partner" ",out_no_balance AS no_balance" + ",out_no_kyc AS no_kyc" + ",out_no_reserve AS no_reserve" ",out_conflict AS conflict" " FROM exchange_do_purse_merge" " ($1, $2, $3, $4, $5, $6);", @@ -3982,6 +3984,8 @@ prepare_statements (struct PostgresClosure *pg) "call_reserve_purse", "SELECT" " out_no_funds AS insufficient_funds" + ",out_no_reserve AS no_reserve" + ",out_no_kyc AS no_kyc" ",out_conflict AS conflict" " FROM exchange_do_reserve_purse" " ($1, $2, $3, $4, $5, $6, $7, $8);", @@ -14490,6 +14494,8 @@ postgres_get_purse_deposit ( * @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_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] no_kyc set to true if the @a reserve_pub lacks KYC * @param[out] in_conflict set to true if @a purse_pub was merged into a different reserve already * @return transaction status code */ @@ -14504,6 +14510,8 @@ postgres_do_purse_merge ( const struct TALER_ReservePublicKeyP *reserve_pub, bool *no_partner, bool *no_balance, + bool *no_reserve, + bool *no_kyc, bool *in_conflict) { struct PostgresClosure *pg = cls; @@ -14523,6 +14531,10 @@ postgres_do_purse_merge ( no_partner), GNUNET_PQ_result_spec_bool ("no_balance", no_balance), + GNUNET_PQ_result_spec_bool ("no_kyc", + no_kyc), + GNUNET_PQ_result_spec_bool ("no_reserve", + no_reserve), GNUNET_PQ_result_spec_bool ("conflict", in_conflict), GNUNET_PQ_result_spec_end @@ -14561,6 +14573,8 @@ postgres_do_reserve_purse ( const struct TALER_Amount *purse_fee, const struct TALER_ReservePublicKeyP *reserve_pub, bool *in_conflict, + bool *no_reserve, + bool *no_kyc, bool *insufficient_funds) { struct PostgresClosure *pg = cls; @@ -14582,6 +14596,10 @@ postgres_do_reserve_purse ( insufficient_funds), GNUNET_PQ_result_spec_bool ("conflict", in_conflict), + GNUNET_PQ_result_spec_bool ("no_kyc", + no_kyc), + GNUNET_PQ_result_spec_bool ("no_reserve", + no_reserve), GNUNET_PQ_result_spec_end }; -- cgit v1.2.3