summaryrefslogtreecommitdiff
path: root/src/exchangedb
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2022-06-04 15:19:57 +0200
committerChristian Grothoff <christian@grothoff.org>2022-06-04 15:19:57 +0200
commit93943bdb5b6ab43b6bcfdb721f67674cc89250d6 (patch)
tree17e98a062ba886f1389ce99f5cb2fecb242a5f76 /src/exchangedb
parent3e99c50c0f940fda34585225c38c9014cc1110d0 (diff)
downloadexchange-93943bdb5b6ab43b6bcfdb721f67674cc89250d6.tar.gz
exchange-93943bdb5b6ab43b6bcfdb721f67674cc89250d6.tar.bz2
exchange-93943bdb5b6ab43b6bcfdb721f67674cc89250d6.zip
add KYC errors for p2p payments
Diffstat (limited to 'src/exchangedb')
-rw-r--r--src/exchangedb/exchange-0001-part.sql66
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c18
2 files changed, 84 insertions, 0 deletions
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
};