2015-01-08 18:37:20 +01:00
|
|
|
/*
|
|
|
|
This file is part of TALER
|
2020-01-18 23:19:48 +01:00
|
|
|
Copyright (C) 2014-2020 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"
|
|
|
|
|
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
|
|
|
|
*/
|
|
|
|
int
|
2016-04-16 12:37:37 +02:00
|
|
|
TALER_config_get_denom (const struct GNUNET_CONFIGURATION_Handle *cfg,
|
2015-03-17 10:48:12 +01:00
|
|
|
const char *section,
|
|
|
|
const char *option,
|
|
|
|
struct TALER_Amount *denom);
|
|
|
|
|
2015-01-28 14:55:25 +01:00
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
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
|
|
|
*/
|
|
|
|
int
|
|
|
|
TALER_mhd_is_https (struct MHD_Connection *connection);
|
|
|
|
|
|
|
|
|
2018-01-31 17:47:01 +01:00
|
|
|
/**
|
|
|
|
* Make an absolute URL with query parameters.
|
|
|
|
*
|
|
|
|
* @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.
|
|
|
|
*
|
|
|
|
* @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.
|
|
|
|
*
|
|
|
|
* @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
|
|
|
/**
|
|
|
|
* Obtain the payment method from a @a payto_url
|
|
|
|
*
|
|
|
|
* @param payto_url the URL to parse
|
|
|
|
* @return NULL on error (malformed @a payto_url)
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
TALER_payto_get_method (const char *payto_url);
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
2015-01-08 18:37:20 +01:00
|
|
|
#endif
|