gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-exchange] branch master updated: set 'finished' to TRUE when KYC


From: gnunet
Subject: [taler-exchange] branch master updated: set 'finished' to TRUE when KYC process is done (either way, successful or failure); should fix #8055, needs testing
Date: Tue, 13 Feb 2024 22:02:35 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 2d6bce2d set 'finished' to TRUE when KYC process is done (either way, 
successful or failure); should fix #8055, needs testing
2d6bce2d is described below

commit 2d6bce2dc0ded9fcb77caa1cafecd401216b7238
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue Feb 13 22:01:02 2024 +0100

    set 'finished' to TRUE when KYC process is done (either way, successful or 
failure); should fix #8055, needs testing
---
 doc/prebuilt                                       |  2 +-
 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 +++++++-
 13 files changed, 248 insertions(+), 9 deletions(-)

diff --git a/doc/prebuilt b/doc/prebuilt
index 300a4693..60ccf04b 160000
--- a/doc/prebuilt
+++ b/doc/prebuilt
@@ -1 +1 @@
-Subproject commit 300a469342ba879b16ff93aaaf170fa1b88e75fb
+Subproject commit 60ccf04bb3579c249a899c4ae88e120acda13c83
diff --git a/src/exchange/taler-exchange-httpd_common_kyc.c 
b/src/exchange/taler-exchange-httpd_common_kyc.c
index 2a7193f4..bcee5a0d 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 57276604..8198679c 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 ef3583d0..b9ec3563 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 8bd6d4bb..b92b43e6 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 4febbfb1..99e44c87 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 2efc0aec..7db4d80c 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 00000000..c9fcd020
--- /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 <http://www.gnu.org/licenses/>
+ */
+/**
+ * @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 00000000..46d08df9
--- /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 <http://www.gnu.org/licenses/>
+ */
+/**
+ * @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 be54970f..69cd4503 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 7387b488..d858689f 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 b21e5d62..0de65698 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 33546e00..c7bffbd8 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 */

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]