From 2d6bce2dc0ded9fcb77caa1cafecd401216b7238 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 13 Feb 2024 22:01:02 +0100 Subject: set 'finished' to TRUE when KYC process is done (either way, successful or failure); should fix #8055, needs testing --- src/exchange/taler-exchange-httpd_common_kyc.c | 24 +++++++- src/exchange/taler-exchange-httpd_common_kyc.h | 18 ++++++ src/exchange/taler-exchange-httpd_kyc-proof.c | 37 ++++++++++++- src/exchange/taler-exchange-httpd_kyc-webhook.c | 29 +++++++++- src/exchangedb/Makefile.am | 1 + .../exchange_do_insert_kyc_attributes.sql | 3 +- src/exchangedb/pg_insert_kyc_failure.c | 64 ++++++++++++++++++++++ src/exchangedb/pg_insert_kyc_failure.h | 50 +++++++++++++++++ src/exchangedb/pg_template.c | 2 +- src/exchangedb/pg_template.h | 2 +- src/exchangedb/plugin_exchangedb_postgres.c | 3 + src/include/taler_exchangedb_plugin.h | 22 +++++++- 12 files changed, 247 insertions(+), 8 deletions(-) create mode 100644 src/exchangedb/pg_insert_kyc_failure.c create mode 100644 src/exchangedb/pg_insert_kyc_failure.h (limited to 'src') diff --git a/src/exchange/taler-exchange-httpd_common_kyc.c b/src/exchange/taler-exchange-httpd_common_kyc.c index 2a7193f4d..bcee5a0d2 100644 --- a/src/exchange/taler-exchange-httpd_common_kyc.c +++ b/src/exchange/taler-exchange-httpd_common_kyc.c @@ -104,7 +104,8 @@ struct TEH_KycAmlTrigger * * @param cls closure of type `struct TEH_KycAmlTrigger *` * @param status_type how did the process die - * @param code termination status code from the process + * @param code termination status code from the process, + * non-zero if AML checks are required next * @param result some JSON result, NULL if we failed to get an JSON output */ static void @@ -278,3 +279,24 @@ TEH_kyc_finished_cancel (struct TEH_KycAmlTrigger *kat) } GNUNET_free (kat); } + + +bool +TEH_kyc_failed (uint64_t process_row, + const struct TALER_PaytoHashP *account_id, + const char *provider_section, + const char *provider_user_id, + const char *provider_legitimization_id) +{ + enum GNUNET_DB_QueryStatus qs; + + qs = TEH_plugin->insert_kyc_failure ( + TEH_plugin->cls, + process_row, + account_id, + provider_section, + provider_user_id, + provider_legitimization_id); + GNUNET_break (qs >= 0); + return qs >= 0; +} diff --git a/src/exchange/taler-exchange-httpd_common_kyc.h b/src/exchange/taler-exchange-httpd_common_kyc.h index 572766041..8198679c9 100644 --- a/src/exchange/taler-exchange-httpd_common_kyc.h +++ b/src/exchange/taler-exchange-httpd_common_kyc.h @@ -96,4 +96,22 @@ void TEH_kyc_finished_cancel (struct TEH_KycAmlTrigger *kat); +/** + * Update state of a legitmization process to 'finished' + * (and failed, no attributes were obtained). + * + * @param process_row legitimization process the webhook was about + * @param account_id account the webhook was about + * @param provider_section name of the configuration section of the logic that was run + * @param provider_user_id set to user ID at the provider, or NULL if not supported or unknown + * @param provider_legitimization_id set to legitimization process ID at the provider, or NULL if not supported or unknown + * @return true on success, false if updating the database failed + */ +bool +TEH_kyc_failed (uint64_t process_row, + const struct TALER_PaytoHashP *account_id, + const char *provider_section, + const char *provider_user_id, + const char *provider_legitimization_id); + #endif diff --git a/src/exchange/taler-exchange-httpd_kyc-proof.c b/src/exchange/taler-exchange-httpd_kyc-proof.c index ef3583d02..b9ec3563d 100644 --- a/src/exchange/taler-exchange-httpd_kyc-proof.c +++ b/src/exchange/taler-exchange-httpd_kyc-proof.c @@ -220,8 +220,9 @@ proof_cb ( kpc->ph = NULL; GNUNET_async_scope_enter (&rc->async_scope_id, &old_scope); - if (TALER_KYCLOGIC_STATUS_SUCCESS == status) + switch (status) { + case TALER_KYCLOGIC_STATUS_SUCCESS: GNUNET_log (GNUNET_ERROR_TYPE_INFO, "KYC process #%llu succeeded with KYC provider\n", (unsigned long long) kpc->process_row); @@ -246,6 +247,40 @@ proof_cb ( TALER_EC_EXCHANGE_GENERIC_BAD_CONFIGURATION, "[exchange] AML_KYC_TRIGGER"); } + break; + case TALER_KYCLOGIC_STATUS_FAILED: + case TALER_KYCLOGIC_STATUS_PROVIDER_FAILED: + case TALER_KYCLOGIC_STATUS_USER_ABORTED: + case TALER_KYCLOGIC_STATUS_ABORTED: + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "KYC process %s/%s (Row #%llu) failed: %d\n", + provider_user_id, + provider_legitimization_id, + (unsigned long long) kpc->process_row, + status); + if (! TEH_kyc_failed (kpc->process_row, + &kpc->h_payto, + kpc->provider_section, + provider_user_id, + provider_legitimization_id)) + { + GNUNET_break (0); + if (NULL != response) + MHD_destroy_response (response); + http_status = MHD_HTTP_INTERNAL_SERVER_ERROR; + response = TALER_MHD_make_error ( + TALER_EC_GENERIC_DB_STORE_FAILED, + "insert_kyc_failure"); + } + break; + default: + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "KYC status of %s/%s (Row #%llu) is %d\n", + provider_user_id, + provider_legitimization_id, + (unsigned long long) kpc->process_row, + (int) status); + break; } if (NULL == kpc->kat) { diff --git a/src/exchange/taler-exchange-httpd_kyc-webhook.c b/src/exchange/taler-exchange-httpd_kyc-webhook.c index 8bd6d4bb2..b92b43e69 100644 --- a/src/exchange/taler-exchange-httpd_kyc-webhook.c +++ b/src/exchange/taler-exchange-httpd_kyc-webhook.c @@ -221,22 +221,47 @@ webhook_finished_cb ( kwh); if (NULL == kwh->kat) { - http_status = MHD_HTTP_INTERNAL_SERVER_ERROR; if (NULL != response) MHD_destroy_response (response); + http_status = MHD_HTTP_INTERNAL_SERVER_ERROR; response = TALER_MHD_make_error ( TALER_EC_EXCHANGE_GENERIC_BAD_CONFIGURATION, "[exchange] AML_KYC_TRIGGER"); break; } return; + case TALER_KYCLOGIC_STATUS_FAILED: + case TALER_KYCLOGIC_STATUS_PROVIDER_FAILED: + case TALER_KYCLOGIC_STATUS_USER_ABORTED: + case TALER_KYCLOGIC_STATUS_ABORTED: + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "KYC process %s/%s (Row #%llu) failed: %d\n", + provider_user_id, + provider_legitimization_id, + (unsigned long long) process_row, + status); + if (! TEH_kyc_failed (process_row, + account_id, + provider_section, + provider_user_id, + provider_legitimization_id)) + { + GNUNET_break (0); + if (NULL != response) + MHD_destroy_response (response); + http_status = MHD_HTTP_INTERNAL_SERVER_ERROR; + response = TALER_MHD_make_error ( + TALER_EC_GENERIC_DB_STORE_FAILED, + "insert_kyc_failure"); + } + break; default: GNUNET_log (GNUNET_ERROR_TYPE_INFO, "KYC status of %s/%s (Row #%llu) is %d\n", provider_user_id, provider_legitimization_id, (unsigned long long) process_row, - status); + (int) status); break; } GNUNET_break (NULL == kwh->kat); diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index 4febbfb17..99e44c876 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -96,6 +96,7 @@ libtaler_plugin_exchangedb_postgres_la_SOURCES = \ pg_select_purse_merge.h pg_select_purse_merge.c \ pg_select_contract_by_purse.h pg_select_contract_by_purse.c \ pg_insert_drain_profit.h pg_insert_drain_profit.c \ + pg_insert_kyc_failure.h pg_insert_kyc_failure.c \ pg_create_tables.h pg_create_tables.c \ pg_event_listen.h pg_event_listen.c \ pg_event_listen_cancel.h pg_event_listen_cancel.c \ diff --git a/src/exchangedb/exchange_do_insert_kyc_attributes.sql b/src/exchangedb/exchange_do_insert_kyc_attributes.sql index 2efc0aec5..7db4d80c0 100644 --- a/src/exchangedb/exchange_do_insert_kyc_attributes.sql +++ b/src/exchangedb/exchange_do_insert_kyc_attributes.sql @@ -56,10 +56,11 @@ INSERT INTO exchange.kyc_attributes ,in_enc_attributes ,in_process_row); -UPDATE exchange.legitimization_processes +UPDATE legitimization_processes SET provider_user_id=in_provider_account_id ,provider_legitimization_id=in_provider_legitimization_id ,expiration_time=GREATEST(expiration_time,in_expiration_time) + ,finished=TRUE WHERE h_payto=in_h_payto AND legitimization_process_serial_id=in_process_row AND provider_section=in_provider_section; diff --git a/src/exchangedb/pg_insert_kyc_failure.c b/src/exchangedb/pg_insert_kyc_failure.c new file mode 100644 index 000000000..c9fcd0202 --- /dev/null +++ b/src/exchangedb/pg_insert_kyc_failure.c @@ -0,0 +1,64 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 + */ +/** + * @file exchangedb/pg_insert_kyc_failure.c + * @brief Implementation of the insert_kyc_failure function for Postgres + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_kyc_failure.h" +#include "pg_helper.h" + +enum GNUNET_DB_QueryStatus +TEH_PG_insert_kyc_failure ( + void *cls, + uint64_t process_row, + const struct TALER_PaytoHashP *h_payto, + const char *provider_section, + const char *provider_account_id, + const char *provider_legitimization_id) +{ + struct PostgresClosure *pg = cls; + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_uint64 (&process_row), + GNUNET_PQ_query_param_auto_from_type (h_payto), + GNUNET_PQ_query_param_string (provider_section), + NULL != provider_account_id + ? GNUNET_PQ_query_param_string (provider_account_id) + : GNUNET_PQ_query_param_null (), + NULL != provider_legitimization_id + ? GNUNET_PQ_query_param_string (provider_legitimization_id) + : GNUNET_PQ_query_param_null (), + GNUNET_PQ_query_param_end + }; + + PREPARE (pg, + "insert_kyc_failure", + "UPDATE legitimization_processes" + " SET" + " finished=TRUE" + " ,provider_account_id=$4" + " ,provider_legitimization_id=$5" + " WHERE h_payto=$2" + " AND legitimization_process_serial_id=$1" + " AND provider_section=$3;"); + return GNUNET_PQ_eval_prepared_non_select (pg->conn, + "insert_kyc_failure", + params); +} diff --git a/src/exchangedb/pg_insert_kyc_failure.h b/src/exchangedb/pg_insert_kyc_failure.h new file mode 100644 index 000000000..46d08df9c --- /dev/null +++ b/src/exchangedb/pg_insert_kyc_failure.h @@ -0,0 +1,50 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 + */ +/** + * @file exchangedb/pg_insert_kyc_failure.h + * @brief implementation of the insert_kyc_failure function for Postgres + * @author Christian Grothoff + */ +#ifndef PG_INSERT_KYC_FAILURE_H +#define PG_INSERT_KYC_FAILURE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_exchangedb_plugin.h" + + +/** + * Update KYC process status to finished (and failed). + * + * @param cls closure + * @param process_row KYC process row to update + * @param h_payto account for which the attribute data is stored + * @param provider_section provider that must be checked + * @param provider_account_id provider account ID + * @param provider_legitimization_id provider legitimization ID + * @return database transaction status + */ +enum GNUNET_DB_QueryStatus +TEH_PG_insert_kyc_failure ( + void *cls, + uint64_t process_row, + const struct TALER_PaytoHashP *h_payto, + const char *provider_section, + const char *provider_account_id, + const char *provider_legitimization_id); + + +#endif diff --git a/src/exchangedb/pg_template.c b/src/exchangedb/pg_template.c index be54970f0..69cd45035 100644 --- a/src/exchangedb/pg_template.c +++ b/src/exchangedb/pg_template.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2023 Taler Systems SA + Copyright (C) 2024 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/exchangedb/pg_template.h b/src/exchangedb/pg_template.h index 7387b4883..d858689fb 100644 --- a/src/exchangedb/pg_template.h +++ b/src/exchangedb/pg_template.h @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2023 Taler Systems SA + Copyright (C) 2024 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/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index b21e5d62f..0de656987 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -81,6 +81,7 @@ #include "pg_get_drain_profit.h" #include "pg_get_purse_deposit.h" #include "pg_insert_contract.h" +#include "pg_insert_kyc_failure.h" #include "pg_select_contract.h" #include "pg_select_purse_merge.h" #include "pg_select_contract_by_purse.h" @@ -743,6 +744,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls) = &TEH_PG_begin_shard; plugin->abort_shard = &TEH_PG_abort_shard; + plugin->insert_kyc_failure + = &TEH_PG_insert_kyc_failure; plugin->complete_shard = &TEH_PG_complete_shard; plugin->release_revolving_shard diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 33546e008..c7bffbd89 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014-2023 Taler Systems SA + Copyright (C) 2014-2024 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 @@ -7186,6 +7186,26 @@ struct TALER_EXCHANGEDB_Plugin struct GNUNET_TIME_Timestamp *last_date); + /** + * Update KYC process status to finished (and failed). + * + * @param cls closure + * @param process_row KYC process row to update + * @param h_payto account for which the attribute data is stored + * @param provider_section provider that must be checked + * @param provider_account_id provider account ID + * @param provider_legitimization_id provider legitimization ID + * @return database transaction status + */ + enum GNUNET_DB_QueryStatus + (*insert_kyc_failure)( + void *cls, + uint64_t process_row, + const struct TALER_PaytoHashP *h_payto, + const char *provider_section, + const char *provider_account_id, + const char *provider_legitimization_id); + }; #endif /* _TALER_EXCHANGE_DB_H */ -- cgit v1.2.3