From b533026632963efcb01b9a193aa45806e02aafa1 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 5 Aug 2022 15:08:47 +0200 Subject: [PATCH] adding kyclogic plugin template --- configure.ac | 1 + src/Makefile.am | 1 + src/exchange/taler-exchange-httpd_kyc.h | 1 + src/exchangedb/plugin_exchangedb_postgres.c | 1 + src/include/taler_exchangedb_plugin.h | 1 + src/kyclogic/Makefile.am | 36 +++ src/kyclogic/kyclogic-oauth2.conf | 0 src/kyclogic/kyclogic.conf | 0 src/kyclogic/plugin_kyclogic_oauth2.c | 265 ++++++++++++++++++++ src/kyclogic/plugin_kyclogic_template.c | 265 ++++++++++++++++++++ 10 files changed, 571 insertions(+) create mode 100644 src/kyclogic/Makefile.am create mode 100644 src/kyclogic/kyclogic-oauth2.conf create mode 100644 src/kyclogic/kyclogic.conf create mode 100644 src/kyclogic/plugin_kyclogic_oauth2.c create mode 100644 src/kyclogic/plugin_kyclogic_template.c diff --git a/configure.ac b/configure.ac index f91973fe3..bbb0fabff 100644 --- a/configure.ac +++ b/configure.ac @@ -533,6 +533,7 @@ AC_CONFIG_FILES([Makefile src/exchange-tools/Makefile src/extensions/Makefile src/lib/Makefile + src/kyclogic/Makefile src/testing/Makefile src/benchmark/Makefile src/include/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 5d46850c2..05c0b7421 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -25,6 +25,7 @@ SUBDIRS = \ mhd \ bank-lib \ exchangedb \ + kyclogic \ exchange \ auditordb \ auditor \ diff --git a/src/exchange/taler-exchange-httpd_kyc.h b/src/exchange/taler-exchange-httpd_kyc.h index ea409c750..1df264c15 100644 --- a/src/exchange/taler-exchange-httpd_kyc.h +++ b/src/exchange/taler-exchange-httpd_kyc.h @@ -22,6 +22,7 @@ #define TALER_EXCHANGE_HTTPD_KYC_H #include +#include "taler_exchangedb_plugin.h" #include "taler_kyclogic_plugin.h" diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index e9aa7c833..7c066784a 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -16589,6 +16589,7 @@ postgres_insert_kyc_requirement_for_account ( * expiration data. * * @param cls closure + * @param legi_row row to select by * @param provider_section provider that must be checked * @param h_payto account that must be KYC'ed * @param provider_account_id provider account ID diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index bf7451758..5411fbe17 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -5664,6 +5664,7 @@ struct TALER_EXCHANGEDB_Plugin * expiration data. * * @param cls closure + * @param legi_row row to select by * @param provider_section provider that must be checked * @param h_payto account that must be KYC'ed * @param provider_account_id provider account ID diff --git a/src/kyclogic/Makefile.am b/src/kyclogic/Makefile.am new file mode 100644 index 000000000..4a4f60a48 --- /dev/null +++ b/src/kyclogic/Makefile.am @@ -0,0 +1,36 @@ +# This Makefile.am is in the public domain +AM_CPPFLAGS = -I$(top_srcdir)/src/include + +if USE_COVERAGE + AM_CFLAGS = --coverage -O0 + XLIB = -lgcov +endif + +pkgcfgdir = $(prefix)/share/taler/config.d/ + +pkgcfg_DATA = \ + kyclogic.conf \ + kyclogic-oauth2.conf + +EXTRA_DIST = \ + kyclogic.conf \ + kyclogic-oauth2.conf + +plugindir = $(libdir)/taler + +plugin_LTLIBRARIES = \ + libtaler_plugin_kyclogic_oauth2.la + +libtaler_plugin_kyclogic_oauth2_la_SOURCES = \ + plugin_kyclogic_oauth2.c +libtaler_plugin_kyclogic_oauth2_la_LIBADD = \ + $(LTLIBINTL) +libtaler_plugin_kyclogic_oauth2_la_LDFLAGS = \ + $(TALER_PLUGIN_LDFLAGS) \ + $(top_builddir)/src/json/libtalerjson.la \ + $(top_builddir)/src/util/libtalerutil.la \ + -lgnunetutil \ + -ljansson \ + $(XLIB) + +AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH=$${TALER_PREFIX:-@prefix@}/bin:$$PATH; diff --git a/src/kyclogic/kyclogic-oauth2.conf b/src/kyclogic/kyclogic-oauth2.conf new file mode 100644 index 000000000..e69de29bb diff --git a/src/kyclogic/kyclogic.conf b/src/kyclogic/kyclogic.conf new file mode 100644 index 000000000..e69de29bb diff --git a/src/kyclogic/plugin_kyclogic_oauth2.c b/src/kyclogic/plugin_kyclogic_oauth2.c new file mode 100644 index 000000000..c17e9f8a5 --- /dev/null +++ b/src/kyclogic/plugin_kyclogic_oauth2.c @@ -0,0 +1,265 @@ +/* + This file is part of GNU Taler + Copyright (C) 2022 Taler Systems SA + + Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License along with + Taler; see the file COPYING.GPL. If not, see +*/ +/** + * @file plugin_kyclogic_oauth2.c + * @brief oauth2.0 based authentication flow logic + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_kyclogic_plugin.h" +#include +#include +#include +#include "taler_util.h" + +/** + * Keeps the plugin-specific state for + * a given configuration section. + */ +struct TALER_KYCLOGIC_ProviderDetails +{ + +}; + + +/** + * Handle for an initiation operation. + */ +struct TALER_KYCLOGIC_InitiateHandle +{ +}; + + +/** + * Handle for an KYC proof operation. + */ +struct TALER_KYCLOGIC_ProofHandle +{ +}; + + +/** + * Handle for an KYC Web hook operation. + */ +struct TALER_KYCLOGIC_WebhookHandle +{ +}; + + +/** + * Saves the state of a plugin. + */ +struct PluginState +{ + + /** + * Our global configuration. + */ + const struct GNUNET_CONFIGURATION_Handle *cfg; + +}; + + +/** + * Load the configuration of the KYC provider. + * + * @param cls closure + * @param provider_section_name configuration section to parse + * @return NULL if configuration is invalid + */ +static struct TALER_KYCLOGIC_ProviderDetails * +oauth2_load_configuration (void *cls, + const char *provider_section_name) +{ + return NULL; +} + + +/** + * Release configuration resources previously loaded + * + * @param[in] pd configuration to release + */ +static void +oauth2_unload_configuration (struct TALER_KYCLOGIC_ProviderDetails *pd) +{ +} + + +/** + * Initiate KYC check. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param pd provider configuration details + * @param account_id which account to trigger process for + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle to cancel operation early + */ +static struct TALER_KYCLOGIC_InitiateHandle * +oauth2_initiate (void *cls, + const struct TALER_KYCLOGIC_ProviderDetails *pd, + const struct TALER_PaytoHashP *account_id, + TALER_KYCLOGIC_InitiateCallback cb, + void *cb_cls) +{ + return NULL; +} + + +/** + * Cancel KYC check initiation. + * + * @param[in] ih handle of operation to cancel + */ +static void +oauth2_initiate_cancel (struct TALER_KYCLOGIC_InitiateHandle *ih) +{ +} + + +/** + * Check KYC status and return status to human. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param pd provider configuration details + * @param account_id which account to trigger process for + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle to cancel operation early + */ +static struct TALER_KYCLOGIC_ProofHandle * +oauth2_proof (void *cls, + const struct TALER_KYCLOGIC_ProviderDetails *pd, + const struct TALER_PaytoHashP *account_id, + const char *provider_user_id, + const char *provider_legitimization_id, + TALER_KYCLOGIC_ProofCallback cb, + void *cb_cls) +{ + return NULL; +} + + +/** + * Cancel KYC proof. + * + * @param[in] ph handle of operation to cancel + */ +static void +oauth2_proof_cancel (struct TALER_KYCLOGIC_ProofHandle *ph) +{ +} + + +/** + * Check KYC status and return result for Webhook. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param pd provider configuration details + * @param plc callback to lookup accounts with + * @param plc_cls closure for @a plc + * @param http_method HTTP method used for the webhook + * @param url_path rest of the URL after `/kyc-webhook/` + * @param connection MHD connection object (for HTTP headers) + * @param body_size number of bytes in @a body + * @param body HTTP request body + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle to cancel operation early + */ +static struct TALER_KYCLOGIC_InitiateHandle * +oauth2_webhook (void *cls, + const struct TALER_KYCLOGIC_ProviderDetails *pd, + TALER_KYCLOGIC_ProviderLookupCallback plc, + void *plc_cls, + const char *http_method, + const char *url_path, + struct MHD_Connection *connection, + size_t body_size, + const void *body, + TALER_KYCLOGIC_WebhookCallback cb, + void *cb_cls) +{ + GNUNET_break_op (0); + return NULL; +} + + +/** + * Cancel KYC webhook execution. + * + * @param[in] wh handle of operation to cancel + */ +static void +oauth2_webhook_cancel (struct TALER_KYCLOGIC_WebhookHandle *wh) +{ +} + + +/** + * Initialize OAuth2.0 KYC logic plugin + * + * @param cls a configuration instance + * @return NULL on error, otherwise a `struct TALER_KYCLOGIC_Plugin` + */ +void * +libtaler_plugin_kyclogic_oauth2_init (void *cls) +{ + const struct GNUNET_CONFIGURATION_Handle *cfg = cls; + struct TALER_KYCLOGIC_Plugin *plugin; + struct PluginState *ps; + + ps = GNUNET_new (struct PluginState); + ps->cfg = cfg; + plugin = GNUNET_new (struct TALER_KYCLOGIC_Plugin); + plugin->cls = ps; + plugin->load_configuration + = &oauth2_load_configuration; + plugin->unload_configuration + = &oauth2_unload_configuration; + plugin->initiate + = &oauth2_initiate; + plugin->initiate_cancel + = &oauth2_initiate_cancel; + plugin->proof + = &oauth2_proof; + plugin->proof_cancel + = &oauth2_proof_cancel; + plugin->webhook + = &oauth2_webhook; + plugin->webhook_cancel + = &oauth2_webhook_cancel; + return plugin; +} + + +/** + * Unload authorization plugin + * + * @param cls a `struct TALER_KYCLOGIC_Plugin` + * @return NULL (always) + */ +void * +libtaler_plugin_kyclogic_oauth2_done (void *cls) +{ + struct TALER_KYCLOGIC_Plugin *plugin = cls; + struct PluginState *ps = plugin->cls; + + GNUNET_free (ps); + GNUNET_free (plugin); + return NULL; +} diff --git a/src/kyclogic/plugin_kyclogic_template.c b/src/kyclogic/plugin_kyclogic_template.c new file mode 100644 index 000000000..ff325c0d4 --- /dev/null +++ b/src/kyclogic/plugin_kyclogic_template.c @@ -0,0 +1,265 @@ +/* + This file is part of GNU Taler + Copyright (C) 2022 Taler Systems SA + + Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License along with + Taler; see the file COPYING.GPL. If not, see +*/ +/** + * @file plugin_kyclogic_template.c + * @brief template for an authentication flow logic + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_kyclogic_plugin.h" +#include +#include +#include +#include "taler_util.h" + +/** + * Keeps the plugin-specific state for + * a given configuration section. + */ +struct TALER_KYCLOGIC_ProviderDetails +{ + +}; + + +/** + * Handle for an initiation operation. + */ +struct TALER_KYCLOGIC_InitiateHandle +{ +}; + + +/** + * Handle for an KYC proof operation. + */ +struct TALER_KYCLOGIC_ProofHandle +{ +}; + + +/** + * Handle for an KYC Web hook operation. + */ +struct TALER_KYCLOGIC_WebhookHandle +{ +}; + + +/** + * Saves the state of a plugin. + */ +struct PluginState +{ + + /** + * Our global configuration. + */ + const struct GNUNET_CONFIGURATION_Handle *cfg; + +}; + + +/** + * Load the configuration of the KYC provider. + * + * @param cls closure + * @param provider_section_name configuration section to parse + * @return NULL if configuration is invalid + */ +static struct TALER_KYCLOGIC_ProviderDetails * +template_load_configuration (void *cls, + const char *provider_section_name) +{ + return NULL; +} + + +/** + * Release configuration resources previously loaded + * + * @param[in] pd configuration to release + */ +static void +template_unload_configuration (struct TALER_KYCLOGIC_ProviderDetails *pd) +{ +} + + +/** + * Initiate KYC check. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param pd provider configuration details + * @param account_id which account to trigger process for + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle to cancel operation early + */ +static struct TALER_KYCLOGIC_InitiateHandle * +template_initiate (void *cls, + const struct TALER_KYCLOGIC_ProviderDetails *pd, + const struct TALER_PaytoHashP *account_id, + TALER_KYCLOGIC_InitiateCallback cb, + void *cb_cls) +{ + return NULL; +} + + +/** + * Cancel KYC check initiation. + * + * @param[in] ih handle of operation to cancel + */ +static void +template_initiate_cancel (struct TALER_KYCLOGIC_InitiateHandle *ih) +{ +} + + +/** + * Check KYC status and return status to human. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param pd provider configuration details + * @param account_id which account to trigger process for + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle to cancel operation early + */ +static struct TALER_KYCLOGIC_ProofHandle * +template_proof (void *cls, + const struct TALER_KYCLOGIC_ProviderDetails *pd, + const struct TALER_PaytoHashP *account_id, + const char *provider_user_id, + const char *provider_legitimization_id, + TALER_KYCLOGIC_ProofCallback cb, + void *cb_cls) +{ + return NULL; +} + + +/** + * Cancel KYC proof. + * + * @param[in] ph handle of operation to cancel + */ +static void +template_proof_cancel (struct TALER_KYCLOGIC_ProofHandle *ph) +{ +} + + +/** + * Check KYC status and return result for Webhook. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param pd provider configuration details + * @param plc callback to lookup accounts with + * @param plc_cls closure for @a plc + * @param http_method HTTP method used for the webhook + * @param url_path rest of the URL after `/kyc-webhook/` + * @param connection MHD connection object (for HTTP headers) + * @param body_size number of bytes in @a body + * @param body HTTP request body + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle to cancel operation early + */ +static struct TALER_KYCLOGIC_InitiateHandle * +template_webhook (void *cls, + const struct TALER_KYCLOGIC_ProviderDetails *pd, + TALER_KYCLOGIC_ProviderLookupCallback plc, + void *plc_cls, + const char *http_method, + const char *url_path, + struct MHD_Connection *connection, + size_t body_size, + const void *body, + TALER_KYCLOGIC_WebhookCallback cb, + void *cb_cls) +{ + GNUNET_break_op (0); + return NULL; +} + + +/** + * Cancel KYC webhook execution. + * + * @param[in] wh handle of operation to cancel + */ +static void +template_webhook_cancel (struct TALER_KYCLOGIC_WebhookHandle *wh) +{ +} + + +/** + * Initialize Template.0 KYC logic plugin + * + * @param cls a configuration instance + * @return NULL on error, otherwise a `struct TALER_KYCLOGIC_Plugin` + */ +void * +libtaler_plugin_kyclogic_template_init (void *cls) +{ + const struct GNUNET_CONFIGURATION_Handle *cfg = cls; + struct TALER_KYCLOGIC_Plugin *plugin; + struct PluginState *ps; + + ps = GNUNET_new (struct PluginState); + ps->cfg = cfg; + plugin = GNUNET_new (struct TALER_KYCLOGIC_Plugin); + plugin->cls = ps; + plugin->load_configuration + = &template_load_configuration; + plugin->unload_configuration + = &template_unload_configuration; + plugin->initiate + = &template_initiate; + plugin->initiate_cancel + = &template_initiate_cancel; + plugin->proof + = &template_proof; + plugin->proof_cancel + = &template_proof_cancel; + plugin->webhook + = &template_webhook; + plugin->webhook_cancel + = &template_webhook_cancel; + return plugin; +} + + +/** + * Unload authorization plugin + * + * @param cls a `struct TALER_KYCLOGIC_Plugin` + * @return NULL (always) + */ +void * +libtaler_plugin_kyclogic_template_done (void *cls) +{ + struct TALER_KYCLOGIC_Plugin *plugin = cls; + struct PluginState *ps = plugin->cls; + + GNUNET_free (ps); + GNUNET_free (plugin); + return NULL; +}