From 0cef479e00a89a6649c747f91aba5208affd30e0 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 31 May 2016 10:39:11 +0200 Subject: [PATCH 1/4] extend test to cover GC --- src/benchmark/taler-exchange-benchmark | Bin 24848 -> 25920 bytes src/exchangedb/plugin_exchangedb_postgres.c | 6 ++ src/exchangedb/test_exchangedb.c | 67 ++++++++++++++++++-- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/benchmark/taler-exchange-benchmark b/src/benchmark/taler-exchange-benchmark index ae793dc928edf868454e8568abb3ab639222a5ed..ea5f1ce45dc1ca33bf91d35a3b7270a395ac181f 100755 GIT binary patch delta 7041 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 EFYr--aR2}S diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index 72f85e7bb..5fbaa26b3 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -4298,6 +4298,12 @@ postgres_gc (void *cls) conn = connect_to_postgres (pc); if (NULL == conn) return GNUNET_SYSERR; + if (GNUNET_OK != + postgres_prepare (conn)) + { + PQfinish (conn); + return GNUNET_SYSERR; + } result = GNUNET_PQ_exec_prepared (conn, "gc_prewire", params_none); diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index 2dee9a7ee..b42fb30f3 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -202,11 +202,17 @@ destroy_denom_key_pair (struct DenomKeyPair *dkp) * * @param size the size of the denomination key * @param session the DB session + * @param now time to use for key generation, legal expiration will be 3h later. + * @param fee_withdraw withdraw fee to use + * @param fee_deposit deposit fee to use + * @param fee_refresh refresh fee to use + * @param fee_refund refund fee to use * @return the denominaiton key pair; NULL upon error */ static struct DenomKeyPair * create_denom_key_pair (unsigned int size, struct TALER_EXCHANGEDB_Session *session, + struct GNUNET_TIME_Absolute now, const struct TALER_Amount *value, const struct TALER_Amount *fee_withdraw, const struct TALER_Amount *fee_deposit, @@ -216,7 +222,6 @@ create_denom_key_pair (unsigned int size, struct DenomKeyPair *dkp; struct TALER_EXCHANGEDB_DenominationKeyIssueInformation dki; struct TALER_EXCHANGEDB_DenominationKeyInformationP issue2; - struct GNUNET_TIME_Absolute now; dkp = GNUNET_new (struct DenomKeyPair); dkp->priv.rsa_private_key = GNUNET_CRYPTO_rsa_private_key_create (size); @@ -230,7 +235,6 @@ create_denom_key_pair (unsigned int size, 0, sizeof (struct TALER_EXCHANGEDB_DenominationKeyIssueInformation)); dki.denom_pub = dkp->pub; - now = GNUNET_TIME_absolute_get (); GNUNET_TIME_round_abs (&now); dki.issue.properties.start = GNUNET_TIME_absolute_hton (now); dki.issue.properties.expire_withdraw = GNUNET_TIME_absolute_hton @@ -558,7 +562,7 @@ test_melting (struct TALER_EXCHANGEDB_Session *session) struct TALER_EXCHANGEDB_LinkDataList *ldl; struct TALER_EXCHANGEDB_LinkDataList *ldlp; struct TALER_DenominationSignature ev_sigs[MELT_NEW_COINS]; - unsigned int cnt; + unsigned int cnt; unsigned int i; int ret; @@ -575,6 +579,7 @@ test_melting (struct TALER_EXCHANGEDB_Session *session) /* create a denomination (value: 1; fraction: 100) */ dkp = create_denom_key_pair (512, session, + GNUNET_TIME_absolute_get (), &value, &fee_withdraw, &fee_deposit, @@ -645,6 +650,7 @@ test_melting (struct TALER_EXCHANGEDB_Session *session) { new_dkp[cnt] = create_denom_key_pair (1024, session, + GNUNET_TIME_absolute_get (), &value, &fee_withdraw, &fee_deposit, @@ -974,6 +980,54 @@ deposit_cb (void *cls, } +/** + * Test garbage collection. + * + * @param session DB session to use + * @return #GNUNET_OK on success + */ +static int +test_gc (struct TALER_EXCHANGEDB_Session *session) +{ + struct DenomKeyPair *dkp; + struct GNUNET_TIME_Absolute now; + struct GNUNET_TIME_Absolute past; + struct TALER_EXCHANGEDB_DenominationKeyInformationP issue2; + + now = GNUNET_TIME_absolute_get (); + past = GNUNET_TIME_absolute_subtract (now, + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, + 4)); + dkp = create_denom_key_pair (1024, + session, + past, + &value, + &fee_withdraw, + &fee_deposit, + &fee_refresh, + &fee_refund); + if (GNUNET_OK != + plugin->gc (plugin->cls)) + { + GNUNET_break(0); + destroy_denom_key_pair (dkp); + return GNUNET_SYSERR; + } + if (GNUNET_OK == + plugin->get_denomination_info (plugin->cls, + session, + &dkp->pub, + &issue2)) + { + GNUNET_break(0); + destroy_denom_key_pair (dkp); + return GNUNET_SYSERR; + } + destroy_denom_key_pair (dkp); + return GNUNET_OK; +} + + /** * Main function that will be run by the scheduler. * @@ -1093,7 +1147,9 @@ run (void *cls) value.fraction * 2, value.currency)); result = 5; - dkp = create_denom_key_pair (1024, session, + dkp = create_denom_key_pair (1024, + session, + GNUNET_TIME_absolute_get (), &value, &fee_withdraw, &fee_deposit, @@ -1427,6 +1483,9 @@ run (void *cls) transaction_id_wt, &cb_wtid_check, &cb_wtid_never)); + FAILIF (GNUNET_OK != + test_gc (session)); + result = 0; drop: From 9164edd590b53696f9d2af4cee6fee50775664e7 Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Tue, 31 May 2016 11:05:49 +0200 Subject: [PATCH 2/4] linking benchmark using $(top_builddir) instead of -l in Makefile.am --- src/benchmark/Makefile.am | 6 +++--- src/benchmark/taler-exchange-benchmark | Bin 24848 -> 8195 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/benchmark/Makefile.am b/src/benchmark/Makefile.am index 4deb81723..e92a13944 100644 --- a/src/benchmark/Makefile.am +++ b/src/benchmark/Makefile.am @@ -13,9 +13,9 @@ taler_exchange_benchmark_SOURCES = \ taler-exchange-benchmark.c taler_exchange_benchmark_LDADD = \ $(LIBGCRYPT_LIBS) \ - -ltalerexchange \ - -ltalerjson \ - -ltalerutil \ + $(top_builddir)/src/json/libtalerjson.la \ + $(top_builddir)/src/util/libtalerutil.la \ + $(top_builddir)/src/exchange-lib/libtalerexchange.la \ -lgnunetjson \ -lgnunetcurl \ -lgnunetutil \ diff --git a/src/benchmark/taler-exchange-benchmark b/src/benchmark/taler-exchange-benchmark index ae793dc928edf868454e8568abb3ab639222a5ed..094ecffb66ffae079803a2888978809041008ef7 100755 GIT binary patch literal 8195 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 bO)H8wPq~JPQ#_*CgaWZiq_RNV9Dn}?Q>`Bl literal 24848 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 From bfd3ce29d166c8a72331a7c970a95022330b45e2 Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Tue, 31 May 2016 11:08:29 +0200 Subject: [PATCH 3/4] untracking binary --- src/benchmark/taler-exchange-benchmark | 228 ------------------------- 1 file changed, 228 deletions(-) delete mode 100755 src/benchmark/taler-exchange-benchmark diff --git a/src/benchmark/taler-exchange-benchmark b/src/benchmark/taler-exchange-benchmark deleted file mode 100755 index 094ecffb6..000000000 --- a/src/benchmark/taler-exchange-benchmark +++ /dev/null @@ -1,228 +0,0 @@ -#! /bin/bash - -# taler-exchange-benchmark - temporary wrapper script for .libs/taler-exchange-benchmark -# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.11 -# -# The taler-exchange-benchmark program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command="(cd /home/marcello/exchange/src/benchmark; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games; export PATH; gcc -Wall -g -O2 -o \$progdir/\$file taler-exchange-benchmark.o -L/home/marcello/local/lib -lgcrypt ../../src/json/.libs/libtalerjson.so ../../src/util/.libs/libtalerutil.so ../../src/exchange-lib/.libs/libtalerexchange.so /home/marcello/local/lib/libgnunetjson.so /home/marcello/local/lib/libgnunetcurl.so /home/marcello/local/lib/libgnunetutil.so -ljansson -pthread -Wl,-rpath -Wl,/home/marcello/exchange/src/json/.libs -Wl,-rpath -Wl,/home/marcello/exchange/src/util/.libs -Wl,-rpath -Wl,/home/marcello/exchange/src/exchange-lib/.libs -Wl,-rpath -Wl,/home/marcello/local/lib -Wl,-rpath -Wl,/home/marcello/local/lib)" - -# This environment variable determines our operation mode. -if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then - # install mode needs the following variables: - generated_by_libtool_version='2.4.2' - notinst_deplibs=' ../../src/json/libtalerjson.la ../../src/util/libtalerutil.la ../../src/exchange-lib/libtalerexchange.la' -else - # When we are sourced in execute mode, $file and $ECHO are already set. - if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then - file="$0" - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - ECHO="printf %s\\n" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on -# windows platforms, and (c) all begin with the string --lt- -# (application programs are unlikely to have options which match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's ../../libtool value, followed by no. -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=$0 - shift - for lt_opt - do - case "$lt_opt" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'` - test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=. - lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'` - cat "$lt_dump_D/$lt_dump_F" - exit 0 - ;; - --lt-*) - $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n "$lt_option_debug"; then - echo "taler-exchange-benchmark:taler-exchange-benchmark:${LINENO}: libtool wrapper (GNU libtool) 2.4.2 Debian-2.4.2-1.11" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - $ECHO "taler-exchange-benchmark:taler-exchange-benchmark:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg" - lt_dump_args_N=`expr $lt_dump_args_N + 1` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ - - if test -n "$lt_option_debug"; then - $ECHO "taler-exchange-benchmark:taler-exchange-benchmark:${LINENO}: newargv[0]: $progdir/$program" 1>&2 - func_lt_dump_args ${1+"$@"} 1>&2 - fi - exec "$progdir/$program" ${1+"$@"} - - $ECHO "$0: cannot exec $program $*" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from $@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case " $* " in - *\ --lt-*) - for lt_wr_arg - do - case $lt_wr_arg in - --lt-*) ;; - *) set x "$@" "$lt_wr_arg"; shift;; - esac - shift - done ;; - esac - func_exec_program_core ${1+"$@"} -} - - # Parse options - func_parse_lt_options "$0" ${1+"$@"} - - # Find the directory that this script lives in. - thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` - test "x$thisdir" = "x$file" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` - while test -n "$file"; do - destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'` - - # If there was a directory component, then change thisdir. - if test "x$destdir" != "x$file"; then - case "$destdir" in - [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; - *) thisdir="$thisdir/$destdir" ;; - esac - fi - - file=`$ECHO "$file" | /bin/sed 's%^.*/%%'` - file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no - if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then - # special case for '.' - if test "$thisdir" = "."; then - thisdir=`pwd` - fi - # remove .libs from thisdir - case "$thisdir" in - *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;; - .libs ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=`cd "$thisdir" && pwd` - test -n "$absdir" && thisdir="$absdir" - - program=lt-'taler-exchange-benchmark' - progdir="$thisdir/.libs" - - if test ! -f "$progdir/$program" || - { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ - test "X$file" != "X$progdir/$program"; }; then - - file="$$-$program" - - if test ! -d "$progdir"; then - mkdir "$progdir" - else - rm -f "$progdir/$file" - fi - - # relink executable if necessary - if test -n "$relink_command"; then - if relink_command_output=`eval $relink_command 2>&1`; then : - else - printf %s\n "$relink_command_output" >&2 - rm -f "$progdir/$file" - exit 1 - fi - fi - - mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || - { rm -f "$progdir/$program"; - mv -f "$progdir/$file" "$progdir/$program"; } - rm -f "$progdir/$file" - fi - - if test -f "$progdir/$program"; then - if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then - # Run the actual program with our arguments. - func_exec_program ${1+"$@"} - fi - else - # The program doesn't exist. - $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2 - $ECHO "This script is just a wrapper for $program." 1>&2 - $ECHO "See the libtool documentation for more information." 1>&2 - exit 1 - fi -fi From ce3d7c360b7b0bd5cbdbe93ec86e1cb3c9108ea9 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 31 May 2016 14:32:06 +0200 Subject: [PATCH 4/4] add support for /keys cache control (#4036) --- src/benchmark/taler-exchange-benchmark | Bin 25920 -> 25920 bytes src/exchange-lib/exchange_api_handle.c | 275 +++++++++++++++--- src/exchange/taler-exchange-httpd_keystate.c | 91 +++++- src/exchange/taler-exchange-httpd_responses.c | 7 +- src/include/taler_exchange_service.h | 23 +- 5 files changed, 336 insertions(+), 60 deletions(-) diff --git a/src/benchmark/taler-exchange-benchmark b/src/benchmark/taler-exchange-benchmark index ea5f1ce45dc1ca33bf91d35a3b7270a395ac181f..53057a9e52db46b77280d177d455f5c1f3718fc1 100755 GIT binary patch delta 156 zcmX?bit)fH#tp(@BIXS7@ou4h&LN)ue(~{oh9+jl7LyCY#25`G+l9$tkv0KIi%y;s zCc$V7W}OO?np_wr!e?f{kdhx?oKaeml3$(&lHxbBKrwx?R=6jVxhY6W)WQfw3S_Z` K@#c>39lQX`>@U;+ delta 163 zcmX?bit)fH#tp(@BBl)S@ou4h&LN)ue(~{oh9+jlW|IrTM45~&CfkL{VUah1$eUOK zmFY5?07)gH@B#qRX)whA diff --git a/src/exchange-lib/exchange_api_handle.c b/src/exchange-lib/exchange_api_handle.c index 6de5ee59b..b9104869e 100644 --- a/src/exchange-lib/exchange_api_handle.c +++ b/src/exchange-lib/exchange_api_handle.c @@ -108,6 +108,11 @@ struct TALER_EXCHANGE_Handle */ struct TALER_EXCHANGE_Keys key_data; + /** + * When does @e key_data expire? + */ + struct GNUNET_TIME_Absolute key_data_expiration; + /** * Raw key data of the exchange, only valid if * @e handshake_complete is past stage #MHS_CERT. @@ -144,6 +149,12 @@ struct KeysRequest */ struct GNUNET_CURL_Job *job; + /** + * Expiration time according to "Expire:" header. + * 0 if not provided by the server. + */ + struct GNUNET_TIME_Absolute expire; + }; @@ -485,6 +496,7 @@ decode_keys_json (const json_t *resp_obj, struct GNUNET_HashContext *hash_context; struct TALER_ExchangePublicKeyP pub; + memset (key_data, 0, sizeof (struct TALER_EXCHANGE_Keys)); if (JSON_OBJECT != json_typeof (resp_obj)) return GNUNET_SYSERR; @@ -604,6 +616,58 @@ decode_keys_json (const json_t *resp_obj, } +/** + * Free key data object. + * + * @param key_data data to free (pointer itself excluded) + */ +static void +free_key_data (struct TALER_EXCHANGE_Keys *key_data) +{ + unsigned int i; + + GNUNET_array_grow (key_data->sign_keys, + key_data->num_sign_keys, + 0); + for (i=0;inum_denom_keys;i++) + GNUNET_CRYPTO_rsa_public_key_free (key_data->denom_keys[i].key.rsa_public_key); + GNUNET_array_grow (key_data->denom_keys, + key_data->num_denom_keys, + 0); + GNUNET_array_grow (key_data->auditors, + key_data->num_auditors, + 0); +} + + +/** + * Initiate download of /keys from the exchange. + * + * @param exchange where to download /keys from + */ +static void +request_keys (struct TALER_EXCHANGE_Handle *exchange); + + +/** + * Check if our current response for /keys is valid, and if + * not trigger download. + * + * @param exchange exchange to check keys for + * @return until when the response is current, 0 if we are re-downloading + */ +struct GNUNET_TIME_Absolute +TALER_EXCHANGE_check_keys_current (struct TALER_EXCHANGE_Handle *exchange) +{ + if (NULL != exchange->kr) + return GNUNET_TIME_UNIT_ZERO_ABS; + if (0 < GNUNET_TIME_absolute_get_remaining (exchange->key_data_expiration).rel_value_us) + return exchange->key_data_expiration; + request_keys (exchange); + return GNUNET_TIME_UNIT_ZERO_ABS; +} + + /** * Callback used when downloading the reply to a /keys request * is complete. @@ -619,13 +683,16 @@ keys_completed_cb (void *cls, { struct KeysRequest *kr = cls; struct TALER_EXCHANGE_Handle *exchange = kr->exchange; - TALER_EXCHANGE_CertificationCallback cb; + struct TALER_EXCHANGE_Keys kd; + struct TALER_EXCHANGE_Keys kd_old; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received keys from URL `%s' with status %ld.\n", kr->url, response_code); - switch (response_code) { + kd_old = exchange->key_data; + switch (response_code) + { case 0: break; case MHD_HTTP_OK: @@ -635,11 +702,14 @@ keys_completed_cb (void *cls, break; } if (GNUNET_OK != - decode_keys_json (resp_obj, &kr->exchange->key_data)) + decode_keys_json (resp_obj, + &kd)) { response_code = 0; break; } + exchange->key_data = kd; + json_decref (exchange->key_data_raw); exchange->key_data_raw = json_deep_copy (resp_obj); break; default: @@ -655,24 +725,25 @@ keys_completed_cb (void *cls, free_keys_request (kr); exchange->state = MHS_FAILED; /* notify application that we failed */ - if (NULL != (cb = exchange->cert_cb)) - { - exchange->cert_cb = NULL; - cb (exchange->cert_cb_cls, - NULL); - } + exchange->cert_cb (exchange->cert_cb_cls, + NULL); + if (NULL != exchange->key_data_raw) + { + json_decref (exchange->key_data_raw); + exchange->key_data_raw = NULL; + } + free_key_data (&kd_old); return; } + exchange->kr = NULL; + exchange->key_data_expiration = kr->expire; free_keys_request (kr); exchange->state = MHS_CERT; /* notify application about the key information */ - if (NULL != (cb = exchange->cert_cb)) - { - exchange->cert_cb = NULL; - cb (exchange->cert_cb_cls, - &exchange->key_data); - } + exchange->cert_cb (exchange->cert_cb_cls, + &exchange->key_data); + free_key_data (&kd_old); } @@ -730,6 +801,108 @@ MAH_path_to_url (struct TALER_EXCHANGE_Handle *h, } +/** + * Parse HTTP timestamp. + * + * @param date header to parse header + * @param at where to write the result + * @return #GNUNET_OK on success + */ +static int +parse_date_string (const char *date, + struct GNUNET_TIME_Absolute *at) +{ + static const char *const days[] = + { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + static const char *const mons[] = + { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + struct tm now; + time_t t; + char day[3]; + char mon[3]; + unsigned int i; + unsigned int mday; + unsigned int year; + unsigned int h; + unsigned int m; + unsigned int s; + + if (7 != sscanf (date, + "%3s, %02u %3s %04u %02u:%02u:%02u GMT", + day, + &mday, + mon, + &year, + &h, + &m, + &s)) + return GNUNET_SYSERR; + memset (&now, 0, sizeof (now)); + now.tm_year = year - 1900; + now.tm_mday = mday; + now.tm_hour = h; + now.tm_min = m; + now.tm_sec = s; + now.tm_wday = 7; + for (i=0;i<7;i++) + if (0 == strcasecmp (days[i], day)) + now.tm_wday = i; + now.tm_mon = 12; + for (i=0;i<12;i++) + if (0 == strcasecmp (mons[i], mon)) + now.tm_mon = i; + if ( (7 == now.tm_mday) || + (12 == now.tm_mon) ) + return GNUNET_SYSERR; + t = mktime (&now); + at->abs_value_us = 1000LL * 1000LL * t; + return GNUNET_OK; +} + + +/** + * Function called for each header in the HTTP /keys response. + * Finds the "Expire:" header and parses it, storing the result + * in the "expire" field fo the keys request. + * + * @param buffer header data received + * @param size size of an item in @a buffer + * @param nitems number of items in @a buffer + * @param userdata the `struct KeysRequest` + * @return `size * nitems` on success (everything else aborts) + */ +static size_t +header_cb (char *buffer, + size_t size, + size_t nitems, + void *userdata) +{ + struct KeysRequest *kr = userdata; + size_t total = size * nitems; + char *val; + + if (total < strlen (MHD_HTTP_HEADER_EXPIRES ": ")) + return total; + if (0 != strncasecmp (MHD_HTTP_HEADER_EXPIRES ": ", + buffer, + strlen (MHD_HTTP_HEADER_EXPIRES ": "))) + return total; + val = GNUNET_strndup (&buffer[strlen (MHD_HTTP_HEADER_EXPIRES ": ")], + total - strlen (MHD_HTTP_HEADER_EXPIRES ": ")); + if (GNUNET_OK != + parse_date_string (val, + &kr->expire)) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Failed to parse %s-header `%s'\n", + MHD_HTTP_HEADER_EXPIRES, + val); + } + GNUNET_free (val); + return total; +} + /* ********************* public API ******************* */ /** @@ -755,40 +928,62 @@ TALER_EXCHANGE_connect (struct GNUNET_CURL_Context *ctx, ...) { struct TALER_EXCHANGE_Handle *exchange; - struct KeysRequest *kr; - CURL *c; exchange = GNUNET_new (struct TALER_EXCHANGE_Handle); exchange->ctx = ctx; exchange->url = GNUNET_strdup (url); exchange->cert_cb = cert_cb; exchange->cert_cb_cls = cert_cb_cls; + request_keys (exchange); + return exchange; +} + + +/** + * Initiate download of /keys from the exchange. + * + * @param exchange where to download /keys from + */ +static void +request_keys (struct TALER_EXCHANGE_Handle *exchange) +{ + struct KeysRequest *kr; + CURL *eh; + + GNUNET_assert (NULL == exchange->kr); kr = GNUNET_new (struct KeysRequest); kr->exchange = exchange; kr->url = MAH_path_to_url (exchange, "/keys"); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Requesting keys with URL `%s'.\n", kr->url); - c = curl_easy_init (); + eh = curl_easy_init (); GNUNET_assert (CURLE_OK == - curl_easy_setopt (c, + curl_easy_setopt (eh, CURLOPT_VERBOSE, 0)); GNUNET_assert (CURLE_OK == - curl_easy_setopt (c, - CURLOPT_STDERR, - stdout)); + curl_easy_setopt (eh, + CURLOPT_TIMEOUT, + (long) 300)); GNUNET_assert (CURLE_OK == - curl_easy_setopt (c, + curl_easy_setopt (eh, + CURLOPT_HEADERFUNCTION, + &header_cb)); + GNUNET_assert (CURLE_OK == + curl_easy_setopt (eh, + CURLOPT_HEADERDATA, + kr)); + GNUNET_assert (CURLE_OK == + curl_easy_setopt (eh, CURLOPT_URL, kr->url)); kr->job = GNUNET_CURL_job_add (exchange->ctx, - c, + eh, GNUNET_NO, &keys_completed_cb, kr); exchange->kr = kr; - return exchange; } @@ -800,26 +995,18 @@ TALER_EXCHANGE_connect (struct GNUNET_CURL_Context *ctx, void TALER_EXCHANGE_disconnect (struct TALER_EXCHANGE_Handle *exchange) { - unsigned int i; - if (NULL != exchange->kr) { GNUNET_CURL_job_cancel (exchange->kr->job); free_keys_request (exchange->kr); exchange->kr = NULL; } - GNUNET_array_grow (exchange->key_data.sign_keys, - exchange->key_data.num_sign_keys, - 0); - for (i=0;ikey_data.num_denom_keys;i++) - GNUNET_CRYPTO_rsa_public_key_free (exchange->key_data.denom_keys[i].key.rsa_public_key); - GNUNET_array_grow (exchange->key_data.denom_keys, - exchange->key_data.num_denom_keys, - 0); - GNUNET_array_grow (exchange->key_data.auditors, - exchange->key_data.num_auditors, - 0); - json_decref (exchange->key_data_raw); + free_key_data (&exchange->key_data); + if (NULL != exchange->key_data_raw) + { + json_decref (exchange->key_data_raw); + exchange->key_data_raw = NULL; + } GNUNET_free (exchange->url); GNUNET_free (exchange); } @@ -863,7 +1050,7 @@ TALER_EXCHANGE_test_signing_key (const struct TALER_EXCHANGE_Keys *keys, */ const struct TALER_EXCHANGE_DenomPublicKey * TALER_EXCHANGE_get_denomination_key (const struct TALER_EXCHANGE_Keys *keys, - const struct TALER_DenominationPublicKey *pk) + const struct TALER_DenominationPublicKey *pk) { unsigned int i; @@ -884,7 +1071,7 @@ TALER_EXCHANGE_get_denomination_key (const struct TALER_EXCHANGE_Keys *keys, */ const struct TALER_EXCHANGE_DenomPublicKey * TALER_EXCHANGE_get_denomination_key_by_hash (const struct TALER_EXCHANGE_Keys *keys, - const struct GNUNET_HashCode *hc) + const struct GNUNET_HashCode *hc) { unsigned int i; @@ -904,8 +1091,9 @@ TALER_EXCHANGE_get_denomination_key_by_hash (const struct TALER_EXCHANGE_Keys *k * @return the exchange's key set */ const struct TALER_EXCHANGE_Keys * -TALER_EXCHANGE_get_keys (const struct TALER_EXCHANGE_Handle *exchange) +TALER_EXCHANGE_get_keys (struct TALER_EXCHANGE_Handle *exchange) { + (void) TALER_EXCHANGE_check_keys_current (exchange); return &exchange->key_data; } @@ -918,8 +1106,9 @@ TALER_EXCHANGE_get_keys (const struct TALER_EXCHANGE_Handle *exchange) * @return the exchange's keys in raw JSON */ json_t * -TALER_EXCHANGE_get_keys_raw (const struct TALER_EXCHANGE_Handle *exchange) +TALER_EXCHANGE_get_keys_raw (struct TALER_EXCHANGE_Handle *exchange) { + (void) TALER_EXCHANGE_check_keys_current (exchange); return json_deep_copy (exchange->key_data_raw); } diff --git a/src/exchange/taler-exchange-httpd_keystate.c b/src/exchange/taler-exchange-httpd_keystate.c index a71d7676a..54dd09371 100644 --- a/src/exchange/taler-exchange-httpd_keystate.c +++ b/src/exchange/taler-exchange-httpd_keystate.c @@ -88,6 +88,11 @@ struct TMH_KS_StateHandle */ struct GNUNET_TIME_Absolute next_reload; + /** + * When does the first active denomination key expire (for deposit)? + */ + struct GNUNET_TIME_Absolute min_dk_expire; + /** * Exchange signing key that should be used currently. */ @@ -217,6 +222,7 @@ reload_keys_denom_iter (void *cls, struct TMH_KS_StateHandle *ctx = cls; struct GNUNET_TIME_Absolute now; struct GNUNET_TIME_Absolute horizon; + struct GNUNET_TIME_Absolute expire_deposit; struct GNUNET_HashCode denom_key_hash; struct TALER_EXCHANGEDB_DenominationKeyIssueInformation *d2; struct TALER_EXCHANGEDB_Session *session; @@ -235,8 +241,8 @@ reload_keys_denom_iter (void *cls, return GNUNET_OK; } now = GNUNET_TIME_absolute_get (); - if (GNUNET_TIME_absolute_ntoh (dki->issue.properties.expire_deposit).abs_value_us < - now.abs_value_us) + expire_deposit = GNUNET_TIME_absolute_ntoh (dki->issue.properties.expire_deposit); + if (expire_deposit.abs_value_us < now.abs_value_us) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Skipping expired denomination key `%s'\n", @@ -339,6 +345,8 @@ reload_keys_denom_iter (void *cls, GNUNET_free (d2); return GNUNET_OK; } + ctx->min_dk_expire = GNUNET_TIME_absolute_min (ctx->min_dk_expire, + expire_deposit); json_array_append_new (ctx->denom_keys_array, denom_key_issue_to_json (&dki->denom_pub, &dki->issue)); @@ -643,7 +651,7 @@ TMH_KS_acquire_ (const char *location) { key_state = GNUNET_new (struct TMH_KS_StateHandle); key_state->hash_context = GNUNET_CRYPTO_hash_context_start (); - + key_state->min_dk_expire = GNUNET_TIME_UNIT_FOREVER_ABS; key_state->denom_keys_array = json_array (); GNUNET_assert (NULL != key_state->denom_keys_array); @@ -680,7 +688,6 @@ TMH_KS_acquire_ (const char *location) return NULL; } - ks.purpose.size = htonl (sizeof (ks)); ks.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_KEY_SET); ks.list_issue_date = GNUNET_TIME_absolute_hton (key_state->reload_time); @@ -691,7 +698,9 @@ TMH_KS_acquire_ (const char *location) GNUNET_CRYPTO_eddsa_sign (&key_state->current_sign_key_issue.signkey_priv.eddsa_priv, &ks.purpose, &sig.eddsa_signature)); - key_state->next_reload = GNUNET_TIME_absolute_ntoh (key_state->current_sign_key_issue.issue.expire); + key_state->next_reload = + GNUNET_TIME_absolute_min (GNUNET_TIME_absolute_ntoh (key_state->current_sign_key_issue.issue.expire), + key_state->min_dk_expire); if (0 == key_state->next_reload.abs_value_us) GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No valid signing key found!\n"); @@ -1001,6 +1010,58 @@ TMH_KS_sign (const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose, } +/** + * Produce HTTP "Date:" header. + * + * @param at time to write to @a date + * @param[out] date where to write the header, with + * at least 128 bytes available space. + */ +static void +get_date_string (struct GNUNET_TIME_Absolute at, + char *date) +{ + static const char *const days[] = + { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + static const char *const mons[] = + { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", + "Nov", "Dec" + }; + struct tm now; + time_t t; +#if !defined(HAVE_C11_GMTIME_S) && !defined(HAVE_W32_GMTIME_S) && !defined(HAVE_GMTIME_R) + struct tm* pNow; +#endif + + date[0] = 0; + t = (time_t) (at.abs_value_us / 1000LL / 1000LL); +#if defined(HAVE_C11_GMTIME_S) + if (NULL == gmtime_s (&t, &now)) + return; +#elif defined(HAVE_W32_GMTIME_S) + if (0 != gmtime_s (&now, &t)) + return; +#elif defined(HAVE_GMTIME_R) + if (NULL == gmtime_r(&t, &now)) + return; +#else + pNow = gmtime(&t); + if (NULL == pNow) + return; + now = *pNow; +#endif + sprintf (date, + "%3s, %02u %3s %04u %02u:%02u:%02u GMT", + days[now.tm_wday % 7], + (unsigned int) now.tm_mday, + mons[now.tm_mon % 12], + (unsigned int) (1900 + now.tm_year), + (unsigned int) now.tm_hour, + (unsigned int) now.tm_min, + (unsigned int) now.tm_sec); +} + + /** * Function to call to handle the request by sending * back static data from the @a rh. @@ -1022,6 +1083,7 @@ TMH_KS_handler_keys (struct TMH_RequestHandler *rh, struct TMH_KS_StateHandle *key_state; struct MHD_Response *response; int ret; + char dat[128]; key_state = TMH_KS_acquire (); response = MHD_create_response_from_buffer (strlen (key_state->keys_json), @@ -1034,9 +1096,22 @@ TMH_KS_handler_keys (struct TMH_RequestHandler *rh, return MHD_NO; } TMH_RESPONSE_add_global_headers (response); - (void) MHD_add_response_header (response, - "Content-Type", - rh->mime_type); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_CONTENT_TYPE, + rh->mime_type)); + get_date_string (key_state->reload_time, + dat); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_LAST_MODIFIED, + dat)); + get_date_string (key_state->next_reload, + dat); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_EXPIRES, + dat)); ret = MHD_queue_response (connection, rh->response_code, response); diff --git a/src/exchange/taler-exchange-httpd_responses.c b/src/exchange/taler-exchange-httpd_responses.c index aec2ac27b..d6d3d3f9d 100644 --- a/src/exchange/taler-exchange-httpd_responses.c +++ b/src/exchange/taler-exchange-httpd_responses.c @@ -40,9 +40,10 @@ void TMH_RESPONSE_add_global_headers (struct MHD_Response *response) { if (TMH_exchange_connection_close) - (void) MHD_add_response_header (response, - MHD_HTTP_HEADER_CONNECTION, - "close"); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_CONNECTION, + "close")); } diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h index 1da42b897..e65a9faee 100644 --- a/src/include/taler_exchange_service.h +++ b/src/include/taler_exchange_service.h @@ -220,7 +220,7 @@ struct TALER_EXCHANGE_Keys * * @param cls closure * @param keys information about the various keys used - * by the exchange + * by the exchange, NULL if /keys failed */ typedef void (*TALER_EXCHANGE_CertificationCallback) (void *cls, @@ -244,7 +244,8 @@ struct TALER_EXCHANGE_Handle; * * @param ctx the context * @param url HTTP base URL for the exchange - * @param cert_cb function to call with the exchange's certification information + * @param cert_cb function to call with the exchange's certification information, + * possibly called repeatedly if the information changes * @param cert_cb_cls closure for @a cert_cb * @param ... list of additional arguments, terminated by #TALER_EXCHANGE_OPTION_END. * @return the exchange handle; NULL upon error @@ -273,18 +274,28 @@ TALER_EXCHANGE_disconnect (struct TALER_EXCHANGE_Handle *exchange); * @return the exchange's key set */ const struct TALER_EXCHANGE_Keys * -TALER_EXCHANGE_get_keys (const struct TALER_EXCHANGE_Handle *exchange); +TALER_EXCHANGE_get_keys (struct TALER_EXCHANGE_Handle *exchange); /** - * Obtain the keys from the exchange in the - * raw JSON format + * Check if our current response for /keys is valid, and if + * not, trigger /keys download. + * + * @param exchange exchange to check keys for + * @return until when the response is current, 0 if we are re-downloading + */ +struct GNUNET_TIME_Absolute +TALER_EXCHANGE_check_keys_current (struct TALER_EXCHANGE_Handle *exchange); + + +/** + * Obtain the keys from the exchange in the raw JSON format. * * @param exchange the exchange handle * @return the exchange's keys in raw JSON */ json_t * -TALER_EXCHANGE_get_keys_raw (const struct TALER_EXCHANGE_Handle *exchange); +TALER_EXCHANGE_get_keys_raw (struct TALER_EXCHANGE_Handle *exchange); /**