2015-01-08 18:37:20 +01:00
|
|
|
/*
|
|
|
|
This file is part of TALER
|
2021-09-27 10:52:39 +02:00
|
|
|
Copyright (C) 2014-2021 Taler Systems SA
|
2015-01-08 18:37:20 +01:00
|
|
|
|
|
|
|
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
|
2016-07-07 17:55:25 +02:00
|
|
|
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
2015-01-08 18:37:20 +01:00
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* @file include/taler_util.h
|
|
|
|
* @brief Interface for common utility functions
|
|
|
|
* @author Sree Harsha Totakura <sreeharsha@totakura.in>
|
|
|
|
*/
|
2015-01-28 20:53:21 +01:00
|
|
|
#ifndef TALER_UTIL_H
|
|
|
|
#define TALER_UTIL_H
|
2015-01-08 18:37:20 +01:00
|
|
|
|
|
|
|
#include <gnunet/gnunet_util_lib.h>
|
2018-01-31 17:47:01 +01:00
|
|
|
#include <microhttpd.h>
|
2015-01-28 20:53:21 +01:00
|
|
|
#include "taler_amount_lib.h"
|
|
|
|
#include "taler_crypto_lib.h"
|
|
|
|
|
2021-08-25 07:58:07 +02:00
|
|
|
/**
|
|
|
|
* Version of the Taler API, in hex.
|
|
|
|
* Thus 0.8.4-1 = 0x00080401.
|
|
|
|
*/
|
|
|
|
#define TALER_API_VERSION 0x00080401
|
|
|
|
|
2020-03-05 23:02:38 +01:00
|
|
|
/**
|
|
|
|
* Stringify operator.
|
|
|
|
*
|
|
|
|
* @param a some expression to stringify. Must NOT be a macro.
|
|
|
|
* @return same expression as a constant string.
|
|
|
|
*/
|
|
|
|
#define TALER_S(a) #a
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Stringify operator.
|
|
|
|
*
|
|
|
|
* @param a some expression to stringify. Can be a macro.
|
|
|
|
* @return macro-expanded expression as a constant string.
|
|
|
|
*/
|
|
|
|
#define TALER_QUOTE(a) TALER_S (a)
|
|
|
|
|
2015-01-08 18:37:20 +01:00
|
|
|
|
|
|
|
/* Define logging functions */
|
2015-03-27 19:58:40 +01:00
|
|
|
#define TALER_LOG_DEBUG(...) \
|
2015-01-08 18:37:20 +01:00
|
|
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
|
|
|
|
|
2018-02-19 15:38:21 +01:00
|
|
|
#define TALER_LOG_INFO(...) \
|
|
|
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO, __VA_ARGS__)
|
|
|
|
|
2015-03-27 19:58:40 +01:00
|
|
|
#define TALER_LOG_WARNING(...) \
|
2015-01-08 18:37:20 +01:00
|
|
|
GNUNET_log (GNUNET_ERROR_TYPE_WARNING, __VA_ARGS__)
|
|
|
|
|
2015-03-27 19:58:40 +01:00
|
|
|
#define TALER_LOG_ERROR(...) \
|
2015-01-08 18:37:20 +01:00
|
|
|
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, __VA_ARGS__)
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tests a given as assertion and if failed prints it as a warning with the
|
|
|
|
* given reason
|
|
|
|
*
|
|
|
|
* @param EXP the expression to test as assertion
|
|
|
|
* @param reason string to print as warning
|
|
|
|
*/
|
|
|
|
#define TALER_assert_as(EXP, reason) \
|
|
|
|
do { \
|
|
|
|
if (EXP) break; \
|
2019-08-25 16:18:24 +02:00
|
|
|
TALER_LOG_ERROR ("%s at %s:%d\n", reason, __FILE__, __LINE__); \
|
|
|
|
abort (); \
|
|
|
|
} while (0)
|
2015-01-08 18:37:20 +01:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Log an error message at log-level 'level' that indicates
|
|
|
|
* a failure of the command 'cmd' with the message given
|
|
|
|
* by gcry_strerror(rc).
|
|
|
|
*/
|
2019-08-25 16:18:24 +02:00
|
|
|
#define TALER_LOG_GCRY_ERROR(cmd, rc) do { TALER_LOG_ERROR ( \
|
|
|
|
"`%s' failed at %s:%d with error: %s\n", \
|
|
|
|
cmd, __FILE__, __LINE__, \
|
|
|
|
gcry_strerror (rc)); } while (0)
|
2015-01-08 18:37:20 +01:00
|
|
|
|
|
|
|
|
|
|
|
#define TALER_gcry_ok(cmd) \
|
2019-08-25 16:18:24 +02:00
|
|
|
do {int rc; rc = cmd; if (! rc) break; \
|
|
|
|
TALER_LOG_ERROR ("A Gcrypt call failed at %s:%d with error: %s\n", \
|
|
|
|
__FILE__, \
|
|
|
|
__LINE__, gcry_strerror (rc)); abort (); } while (0)
|
2015-01-08 18:37:20 +01:00
|
|
|
|
|
|
|
|
2015-01-27 16:18:33 +01:00
|
|
|
/**
|
|
|
|
* Initialize Gcrypt library.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
TALER_gcrypt_init (void);
|
|
|
|
|
|
|
|
|
2015-08-14 22:05:34 +02:00
|
|
|
/**
|
|
|
|
* Convert a buffer to an 8-character string
|
|
|
|
* representative of the contents. This is used
|
|
|
|
* for logging binary data when debugging.
|
|
|
|
*
|
|
|
|
* @param buf buffer to log
|
|
|
|
* @param buf_size number of bytes in @a buf
|
|
|
|
* @return text representation of buf, valid until next
|
|
|
|
* call to this function
|
|
|
|
*/
|
|
|
|
const char *
|
|
|
|
TALER_b2s (const void *buf,
|
2019-08-17 21:35:21 +02:00
|
|
|
size_t buf_size);
|
|
|
|
|
2015-08-14 22:05:34 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a fixed-sized object to a string using
|
|
|
|
* #TALER_b2s().
|
|
|
|
*
|
|
|
|
* @param obj address of object to convert
|
|
|
|
* @return string representing the binary obj buffer
|
|
|
|
*/
|
|
|
|
#define TALER_B2S(obj) TALER_b2s (obj, sizeof (*obj))
|
|
|
|
|
|
|
|
|
2015-03-17 10:48:12 +01:00
|
|
|
/**
|
|
|
|
* Obtain denomination amount from configuration file.
|
|
|
|
*
|
|
|
|
* @param section section of the configuration to access
|
|
|
|
* @param option option of the configuration to access
|
2015-03-28 15:42:07 +01:00
|
|
|
* @param[out] denom set to the amount found in configuration
|
2015-03-17 10:48:12 +01:00
|
|
|
* @return #GNUNET_OK on success, #GNUNET_SYSERR on error
|
|
|
|
*/
|
2021-10-14 14:45:10 +02:00
|
|
|
enum GNUNET_GenericReturnValue
|
2020-01-19 20:39:27 +01:00
|
|
|
TALER_config_get_amount (const struct GNUNET_CONFIGURATION_Handle *cfg,
|
|
|
|
const char *section,
|
|
|
|
const char *option,
|
|
|
|
struct TALER_Amount *denom);
|
2015-03-17 10:48:12 +01:00
|
|
|
|
2015-01-28 14:55:25 +01:00
|
|
|
|
2020-03-15 20:08:38 +01:00
|
|
|
/**
|
|
|
|
* Load our currency from the @a cfg (in section [taler]
|
|
|
|
* the option "CURRENCY").
|
|
|
|
*
|
|
|
|
* @param cfg configuration to use
|
|
|
|
* @param[out] currency where to write the result
|
|
|
|
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
|
|
|
|
*/
|
2021-10-14 14:45:10 +02:00
|
|
|
enum GNUNET_GenericReturnValue
|
2020-03-15 20:08:38 +01:00
|
|
|
TALER_config_get_currency (const struct GNUNET_CONFIGURATION_Handle *cfg,
|
|
|
|
char **currency);
|
|
|
|
|
|
|
|
|
2017-03-15 12:01:06 +01:00
|
|
|
/**
|
|
|
|
* Allow user to specify an amount on the command line.
|
|
|
|
*
|
|
|
|
* @param shortName short name of the option
|
|
|
|
* @param name long name of the option
|
|
|
|
* @param argumentHelp help text for the option argument
|
|
|
|
* @param description long help text for the option
|
|
|
|
* @param[out] amount set to the amount specified at the command line
|
|
|
|
*/
|
|
|
|
struct GNUNET_GETOPT_CommandLineOption
|
|
|
|
TALER_getopt_get_amount (char shortName,
|
|
|
|
const char *name,
|
|
|
|
const char *argumentHelp,
|
|
|
|
const char *description,
|
|
|
|
struct TALER_Amount *amount);
|
|
|
|
|
|
|
|
|
2016-04-16 13:10:29 +02:00
|
|
|
/**
|
|
|
|
* Return default project data used by Taler.
|
|
|
|
*/
|
|
|
|
const struct GNUNET_OS_ProjectData *
|
|
|
|
TALER_project_data_default (void);
|
|
|
|
|
|
|
|
|
2021-08-08 16:45:32 +02:00
|
|
|
/**
|
|
|
|
* Initialize libtalerutil.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
TALER_OS_init (void);
|
|
|
|
|
|
|
|
|
2018-01-31 17:47:01 +01:00
|
|
|
/**
|
|
|
|
* URL-encode a string according to rfc3986.
|
|
|
|
*
|
|
|
|
* @param s string to encode
|
2020-01-16 21:26:53 +01:00
|
|
|
* @returns the urlencoded string, the caller must free it with GNUNET_free()
|
2018-01-31 17:47:01 +01:00
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_urlencode (const char *s);
|
|
|
|
|
2021-09-27 10:52:39 +02:00
|
|
|
|
2021-08-02 19:48:37 +02:00
|
|
|
/**
|
|
|
|
* Test if all characters in @a url are valid for
|
|
|
|
* a URL.
|
|
|
|
*
|
|
|
|
* @param url URL to sanity-check
|
|
|
|
* @return true if @a url only contains valid characters
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
TALER_url_valid_charset (const char *url);
|
2018-01-31 17:47:01 +01:00
|
|
|
|
2021-09-27 10:52:39 +02:00
|
|
|
|
2020-08-19 18:19:00 +02:00
|
|
|
/**
|
|
|
|
* Check if @a lang matches the @a language_pattern, and if so with
|
|
|
|
* which preference.
|
|
|
|
* See also: https://tools.ietf.org/html/rfc7231#section-5.3.1
|
|
|
|
*
|
|
|
|
* @param language_pattern a language preferences string
|
|
|
|
* like "fr-CH, fr;q=0.9, en;q=0.8, *;q=0.1"
|
|
|
|
* @param lang the 2-digit language to match
|
|
|
|
* @return q-weight given for @a lang in @a language_pattern, 1.0 if no weights are given;
|
|
|
|
* 0 if @a lang is not in @a language_pattern
|
|
|
|
*/
|
|
|
|
double
|
|
|
|
TALER_language_matches (const char *language_pattern,
|
|
|
|
const char *lang);
|
|
|
|
|
|
|
|
|
2019-10-05 19:02:31 +02:00
|
|
|
/**
|
|
|
|
* Find out if an MHD connection is using HTTPS (either
|
|
|
|
* directly or via proxy).
|
|
|
|
*
|
|
|
|
* @param connection MHD connection
|
2020-01-16 21:26:53 +01:00
|
|
|
* @returns #GNUNET_YES if the MHD connection is using https,
|
|
|
|
* #GNUNET_NO if the MHD connection is using http,
|
|
|
|
* #GNUNET_SYSERR if the connection type couldn't be determined
|
2019-10-05 19:02:31 +02:00
|
|
|
*/
|
2021-10-22 22:04:35 +02:00
|
|
|
enum GNUNET_GenericReturnValue
|
2019-10-05 19:02:31 +02:00
|
|
|
TALER_mhd_is_https (struct MHD_Connection *connection);
|
|
|
|
|
|
|
|
|
2018-01-31 17:47:01 +01:00
|
|
|
/**
|
|
|
|
* Make an absolute URL with query parameters.
|
|
|
|
*
|
2020-03-01 13:13:33 +01:00
|
|
|
* If a 'value' is given as NULL, both the key and the value are skipped. Note
|
|
|
|
* that a NULL value does not terminate the list, only a NULL key signals the
|
|
|
|
* end of the list of arguments.
|
|
|
|
*
|
2018-01-31 17:47:01 +01:00
|
|
|
* @param base_url absolute base URL to use
|
|
|
|
* @param path path of the url
|
|
|
|
* @param ... NULL-terminated key-value pairs (char *) for query parameters,
|
|
|
|
* only the value will be url-encoded
|
|
|
|
* @returns the URL, must be freed with #GNUNET_free
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_url_join (const char *base_url,
|
|
|
|
const char *path,
|
|
|
|
...);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Make an absolute URL for the given parameters.
|
|
|
|
*
|
2020-03-01 13:13:33 +01:00
|
|
|
* If a 'value' is given as NULL, both the key and the value are skipped. Note
|
|
|
|
* that a NULL value does not terminate the list, only a NULL key signals the
|
|
|
|
* end of the list of arguments.
|
|
|
|
*
|
2018-01-31 17:47:01 +01:00
|
|
|
* @param proto protocol for the URL (typically https)
|
|
|
|
* @param host hostname for the URL
|
|
|
|
* @param prefix prefix for the URL
|
|
|
|
* @param path path for the URL
|
|
|
|
* @param ... NULL-terminated key-value pairs (char *) for query parameters,
|
|
|
|
* the value will be url-encoded
|
|
|
|
* @returns the URL, must be freed with #GNUNET_free
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_url_absolute_raw (const char *proto,
|
|
|
|
const char *host,
|
|
|
|
const char *prefix,
|
|
|
|
const char *path,
|
|
|
|
...);
|
|
|
|
|
|
|
|
|
2019-10-17 15:50:15 +02:00
|
|
|
/**
|
|
|
|
* Make an absolute URL for the given parameters.
|
|
|
|
*
|
2020-03-01 13:13:33 +01:00
|
|
|
* If a 'value' is given as NULL, both the key and the value are skipped. Note
|
|
|
|
* that a NULL value does not terminate the list, only a NULL key signals the
|
|
|
|
* end of the list of arguments.
|
|
|
|
*
|
2019-10-17 15:50:15 +02:00
|
|
|
* @param proto protocol for the URL (typically https)
|
|
|
|
* @param host hostname for the URL
|
|
|
|
* @param prefix prefix for the URL
|
|
|
|
* @param path path for the URL
|
|
|
|
* @param args NULL-terminated key-value pairs (char *) for query parameters,
|
|
|
|
* the value will be url-encoded
|
|
|
|
* @returns the URL, must be freed with #GNUNET_free
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_url_absolute_raw_va (const char *proto,
|
2019-10-31 12:59:50 +01:00
|
|
|
const char *host,
|
|
|
|
const char *prefix,
|
|
|
|
const char *path,
|
|
|
|
va_list args);
|
2019-10-17 15:50:15 +02:00
|
|
|
|
|
|
|
|
2018-01-31 17:47:01 +01:00
|
|
|
/**
|
|
|
|
* Make an absolute URL for a given MHD connection.
|
|
|
|
*
|
2020-01-18 14:13:28 +01:00
|
|
|
* @param connection the connection to get the URL for
|
2018-01-31 17:47:01 +01:00
|
|
|
* @param path path of the url
|
|
|
|
* @param ... NULL-terminated key-value pairs (char *) for query parameters,
|
|
|
|
* the value will be url-encoded
|
|
|
|
* @returns the URL, must be freed with #GNUNET_free
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_url_absolute_mhd (struct MHD_Connection *connection,
|
|
|
|
const char *path,
|
|
|
|
...);
|
|
|
|
|
|
|
|
|
2020-01-13 18:16:01 +01:00
|
|
|
/**
|
2020-01-19 17:03:19 +01:00
|
|
|
* Obtain the payment method from a @a payto_uri
|
2020-01-13 18:16:01 +01:00
|
|
|
*
|
2020-01-19 17:03:19 +01:00
|
|
|
* @param payto_uri the URL to parse
|
|
|
|
* @return NULL on error (malformed @a payto_uri)
|
2020-01-13 18:16:01 +01:00
|
|
|
*/
|
|
|
|
char *
|
2020-01-19 17:03:19 +01:00
|
|
|
TALER_payto_get_method (const char *payto_uri);
|
2020-01-13 18:16:01 +01:00
|
|
|
|
|
|
|
|
2021-11-07 19:22:12 +01:00
|
|
|
/**
|
|
|
|
* Construct a payto://-URI from a Taler @a reserve_pub at
|
2022-02-12 10:33:23 +01:00
|
|
|
* @a exchange_base_url
|
2021-11-07 19:22:12 +01:00
|
|
|
*
|
|
|
|
* @param exchange_base_url the URL of the exchange
|
|
|
|
* @param reserve_pub public key of the reserve
|
|
|
|
* @return payto:// URI encoding the reserve's address
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_payto_from_reserve (const char *exchange_base_url,
|
|
|
|
const struct TALER_ReservePublicKeyP *reserve_pub);
|
|
|
|
|
|
|
|
|
2020-01-15 11:48:41 +01:00
|
|
|
/**
|
|
|
|
* Obtain the account name from a payto URL.
|
|
|
|
*
|
|
|
|
* @param payto an x-taler-bank payto URL
|
|
|
|
* @return only the account name from the @a payto URL, NULL if not an x-taler-bank
|
|
|
|
* payto URL
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_xtalerbank_account_from_payto (const char *payto);
|
|
|
|
|
2021-08-02 19:38:23 +02:00
|
|
|
|
2020-07-27 12:48:48 +02:00
|
|
|
/**
|
|
|
|
* Extract the subject value from the URI parameters.
|
|
|
|
*
|
|
|
|
* @param payto_uri the URL to parse
|
|
|
|
* @return NULL if the subject parameter is not found.
|
|
|
|
* The caller should free the returned value.
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_payto_get_subject (const char *payto_uri);
|
2020-01-15 11:48:41 +01:00
|
|
|
|
2021-08-02 19:38:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Check that a payto:// URI is well-formed.
|
|
|
|
*
|
|
|
|
* @param payto_uri the URL to check
|
|
|
|
* @return NULL on success, otherwise an error
|
|
|
|
* message to be freed by the caller!
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_payto_validate (const char *payto_uri);
|
|
|
|
|
|
|
|
|
2021-08-14 13:54:01 +02:00
|
|
|
/**
|
|
|
|
* Check that an IBAN number is well-formed.
|
|
|
|
*
|
|
|
|
* Validates given IBAN according to the European Banking Standards. See:
|
|
|
|
* http://www.europeanpaymentscouncil.eu/documents/ECBS%20IBAN%20standard%20EBS204_V3.2.pdf
|
|
|
|
*
|
|
|
|
* @param iban the IBAN to check
|
|
|
|
* @return NULL on success, otherwise an error
|
|
|
|
* message to be freed by the caller!
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_iban_validate (const char *iban);
|
|
|
|
|
|
|
|
|
2020-06-12 21:16:40 +02:00
|
|
|
/**
|
|
|
|
* Possible values for a binary filter.
|
|
|
|
*/
|
|
|
|
enum TALER_EXCHANGE_YesNoAll
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* If condition is yes.
|
|
|
|
*/
|
|
|
|
TALER_EXCHANGE_YNA_YES = 1,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If condition is no.
|
|
|
|
*/
|
|
|
|
TALER_EXCHANGE_YNA_NO = 2,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Condition disabled.
|
|
|
|
*/
|
|
|
|
TALER_EXCHANGE_YNA_ALL = 3
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert query argument to @a yna value.
|
|
|
|
*
|
|
|
|
* @param connection connection to take query argument from
|
|
|
|
* @param arg argument to try for
|
|
|
|
* @param default_val value to assign if the argument is not present
|
2020-10-03 16:08:01 +02:00
|
|
|
* @param[out] yna value to set
|
2020-06-12 21:16:40 +02:00
|
|
|
* @return true on success, false if the parameter was malformed
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
TALER_arg_to_yna (struct MHD_Connection *connection,
|
|
|
|
const char *arg,
|
|
|
|
enum TALER_EXCHANGE_YesNoAll default_val,
|
|
|
|
enum TALER_EXCHANGE_YesNoAll *yna);
|
|
|
|
|
2020-06-14 15:15:53 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert YNA value to a string.
|
|
|
|
*
|
|
|
|
* @param yna value to convert
|
|
|
|
* @return string representation ("yes"/"no"/"all").
|
|
|
|
*/
|
|
|
|
const char *
|
|
|
|
TALER_yna_to_string (enum TALER_EXCHANGE_YesNoAll yna);
|
|
|
|
|
|
|
|
|
2022-01-18 15:15:54 +01:00
|
|
|
#ifdef __APPLE__
|
|
|
|
/**
|
|
|
|
* Returns the first occurence of `c` in `s`, or returns the null-byte
|
|
|
|
* terminating the string if it does not occur.
|
|
|
|
*
|
|
|
|
* @param s the string to search in
|
|
|
|
* @param c the character to search for
|
|
|
|
* @return char* the first occurence of `c` in `s`
|
|
|
|
*/
|
2022-02-04 16:50:32 +01:00
|
|
|
char *strchrnul (const char *s, int c);
|
2022-01-18 15:15:54 +01:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2015-01-08 18:37:20 +01:00
|
|
|
#endif
|