fix Persona attribute extraction from webhooks

This commit is contained in:
Christian Grothoff 2023-01-28 14:06:19 +01:00
parent 8c5a12302e
commit 2aff69e7ec
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
2 changed files with 46 additions and 56 deletions

View File

@ -987,6 +987,9 @@ convert_attributes (const json_t *attr)
NULL, NULL))
{
GNUNET_break (0);
json_dumpf (attr,
stderr,
JSON_INDENT (2));
return NULL;
}
{
@ -1074,35 +1077,6 @@ convert_attributes (const json_t *attr)
}
/**
* Extract and convert KYC attribute data from
* Persona response.
*
* @param included json array with various data
* @return KYC attribute data
*/
static json_t *
extract_attributes (const json_t *included)
{
size_t idx;
json_t *obj;
json_array_foreach (included, idx, obj)
{
const char *type = json_string_value (json_object_get (obj,
"type"));
json_t *attr;
if (0 != strcmp (type,
"verification/database"))
continue;
attr = json_object_get (obj,
"attributes");
return convert_attributes (attr);
}
return NULL;
}
/**
* Return a response for the @a ph request indicating a
* protocol violation by the Persona server.
@ -1120,9 +1094,6 @@ return_invalid_response (struct TALER_KYCLOGIC_ProofHandle *ph,
const char *detail,
const json_t *data)
{
json_dumpf (data,
stderr,
JSON_INDENT (2));
proof_reply_error (
ph,
inquiry_id,
@ -1647,8 +1618,8 @@ webhook_generic_reply (struct TALER_KYCLOGIC_WebhookHandle *wh,
wh->cb (wh->cb_cls,
wh->process_row,
&wh->h_payto,
account_id,
wh->pd->section,
account_id,
inquiry_id,
status,
expiration,
@ -1696,8 +1667,6 @@ handle_webhook_finished (void *cls,
const json_t *j = response;
const json_t *data = json_object_get (j,
"data");
const json_t *included = json_object_get (j,
"included");
wh->job = NULL;
switch (response_code)
@ -1708,6 +1677,7 @@ handle_webhook_finished (void *cls,
const char *account_id;
const char *type = NULL;
json_t *attributes;
json_t *relationships;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_string ("type",
&type),
@ -1715,6 +1685,8 @@ handle_webhook_finished (void *cls,
&inquiry_id),
GNUNET_JSON_spec_json ("attributes",
&attributes),
GNUNET_JSON_spec_json ("relationships",
&relationships),
GNUNET_JSON_spec_end ()
};
@ -1805,9 +1777,7 @@ handle_webhook_finished (void *cls,
json_object_get (
json_object_get (
json_object_get (
json_object_get (
data,
"relationships"),
relationships,
"account"),
"data"),
"id"));
@ -1838,7 +1808,7 @@ handle_webhook_finished (void *cls,
break;
}
attr = extract_attributes (included);
attr = convert_attributes (attributes);
webhook_generic_reply (wh,
TALER_KYCLOGIC_STATUS_SUCCESS,
account_id,
@ -2042,13 +2012,13 @@ persona_webhook (void *cls,
wh->ps = ps;
wh->connection = connection;
wh->pd = pd;
auth_header = MHD_lookup_connection_value (connection,
MHD_HEADER_KIND,
MHD_HTTP_HEADER_AUTHORIZATION);
if ( (NULL != ps->webhook_token) &&
(0 != strcmp (ps->webhook_token,
auth_header)) )
( (NULL == auth_header) ||
(0 != strcmp (ps->webhook_token,
auth_header)) ) )
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Invalid authorization header `%s' received for Persona webhook\n",

View File

@ -459,12 +459,26 @@ webhook_finished_cb (
(void) expiration;
(void) provider_section;
kwh->wh = NULL;
GNUNET_break (0 == GNUNET_memcmp (account_id,
&cmd_line_h_payto));
GNUNET_break (0 == strcmp (provider_user_id,
cmd_provider_user_id));
GNUNET_break (0 == strcmp (provider_legitimization_id,
cmd_provider_legitimization_id));
if (0 != GNUNET_memcmp (account_id,
&cmd_line_h_payto))
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Received webhook for unexpected account\n");
}
if (0 != strcmp (provider_user_id,
cmd_provider_user_id))
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Received webhook for unexpected provider user ID (%s)\n",
provider_user_id);
}
if (0 != strcmp (provider_legitimization_id,
cmd_provider_legitimization_id))
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Received webhook for unexpected provider legitimization ID (%s)\n",
provider_legitimization_id);
}
switch (status)
{
case TALER_KYCLOGIC_STATUS_SUCCESS:
@ -568,9 +582,6 @@ handler_kyc_webhook_generic (
{
struct KycWebhookContext *kwh = rc->rh_ctx;
json_dumpf (root,
stderr,
JSON_INDENT (2));
if (NULL == kwh)
{ /* first time */
kwh = GNUNET_new (struct KycWebhookContext);
@ -1363,11 +1374,20 @@ initiate_cb (
GNUNET_SCHEDULER_shutdown ();
return;
}
fprintf (stdout,
"Visit `%s' to begin KYC process.\nAlso use: taler-exchange-kyc-tester -w -u '%s' -U '%s'\n",
redirect_url,
provider_user_id,
provider_legitimization_id);
{
char *s;
s = GNUNET_STRINGS_data_to_string_alloc (&cmd_line_h_payto,
sizeof (cmd_line_h_payto));
fprintf (stdout,
"Visit `%s' to begin KYC process.\nAlso use: taler-exchange-kyc-tester -w -u '%s' -U '%s' -p %s\n",
redirect_url,
provider_user_id,
provider_legitimization_id,
s);
GNUNET_free (s);
}
GNUNET_free (cmd_provider_user_id);
GNUNET_free (cmd_provider_legitimization_id);
if (NULL != provider_user_id)