/*
This file is part of TALER
Copyright (C) 2021 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 testing_api_cmd_kyc_get.c
* @brief command to test kyc_get request
* @author Christian Grothoff
*/
#include "platform.h"
#include
#include
#include "taler_merchant_service.h"
#include "taler_merchant_testing_lib.h"
/**
* State for a "/kyc" GET CMD.
*/
struct KycGetState
{
/**
* Operation handle for a GET /private/kyc GET request.
*/
struct TALER_MERCHANT_KycGetHandle *kgh;
/**
* Base URL of the merchant serving the request.
*/
const char *merchant_url;
/**
* Instance to query, NULL if part of @e merchant_url
*/
const char *instance_id;
/**
* Reference to command providing wire hash, NULL to
* query all accounts.
*/
const char *h_wire_ref;
/**
* URL of exchange to query.
*/
const char *exchange_url;
/**
* Set to the payto hash of the first account
* for which we failed to pass the KYC check.
*/
struct TALER_NormalizedPaytoHashP h_payto;
/**
* Access token the user needs to start a KYC process.
*/
struct TALER_AccountAccessTokenP access_token;
/**
* Expected HTTP response code.
*/
unsigned int expected_http_status;
/**
* Target for long-polling.
*/
enum TALER_EXCHANGE_KycLongPollTarget lpt;
/**
* Expected KYC state.
*/
bool expected_kyc_state;
/**
* Expected KYC state.
*/
bool have_access_token;
/**
* Interpreter state.
*/
struct TALER_TESTING_Interpreter *is;
};
/**
* Free the state of a "/kyc" GET CMD, and
* possibly cancel a pending "kyc" GET operation.
*
* @param cls closure with the `struct KycGetState`
* @param cmd command currently being freed.
*/
static void
kyc_get_cleanup (void *cls,
const struct TALER_TESTING_Command *cmd)
{
struct KycGetState *cs = cls;
if (NULL != cs->kgh)
{
TALER_LOG_WARNING ("/kyc GET operation did not complete\n");
TALER_MERCHANT_kyc_get_cancel (cs->kgh);
}
GNUNET_free (cs);
}
/**
* Process "GET /public/kyc_get" (lookup) response.
*
* @param cls closure
* @param kr response we got
*/
static void
kyc_get_cb (void *cls,
const struct TALER_MERCHANT_KycResponse *kr)
{
struct KycGetState *cs = cls;
cs->kgh = NULL;
if (kr->hr.http_status != cs->expected_http_status)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Expected status %u, got %u\n",
cs->expected_http_status,
kr->hr.http_status);
TALER_TESTING_FAIL (cs->is);
}
switch (kr->hr.http_status)
{
case MHD_HTTP_OK:
if (! cs->expected_kyc_state)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Expected KYC state %u, got %u\n",
cs->expected_kyc_state,
kr->details.ok.kycs_length);
TALER_TESTING_FAIL (cs->is);
}
for (unsigned int i = 0; idetails.ok.kycs_length; i++)
{
struct TALER_FullPayto payto_uri;
payto_uri = kr->details.ok.kycs[i].payto_uri;
if (NULL == payto_uri.full_payto)
{
continue;
}
TALER_full_payto_normalize_and_hash (payto_uri,
&cs->h_payto);
if (! kr->details.ok.kycs[i].no_access_token)
{
cs->access_token
= kr->details.ok.kycs[i].access_token;
cs->have_access_token = true;
}
break;
}
break;
}
TALER_TESTING_interpreter_next (cs->is);
}
/**
* Run the "kyc_get" CMD.
*
* @param cls closure.
* @param cmd command being currently run.
* @param is interpreter state.
*/
static void
kyc_get_run (void *cls,
const struct TALER_TESTING_Command *cmd,
struct TALER_TESTING_Interpreter *is)
{
struct KycGetState *cs = cls;
const struct TALER_MerchantWireHashP *h_wire = NULL;
cs->is = is;
if (NULL != cs->h_wire_ref)
{
const struct TALER_TESTING_Command *wire_cmd;
if (NULL ==
(wire_cmd =
TALER_TESTING_interpreter_lookup_command (cs->is,
cs->h_wire_ref)))
{
TALER_TESTING_FAIL (cs->is);
}
/* Note: at the time of writing, no command offers an h_wire trait,
so for now this code is dead and 'h_wire_ref' must always be NULL... */
if (GNUNET_OK !=
TALER_TESTING_get_trait_h_wire (wire_cmd,
&h_wire))
{
TALER_TESTING_FAIL (cs->is);
}
}
if (NULL == cs->instance_id)
cs->kgh = TALER_MERCHANT_kyc_get (
TALER_TESTING_interpreter_get_context (is),
cs->merchant_url,
h_wire,
cs->exchange_url,
cs->lpt,
TALER_EXCHANGE_KLPT_NONE == cs->lpt
? GNUNET_TIME_UNIT_ZERO
: GNUNET_TIME_UNIT_MINUTES,
&kyc_get_cb,
cs);
else
cs->kgh = TALER_MERCHANT_management_kyc_get (
TALER_TESTING_interpreter_get_context (is),
cs->merchant_url,
cs->instance_id,
h_wire,
cs->exchange_url,
cs->lpt,
TALER_EXCHANGE_KLPT_NONE == cs->lpt
? GNUNET_TIME_UNIT_ZERO
: GNUNET_TIME_UNIT_MINUTES,
&kyc_get_cb,
cs);
GNUNET_assert (NULL != cs->kgh);
}
/**
* Offer internal data from "KYC" GET CMD.
*
* @param cls closure.
* @param[out] ret result (could be anything).
* @param trait name of the trait.
* @param index index number of the object to offer.
* @return #GNUNET_OK on success.
*/
static enum GNUNET_GenericReturnValue
kyc_get_traits (void *cls,
const void **ret,
const char *trait,
unsigned int index)
{
struct KycGetState *cs = cls;
struct TALER_TESTING_Trait traits[] = {
/* Must be first, skipped if we have no token! */
TALER_TESTING_make_trait_account_access_token (
&cs->access_token),
TALER_TESTING_make_trait_h_normalized_payto (
&cs->h_payto),
TALER_TESTING_trait_end ()
};
return TALER_TESTING_get_trait (
&traits[cs->have_access_token
? 0
: 1],
ret,
trait,
index);
}
struct TALER_TESTING_Command
TALER_TESTING_cmd_merchant_kyc_get (
const char *label,
const char *merchant_url,
const char *instance_id,
const char *h_wire_ref,
const char *exchange_url,
enum TALER_EXCHANGE_KycLongPollTarget lpt,
unsigned int expected_http_status,
bool expected_kyc_state)
{
struct KycGetState *cs;
cs = GNUNET_new (struct KycGetState);
cs->merchant_url = merchant_url;
cs->instance_id = instance_id;
cs->h_wire_ref = h_wire_ref;
cs->exchange_url = exchange_url;
cs->lpt = lpt;
cs->expected_http_status = expected_http_status;
cs->expected_kyc_state = expected_kyc_state;
{
struct TALER_TESTING_Command cmd = {
.cls = cs,
.label = label,
.run = &kyc_get_run,
.cleanup = &kyc_get_cleanup,
.traits = &kyc_get_traits
};
return cmd;
}
}
/* end of testing_api_cmd_kyc_get.c */