kycaid cleanup
This commit is contained in:
parent
bb8eb61441
commit
ba006cd61b
@ -79,11 +79,6 @@ struct KycProofContext
|
|||||||
*/
|
*/
|
||||||
char *provider_legitimization_id;
|
char *provider_legitimization_id;
|
||||||
|
|
||||||
/**
|
|
||||||
* OAuth 2.0 authorization code.
|
|
||||||
*/
|
|
||||||
const char *authorization_code;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hash of payment target URI this is about.
|
* Hash of payment target URI this is about.
|
||||||
*/
|
*/
|
||||||
|
@ -84,7 +84,6 @@ libtaler_plugin_kyclogic_kycaid_la_LDFLAGS = \
|
|||||||
$(TALER_PLUGIN_LDFLAGS) \
|
$(TALER_PLUGIN_LDFLAGS) \
|
||||||
$(top_builddir)/src/json/libtalerjson.la \
|
$(top_builddir)/src/json/libtalerjson.la \
|
||||||
$(top_builddir)/src/curl/libtalercurl.la \
|
$(top_builddir)/src/curl/libtalercurl.la \
|
||||||
$(top_builddir)/src/templating/libtalertemplating.la \
|
|
||||||
$(top_builddir)/src/util/libtalerutil.la \
|
$(top_builddir)/src/util/libtalerutil.la \
|
||||||
-lgnunetutil \
|
-lgnunetutil \
|
||||||
-ljansson \
|
-ljansson \
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include "taler_mhd_lib.h"
|
#include "taler_mhd_lib.h"
|
||||||
#include "taler_curl_lib.h"
|
#include "taler_curl_lib.h"
|
||||||
#include "taler_json_lib.h"
|
#include "taler_json_lib.h"
|
||||||
#include "taler_templating_lib.h"
|
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
#include "taler_util.h"
|
#include "taler_util.h"
|
||||||
|
|
||||||
@ -181,20 +180,15 @@ struct TALER_KYCLOGIC_ProofHandle
|
|||||||
*/
|
*/
|
||||||
void *cb_cls;
|
void *cb_cls;
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle for the request.
|
|
||||||
*/
|
|
||||||
struct GNUNET_CURL_Job *job;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* URL of the cURL request.
|
|
||||||
*/
|
|
||||||
char *url;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connection we are handling.
|
* Connection we are handling.
|
||||||
*/
|
*/
|
||||||
struct MHD_Connection *connection;
|
struct MHD_Connection *connection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Task for asynchronous execution.
|
||||||
|
*/
|
||||||
|
struct GNUNET_SCHEDULER_Task *task;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -631,289 +625,41 @@ kycaid_initiate (void *cls,
|
|||||||
static void
|
static void
|
||||||
kycaid_proof_cancel (struct TALER_KYCLOGIC_ProofHandle *ph)
|
kycaid_proof_cancel (struct TALER_KYCLOGIC_ProofHandle *ph)
|
||||||
{
|
{
|
||||||
if (NULL != ph->job)
|
if (NULL != ph->task)
|
||||||
{
|
{
|
||||||
GNUNET_CURL_job_cancel (ph->job);
|
GNUNET_SCHEDULER_cancel (ph->task);
|
||||||
ph->job = NULL;
|
ph->task = NULL;
|
||||||
}
|
}
|
||||||
GNUNET_free (ph->url);
|
|
||||||
GNUNET_free (ph);
|
GNUNET_free (ph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call @a ph callback with HTTP response generated
|
* Call @a ph callback with HTTP error response.
|
||||||
* from @a template_name using the given @a template_data.
|
|
||||||
*
|
*
|
||||||
* @param ph proof handle to generate reply for
|
* @param cls proof handle to generate reply for
|
||||||
* @param http_status http response status to use
|
|
||||||
* @param template_name template to load and return
|
|
||||||
* @param[in] template_data data for the template, freed by this function!
|
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
proof_reply_with_template (struct TALER_KYCLOGIC_ProofHandle *ph,
|
proof_reply (void *cls)
|
||||||
unsigned int http_status,
|
|
||||||
const char *template_name,
|
|
||||||
json_t *template_data)
|
|
||||||
{
|
{
|
||||||
enum GNUNET_GenericReturnValue ret;
|
struct TALER_KYCLOGIC_ProofHandle *ph = cls;
|
||||||
struct MHD_Response *resp;
|
struct MHD_Response *resp;
|
||||||
|
|
||||||
ret = TALER_TEMPLATING_build (ph->connection,
|
resp = TALER_MHD_make_error (TALER_EC_GENERIC_ENDPOINT_UNKNOWN,
|
||||||
&http_status,
|
"there is no '/kyc-proof' for kycaid");
|
||||||
template_name,
|
|
||||||
NULL, /* no instance */
|
|
||||||
NULL, /* no Taler URI */
|
|
||||||
template_data,
|
|
||||||
&resp);
|
|
||||||
json_decref (template_data);
|
|
||||||
if (GNUNET_SYSERR == ret)
|
|
||||||
http_status = 0;
|
|
||||||
ph->cb (ph->cb_cls,
|
ph->cb (ph->cb_cls,
|
||||||
TALER_KYCLOGIC_STATUS_PROVIDER_FAILED,
|
TALER_KYCLOGIC_STATUS_PROVIDER_FAILED,
|
||||||
NULL, /* user id */
|
NULL, /* user id */
|
||||||
NULL, /* provider legi ID */
|
NULL, /* provider legi ID */
|
||||||
GNUNET_TIME_UNIT_ZERO_ABS, /* expiration */
|
GNUNET_TIME_UNIT_ZERO_ABS, /* expiration */
|
||||||
http_status,
|
MHD_HTTP_BAD_REQUEST,
|
||||||
resp);
|
resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called when we're done processing the
|
* Check KYC status and return status to human. Not
|
||||||
* HTTP "/verifications/{verification_id}" request.
|
* used by KYC AID!
|
||||||
*
|
|
||||||
* @param cls the `struct TALER_KYCLOGIC_ProofHandle`
|
|
||||||
* @param response_code HTTP response code, 0 on error
|
|
||||||
* @param response parsed JSON result, NULL on error
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
handle_proof_finished (void *cls,
|
|
||||||
long response_code,
|
|
||||||
const void *response)
|
|
||||||
{
|
|
||||||
struct TALER_KYCLOGIC_ProofHandle *ph = cls;
|
|
||||||
const json_t *j = response;
|
|
||||||
struct MHD_Response *resp;
|
|
||||||
|
|
||||||
ph->job = NULL;
|
|
||||||
switch (response_code)
|
|
||||||
{
|
|
||||||
case MHD_HTTP_OK:
|
|
||||||
{
|
|
||||||
const char *applicant_id;
|
|
||||||
const char *verification_id;
|
|
||||||
bool verified;
|
|
||||||
json_t *verifications;
|
|
||||||
struct GNUNET_JSON_Specification spec[] = {
|
|
||||||
GNUNET_JSON_spec_string ("applicant_id",
|
|
||||||
&applicant_id),
|
|
||||||
GNUNET_JSON_spec_string ("verification_id",
|
|
||||||
&verification_id),
|
|
||||||
GNUNET_JSON_spec_bool ("verified",
|
|
||||||
&verified),
|
|
||||||
GNUNET_JSON_spec_json ("verifications",
|
|
||||||
&verifications),
|
|
||||||
GNUNET_JSON_spec_end ()
|
|
||||||
};
|
|
||||||
struct GNUNET_TIME_Absolute expiration;
|
|
||||||
|
|
||||||
if (GNUNET_OK !=
|
|
||||||
GNUNET_JSON_parse (j,
|
|
||||||
spec,
|
|
||||||
NULL, NULL))
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
GNUNET_break_op (0);
|
|
||||||
json_dumpf (j,
|
|
||||||
stderr,
|
|
||||||
JSON_INDENT (2));
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_BAD_GATEWAY,
|
|
||||||
"bad_gateway",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* FIXME: comment out, unless debugging ... */
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
|
||||||
"The provider returned the following verifications:\n");
|
|
||||||
json_dumpf (verifications,
|
|
||||||
stderr,
|
|
||||||
JSON_INDENT (2));
|
|
||||||
if (verified)
|
|
||||||
{
|
|
||||||
// FIXME: or should we return an empty body? Redirect?
|
|
||||||
resp = TALER_MHD_make_json_steal (json_object ());
|
|
||||||
// FIXME: setup redirect?
|
|
||||||
expiration = GNUNET_TIME_relative_to_absolute (ph->pd->validity);
|
|
||||||
ph->cb (ph->cb_cls,
|
|
||||||
TALER_KYCLOGIC_STATUS_SUCCESS,
|
|
||||||
applicant_id,
|
|
||||||
verification_id,
|
|
||||||
expiration,
|
|
||||||
MHD_HTTP_OK, // OK, or redirect???
|
|
||||||
resp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
GNUNET_break_op (0);
|
|
||||||
json_dumpf (j,
|
|
||||||
stderr,
|
|
||||||
JSON_INDENT (2));
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("verifiations",
|
|
||||||
(json_t *) verifications));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_OK,
|
|
||||||
"kyc_user_failed",
|
|
||||||
template_data);
|
|
||||||
}
|
|
||||||
GNUNET_JSON_parse_free (spec);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MHD_HTTP_BAD_REQUEST:
|
|
||||||
case MHD_HTTP_NOT_FOUND:
|
|
||||||
case MHD_HTTP_CONFLICT:
|
|
||||||
case MHD_HTTP_UNPROCESSABLE_ENTITY: /* validation */
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
|
||||||
"KYCAID failed with response %u:\n",
|
|
||||||
(unsigned int) response_code);
|
|
||||||
json_dumpf (j,
|
|
||||||
stderr,
|
|
||||||
JSON_INDENT (2));
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_uint64 ("kyc_http_status",
|
|
||||||
response_code),
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
|
||||||
"kyc_interaction_failed",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MHD_HTTP_UNAUTHORIZED:
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_uint64 ("kyc_http_status",
|
|
||||||
response_code),
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
|
||||||
"kyc_provider_unauthorized",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MHD_HTTP_PAYMENT_REQUIRED:
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_uint64 ("kyc_http_status",
|
|
||||||
response_code),
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
|
||||||
"kyc_provider_unpaid",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MHD_HTTP_REQUEST_TIMEOUT:
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_uint64 ("kyc_http_status",
|
|
||||||
response_code),
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
|
||||||
"kyc_provider_timeout",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MHD_HTTP_TOO_MANY_REQUESTS:
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_uint64 ("kyc_http_status",
|
|
||||||
response_code),
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
|
||||||
"kyc_provider_ratelimit",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MHD_HTTP_INTERNAL_SERVER_ERROR:
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_uint64 ("kyc_http_status",
|
|
||||||
response_code),
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
|
||||||
"kyc_provider_internal_error",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
json_t *template_data;
|
|
||||||
|
|
||||||
template_data = GNUNET_JSON_PACK (
|
|
||||||
GNUNET_JSON_pack_uint64 ("kyc_http_status",
|
|
||||||
response_code),
|
|
||||||
GNUNET_JSON_pack_string ("kyc_logic",
|
|
||||||
"kycaid"),
|
|
||||||
GNUNET_JSON_pack_object_incref ("kyc_server_reply",
|
|
||||||
(json_t *) j));
|
|
||||||
proof_reply_with_template (ph,
|
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
|
||||||
"kyc_provider_unexpected_reply",
|
|
||||||
template_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
kycaid_proof_cancel (ph);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check KYC status and return status to human.
|
|
||||||
*
|
*
|
||||||
* @param cls the @e cls of this struct with the plugin-specific state
|
* @param cls the @e cls of this struct with the plugin-specific state
|
||||||
* @param pd provider configuration details
|
* @param pd provider configuration details
|
||||||
@ -941,14 +687,6 @@ kycaid_proof (void *cls,
|
|||||||
{
|
{
|
||||||
struct PluginState *ps = cls;
|
struct PluginState *ps = cls;
|
||||||
struct TALER_KYCLOGIC_ProofHandle *ph;
|
struct TALER_KYCLOGIC_ProofHandle *ph;
|
||||||
CURL *eh;
|
|
||||||
|
|
||||||
eh = curl_easy_init ();
|
|
||||||
if (NULL == eh)
|
|
||||||
{
|
|
||||||
GNUNET_break (0);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ph = GNUNET_new (struct TALER_KYCLOGIC_ProofHandle);
|
ph = GNUNET_new (struct TALER_KYCLOGIC_ProofHandle);
|
||||||
ph->ps = ps;
|
ph->ps = ps;
|
||||||
@ -956,27 +694,8 @@ kycaid_proof (void *cls,
|
|||||||
ph->cb = cb;
|
ph->cb = cb;
|
||||||
ph->cb_cls = cb_cls;
|
ph->cb_cls = cb_cls;
|
||||||
ph->connection = connection;
|
ph->connection = connection;
|
||||||
GNUNET_asprintf (&ph->url,
|
ph->task = GNUNET_SCHEDULER_add_now (&proof_reply,
|
||||||
"https://api.kycaid.com/verifications/%s",
|
ph);
|
||||||
provider_legitimization_id);
|
|
||||||
GNUNET_break (CURLE_OK ==
|
|
||||||
curl_easy_setopt (eh,
|
|
||||||
CURLOPT_VERBOSE,
|
|
||||||
1));
|
|
||||||
GNUNET_assert (CURLE_OK ==
|
|
||||||
curl_easy_setopt (eh,
|
|
||||||
CURLOPT_MAXREDIRS,
|
|
||||||
1L));
|
|
||||||
GNUNET_break (CURLE_OK ==
|
|
||||||
curl_easy_setopt (eh,
|
|
||||||
CURLOPT_URL,
|
|
||||||
ph->url));
|
|
||||||
ph->job = GNUNET_CURL_job_add (ps->curl_ctx,
|
|
||||||
eh,
|
|
||||||
&handle_proof_finished,
|
|
||||||
ph);
|
|
||||||
GNUNET_CURL_extend_headers (ph->job,
|
|
||||||
pd->slist);
|
|
||||||
return ph;
|
return ph;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1029,6 +748,8 @@ handle_webhook_finished (void *cls,
|
|||||||
{
|
{
|
||||||
const char *applicant_id;
|
const char *applicant_id;
|
||||||
const char *verification_id;
|
const char *verification_id;
|
||||||
|
const char *status;
|
||||||
|
const char *type;
|
||||||
bool verified;
|
bool verified;
|
||||||
json_t *verifications;
|
json_t *verifications;
|
||||||
struct GNUNET_JSON_Specification spec[] = {
|
struct GNUNET_JSON_Specification spec[] = {
|
||||||
@ -1036,6 +757,10 @@ handle_webhook_finished (void *cls,
|
|||||||
&applicant_id),
|
&applicant_id),
|
||||||
GNUNET_JSON_spec_string ("verification_id",
|
GNUNET_JSON_spec_string ("verification_id",
|
||||||
&verification_id),
|
&verification_id),
|
||||||
|
GNUNET_JSON_spec_string ("type",
|
||||||
|
&type),
|
||||||
|
GNUNET_JSON_spec_string ("status",
|
||||||
|
&status),
|
||||||
GNUNET_JSON_spec_bool ("verified",
|
GNUNET_JSON_spec_bool ("verified",
|
||||||
&verified),
|
&verified),
|
||||||
GNUNET_JSON_spec_json ("verifications",
|
GNUNET_JSON_spec_json ("verifications",
|
||||||
@ -1075,9 +800,11 @@ handle_webhook_finished (void *cls,
|
|||||||
json_dumpf (verifications,
|
json_dumpf (verifications,
|
||||||
stderr,
|
stderr,
|
||||||
JSON_INDENT (2));
|
JSON_INDENT (2));
|
||||||
|
resp = MHD_create_response_from_buffer (0,
|
||||||
|
"",
|
||||||
|
MHD_RESPMEM_PERSISTENT);
|
||||||
if (verified)
|
if (verified)
|
||||||
{
|
{
|
||||||
resp = TALER_MHD_make_json_steal (json_object ());
|
|
||||||
expiration = GNUNET_TIME_relative_to_absolute (wh->pd->validity);
|
expiration = GNUNET_TIME_relative_to_absolute (wh->pd->validity);
|
||||||
wh->cb (wh->cb_cls,
|
wh->cb (wh->cb_cls,
|
||||||
wh->legi_row,
|
wh->legi_row,
|
||||||
@ -1086,12 +813,11 @@ handle_webhook_finished (void *cls,
|
|||||||
wh->verification_id,
|
wh->verification_id,
|
||||||
TALER_KYCLOGIC_STATUS_SUCCESS,
|
TALER_KYCLOGIC_STATUS_SUCCESS,
|
||||||
expiration,
|
expiration,
|
||||||
MHD_HTTP_OK,
|
MHD_HTTP_NO_CONTENT,
|
||||||
resp);
|
resp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resp = TALER_MHD_make_json_steal (json_object ());
|
|
||||||
wh->cb (wh->cb_cls,
|
wh->cb (wh->cb_cls,
|
||||||
wh->legi_row,
|
wh->legi_row,
|
||||||
&wh->h_payto,
|
&wh->h_payto,
|
||||||
@ -1099,7 +825,7 @@ handle_webhook_finished (void *cls,
|
|||||||
wh->verification_id,
|
wh->verification_id,
|
||||||
TALER_KYCLOGIC_STATUS_USER_ABORTED,
|
TALER_KYCLOGIC_STATUS_USER_ABORTED,
|
||||||
GNUNET_TIME_UNIT_ZERO_ABS,
|
GNUNET_TIME_UNIT_ZERO_ABS,
|
||||||
MHD_HTTP_OK,
|
MHD_HTTP_NO_CONTENT,
|
||||||
resp);
|
resp);
|
||||||
}
|
}
|
||||||
GNUNET_JSON_parse_free (spec);
|
GNUNET_JSON_parse_free (spec);
|
||||||
|
@ -1457,12 +1457,6 @@ main (int argc,
|
|||||||
"SECTION_NAME",
|
"SECTION_NAME",
|
||||||
"initiate KYC check using provider configured in SECTION_NAME of the configuration",
|
"initiate KYC check using provider configured in SECTION_NAME of the configuration",
|
||||||
&initiate_section),
|
&initiate_section),
|
||||||
GNUNET_GETOPT_option_string (
|
|
||||||
'i',
|
|
||||||
"initiate",
|
|
||||||
"SECTION_NAME",
|
|
||||||
"initiate KYC check using provider configured in SECTION_NAME of the configuration",
|
|
||||||
&initiate_section),
|
|
||||||
GNUNET_GETOPT_option_string (
|
GNUNET_GETOPT_option_string (
|
||||||
'u',
|
'u',
|
||||||
"user",
|
"user",
|
||||||
|
Loading…
Reference in New Issue
Block a user