exchange/src/exchange/taler-exchange-httpd.h

370 lines
7.8 KiB
C

/*
This file is part of TALER
Copyright (C) 2014-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. If not, see <http://www.gnu.org/licenses/>
*/
/**
* @file taler-exchange-httpd.h
* @brief Global declarations for the exchange
* @author Florian Dold
* @author Benedikt Mueller
* @author Christian Grothoff
*/
#ifndef TALER_EXCHANGE_HTTPD_H
#define TALER_EXCHANGE_HTTPD_H
#include <microhttpd.h>
#include "taler_json_lib.h"
#include "taler_crypto_lib.h"
#include "taler_kyclogic_plugin.h"
#include "taler_extensions.h"
#include <gnunet/gnunet_mhd_compat.h>
/* ************* NOTE: OLD KYC logic,***********
new logic is in taler-exchange-httpd_kyc.h!
********************************************* */
/**
* Enumeration for our KYC modes.
*/
enum TEH_KycMode
{
/**
* KYC is disabled.
*/
TEH_KYC_NONE = 0,
/**
* We use Oauth2.0.
*/
TEH_KYC_OAUTH2 = 1
};
/**
* Structure describing our KYC configuration.
*/
struct TEH_KycOptions
{
/**
* What KYC mode are we in?
*/
enum TEH_KycMode mode;
/**
* Maximum amount that can be withdrawn in @e withdraw_period without
* needing KYC.
* Only valid if @e mode is not #TEH_KYC_NONE and
* if @e withdraw_period is non-zero.
*/
struct TALER_Amount withdraw_limit;
/**
* Maximum balance a wallet can hold without
* needing KYC.
* Only valid if @e mode is not #TEH_KYC_NONE and
* if the amount specified is valid.
*/
struct TALER_Amount wallet_balance_limit;
/**
* Time period over which @e withdraw_limit applies.
* Only valid if @e mode is not #TEH_KYC_NONE.
*/
struct GNUNET_TIME_Relative withdraw_period;
/**
* Details depending on @e mode.
*/
union
{
/**
* Configuration details if @e mode is #TEH_KYC_OAUTH2.
*/
struct
{
/**
* URL of the OAuth2.0 endpoint for KYC checks.
* (token/auth)
*/
char *auth_url;
/**
* URL of the OAuth2.0 endpoint for KYC checks.
*/
char *login_url;
/**
* URL of the user info access endpoint.
*/
char *info_url;
/**
* Our client ID for OAuth2.0.
*/
char *client_id;
/**
* Our client secret for OAuth2.0.
*/
char *client_secret;
/**
* Where to redirect clients after the
* Web-based KYC process is done?
*/
char *post_kyc_redirect_url;
} oauth2;
} details;
};
extern struct TEH_KycOptions TEH_kyc_config;
/**
* How long is caching /keys allowed at most?
*/
extern struct GNUNET_TIME_Relative TEH_max_keys_caching;
/**
* How long is the delay before we close reserves?
*/
extern struct GNUNET_TIME_Relative TEH_reserve_closing_delay;
/**
* The exchange's configuration.
*/
extern const struct GNUNET_CONFIGURATION_Handle *TEH_cfg;
/**
* Main directory with exchange data.
*/
extern char *TEH_exchange_directory;
/**
* -I command-line flag given?
*/
extern int TEH_check_invariants_flag;
/**
* Are clients allowed to request /keys for times other than the
* current time? Allowing this could be abused in a DoS-attack
* as building new /keys responses is expensive. Should only be
* enabled for testcases, development and test systems.
*/
extern int TEH_allow_keys_timetravel;
/**
* Main directory with revocation data.
*/
extern char *TEH_revocation_directory;
/**
* True if we should commit suicide once all active
* connections are finished. Also forces /keys requests
* to terminate if they are long-polling.
*/
extern bool TEH_suicide;
/**
* Master public key (according to the
* configuration in the exchange directory).
*/
extern struct TALER_MasterPublicKeyP TEH_master_public_key;
/**
* Our DB plugin.
*/
extern struct TALER_EXCHANGEDB_Plugin *TEH_plugin;
/**
* Our currency.
*/
extern char *TEH_currency;
/**
* Our (externally visible) base URL.
*/
extern char *TEH_base_url;
/**
* Are we shutting down?
*/
extern volatile bool MHD_terminating;
/**
* Context for all CURL operations (useful to the event loop)
*/
extern struct GNUNET_CURL_Context *TEH_curl_ctx;
/*
* Signature of the offline master key of all enabled extensions' configuration
*/
extern struct TALER_MasterSignatureP TEH_extensions_sig;
extern bool TEH_extensions_signed;
/**
* @brief Struct describing an URL and the handler for it.
*/
struct TEH_RequestHandler;
/**
* @brief Context in which the exchange is processing
* all requests
*/
struct TEH_RequestContext
{
/**
* Async Scope ID associated with this request.
*/
struct GNUNET_AsyncScopeId async_scope_id;
/**
* When was this request started?
*/
struct GNUNET_TIME_Absolute start_time;
/**
* Opaque parsing context.
*/
void *opaque_post_parsing_context;
/**
* Request handler responsible for this request.
*/
const struct TEH_RequestHandler *rh;
/**
* Request URL (for logging).
*/
const char *url;
/**
* Connection we are processing.
*/
struct MHD_Connection *connection;
/**
* @e rh-specific cleanup routine. Function called
* upon completion of the request that should
* clean up @a rh_ctx. Can be NULL.
*/
void
(*rh_cleaner)(struct TEH_RequestContext *rc);
/**
* @e rh-specific context. Place where the request
* handler can associate state with this request.
* Can be NULL.
*/
void *rh_ctx;
};
/**
* @brief Struct describing an URL and the handler for it.
*/
struct TEH_RequestHandler
{
/**
* URL the handler is for (first part only).
*/
const char *url;
/**
* Method the handler is for.
*/
const char *method;
/**
* Callbacks for handling of the request. Which one is used
* depends on @e method.
*/
union
{
/**
* Function to call to handle a GET requests (and those
* with @e method NULL).
*
* @param rc context for the request
* @param mime_type the @e mime_type for the reply (hint, can be NULL)
* @param args array of arguments, needs to be of length @e args_expected
* @return MHD result code
*/
MHD_RESULT
(*get)(struct TEH_RequestContext *rc,
const char *const args[]);
/**
* Function to call to handle a POST request.
*
* @param rc context for the request
* @param json uploaded JSON data
* @param args array of arguments, needs to be of length @e args_expected
* @return MHD result code
*/
MHD_RESULT
(*post)(struct TEH_RequestContext *rc,
const json_t *root,
const char *const args[]);
} handler;
/**
* Number of arguments this handler expects in the @a args array.
*/
unsigned int nargs;
/**
* Is the number of arguments given in @e nargs only an upper bound,
* and calling with fewer arguments could be OK?
*/
bool nargs_is_upper_bound;
/**
* Mime type to use in reply (hint, can be NULL).
*/
const char *mime_type;
/**
* Raw data for the @e handler, can be NULL for none provided.
*/
const void *data;
/**
* Number of bytes in @e data, 0 for data is 0-terminated (!).
*/
size_t data_size;
/**
* Default response code. 0 for none provided.
*/
unsigned int response_code;
};
/* Age restriction configuration */
extern bool TEH_age_restriction_enabled;
extern struct TALER_AgeRestrictionConfig TEH_age_restriction_config;
#endif