[kyc] put reserve_pub into legitimization_requirements

This commit is contained in:
Özgür Kesim 2023-07-23 15:57:37 +02:00
parent d189fccd79
commit 5b39ac9d8f
Signed by: oec
GPG Key ID: 3D76A56D79EDD9D7
12 changed files with 53 additions and 60 deletions

View File

@ -301,7 +301,6 @@ kyc_check (void *cls,
struct TALER_KYCLOGIC_ProviderDetails *pd; struct TALER_KYCLOGIC_ProviderDetails *pd;
enum GNUNET_GenericReturnValue ret; enum GNUNET_GenericReturnValue ret;
struct TALER_PaytoHashP h_payto; struct TALER_PaytoHashP h_payto;
struct TALER_ReservePublicKeyP *reserve_pub;
char *requirements; char *requirements;
bool satisfied; bool satisfied;
@ -310,8 +309,7 @@ kyc_check (void *cls,
kyp->requirement_row, kyp->requirement_row,
&requirements, &requirements,
&kyp->aml_status, &kyp->aml_status,
&h_payto, &h_payto);
&reserve_pub);
if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs) if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
{ {
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@ -337,7 +335,6 @@ kyc_check (void *cls,
TALER_EC_EXCHANGE_KYC_CHECK_AUTHORIZATION_FAILED, TALER_EC_EXCHANGE_KYC_CHECK_AUTHORIZATION_FAILED,
"h_payto"); "h_payto");
GNUNET_free (requirements); GNUNET_free (requirements);
GNUNET_free (reserve_pub);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
qs = TALER_KYCLOGIC_check_satisfied ( qs = TALER_KYCLOGIC_check_satisfied (
@ -357,7 +354,6 @@ kyc_check (void *cls,
TALER_EC_GENERIC_DB_FETCH_FAILED, TALER_EC_GENERIC_DB_FETCH_FAILED,
"kyc_test_required"); "kyc_test_required");
GNUNET_free (requirements); GNUNET_free (requirements);
GNUNET_free (reserve_pub);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
if (satisfied) if (satisfied)
@ -366,7 +362,6 @@ kyc_check (void *cls,
"KYC requirements `%s' already satisfied\n", "KYC requirements `%s' already satisfied\n",
requirements); requirements);
GNUNET_free (requirements); GNUNET_free (requirements);
GNUNET_free (reserve_pub);
return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS; return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
} }
@ -386,7 +381,6 @@ kyc_check (void *cls,
TALER_EC_EXCHANGE_KYC_GENERIC_LOGIC_GONE, TALER_EC_EXCHANGE_KYC_GENERIC_LOGIC_GONE,
requirements); requirements);
GNUNET_free (requirements); GNUNET_free (requirements);
GNUNET_free (reserve_pub);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
GNUNET_free (requirements); GNUNET_free (requirements);
@ -400,11 +394,8 @@ kyc_check (void *cls,
kyp->section_name, kyp->section_name,
NULL, NULL,
NULL, NULL,
reserve_pub,
&kyp->process_row); &kyp->process_row);
GNUNET_free (reserve_pub);
if (qs < 0) if (qs < 0)
{ {
if (GNUNET_DB_STATUS_SOFT_ERROR == qs) if (GNUNET_DB_STATUS_SOFT_ERROR == qs)

View File

@ -30,7 +30,6 @@ BEGIN
',provider_user_id VARCHAR DEFAULT NULL' ',provider_user_id VARCHAR DEFAULT NULL'
',provider_legitimization_id VARCHAR DEFAULT NULL' ',provider_legitimization_id VARCHAR DEFAULT NULL'
',finished BOOLEAN DEFAULT (FALSE)' ',finished BOOLEAN DEFAULT (FALSE)'
',reserve_pub BYTEA'
',UNIQUE (h_payto, provider_section)' ',UNIQUE (h_payto, provider_section)'
') %s ;' ') %s ;'
,'legitimization_processes' ,'legitimization_processes'
@ -84,12 +83,6 @@ BEGIN
,'legitimization_processes' ,'legitimization_processes'
,shard_suffix ,shard_suffix
); );
PERFORM comment_partitioned_column(
'If h_payto refers to a reserve, this is its public key, otherwise NULL.'
,'reserve_pub'
,'legitimization_processes'
,shard_suffix
);
END END
$$; $$;

View File

@ -25,6 +25,7 @@ BEGIN
'CREATE TABLE %I' 'CREATE TABLE %I'
'(legitimization_requirement_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' '(legitimization_requirement_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY'
',h_payto BYTEA NOT NULL CHECK (LENGTH(h_payto)=32)' ',h_payto BYTEA NOT NULL CHECK (LENGTH(h_payto)=32)'
',reserve_pub BYTEA'
',required_checks VARCHAR NOT NULL' ',required_checks VARCHAR NOT NULL'
',UNIQUE (h_payto, required_checks)' ',UNIQUE (h_payto, required_checks)'
') %s ;' ') %s ;'
@ -49,6 +50,12 @@ BEGIN
,'legitimization_requirements' ,'legitimization_requirements'
,partition_suffix ,partition_suffix
); );
PERFORM comment_partitioned_column(
'if h_payto refers to a reserve, this is its public key, NULL otherwise. It allows to lookup the corresponding reserve when the KYC process is done.'
,'reserve_pub'
,'legitimization_requirements'
,partition_suffix
);
PERFORM comment_partitioned_column( PERFORM comment_partitioned_column(
'space-separated list of required checks' 'space-separated list of required checks'
,'required_checks' ,'required_checks'

View File

@ -33,6 +33,7 @@ LANGUAGE plpgsql
AS $$ AS $$
DECLARE DECLARE
orig_reserve_pub BYTEA; orig_reserve_pub BYTEA;
orig_reserve_found BOOLEAN;
BEGIN BEGIN
INSERT INTO exchange.kyc_attributes INSERT INTO exchange.kyc_attributes
@ -42,13 +43,15 @@ INSERT INTO exchange.kyc_attributes
,collection_time ,collection_time
,expiration_time ,expiration_time
,encrypted_attributes ,encrypted_attributes
,legitimization_serial
) VALUES ) VALUES
(in_h_payto (in_h_payto
,in_kyc_prox ,in_kyc_prox
,in_provider_section ,in_provider_section
,in_collection_time_ts ,in_collection_time_ts
,in_expiration_time_ts ,in_expiration_time_ts
,in_enc_attributes); ,in_enc_attributes
,in_process_row);
UPDATE exchange.legitimization_processes UPDATE exchange.legitimization_processes
SET provider_user_id=in_provider_account_id SET provider_user_id=in_provider_account_id
@ -56,11 +59,24 @@ UPDATE exchange.legitimization_processes
,expiration_time=GREATEST(expiration_time,in_expiration_time) ,expiration_time=GREATEST(expiration_time,in_expiration_time)
WHERE h_payto=in_h_payto WHERE h_payto=in_h_payto
AND legitimization_process_serial_id=in_process_row AND legitimization_process_serial_id=in_process_row
AND provider_section=in_provider_section AND provider_section=in_provider_section;
RETURNING reserve_pub INTO orig_reserve_pub;
out_ok = FOUND; out_ok = FOUND;
UPDATE exchange.reserves SET birthday=in_birthday WHERE reserve_pub=orig_reserve_pub;
-- If the h_payto refers to a reserve in the original requirements
-- update the originating reserve's birthday.
SELECT reserve_pub
INTO orig_reserve_pub
FROM exchange.legitimization_requirements
WHERE h_payto=in_h_payto AND NOT reserve_pub IS NULL;
orig_reserve_found = FOUND;
IF orig_reserve_found
THEN
UPDATE exchange.reserves
SET birthday=in_birthday
WHERE reserve_pub=orig_reserve_pub;
END IF;
IF in_require_aml IF in_require_aml
THEN THEN

View File

@ -33,7 +33,6 @@ TEH_PG_insert_kyc_requirement_process (
const char *provider_section, const char *provider_section,
const char *provider_account_id, const char *provider_account_id,
const char *provider_legitimization_id, const char *provider_legitimization_id,
const struct TALER_ReservePublicKeyP *reserve_pub,
uint64_t *process_row) uint64_t *process_row)
{ {
struct PostgresClosure *pg = cls; struct PostgresClosure *pg = cls;
@ -46,9 +45,6 @@ TEH_PG_insert_kyc_requirement_process (
(NULL != provider_legitimization_id) (NULL != provider_legitimization_id)
? GNUNET_PQ_query_param_string (provider_legitimization_id) ? GNUNET_PQ_query_param_string (provider_legitimization_id)
: GNUNET_PQ_query_param_null (), : GNUNET_PQ_query_param_null (),
(NULL != reserve_pub)
? GNUNET_PQ_query_param_auto_from_type (reserve_pub)
: GNUNET_PQ_query_param_null (),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
@ -65,14 +61,12 @@ TEH_PG_insert_kyc_requirement_process (
" ,provider_section" " ,provider_section"
" ,provider_user_id" " ,provider_user_id"
" ,provider_legitimization_id" " ,provider_legitimization_id"
" ,reserve_pub"
" ) VALUES " " ) VALUES "
" ($1, $2, $3, $4, $5)" " ($1, $2, $3, $4)"
" ON CONFLICT (h_payto,provider_section) " " ON CONFLICT (h_payto,provider_section) "
" DO UPDATE SET" " DO UPDATE SET"
" provider_user_id=$3" " provider_user_id=$3"
" ,provider_legitimization_id=$4" " ,provider_legitimization_id=$4"
" ,reserve_pub=$5"
" RETURNING legitimization_process_serial_id"); " RETURNING legitimization_process_serial_id");
return GNUNET_PQ_eval_prepared_singleton_select ( return GNUNET_PQ_eval_prepared_singleton_select (
pg->conn, pg->conn,

View File

@ -34,7 +34,6 @@
* @param provider_section provider that must be checked * @param provider_section provider that must be checked
* @param provider_account_id provider account ID * @param provider_account_id provider account ID
* @param provider_legitimization_id provider legitimization ID * @param provider_legitimization_id provider legitimization ID
* @param reserve_pub if the processes is related to a reserve, the reserve's public key, NULL otherwise
* @param[out] process_row row the process is stored under * @param[out] process_row row the process is stored under
* @return database transaction status * @return database transaction status
*/ */
@ -45,7 +44,6 @@ TEH_PG_insert_kyc_requirement_process (
const char *provider_section, const char *provider_section,
const char *provider_account_id, const char *provider_account_id,
const char *provider_legitimization_id, const char *provider_legitimization_id,
const struct TALER_ReservePublicKeyP *reserve_pub,
uint64_t *process_row); uint64_t *process_row);
#endif #endif

View File

@ -229,7 +229,7 @@ irbt_cb_table_legitimization_processes (struct PostgresClosure *pg,
",provider_user_id" ",provider_user_id"
",provider_legitimization_id" ",provider_legitimization_id"
") VALUES " ") VALUES "
"($1, $2, $3, $4, $5, $6);"); "($1, $3, $4, $5, $6, %7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn, return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_legitimization_processes", "insert_into_table_legitimization_processes",
params); params);
@ -251,6 +251,10 @@ irbt_cb_table_legitimization_requirements (struct PostgresClosure *pg,
GNUNET_PQ_query_param_uint64 (&td->serial), GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type ( GNUNET_PQ_query_param_auto_from_type (
&td->details.legitimization_requirements.h_payto), &td->details.legitimization_requirements.h_payto),
td->details.legitimization_requirements.no_reserve_pub
? GNUNET_PQ_query_param_null ()
: GNUNET_PQ_query_param_auto_from_type (
&td->details.legitimization_requirements.reserve_pub),
GNUNET_PQ_query_param_string ( GNUNET_PQ_query_param_string (
td->details.legitimization_requirements.required_checks), td->details.legitimization_requirements.required_checks),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
@ -261,6 +265,7 @@ irbt_cb_table_legitimization_requirements (struct PostgresClosure *pg,
"INSERT INTO legitimization_requirements" "INSERT INTO legitimization_requirements"
"(legitimization_requirement_serial_id" "(legitimization_requirement_serial_id"
",h_payto" ",h_payto"
",reserve_pub"
",required_checks" ",required_checks"
") VALUES " ") VALUES "
"($1, $2, $3);"); "($1, $2, $3);");

View File

@ -31,8 +31,7 @@ TEH_PG_lookup_kyc_requirement_by_row (
uint64_t requirement_row, uint64_t requirement_row,
char **requirements, char **requirements,
enum TALER_AmlDecisionState *aml_status, enum TALER_AmlDecisionState *aml_status,
struct TALER_PaytoHashP *h_payto, struct TALER_PaytoHashP *h_payto)
struct TALER_ReservePublicKeyP **reserve_pub)
{ {
struct PostgresClosure *pg = cls; struct PostgresClosure *pg = cls;
uint32_t status = TALER_AML_NORMAL; uint32_t status = TALER_AML_NORMAL;
@ -40,18 +39,11 @@ TEH_PG_lookup_kyc_requirement_by_row (
GNUNET_PQ_query_param_uint64 (&requirement_row), GNUNET_PQ_query_param_uint64 (&requirement_row),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
bool no_reserve_pub;
struct TALER_ReservePublicKeyP *rp =
GNUNET_new (struct TALER_ReservePublicKeyP);
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_string ("required_checks", GNUNET_PQ_result_spec_string ("required_checks",
requirements), requirements),
GNUNET_PQ_result_spec_auto_from_type ("h_payto", GNUNET_PQ_result_spec_auto_from_type ("h_payto",
h_payto), h_payto),
GNUNET_PQ_result_spec_allow_null (
GNUNET_PQ_result_spec_auto_from_type ("reserve_pub",
rp),
&no_reserve_pub),
GNUNET_PQ_result_spec_allow_null ( GNUNET_PQ_result_spec_allow_null (
GNUNET_PQ_result_spec_uint32 ("status", GNUNET_PQ_result_spec_uint32 ("status",
&status), &status),
@ -65,7 +57,6 @@ TEH_PG_lookup_kyc_requirement_by_row (
"SELECT " "SELECT "
" lr.required_checks" " lr.required_checks"
",lr.h_payto" ",lr.h_payto"
",lr.reserve_pub"
",aml.status" ",aml.status"
" FROM legitimization_requirements lr" " FROM legitimization_requirements lr"
" LEFT JOIN aml_status aml USING (h_payto)" " LEFT JOIN aml_status aml USING (h_payto)"
@ -76,11 +67,5 @@ TEH_PG_lookup_kyc_requirement_by_row (
params, params,
rs); rs);
*aml_status = (enum TALER_AmlDecisionState) status; *aml_status = (enum TALER_AmlDecisionState) status;
if (no_reserve_pub)
{
GNUNET_free (rp);
rp = NULL;
}
*reserve_pub = rp;
return qs; return qs;
} }

View File

@ -34,7 +34,6 @@
* @param[out] requirements provider that must be checked * @param[out] requirements provider that must be checked
* @param[out] aml_status set to the AML status of the account * @param[out] aml_status set to the AML status of the account
* @param[out] h_payto account that must be KYC'ed * @param[out] h_payto account that must be KYC'ed
* @param[out] reserve_pub if account is a reserve, its public key, NULL otherwise. Must be freed by caller
* @return database transaction status * @return database transaction status
*/ */
enum GNUNET_DB_QueryStatus enum GNUNET_DB_QueryStatus
@ -43,7 +42,6 @@ TEH_PG_lookup_kyc_requirement_by_row (
uint64_t requirement_row, uint64_t requirement_row,
char **requirements, char **requirements,
enum TALER_AmlDecisionState *aml_status, enum TALER_AmlDecisionState *aml_status,
struct TALER_PaytoHashP *h_payto, struct TALER_PaytoHashP *h_payto);
struct TALER_ReservePublicKeyP **reserve_pub);
#endif #endif

View File

@ -29,6 +29,7 @@
#include "taler_pq_lib.h" #include "taler_pq_lib.h"
#include "pg_lookup_records_by_table.h" #include "pg_lookup_records_by_table.h"
#include "pg_helper.h" #include "pg_helper.h"
#include <gnunet/gnunet_pq_lib.h>
/** /**
@ -313,6 +314,11 @@ lrbt_cb_table_legitimization_requirements (void *cls,
GNUNET_PQ_result_spec_auto_from_type ( GNUNET_PQ_result_spec_auto_from_type (
"h_payto", "h_payto",
&td.details.legitimization_requirements.h_payto), &td.details.legitimization_requirements.h_payto),
GNUNET_PQ_result_spec_allow_null (
GNUNET_PQ_result_spec_auto_from_type (
"reserve_pub",
&td.details.legitimization_requirements.reserve_pub),
&td.details.legitimization_requirements.no_reserve_pub),
GNUNET_PQ_result_spec_string ( GNUNET_PQ_result_spec_string (
"required_checks", "required_checks",
&td.details.legitimization_requirements.required_checks), &td.details.legitimization_requirements.required_checks),
@ -2908,6 +2914,7 @@ TEH_PG_lookup_records_by_table (void *cls,
"SELECT" "SELECT"
" legitimization_process_serial_id AS serial" " legitimization_process_serial_id AS serial"
",h_payto" ",h_payto"
",reserve_pub"
",expiration_time" ",expiration_time"
",provider_section" ",provider_section"
",provider_user_id" ",provider_user_id"
@ -2922,6 +2929,7 @@ TEH_PG_lookup_records_by_table (void *cls,
"SELECT" "SELECT"
" legitimization_requirement_serial_id AS serial" " legitimization_requirement_serial_id AS serial"
",h_payto" ",h_payto"
",reserve_pub"
",required_checks" ",required_checks"
" FROM legitimization_requirements" " FROM legitimization_requirements"
" WHERE legitimization_requirement_serial_id > $1" " WHERE legitimization_requirement_serial_id > $1"

View File

@ -366,6 +366,8 @@ struct TALER_EXCHANGEDB_TableData
struct struct
{ {
struct TALER_PaytoHashP h_payto; struct TALER_PaytoHashP h_payto;
struct TALER_ReservePublicKeyP reserve_pub;
bool no_reserve_pub;
char *required_checks; char *required_checks;
} legitimization_requirements; } legitimization_requirements;
@ -6536,7 +6538,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param cls closure * @param cls closure
* @param requirements requirements that must be checked * @param requirements requirements that must be checked
* @param h_payto account that must be KYC'ed * @param h_payto account that must be KYC'ed
* @þaram reserve_pub if the account is a reserve, its public key, NULL otherwise * @param reserve_pub if account is a reserve, its public key, NULL otherwise
* @param[out] requirement_row set to legitimization requirement row for this check * @param[out] requirement_row set to legitimization requirement row for this check
* @return database transaction status * @return database transaction status
*/ */
@ -6557,7 +6559,6 @@ struct TALER_EXCHANGEDB_Plugin
* @param provider_section provider that must be checked * @param provider_section provider that must be checked
* @param provider_account_id provider account ID * @param provider_account_id provider account ID
* @param provider_legitimization_id provider legitimization ID * @param provider_legitimization_id provider legitimization ID
* @param reserve_pub if the KYC process is related to a reserve, its public key, NULL otherwise
* @param[out] process_row row the process is stored under * @param[out] process_row row the process is stored under
* @return database transaction status * @return database transaction status
*/ */
@ -6568,7 +6569,6 @@ struct TALER_EXCHANGEDB_Plugin
const char *provider_section, const char *provider_section,
const char *provider_account_id, const char *provider_account_id,
const char *provider_legitimization_id, const char *provider_legitimization_id,
const struct TALER_ReservePublicKeyP *reserve_pub,
uint64_t *process_row); uint64_t *process_row);
@ -6604,7 +6604,6 @@ struct TALER_EXCHANGEDB_Plugin
* @param[out] requirements space-separated list of requirements * @param[out] requirements space-separated list of requirements
* @param[out] aml_status set to the AML status of the account * @param[out] aml_status set to the AML status of the account
* @param[out] h_payto account that must be KYC'ed * @param[out] h_payto account that must be KYC'ed
* @param[out] reserve_pub if the account is a reserve, its public key, NULL otherwise. Must be freed by caller.
* @return database transaction status * @return database transaction status
*/ */
enum GNUNET_DB_QueryStatus enum GNUNET_DB_QueryStatus
@ -6613,8 +6612,7 @@ struct TALER_EXCHANGEDB_Plugin
uint64_t requirement_row, uint64_t requirement_row,
char **requirements, char **requirements,
enum TALER_AmlDecisionState *aml_status, enum TALER_AmlDecisionState *aml_status,
struct TALER_PaytoHashP *h_payto, struct TALER_PaytoHashP *h_payto);
struct TALER_ReservePublicKeyP **reserve_pub);
/** /**