From 282e4f59ee849c6c84f753e8fae5691aaf8e9303 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 26 Jan 2020 17:48:13 +0100 Subject: [PATCH 01/21] address bank_api_credit comment/FIXME from Florian, also adapt debit logic accordingly --- src/bank-lib/bank_api_credit.c | 23 +++++++---------------- src/bank-lib/bank_api_debit.c | 30 ++++++++++++++---------------- 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/bank-lib/bank_api_credit.c b/src/bank-lib/bank_api_credit.c index 50725a4ed..66e128da1 100644 --- a/src/bank-lib/bank_api_credit.c +++ b/src/bank-lib/bank_api_credit.c @@ -30,7 +30,7 @@ /** - * @brief A /history Handle + * @brief A /history/incoming Handle */ struct TALER_BANK_CreditHistoryHandle { @@ -173,30 +173,21 @@ handle_credit_history_finished (void *cls, GNUNET_break_op (0); ec = TALER_JSON_get_error_code (j); break; - case MHD_HTTP_FORBIDDEN: - /* Access denied */ - GNUNET_break_op (0); - ec = TALER_JSON_get_error_code (j); - break; case MHD_HTTP_UNAUTHORIZED: - /* FIXME(dold): I don't get this comment below. What signatures would the - bank even verify?! */ - /* Nothing really to verify, bank says one of the signatures is - invalid; as we checked them, this should never happen, we - should pass the JSON reply to the application */ - GNUNET_break_op (0); + /* Nothing really to verify, bank says the HTTP Authentication + failed. May happen if HTTP authentication is used and the + user supplied a wrong username/password combination. */ ec = TALER_JSON_get_error_code (j); break; case MHD_HTTP_NOT_FOUND: - /* Nothing really to verify, this should never - happen, we should pass the JSON reply to the application */ - GNUNET_break_op (0); + /* Nothing really to verify: the bank is either unaware + of the endpoint (not a bank), or of the account. + We should pass the JSON (?) reply to the application */ ec = TALER_JSON_get_error_code (j); break; case MHD_HTTP_INTERNAL_SERVER_ERROR: /* Server had an internal issue; we should retry, but this API leaves this to the application */ - GNUNET_break_op (0); ec = TALER_JSON_get_error_code (j); break; default: diff --git a/src/bank-lib/bank_api_debit.c b/src/bank-lib/bank_api_debit.c index 0e218eb48..58f6ae6d4 100644 --- a/src/bank-lib/bank_api_debit.c +++ b/src/bank-lib/bank_api_debit.c @@ -30,7 +30,7 @@ /** - * @brief A /history Handle + * @brief A /history/outgoing Handle */ struct TALER_BANK_DebitHistoryHandle { @@ -129,16 +129,16 @@ parse_account_history (struct TALER_BANK_DebitHistoryHandle *hh, /** * Function called when we're done processing the - * HTTP /history request. + * HTTP /history/outgoing request. * * @param cls the `struct TALER_BANK_DebitHistoryHandle` * @param response_code HTTP response code, 0 on error * @param response parsed JSON result, NULL on error */ static void -handle_history_finished (void *cls, - long response_code, - const void *response) +handle_debit_history_finished (void *cls, + long response_code, + const void *response) { struct TALER_BANK_DebitHistoryHandle *hh = cls; enum TALER_ErrorCode ec; @@ -169,21 +169,19 @@ handle_history_finished (void *cls, case MHD_HTTP_BAD_REQUEST: /* This should never happen, either us or the bank is buggy (or API version conflict); just pass JSON reply to the application */ - ec = TALER_JSON_get_error_code (j); - break; - case MHD_HTTP_FORBIDDEN: - /* Access denied */ + GNUNET_break_op (0); ec = TALER_JSON_get_error_code (j); break; case MHD_HTTP_UNAUTHORIZED: - /* Nothing really to verify, bank says one of the signatures is - invalid; as we checked them, this should never happen, we - should pass the JSON reply to the application */ + /* Nothing really to verify, bank says the HTTP Authentication + failed. May happen if HTTP authentication is used and the + user supplied a wrong username/password combination. */ ec = TALER_JSON_get_error_code (j); break; case MHD_HTTP_NOT_FOUND: - /* Nothing really to verify, this should never - happen, we should pass the JSON reply to the application */ + /* Nothing really to verify: the bank is either unaware + of the endpoint (not a bank), or of the account. + We should pass the JSON (?) reply to the application */ ec = TALER_JSON_get_error_code (j); break; case MHD_HTTP_INTERNAL_SERVER_ERROR: @@ -196,7 +194,7 @@ handle_history_finished (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Unexpected response code %u\n", (unsigned int) response_code); - GNUNET_break (0); + GNUNET_break_op (0); ec = TALER_JSON_get_error_code (j); response_code = 0; break; @@ -292,7 +290,7 @@ TALER_BANK_debit_history (struct GNUNET_CURL_Context *ctx, hh->job = GNUNET_CURL_job_add2 (ctx, eh, NULL, - &handle_history_finished, + &handle_debit_history_finished, hh); return hh; } From f4f86d2b0149231e95b81f12a607c670ad74f02f Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 26 Jan 2020 18:51:25 +0100 Subject: [PATCH 02/21] increse log level on errors --- src/exchange/taler-exchange-wirewatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exchange/taler-exchange-wirewatch.c b/src/exchange/taler-exchange-wirewatch.c index 21d96668b..972cee349 100644 --- a/src/exchange/taler-exchange-wirewatch.c +++ b/src/exchange/taler-exchange-wirewatch.c @@ -340,7 +340,7 @@ history_cb (void *cls, hh = NULL; if (TALER_EC_NONE != ec) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error fetching history: ec=%u, http_status=%u\n", (unsigned int) ec, http_status); From 232606fb57e3c74b62aa78d49225e2bb3c0c9ab4 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 3 Feb 2020 23:42:47 +0100 Subject: [PATCH 03/21] add IF NOT EXISTS for indices --- src/auditordb/0001.sql | 4 +- src/exchange/taler-exchange-aggregator.c | 8 ++-- src/exchangedb/0001.sql | 54 ++++++++++++------------ src/json/json.c | 3 +- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/auditordb/0001.sql b/src/auditordb/0001.sql index 7f47f0357..3e666519c 100644 --- a/src/auditordb/0001.sql +++ b/src/auditordb/0001.sql @@ -115,7 +115,7 @@ CREATE TABLE IF NOT EXISTS auditor_reserves ,auditor_reserves_rowid BIGSERIAL UNIQUE ,origin_account TEXT ); -CREATE INDEX auditor_reserves_by_reserve_pub +CREATE INDEX IF NOT EXISTS auditor_reserves_by_reserve_pub ON auditor_reserves (reserve_pub); -- Table with the sum of the balances of all customer reserves @@ -203,7 +203,7 @@ CREATE TABLE IF NOT EXISTS auditor_historic_reserve_summary ,reserve_profits_val INT8 NOT NULL ,reserve_profits_frac INT4 NOT NULL ); -CREATE INDEX auditor_historic_reserve_summary_by_master_pub_start_date +CREATE INDEX IF NOT EXISTS auditor_historic_reserve_summary_by_master_pub_start_date ON auditor_historic_reserve_summary (master_pub ,start_date); diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index a43277b23..5f57c8291 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -582,6 +582,7 @@ shutdown_task (void *cls) ctc = NULL; } TALER_EXCHANGEDB_plugin_unload (db_plugin); + db_plugin = NULL; { struct WireAccount *wa; @@ -670,6 +671,7 @@ parse_wirewatch_config () fprintf (stderr, "Failed to initialize DB tables\n"); TALER_EXCHANGEDB_plugin_unload (db_plugin); + db_plugin = NULL; return GNUNET_SYSERR; } TALER_EXCHANGEDB_find_accounts (cfg, @@ -680,6 +682,7 @@ parse_wirewatch_config () fprintf (stderr, "No wire accounts configured for debit!\n"); TALER_EXCHANGEDB_plugin_unload (db_plugin); + db_plugin = NULL; return GNUNET_SYSERR; } return GNUNET_OK; @@ -1179,10 +1182,7 @@ expired_reserve_cb (void *cls, /* Reserve balance was almost zero OR soft error */ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Reserve was virtually empty, moving on\n"); - (void) commit_or_warn (ctc->session); - GNUNET_free (ctc->method); - GNUNET_free (ctc); - ctc = NULL; + (void) commit_or_warn (session); task = GNUNET_SCHEDULER_add_now (&run_transfers, NULL); return qs; diff --git a/src/exchangedb/0001.sql b/src/exchangedb/0001.sql index 8e7ea0bf5..02dc68cf4 100644 --- a/src/exchangedb/0001.sql +++ b/src/exchangedb/0001.sql @@ -42,7 +42,7 @@ CREATE TABLE IF NOT EXISTS denominations ,fee_refund_val INT8 NOT NULL ,fee_refund_frac INT4 NOT NULL ); -CREATE INDEX denominations_expire_legal_index +CREATE INDEX IF NOT EXISTS denominations_expire_legal_index ON denominations (expire_legal); @@ -65,18 +65,18 @@ CREATE TABLE IF NOT EXISTS reserves ,gc_date INT8 NOT NULL ); -- index on reserves table (TODO: useless due to primary key!?) -CREATE INDEX reserves_reserve_pub_index +CREATE INDEX IF NOT EXISTS reserves_reserve_pub_index ON reserves (reserve_pub); -- index for get_expired_reserves -CREATE INDEX reserves_expiration_index +CREATE INDEX IF NOT EXISTS reserves_expiration_index ON reserves (expiration_date ,current_balance_val ,current_balance_frac ); -- index for reserve GC operations -CREATE INDEX reserves_gc_index +CREATE INDEX IF NOT EXISTS reserves_gc_index ON reserves (gc_date); -- reserves_in table collects the transactions which transfer funds @@ -94,12 +94,12 @@ CREATE TABLE IF NOT EXISTS reserves_in ,PRIMARY KEY (reserve_pub, wire_reference) ); -- Create indices on reserves_in -CREATE INDEX reserves_in_execution_index +CREATE INDEX IF NOT EXISTS reserves_in_execution_index ON reserves_in (exchange_account_section ,execution_date ); -CREATE INDEX reserves_in_exchange_account_serial +CREATE INDEX IF NOT EXISTS reserves_in_exchange_account_serial ON reserves_in (exchange_account_section, reserve_in_serial_id DESC @@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS reserves_close ,amount_frac INT4 NOT NULL ,closing_fee_val INT8 NOT NULL ,closing_fee_frac INT4 NOT NULL); -CREATE INDEX reserves_close_by_reserve +CREATE INDEX IF NOT EXISTS reserves_close_by_reserve ON reserves_close (reserve_pub); -- Table with the withdraw operations that have been performed on a reserve. @@ -137,13 +137,13 @@ CREATE TABLE IF NOT EXISTS reserves_out ,amount_with_fee_frac INT4 NOT NULL ); -- Index blindcoins(reserve_pub) for get_reserves_out statement -CREATE INDEX reserves_out_reserve_pub_index +CREATE INDEX IF NOT EXISTS reserves_out_reserve_pub_index ON reserves_out (reserve_pub); -CREATE INDEX reserves_out_execution_date +CREATE INDEX IF NOT EXISTS reserves_out_execution_date ON reserves_out (execution_date); -CREATE INDEX reserves_out_for_get_withdraw_info +CREATE INDEX IF NOT EXISTS reserves_out_for_get_withdraw_info ON reserves_out (denom_pub_hash ,h_blind_ev @@ -155,7 +155,7 @@ CREATE TABLE IF NOT EXISTS known_coins ,denom_pub_hash BYTEA NOT NULL REFERENCES denominations (denom_pub_hash) ON DELETE CASCADE ,denom_sig BYTEA NOT NULL ); -CREATE INDEX known_coins_by_denomination +CREATE INDEX IF NOT EXISTS known_coins_by_denomination ON known_coins (denom_pub_hash); -- Table with the commitments made when melting a coin. */ @@ -168,7 +168,7 @@ CREATE TABLE IF NOT EXISTS refresh_commitments ,amount_with_fee_frac INT4 NOT NULL ,noreveal_index INT4 NOT NULL ); -CREATE INDEX refresh_commitments_old_coin_pub_index +CREATE INDEX IF NOT EXISTS refresh_commitments_old_coin_pub_index ON refresh_commitments (old_coin_pub); -- Table with the revelations about the new coins that are to be created @@ -188,7 +188,7 @@ CREATE TABLE IF NOT EXISTS refresh_revealed_coins ,PRIMARY KEY (rc, newcoin_index) ,UNIQUE (h_coin_ev) ); -CREATE INDEX refresh_revealed_coins_coin_pub_index +CREATE INDEX IF NOT EXISTS refresh_revealed_coins_coin_pub_index ON refresh_revealed_coins (denom_pub_hash); -- Table with the transfer keys of a refresh operation; includes @@ -203,7 +203,7 @@ CREATE TABLE IF NOT EXISTS refresh_transfer_keys -- for get_link (not sure if this helps, as there should be very few -- transfer_pubs per rc, but at least in theory this helps the ORDER BY -- clause. -CREATE INDEX refresh_transfer_keys_coin_tpub +CREATE INDEX IF NOT EXISTS refresh_transfer_keys_coin_tpub ON refresh_transfer_keys (rc ,transfer_pub @@ -228,14 +228,14 @@ CREATE TABLE IF NOT EXISTS deposits ,UNIQUE (coin_pub, merchant_pub, h_contract_terms) ); -- Index for get_deposit_for_wtid and get_deposit_statement */ -CREATE INDEX deposits_coin_pub_merchant_contract_index +CREATE INDEX IF NOT EXISTS deposits_coin_pub_merchant_contract_index ON deposits (coin_pub ,merchant_pub ,h_contract_terms ); -- Index for deposits_get_ready -CREATE INDEX deposits_get_ready_index +CREATE INDEX IF NOT EXISTS deposits_get_ready_index ON deposits (tiny ,done @@ -243,7 +243,7 @@ CREATE INDEX deposits_get_ready_index ,refund_deadline ); -- Index for deposits_iterate_matching -CREATE INDEX deposits_iterate_matching +CREATE INDEX IF NOT EXISTS deposits_iterate_matching ON deposits (merchant_pub ,h_wire @@ -265,7 +265,7 @@ CREATE TABLE IF NOT EXISTS refunds ,amount_with_fee_frac INT4 NOT NULL ,PRIMARY KEY (coin_pub, merchant_pub, h_contract_terms, rtransaction_id) ); -CREATE INDEX refunds_coin_pub_index +CREATE INDEX IF NOT EXISTS refunds_coin_pub_index ON refunds (coin_pub); -- This table contains the data for @@ -287,7 +287,7 @@ CREATE TABLE IF NOT EXISTS aggregation_tracking ,wtid_raw BYTEA CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE ); -- Index for lookup_transactions statement on wtid -CREATE INDEX aggregation_tracking_wtid_index +CREATE INDEX IF NOT EXISTS aggregation_tracking_wtid_index ON aggregation_tracking (wtid_raw); -- Table for the wire fees. @@ -302,7 +302,7 @@ CREATE TABLE IF NOT EXISTS wire_fee ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64) ,PRIMARY KEY (wire_method, start_date) ); -CREATE INDEX wire_fee_gc_index +CREATE INDEX IF NOT EXISTS wire_fee_gc_index ON wire_fee (end_date); -- Table for /recoup information @@ -317,13 +317,13 @@ CREATE TABLE IF NOT EXISTS recoup ,timestamp INT8 NOT NULL ,h_blind_ev BYTEA NOT NULL REFERENCES reserves_out (h_blind_ev) ON DELETE CASCADE ); -CREATE INDEX recoup_by_coin_index +CREATE INDEX IF NOT EXISTS recoup_by_coin_index ON recoup (coin_pub); -CREATE INDEX recoup_by_h_blind_ev +CREATE INDEX IF NOT EXISTS recoup_by_h_blind_ev ON recoup (h_blind_ev); -CREATE INDEX recoup_for_by_reserve +CREATE INDEX IF NOT EXISTS recoup_for_by_reserve ON recoup (coin_pub ,h_blind_ev @@ -340,13 +340,13 @@ CREATE TABLE IF NOT EXISTS recoup_refresh ,timestamp INT8 NOT NULL ,h_blind_ev BYTEA NOT NULL REFERENCES refresh_revealed_coins (h_coin_ev) ON DELETE CASCADE ); -CREATE INDEX recoup_refresh_by_coin_index +CREATE INDEX IF NOT EXISTS recoup_refresh_by_coin_index ON recoup_refresh (coin_pub); -CREATE INDEX recoup_refresh_by_h_blind_ev +CREATE INDEX IF NOT EXISTS recoup_refresh_by_h_blind_ev ON recoup_refresh (h_blind_ev); -CREATE INDEX recoup_refresh_for_by_reserve +CREATE INDEX IF NOT EXISTS recoup_refresh_for_by_reserve ON recoup_refresh (coin_pub ,h_blind_ev @@ -360,7 +360,7 @@ CREATE TABLE IF NOT EXISTS prewire ,buf BYTEA NOT NULL ); -- Index for wire_prepare_data_get and gc_prewire statement -CREATE INDEX prepare_iteration_index +CREATE INDEX IF NOT EXISTS prepare_iteration_index ON prewire (finished); diff --git a/src/json/json.c b/src/json/json.c index 6de299319..f0c0aff57 100644 --- a/src/json/json.c +++ b/src/json/json.c @@ -81,7 +81,8 @@ TALER_JSON_get_error_code (const json_t *json) so we are dealing with a missing error code here. */ if (NULL == jc) { - GNUNET_break_op (0); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Expected Taler error code `code' in JSON, but field does not exist!\n"); return TALER_EC_INVALID; } if (json_is_integer (jc)) From d47241e0e12ace8530ef4ecb2f9ac0f0918dcff6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Feb 2020 00:04:29 +0100 Subject: [PATCH 04/21] fix double continuation scheduling --- src/exchange/taler-exchange-aggregator.c | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index 5f57c8291..a03eaff52 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -1183,6 +1183,8 @@ expired_reserve_cb (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Reserve was virtually empty, moving on\n"); (void) commit_or_warn (session); + erc->async_cont = GNUNET_YES; + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_transfers, NULL); return qs; @@ -1223,6 +1225,7 @@ expired_reserve_cb (void *cls, return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS; } erc->async_cont = GNUNET_YES; + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_transfers, NULL); GNUNET_free (ctc->method); @@ -1299,6 +1302,7 @@ run_reserve_closures (void *cls) case GNUNET_DB_STATUS_SOFT_ERROR: db_plugin->rollback (db_plugin->cls, session); + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, NULL); return; @@ -1308,6 +1312,7 @@ run_reserve_closures (void *cls) reserves_idle = GNUNET_YES; db_plugin->rollback (db_plugin->cls, session); + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1315,6 +1320,7 @@ run_reserve_closures (void *cls) (void) commit_or_warn (session); if (GNUNET_YES == erc.async_cont) break; + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, NULL); return; @@ -1345,6 +1351,7 @@ run_aggregation (void *cls) return; if (0 == (++swap % 2)) { + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, NULL); return; @@ -1392,6 +1399,7 @@ run_aggregation (void *cls) { /* should re-try immediately */ swap--; /* do not count failed attempts */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1408,15 +1416,21 @@ run_aggregation (void *cls) { if ( (GNUNET_NO == reserves_idle) || (GNUNET_YES == test_mode) ) + { /* Possibly more to on reserves, go for it immediately */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, NULL); + } else + { /* FIXME(dold): We might want to read the duration to sleep from the config */ /* nothing to do, sleep for a minute and try again */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &run_aggregation, NULL); + } } return; } @@ -1451,6 +1465,7 @@ run_aggregation (void *cls) "Serialization issue, trying again later!\n"); db_plugin->rollback (db_plugin->cls, session); + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1515,6 +1530,7 @@ run_aggregation (void *cls) session); cleanup_au (); /* start again */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1531,6 +1547,7 @@ run_aggregation (void *cls) (void) commit_or_warn (session); cleanup_au (); /* start again */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1587,6 +1604,7 @@ run_aggregation (void *cls) db_plugin->rollback (db_plugin->cls, session); /* start again */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1613,6 +1631,7 @@ run_aggregation (void *cls) /* try again */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Commit issue for prepared wire data; trying again later!\n"); + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1625,6 +1644,7 @@ run_aggregation (void *cls) GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preparation complete, switching to transfer mode\n"); /* run alternative task: actually do wire transfer! */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_transfers, NULL); return; @@ -1685,6 +1705,7 @@ wire_confirm_cb (void *cls, if (GNUNET_DB_STATUS_SOFT_ERROR == qs) { /* try again */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); } @@ -1703,6 +1724,7 @@ wire_confirm_cb (void *cls, { case GNUNET_DB_STATUS_SOFT_ERROR: /* try again */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1716,6 +1738,7 @@ wire_confirm_cb (void *cls, "Wire transfer complete\n"); /* continue with #run_transfers(), just to guard against the unlikely case that there are more. */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_transfers, NULL); return; @@ -1846,6 +1869,7 @@ run_transfers (void *cls) return; case GNUNET_DB_STATUS_SOFT_ERROR: /* try again */ + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_transfers, NULL); return; @@ -1853,6 +1877,7 @@ run_transfers (void *cls) /* no more prepared wire transfers, go back to aggregation! */ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "No more pending wire transfers, starting aggregation\n"); + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_aggregation, NULL); return; @@ -1898,6 +1923,7 @@ run (void *cls, return; } + GNUNET_assert (NULL == task); task = GNUNET_SCHEDULER_add_now (&run_transfers, NULL); GNUNET_SCHEDULER_add_shutdown (&shutdown_task, From 5a11839002b2f327fa35e8a1bf589bb77c54e3c1 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Feb 2020 15:47:57 +0100 Subject: [PATCH 05/21] add timetravel option for testing/debugging --- src/auditor/taler-auditor.c | 2 ++ src/auditor/taler-wire-auditor.c | 2 ++ src/exchange-tools/taler-exchange-keyup.c | 2 ++ src/exchange-tools/taler-exchange-wire.c | 2 ++ src/exchange/taler-exchange-aggregator.c | 2 ++ src/exchange/taler-exchange-httpd.c | 2 ++ src/exchange/taler-exchange-wirewatch.c | 4 +++- 7 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c index 4e32d2a4e..0ec5e2d75 100644 --- a/src/auditor/taler-auditor.c +++ b/src/auditor/taler-auditor.c @@ -5709,6 +5709,8 @@ main (int argc, "restart", "restart audit from the beginning (required on first run)", &restart), + GNUNET_GETOPT_option_timetravel ('T', + "timetravel"), GNUNET_GETOPT_OPTION_END }; diff --git a/src/auditor/taler-wire-auditor.c b/src/auditor/taler-wire-auditor.c index 94fd773c9..5a68f165d 100644 --- a/src/auditor/taler-wire-auditor.c +++ b/src/auditor/taler-wire-auditor.c @@ -2312,6 +2312,8 @@ main (int argc, "restart", "restart audit from the beginning (required on first run)", &restart), + GNUNET_GETOPT_option_timetravel ('T', + "timetravel"), GNUNET_GETOPT_OPTION_END }; diff --git a/src/exchange-tools/taler-exchange-keyup.c b/src/exchange-tools/taler-exchange-keyup.c index 266c1bac0..f70ff23ac 100644 --- a/src/exchange-tools/taler-exchange-keyup.c +++ b/src/exchange-tools/taler-exchange-keyup.c @@ -1437,6 +1437,8 @@ main (int argc, "DKH", "revoke denomination key hash (DKH) and request wallets to initiate /recoup", &revoke_dkh), + GNUNET_GETOPT_option_timetravel ('T', + "timetravel"), GNUNET_GETOPT_option_absolute_time ('t', "time", "TIMESTAMP", diff --git a/src/exchange-tools/taler-exchange-wire.c b/src/exchange-tools/taler-exchange-wire.c index 5ddc24040..0d6cdddbf 100644 --- a/src/exchange-tools/taler-exchange-wire.c +++ b/src/exchange-tools/taler-exchange-wire.c @@ -228,6 +228,8 @@ main (int argc, char *const *argv) { const struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_option_timetravel ('T', + "timetravel"), GNUNET_GETOPT_option_filename ('m', "master-key", "FILENAME", diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index a03eaff52..d380c3915 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -1943,6 +1943,8 @@ main (int argc, char *const *argv) { struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_option_timetravel ('T', + "timetravel"), GNUNET_GETOPT_option_flag ('t', "test", "run in test mode and exit when idle", diff --git a/src/exchange/taler-exchange-httpd.c b/src/exchange/taler-exchange-httpd.c index 666cec0c1..426c48655 100644 --- a/src/exchange/taler-exchange-httpd.c +++ b/src/exchange/taler-exchange-httpd.c @@ -999,6 +999,8 @@ main (int argc, "SECONDS", "after how long do connections timeout by default (in seconds)", &connection_timeout), + GNUNET_GETOPT_option_timetravel ('T', + "timetravel"), #if HAVE_DEVELOPER GNUNET_GETOPT_option_filename ('f', "file-input", diff --git a/src/exchange/taler-exchange-wirewatch.c b/src/exchange/taler-exchange-wirewatch.c index 972cee349..69929e127 100644 --- a/src/exchange/taler-exchange-wirewatch.c +++ b/src/exchange/taler-exchange-wirewatch.c @@ -597,7 +597,9 @@ main (int argc, char *const *argv) { struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_option_flag ('T', + GNUNET_GETOPT_option_timetravel ('T', + "timetravel"), + GNUNET_GETOPT_option_flag ('t', "test", "run in test mode and exit when idle", &test_mode), From 9bfeec352b95873bc94b96947a8dd335838f3e8b Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Feb 2020 20:57:11 +0100 Subject: [PATCH 06/21] fix #6065 --- src/exchange/taler-exchange-httpd_mhd.c | 9 ++- .../taler-exchange-httpd_refresh_melt.c | 2 +- .../taler-exchange-httpd_refresh_reveal.c | 2 +- src/exchange/taler-exchange-httpd_refund.c | 57 +++++++------------ .../taler-exchange-httpd_reserve_status.c | 2 +- .../taler-exchange-httpd_reserve_withdraw.c | 2 +- src/exchange/taler-exchange-httpd_responses.c | 2 +- src/include/taler_error_codes.h | 5 ++ 8 files changed, 34 insertions(+), 47 deletions(-) diff --git a/src/exchange/taler-exchange-httpd_mhd.c b/src/exchange/taler-exchange-httpd_mhd.c index 53944b6a7..0f2ce033a 100644 --- a/src/exchange/taler-exchange-httpd_mhd.c +++ b/src/exchange/taler-exchange-httpd_mhd.c @@ -128,11 +128,10 @@ TEH_MHD_handler_send_json_pack_error (struct TEH_RequestHandler *rh, (void) connection_cls; (void) upload_data; (void) upload_data_size; - return TALER_MHD_reply_json_pack (connection, - rh->response_code, - "{s:s}", - "error", - rh->data); + return TALER_MHD_reply_with_error (connection, + rh->response_code, + TALER_EC_METHOD_INVALID, + rh->data); } diff --git a/src/exchange/taler-exchange-httpd_refresh_melt.c b/src/exchange/taler-exchange-httpd_refresh_melt.c index 71200037d..c7dc700f7 100644 --- a/src/exchange/taler-exchange-httpd_refresh_melt.c +++ b/src/exchange/taler-exchange-httpd_refresh_melt.c @@ -69,7 +69,7 @@ reply_refresh_melt_insufficient_funds (struct MHD_Connection *connection, return TALER_MHD_reply_json_pack (connection, MHD_HTTP_CONFLICT, "{s:s, s:I, s:o, s:o, s:o, s:o, s:o}", - "error", + "hint", "insufficient funds", "code", (json_int_t) diff --git a/src/exchange/taler-exchange-httpd_refresh_reveal.c b/src/exchange/taler-exchange-httpd_refresh_reveal.c index 3619f9a39..1e03c8e7d 100644 --- a/src/exchange/taler-exchange-httpd_refresh_reveal.c +++ b/src/exchange/taler-exchange-httpd_refresh_reveal.c @@ -108,7 +108,7 @@ reply_refresh_reveal_mismatch (struct MHD_Connection *connection, return TALER_MHD_reply_json_pack (connection, MHD_HTTP_CONFLICT, "{s:s, s:I, s:o}", - "error", "commitment violation", + "hint", "commitment violation", "code", (json_int_t) TALER_EC_REFRESH_REVEAL_COMMITMENT_VIOLATION, diff --git a/src/exchange/taler-exchange-httpd_refund.c b/src/exchange/taler-exchange-httpd_refund.c index 8c6e90302..8e24b9b47 100644 --- a/src/exchange/taler-exchange-httpd_refund.c +++ b/src/exchange/taler-exchange-httpd_refund.c @@ -82,28 +82,6 @@ reply_refund_success (struct MHD_Connection *connection, } -/** - * Generate generic refund failure message. All the details - * are in the @a response_code. The body can be empty. - * - * @param connection connection to the client - * @param response_code response code to generate - * @param ec taler error code to include - * @return MHD result code - */ -static int -reply_refund_failure (struct MHD_Connection *connection, - unsigned int response_code, - enum TALER_ErrorCode ec) -{ - return TALER_MHD_reply_json_pack (connection, - response_code, - "{s:s, s:I}", - "hint", "refund failure", - "code", (json_int_t) ec); -} - - /** * Generate refund conflict failure message. Returns the * transaction list @a tl with the details about the conflict. @@ -194,9 +172,10 @@ refund_transaction (void *cls, if (0 > qs) { if (GNUNET_DB_STATUS_HARD_ERROR == qs) - *mhd_ret = reply_refund_failure (connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_REFUND_COIN_NOT_FOUND); + *mhd_ret = TALER_MHD_reply_with_error (connection, + MHD_HTTP_NOT_FOUND, + TALER_EC_REFUND_COIN_NOT_FOUND, + "database transaction failure"); return qs; } deposit_found = GNUNET_NO; @@ -319,9 +298,10 @@ refund_transaction (void *cls, GNUNET_break_op (0); /* currency mismatch */ TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, tl); - *mhd_ret = reply_refund_failure (connection, - MHD_HTTP_PRECONDITION_FAILED, - TALER_EC_REFUND_CURRENCY_MISSMATCH); + *mhd_ret = TALER_MHD_reply_with_error (connection, + MHD_HTTP_PRECONDITION_FAILED, + TALER_EC_REFUND_CURRENCY_MISSMATCH, + "currencies involved do not match"); return GNUNET_DB_STATUS_HARD_ERROR; } @@ -353,9 +333,10 @@ refund_transaction (void *cls, /* money was already transferred to merchant, can no longer refund */ TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, tl); - *mhd_ret = reply_refund_failure (connection, - MHD_HTTP_GONE, - TALER_EC_REFUND_MERCHANT_ALREADY_PAID); + *mhd_ret = TALER_MHD_reply_with_error (connection, + MHD_HTTP_GONE, + TALER_EC_REFUND_MERCHANT_ALREADY_PAID, + "money already sent to merchant"); return GNUNET_DB_STATUS_HARD_ERROR; } @@ -366,9 +347,10 @@ refund_transaction (void *cls, GNUNET_break_op (0); /* cannot refund more than original value */ TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, tl); - *mhd_ret = reply_refund_failure (connection, - MHD_HTTP_PRECONDITION_FAILED, - TALER_EC_REFUND_INSUFFICIENT_FUNDS); + *mhd_ret = TALER_MHD_reply_with_error (connection, + MHD_HTTP_PRECONDITION_FAILED, + TALER_EC_REFUND_INSUFFICIENT_FUNDS, + "refund requested exceeds original value"); return GNUNET_DB_STATUS_HARD_ERROR; } /* Check refund fee matches fee of denomination key! */ @@ -481,9 +463,10 @@ verify_and_execute_refund (struct MHD_Connection *connection, if (0 > qs) { GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); - return reply_refund_failure (connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_REFUND_COIN_NOT_FOUND); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_NOT_FOUND, + TALER_EC_REFUND_COIN_NOT_FOUND, + "denomination of coin to be refunded not found in DB"); } } diff --git a/src/exchange/taler-exchange-httpd_reserve_status.c b/src/exchange/taler-exchange-httpd_reserve_status.c index 89bf8b38a..e2d35aaec 100644 --- a/src/exchange/taler-exchange-httpd_reserve_status.c +++ b/src/exchange/taler-exchange-httpd_reserve_status.c @@ -164,7 +164,7 @@ TEH_RESERVE_handler_reserve_status (struct TEH_RequestHandler *rh, return TALER_MHD_reply_json_pack (connection, MHD_HTTP_NOT_FOUND, "{s:s, s:s, s:I}", - "error", "Reserve not found", + "hint", "Reserve not found", "parameter", "reserve_pub", "code", (json_int_t) diff --git a/src/exchange/taler-exchange-httpd_reserve_withdraw.c b/src/exchange/taler-exchange-httpd_reserve_withdraw.c index 86633cd98..9daad0a02 100644 --- a/src/exchange/taler-exchange-httpd_reserve_withdraw.c +++ b/src/exchange/taler-exchange-httpd_reserve_withdraw.c @@ -74,7 +74,7 @@ reply_reserve_withdraw_insufficient_funds (struct MHD_Connection *connection, return TALER_MHD_reply_json_pack (connection, MHD_HTTP_CONFLICT, "{s:s, s:I, s:o, s:o}", - "error", "Insufficient funds", + "hint", "insufficient funds", "code", (json_int_t) TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS, diff --git a/src/exchange/taler-exchange-httpd_responses.c b/src/exchange/taler-exchange-httpd_responses.c index c88a8a254..90ca14c88 100644 --- a/src/exchange/taler-exchange-httpd_responses.c +++ b/src/exchange/taler-exchange-httpd_responses.c @@ -446,7 +446,7 @@ TEH_RESPONSE_reply_coin_insufficient_funds (struct MHD_Connection *connection, return TALER_MHD_reply_json_pack (connection, MHD_HTTP_CONFLICT, "{s:s, s:I, s:o}", - "error", "insufficient funds", + "hint", "insufficient funds", "code", (json_int_t) ec, "history", history); } diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index ac7f92888..917ac36db 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -80,6 +80,11 @@ enum TALER_ErrorCode */ TALER_EC_JSON_ALLOCATION_FAILURE = 7, + /** + * HTTP method invalid for this URL. + */ + TALER_EC_METHOD_INVALID = 8, + /** * The exchange failed to even just initialize its connection to the * database. This response is provided with HTTP status code From e6d6987e5685b35f6c3137f59894a02a63d09766 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Feb 2020 21:49:18 +0100 Subject: [PATCH 07/21] capitalization of option changed --- src/testing/testing_api_cmd_exec_wirewatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testing/testing_api_cmd_exec_wirewatch.c b/src/testing/testing_api_cmd_exec_wirewatch.c index 44de96838..7a1a27a51 100644 --- a/src/testing/testing_api_cmd_exec_wirewatch.c +++ b/src/testing/testing_api_cmd_exec_wirewatch.c @@ -67,7 +67,7 @@ wirewatch_run (void *cls, "taler-exchange-wirewatch", "taler-exchange-wirewatch", "-c", ws->config_filename, - "-T", /* exit when done */ + "-t", /* exit when done */ NULL); if (NULL == ws->wirewatch_proc) { From 42bc31744b9810509aef344c54bfee2f4e2a7ccb Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Feb 2020 21:59:43 +0100 Subject: [PATCH 08/21] implement /config in fakebank and taler_bank_lib.h (#6066) --- src/bank-lib/Makefile.am | 1 + src/bank-lib/bank_api_config.c | 255 +++++++++++++++++++ src/bank-lib/fakebank.c | 63 ++++- src/bank-lib/taler-fakebank-run.c | 28 +- src/benchmark/taler-exchange-benchmark.c | 36 ++- src/include/taler_bank_service.h | 73 +++++- src/include/taler_fakebank_lib.h | 4 +- src/include/taler_testing_lib.h | 8 +- src/testing/test_bank_api.c | 36 ++- src/testing/test_taler_exchange_aggregator.c | 78 +++--- src/testing/testing_api_helpers_bank.c | 7 +- src/testing/testing_api_helpers_exchange.c | 2 +- src/testing/testing_api_loop.c | 88 +++---- 13 files changed, 564 insertions(+), 115 deletions(-) create mode 100644 src/bank-lib/bank_api_config.c diff --git a/src/bank-lib/Makefile.am b/src/bank-lib/Makefile.am index 729f96e15..7227ad068 100644 --- a/src/bank-lib/Makefile.am +++ b/src/bank-lib/Makefile.am @@ -38,6 +38,7 @@ libtalerbank_la_LDFLAGS = \ libtalerbank_la_SOURCES = \ bank_api_admin.c \ bank_api_common.c bank_api_common.h \ + bank_api_config.c \ bank_api_credit.c \ bank_api_debit.c \ bank_api_transfer.c \ diff --git a/src/bank-lib/bank_api_config.c b/src/bank-lib/bank_api_config.c new file mode 100644 index 000000000..a84e4ff85 --- /dev/null +++ b/src/bank-lib/bank_api_config.c @@ -0,0 +1,255 @@ +/* + This file is part of TALER + Copyright (C) 2017--2020 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 bank-lib/bank_api_config.c + * @brief Implementation of the /config request + * @author Christian Grothoff + */ +#include "platform.h" +#include "bank_api_common.h" +#include /* just for HTTP status codes */ +#include "taler_signatures.h" + +/** + * Protocol version we implement. + */ +#define BANK_PROTOCOL_CURRENT 0 + +/** + * How many revisions back are we compatible to. + */ +#define BANK_PROTOCOL_AGE 0 + + +/** + * @brief A /config Handle + */ +struct TALER_BANK_ConfigHandle +{ + + /** + * The url for this request. + */ + char *request_url; + + /** + * Handle for the request. + */ + struct GNUNET_CURL_Job *job; + + /** + * Function to call with the result. + */ + TALER_BANK_ConfigCallback hcb; + + /** + * Closure for @a cb. + */ + void *hcb_cls; +}; + + +/** + * Parse configuration given in JSON format and invoke the callback on each item. + * + * @param ch handle to the account configuration request + * @param config JSON object with the configuration + * @return #GNUNET_OK if configuration was valid and @a rconfiguration and @a balance + * were set, + * #GNUNET_SYSERR if there was a protocol violation in @a configuration + */ +static int +parse_config (struct TALER_BANK_ConfigHandle *ch, + const json_t *config) +{ + struct TALER_BANK_Configuration cfg; + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_string ("version", + &cfg.version), + GNUNET_JSON_spec_string ("currency", + &cfg.version), + GNUNET_JSON_spec_end () + }; + + if (GNUNET_OK != + GNUNET_JSON_parse (config, + spec, + NULL, NULL)) + { + GNUNET_break_op (0); + return GNUNET_SYSERR; + } + ch->hcb (ch->hcb_cls, + MHD_HTTP_OK, + TALER_EC_NONE, + &cfg); + GNUNET_JSON_parse_free (spec); + return GNUNET_OK; +} + + +/** + * Function called when we're done processing the + * HTTP /config request. + * + * @param cls the `struct TALER_BANK_ConfigHandle` + * @param response_code HTTP response code, 0 on error + * @param response parsed JSON result, NULL on error + */ +static void +handle_configuration_finished (void *cls, + long response_code, + const void *response) +{ + struct TALER_BANK_ConfigHandle *ch = cls; + enum TALER_ErrorCode ec; + const json_t *j = response; + + ch->job = NULL; + switch (response_code) + { + case 0: + ec = TALER_EC_INVALID_RESPONSE; + break; + case MHD_HTTP_OK: + if (GNUNET_OK != + parse_config (ch, + j)) + { + GNUNET_break_op (0); + response_code = 0; + ec = TALER_EC_INVALID_RESPONSE; + break; + } + response_code = MHD_HTTP_NO_CONTENT; /* signal end of list */ + ec = TALER_EC_NONE; + break; + case MHD_HTTP_BAD_REQUEST: + /* This should never happen, either us or the bank is buggy + (or API version conflict); just pass JSON reply to the application */ + GNUNET_break_op (0); + ec = TALER_JSON_get_error_code (j); + break; + case MHD_HTTP_UNAUTHORIZED: + /* Nothing really to verify, bank says the HTTP Authentication + failed. May happen if HTTP authentication is used and the + user supplied a wrong username/password combination. */ + ec = TALER_JSON_get_error_code (j); + break; + case MHD_HTTP_INTERNAL_SERVER_ERROR: + /* Server had an internal issue; we should retry, but this API + leaves this to the application */ + ec = TALER_JSON_get_error_code (j); + break; + default: + /* unexpected response code */ + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected response code %u\n", + (unsigned int) response_code); + GNUNET_break_op (0); + ec = TALER_JSON_get_error_code (j); + response_code = 0; + break; + } + ch->hcb (ch->hcb_cls, + response_code, + ec, + NULL); + TALER_BANK_configuration_cancel (ch); +} + + +/** + * Request the configuration of the bank. + * + * @param ctx curl context for the event loop + * @param auth authentication data to use + * @param hres_cb the callback to call with the + * configuration + * @param hres_cb_cls closure for the above callback + * @return NULL if the inputs are invalid + */ +struct TALER_BANK_ConfigHandle * +TALER_BANK_configuration (struct GNUNET_CURL_Context *ctx, + const struct TALER_BANK_AuthenticationData *auth, + TALER_BANK_ConfigCallback hres_cb, + void *hres_cb_cls) +{ + struct TALER_BANK_ConfigHandle *ch; + CURL *eh; + + ch = GNUNET_new (struct TALER_BANK_ConfigHandle); + ch->hcb = hres_cb; + ch->hcb_cls = hres_cb_cls; + ch->request_url = TALER_url_join (auth->wire_gateway_url, + "config", + NULL); + if (NULL == ch->request_url) + { + GNUNET_free (ch); + GNUNET_break (0); + return NULL; + } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Requesting configuration at `%s'\n", + ch->request_url); + eh = curl_easy_init (); + if ( (GNUNET_OK != + TALER_BANK_setup_auth_ (eh, + auth)) || + (CURLE_OK != + curl_easy_setopt (eh, + CURLOPT_URL, + ch->request_url)) ) + { + GNUNET_break (0); + TALER_BANK_configuration_cancel (ch); + curl_easy_cleanup (eh); + return NULL; + } + ch->job = GNUNET_CURL_job_add2 (ctx, + eh, + NULL, + &handle_configuration_finished, + ch); + return ch; +} + + +/** + * Cancel a configuration request. This function cannot be + * used on a request handle if a response is already + * served for it. + * + * @param ch the configuration request handle + */ +void +TALER_BANK_configuration_cancel (struct TALER_BANK_ConfigHandle *ch) +{ + if (NULL != ch->job) + { + GNUNET_CURL_job_cancel (ch->job); + ch->job = NULL; + } + GNUNET_free (ch->request_url); + GNUNET_free (ch); +} + + +/* end of bank_api_config.c */ diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index abf486876..56af11f8a 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -26,6 +26,24 @@ #include "taler_bank_service.h" #include "taler_mhd_lib.h" +/** + * Taler protocol version in the format CURRENT:REVISION:AGE + * as used by GNU libtool. See + * https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html + * + * Please be very careful when updating and follow + * https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info + * precisely. Note that this version has NOTHING to do with the + * release version, and the format is NOT the same that semantic + * versioning uses either. + * + * When changing this version, you likely want to also update + * #BANK_PROTOCOL_CURRENT and #BANK_PROTOCOL_AGE in + * bank_api_config.c! + */ +#define BANK_PROTOCOL_VERSION "0:0:0" + + /** * Maximum POST request size (for /admin/add-incoming) */ @@ -172,6 +190,11 @@ struct TALER_FAKEBANK_Handle */ uint64_t serial_counter; + /** + * Currency used by the fakebank. + */ + char *currency; + /** * BaseURL of the fakebank. */ @@ -527,6 +550,7 @@ TALER_FAKEBANK_stop (struct TALER_FAKEBANK_Handle *h) h->mhd_bank = NULL; } GNUNET_free (h->my_baseurl); + GNUNET_free (h->currency); GNUNET_free (h); } @@ -776,7 +800,7 @@ handle_transfer (struct TALER_FAKEBANK_Handle *h, /** - * Handle incoming HTTP request for /history + * Handle incoming HTTP request for / (home page). * * @param h the fakebank handle * @param connection the connection @@ -808,6 +832,29 @@ handle_home_page (struct TALER_FAKEBANK_Handle *h, } +/** + * Handle incoming HTTP request for /config + * + * @param h the fakebank handle + * @param connection the connection + * @param con_cls place to store state, not used + * @return MHD result code + */ +static int +handle_config (struct TALER_FAKEBANK_Handle *h, + struct MHD_Connection *connection, + void **con_cls) +{ + return TALER_MHD_reply_json_pack (connection, + MHD_HTTP_OK, + "{s:s, s:s}", + "currency", + h->currency, + "version" + BANK_PROTOCOL_VERSION); +} + + /** * This is the "base" structure for both the /history and the * /history-range API calls. @@ -1202,6 +1249,13 @@ serve (struct TALER_FAKEBANK_Handle *h, return handle_home_page (h, connection, con_cls); + if ( (0 == strcmp (url, + "/config")) && + (0 == strcasecmp (method, + MHD_HTTP_METHOD_GET)) ) + return handle_config (h, + connection, + con_cls); if ( (0 == strcmp (url, "/admin/add-incoming")) && (0 == strcasecmp (method, @@ -1433,15 +1487,19 @@ run_mhd (void *cls) * would have issued the correct wire transfer orders. * * @param port port to listen to + * @param currency currency the bank uses * @return NULL on error */ struct TALER_FAKEBANK_Handle * -TALER_FAKEBANK_start (uint16_t port) +TALER_FAKEBANK_start (uint16_t port, + const char *currency) { struct TALER_FAKEBANK_Handle *h; + GNUNET_assert (strlen (currency) < TALER_CURRENCY_LEN); h = GNUNET_new (struct TALER_FAKEBANK_Handle); h->port = port; + h->currency = GNUNET_strdup (currency); GNUNET_asprintf (&h->my_baseurl, "http://localhost:%u/", (unsigned int) port); @@ -1462,6 +1520,7 @@ TALER_FAKEBANK_start (uint16_t port) MHD_OPTION_END); if (NULL == h->mhd_bank) { + GNUNET_free (h->currency); GNUNET_free (h); return NULL; } diff --git a/src/bank-lib/taler-fakebank-run.c b/src/bank-lib/taler-fakebank-run.c index 55b3da54f..588777c94 100644 --- a/src/bank-lib/taler-fakebank-run.c +++ b/src/bank-lib/taler-fakebank-run.c @@ -43,12 +43,38 @@ run (void *cls, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { + char *currency_string; + (void) cls; (void) args; (void) cfgfile; (void) cfg; - if (NULL == TALER_FAKEBANK_start (8082)) + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cfg, + "taler", + "CURRENCY", + ¤cy_string)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "taler", + "CURRENCY"); ret = 1; + return; + } + if (strlen (currency_string) >= TALER_CURRENCY_LEN) + { + GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, + "taler", + "CURRENCY", + "Value is too long"); + GNUNET_free (currency_string); + ret = 1; + return; + } + if (NULL == TALER_FAKEBANK_start (8082, + currency_string)) + ret = 1; + GNUNET_free (currency_string); ret = 0; } diff --git a/src/benchmark/taler-exchange-benchmark.c b/src/benchmark/taler-exchange-benchmark.c index bd4d3eafe..91ed5b047 100644 --- a/src/benchmark/taler-exchange-benchmark.c +++ b/src/benchmark/taler-exchange-benchmark.c @@ -156,9 +156,9 @@ static char *mode_str; static enum BenchmarkMode mode; /** - * Config filename. + * Configuration. */ -static char *cfg_filename; +static struct GNUNET_CONFIGURATION_Handle *cfg; /** * Currency used. @@ -445,7 +445,8 @@ launch_fakebank (void *cls) (void) cls; fakebank - = TALER_TESTING_run_fakebank (exchange_bank_account.wire_gateway_url); + = TALER_TESTING_run_fakebank (exchange_bank_account.wire_gateway_url, + currency); if (NULL == fakebank) { GNUNET_break (0); @@ -624,12 +625,11 @@ parallel_benchmark (TALER_TESTING_Main main_cb, NULL == loglev ? "INFO" : loglev, logfile); - result = TALER_TESTING_setup - (main_cb, - main_cb_cls, - cfg_filename, - exchanged, - GNUNET_YES); + result = TALER_TESTING_setup (main_cb, + main_cb_cls, + cfg, + exchanged, + GNUNET_YES); if (GNUNET_OK != result) GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failure in child process test suite!\n"); @@ -746,7 +746,7 @@ int main (int argc, char *const *argv) { - struct GNUNET_CONFIGURATION_Handle *cfg; + char *cfg_filename = NULL; struct GNUNET_GETOPT_CommandLineOption options[] = { GNUNET_GETOPT_option_mandatory (GNUNET_GETOPT_option_cfgfile (&cfg_filename)), @@ -798,6 +798,7 @@ main (int argc, argc, argv))) { + GNUNET_free_non_null (cfg_filename); return BAD_CLI_ARG; } GNUNET_log_setup ("taler-exchange-benchmark", @@ -814,6 +815,7 @@ main (int argc, else { TALER_LOG_ERROR ("Unknown mode given: '%s'\n", mode_str); + GNUNET_free_non_null (cfg_filename); return BAD_CONFIG_FILE; } if (NULL == cfg_filename) @@ -825,8 +827,10 @@ main (int argc, cfg_filename)) { TALER_LOG_ERROR ("Could not parse configuration\n"); + GNUNET_free (cfg_filename); return BAD_CONFIG_FILE; } + GNUNET_free (cfg_filename); if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, "taler", @@ -839,6 +843,16 @@ main (int argc, GNUNET_CONFIGURATION_destroy (cfg); return BAD_CONFIG_FILE; } + + if (strlen (currency) >= TALER_CURRENCY_LEN) + { + GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, + "taler", + "CURRENCY", + "Value is too long"); + GNUNET_CONFIGURATION_destroy (cfg); + return BAD_CONFIG_FILE; + } if (howmany_clients > 10240) { TALER_LOG_ERROR ("-p option value given is too large\n"); @@ -950,11 +964,11 @@ main (int argc, return BAD_CONFIG_FILE; } } - GNUNET_CONFIGURATION_destroy (cfg); result = parallel_benchmark (&run, NULL, cfg_filename); + GNUNET_CONFIGURATION_destroy (cfg); /* If we're the exchange worker, we're done now. No need to print results */ if (MODE_EXCHANGE == mode) diff --git a/src/include/taler_bank_service.h b/src/include/taler_bank_service.h index 98a1017c2..c9c93fac5 100644 --- a/src/include/taler_bank_service.h +++ b/src/include/taler_bank_service.h @@ -89,6 +89,73 @@ struct TALER_BANK_AuthenticationData }; +/* ********************* /config *********************** */ + +/** + * @brief A /config Handle + */ +struct TALER_BANK_ConfigHandle; + +/** + * Configuration data provided by the bank. + */ +struct TALER_BANK_Configuration +{ + /** + * Current protocol version. Libtool style. + */ + const char *version; + + /** + * Currency used by the bank. + */ + const char *currency; +}; + + +/** + * Function called with configuration details from the bank. + * + * @param cls closure + * @param http status code + * @param ec taler error code + * @param config the configuration, NULL on error + */ +typedef void +(*TALER_BANK_ConfigCallback)(void *cls, + unsigned int http_status, + enum TALER_ErrorCode ec, + const struct TALER_BANK_Configuration *config); + +/** + * Request the configuration of the bank. + * + * @param ctx curl context for the event loop + * @param auth authentication data to use + * @param hres_cb the callback to call with the + * configuration + * @param hres_cb_cls closure for the above callback + * @return NULL if the inputs are invalid (i.e. zero value for + * @e num_results). In this case, the callback is not + * called. + */ +struct TALER_BANK_ConfigHandle * +TALER_BANK_configuration (struct GNUNET_CURL_Context *ctx, + const struct TALER_BANK_AuthenticationData *auth, + TALER_BANK_ConfigCallback hres_cb, + void *hres_cb_cls); + + +/** + * Cancel a configuration request. This function cannot be + * used on a request handle if a response is already + * served for it. + * + * @param ch the configuration request handle + */ +void +TALER_BANK_configuration_cancel (struct TALER_BANK_ConfigHandle *ch); + /* ********************* /admin/add/incoming *********************** */ @@ -160,7 +227,7 @@ TALER_BANK_admin_add_incoming_cancel (struct TALER_BANK_AdminAddIncomingHandle *aai); -/* ********************* /taler/transfer *********************** */ +/* ********************* /transfer *********************** */ /** * Prepare for exeuction of a wire transfer. @@ -243,7 +310,7 @@ TALER_BANK_execute_wire_transfer_cancel (struct TALER_BANK_WireExecuteHandle *weh); -/* ********************* /taler/credits *********************** */ +/* ********************* /history/incoming *********************** */ /** * Handle for querying the bank for transactions @@ -347,7 +414,7 @@ void TALER_BANK_credit_history_cancel (struct TALER_BANK_CreditHistoryHandle *hh); -/* ********************* /taler/debits *********************** */ +/* ********************* /history/outgoing *********************** */ /** * Handle for querying the bank for transactions diff --git a/src/include/taler_fakebank_lib.h b/src/include/taler_fakebank_lib.h index 9324bdce1..8601a8d8d 100644 --- a/src/include/taler_fakebank_lib.h +++ b/src/include/taler_fakebank_lib.h @@ -44,10 +44,12 @@ struct TALER_FAKEBANK_Handle; * would have issued the correct wire transfer orders. * * @param port port to listen to + * @param currency which currency should the bank offer * @return NULL on error */ struct TALER_FAKEBANK_Handle * -TALER_FAKEBANK_start (uint16_t port); +TALER_FAKEBANK_start (uint16_t port, + const char *currency); /** diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h index 0b3d19999..5aa50155c 100644 --- a/src/include/taler_testing_lib.h +++ b/src/include/taler_testing_lib.h @@ -635,7 +635,7 @@ typedef void * @param main_cb the "run" method which coontains all the * commands. * @param main_cb_cls a closure for "run", typically NULL. - * @param config_filename configuration filename. + * @param cfg configuration to use * @param exchanged exchange process handle: will be put in the * state as some commands - e.g. revoke - need to send * signal to it, for example to let it know to reload the @@ -650,7 +650,7 @@ typedef void int TALER_TESTING_setup (TALER_TESTING_Main main_cb, void *main_cb_cls, - const char *config_filename, + const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_OS_Process *exchanged, int exchange_connect); @@ -789,11 +789,13 @@ TALER_TESTING_run_bank (const char *config_filename, * from the base URL. * * @param bank_url bank's base URL. + * @param currency currency the bank uses * @return the fakebank process handle, or NULL if any * error occurs. */ struct TALER_FAKEBANK_Handle * -TALER_TESTING_run_fakebank (const char *bank_url); +TALER_TESTING_run_fakebank (const char *bank_url, + const char *currency); /** diff --git a/src/testing/test_bank_api.c b/src/testing/test_bank_api.c index bdafdc5fd..75e22b59e 100644 --- a/src/testing/test_bank_api.c +++ b/src/testing/test_bank_api.c @@ -52,6 +52,7 @@ static struct GNUNET_OS_Process *bankd; */ static int with_fakebank; + /** * Main function that will tell the interpreter what commands to * run. @@ -116,12 +117,32 @@ run (void *cls, } +/** + * Runs #TALER_TESTING_setup() using the configuration. + * + * @param cls unused + * @param cfg configuration to use + * @return status code + */ +static int +setup_with_cfg (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + (void) cls; + return TALER_TESTING_setup (&run, + NULL, + cfg, + NULL, + GNUNET_NO); +} + + int main (int argc, char *const *argv) { - int rv; const char *cfgfilename; + int rv; /* These environment variables get in the way... */ unsetenv ("XDG_DATA_HOME"); @@ -165,12 +186,13 @@ main (int argc, return 77; } } - - rv = (GNUNET_OK == TALER_TESTING_setup (&run, - NULL, - cfgfilename, - NULL, - GNUNET_NO)) ? 0 : 1; + if (GNUNET_OK != + GNUNET_CONFIGURATION_parse_and_run (cfgfilename, + &setup_with_cfg, + NULL)) + rv = 1; + else + rv = 0; if (GNUNET_NO == with_fakebank) { diff --git a/src/testing/test_taler_exchange_aggregator.c b/src/testing/test_taler_exchange_aggregator.c index c709e5fe9..2e8a35ce2 100644 --- a/src/testing/test_taler_exchange_aggregator.c +++ b/src/testing/test_taler_exchange_aggregator.c @@ -57,36 +57,6 @@ static char *config_filename; #define USER42_ACCOUNT "42" -/** - * @return GNUNET_NO if database could not be prepared, - * otherwise GNUNET_OK - */ -static int -prepare_database (void *cls, - const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - dbc.plugin = TALER_EXCHANGEDB_plugin_load (cfg); - if (NULL == dbc.plugin) - { - GNUNET_break (0); - result = 77; - return GNUNET_NO; - } - if (GNUNET_OK != - dbc.plugin->create_tables (dbc.plugin->cls)) - { - GNUNET_break (0); - TALER_EXCHANGEDB_plugin_unload (dbc.plugin); - dbc.plugin = NULL; - result = 77; - return GNUNET_NO; - } - dbc.session = dbc.plugin->get_session (dbc.plugin->cls); - GNUNET_assert (NULL != dbc.session); - - return GNUNET_OK; -} - /** * Collects all the tests. @@ -454,6 +424,48 @@ run (void *cls, } +/** + * Prepare database an launch the test. + * + * @param cls unused + * @param cfg our configuration + * @return #GNUNET_NO if database could not be prepared, + * otherwise #GNUNET_OK + */ +static int +prepare_database (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + dbc.plugin = TALER_EXCHANGEDB_plugin_load (cfg); + if (NULL == dbc.plugin) + { + GNUNET_break (0); + result = 77; + return GNUNET_NO; + } + if (GNUNET_OK != + dbc.plugin->create_tables (dbc.plugin->cls)) + { + GNUNET_break (0); + TALER_EXCHANGEDB_plugin_unload (dbc.plugin); + dbc.plugin = NULL; + result = 77; + return GNUNET_NO; + } + dbc.session = dbc.plugin->get_session (dbc.plugin->cls); + GNUNET_assert (NULL != dbc.session); + + result = TALER_TESTING_setup (&run, + NULL, + cfg, + NULL, // no exchange process handle. + GNUNET_NO); // do not try to connect to the exchange + + + return GNUNET_OK; +} + + int main (int argc, char *const argv[]) @@ -507,12 +519,6 @@ main (int argc, return result; } - result = TALER_TESTING_setup (&run, - NULL, - config_filename, - NULL, // no exchange process handle. - GNUNET_NO); // do not try to connect to the exchange - GNUNET_free (config_filename); GNUNET_free (testname); dbc.plugin->drop_tables (dbc.plugin->cls); diff --git a/src/testing/testing_api_helpers_bank.c b/src/testing/testing_api_helpers_bank.c index 7b8b203a3..35ef4792f 100644 --- a/src/testing/testing_api_helpers_bank.c +++ b/src/testing/testing_api_helpers_bank.c @@ -36,11 +36,13 @@ * from the base URL. * * @param bank_url bank's base URL. + * @param currency currency the bank uses * @return the fakebank process handle, or NULL if any * error occurs. */ struct TALER_FAKEBANK_Handle * -TALER_TESTING_run_fakebank (const char *bank_url) +TALER_TESTING_run_fakebank (const char *bank_url, + const char *currency) { const char *port; long pnum; @@ -56,7 +58,8 @@ TALER_TESTING_run_fakebank (const char *bank_url) "Starting Fakebank on port %u (%s)\n", (unsigned int) pnum, bank_url); - fakebankd = TALER_FAKEBANK_start ((uint16_t) pnum); + fakebankd = TALER_FAKEBANK_start ((uint16_t) pnum, + currency); if (NULL == fakebankd) { GNUNET_break (0); diff --git a/src/testing/testing_api_helpers_exchange.c b/src/testing/testing_api_helpers_exchange.c index 29c96db19..911bc6f0e 100644 --- a/src/testing/testing_api_helpers_exchange.c +++ b/src/testing/testing_api_helpers_exchange.c @@ -788,7 +788,7 @@ TALER_TESTING_setup_with_exchange_cfg (void *cls, /* NOTE: this call blocks. */ result = TALER_TESTING_setup (setup_ctx->main_cb, setup_ctx->main_cb_cls, - setup_ctx->config_filename, + cfg, exchanged, GNUNET_YES); GNUNET_break (0 == diff --git a/src/testing/testing_api_loop.c b/src/testing/testing_api_loop.c index 61b95c2e1..e9ccdb81c 100644 --- a/src/testing/testing_api_loop.c +++ b/src/testing/testing_api_loop.c @@ -124,7 +124,33 @@ TALER_TESTING_run_with_fakebank (struct TALER_TESTING_Interpreter *is, struct TALER_TESTING_Command *commands, const char *bank_url) { - is->fakebank = TALER_TESTING_run_fakebank (bank_url); + char *currency; + + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (is->cfg, + "taler", + "CURRENCY", + ¤cy)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "taler", + "CURRENCY"); + is->result = GNUNET_SYSERR; + return; + } + if (strlen (currency) >= TALER_CURRENCY_LEN) + { + GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, + "taler", + "CURRENCY", + "Value is too long"); + GNUNET_free (currency); + is->result = GNUNET_SYSERR; + return; + } + is->fakebank = TALER_TESTING_run_fakebank (bank_url, + currency); + GNUNET_free (currency); if (NULL == is->fakebank) { GNUNET_break (0); @@ -529,14 +555,6 @@ struct MainContext */ struct TALER_TESTING_Interpreter *is; - /** - * Configuration filename. The wrapper uses it to fetch - * the exchange port number; We could have passed the port - * number here, but having the config filename seems more - * generic. - */ - const char *config_filename; - /** * URL of the exchange. */ @@ -683,18 +701,16 @@ do_abort (void *cls) * and responsible to run the "run" method. * * @param cls a `struct MainContext *` - * @param cfg configuration to use */ -static int -main_exchange_connect_with_cfg (void *cls, - const struct GNUNET_CONFIGURATION_Handle *cfg) +static void +main_wrapper_exchange_connect (void *cls) { struct MainContext *main_ctx = cls; struct TALER_TESTING_Interpreter *is = main_ctx->is; char *exchange_url; if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_string (cfg, + GNUNET_CONFIGURATION_get_value_string (is->cfg, "exchange", "BASE_URL", &exchange_url)) @@ -702,40 +718,18 @@ main_exchange_connect_with_cfg (void *cls, GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "exchange", "BASE_URL"); - return GNUNET_SYSERR; + return; } main_ctx->exchange_url = exchange_url; - is->cfg = cfg; is->timeout_task = GNUNET_SCHEDULER_add_shutdown (&do_abort, main_ctx); GNUNET_break - (NULL != (is->exchange = TALER_EXCHANGE_connect - (is->ctx, - exchange_url, - &TALER_TESTING_cert_cb, - main_ctx, - TALER_EXCHANGE_OPTION_END))); - is->cfg = NULL; - return GNUNET_OK; -} - - -/** - * Initialize scheduler loop and curl context for the testcase, - * and responsible to run the "run" method. - * - * @param cls a `struct MainContext *` - */ -static void -main_wrapper_exchange_connect (void *cls) -{ - struct MainContext *main_ctx = cls; - - GNUNET_break (GNUNET_OK == - GNUNET_CONFIGURATION_parse_and_run (main_ctx->config_filename, - & - main_exchange_connect_with_cfg, - main_ctx)); + (NULL != (is->exchange = + TALER_EXCHANGE_connect (is->ctx, + exchange_url, + &TALER_TESTING_cert_cb, + main_ctx, + TALER_EXCHANGE_OPTION_END))); } @@ -746,7 +740,7 @@ main_wrapper_exchange_connect (void *cls) * @param main_cb the "run" method which contains all the * commands. * @param main_cb_cls a closure for "run", typically NULL. - * @param config_filename configuration filename. + * @param cfg configuration to use * @param exchanged exchange process handle: will be put in the * state as some commands - e.g. revoke - need to send * signal to it, for example to let it know to reload the @@ -761,7 +755,7 @@ main_wrapper_exchange_connect (void *cls) int TALER_TESTING_setup (TALER_TESTING_Main main_cb, void *main_cb_cls, - const char *config_filename, + const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_OS_Process *exchanged, int exchange_connect) { @@ -771,9 +765,6 @@ TALER_TESTING_setup (TALER_TESTING_Main main_cb, .main_cb_cls = main_cb_cls, /* needed to init the curl ctx */ .is = &is, - /* needed to read values like exchange port - * number to construct the exchange url.*/ - .config_filename = config_filename }; struct GNUNET_SIGNAL_Context *shc_chld; @@ -781,6 +772,7 @@ TALER_TESTING_setup (TALER_TESTING_Main main_cb, 0, sizeof (is)); is.exchanged = exchanged; + is.cfg = cfg; sigpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, GNUNET_NO, GNUNET_NO); GNUNET_assert (NULL != sigpipe); From 2590db50d59602980a09d48280f69e1662eb3168 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Feb 2020 22:19:01 +0100 Subject: [PATCH 09/21] add shell script to revoke DK as requested by Florian for revocation testing via taler-wallet-cli --- contrib/taler-exchange-revoke | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 contrib/taler-exchange-revoke diff --git a/contrib/taler-exchange-revoke b/contrib/taler-exchange-revoke new file mode 100755 index 000000000..8ce0e8786 --- /dev/null +++ b/contrib/taler-exchange-revoke @@ -0,0 +1,24 @@ +#!/bin/sh +# This file is in the public domain +# +# Used to first revoke a key and then restart the exchange +# to ensure it notices the revocation. +# +# Takes 2 arguments: +# $1: the configuration file name +# $2: the denomination key hash (DKH) of the denomination to revoke + +set -eu + +if [ "$#" -ne 2 ]; +then + echo "illegal number of parameters" + exit 1 +fi + +taler-exchange-keyup -c $1 -r $2 + +EXCHANGE_PID=`ps x | grep taler-exchange-httpd | awk '{print $1}'` +kill -HUP $EXCHANGE_PID + +exit 0 From b33260432540561e3bb6f78e5a37ec7e1dae9fd4 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Feb 2020 22:37:49 +0100 Subject: [PATCH 10/21] extra checks, add to build system --- contrib/Makefile.am | 3 ++- contrib/taler-bank-manage-testing | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/contrib/Makefile.am b/contrib/Makefile.am index f9de7a75e..c38a1630f 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,7 +1,8 @@ SUBDIRS = . tos pp bin_SCRIPTS = \ - taler-bank-manage-testing + taler-bank-manage-testing \ + taler-exchange-revoke EXTRA_DIST = \ $(bin_SCRIPTS) \ diff --git a/contrib/taler-bank-manage-testing b/contrib/taler-bank-manage-testing index b7e356d44..29494e3ad 100755 --- a/contrib/taler-bank-manage-testing +++ b/contrib/taler-bank-manage-testing @@ -10,6 +10,12 @@ set -eu +if [ "$#" -ne 3 ]; +then + echo "illegal number of parameters" + exit 1 +fi + # Ensure starting accounts exist taler-bank-manage -c $1 --with-db $2 django provide_accounts taler-bank-manage -c $1 --with-db $2 django add_bank_account 42 From 9e0a813b38b791a0bc020b8f1ee16d2b5d8712c6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 5 Feb 2020 21:11:57 +0100 Subject: [PATCH 11/21] implement auditor's exchange signing key caching (#6052) --- src/auditor/taler-auditor-httpd.c | 7 +- ...taler-auditor-httpd_deposit-confirmation.c | 131 +++++++++++++----- ...taler-auditor-httpd_deposit-confirmation.h | 12 ++ 3 files changed, 113 insertions(+), 37 deletions(-) diff --git a/src/auditor/taler-auditor-httpd.c b/src/auditor/taler-auditor-httpd.c index 4d5537e51..043d5b148 100644 --- a/src/auditor/taler-auditor-httpd.c +++ b/src/auditor/taler-auditor-httpd.c @@ -594,7 +594,7 @@ main (int argc, if (GNUNET_OK != auditor_serve_process_config ()) return 1; - + TEAH_DEPOSIT_CONFIRMATION_init (); /* check for systemd-style FD passing */ listen_pid = getenv ("LISTEN_PID"); listen_fds = getenv ("LISTEN_FDS"); @@ -635,7 +635,10 @@ main (int argc, fh = TALER_MHD_open_unix_path (serve_unixpath, unixpath_mode); if (-1 == fh) + { + TEAH_DEPOSIT_CONFIRMATION_done (); return 1; + } } mhd @@ -659,6 +662,7 @@ main (int argc, { fprintf (stderr, "Failed to start HTTP server.\n"); + TEAH_DEPOSIT_CONFIRMATION_done (); return 1; } @@ -732,6 +736,7 @@ main (int argc, break; } TALER_AUDITORDB_plugin_unload (TAH_plugin); + TEAH_DEPOSIT_CONFIRMATION_done (); return (GNUNET_SYSERR == ret) ? 1 : 0; } diff --git a/src/auditor/taler-auditor-httpd_deposit-confirmation.c b/src/auditor/taler-auditor-httpd_deposit-confirmation.c index 7759b5538..87b1a26f7 100644 --- a/src/auditor/taler-auditor-httpd_deposit-confirmation.c +++ b/src/auditor/taler-auditor-httpd_deposit-confirmation.c @@ -32,6 +32,19 @@ #include "taler-auditor-httpd_deposit-confirmation.h" +/** + * Cache of already verified exchange signing keys. Maps the hash of the + * `struct TALER_ExchangeSigningKeyValidityPS` to the (static) string + * "verified". Access to this map is guarded by the #lock. + */ +static struct GNUNET_CONTAINER_MultiHashMap *cache; + +/** + * Lock for operations on #cache. + */ +static pthread_mutex_t lock; + + /** * We have parsed the JSON information about the deposit, do some * basic sanity checks (especially that the signature on the coin is @@ -55,6 +68,8 @@ verify_and_execute_deposit_confirmation (struct MHD_Connection *connection, struct TALER_AUDITORDB_Session *session; enum GNUNET_DB_QueryStatus qs; struct GNUNET_TIME_Absolute now; + struct GNUNET_HashCode h; + int cached; now = GNUNET_TIME_absolute_get (); if ( (es->ep_start.abs_value_us > now.abs_value_us) || @@ -68,10 +83,6 @@ verify_and_execute_deposit_confirmation (struct MHD_Connection *connection, "master_sig (expired)"); } - /* TODO (#6052): consider having an in-memory cache of already - verified exchange signing keys, this could save us - a signature check AND a database transaction per - operation. */ /* check exchange signing key signature */ skv.purpose.purpose = htonl (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY); skv.purpose.size = htonl (sizeof (struct TALER_ExchangeSigningKeyValidityPS)); @@ -80,40 +91,64 @@ verify_and_execute_deposit_confirmation (struct MHD_Connection *connection, skv.expire = GNUNET_TIME_absolute_hton (es->ep_expire); skv.end = GNUNET_TIME_absolute_hton (es->ep_end); skv.signkey_pub = es->exchange_pub; - if (GNUNET_OK != - GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY, - &skv.purpose, - &es->master_sig.eddsa_signature, - &es->master_public_key.eddsa_pub)) - { - TALER_LOG_WARNING ("Invalid signature on exchange signing key\n"); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_FORBIDDEN, - TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID, - "master_sig"); - } - session = TAH_plugin->get_session (TAH_plugin->cls); - if (NULL == session) + /* check our cache */ + GNUNET_CRYPTO_hash (&skv, + sizeof (skv), + &h); + GNUNET_assert (0 == pthread_mutex_lock (&lock)); + cached = GNUNET_CONTAINER_multihashmap_contains (cache, + &h); + GNUNET_assert (0 == pthread_mutex_unlock (&lock)); + + if (! cached) { - GNUNET_break (0); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_DB_SETUP_FAILED, - "failed to establish session with database"); - } - /* execute transaction */ - qs = TAH_plugin->insert_exchange_signkey (TAH_plugin->cls, - session, - es); - if (0 > qs) - { - GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); - TALER_LOG_WARNING ("Failed to store exchange signing key in database\n"); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_AUDITOR_EXCHANGE_STORE_DB_ERROR, - "failed to persist exchange signing key"); + /* Not in cache, need to verify the signature, persist it, and possibly cache it */ + if (GNUNET_OK != + GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY, + &skv.purpose, + &es->master_sig.eddsa_signature, + &es->master_public_key.eddsa_pub)) + { + TALER_LOG_WARNING ("Invalid signature on exchange signing key\n"); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_FORBIDDEN, + TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID, + "master_sig"); + } + + session = TAH_plugin->get_session (TAH_plugin->cls); + if (NULL == session) + { + GNUNET_break (0); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_DB_SETUP_FAILED, + "failed to establish session with database"); + } + /* execute transaction */ + qs = TAH_plugin->insert_exchange_signkey (TAH_plugin->cls, + session, + es); + if (0 > qs) + { + GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); + TALER_LOG_WARNING ("Failed to store exchange signing key in database\n"); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_AUDITOR_EXCHANGE_STORE_DB_ERROR, + "failed to persist exchange signing key"); + } + + /* Cache it, due to concurreny it might already be in the cache, + so we do not cache it twice but also don't insist on the 'put' to + succeed. */ + GNUNET_assert (0 == pthread_mutex_lock (&lock)); + (void) GNUNET_CONTAINER_multihashmap_put (cache, + &h, + "verified", + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); + GNUNET_assert (0 == pthread_mutex_unlock (&lock)); } /* check deposit confirmation signature */ @@ -237,4 +272,28 @@ TAH_DEPOSIT_CONFIRMATION_handler (struct TAH_RequestHandler *rh, } +/** + * Initialize subsystem. + */ +void +TEAH_DEPOSIT_CONFIRMATION_init (void) +{ + cache = GNUNET_CONTAINER_multihashmap_create (32, + GNUNET_NO); + GNUNET_assert (0 == pthread_mutex_init (&lock, NULL)); +} + + +/** + * Shut down subsystem. + */ +void +TEAH_DEPOSIT_CONFIRMATION_done (void) +{ + GNUNET_CONTAINER_multihashmap_destroy (cache); + cache = NULL; + GNUNET_assert (0 == pthread_mutex_destroy (&lock)); +} + + /* end of taler-auditor-httpd_deposit-confirmation.c */ diff --git a/src/auditor/taler-auditor-httpd_deposit-confirmation.h b/src/auditor/taler-auditor-httpd_deposit-confirmation.h index 842eb3562..531f3c93c 100644 --- a/src/auditor/taler-auditor-httpd_deposit-confirmation.h +++ b/src/auditor/taler-auditor-httpd_deposit-confirmation.h @@ -25,6 +25,18 @@ #include #include "taler-auditor-httpd.h" +/** + * Initialize subsystem. + */ +void +TEAH_DEPOSIT_CONFIRMATION_init (void); + +/** + * Shut down subsystem. + */ +void +TEAH_DEPOSIT_CONFIRMATION_done (void); + /** * Handle a "/deposit-confirmation" request. Parses the JSON, and, if From eae85d62c10907a71b9087866669a46907411023 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 7 Feb 2020 00:44:35 +0100 Subject: [PATCH 12/21] proper i18n support for TOS --- .gitignore | 1 + configure.ac | 3 +- contrib/Makefile.am | 34 +- contrib/tos/.gitignore | 3 + contrib/tos/Makefile | 109 ++++ contrib/tos/Makefile.am | 11 - contrib/tos/README | 58 ++ contrib/tos/conf.py | 282 ++++++++++ contrib/tos/en/0.docx | Bin 22460 -> 0 bytes contrib/tos/en/0.epub | Bin 0 -> 16631 bytes contrib/tos/en/0.html | 683 +++++++++++------------ contrib/tos/en/0.pdf | Bin 0 -> 99867 bytes contrib/tos/en/0.txt | 560 +++++++++++-------- contrib/tos/en/0.xml | 344 ++++++++++++ contrib/tos/locale/de/LC_MESSAGES/tos.po | 514 +++++++++++++++++ contrib/tos/tos.rst | 324 +++++++++++ contrib/update-tos.sh | 28 + 17 files changed, 2348 insertions(+), 606 deletions(-) create mode 100644 contrib/tos/.gitignore create mode 100644 contrib/tos/Makefile delete mode 100644 contrib/tos/Makefile.am create mode 100644 contrib/tos/README create mode 100644 contrib/tos/conf.py delete mode 100644 contrib/tos/en/0.docx create mode 100644 contrib/tos/en/0.epub create mode 100644 contrib/tos/en/0.pdf create mode 100644 contrib/tos/en/0.xml create mode 100644 contrib/tos/locale/de/LC_MESSAGES/tos.po create mode 100644 contrib/tos/tos.rst create mode 100755 contrib/update-tos.sh diff --git a/.gitignore b/.gitignore index 1ac50e365..60f141749 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *app.info *.gcno *.gcda +*.mo .dirstamp doc/coverage/ doc/taler-exchange.cps diff --git a/configure.ac b/configure.ac index 8e6b6f260..8b58bef05 100644 --- a/configure.ac +++ b/configure.ac @@ -475,9 +475,8 @@ AM_CONDITIONAL([HAVE_TWISTER], [false]) AC_CONFIG_FILES([Makefile contrib/Makefile contrib/pp/Makefile - contrib/tos/Makefile doc/Makefile - doc/doxygen/Makefile + doc/doxygen/Makefile src/Makefile src/auditor/Makefile src/auditordb/Makefile diff --git a/contrib/Makefile.am b/contrib/Makefile.am index c38a1630f..5a165d1fb 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,4 +1,17 @@ -SUBDIRS = . tos pp +SUBDIRS = . pp + +# English (en) +tosendir=$(pkgdatadir)/tos/en + +# English (en) +ppendir=$(pkgdatadir)/pp/en + +tosen_DATA = \ + tos/en/0.txt \ + tos/en/0.pdf \ + tos/en/0.epub \ + tos/en/0.xml \ + tos/en/0.html bin_SCRIPTS = \ taler-bank-manage-testing \ @@ -6,8 +19,27 @@ bin_SCRIPTS = \ EXTRA_DIST = \ $(bin_SCRIPTS) \ + $(tosen_DATA) \ + update-tos.sh \ + tos/Makefile \ + tos/README \ + tos/tos.rst \ + tos/conf.py \ + tos/locale/de/LC_MESSAGES/tos.po \ auditor-report.tex.j2 \ coverage.sh \ gnunet.tag \ microhttpd.tag \ render.py + +# Change the set of supported languages here. You should +# also update tos'XX'data and EXTRA_DIST accordingly. +TOS_LANGUAGES="en de" + +# Change the terms-of-service version (Etag) to generate here! +# This value should be incremented whenever there is a substantive +# change in the original text (but not for the translations). +TOS_VERSION=0 + +update-tos: + VERSION=$(TOS_VERSION) ./update-tos.sh $(TOS_LANGUAGES) diff --git a/contrib/tos/.gitignore b/contrib/tos/.gitignore new file mode 100644 index 000000000..fb83616eb --- /dev/null +++ b/contrib/tos/.gitignore @@ -0,0 +1,3 @@ +sphinx.err +sphinx.log +_build/ diff --git a/contrib/tos/Makefile b/contrib/tos/Makefile new file mode 100644 index 000000000..ab29543cb --- /dev/null +++ b/contrib/tos/Makefile @@ -0,0 +1,109 @@ +# Makefile for Sphinx documentation +# +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html json epub latex latexpdf text man doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make a single large HTML file" + @echo " json to make JSON files" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " pdf to make LaTeX files and run them through pdflatex" + @echo " txt to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + + +# The html-linked builder does not support caching, so we +# remove all cached state first. +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/html." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +pdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/pdf + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/pdf all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/pdf." + +txt: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/txt + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/txt." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/info + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/info." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." diff --git a/contrib/tos/Makefile.am b/contrib/tos/Makefile.am deleted file mode 100644 index 1a86e4087..000000000 --- a/contrib/tos/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ - -# English (en) -tosendir=$(pkgdatadir)/tos/en - -tosen_DATA = \ - en/0.txt \ - en/0.docx \ - en/0.html - -EXTRA_DIST = \ - $(tosen_DATA) diff --git a/contrib/tos/README b/contrib/tos/README new file mode 100644 index 000000000..fde5305b6 --- /dev/null +++ b/contrib/tos/README @@ -0,0 +1,58 @@ +This directory contains the terms of service (template) for exchange +operators. + + +Dependencies +============ + +Generating new Terms of Service requires Sphinx, LaTeX with babel +packages for all supported languages. On Debian, you should +at least install: + +$ apt install python3-sphinx sphinx-intl texlive-lang-german texlive-lang-english + +(NOTE: List may be incomplete.) + + +Updating the Terms of Service +============================= + +The master file with the Terms of service is 'tos.rst'. + +If you make substantial changes, you MUST change the "TOS_VERSION" +in contrib/Makefile.am to the new Etag. + +To begin the translation into other languages after editing the master +file, run + +$ make gettext + +to generate the master PO file. Then, run + +$ sphinx-intl update -p _build/locale/ -l de -l fr -l it + +to update the PO files for the various languages (extend the list of +languages as necessary). The PO files for the translators are kept +at locale/$LANG/LC_MESSAGES/tos.po for the language $LANG. + +Once all PO files have been updated with new translations, run + +$ make update-tos + +in the "contrib/" directory to generate all of the formats. The +respective make rule calls the '../update-tos.sh' script in the +contrib/ directory, which calls the 'Makefile' in the tos/ +directory for the various supported languages and file formats +and then moves the generated files to the target directory +('contrib/tos/$LANG/$VERSION.$FORMAT') + + +Adding a new language +===================== + +To add a new language $LANG, add $LANG to "TOS_LANGUAGES" in +'contrib/Makefile.am' and run + +$ sphinx-intl update -p _build/gettext -l $LANG + +to generate the PO template. diff --git a/contrib/tos/conf.py b/contrib/tos/conf.py new file mode 100644 index 000000000..29392556f --- /dev/null +++ b/contrib/tos/conf.py @@ -0,0 +1,282 @@ +""" + This file is part of GNU TALER. + Copyright (C) 2014-2020 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU Lesser General Public License as published by the Free Software + Foundation; either version 2.1, 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License along with + TALER; see the file COPYING. If not, see + + @author Florian Dold + @author Benedikt Muller + @author Sree Harsha Totakura + @author Marcello Stanisci +""" +# -*- coding: utf-8 -*- +# +# neuro documentation build configuration file, created by +# sphinx-quickstart on Sat May 31 13:11:06 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +sys.path.append(os.path.abspath('_exts')) + +#import taler_sphinx_theme + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +needs_sphinx = '1.8.5' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.todo', + 'sphinx.ext.imgmath', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +source_suffix = { + '.rst': 'restructuredtext', +} + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'tos' + +# General information about the project. +project = u'tos' +copyright = u'2014-2020 Taler Systems SA (GPLv3+ or GFDL 1.3+)' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0' +# The full version, including alpha/beta/rc tags. +release = '0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = "en de" + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build', '_exts', 'cf', 'prebuilt'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# default_role = "ts:type" + +locale_dirs = ['locale/'] +gettext_compact = False + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'epub' + +#html_theme_path = taler_sphinx_theme.html_theme_path() + +#html_sidebars = {'**': ['logo-text.html', 'globaltoc.html', 'searchbox.html']} + +rst_epilog = "" + +html_show_sphinx = False + +html_theme_options = { + # Set the name of the project to appear in the sidebar + "relbar1": "false", + "footer": "false", +} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +html_title = "Taler Terms of Service" + +# A shorter title for the navigation bar. Default is the same as html_title. +html_short_title = "Terms of Service" + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + #'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('tos', 'tos.tex', + 'Terms of Service', 'GNU Taler team', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# latex_appendices = ["fdl-1.3"] + +# If false, no module index is generated. +#latex_domain_indices = True + +# -- Options for manual page output --------------------------------------- + +# If true, show URL addresses after external links. +#man_show_urls = False + +# -- Options for Texinfo output ------------------------------------------- + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for epub output ---------------------------- + +epub_basename = "tos" + +epub_title = "Terms of Service" diff --git a/contrib/tos/en/0.docx b/contrib/tos/en/0.docx deleted file mode 100644 index 31c7022d3d73db8129db72904a7fee2ffa80fb16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22460 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 V0?av@vz|us1cdx3{)5HgvYMv!yq+cQK;& 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 P-(Q$-Pru0f*V+FE`8eUj literal 0 HcmV?d00001 diff --git a/contrib/tos/en/0.html b/contrib/tos/en/0.html index ea81db07a..2c8000c35 100644 --- a/contrib/tos/en/0.html +++ b/contrib/tos/en/0.html @@ -1,364 +1,337 @@ - - - - - - - - - - -

Terms Of Service - Last Updated: 12.4.2019

-

- Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment service + + + + + + Terms Of Service — Taler Terms of Service + + + + + + + + + +

+
+
+
+ +
+

Terms Of Service

+

Last Updated: 12.4.2019

+

Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment service through our Internet presence (collectively the “Services”). Before using our Services, please read the Terms of Service (the “Terms” or the “Agreement”) -carefully. -

-

Overview

-

- This -section provides a brief summary of the highlights of this Agreement. -Please note that when you accept this Agreement, you are accepting -all of the terms and conditions and not just this section. We and -possibly other third parties provide Internet services which interact -with the Taler Wallet’s self-hosted personal payment application. -When using the Taler Wallet to interact with our Services, you are -agreeing to our Terms, so please read carefully. -

-

Highlights: -

    -
  • You - are responsible for keeping the data in your Taler Wallet at all - times under your control. Any losses arising from you not being in - control of your private information are your problem. -
  • We - will try to transfer funds we hold in escrow for our users to any - legal recipient to the best of our ability within the limitations of - the law and our implementation. However, the Services offered today - are highly experimental and the set of recipients of funds is - severely restricted. -
  • For - our Services, we may charge transaction fees. The specific fee - structure is provided based on the Taler protocol and should be - shown to you when you withdraw electronic coins using a Taler - Wallet. You agree and understand that the Taler protocol allows for - the fee structure to change. -
  • You - agree to not intentionally overwhelm our systems with requests and - follow responsible disclosure if you find security issues in our - services. -
  • We - cannot be held accountable for our Services not being available due - to circumstances beyond our control. If we modify or terminate our - services, we will try to give you the opportunity to recover your - funds. However, given the experimental state of the Services today, - this may not be possible. You are strongly advised to limit your use - of the Service to small-scale experiments expecting total loss of - all funds. -

-

These -terms outline approved uses of our Services. The Services and these -Terms are still at an experimental stage. If you have any questions -or comments related to this Agreement, please send us a message to -legal@taler-systems.com. If you do not agree to this Agreement, you -must not use our Services. -

-

How you accept this policy

-

By -sending funds to us (to top-up your Taler Wallet), you acknowledge -that you have read, understood, and agreed to these Terms. We reserve -the right to change these Terms at any time. If you disagree with the -change, we may in the future offer you with an easy option to recover -your unspent funds. However, in the current experimental period you -acknowledge that this feature is not yet available, resulting in your -funds being lost unless you accept the new Terms. If you continue to -use our Services other than to recover your unspent funds, your -continued use of our Services following any such change will signify -your acceptance to be bound by the then current Terms. Please check -the effective date above to determine if there have been any changes -since you have last reviewed these Terms.

-

Services

-

We -will try to transfer funds that we hold in escrow for our users to -any legal recipient to the best of our ability and within the -limitations of the law and our implementation. However, the Services -offered today are highly experimental and the set of recipients of -funds is severely restricted.

-

The -Taler Wallet can be loaded by exchanging fiat currencies against -electronic coins. We are providing this exchange service. Once your -Taler Wallet is loaded with electronic coins they can be spent for -purchases if the seller is accepting Taler as a means of payment. We -are not guaranteeing that any seller is accepting Taler at all or a -particular seller.

-

The -seller or recipient of deposits of electronic coins must specify the -target account, as per the design of the Taler protocol. They are -responsible for following the protocol and specifying the correct -bank account, and are solely liable for any losses that may arise -from specifying the wrong account. We will allow the government to -link wire transfers to the underlying contract hash. It is the -responsibility of recipients to preserve the full contracts and to -pay whatever taxes and charges may be applicable. Technical issues -may lead to situations where we are unable to make transfers at all -or lead to incorrect transfers that cannot be reversed. We will only -refuse to execute transfers if the transfers are prohibited by a -competent legal authority and we are ordered to do so.

-

-
-
- -

-

FEES

-

You -agree to pay the fees for exchanges and withdrawals completed via the -Taler Wallet ("Fees") as defined by us, which we may change -from time to time. With the exception of wire transfer fees, Taler -transaction fees are set for any electronic coin at the time of -withdrawal and fixed throughout the validity period of the respective -electronic coin. Your wallet should obtain and display applicable -fees when withdrawing funds. Fees for coins obtained as change may -differ from the fees applicable to the original coin. Wire transfer -fees that are independent from electronic coins may change annually. -

-

You -authorize us to charge or deduct applicable fees owed in connection -with deposits, exchanges and withdrawals following the rules of the -Taler protocol.

-

We -reserve the right to provide different types of rewards to users -either in the form of discount for our Services or in any other form -at our discretion and without prior notice to you.

-

ELIGIBILITY

-

To -be eligible to use our Services, you must be able to form legally -binding contracts or have the permission of your legal guardian. By -using our Services, you represent and warrant that you meet all -eligibility requirements that we outline in these Terms. -

-

FINANCIAL SELF-RESPONSIBILITY

-

You -will be responsible for maintaining the availability, integrity and -confidentiality of the data stored in your wallet. When you setup a -Taler Wallet, you are strongly advised to follow the precautionary -measures offered by the software to minimize the chances to losse -access to or control over your Wallet data. We will not be liable for -any loss or damage arising from your failure to comply with this -paragraph. -

-

COPYRIGHTS and TRADEMARKS

-

The -Taler Wallet is released under the terms of the GNU General Public -License (GNU GPL). You have the right to access, use, and share the -Taler Wallet, in modified or unmodified form. However, the GPL is a -strong copyleft license, which means that any derivative works must -be distributed under the same license terms as the original software. -If you have any questions, you should review the GNU GPL’s full -terms and conditions at https://www.gnu.org/licenses/gpl-3.0.en.html. -

-

"Taler" -itself is a trademark of Taler Systems SA. You are welcome to use the -name in relation to processing payments using the Taler protocol, -assuming your use is compatible with an official release from the GNU - Project that is not older than two years. -

-

YOUR USE OF OUR SERVICES

-

When -using our Services, you agree to not take any action that -intentionally imposes an unreasonable load on our infrastructure. If -you find security problems in our Services, you agree to first report -them to security@taler-systems.com -and grant us the right to publish your report. We warrant that we -will ourselves publicly disclose any issues reported within 3 months, -and that we will not prosecute anyone reporting security issues if -they did not exploit the issue beyond a proof-of-concept, and -followed the above responsible disclosure practice.

-

LIMITATION OF LIABILITY & DISCLAIMER OF WARRANTIES

-

You -understand and agree that we have no control over, and no duty to -take any action regarding: Failures, disruptions, errors, or delays -in processing that you may experience while using our Services; The -risk of failure of hardware, software, and Internet connections; The -risk of malicious software being introduced or found in the software -underlying the Taler Wallet; The risk that third parties may obtain -unauthorized access to information stored within your Taler Wallet, -including, but not limited to your Taler Wallet coins or backup -encryption keys. -

-

You -release us from all liability related to any losses, damages, or -claims arising from: -

    -
  1. user error such as forgotten passwords, incorrectly constructed +carefully.

    +
    +

    Overview

    +

    This section provides a brief summary of the highlights of this +Agreement. Please note that when you accept this Agreement, you are accepting +all of the terms and conditions and not just this section. We and possibly +other third parties provide Internet services which interact with the Taler +Wallet’s self-hosted personal payment application. When using the Taler Wallet +to interact with our Services, you are agreeing to our Terms, so please read +carefully.

    +
    +

    Highlights:

    +
    +
      +
    • You are responsible for keeping the data in your Taler Wallet at all times +under your control. Any losses arising from you not being in control of +your private information are your problem.
    • +
    • We will try to transfer funds we hold in escrow for our users to any legal +recipient to the best of our ability within the limitations of the law and +our implementation. However, the Services offered today are highly +experimental and the set of recipients of funds is severely restricted.
    • +
    • For our Services, we may charge transaction fees. The specific fee structure +is provided based on the Taler protocol and should be shown to you when you +withdraw electronic coins using a Taler Wallet. You agree and understand +that the Taler protocol allows for the fee structure to change.
    • +
    • You agree to not intentionally overwhelm our systems with requests and +follow responsible disclosure if you find security issues in our services.
    • +
    • We cannot be held accountable for our Services not being available due to +circumstances beyond our control. If we modify or terminate our services, +we will try to give you the opportunity to recover your funds. However, +given the experimental state of the Services today, this may not be +possible. You are strongly advised to limit your use of the Service +to small-scale experiments expecting total loss of all funds.
    • +
    +
    +

    These terms outline approved uses of our Services. The Services and these +Terms are still at an experimental stage. If you have any questions or +comments related to this Agreement, please send us a message to +legal@taler-systems.com. If you do not agree to this Agreement, you must not +use our Services.

    +
    +
    +
    +

    How you accept this policy

    +

    By sending funds to us (to top-up your Taler Wallet), you acknowledge that you +have read, understood, and agreed to these Terms. We reserve the right to +change these Terms at any time. If you disagree with the change, we may in the +future offer you with an easy option to recover your unspent funds. However, +in the current experimental period you acknowledge that this feature is not +yet available, resulting in your funds being lost unless you accept the new +Terms. If you continue to use our Services other than to recover your unspent +funds, your continued use of our Services following any such change will +signify your acceptance to be bound by the then current Terms. Please check +the effective date above to determine if there have been any changes since you +have last reviewed these Terms.

    +
    +
    +

    Services

    +

    We will try to transfer funds that we hold in escrow for our users to any +legal recipient to the best of our ability and within the limitations of the +law and our implementation. However, the Services offered today are highly +experimental and the set of recipients of funds is severely restricted. The +Taler Wallet can be loaded by exchanging fiat currencies against electronic +coins. We are providing this exchange service. Once your Taler Wallet is +loaded with electronic coins they can be spent for purchases if the seller is +accepting Taler as a means of payment. We are not guaranteeing that any seller +is accepting Taler at all or a particular seller. The seller or recipient of +deposits of electronic coins must specify the target account, as per the +design of the Taler protocol. They are responsible for following the protocol +and specifying the correct bank account, and are solely liable for any losses +that may arise from specifying the wrong account. We will allow the government +to link wire transfers to the underlying contract hash. It is the +responsibility of recipients to preserve the full contracts and to pay +whatever taxes and charges may be applicable. Technical issues may lead to +situations where we are unable to make transfers at all or lead to incorrect +transfers that cannot be reversed. We will only refuse to execute transfers if +the transfers are prohibited by a competent legal authority and we are ordered +to do so.

    +
    +
    +

    Fees

    +

    You agree to pay the fees for exchanges and withdrawals completed via the +Taler Wallet (“Fees”) as defined by us, which we may change from time to +time. With the exception of wire transfer fees, Taler transaction fees are set +for any electronic coin at the time of withdrawal and fixed throughout the +validity period of the respective electronic coin. Your wallet should obtain +and display applicable fees when withdrawing funds. Fees for coins obtained as +change may differ from the fees applicable to the original coin. Wire transfer +fees that are independent from electronic coins may change annually. You +authorize us to charge or deduct applicable fees owed in connection with +deposits, exchanges and withdrawals following the rules of the Taler protocol. +We reserve the right to provide different types of rewards to users either in +the form of discount for our Services or in any other form at our discretion +and without prior notice to you.

    +
    +
    +

    Eligibility

    +

    To be eligible to use our Services, you must be able to form legally binding +contracts or have the permission of your legal guardian. By using our +Services, you represent and warrant that you meet all eligibility requirements +that we outline in these Terms.

    +
    +
    +

    Financial self-responsibility

    +

    You will be responsible for maintaining the availability, integrity and +confidentiality of the data stored in your wallet. When you setup a Taler +Wallet, you are strongly advised to follow the precautionary measures offered +by the software to minimize the chances to losse access to or control over +your Wallet data. We will not be liable for any loss or damage arising from +your failure to comply with this paragraph.

    +
    +
    +

    Copyrights and trademarks

    +

    The Taler Wallet is released under the terms of the GNU General Public License +(GNU GPL). You have the right to access, use, and share the Taler Wallet, in +modified or unmodified form. However, the GPL is a strong copyleft license, +which means that any derivative works must be distributed under the same +license terms as the original software. If you have any questions, you should +review the GNU GPL’s full terms and conditions at +https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler” itself is a trademark +of Taler Systems SA. You are welcome to use the name in relation to processing +payments using the Taler protocol, assuming your use is compatible with an +official release from the GNU Project that is not older than two years.

    +
    +
    +

    Your use of our services

    +

    When using our Services, you agree to not take any action that intentionally +imposes an unreasonable load on our infrastructure. If you find security +problems in our Services, you agree to first report them to +security@taler-systems.com and grant us the right to publish your report. We +warrant that we will ourselves publicly disclose any issues reported within 3 +months, and that we will not prosecute anyone reporting security issues if +they did not exploit the issue beyond a proof-of-concept, and followed the +above responsible disclosure practice.

    +
    +
    +

    Limitation of liability & disclaimer of warranties

    +

    You understand and agree that we have no control over, and no duty to take any +action regarding: Failures, disruptions, errors, or delays in processing that +you may experience while using our Services; The risk of failure of hardware, +software, and Internet connections; The risk of malicious software being +introduced or found in the software underlying the Taler Wallet; The risk that +third parties may obtain unauthorized access to information stored within your +Taler Wallet, including, but not limited to your Taler Wallet coins or backup +encryption keys. You release us from all liability related to any losses, +damages, or claims arising from:

    +
      +
    1. user error such as forgotten passwords, incorrectly constructed transactions;
    2. -
    3. server failure or data loss;
    4. -
    5. unauthorized access to the Taler Wallet application;
    6. -
    7. bugs or other errors in the Taler Wallet software; and
    8. -
    9. any unauthorized third party activities, including, but not limited -to, the use of viruses, phishing, brute forcing, or other means of -attack against the Taler Wallet. We make no representations -concerning any Third Party Content contained in or accessed through - our Services.
    10. -
    -

    -Any -other terms, conditions, warranties, or representations associated -with such content, are solely between you and such organizations -and/or individuals. -

    -

    LIMITATION OF LIABILITY

    -

    -

    To -the fullest extent permitted by applicable law, in no event will we -or any of our officers, directors, representatives, agents, servants, -counsel, employees, consultants, lawyers, and other personnel -authorized to act, acting, or purporting to act on our behalf -(collectively the “Taler Parties”) be liable to you under -contract, tort, strict liability, negligence, or any other legal or - equitable theory, for: -

      -
    1. -any lost profits, data loss, cost of procurement of substitute goods -or services, or direct, indirect, incidental, special, punitive, -compensatory, or consequential damages of any kind whatsoever -resulting from: -
        -
      1. - your use of, or conduct in connection with, our services;
      2. -
      3. -any unauthorized use of your wallet and/or private key due to your +
      4. server failure or data loss;
      5. +
      6. unauthorized access to the Taler Wallet application;
      7. +
      8. bugs or other errors in the Taler Wallet software; and
      9. +
      10. any unauthorized third party activities, including, but not limited to, +the use of viruses, phishing, brute forcing, or other means of attack +against the Taler Wallet. We make no representations concerning any +Third Party Content contained in or accessed through our Services.
      11. +
      +

      Any other terms, conditions, warranties, or representations associated with +such content, are solely between you and such organizations and/or +individuals.

      +
    +
    +

    Limitation of liability

    +

    To the fullest extent permitted by applicable law, in no event will we or any +of our officers, directors, representatives, agents, servants, counsel, +employees, consultants, lawyers, and other personnel authorized to act, +acting, or purporting to act on our behalf (collectively the “Taler Parties”) +be liable to you under contract, tort, strict liability, negligence, or any +other legal or equitable theory, for:

    +
      +
    1. any lost profits, data loss, cost of procurement of substitute goods or +services, or direct, indirect, incidental, special, punitive, compensatory, +or consequential damages of any kind whatsoever resulting from:
    2. +
    +
    +
      +
    1. your use of, or conduct in connection with, our services;
    2. +
    3. any unauthorized use of your wallet and/or private key due to your failure to maintain the confidentiality of your wallet;
    4. -
    5. any interruption or cessation of transmission to or from the - services; or
    6. -
    7. any bugs, viruses, trojan horses, or the like that are found in the -Taler Wallet software or that may be transmitted to or through our -services by any third party (regardless of the source of - origination)
    8. +
    9. any interruption or cessation of transmission to or from the services; or
    10. +
    11. any bugs, viruses, trojan horses, or the like that are found in the Taler +Wallet software or that may be transmitted to or through our services by +any third party (regardless of the source of origination), or
    -
  2. or any direct damages.
  3. +
    +
      +
    1. any direct damages.
    -

    -

    These -limitations apply regardless of legal theory, whether based on tort, -strict liability, breach of contract, breach of warranty, or any -other legal theory, and whether or not we were advised of the -possibility of such damages. Some jurisdictions do not allow the -exclusion or limitation of liability for consequential or incidental -damages, so the above limitation may not apply to you. -

    -

    WARRANTY DISCLAIMER

    -

    Our -services are provided "as is" and without warranty of any -kind. To the maximum extent permitted by law, we disclaim all -representations and warranties, express or implied, relating to the -services and underlying software or any content on the services, -whether provided or owned by us or by any third party, including -without limitation, warranties of merchantability, fitness for a -particular purpose, title, non-infringement, freedom from computer -virus, and any implied warranties arising from course of dealing, +

    These limitations apply regardless of legal theory, whether based on tort, +strict liability, breach of contract, breach of warranty, or any other legal +theory, and whether or not we were advised of the possibility of such +damages. Some jurisdictions do not allow the exclusion or limitation of +liability for consequential or incidental damages, so the above limitation may +not apply to you.

    +
    +
    +

    Warranty disclaimer

    +

    Our services are provided “as is” and without warranty of any kind. To the +maximum extent permitted by law, we disclaim all representations and +warranties, express or implied, relating to the services and underlying +software or any content on the services, whether provided or owned by us or by +any third party, including without limitation, warranties of merchantability, +fitness for a particular purpose, title, non-infringement, freedom from +computer virus, and any implied warranties arising from course of dealing, course of performance, or usage in trade, all of which are expressly -disclaimed. In addition, we do not represent or warrant that the -content accessible via the services is accurate, complete, available, -current, free of viruses or other harmful components, or that the -results of using the services will meet your requirements. Some -states do not allow the disclaimer of implied warranties, so the -foregoing disclaimers may not apply to you. This paragraph gives you -specific legal rights and you may also have other legal rights that -vary from state to state. -

    - -

    INDEMNITY

    -

    To -the extent permitted by applicable law, you agree to defend, -indemnify, and hold harmless the Taler Parties from and against any -and all claims, damages, obligations, losses, liabilities, costs or -debt, and expenses (including, but not limited to, attorney’s fees) -arising from: (a) your use of and access to the Services; (b) any -feedback or submissions you provide to us concerning the Taler -Wallet; (c) your violation of any term of this Agreement; or (d) your -violation of any law, rule, or regulation, or the rights of any third -party. -

    -

    TIME LIMITATION ON CLAIMS

    -

    You -agree that any claim you may have arising out of or related to your -relationship with us must be filed within one year after such claim -arises, otherwise, your claim in permanently barred. -

    -

    GOVERNING LAW

    -

    No -matter where you’re located, the laws of Switzerland will govern -these Terms. If any provisions of these Terms are inconsistent with -any applicable law, those provisions will be superseded or modified -only to the extent such provisions are inconsistent. The parties -agree to submit to the ordinary courts in Zurich, Switzerland for -exclusive jurisdiction of any dispute arising out of or related to -your use of the Services or your breach of these Terms. -

    -

    TERMINATION

    -

    -the event of termination concerning your use of our Services, your -obligations under this Agreement will still continue. -

    -

    DISCONTINUANCE OF SERVICES

    -

    We -may, in our sole discretion and without cost to you, with or without -prior notice, and at any time, modify or discontinue, temporarily or -permanently, any portion of our Services. We will use the Taler -protocol’s provisions to notify Wallets if our Services are to be -discontinued. It is your responsibility to ensure that the Taler -Wallet is online at least once every three months to observe these -notifications. We shall not be held responsible or liable for any -loss of funds in the event that we discontinue or depreciate the -Services and your Taler Wallet fails to transfer out the coins within - a three months notification period. -

    -

    NO WAIVER

    -

    Our -failure to exercise or delay in exercising any right, power, or -privilege under this Agreement shall not operate as a waiver; nor -shall any single or partial exercise of any right, power, or -privilege preclude any other or further exercise thereof. -

    -

    SEVERABILITY

    -

    If -it turns out that any part of this Agreement is invalid, void, or for -any reason unenforceable, that term will be deemed severable and -limited or eliminated to the minimum extent necessary. -

    -

    FORCE MAJEURE

    -

    We -shall not be held liable for any delays, failure in performance, or -interruptions of service which result directly or indirectly from any -cause or condition beyond our reasonable control, including but not -limited to: any delay or failure due to any act of God, act of civil -or military authorities, act of terrorism, civil disturbance, war, -strike or other labor dispute, fire, interruption in -telecommunications or Internet services or network provider services, -failure of equipment and/or software, other catastrophe, or any other -occurrence which is beyond our reasonable control and shall not -affect the validity and enforceability of any remaining provisions. -

    -

    ASSIGNMENT

    -

    You -agree that we may assign any of our rights and/or transfer, -sub-contract, or delegate any of our obligations under these Terms. -

    -

    ENTIRE AGREEMENT

    -

    This -Agreement sets forth the entire understanding and agreement as to the +disclaimed. In addition, we do not represent or warrant that the content +accessible via the services is accurate, complete, available, current, free of +viruses or other harmful components, or that the results of using the services +will meet your requirements. Some states do not allow the disclaimer of +implied warranties, so the foregoing disclaimers may not apply to you. This +paragraph gives you specific legal rights and you may also have other legal +rights that vary from state to state.

    +
    +
    +

    Indemntiy

    +

    To the extent permitted by applicable law, you agree to defend, indemnify, and +hold harmless the Taler Parties from and against any and all claims, damages, +obligations, losses, liabilities, costs or debt, and expenses (including, but +not limited to, attorney’s fees) arising from: (a) your use of and access to +the Services; (b) any feedback or submissions you provide to us concerning the +Taler Wallet; (c) your violation of any term of this Agreement; or (d) your +violation of any law, rule, or regulation, or the rights of any third party.

    +
    +
    +

    Time limitation on claims

    +

    You agree that any claim you may have arising out of or related to your +relationship with us must be filed within one year after such claim arises, +otherwise, your claim in permanently barred.

    +
    +
    +

    Governing law

    +

    No matter where you’re located, the laws of Switzerland will govern these +Terms. If any provisions of these Terms are inconsistent with any applicable +law, those provisions will be superseded or modified only to the extent such +provisions are inconsistent. The parties agree to submit to the ordinary +courts in Zurich, Switzerland for exclusive jurisdiction of any dispute +arising out of or related to your use of the Services or your breach of these +Terms.

    +
    +
    +

    Termination

    +

    In the event of termination concerning your use of our Services, your +obligations under this Agreement will still continue.

    +
    +
    +

    Discontinuance of services

    +

    We may, in our sole discretion and without cost to you, with or without prior +notice, and at any time, modify or discontinue, temporarily or permanently, +any portion of our Services. We will use the Taler protocol’s provisions to +notify Wallets if our Services are to be discontinued. It is your +responsibility to ensure that the Taler Wallet is online at least once every +three months to observe these notifications. We shall not be held responsible +or liable for any loss of funds in the event that we discontinue or depreciate +the Services and your Taler Wallet fails to transfer out the coins within a +three months notification period.

    +
    +
    +

    No waiver

    +

    Our failure to exercise or delay in exercising any right, power, or privilege +under this Agreement shall not operate as a waiver; nor shall any single or +partial exercise of any right, power, or privilege preclude any other or +further exercise thereof.

    +
    +
    +

    Severability

    +

    If it turns out that any part of this Agreement is invalid, void, or for any +reason unenforceable, that term will be deemed severable and limited or +eliminated to the minimum extent necessary.

    +
    +
    +

    Force majeure

    +

    We shall not be held liable for any delays, failure in performance, or +interruptions of service which result directly or indirectly from any cause or +condition beyond our reasonable control, including but not limited to: any +delay or failure due to any act of God, act of civil or military authorities, +act of terrorism, civil disturbance, war, strike or other labor dispute, fire, +interruption in telecommunications or Internet services or network provider +services, failure of equipment and/or software, other catastrophe, or any +other occurrence which is beyond our reasonable control and shall not affect +the validity and enforceability of any remaining provisions.

    +
    +
    +

    Assignment

    +

    You agree that we may assign any of our rights and/or transfer, sub-contract, +or delegate any of our obligations under these Terms.

    +
    +
    +

    Entire agreement

    +

    This Agreement sets forth the entire understanding and agreement as to the subject matter hereof and supersedes any and all prior discussions, -agreements, and understandings of any kind (including, without -limitation, any prior versions of this Agreement) and every nature -between us. Except as provided for above, any modification to this -Agreement must be in writing and must be signed by both parties. -

    -

    QUESTIONS OR COMMENTS

    -

    We -welcome comments, questions, concerns, or suggestions. Please send us -a message on our contact page at legal@taler-systems.com. -

    - - +agreements, and understandings of any kind (including, without limitation, any +prior versions of this Agreement) and every nature between us. Except as +provided for above, any modification to this Agreement must be in writing and +must be signed by both parties.

    +
    +
    +

    Questions or comments

    +

    We welcome comments, questions, concerns, or suggestions. Please send us a +message on our contact page at legal@taler-systems.com.

    +
    +
+ + +
+
+
+
+
+ + \ No newline at end of file diff --git a/contrib/tos/en/0.pdf b/contrib/tos/en/0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..972b91b931c06935d0691dc5bc3b293e40a415bf GIT binary patch literal 99867 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 literal 0 HcmV?d00001 diff --git a/contrib/tos/en/0.txt b/contrib/tos/en/0.txt index 5a5ee1b9a..9b512f013 100644 --- a/contrib/tos/en/0.txt +++ b/contrib/tos/en/0.txt @@ -1,295 +1,381 @@ -Terms Of Service - Last Updated: 12.4.2019 +Terms Of Service +**************** -Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment service -through our Internet presence (collectively the “Services”). Before using our -Services, please read the Terms of Service (the “Terms” or the “Agreement”) -carefully. +Last Updated: 12.4.2019 -OVERVIEW +Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment +service through our Internet presence (collectively the “Services”). +Before using our Services, please read the Terms of Service (the +“Terms” or the “Agreement”) carefully. + + +Overview +======== This section provides a brief summary of the highlights of this -Agreement. Please note that when you accept this Agreement, you are accepting -all of the terms and conditions and not just this section. We and possibly -other third parties provide Internet services which interact with the Taler -Wallet’s self-hosted personal payment application. When using the Taler Wallet -to interact with our Services, you are agreeing to our Terms, so please read -carefully. +Agreement. Please note that when you accept this Agreement, you are +accepting all of the terms and conditions and not just this section. +We and possibly other third parties provide Internet services which +interact with the Taler Wallet’s self-hosted personal payment +application. When using the Taler Wallet to interact with our +Services, you are agreeing to our Terms, so please read carefully. + Highlights: - • You are responsible for keeping the data in your Taler Wallet at all times - under your control. Any losses arising from you not being in control of - your private information are your problem. - • We will try to transfer funds we hold in escrow for our users to any legal - recipient to the best of our ability within the limitations of the law and - our implementation. However, the Services offered today are highly - experimental and the set of recipients of funds is severely restricted. - • For our Services, we may charge transaction fees. The specific fee structure - is provided based on the Taler protocol and should be shown to you when you - withdraw electronic coins using a Taler Wallet. You agree and understand - that the Taler protocol allows for the fee structure to change. - • You agree to not intentionally overwhelm our systems with requests and - follow responsible disclosure if you find security issues in our services. - • We cannot be held accountable for our Services not being available due to - circumstances beyond our control. If we modify or terminate our services, - we will try to give you the opportunity to recover your funds. However, - given the experimental state of the Services today, this may not be - possible. You are strongly advised to limit your use of the Service - to small-scale experiments expecting total loss of all funds. +----------- -These terms outline approved uses of our Services. The Services and these -Terms are still at an experimental stage. If you have any questions or -comments related to this Agreement, please send us a message to -legal@taler-systems.com. If you do not agree to this Agreement, you must not -use our Services. + * You are responsible for keeping the data in your Taler Wallet at + all times under your control. Any losses arising from you not + being in control of your private information are your problem. -HOW YOU ACCEPT THIS POLICY + * We will try to transfer funds we hold in escrow for our users to + any legal recipient to the best of our ability within the + limitations of the law and our implementation. However, the + Services offered today are highly experimental and the set of + recipients of funds is severely restricted. -By sending funds to us (to top-up your Taler Wallet), you acknowledge that you -have read, understood, and agreed to these Terms. We reserve the right to -change these Terms at any time. If you disagree with the change, we may in the -future offer you with an easy option to recover your unspent funds. However, -in the current experimental period you acknowledge that this feature is not -yet available, resulting in your funds being lost unless you accept the new -Terms. If you continue to use our Services other than to recover your unspent -funds, your continued use of our Services following any such change will -signify your acceptance to be bound by the then current Terms. Please check -the effective date above to determine if there have been any changes since you -have last reviewed these Terms. + * For our Services, we may charge transaction fees. The specific + fee structure is provided based on the Taler protocol and should + be shown to you when you withdraw electronic coins using a Taler + Wallet. You agree and understand that the Taler protocol allows + for the fee structure to change. -SERVICES + * You agree to not intentionally overwhelm our systems with + requests and follow responsible disclosure if you find security + issues in our services. -We will try to transfer funds that we hold in escrow for our users to any -legal recipient to the best of our ability and within the limitations of the -law and our implementation. However, the Services offered today are highly -experimental and the set of recipients of funds is severely restricted. The -Taler Wallet can be loaded by exchanging fiat currencies against electronic -coins. We are providing this exchange service. Once your Taler Wallet is -loaded with electronic coins they can be spent for purchases if the seller is -accepting Taler as a means of payment. We are not guaranteeing that any seller -is accepting Taler at all or a particular seller. The seller or recipient of -deposits of electronic coins must specify the target account, as per the -design of the Taler protocol. They are responsible for following the protocol -and specifying the correct bank account, and are solely liable for any losses -that may arise from specifying the wrong account. We will allow the government -to link wire transfers to the underlying contract hash. It is the + * We cannot be held accountable for our Services not being + available due to circumstances beyond our control. If we modify + or terminate our services, we will try to give you the + opportunity to recover your funds. However, given the + experimental state of the Services today, this may not be + possible. You are strongly advised to limit your use of the + Service to small-scale experiments expecting total loss of all + funds. + +These terms outline approved uses of our Services. The Services and +these Terms are still at an experimental stage. If you have any +questions or comments related to this Agreement, please send us a +message to legal@taler-systems.com. If you do not agree to this +Agreement, you must not use our Services. + + +How you accept this policy +========================== + +By sending funds to us (to top-up your Taler Wallet), you acknowledge +that you have read, understood, and agreed to these Terms. We reserve +the right to change these Terms at any time. If you disagree with the +change, we may in the future offer you with an easy option to recover +your unspent funds. However, in the current experimental period you +acknowledge that this feature is not yet available, resulting in your +funds being lost unless you accept the new Terms. If you continue to +use our Services other than to recover your unspent funds, your +continued use of our Services following any such change will signify +your acceptance to be bound by the then current Terms. Please check +the effective date above to determine if there have been any changes +since you have last reviewed these Terms. + + +Services +======== + +We will try to transfer funds that we hold in escrow for our users to +any legal recipient to the best of our ability and within the +limitations of the law and our implementation. However, the Services +offered today are highly experimental and the set of recipients of +funds is severely restricted. The Taler Wallet can be loaded by +exchanging fiat currencies against electronic coins. We are providing +this exchange service. Once your Taler Wallet is loaded with +electronic coins they can be spent for purchases if the seller is +accepting Taler as a means of payment. We are not guaranteeing that +any seller is accepting Taler at all or a particular seller. The +seller or recipient of deposits of electronic coins must specify the +target account, as per the design of the Taler protocol. They are +responsible for following the protocol and specifying the correct bank +account, and are solely liable for any losses that may arise from +specifying the wrong account. We will allow the government to link +wire transfers to the underlying contract hash. It is the responsibility of recipients to preserve the full contracts and to pay -whatever taxes and charges may be applicable. Technical issues may lead to -situations where we are unable to make transfers at all or lead to incorrect -transfers that cannot be reversed. We will only refuse to execute transfers if -the transfers are prohibited by a competent legal authority and we are ordered -to do so. +whatever taxes and charges may be applicable. Technical issues may +lead to situations where we are unable to make transfers at all or +lead to incorrect transfers that cannot be reversed. We will only +refuse to execute transfers if the transfers are prohibited by a +competent legal authority and we are ordered to do so. -FEES -You agree to pay the fees for exchanges and withdrawals completed via the -Taler Wallet ("Fees") as defined by us, which we may change from time to -time. With the exception of wire transfer fees, Taler transaction fees are set -for any electronic coin at the time of withdrawal and fixed throughout the -validity period of the respective electronic coin. Your wallet should obtain -and display applicable fees when withdrawing funds. Fees for coins obtained as -change may differ from the fees applicable to the original coin. Wire transfer -fees that are independent from electronic coins may change annually. You -authorize us to charge or deduct applicable fees owed in connection with -deposits, exchanges and withdrawals following the rules of the Taler protocol. -We reserve the right to provide different types of rewards to users either in -the form of discount for our Services or in any other form at our discretion -and without prior notice to you. +Fees +==== -ELIGIBILITY +You agree to pay the fees for exchanges and withdrawals completed via +the Taler Wallet ("Fees") as defined by us, which we may change from +time to time. With the exception of wire transfer fees, Taler +transaction fees are set for any electronic coin at the time of +withdrawal and fixed throughout the validity period of the respective +electronic coin. Your wallet should obtain and display applicable fees +when withdrawing funds. Fees for coins obtained as change may differ +from the fees applicable to the original coin. Wire transfer fees that +are independent from electronic coins may change annually. You +authorize us to charge or deduct applicable fees owed in connection +with deposits, exchanges and withdrawals following the rules of the +Taler protocol. We reserve the right to provide different types of +rewards to users either in the form of discount for our Services or in +any other form at our discretion and without prior notice to you. -To be eligible to use our Services, you must be able to form legally binding -contracts or have the permission of your legal guardian. By using our -Services, you represent and warrant that you meet all eligibility requirements -that we outline in these Terms. -FINANCIAL SELF-RESPONSIBILITY +Eligibility +=========== -You will be responsible for maintaining the availability, integrity and -confidentiality of the data stored in your wallet. When you setup a Taler -Wallet, you are strongly advised to follow the precautionary measures offered -by the software to minimize the chances to losse access to or control over -your Wallet data. We will not be liable for any loss or damage arising from -your failure to comply with this paragraph. +To be eligible to use our Services, you must be able to form legally +binding contracts or have the permission of your legal guardian. By +using our Services, you represent and warrant that you meet all +eligibility requirements that we outline in these Terms. -COPYRIGHTS and TRADEMARKS -The Taler Wallet is released under the terms of the GNU General Public License -(GNU GPL). You have the right to access, use, and share the Taler Wallet, in -modified or unmodified form. However, the GPL is a strong copyleft license, -which means that any derivative works must be distributed under the same -license terms as the original software. If you have any questions, you should -review the GNU GPL’s full terms and conditions at -https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler” itself is a trademark -of Taler Systems SA. You are welcome to use the name in relation to processing -payments using the Taler protocol, assuming your use is compatible with an -official release from the GNU Project that is not older than two years. +Financial self-responsibility +============================= -YOUR USE OF OUR SERVICES +You will be responsible for maintaining the availability, integrity +and confidentiality of the data stored in your wallet. When you setup +a Taler Wallet, you are strongly advised to follow the precautionary +measures offered by the software to minimize the chances to losse +access to or control over your Wallet data. We will not be liable for +any loss or damage arising from your failure to comply with this +paragraph. -When using our Services, you agree to not take any action that intentionally -imposes an unreasonable load on our infrastructure. If you find security -problems in our Services, you agree to first report them to -security@taler-systems.com and grant us the right to publish your report. We -warrant that we will ourselves publicly disclose any issues reported within 3 -months, and that we will not prosecute anyone reporting security issues if -they did not exploit the issue beyond a proof-of-concept, and followed the -above responsible disclosure practice. -LIMITATION OF LIABILITY & DISCLAIMER OF WARRANTIES +Copyrights and trademarks +========================= -You understand and agree that we have no control over, and no duty to take any -action regarding: Failures, disruptions, errors, or delays in processing that -you may experience while using our Services; The risk of failure of hardware, -software, and Internet connections; The risk of malicious software being -introduced or found in the software underlying the Taler Wallet; The risk that -third parties may obtain unauthorized access to information stored within your -Taler Wallet, including, but not limited to your Taler Wallet coins or backup -encryption keys. You release us from all liability related to any losses, -damages, or claims arising from: +The Taler Wallet is released under the terms of the GNU General Public +License (GNU GPL). You have the right to access, use, and share the +Taler Wallet, in modified or unmodified form. However, the GPL is a +strong copyleft license, which means that any derivative works must be +distributed under the same license terms as the original software. If +you have any questions, you should review the GNU GPL’s full terms and +conditions at https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler” +itself is a trademark of Taler Systems SA. You are welcome to use the +name in relation to processing payments using the Taler protocol, +assuming your use is compatible with an official release from the GNU +Project that is not older than two years. -(a) user error such as forgotten passwords, incorrectly constructed - transactions; -(b) server failure or data loss; -(c) unauthorized access to the Taler Wallet application; -(d) bugs or other errors in the Taler Wallet software; and -(e) any unauthorized third party activities, including, but not limited to, - the use of viruses, phishing, brute forcing, or other means of attack - against the Taler Wallet. We make no representations concerning any - Third Party Content contained in or accessed through our Services. -Any other terms, conditions, warranties, or representations associated with -such content, are solely between you and such organizations and/or -individuals. +Your use of our services +======================== -LIMITATION OF LIABILITY +When using our Services, you agree to not take any action that +intentionally imposes an unreasonable load on our infrastructure. If +you find security problems in our Services, you agree to first report +them to security@taler-systems.com and grant us the right to publish +your report. We warrant that we will ourselves publicly disclose any +issues reported within 3 months, and that we will not prosecute anyone +reporting security issues if they did not exploit the issue beyond a +proof-of-concept, and followed the above responsible disclosure +practice. -To the fullest extent permitted by applicable law, in no event will we or any -of our officers, directors, representatives, agents, servants, counsel, -employees, consultants, lawyers, and other personnel authorized to act, -acting, or purporting to act on our behalf (collectively the “Taler Parties”) -be liable to you under contract, tort, strict liability, negligence, or any -other legal or equitable theory, for: -(a) any lost profits, data loss, cost of procurement of substitute goods or - services, or direct, indirect, incidental, special, punitive, compensatory, - or consequential damages of any kind whatsoever resulting from: - (i) your use of, or conduct in connection with, our services; - (ii) any unauthorized use of your wallet and/or private key due to your - failure to maintain the confidentiality of your wallet; - (iii) any interruption or cessation of transmission to or from the services; or - (iv) any bugs, viruses, trojan horses, or the like that are found in the Taler - Wallet software or that may be transmitted to or through our services by - any third party (regardless of the source of origination), or -(b) any direct damages. +Limitation of liability & disclaimer of warranties +================================================== -These limitations apply regardless of legal theory, whether based on tort, -strict liability, breach of contract, breach of warranty, or any other legal -theory, and whether or not we were advised of the possibility of such -damages. Some jurisdictions do not allow the exclusion or limitation of -liability for consequential or incidental damages, so the above limitation may -not apply to you. +You understand and agree that we have no control over, and no duty to +take any action regarding: Failures, disruptions, errors, or delays in +processing that you may experience while using our Services; The risk +of failure of hardware, software, and Internet connections; The risk +of malicious software being introduced or found in the software +underlying the Taler Wallet; The risk that third parties may obtain +unauthorized access to information stored within your Taler Wallet, +including, but not limited to your Taler Wallet coins or backup +encryption keys. You release us from all liability related to any +losses, damages, or claims arising from: -WARRANTY DISCLAIMER +1. user error such as forgotten passwords, incorrectly constructed + transactions; -Our services are provided "as is" and without warranty of any kind. To the -maximum extent permitted by law, we disclaim all representations and -warranties, express or implied, relating to the services and underlying -software or any content on the services, whether provided or owned by us or by -any third party, including without limitation, warranties of merchantability, -fitness for a particular purpose, title, non-infringement, freedom from -computer virus, and any implied warranties arising from course of dealing, -course of performance, or usage in trade, all of which are expressly -disclaimed. In addition, we do not represent or warrant that the content -accessible via the services is accurate, complete, available, current, free of -viruses or other harmful components, or that the results of using the services -will meet your requirements. Some states do not allow the disclaimer of -implied warranties, so the foregoing disclaimers may not apply to you. This -paragraph gives you specific legal rights and you may also have other legal -rights that vary from state to state. +2. server failure or data loss; -INDEMNITY +3. unauthorized access to the Taler Wallet application; -To the extent permitted by applicable law, you agree to defend, indemnify, and -hold harmless the Taler Parties from and against any and all claims, damages, -obligations, losses, liabilities, costs or debt, and expenses (including, but -not limited to, attorney’s fees) arising from: (a) your use of and access to -the Services; (b) any feedback or submissions you provide to us concerning the -Taler Wallet; (c) your violation of any term of this Agreement; or (d) your -violation of any law, rule, or regulation, or the rights of any third party. +4. bugs or other errors in the Taler Wallet software; and -TIME LIMITATION ON CLAIMS +5. any unauthorized third party activities, including, but not limited + to, the use of viruses, phishing, brute forcing, or other means of + attack against the Taler Wallet. We make no representations + concerning any Third Party Content contained in or accessed through + our Services. -You agree that any claim you may have arising out of or related to your -relationship with us must be filed within one year after such claim arises, -otherwise, your claim in permanently barred. +Any other terms, conditions, warranties, or representations associated +with such content, are solely between you and such organizations +and/or individuals. -GOVERNING LAW -No matter where you’re located, the laws of Switzerland will govern these -Terms. If any provisions of these Terms are inconsistent with any applicable -law, those provisions will be superseded or modified only to the extent such -provisions are inconsistent. The parties agree to submit to the ordinary -courts in Zurich, Switzerland for exclusive jurisdiction of any dispute -arising out of or related to your use of the Services or your breach of these -Terms. +Limitation of liability +======================= -TERMINATION +To the fullest extent permitted by applicable law, in no event will we +or any of our officers, directors, representatives, agents, servants, +counsel, employees, consultants, lawyers, and other personnel +authorized to act, acting, or purporting to act on our behalf +(collectively the “Taler Parties”) be liable to you under contract, +tort, strict liability, negligence, or any other legal or equitable +theory, for: + +1. any lost profits, data loss, cost of procurement of substitute + goods or services, or direct, indirect, incidental, special, + punitive, compensatory, or consequential damages of any kind + whatsoever resulting from: + + 1. your use of, or conduct in connection with, our services; + + 2. any unauthorized use of your wallet and/or private key due to + your failure to maintain the confidentiality of your wallet; + + 3. any interruption or cessation of transmission to or from the + services; or + + 4. any bugs, viruses, trojan horses, or the like that are found in + the Taler Wallet software or that may be transmitted to or + through our services by any third party (regardless of the + source of origination), or + +2. any direct damages. + +These limitations apply regardless of legal theory, whether based on +tort, strict liability, breach of contract, breach of warranty, or any +other legal theory, and whether or not we were advised of the +possibility of such damages. Some jurisdictions do not allow the +exclusion or limitation of liability for consequential or incidental +damages, so the above limitation may not apply to you. + + +Warranty disclaimer +=================== + +Our services are provided "as is" and without warranty of any kind. To +the maximum extent permitted by law, we disclaim all representations +and warranties, express or implied, relating to the services and +underlying software or any content on the services, whether provided +or owned by us or by any third party, including without limitation, +warranties of merchantability, fitness for a particular purpose, +title, non-infringement, freedom from computer virus, and any implied +warranties arising from course of dealing, course of performance, or +usage in trade, all of which are expressly disclaimed. In addition, we +do not represent or warrant that the content accessible via the +services is accurate, complete, available, current, free of viruses or +other harmful components, or that the results of using the services +will meet your requirements. Some states do not allow the disclaimer +of implied warranties, so the foregoing disclaimers may not apply to +you. This paragraph gives you specific legal rights and you may also +have other legal rights that vary from state to state. + + +Indemntiy +========= + +To the extent permitted by applicable law, you agree to defend, +indemnify, and hold harmless the Taler Parties from and against any +and all claims, damages, obligations, losses, liabilities, costs or +debt, and expenses (including, but not limited to, attorney’s fees) +arising from: (a) your use of and access to the Services; (b) any +feedback or submissions you provide to us concerning the Taler Wallet; +(c) your violation of any term of this Agreement; or (d) your +violation of any law, rule, or regulation, or the rights of any third +party. + + +Time limitation on claims +========================= + +You agree that any claim you may have arising out of or related to +your relationship with us must be filed within one year after such +claim arises, otherwise, your claim in permanently barred. + + +Governing law +============= + +No matter where you’re located, the laws of Switzerland will govern +these Terms. If any provisions of these Terms are inconsistent with +any applicable law, those provisions will be superseded or modified +only to the extent such provisions are inconsistent. The parties agree +to submit to the ordinary courts in Zurich, Switzerland for exclusive +jurisdiction of any dispute arising out of or related to your use of +the Services or your breach of these Terms. + + +Termination +=========== In the event of termination concerning your use of our Services, your obligations under this Agreement will still continue. -DISCONTINUANCE OF SERVICES -We may, in our sole discretion and without cost to you, with or without prior -notice, and at any time, modify or discontinue, temporarily or permanently, -any portion of our Services. We will use the Taler protocol’s provisions to -notify Wallets if our Services are to be discontinued. It is your -responsibility to ensure that the Taler Wallet is online at least once every -three months to observe these notifications. We shall not be held responsible -or liable for any loss of funds in the event that we discontinue or depreciate -the Services and your Taler Wallet fails to transfer out the coins within a -three months notification period. +Discontinuance of services +========================== -NO WAIVER +We may, in our sole discretion and without cost to you, with or +without prior notice, and at any time, modify or discontinue, +temporarily or permanently, any portion of our Services. We will use +the Taler protocol’s provisions to notify Wallets if our Services are +to be discontinued. It is your responsibility to ensure that the Taler +Wallet is online at least once every three months to observe these +notifications. We shall not be held responsible or liable for any loss +of funds in the event that we discontinue or depreciate the Services +and your Taler Wallet fails to transfer out the coins within a three +months notification period. -Our failure to exercise or delay in exercising any right, power, or privilege -under this Agreement shall not operate as a waiver; nor shall any single or -partial exercise of any right, power, or privilege preclude any other or -further exercise thereof. -SEVERABILITY +No waiver +========= -If it turns out that any part of this Agreement is invalid, void, or for any -reason unenforceable, that term will be deemed severable and limited or -eliminated to the minimum extent necessary. +Our failure to exercise or delay in exercising any right, power, or +privilege under this Agreement shall not operate as a waiver; nor +shall any single or partial exercise of any right, power, or privilege +preclude any other or further exercise thereof. -FORCE MAJEURE + +Severability +============ + +If it turns out that any part of this Agreement is invalid, void, or +for any reason unenforceable, that term will be deemed severable and +limited or eliminated to the minimum extent necessary. + + +Force majeure +============= We shall not be held liable for any delays, failure in performance, or -interruptions of service which result directly or indirectly from any cause or -condition beyond our reasonable control, including but not limited to: any -delay or failure due to any act of God, act of civil or military authorities, -act of terrorism, civil disturbance, war, strike or other labor dispute, fire, -interruption in telecommunications or Internet services or network provider -services, failure of equipment and/or software, other catastrophe, or any -other occurrence which is beyond our reasonable control and shall not affect +interruptions of service which result directly or indirectly from any +cause or condition beyond our reasonable control, including but not +limited to: any delay or failure due to any act of God, act of civil +or military authorities, act of terrorism, civil disturbance, war, +strike or other labor dispute, fire, interruption in +telecommunications or Internet services or network provider services, +failure of equipment and/or software, other catastrophe, or any other +occurrence which is beyond our reasonable control and shall not affect the validity and enforceability of any remaining provisions. -ASSIGNMENT -You agree that we may assign any of our rights and/or transfer, sub-contract, -or delegate any of our obligations under these Terms. +Assignment +========== -ENTIRE AGREEMENT +You agree that we may assign any of our rights and/or transfer, sub- +contract, or delegate any of our obligations under these Terms. -This Agreement sets forth the entire understanding and agreement as to the -subject matter hereof and supersedes any and all prior discussions, -agreements, and understandings of any kind (including, without limitation, any -prior versions of this Agreement) and every nature between us. Except as -provided for above, any modification to this Agreement must be in writing and -must be signed by both parties. -QUESTIONS OR COMMENTS +Entire agreement +================ -We welcome comments, questions, concerns, or suggestions. Please send us a -message on our contact page at legal@taler-systems.com. +This Agreement sets forth the entire understanding and agreement as to +the subject matter hereof and supersedes any and all prior +discussions, agreements, and understandings of any kind (including, +without limitation, any prior versions of this Agreement) and every +nature between us. Except as provided for above, any modification to +this Agreement must be in writing and must be signed by both parties. + + +Questions or comments +===================== + +We welcome comments, questions, concerns, or suggestions. Please send +us a message on our contact page at legal@taler-systems.com. diff --git a/contrib/tos/en/0.xml b/contrib/tos/en/0.xml new file mode 100644 index 000000000..45871ead4 --- /dev/null +++ b/contrib/tos/en/0.xml @@ -0,0 +1,344 @@ + + + + +
+ Terms Of Service + Last Updated: 12.4.2019 + Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment service + through our Internet presence (collectively the “Services”). Before using our + Services, please read the Terms of Service (the “Terms” or the “Agreement”) + carefully. +
+ Overview + This section provides a brief summary of the highlights of this + Agreement. Please note that when you accept this Agreement, you are accepting + all of the terms and conditions and not just this section. We and possibly + other third parties provide Internet services which interact with the Taler + Wallet’s self-hosted personal payment application. When using the Taler Wallet + to interact with our Services, you are agreeing to our Terms, so please read + carefully. +
+ Highlights: + + + + You are responsible for keeping the data in your Taler Wallet at all times + under your control. Any losses arising from you not being in control of + your private information are your problem. + + + We will try to transfer funds we hold in escrow for our users to any legal + recipient to the best of our ability within the limitations of the law and + our implementation. However, the Services offered today are highly + experimental and the set of recipients of funds is severely restricted. + + + For our Services, we may charge transaction fees. The specific fee structure + is provided based on the Taler protocol and should be shown to you when you + withdraw electronic coins using a Taler Wallet. You agree and understand + that the Taler protocol allows for the fee structure to change. + + + You agree to not intentionally overwhelm our systems with requests and + follow responsible disclosure if you find security issues in our services. + + + We cannot be held accountable for our Services not being available due to + circumstances beyond our control. If we modify or terminate our services, + we will try to give you the opportunity to recover your funds. However, + given the experimental state of the Services today, this may not be + possible. You are strongly advised to limit your use of the Service + to small-scale experiments expecting total loss of all funds. + + + + These terms outline approved uses of our Services. The Services and these + Terms are still at an experimental stage. If you have any questions or + comments related to this Agreement, please send us a message to + legal@taler-systems.com. If you do not agree to this Agreement, you must not + use our Services. +
+
+
+ How you accept this policy + By sending funds to us (to top-up your Taler Wallet), you acknowledge that you + have read, understood, and agreed to these Terms. We reserve the right to + change these Terms at any time. If you disagree with the change, we may in the + future offer you with an easy option to recover your unspent funds. However, + in the current experimental period you acknowledge that this feature is not + yet available, resulting in your funds being lost unless you accept the new + Terms. If you continue to use our Services other than to recover your unspent + funds, your continued use of our Services following any such change will + signify your acceptance to be bound by the then current Terms. Please check + the effective date above to determine if there have been any changes since you + have last reviewed these Terms. +
+
+ Services + We will try to transfer funds that we hold in escrow for our users to any + legal recipient to the best of our ability and within the limitations of the + law and our implementation. However, the Services offered today are highly + experimental and the set of recipients of funds is severely restricted. The + Taler Wallet can be loaded by exchanging fiat currencies against electronic + coins. We are providing this exchange service. Once your Taler Wallet is + loaded with electronic coins they can be spent for purchases if the seller is + accepting Taler as a means of payment. We are not guaranteeing that any seller + is accepting Taler at all or a particular seller. The seller or recipient of + deposits of electronic coins must specify the target account, as per the + design of the Taler protocol. They are responsible for following the protocol + and specifying the correct bank account, and are solely liable for any losses + that may arise from specifying the wrong account. We will allow the government + to link wire transfers to the underlying contract hash. It is the + responsibility of recipients to preserve the full contracts and to pay + whatever taxes and charges may be applicable. Technical issues may lead to + situations where we are unable to make transfers at all or lead to incorrect + transfers that cannot be reversed. We will only refuse to execute transfers if + the transfers are prohibited by a competent legal authority and we are ordered + to do so. +
+
+ Fees + You agree to pay the fees for exchanges and withdrawals completed via the + Taler Wallet (“Fees”) as defined by us, which we may change from time to + time. With the exception of wire transfer fees, Taler transaction fees are set + for any electronic coin at the time of withdrawal and fixed throughout the + validity period of the respective electronic coin. Your wallet should obtain + and display applicable fees when withdrawing funds. Fees for coins obtained as + change may differ from the fees applicable to the original coin. Wire transfer + fees that are independent from electronic coins may change annually. You + authorize us to charge or deduct applicable fees owed in connection with + deposits, exchanges and withdrawals following the rules of the Taler protocol. + We reserve the right to provide different types of rewards to users either in + the form of discount for our Services or in any other form at our discretion + and without prior notice to you. +
+
+ Eligibility + To be eligible to use our Services, you must be able to form legally binding + contracts or have the permission of your legal guardian. By using our + Services, you represent and warrant that you meet all eligibility requirements + that we outline in these Terms. +
+
+ Financial self-responsibility + You will be responsible for maintaining the availability, integrity and + confidentiality of the data stored in your wallet. When you setup a Taler + Wallet, you are strongly advised to follow the precautionary measures offered + by the software to minimize the chances to losse access to or control over + your Wallet data. We will not be liable for any loss or damage arising from + your failure to comply with this paragraph. +
+
+ Copyrights and trademarks + The Taler Wallet is released under the terms of the GNU General Public License + (GNU GPL). You have the right to access, use, and share the Taler Wallet, in + modified or unmodified form. However, the GPL is a strong copyleft license, + which means that any derivative works must be distributed under the same + license terms as the original software. If you have any questions, you should + review the GNU GPL’s full terms and conditions at + https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler” itself is a trademark + of Taler Systems SA. You are welcome to use the name in relation to processing + payments using the Taler protocol, assuming your use is compatible with an + official release from the GNU Project that is not older than two years. +
+
+ Your use of our services + When using our Services, you agree to not take any action that intentionally + imposes an unreasonable load on our infrastructure. If you find security + problems in our Services, you agree to first report them to + security@taler-systems.com and grant us the right to publish your report. We + warrant that we will ourselves publicly disclose any issues reported within 3 + months, and that we will not prosecute anyone reporting security issues if + they did not exploit the issue beyond a proof-of-concept, and followed the + above responsible disclosure practice. +
+
+ Limitation of liability & disclaimer of warranties + You understand and agree that we have no control over, and no duty to take any + action regarding: Failures, disruptions, errors, or delays in processing that + you may experience while using our Services; The risk of failure of hardware, + software, and Internet connections; The risk of malicious software being + introduced or found in the software underlying the Taler Wallet; The risk that + third parties may obtain unauthorized access to information stored within your + Taler Wallet, including, but not limited to your Taler Wallet coins or backup + encryption keys. You release us from all liability related to any losses, + damages, or claims arising from: + + + user error such as forgotten passwords, incorrectly constructed + transactions; + + + server failure or data loss; + + + unauthorized access to the Taler Wallet application; + + + bugs or other errors in the Taler Wallet software; and + + + any unauthorized third party activities, including, but not limited to, + the use of viruses, phishing, brute forcing, or other means of attack + against the Taler Wallet. We make no representations concerning any + Third Party Content contained in or accessed through our Services. + + + Any other terms, conditions, warranties, or representations associated with + such content, are solely between you and such organizations and/or + individuals. +
+
+ Limitation of liability + To the fullest extent permitted by applicable law, in no event will we or any + of our officers, directors, representatives, agents, servants, counsel, + employees, consultants, lawyers, and other personnel authorized to act, + acting, or purporting to act on our behalf (collectively the “Taler Parties”) + be liable to you under contract, tort, strict liability, negligence, or any + other legal or equitable theory, for: + + + any lost profits, data loss, cost of procurement of substitute goods or + services, or direct, indirect, incidental, special, punitive, compensatory, + or consequential damages of any kind whatsoever resulting from: + + + + + + your use of, or conduct in connection with, our services; + + + any unauthorized use of your wallet and/or private key due to your + failure to maintain the confidentiality of your wallet; + + + any interruption or cessation of transmission to or from the services; or + + + any bugs, viruses, trojan horses, or the like that are found in the Taler + Wallet software or that may be transmitted to or through our services by + any third party (regardless of the source of origination), or + + + + + + any direct damages. + + + These limitations apply regardless of legal theory, whether based on tort, + strict liability, breach of contract, breach of warranty, or any other legal + theory, and whether or not we were advised of the possibility of such + damages. Some jurisdictions do not allow the exclusion or limitation of + liability for consequential or incidental damages, so the above limitation may + not apply to you. +
+
+ Warranty disclaimer + Our services are provided “as is” and without warranty of any kind. To the + maximum extent permitted by law, we disclaim all representations and + warranties, express or implied, relating to the services and underlying + software or any content on the services, whether provided or owned by us or by + any third party, including without limitation, warranties of merchantability, + fitness for a particular purpose, title, non-infringement, freedom from + computer virus, and any implied warranties arising from course of dealing, + course of performance, or usage in trade, all of which are expressly + disclaimed. In addition, we do not represent or warrant that the content + accessible via the services is accurate, complete, available, current, free of + viruses or other harmful components, or that the results of using the services + will meet your requirements. Some states do not allow the disclaimer of + implied warranties, so the foregoing disclaimers may not apply to you. This + paragraph gives you specific legal rights and you may also have other legal + rights that vary from state to state. +
+
+ Indemntiy + To the extent permitted by applicable law, you agree to defend, indemnify, and + hold harmless the Taler Parties from and against any and all claims, damages, + obligations, losses, liabilities, costs or debt, and expenses (including, but + not limited to, attorney’s fees) arising from: (a) your use of and access to + the Services; (b) any feedback or submissions you provide to us concerning the + Taler Wallet; (c) your violation of any term of this Agreement; or (d) your + violation of any law, rule, or regulation, or the rights of any third party. +
+
+ Time limitation on claims + You agree that any claim you may have arising out of or related to your + relationship with us must be filed within one year after such claim arises, + otherwise, your claim in permanently barred. +
+
+ Governing law + No matter where you’re located, the laws of Switzerland will govern these + Terms. If any provisions of these Terms are inconsistent with any applicable + law, those provisions will be superseded or modified only to the extent such + provisions are inconsistent. The parties agree to submit to the ordinary + courts in Zurich, Switzerland for exclusive jurisdiction of any dispute + arising out of or related to your use of the Services or your breach of these + Terms. +
+
+ Termination + In the event of termination concerning your use of our Services, your + obligations under this Agreement will still continue. +
+
+ Discontinuance of services + We may, in our sole discretion and without cost to you, with or without prior + notice, and at any time, modify or discontinue, temporarily or permanently, + any portion of our Services. We will use the Taler protocol’s provisions to + notify Wallets if our Services are to be discontinued. It is your + responsibility to ensure that the Taler Wallet is online at least once every + three months to observe these notifications. We shall not be held responsible + or liable for any loss of funds in the event that we discontinue or depreciate + the Services and your Taler Wallet fails to transfer out the coins within a + three months notification period. +
+
+ No waiver + Our failure to exercise or delay in exercising any right, power, or privilege + under this Agreement shall not operate as a waiver; nor shall any single or + partial exercise of any right, power, or privilege preclude any other or + further exercise thereof. +
+
+ Severability + If it turns out that any part of this Agreement is invalid, void, or for any + reason unenforceable, that term will be deemed severable and limited or + eliminated to the minimum extent necessary. +
+
+ Force majeure + We shall not be held liable for any delays, failure in performance, or + interruptions of service which result directly or indirectly from any cause or + condition beyond our reasonable control, including but not limited to: any + delay or failure due to any act of God, act of civil or military authorities, + act of terrorism, civil disturbance, war, strike or other labor dispute, fire, + interruption in telecommunications or Internet services or network provider + services, failure of equipment and/or software, other catastrophe, or any + other occurrence which is beyond our reasonable control and shall not affect + the validity and enforceability of any remaining provisions. +
+
+ Assignment + You agree that we may assign any of our rights and/or transfer, sub-contract, + or delegate any of our obligations under these Terms. +
+
+ Entire agreement + This Agreement sets forth the entire understanding and agreement as to the + subject matter hereof and supersedes any and all prior discussions, + agreements, and understandings of any kind (including, without limitation, any + prior versions of this Agreement) and every nature between us. Except as + provided for above, any modification to this Agreement must be in writing and + must be signed by both parties. +
+
+ Questions or comments + We welcome comments, questions, concerns, or suggestions. Please send us a + message on our contact page at legal@taler-systems.com. +
+
+
diff --git a/contrib/tos/locale/de/LC_MESSAGES/tos.po b/contrib/tos/locale/de/LC_MESSAGES/tos.po new file mode 100644 index 000000000..4644a5c8a --- /dev/null +++ b/contrib/tos/locale/de/LC_MESSAGES/tos.po @@ -0,0 +1,514 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2014-2020 Taler Systems SA (GPLv3+ or GFDL 1.3+) +# This file is distributed under the same license as the tos package. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: tos 0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-02-07 00:35+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: ../../tos.rst:2 +msgid "Terms Of Service" +msgstr "" + +#: ../../tos.rst:4 +msgid "Last Updated: 12.4.2019" +msgstr "" + +#: ../../tos.rst:6 +msgid "" +"Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment " +"service through our Internet presence (collectively the “Services”). " +"Before using our Services, please read the Terms of Service (the “Terms” " +"or the “Agreement”) carefully." +msgstr "" + +#: ../../tos.rst:12 +msgid "Overview" +msgstr "" + +#: ../../tos.rst:14 +msgid "" +"This section provides a brief summary of the highlights of this " +"Agreement. Please note that when you accept this Agreement, you are " +"accepting all of the terms and conditions and not just this section. We " +"and possibly other third parties provide Internet services which interact" +" with the Taler Wallet’s self-hosted personal payment application. When " +"using the Taler Wallet to interact with our Services, you are agreeing to" +" our Terms, so please read carefully." +msgstr "" + +#: ../../tos.rst:23 +msgid "Highlights:" +msgstr "" + +#: ../../tos.rst:25 +msgid "" +"You are responsible for keeping the data in your Taler Wallet at all " +"times under your control. Any losses arising from you not being in " +"control of your private information are your problem." +msgstr "" + +#: ../../tos.rst:28 +msgid "" +"We will try to transfer funds we hold in escrow for our users to any " +"legal recipient to the best of our ability within the limitations of the " +"law and our implementation. However, the Services offered today are " +"highly experimental and the set of recipients of funds is severely " +"restricted." +msgstr "" + +#: ../../tos.rst:32 +msgid "" +"For our Services, we may charge transaction fees. The specific fee " +"structure is provided based on the Taler protocol and should be shown to " +"you when you withdraw electronic coins using a Taler Wallet. You agree " +"and understand that the Taler protocol allows for the fee structure to " +"change." +msgstr "" + +#: ../../tos.rst:36 +msgid "" +"You agree to not intentionally overwhelm our systems with requests and " +"follow responsible disclosure if you find security issues in our " +"services." +msgstr "" + +#: ../../tos.rst:38 +msgid "" +"We cannot be held accountable for our Services not being available due to" +" circumstances beyond our control. If we modify or terminate our " +"services, we will try to give you the opportunity to recover your funds. " +"However, given the experimental state of the Services today, this may not" +" be possible. You are strongly advised to limit your use of the Service " +"to small-scale experiments expecting total loss of all funds." +msgstr "" + +#: ../../tos.rst:45 +msgid "" +"These terms outline approved uses of our Services. The Services and these" +" Terms are still at an experimental stage. If you have any questions or " +"comments related to this Agreement, please send us a message to legal" +"@taler-systems.com. If you do not agree to this Agreement, you must not " +"use our Services." +msgstr "" + +#: ../../tos.rst:52 +msgid "How you accept this policy" +msgstr "" + +#: ../../tos.rst:54 +msgid "" +"By sending funds to us (to top-up your Taler Wallet), you acknowledge " +"that you have read, understood, and agreed to these Terms. We reserve the" +" right to change these Terms at any time. If you disagree with the " +"change, we may in the future offer you with an easy option to recover " +"your unspent funds. However, in the current experimental period you " +"acknowledge that this feature is not yet available, resulting in your " +"funds being lost unless you accept the new Terms. If you continue to use " +"our Services other than to recover your unspent funds, your continued use" +" of our Services following any such change will signify your acceptance " +"to be bound by the then current Terms. Please check the effective date " +"above to determine if there have been any changes since you have last " +"reviewed these Terms." +msgstr "" + +#: ../../tos.rst:67 +msgid "Services" +msgstr "" + +#: ../../tos.rst:69 +msgid "" +"We will try to transfer funds that we hold in escrow for our users to any" +" legal recipient to the best of our ability and within the limitations of" +" the law and our implementation. However, the Services offered today are " +"highly experimental and the set of recipients of funds is severely " +"restricted. The Taler Wallet can be loaded by exchanging fiat currencies" +" against electronic coins. We are providing this exchange service. Once " +"your Taler Wallet is loaded with electronic coins they can be spent for " +"purchases if the seller is accepting Taler as a means of payment. We are " +"not guaranteeing that any seller is accepting Taler at all or a " +"particular seller. The seller or recipient of deposits of electronic " +"coins must specify the target account, as per the design of the Taler " +"protocol. They are responsible for following the protocol and specifying " +"the correct bank account, and are solely liable for any losses that may " +"arise from specifying the wrong account. We will allow the government to " +"link wire transfers to the underlying contract hash. It is the " +"responsibility of recipients to preserve the full contracts and to pay " +"whatever taxes and charges may be applicable. Technical issues may lead " +"to situations where we are unable to make transfers at all or lead to " +"incorrect transfers that cannot be reversed. We will only refuse to " +"execute transfers if the transfers are prohibited by a competent legal " +"authority and we are ordered to do so." +msgstr "" + +#: ../../tos.rst:91 +msgid "Fees" +msgstr "" + +#: ../../tos.rst:93 +msgid "" +"You agree to pay the fees for exchanges and withdrawals completed via the" +" Taler Wallet (\"Fees\") as defined by us, which we may change from time " +"to time. With the exception of wire transfer fees, Taler transaction fees" +" are set for any electronic coin at the time of withdrawal and fixed " +"throughout the validity period of the respective electronic coin. Your " +"wallet should obtain and display applicable fees when withdrawing funds. " +"Fees for coins obtained as change may differ from the fees applicable to " +"the original coin. Wire transfer fees that are independent from " +"electronic coins may change annually. You authorize us to charge or " +"deduct applicable fees owed in connection with deposits, exchanges and " +"withdrawals following the rules of the Taler protocol. We reserve the " +"right to provide different types of rewards to users either in the form " +"of discount for our Services or in any other form at our discretion and " +"without prior notice to you." +msgstr "" + +#: ../../tos.rst:108 +msgid "Eligibility" +msgstr "" + +#: ../../tos.rst:110 +msgid "" +"To be eligible to use our Services, you must be able to form legally " +"binding contracts or have the permission of your legal guardian. By using" +" our Services, you represent and warrant that you meet all eligibility " +"requirements that we outline in these Terms." +msgstr "" + +#: ../../tos.rst:116 +msgid "Financial self-responsibility" +msgstr "" + +#: ../../tos.rst:118 +msgid "" +"You will be responsible for maintaining the availability, integrity and " +"confidentiality of the data stored in your wallet. When you setup a Taler" +" Wallet, you are strongly advised to follow the precautionary measures " +"offered by the software to minimize the chances to losse access to or " +"control over your Wallet data. We will not be liable for any loss or " +"damage arising from your failure to comply with this paragraph." +msgstr "" + +#: ../../tos.rst:126 +msgid "Copyrights and trademarks" +msgstr "" + +#: ../../tos.rst:128 +msgid "" +"The Taler Wallet is released under the terms of the GNU General Public " +"License (GNU GPL). You have the right to access, use, and share the Taler" +" Wallet, in modified or unmodified form. However, the GPL is a strong " +"copyleft license, which means that any derivative works must be " +"distributed under the same license terms as the original software. If you" +" have any questions, you should review the GNU GPL’s full terms and " +"conditions at https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler” " +"itself is a trademark of Taler Systems SA. You are welcome to use the " +"name in relation to processing payments using the Taler protocol, " +"assuming your use is compatible with an official release from the GNU " +"Project that is not older than two years." +msgstr "" + +#: ../../tos.rst:140 +msgid "Your use of our services" +msgstr "" + +#: ../../tos.rst:142 +msgid "" +"When using our Services, you agree to not take any action that " +"intentionally imposes an unreasonable load on our infrastructure. If you " +"find security problems in our Services, you agree to first report them to" +" security@taler-systems.com and grant us the right to publish your " +"report. We warrant that we will ourselves publicly disclose any issues " +"reported within 3 months, and that we will not prosecute anyone reporting" +" security issues if they did not exploit the issue beyond a proof-of-" +"concept, and followed the above responsible disclosure practice." +msgstr "" + +#: ../../tos.rst:152 +msgid "Limitation of liability & disclaimer of warranties" +msgstr "" + +#: ../../tos.rst:154 +msgid "" +"You understand and agree that we have no control over, and no duty to " +"take any action regarding: Failures, disruptions, errors, or delays in " +"processing that you may experience while using our Services; The risk of " +"failure of hardware, software, and Internet connections; The risk of " +"malicious software being introduced or found in the software underlying " +"the Taler Wallet; The risk that third parties may obtain unauthorized " +"access to information stored within your Taler Wallet, including, but not" +" limited to your Taler Wallet coins or backup encryption keys. You " +"release us from all liability related to any losses, damages, or claims " +"arising from:" +msgstr "" + +#: ../../tos.rst:164 +msgid "" +"user error such as forgotten passwords, incorrectly constructed " +"transactions;" +msgstr "" + +#: ../../tos.rst:166 +msgid "server failure or data loss;" +msgstr "" + +#: ../../tos.rst:167 +msgid "unauthorized access to the Taler Wallet application;" +msgstr "" + +#: ../../tos.rst:168 +msgid "bugs or other errors in the Taler Wallet software; and" +msgstr "" + +#: ../../tos.rst:169 +msgid "" +"any unauthorized third party activities, including, but not limited to, " +"the use of viruses, phishing, brute forcing, or other means of attack " +"against the Taler Wallet. We make no representations concerning any Third" +" Party Content contained in or accessed through our Services." +msgstr "" + +#: ../../tos.rst:174 +msgid "" +"Any other terms, conditions, warranties, or representations associated " +"with such content, are solely between you and such organizations and/or " +"individuals." +msgstr "" + +#: ../../tos.rst:179 +msgid "Limitation of liability" +msgstr "" + +#: ../../tos.rst:181 +msgid "" +"To the fullest extent permitted by applicable law, in no event will we or" +" any of our officers, directors, representatives, agents, servants, " +"counsel, employees, consultants, lawyers, and other personnel authorized " +"to act, acting, or purporting to act on our behalf (collectively the " +"“Taler Parties”) be liable to you under contract, tort, strict liability," +" negligence, or any other legal or equitable theory, for:" +msgstr "" + +#: ../../tos.rst:188 +msgid "" +"any lost profits, data loss, cost of procurement of substitute goods or " +"services, or direct, indirect, incidental, special, punitive, " +"compensatory, or consequential damages of any kind whatsoever resulting " +"from:" +msgstr "" + +#: ../../tos.rst:192 +msgid "your use of, or conduct in connection with, our services;" +msgstr "" + +#: ../../tos.rst:193 +msgid "" +"any unauthorized use of your wallet and/or private key due to your " +"failure to maintain the confidentiality of your wallet;" +msgstr "" + +#: ../../tos.rst:195 +msgid "any interruption or cessation of transmission to or from the services; or" +msgstr "" + +#: ../../tos.rst:196 +msgid "" +"any bugs, viruses, trojan horses, or the like that are found in the Taler" +" Wallet software or that may be transmitted to or through our services by" +" any third party (regardless of the source of origination), or" +msgstr "" + +#: ../../tos.rst:200 +msgid "any direct damages." +msgstr "" + +#: ../../tos.rst:202 +msgid "" +"These limitations apply regardless of legal theory, whether based on " +"tort, strict liability, breach of contract, breach of warranty, or any " +"other legal theory, and whether or not we were advised of the possibility" +" of such damages. Some jurisdictions do not allow the exclusion or " +"limitation of liability for consequential or incidental damages, so the " +"above limitation may not apply to you." +msgstr "" + +#: ../../tos.rst:210 +msgid "Warranty disclaimer" +msgstr "" + +#: ../../tos.rst:212 +msgid "" +"Our services are provided \"as is\" and without warranty of any kind. To " +"the maximum extent permitted by law, we disclaim all representations and " +"warranties, express or implied, relating to the services and underlying " +"software or any content on the services, whether provided or owned by us " +"or by any third party, including without limitation, warranties of " +"merchantability, fitness for a particular purpose, title, non-" +"infringement, freedom from computer virus, and any implied warranties " +"arising from course of dealing, course of performance, or usage in trade," +" all of which are expressly disclaimed. In addition, we do not represent " +"or warrant that the content accessible via the services is accurate, " +"complete, available, current, free of viruses or other harmful " +"components, or that the results of using the services will meet your " +"requirements. Some states do not allow the disclaimer of implied " +"warranties, so the foregoing disclaimers may not apply to you. This " +"paragraph gives you specific legal rights and you may also have other " +"legal rights that vary from state to state." +msgstr "" + +#: ../../tos.rst:229 +msgid "Indemntiy" +msgstr "" + +#: ../../tos.rst:231 +msgid "" +"To the extent permitted by applicable law, you agree to defend, " +"indemnify, and hold harmless the Taler Parties from and against any and " +"all claims, damages, obligations, losses, liabilities, costs or debt, and" +" expenses (including, but not limited to, attorney’s fees) arising from: " +"(a) your use of and access to the Services; (b) any feedback or " +"submissions you provide to us concerning the Taler Wallet; (c) your " +"violation of any term of this Agreement; or (d) your violation of any " +"law, rule, or regulation, or the rights of any third party." +msgstr "" + +#: ../../tos.rst:240 +msgid "Time limitation on claims" +msgstr "" + +#: ../../tos.rst:242 +msgid "" +"You agree that any claim you may have arising out of or related to your " +"relationship with us must be filed within one year after such claim " +"arises, otherwise, your claim in permanently barred." +msgstr "" + +#: ../../tos.rst:247 +msgid "Governing law" +msgstr "" + +#: ../../tos.rst:249 +msgid "" +"No matter where you’re located, the laws of Switzerland will govern these" +" Terms. If any provisions of these Terms are inconsistent with any " +"applicable law, those provisions will be superseded or modified only to " +"the extent such provisions are inconsistent. The parties agree to submit " +"to the ordinary courts in Zurich, Switzerland for exclusive jurisdiction " +"of any dispute arising out of or related to your use of the Services or " +"your breach of these Terms." +msgstr "" + +#: ../../tos.rst:258 +msgid "Termination" +msgstr "" + +#: ../../tos.rst:260 +msgid "" +"In the event of termination concerning your use of our Services, your " +"obligations under this Agreement will still continue." +msgstr "" + +#: ../../tos.rst:264 +msgid "Discontinuance of services" +msgstr "" + +#: ../../tos.rst:266 +msgid "" +"We may, in our sole discretion and without cost to you, with or without " +"prior notice, and at any time, modify or discontinue, temporarily or " +"permanently, any portion of our Services. We will use the Taler " +"protocol’s provisions to notify Wallets if our Services are to be " +"discontinued. It is your responsibility to ensure that the Taler Wallet " +"is online at least once every three months to observe these " +"notifications. We shall not be held responsible or liable for any loss of" +" funds in the event that we discontinue or depreciate the Services and " +"your Taler Wallet fails to transfer out the coins within a three months " +"notification period." +msgstr "" + +#: ../../tos.rst:277 +msgid "No waiver" +msgstr "" + +#: ../../tos.rst:279 +msgid "" +"Our failure to exercise or delay in exercising any right, power, or " +"privilege under this Agreement shall not operate as a waiver; nor shall " +"any single or partial exercise of any right, power, or privilege preclude" +" any other or further exercise thereof." +msgstr "" + +#: ../../tos.rst:285 +msgid "Severability" +msgstr "" + +#: ../../tos.rst:287 +msgid "" +"If it turns out that any part of this Agreement is invalid, void, or for " +"any reason unenforceable, that term will be deemed severable and limited " +"or eliminated to the minimum extent necessary." +msgstr "" + +#: ../../tos.rst:292 +msgid "Force majeure" +msgstr "" + +#: ../../tos.rst:294 +msgid "" +"We shall not be held liable for any delays, failure in performance, or " +"interruptions of service which result directly or indirectly from any " +"cause or condition beyond our reasonable control, including but not " +"limited to: any delay or failure due to any act of God, act of civil or " +"military authorities, act of terrorism, civil disturbance, war, strike or" +" other labor dispute, fire, interruption in telecommunications or " +"Internet services or network provider services, failure of equipment " +"and/or software, other catastrophe, or any other occurrence which is " +"beyond our reasonable control and shall not affect the validity and " +"enforceability of any remaining provisions." +msgstr "" + +#: ../../tos.rst:305 +msgid "Assignment" +msgstr "" + +#: ../../tos.rst:307 +msgid "" +"You agree that we may assign any of our rights and/or transfer, sub-" +"contract, or delegate any of our obligations under these Terms." +msgstr "" + +#: ../../tos.rst:311 +msgid "Entire agreement" +msgstr "" + +#: ../../tos.rst:313 +msgid "" +"This Agreement sets forth the entire understanding and agreement as to " +"the subject matter hereof and supersedes any and all prior discussions, " +"agreements, and understandings of any kind (including, without " +"limitation, any prior versions of this Agreement) and every nature " +"between us. Except as provided for above, any modification to this " +"Agreement must be in writing and must be signed by both parties." +msgstr "" + +#: ../../tos.rst:321 +msgid "Questions or comments" +msgstr "" + +#: ../../tos.rst:323 +msgid "" +"We welcome comments, questions, concerns, or suggestions. Please send us " +"a message on our contact page at legal@taler-systems.com." +msgstr "" + diff --git a/contrib/tos/tos.rst b/contrib/tos/tos.rst new file mode 100644 index 000000000..aff01001a --- /dev/null +++ b/contrib/tos/tos.rst @@ -0,0 +1,324 @@ +Terms Of Service +================ + +Last Updated: 12.4.2019 + +Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment service +through our Internet presence (collectively the “Services”). Before using our +Services, please read the Terms of Service (the “Terms” or the “Agreement”) +carefully. + +Overview +-------- + +This section provides a brief summary of the highlights of this +Agreement. Please note that when you accept this Agreement, you are accepting +all of the terms and conditions and not just this section. We and possibly +other third parties provide Internet services which interact with the Taler +Wallet’s self-hosted personal payment application. When using the Taler Wallet +to interact with our Services, you are agreeing to our Terms, so please read +carefully. + +Highlights: +~~~~~~~~~~~ + + • You are responsible for keeping the data in your Taler Wallet at all times + under your control. Any losses arising from you not being in control of + your private information are your problem. + • We will try to transfer funds we hold in escrow for our users to any legal + recipient to the best of our ability within the limitations of the law and + our implementation. However, the Services offered today are highly + experimental and the set of recipients of funds is severely restricted. + • For our Services, we may charge transaction fees. The specific fee structure + is provided based on the Taler protocol and should be shown to you when you + withdraw electronic coins using a Taler Wallet. You agree and understand + that the Taler protocol allows for the fee structure to change. + • You agree to not intentionally overwhelm our systems with requests and + follow responsible disclosure if you find security issues in our services. + • We cannot be held accountable for our Services not being available due to + circumstances beyond our control. If we modify or terminate our services, + we will try to give you the opportunity to recover your funds. However, + given the experimental state of the Services today, this may not be + possible. You are strongly advised to limit your use of the Service + to small-scale experiments expecting total loss of all funds. + +These terms outline approved uses of our Services. The Services and these +Terms are still at an experimental stage. If you have any questions or +comments related to this Agreement, please send us a message to +legal@taler-systems.com. If you do not agree to this Agreement, you must not +use our Services. + +How you accept this policy +-------------------------- + +By sending funds to us (to top-up your Taler Wallet), you acknowledge that you +have read, understood, and agreed to these Terms. We reserve the right to +change these Terms at any time. If you disagree with the change, we may in the +future offer you with an easy option to recover your unspent funds. However, +in the current experimental period you acknowledge that this feature is not +yet available, resulting in your funds being lost unless you accept the new +Terms. If you continue to use our Services other than to recover your unspent +funds, your continued use of our Services following any such change will +signify your acceptance to be bound by the then current Terms. Please check +the effective date above to determine if there have been any changes since you +have last reviewed these Terms. + +Services +-------- + +We will try to transfer funds that we hold in escrow for our users to any +legal recipient to the best of our ability and within the limitations of the +law and our implementation. However, the Services offered today are highly +experimental and the set of recipients of funds is severely restricted. The +Taler Wallet can be loaded by exchanging fiat currencies against electronic +coins. We are providing this exchange service. Once your Taler Wallet is +loaded with electronic coins they can be spent for purchases if the seller is +accepting Taler as a means of payment. We are not guaranteeing that any seller +is accepting Taler at all or a particular seller. The seller or recipient of +deposits of electronic coins must specify the target account, as per the +design of the Taler protocol. They are responsible for following the protocol +and specifying the correct bank account, and are solely liable for any losses +that may arise from specifying the wrong account. We will allow the government +to link wire transfers to the underlying contract hash. It is the +responsibility of recipients to preserve the full contracts and to pay +whatever taxes and charges may be applicable. Technical issues may lead to +situations where we are unable to make transfers at all or lead to incorrect +transfers that cannot be reversed. We will only refuse to execute transfers if +the transfers are prohibited by a competent legal authority and we are ordered +to do so. + +Fees +---- + +You agree to pay the fees for exchanges and withdrawals completed via the +Taler Wallet ("Fees") as defined by us, which we may change from time to +time. With the exception of wire transfer fees, Taler transaction fees are set +for any electronic coin at the time of withdrawal and fixed throughout the +validity period of the respective electronic coin. Your wallet should obtain +and display applicable fees when withdrawing funds. Fees for coins obtained as +change may differ from the fees applicable to the original coin. Wire transfer +fees that are independent from electronic coins may change annually. You +authorize us to charge or deduct applicable fees owed in connection with +deposits, exchanges and withdrawals following the rules of the Taler protocol. +We reserve the right to provide different types of rewards to users either in +the form of discount for our Services or in any other form at our discretion +and without prior notice to you. + +Eligibility +----------- + +To be eligible to use our Services, you must be able to form legally binding +contracts or have the permission of your legal guardian. By using our +Services, you represent and warrant that you meet all eligibility requirements +that we outline in these Terms. + +Financial self-responsibility +----------------------------- + +You will be responsible for maintaining the availability, integrity and +confidentiality of the data stored in your wallet. When you setup a Taler +Wallet, you are strongly advised to follow the precautionary measures offered +by the software to minimize the chances to losse access to or control over +your Wallet data. We will not be liable for any loss or damage arising from +your failure to comply with this paragraph. + +Copyrights and trademarks +------------------------- + +The Taler Wallet is released under the terms of the GNU General Public License +(GNU GPL). You have the right to access, use, and share the Taler Wallet, in +modified or unmodified form. However, the GPL is a strong copyleft license, +which means that any derivative works must be distributed under the same +license terms as the original software. If you have any questions, you should +review the GNU GPL’s full terms and conditions at +https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler” itself is a trademark +of Taler Systems SA. You are welcome to use the name in relation to processing +payments using the Taler protocol, assuming your use is compatible with an +official release from the GNU Project that is not older than two years. + +Your use of our services +------------------------ + +When using our Services, you agree to not take any action that intentionally +imposes an unreasonable load on our infrastructure. If you find security +problems in our Services, you agree to first report them to +security@taler-systems.com and grant us the right to publish your report. We +warrant that we will ourselves publicly disclose any issues reported within 3 +months, and that we will not prosecute anyone reporting security issues if +they did not exploit the issue beyond a proof-of-concept, and followed the +above responsible disclosure practice. + +Limitation of liability & disclaimer of warranties +-------------------------------------------------- + +You understand and agree that we have no control over, and no duty to take any +action regarding: Failures, disruptions, errors, or delays in processing that +you may experience while using our Services; The risk of failure of hardware, +software, and Internet connections; The risk of malicious software being +introduced or found in the software underlying the Taler Wallet; The risk that +third parties may obtain unauthorized access to information stored within your +Taler Wallet, including, but not limited to your Taler Wallet coins or backup +encryption keys. You release us from all liability related to any losses, +damages, or claims arising from: + +(a) user error such as forgotten passwords, incorrectly constructed + transactions; +(b) server failure or data loss; +(c) unauthorized access to the Taler Wallet application; +(d) bugs or other errors in the Taler Wallet software; and +(e) any unauthorized third party activities, including, but not limited to, + the use of viruses, phishing, brute forcing, or other means of attack + against the Taler Wallet. We make no representations concerning any + Third Party Content contained in or accessed through our Services. + +Any other terms, conditions, warranties, or representations associated with +such content, are solely between you and such organizations and/or +individuals. + +Limitation of liability +----------------------- + +To the fullest extent permitted by applicable law, in no event will we or any +of our officers, directors, representatives, agents, servants, counsel, +employees, consultants, lawyers, and other personnel authorized to act, +acting, or purporting to act on our behalf (collectively the “Taler Parties”) +be liable to you under contract, tort, strict liability, negligence, or any +other legal or equitable theory, for: + +(a) any lost profits, data loss, cost of procurement of substitute goods or + services, or direct, indirect, incidental, special, punitive, compensatory, + or consequential damages of any kind whatsoever resulting from: + + (i) your use of, or conduct in connection with, our services; + (ii) any unauthorized use of your wallet and/or private key due to your + failure to maintain the confidentiality of your wallet; + (iii) any interruption or cessation of transmission to or from the services; or + (iv) any bugs, viruses, trojan horses, or the like that are found in the Taler + Wallet software or that may be transmitted to or through our services by + any third party (regardless of the source of origination), or + +(b) any direct damages. + +These limitations apply regardless of legal theory, whether based on tort, +strict liability, breach of contract, breach of warranty, or any other legal +theory, and whether or not we were advised of the possibility of such +damages. Some jurisdictions do not allow the exclusion or limitation of +liability for consequential or incidental damages, so the above limitation may +not apply to you. + +Warranty disclaimer +------------------- + +Our services are provided "as is" and without warranty of any kind. To the +maximum extent permitted by law, we disclaim all representations and +warranties, express or implied, relating to the services and underlying +software or any content on the services, whether provided or owned by us or by +any third party, including without limitation, warranties of merchantability, +fitness for a particular purpose, title, non-infringement, freedom from +computer virus, and any implied warranties arising from course of dealing, +course of performance, or usage in trade, all of which are expressly +disclaimed. In addition, we do not represent or warrant that the content +accessible via the services is accurate, complete, available, current, free of +viruses or other harmful components, or that the results of using the services +will meet your requirements. Some states do not allow the disclaimer of +implied warranties, so the foregoing disclaimers may not apply to you. This +paragraph gives you specific legal rights and you may also have other legal +rights that vary from state to state. + +Indemntiy +--------- + +To the extent permitted by applicable law, you agree to defend, indemnify, and +hold harmless the Taler Parties from and against any and all claims, damages, +obligations, losses, liabilities, costs or debt, and expenses (including, but +not limited to, attorney’s fees) arising from: (a) your use of and access to +the Services; (b) any feedback or submissions you provide to us concerning the +Taler Wallet; (c) your violation of any term of this Agreement; or (d) your +violation of any law, rule, or regulation, or the rights of any third party. + +Time limitation on claims +------------------------- + +You agree that any claim you may have arising out of or related to your +relationship with us must be filed within one year after such claim arises, +otherwise, your claim in permanently barred. + +Governing law +------------- + +No matter where you’re located, the laws of Switzerland will govern these +Terms. If any provisions of these Terms are inconsistent with any applicable +law, those provisions will be superseded or modified only to the extent such +provisions are inconsistent. The parties agree to submit to the ordinary +courts in Zurich, Switzerland for exclusive jurisdiction of any dispute +arising out of or related to your use of the Services or your breach of these +Terms. + +Termination +----------- + +In the event of termination concerning your use of our Services, your +obligations under this Agreement will still continue. + +Discontinuance of services +-------------------------- + +We may, in our sole discretion and without cost to you, with or without prior +notice, and at any time, modify or discontinue, temporarily or permanently, +any portion of our Services. We will use the Taler protocol’s provisions to +notify Wallets if our Services are to be discontinued. It is your +responsibility to ensure that the Taler Wallet is online at least once every +three months to observe these notifications. We shall not be held responsible +or liable for any loss of funds in the event that we discontinue or depreciate +the Services and your Taler Wallet fails to transfer out the coins within a +three months notification period. + +No waiver +--------- + +Our failure to exercise or delay in exercising any right, power, or privilege +under this Agreement shall not operate as a waiver; nor shall any single or +partial exercise of any right, power, or privilege preclude any other or +further exercise thereof. + +Severability +------------ + +If it turns out that any part of this Agreement is invalid, void, or for any +reason unenforceable, that term will be deemed severable and limited or +eliminated to the minimum extent necessary. + +Force majeure +------------- + +We shall not be held liable for any delays, failure in performance, or +interruptions of service which result directly or indirectly from any cause or +condition beyond our reasonable control, including but not limited to: any +delay or failure due to any act of God, act of civil or military authorities, +act of terrorism, civil disturbance, war, strike or other labor dispute, fire, +interruption in telecommunications or Internet services or network provider +services, failure of equipment and/or software, other catastrophe, or any +other occurrence which is beyond our reasonable control and shall not affect +the validity and enforceability of any remaining provisions. + +Assignment +---------- + +You agree that we may assign any of our rights and/or transfer, sub-contract, +or delegate any of our obligations under these Terms. + +Entire agreement +---------------- + +This Agreement sets forth the entire understanding and agreement as to the +subject matter hereof and supersedes any and all prior discussions, +agreements, and understandings of any kind (including, without limitation, any +prior versions of this Agreement) and every nature between us. Except as +provided for above, any modification to this Agreement must be in writing and +must be signed by both parties. + +Questions or comments +--------------------- + +We welcome comments, questions, concerns, or suggestions. Please send us a +message on our contact page at legal@taler-systems.com. diff --git a/contrib/update-tos.sh b/contrib/update-tos.sh new file mode 100755 index 000000000..47d3af778 --- /dev/null +++ b/contrib/update-tos.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# This file is in the public domain + +# Should be called with the list of languages to generate, i.e. +# $ ./update-tos.sh en de fr it + +# Error checking on +set -eu +echo "Generating TOS for ETag $VERSION" + +rm -f sphinx.log sphinx.err +# We process inputs using Makefile in tos/ directory +cd tos +for l in $@ +do + mkdir -p $l + echo Generating TOS for language $l + # 'f' is for the supported formats, note that the 'make' target + # MUST match the file extension. + for f in html txt pdf epub xml + do + rm -rf _build + echo " Generating format $f" + make -e SPHINXOPTS="-D language='$l'" $f >>sphinx.log 2>>sphinx.err < /dev/null + mv _build/$f/tos.$f $l/${VERSION}.$f + done +done +cd .. From f1cbc109f7cb6908469f1b8de5a10accff95244e Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 7 Feb 2020 00:54:01 +0100 Subject: [PATCH 13/21] add proper i18n for pp --- configure.ac | 1 - contrib/Makefile.am | 19 +- contrib/pp/.gitignore | 3 + contrib/pp/Makefile.am | 11 - contrib/pp/README | 58 ++++ contrib/pp/conf.py | 282 ++++++++++++++++++ contrib/pp/en/0.docx | Bin 19110 -> 0 bytes contrib/pp/en/0.epub | Bin 0 -> 13772 bytes contrib/pp/en/0.html | 381 +++++++++++-------------- contrib/pp/en/0.pdf | Bin 0 -> 81244 bytes contrib/pp/en/0.txt | 174 ++++++++--- contrib/pp/en/0.xml | 167 +++++++++++ contrib/pp/locale/de/LC_MESSAGES/pp.po | 283 ++++++++++++++++++ contrib/pp/pp.rst | 176 ++++++++++++ contrib/update-pp.sh | 28 ++ 15 files changed, 1324 insertions(+), 259 deletions(-) create mode 100644 contrib/pp/.gitignore delete mode 100644 contrib/pp/Makefile.am create mode 100644 contrib/pp/README create mode 100644 contrib/pp/conf.py delete mode 100644 contrib/pp/en/0.docx create mode 100644 contrib/pp/en/0.epub create mode 100644 contrib/pp/en/0.pdf create mode 100644 contrib/pp/en/0.xml create mode 100644 contrib/pp/locale/de/LC_MESSAGES/pp.po create mode 100644 contrib/pp/pp.rst create mode 100755 contrib/update-pp.sh diff --git a/configure.ac b/configure.ac index 8b58bef05..58a209209 100644 --- a/configure.ac +++ b/configure.ac @@ -474,7 +474,6 @@ AM_CONDITIONAL([HAVE_TWISTER], [false]) AC_CONFIG_FILES([Makefile contrib/Makefile - contrib/pp/Makefile doc/Makefile doc/doxygen/Makefile src/Makefile diff --git a/contrib/Makefile.am b/contrib/Makefile.am index 5a165d1fb..eb4ad312d 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . pp +SUBDIRS = . # English (en) tosendir=$(pkgdatadir)/tos/en @@ -13,6 +13,13 @@ tosen_DATA = \ tos/en/0.xml \ tos/en/0.html +ppen_DATA = \ + pp/en/0.txt \ + pp/en/0.pdf \ + pp/en/0.epub \ + pp/en/0.xml \ + pp/en/0.html + bin_SCRIPTS = \ taler-bank-manage-testing \ taler-exchange-revoke @@ -21,11 +28,17 @@ EXTRA_DIST = \ $(bin_SCRIPTS) \ $(tosen_DATA) \ update-tos.sh \ + update-pp.sh \ tos/Makefile \ tos/README \ tos/tos.rst \ tos/conf.py \ tos/locale/de/LC_MESSAGES/tos.po \ + pp/Makefile \ + pp/README \ + pp/tos.rst \ + pp/conf.py \ + pp/locale/pp/LC_MESSAGES/pp.po \ auditor-report.tex.j2 \ coverage.sh \ gnunet.tag \ @@ -35,11 +48,15 @@ EXTRA_DIST = \ # Change the set of supported languages here. You should # also update tos'XX'data and EXTRA_DIST accordingly. TOS_LANGUAGES="en de" +PP_LANGUAGES="en de" # Change the terms-of-service version (Etag) to generate here! # This value should be incremented whenever there is a substantive # change in the original text (but not for the translations). TOS_VERSION=0 +PP_VERSION=0 update-tos: VERSION=$(TOS_VERSION) ./update-tos.sh $(TOS_LANGUAGES) +update-pp: + VERSION=$(PP_VERSION) ./update-pp.sh $(PP_LANGUAGES) diff --git a/contrib/pp/.gitignore b/contrib/pp/.gitignore new file mode 100644 index 000000000..fb83616eb --- /dev/null +++ b/contrib/pp/.gitignore @@ -0,0 +1,3 @@ +sphinx.err +sphinx.log +_build/ diff --git a/contrib/pp/Makefile.am b/contrib/pp/Makefile.am deleted file mode 100644 index 21326200c..000000000 --- a/contrib/pp/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ - -# English (en) -ppendir=$(pkgdatadir)/pp/en - -ppen_DATA = \ - en/0.txt \ - en/0.docx \ - en/0.html - -EXTRA_DIST = \ - $(ppen_DATA) diff --git a/contrib/pp/README b/contrib/pp/README new file mode 100644 index 000000000..e03b8a059 --- /dev/null +++ b/contrib/pp/README @@ -0,0 +1,58 @@ +This directory contains the privacy policy (template) for exchange +operators. + + +Dependencies +============ + +Generating a new Privacy Policy requires Sphinx, LaTeX with babel +packages for all supported languages. On Debian, you should +at least install: + +$ apt install python3-sphinx sphinx-intl texlive-lang-german texlive-lang-english + +(NOTE: List may be incomplete.) + + +Updating the Privacy Policy +=========================== + +The master file with the Privacy Policy is 'pp.rst'. + +If you make substantial changes, you MUST change the "PP_VERSION" +in contrib/Makefile.am to the new Etag. + +To begin the translation into other languages after editing the master +file, run + +$ make gettext + +to generate the master PO file. Then, run + +$ sphinx-intl update -p _build/locale/ -l de -l fr -l it + +to update the PO files for the various languages (extend the list of +languages as necessary). The PO files for the translators are kept +at locale/$LANG/LC_MESSAGES/pp.po for the language $LANG. + +Once all PO files have been updated with new translations, run + +$ make update-pp + +in the "contrib/" directory to generate all of the formats. The +respective make rule calls the '../update-pp.sh' script in the +contrib/ directory, which calls the 'Makefile' in the pp/ +directory for the various supported languages and file formats +and then moves the generated files to the target directory +('contrib/pp/$LANG/$VERSION.$FORMAT') + + +Adding a new language +===================== + +To add a new language $LANG, add $LANG to "PP_LANGUAGES" in +'contrib/Makefile.am' and run + +$ sphinx-intl update -p _build/gettext -l $LANG + +to generate the PO template. diff --git a/contrib/pp/conf.py b/contrib/pp/conf.py new file mode 100644 index 000000000..9acb9786a --- /dev/null +++ b/contrib/pp/conf.py @@ -0,0 +1,282 @@ +""" + This file is part of GNU TALER. + Copyright (C) 2014-2020 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU Lesser General Public License as published by the Free Software + Foundation; either version 2.1, 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License along with + TALER; see the file COPYING. If not, see + + @author Florian Dold + @author Benedikt Muller + @author Sree Harsha Totakura + @author Marcello Stanisci +""" +# -*- coding: utf-8 -*- +# +# neuro documentation build configuration file, created by +# sphinx-quickstart on Sat May 31 13:11:06 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +sys.path.append(os.path.abspath('_exts')) + +#import taler_sphinx_theme + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +needs_sphinx = '1.8.5' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.todo', + 'sphinx.ext.imgmath', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +source_suffix = { + '.rst': 'restructuredtext', +} + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'pp' + +# General information about the project. +project = u'pp' +copyright = u'2014-2020 Taler Systems SA (GPLv3+ or GFDL 1.3+)' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0' +# The full version, including alpha/beta/rc tags. +release = '0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = "en de" + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build', '_exts', 'cf', 'prebuilt'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# default_role = "ts:type" + +locale_dirs = ['locale/'] +gettext_compact = False + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'epub' + +#html_theme_path = taler_sphinx_theme.html_theme_path() + +#html_sidebars = {'**': ['logo-text.html', 'globaltoc.html', 'searchbox.html']} + +rst_epilog = "" + +html_show_sphinx = False + +html_theme_options = { + # Set the name of the project to appear in the sidebar + "relbar1": "false", + "footer": "false", +} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +html_title = "Taler Privacy Policy" + +# A shorter title for the navigation bar. Default is the same as html_title. +html_short_title = "Privacy Policy" + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + #'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('pp', 'pp.tex', + 'Privacy Policy', 'GNU Taler team', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# latex_appendices = ["fdl-1.3"] + +# If false, no module index is generated. +#latex_domain_indices = True + +# -- Options for manual page output --------------------------------------- + +# If true, show URL addresses after external links. +#man_show_urls = False + +# -- Options for Texinfo output ------------------------------------------- + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for epub output ---------------------------- + +epub_basename = "pp" + +epub_title = "Privacy Policy" diff --git a/contrib/pp/en/0.docx b/contrib/pp/en/0.docx deleted file mode 100644 index 2318396e40aff08e9b54bb99177ee9d5c18e8157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19110 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 diff --git a/contrib/pp/en/0.epub b/contrib/pp/en/0.epub new file mode 100644 index 0000000000000000000000000000000000000000..49669a4ac64b6864391402791a8960de2673245a GIT binary patch literal 13772 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%0D3rdtGRx+vqw$8HwLpD6b-9&1zsvtZ3|{ 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 Mhnp{F{p;@k0lBF!0RR91 literal 0 HcmV?d00001 diff --git a/contrib/pp/en/0.html b/contrib/pp/en/0.html index febe21e94..1e73557f5 100644 --- a/contrib/pp/en/0.html +++ b/contrib/pp/en/0.html @@ -1,217 +1,180 @@ - - - - - Our Privacy Policy - - - - -

Privacy Policy

-

- Last Updated: 11.12.2019 -

-

- This -Privacy Policy describes the policies and procedures of Taler Systems -SA (“we,” “our,” or “us”) pertaining to the collection, -use, and disclosure of your information on our sites and related -mobile applications and products we offer (the “Services” or -“Taler Wallet”). This Privacy Statement applies to your personal -data when you use our Services, and does not apply to online websites - or services that we do not own or control. -

+ + + + + Privacy Policy — Taler Privacy Policy + + + + + + + + -

OVERVIEW

- -

Your -privacy is important to us. We follow a few fundamental principles: -We don’t ask you for personally identifiable information (defined -below). That being said, your contact information, such as your phone -number, social media handle, or email address (depending on how you -contact us), may be collected when you communicate with us, for -example to report a bug or other error related to the Taler Wallet. -We don’t share your information with third parties except when -strictly required to deliver you our Services and products, or to -comply with the law. If you have any questions or concerns about this -policy, please reach out to us at privacy@taler-systems.net. -

- -

HOW YOU ACCEPT THIS POLICY

- -

By -using our Services or visiting our sites, you agree to the use, -disclosure, and procedures outlined in this Privacy Policy. -

- -

WHAT PERSONAL INFORMATION DO WE COLLECT FROM OUR USERS?

- -

The -information we collect from you falls into two categories: (i) -personally identifiable information (i.e., data that could -potentially identify you as an individual) (“Personal -Information”), and (ii) non-personally identifiable information -(i.e., information that cannot be used to identify who you are) -(“Non-Personal Information”). This Privacy Policy covers both -categories and will tell you how we might collect and use each type. -

-

We -do our best to not collect any Personal Information from Taler Wallet -users. We believe that the Taler Wallet never transmits personal -information to our services without at least clear implied consent, -and we only process and retain information with a strict business -need. That being said, when using our Services, we inherently have - to collect the following information: -

-

-