This commit is contained in:
Christian Grothoff 2020-02-11 15:40:37 +01:00
commit 3ad698d018
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
81 changed files with 4868 additions and 1264 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@
*app.info *app.info
*.gcno *.gcno
*.gcda *.gcda
*.mo
.dirstamp .dirstamp
doc/coverage/ doc/coverage/
doc/taler-exchange.cps doc/taler-exchange.cps

View File

@ -474,10 +474,8 @@ AM_CONDITIONAL([HAVE_TWISTER], [false])
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile
contrib/Makefile contrib/Makefile
contrib/pp/Makefile
contrib/tos/Makefile
doc/Makefile doc/Makefile
doc/doxygen/Makefile doc/doxygen/Makefile
src/Makefile src/Makefile
src/auditor/Makefile src/auditor/Makefile
src/auditordb/Makefile src/auditordb/Makefile

View File

@ -1,12 +1,62 @@
SUBDIRS = . tos pp SUBDIRS = .
# 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
ppen_DATA = \
pp/en/0.txt \
pp/en/0.pdf \
pp/en/0.epub \
pp/en/0.xml \
pp/en/0.html
bin_SCRIPTS = \ bin_SCRIPTS = \
taler-bank-manage-testing taler-bank-manage-testing \
taler-exchange-revoke
EXTRA_DIST = \ EXTRA_DIST = \
$(bin_SCRIPTS) \ $(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 \ auditor-report.tex.j2 \
coverage.sh \ coverage.sh \
gnunet.tag \ gnunet.tag \
microhttpd.tag \ microhttpd.tag \
render.py render.py
# 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)

3
contrib/pp/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
sphinx.err
sphinx.log
_build/

View File

@ -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)

58
contrib/pp/README Normal file
View File

@ -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.

282
contrib/pp/conf.py Normal file
View File

@ -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 <http://www.gnu.org/licenses/>
@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
# "<project> v<release> 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 <link> 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"

Binary file not shown.

BIN
contrib/pp/en/0.epub Normal file

Binary file not shown.

View File

@ -1,217 +1,180 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Our Privacy Policy</title>
<meta name="author" content="Michael Widmer"/>
<meta name="created" content="2019-12-11T15:01:00"/>
</head>
<body>
<h1>Privacy Policy</h1>
<p> <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
Last Updated: 11.12.2019 <head>
</p> <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<p> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
This <title>Privacy Policy &#8212; Taler Privacy Policy</title>
Privacy Policy describes the policies and procedures of Taler Systems <link rel="stylesheet" href="_static/epub.css" type="text/css" />
SA (“we,” “our,” or “us”) pertaining to the collection, <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
use, and disclosure of your information on our sites and related <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
mobile applications and products we offer (the “Services” or <script type="text/javascript" src="_static/jquery.js"></script>
“Taler Wallet”). This Privacy Statement applies to your personal <script type="text/javascript" src="_static/underscore.js"></script>
data when you use our Services, and does not apply to online websites <script type="text/javascript" src="_static/doctools.js"></script>
or services that we do not own or control. <script type="text/javascript" src="_static/language_data.js"></script>
</p> </head><body>
<h2>OVERVIEW</h2> <div class="document">
<div class="documentwrapper">
<p>Your <div class="bodywrapper">
privacy is important to us. We follow a few fundamental principles: <div class="body" role="main">
We dont ask you for personally identifiable information (defined
below). That being said, your contact information, such as your phone <div class="section" id="privacy-policy">
number, social media handle, or email address (depending on how you <h1>Privacy Policy<a class="headerlink" href="#privacy-policy" title="Permalink to this headline"></a></h1>
contact us), may be collected when you communicate with us, for <p>Last Updated: 11.12.2019</p>
example to report a bug or other error related to the Taler Wallet. <p>This Privacy Policy describes the policies and procedures of Taler Systems SA
We dont share your information with third parties except when (“we,” “our,” or “us”) pertaining to the collection, use, and disclosure of
strictly required to deliver you our Services and products, or to your information on our sites and related mobile applications and products we
comply with the law. If you have any questions or concerns about this offer (the “Services” or “Taler Wallet”). This Privacy Statement applies to
policy, please reach out to us at privacy@taler-systems.net. your personal data when you use our Services, and does not apply to online
</p> websites or services that we do not own or control.</p>
<div class="section" id="overview">
<h2>HOW YOU ACCEPT THIS POLICY</h2> <h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline"></a></h2>
<p>Your privacy is important to us. We follow a few fundamental principles: We
<p>By dont ask you for personally identifiable information (defined below). That
using our Services or visiting our sites, you agree to the use, being said, your contact information, such as your phone number, social media
disclosure, and procedures outlined in this Privacy Policy. handle, or email address (depending on how you contact us), may be collected
</p> when you communicate with us, for example to report a bug or other error
related to the Taler Wallet. We dont share your information with third
<h2>WHAT PERSONAL INFORMATION DO WE COLLECT FROM OUR USERS?</h2> 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
<p>The about this policy, please reach out to us at <a class="reference external" href="mailto:privacy&#37;&#52;&#48;taler-systems&#46;net">privacy<span>&#64;</span>taler-systems<span>&#46;</span>net</a>.</p>
information we collect from you falls into two categories: (i) </div>
personally identifiable information (i.e., data that could <div class="section" id="how-you-accept-this-policy">
potentially identify you as an individual) (“Personal <h2>How you accept this policy<a class="headerlink" href="#how-you-accept-this-policy" title="Permalink to this headline"></a></h2>
Information”), and (ii) non-personally identifiable information <p>By using our Services or visiting our sites, you agree to the use, disclosure,
(i.e., information that cannot be used to identify who you are) and procedures outlined in this Privacy Policy.</p>
(“Non-Personal Information”). This Privacy Policy covers both </div>
categories and will tell you how we might collect and use each type. <div class="section" id="what-personal-information-do-we-collect-from-our-users">
</p> <h2>What personal information do we collect from our users?<a class="headerlink" href="#what-personal-information-do-we-collect-from-our-users" title="Permalink to this headline"></a></h2>
<p>We <p>The information we collect from you falls into two categories: (i) personally
do our best to not collect any Personal Information from Taler Wallet identifiable information (i.e., data that could potentially identify you as an
users. We believe that the Taler Wallet never transmits personal individual) (“Personal Information”), and (ii) non-personally identifiable
information to our services without at least clear implied consent, information (i.e., information that cannot be used to identify who you are)
and we only process and retain information with a strict business (“Non-Personal Information”). This Privacy Policy covers both categories and
need. That being said, when using our Services, we inherently have will tell you how we might collect and use each type.</p>
to collect the following information: <p>We do our best to not collect any Personal Information from Taler Wallet
</p> users. We believe that the Taler Wallet never transmits personal information
<p> to our services without at least clear implied consent, and we only process
<ul> and retain information with a strict business need. That being said, when
<li>Bank using our Services, we inherently have to collect the following information:</p>
account details necessary when receiving funds from you to top-up <blockquote>
your wallet or to transfer funds to you when you are being paid via <div><ul class="simple">
Taler. At the current experimental stage, only the pseudonym and <li>Bank account details necessary when receiving funds from you to top-up your wallet or to transfer funds to you when you are being paid via Taler. At the current experimental stage, only the pseudonym and password you entered in the bank demonstrator is stored.</li>
password you entered in the bank demonstrator is stored.</p> <li>The amounts being withdrawn or deposited, with associated unique transaction identifiers and cryptographic signatures authorizing the transaction. Note that for purchases, we cannot identify the buyer from the collected data, so when you spend money, we only receive non-personal information.</li>
<li>The <li>When you contact us. We may collect certain information if you choose to contact us, for example to report a bug or other error with the Taler Wallet. This may include contact information such as your name, email address or phone number depending on the method you choose to contact us.</li>
amounts being withdrawn or deposited, with associated unique
transaction identifiers and cryptographic signatures authorizing the
transaction. Note that for purchases, we cannot identify the buyer
from the collected data, so when you spend money, we only receive
non-personal information.</p>
<li>When
you contact us. We may collect certain information if you choose to
contact us, for example to report a bug or other error with the
Taler Wallet. This may include contact information such as your
name, email address or phone number depending on the method you
choose to contact us. </p>
</ul> </ul>
</p> </div></blockquote>
<h2>HOW WE COLLECT AND PROCESS INFORMATION</h2> </div>
<div class="section" id="how-we-collect-and-process-information">
<h2>How we collect and process information<a class="headerlink" href="#how-we-collect-and-process-information" title="Permalink to this headline"></a></h2>
<p>We may process your information for the following reasons:</p> <p>We may process your information for the following reasons:</p>
<p> <blockquote>
<ul> <div><ul class="simple">
<li>to <li>to transfer money as specified by our users (Taler transactions);</li>
transfer money as specified by our users (Taler transactions);</p> <li>to assist government entities in linking income to the underlying contract</li>
<li>to <li>to support you using the Taler Wallet or to improve our Services</li>
assist government entities in linking income to the underlying contract</p>
<li>to
support you using the Taler Wallet or to improve our Services</p>
</ul> </ul>
</p> </div></blockquote>
</div>
<div class="section" id="how-we-share-and-use-the-information-we-gather">
<h2>How we share and use the information we gather<a class="headerlink" href="#how-we-share-and-use-the-information-we-gather" title="Permalink to this headline"></a></h2>
<p>We may share your Personal Data or other information about you only if you are
a merchant receiving income, with your bank, to the degree necessary to
execute the payment.</p>
<p>We retain Personal Data to transfer funds to the accounts designated by our
users. We may retain Personal Data only for as long as mandated by law and
required for the wire transfers.</p>
<p>We primarily use the limited information we receive directly from you to
enhance the Taler Wallet. Some ways we may use your Personal Information are
to: Contact you when necessary to respond to your comments, answer your
questions, or obtain additional information on issues related to bugs or
errors with the Taler Wallet that you reported.</p>
</div>
<div class="section" id="agents-or-third-party-partners">
<h2>Agents or third party partners<a class="headerlink" href="#agents-or-third-party-partners" title="Permalink to this headline"></a></h2>
<p>We may provide your Personal Information to our employees, contractors,
agents, service providers, and designees (“Agents”) to enable them to perform
certain services for us exclusively, including: improvement and maintenance of
our software and Services. By accepting this Privacy Policy, as outlined
above, you consent to any such transfer.</p>
</div>
<div class="section" id="protection-of-us-and-others">
<h2>Protection of us and others<a class="headerlink" href="#protection-of-us-and-others" title="Permalink to this headline"></a></h2>
<p>We reserve the right to access, read, preserve, and disclose any information
that we reasonably believe is necessary to comply with the law or a court
order.</p>
</div>
<div class="section" id="what-personal-information-can-i-access-or-change">
<h2>What personal information can I access or change?<a class="headerlink" href="#what-personal-information-can-i-access-or-change" title="Permalink to this headline"></a></h2>
<p>You can request access to the information we have collected from you. You can
do this by contacting us at <a class="reference external" href="mailto:privacy&#37;&#52;&#48;taler-systems&#46;net">privacy<span>&#64;</span>taler-systems<span>&#46;</span>net</a>. We will make sure to
provide you with a copy of the data we process about you. To comply with your
request, we may ask you to verify your identity. We will fulfill your request
by sending your copy electronically. For any subsequent access request, we may
charge you with an administrative fee. If you believe that the information we
have collected is incorrect, you are welcome to contact us so we can update it
and keep your data accurate. Any data that is no longer needed for purposes
specified in the “How We Use the Information We Gather” section will be
deleted after ninety (90) days.</p>
</div>
<div class="section" id="data-retention">
<h2>Data retention<a class="headerlink" href="#data-retention" title="Permalink to this headline"></a></h2>
<p>If you uninstall the Taler Wallet mobile applications from your device, or
request that your information be deleted, we still may retain some information
that you have provided to us to maintain the Taler Wallet or to comply with
relevant laws.</p>
</div>
<div class="section" id="data-security">
<h2>Data security<a class="headerlink" href="#data-security" title="Permalink to this headline"></a></h2>
<p>We are committed to making sure your information is protected. We employ
several physical and electronic safeguards to keep your information safe,
including encrypted user passwords, two factor verification and authentication
on passwords where possible, and securing connections with industry standard
transport layer security. You are also welcome to contact us using GnuPG
encrypted e-mail. Even with all these precautions, we cannot fully guarantee
against the access, disclosure, alteration, or deletion of data through
events, including but not limited to hardware or software failure or
unauthorized use. Any information that you provide to us is done so entirely
at your own risk.</p>
</div>
<div class="section" id="changes-and-updates-to-privacy-policy">
<h2>Changes and updates to privacy policy<a class="headerlink" href="#changes-and-updates-to-privacy-policy" title="Permalink to this headline"></a></h2>
<p>We reserve the right to update and revise this privacy policy at any time. We
occasionally review this Privacy Policy to make sure it complies with
applicable laws and conforms to changes in our business. We may need to update
this Privacy Policy, and we reserve the right to do so at any time. If we do
revise this Privacy Policy, we will update the “Effective Date” at the bottom
of this page so that you can tell if it has changed since your last visit. As
we generally do not collect contact information and also do not track your
visits, we will not be able to notify you directly. However, the Taler Wallet
may inform you about a change in the privacy policy once it detects that the
policy has changed. Please review this Privacy Policy regularly to ensure that
you are aware of its terms. Any use of our Services after an amendment to our
Privacy Policy constitutes your acceptance to the revised or amended
agreement.</p>
</div>
<div class="section" id="international-users-and-visitors">
<h2>International users and visitors<a class="headerlink" href="#international-users-and-visitors" title="Permalink to this headline"></a></h2>
<p>Our Services are hosted in Switzerland. If you are a user accessing the
Services from the European Union, Asia, US, or any other region with laws or
regulations governing personal data collection, use, and disclosure that
differ from Swiss laws, please be advised that through your continued use of
the Services, which is governed by Swiss law, you are transferring your
Personal Information to Switzerland and you consent to that transfer.</p>
</div>
<div class="section" id="questions">
<h2>Questions<a class="headerlink" href="#questions" title="Permalink to this headline"></a></h2>
<p>Please contact us at <a class="reference external" href="mailto:privacy&#37;&#52;&#48;taler-systems&#46;net">privacy<span>&#64;</span>taler-systems<span>&#46;</span>net</a> if you have questions about our
privacy practices that are not addressed in this Privacy Statement.</p>
</div>
</div>
<h2>HOW WE SHARE AND USE THE INFORMATION WE GATHER</h2>
<p>We </div>
may share your Personal Data or other information about you only if </div>
you are a merchant receiving income, with your bank, to the degree </div>
necessary to execute the payment.</p> <div class="clearer"></div>
<p>We </div>
retain Personal Data to transfer funds to the accounts designated by </body>
our users. We may retain Personal Data only for as long as mandated </html>
by law and required for the wire transfers.</p>
<p>We
primarily use the limited information we receive directly from you to
enhance the Taler Wallet. Some ways we may use your Personal
Information are to: Contact you when necessary to respond to your
comments, answer your questions, or obtain additional information on
issues related to bugs or errors with the Taler Wallet that you
reported.</p>
<h2>AGENTS OR THIRD PARTY PARTNERS</h2>
<p>We
may provide your Personal Information to our employees, contractors,
agents, service providers, and designees (“Agents”) to enable
them to perform certain services for us exclusively, including:
improvement and maintenance of our software and Services. By
accepting this Privacy Policy, as outlined above, you consent to any
such transfer.
</p>
<h2>PROTECTION OF US AND OTHERS</h2>
<p>We
reserve the right to access, read, preserve, and disclose any
information that we reasonably believe is necessary to comply with
the law or a court order.
</p>
<h2>WHAT PERSONAL INFORMATION CAN I ACCESS OR CHANGE?</h2>
<p>You
can request access to the information we have collected from you. You
can do this by contacting us at privacy@taler-systems.net. We will
make sure to provide you with a copy of the data we process about
you. To comply with your request, we may ask you to verify your
identity. We will fulfill your request by sending your copy
electronically. For any subsequent access request, we may charge you
with an administrative fee. If you believe that the information we
have collected is incorrect, you are welcome to contact us so we can
update it and keep your data accurate. Any data that is no longer
needed for purposes specified in the “How We Use the Information We
Gather” section will be deleted after ninety (90) days.
</p>
<h2>DATA RETENTION</h2>
<p>If
you uninstall the Taler Wallet mobile applications from your device,
or request that your information be deleted, we still may retain some
information that you have provided to us to maintain the Taler Wallet
or to comply with relevant laws.
</p>
<h2>DATA SECURITY</h2>
<p>We are committed to making sure your information
is protected. We employ several physical and electronic safeguards to
keep your information safe, including encrypted user passwords, two
factor verification and authentication on passwords where possible,
and securing connections with industry standard transport layer
security. You are also welcome to contact us using GnuPG encrypted
e-mail. Even with all these precautions, we cannot fully guarantee
against the access, disclosure, alteration, or deletion of data
through events, including but not limited to hardware or software
failure or unauthorized use. Any information that you provide to us
is done so entirely at your own risk.</p>
<h2>CHANGES AND UPDATES TO PRIVACY POLICY</p>
<p>We
reserve the right to update and revise this privacy policy at any
time. We occasionally review this Privacy Policy to make sure it
complies with applicable laws and conforms to changes in our
business. We may need to update this Privacy Policy, and we reserve
the right to do so at any time. If we do revise this Privacy Policy,
we will update the “Effective Date” at the bottom of this page so
that you can tell if it has changed since your last visit. As we
generally do not collect contact information and also do not track
your visits, we will not be able to notify you directly. However, the
Taler Wallet may inform you about a change in the privacy policy once
it detects that the policy has changed. Please review this Privacy
Policy regularly to ensure that you are aware of its terms. Any use
of our Services after an amendment to our Privacy Policy constitutes
your acceptance to the revised or amended agreement.
</p>
<h2>INTERNATIONAL USERS AND VISITORS</h2>
<p>Our
Services are hosted in Switzerland. If you are a user accessing the
Services from the European Union, Asia, US, or any other region with
laws or regulations governing personal data collection, use, and
disclosure that differ from Swiss laws, please be advised that
through your continued use of the Services, which is governed by
Swiss law, you are transferring your Personal Information to
Switzerland and you consent to that transfer.
</p>
<h2>QUESTIONS</h2>
<p>Please
contact us at privacy@taler-systems.net if you have questions about
our privacy practices that are not addressed in this Privacy
Statement.
</p>
</body>
</html>

BIN
contrib/pp/en/0.pdf Normal file

Binary file not shown.

View File

@ -1,102 +1,202 @@
'''Privacy Policy''' Privacy Policy
**************
Last Updated: 11.12.2019 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. 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.
OVERVIEW Overview
======== ========
Your privacy is important to us. We follow a few fundamental principles: We dont 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 dont 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. Your privacy is important to us. We follow a few fundamental
principles: We dont 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 dont 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 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. 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? 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. 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: 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:
* Bank account details necessary when receiving funds from you to top-up your wallet or to transfer funds to you when you are being paid via Taler. At the current experimental stage, only the pseudonym and password you entered in the bank demonstrator is stored. * Bank account details necessary when receiving funds from you to
top-up your wallet or to transfer funds to you when you are being
paid via Taler. At the current experimental stage, only the
pseudonym and password you entered in the bank demonstrator is
stored.
* The amounts being withdrawn or deposited, with associated unique transaction identifiers and cryptographic signatures authorizing the transaction. Note that for purchases, we cannot identify the buyer from the collected data, so when you spend money, we only receive non-personal information. * The amounts being withdrawn or deposited, with associated unique
transaction identifiers and cryptographic signatures authorizing
the transaction. Note that for purchases, we cannot identify the
buyer from the collected data, so when you spend money, we only
receive non-personal information.
* When you contact us. We may collect certain information if you choose to contact us, for example to report a bug or other error with the Taler Wallet. This may include contact information such as your name, email address or phone number depending on the method you choose to contact us. * When you contact us. We may collect certain information if you
choose to contact us, for example to report a bug or other error
with the Taler Wallet. This may include contact information such
as your name, email address or phone number depending on the
method you choose to contact us.
HOW WE COLLECT AND PROCESS INFORMATION How we collect and process information
====================================== ======================================
We may process your information for the following reasons: We may process your information for the following reasons:
* to transfer money as specified by our users (Taler transactions); * to transfer money as specified by our users (Taler transactions);
* to assist government entities in linking income to the underlying contract * to assist government entities in linking income to the underlying
contract
* to support you using the Taler Wallet or to improve our Services * to support you using the Taler Wallet or to improve our Services
HOW WE SHARE AND USE THE INFORMATION WE GATHER How we share and use the information we gather
============================================== ==============================================
We may share your Personal Data or other information about you only if you are a merchant receiving income, with your bank, to the degree necessary to execute the payment. We may share your Personal Data or other information about you only if
you are a merchant receiving income, with your bank, to the degree
necessary to execute the payment.
We retain Personal Data to transfer funds to the accounts designated by our users. We may retain Personal Data only for as long as mandated by law and required for the wire transfers. We retain Personal Data to transfer funds to the accounts designated
by our users. We may retain Personal Data only for as long as mandated
by law and required for the wire transfers.
We primarily use the limited information we receive directly from you to enhance the Taler Wallet. Some ways we may use your Personal Information are to: Contact you when necessary to respond to your comments, answer your questions, or obtain additional information on issues related to bugs or errors with the Taler Wallet that you reported. We primarily use the limited information we receive directly from you
to enhance the Taler Wallet. Some ways we may use your Personal
Information are to: Contact you when necessary to respond to your
comments, answer your questions, or obtain additional information on
issues related to bugs or errors with the Taler Wallet that you
reported.
AGENTS OR THIRD PARTY PARTNERS Agents or third party partners
============================== ==============================
We may provide your Personal Information to our employees, contractors, agents, service providers, and designees (“Agents”) to enable them to perform certain services for us exclusively, including: improvement and maintenance of our software and Services. By accepting this Privacy Policy, as outlined above, you consent to any such transfer. We may provide your Personal Information to our employees,
contractors, agents, service providers, and designees (“Agents”) to
enable them to perform certain services for us exclusively, including:
improvement and maintenance of our software and Services. By accepting
this Privacy Policy, as outlined above, you consent to any such
transfer.
PROTECTION OF US AND OTHERS Protection of us and others
=========================== ===========================
We reserve the right to access, read, preserve, and disclose any information that we reasonably believe is necessary to comply with the law or a court order. We reserve the right to access, read, preserve, and disclose any
information that we reasonably believe is necessary to comply with the
law or a court order.
WHAT PERSONAL INFORMATION CAN I ACCESS OR CHANGE? What personal information can I access or change?
================================================= =================================================
You can request access to the information we have collected from you. You can do this by contacting us at privacy@taler-systems.net. We will make sure to provide you with a copy of the data we process about you. To comply with your request, we may ask you to verify your identity. We will fulfill your request by sending your copy electronically. For any subsequent access request, we may charge you with an administrative fee. If you believe that the information we have collected is incorrect, you are welcome to contact us so we can update it and keep your data accurate. Any data that is no longer needed for purposes specified in the “How We Use the Information We Gather” section will be deleted after ninety (90) days. You can request access to the information we have collected from you.
You can do this by contacting us at privacy@taler-systems.net. We will
make sure to provide you with a copy of the data we process about you.
To comply with your request, we may ask you to verify your identity.
We will fulfill your request by sending your copy electronically. For
any subsequent access request, we may charge you with an
administrative fee. If you believe that the information we have
collected is incorrect, you are welcome to contact us so we can update
it and keep your data accurate. Any data that is no longer needed for
purposes specified in the “How We Use the Information We Gather”
section will be deleted after ninety (90) days.
DATA RETENTION Data retention
============== ==============
If you uninstall the Taler Wallet mobile applications from your device, or request that your information be deleted, we still may retain some information that you have provided to us to maintain the Taler Wallet or to comply with relevant laws. If you uninstall the Taler Wallet mobile applications from your
device, or request that your information be deleted, we still may
retain some information that you have provided to us to maintain the
Taler Wallet or to comply with relevant laws.
DATA SECURITY Data security
============= =============
We are committed to making sure your information is protected. We employ several physical and electronic safeguards to keep your information safe, including encrypted user passwords, two factor verification and authentication on passwords where possible, and securing connections with industry standard transport layer security. You are also welcome to contact us using GnuPG encrypted e-mail. Even with all these precautions, we cannot fully guarantee against the access, disclosure, alteration, or deletion of data through events, including but not limited to hardware or software failure or unauthorized use. Any information that you provide to us is done so entirely at your own risk. We are committed to making sure your information is protected. We
employ several physical and electronic safeguards to keep your
information safe, including encrypted user passwords, two factor
verification and authentication on passwords where possible, and
securing connections with industry standard transport layer security.
You are also welcome to contact us using GnuPG encrypted e-mail. Even
with all these precautions, we cannot fully guarantee against the
access, disclosure, alteration, or deletion of data through events,
including but not limited to hardware or software failure or
unauthorized use. Any information that you provide to us is done so
entirely at your own risk.
CHANGES AND UPDATES TO PRIVACY POLICY Changes and updates to privacy policy
===================================== =====================================
We reserve the right to update and revise this privacy policy at any time. We occasionally review this Privacy Policy to make sure it complies with applicable laws and conforms to changes in our business. We may need to update this Privacy Policy, and we reserve the right to do so at any time. If we do revise this Privacy Policy, we will update the “Effective Date” at the bottom of this page so that you can tell if it has changed since your last visit. As we generally do not collect contact information and also do not track your visits, we will not be able to notify you directly. However, the Taler Wallet may inform you about a change in the privacy policy once it detects that the policy has changed. Please review this Privacy Policy regularly to ensure that you are aware of its terms. Any use of our Services after an amendment to our Privacy Policy constitutes your acceptance to the revised or amended agreement. We reserve the right to update and revise this privacy policy at any
time. We occasionally review this Privacy Policy to make sure it
complies with applicable laws and conforms to changes in our business.
We may need to update this Privacy Policy, and we reserve the right to
do so at any time. If we do revise this Privacy Policy, we will update
the “Effective Date” at the bottom of this page so that you can tell
if it has changed since your last visit. As we generally do not
collect contact information and also do not track your visits, we will
not be able to notify you directly. However, the Taler Wallet may
inform you about a change in the privacy policy once it detects that
the policy has changed. Please review this Privacy Policy regularly to
ensure that you are aware of its terms. Any use of our Services after
an amendment to our Privacy Policy constitutes your acceptance to the
revised or amended agreement.
INTERNATIONAL USERS AND VISITORS International users and visitors
================================ ================================
Our Services are hosted in Switzerland. If you are a user accessing the Services from the European Union, Asia, US, or any other region with laws or regulations governing personal data collection, use, and disclosure that differ from Swiss laws, please be advised that through your continued use of the Services, which is governed by Swiss law, you are transferring your Personal Information to Switzerland and you consent to that transfer. Our Services are hosted in Switzerland. If you are a user accessing
the Services from the European Union, Asia, US, or any other region
with laws or regulations governing personal data collection, use, and
disclosure that differ from Swiss laws, please be advised that through
your continued use of the Services, which is governed by Swiss law,
you are transferring your Personal Information to Switzerland and you
consent to that transfer.
QUESTIONS Questions
========= =========
Please contact us at privacy@taler-systems.net if you have questions about our privacy practices that are not addressed in this Privacy Statement. Please contact us at privacy@taler-systems.net if you have questions
about our privacy practices that are not addressed in this Privacy
Statement.

167
contrib/pp/en/0.xml Normal file
View File

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document PUBLIC "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML" "http://docutils.sourceforge.net/docs/ref/docutils.dtd">
<!-- Generated by Docutils 0.14 -->
<document source="/home/grothoff/research/taler/exchange/contrib/pp/pp.rst">
<section ids="privacy-policy" names="privacy\ policy">
<title>Privacy Policy</title>
<paragraph>Last Updated: 11.12.2019</paragraph>
<paragraph>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.</paragraph>
<section ids="overview" names="overview">
<title>Overview</title>
<paragraph>Your privacy is important to us. We follow a few fundamental principles: We
dont 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 dont 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 <reference refuri="mailto:privacy@taler-systems.net">privacy@taler-systems.net</reference>.</paragraph>
</section>
<section ids="how-you-accept-this-policy" names="how\ you\ accept\ this\ policy">
<title>How you accept this policy</title>
<paragraph>By using our Services or visiting our sites, you agree to the use, disclosure,
and procedures outlined in this Privacy Policy.</paragraph>
</section>
<section ids="what-personal-information-do-we-collect-from-our-users" names="what\ personal\ information\ do\ we\ collect\ from\ our\ users?">
<title>What personal information do we collect from our users?</title>
<paragraph>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.</paragraph>
<paragraph>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:</paragraph>
<block_quote>
<bullet_list bullet="*">
<list_item>
<paragraph>Bank account details necessary when receiving funds from you to top-up your wallet or to transfer funds to you when you are being paid via Taler. At the current experimental stage, only the pseudonym and password you entered in the bank demonstrator is stored.</paragraph>
</list_item>
<list_item>
<paragraph>The amounts being withdrawn or deposited, with associated unique transaction identifiers and cryptographic signatures authorizing the transaction. Note that for purchases, we cannot identify the buyer from the collected data, so when you spend money, we only receive non-personal information.</paragraph>
</list_item>
<list_item>
<paragraph>When you contact us. We may collect certain information if you choose to contact us, for example to report a bug or other error with the Taler Wallet. This may include contact information such as your name, email address or phone number depending on the method you choose to contact us.</paragraph>
</list_item>
</bullet_list>
</block_quote>
</section>
<section ids="how-we-collect-and-process-information" names="how\ we\ collect\ and\ process\ information">
<title>How we collect and process information</title>
<paragraph>We may process your information for the following reasons:</paragraph>
<block_quote>
<bullet_list bullet="*">
<list_item>
<paragraph>to transfer money as specified by our users (Taler transactions);</paragraph>
</list_item>
<list_item>
<paragraph>to assist government entities in linking income to the underlying contract</paragraph>
</list_item>
<list_item>
<paragraph>to support you using the Taler Wallet or to improve our Services</paragraph>
</list_item>
</bullet_list>
</block_quote>
</section>
<section ids="how-we-share-and-use-the-information-we-gather" names="how\ we\ share\ and\ use\ the\ information\ we\ gather">
<title>How we share and use the information we gather</title>
<paragraph>We may share your Personal Data or other information about you only if you are
a merchant receiving income, with your bank, to the degree necessary to
execute the payment.</paragraph>
<paragraph>We retain Personal Data to transfer funds to the accounts designated by our
users. We may retain Personal Data only for as long as mandated by law and
required for the wire transfers.</paragraph>
<paragraph>We primarily use the limited information we receive directly from you to
enhance the Taler Wallet. Some ways we may use your Personal Information are
to: Contact you when necessary to respond to your comments, answer your
questions, or obtain additional information on issues related to bugs or
errors with the Taler Wallet that you reported.</paragraph>
</section>
<section ids="agents-or-third-party-partners" names="agents\ or\ third\ party\ partners">
<title>Agents or third party partners</title>
<paragraph>We may provide your Personal Information to our employees, contractors,
agents, service providers, and designees (“Agents”) to enable them to perform
certain services for us exclusively, including: improvement and maintenance of
our software and Services. By accepting this Privacy Policy, as outlined
above, you consent to any such transfer.</paragraph>
</section>
<section ids="protection-of-us-and-others" names="protection\ of\ us\ and\ others">
<title>Protection of us and others</title>
<paragraph>We reserve the right to access, read, preserve, and disclose any information
that we reasonably believe is necessary to comply with the law or a court
order.</paragraph>
</section>
<section ids="what-personal-information-can-i-access-or-change" names="what\ personal\ information\ can\ i\ access\ or\ change?">
<title>What personal information can I access or change?</title>
<paragraph>You can request access to the information we have collected from you. You can
do this by contacting us at <reference refuri="mailto:privacy@taler-systems.net">privacy@taler-systems.net</reference>. We will make sure to
provide you with a copy of the data we process about you. To comply with your
request, we may ask you to verify your identity. We will fulfill your request
by sending your copy electronically. For any subsequent access request, we may
charge you with an administrative fee. If you believe that the information we
have collected is incorrect, you are welcome to contact us so we can update it
and keep your data accurate. Any data that is no longer needed for purposes
specified in the “How We Use the Information We Gather” section will be
deleted after ninety (90) days.</paragraph>
</section>
<section ids="data-retention" names="data\ retention">
<title>Data retention</title>
<paragraph>If you uninstall the Taler Wallet mobile applications from your device, or
request that your information be deleted, we still may retain some information
that you have provided to us to maintain the Taler Wallet or to comply with
relevant laws.</paragraph>
</section>
<section ids="data-security" names="data\ security">
<title>Data security</title>
<paragraph>We are committed to making sure your information is protected. We employ
several physical and electronic safeguards to keep your information safe,
including encrypted user passwords, two factor verification and authentication
on passwords where possible, and securing connections with industry standard
transport layer security. You are also welcome to contact us using GnuPG
encrypted e-mail. Even with all these precautions, we cannot fully guarantee
against the access, disclosure, alteration, or deletion of data through
events, including but not limited to hardware or software failure or
unauthorized use. Any information that you provide to us is done so entirely
at your own risk.</paragraph>
</section>
<section ids="changes-and-updates-to-privacy-policy" names="changes\ and\ updates\ to\ privacy\ policy">
<title>Changes and updates to privacy policy</title>
<paragraph>We reserve the right to update and revise this privacy policy at any time. We
occasionally review this Privacy Policy to make sure it complies with
applicable laws and conforms to changes in our business. We may need to update
this Privacy Policy, and we reserve the right to do so at any time. If we do
revise this Privacy Policy, we will update the “Effective Date” at the bottom
of this page so that you can tell if it has changed since your last visit. As
we generally do not collect contact information and also do not track your
visits, we will not be able to notify you directly. However, the Taler Wallet
may inform you about a change in the privacy policy once it detects that the
policy has changed. Please review this Privacy Policy regularly to ensure that
you are aware of its terms. Any use of our Services after an amendment to our
Privacy Policy constitutes your acceptance to the revised or amended
agreement.</paragraph>
</section>
<section ids="international-users-and-visitors" names="international\ users\ and\ visitors">
<title>International users and visitors</title>
<paragraph>Our Services are hosted in Switzerland. If you are a user accessing the
Services from the European Union, Asia, US, or any other region with laws or
regulations governing personal data collection, use, and disclosure that
differ from Swiss laws, please be advised that through your continued use of
the Services, which is governed by Swiss law, you are transferring your
Personal Information to Switzerland and you consent to that transfer.</paragraph>
</section>
<section ids="questions" names="questions">
<title>Questions</title>
<paragraph>Please contact us at <reference refuri="mailto:privacy@taler-systems.net">privacy@taler-systems.net</reference> if you have questions about our
privacy practices that are not addressed in this Privacy Statement.</paragraph>
</section>
</section>
</document>

View File

@ -0,0 +1,283 @@
# 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 pp package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pp 0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-02-07 00:51+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"
#: ../../pp.rst:2
msgid "Privacy Policy"
msgstr ""
#: ../../pp.rst:4
msgid "Last Updated: 11.12.2019"
msgstr ""
#: ../../pp.rst:6
msgid ""
"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."
msgstr ""
#: ../../pp.rst:15
msgid "Overview"
msgstr ""
#: ../../pp.rst:17
msgid ""
"Your privacy is important to us. We follow a few fundamental principles: "
"We dont 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 dont 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."
msgstr ""
#: ../../pp.rst:29
msgid "How you accept this policy"
msgstr ""
#: ../../pp.rst:31
msgid ""
"By using our Services or visiting our sites, you agree to the use, "
"disclosure, and procedures outlined in this Privacy Policy."
msgstr ""
#: ../../pp.rst:36
msgid "What personal information do we collect from our users?"
msgstr ""
#: ../../pp.rst:38
msgid ""
"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."
msgstr ""
#: ../../pp.rst:45
msgid ""
"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:"
msgstr ""
#: ../../pp.rst:51
msgid ""
"Bank account details necessary when receiving funds from you to top-up "
"your wallet or to transfer funds to you when you are being paid via "
"Taler. At the current experimental stage, only the pseudonym and password"
" you entered in the bank demonstrator is stored."
msgstr ""
#: ../../pp.rst:53
msgid ""
"The amounts being withdrawn or deposited, with associated unique "
"transaction identifiers and cryptographic signatures authorizing the "
"transaction. Note that for purchases, we cannot identify the buyer from "
"the collected data, so when you spend money, we only receive non-personal"
" information."
msgstr ""
#: ../../pp.rst:55
msgid ""
"When you contact us. We may collect certain information if you choose to "
"contact us, for example to report a bug or other error with the Taler "
"Wallet. This may include contact information such as your name, email "
"address or phone number depending on the method you choose to contact us."
msgstr ""
#: ../../pp.rst:59
msgid "How we collect and process information"
msgstr ""
#: ../../pp.rst:61
msgid "We may process your information for the following reasons:"
msgstr ""
#: ../../pp.rst:63
msgid "to transfer money as specified by our users (Taler transactions);"
msgstr ""
#: ../../pp.rst:64
msgid "to assist government entities in linking income to the underlying contract"
msgstr ""
#: ../../pp.rst:65
msgid "to support you using the Taler Wallet or to improve our Services"
msgstr ""
#: ../../pp.rst:69
msgid "How we share and use the information we gather"
msgstr ""
#: ../../pp.rst:71
msgid ""
"We may share your Personal Data or other information about you only if "
"you are a merchant receiving income, with your bank, to the degree "
"necessary to execute the payment."
msgstr ""
#: ../../pp.rst:75
msgid ""
"We retain Personal Data to transfer funds to the accounts designated by "
"our users. We may retain Personal Data only for as long as mandated by "
"law and required for the wire transfers."
msgstr ""
#: ../../pp.rst:79
msgid ""
"We primarily use the limited information we receive directly from you to "
"enhance the Taler Wallet. Some ways we may use your Personal Information "
"are to: Contact you when necessary to respond to your comments, answer "
"your questions, or obtain additional information on issues related to "
"bugs or errors with the Taler Wallet that you reported."
msgstr ""
#: ../../pp.rst:87
msgid "Agents or third party partners"
msgstr ""
#: ../../pp.rst:89
msgid ""
"We may provide your Personal Information to our employees, contractors, "
"agents, service providers, and designees (“Agents”) to enable them to "
"perform certain services for us exclusively, including: improvement and "
"maintenance of our software and Services. By accepting this Privacy "
"Policy, as outlined above, you consent to any such transfer."
msgstr ""
#: ../../pp.rst:97
msgid "Protection of us and others"
msgstr ""
#: ../../pp.rst:99
msgid ""
"We reserve the right to access, read, preserve, and disclose any "
"information that we reasonably believe is necessary to comply with the "
"law or a court order."
msgstr ""
#: ../../pp.rst:105
msgid "What personal information can I access or change?"
msgstr ""
#: ../../pp.rst:107
msgid ""
"You can request access to the information we have collected from you. You"
" can do this by contacting us at privacy@taler-systems.net. We will make "
"sure to provide you with a copy of the data we process about you. To "
"comply with your request, we may ask you to verify your identity. We will"
" fulfill your request by sending your copy electronically. For any "
"subsequent access request, we may charge you with an administrative fee. "
"If you believe that the information we have collected is incorrect, you "
"are welcome to contact us so we can update it and keep your data "
"accurate. Any data that is no longer needed for purposes specified in the"
" “How We Use the Information We Gather” section will be deleted after "
"ninety (90) days."
msgstr ""
#: ../../pp.rst:120
msgid "Data retention"
msgstr ""
#: ../../pp.rst:122
msgid ""
"If you uninstall the Taler Wallet mobile applications from your device, "
"or request that your information be deleted, we still may retain some "
"information that you have provided to us to maintain the Taler Wallet or "
"to comply with relevant laws."
msgstr ""
#: ../../pp.rst:129
msgid "Data security"
msgstr ""
#: ../../pp.rst:131
msgid ""
"We are committed to making sure your information is protected. We employ "
"several physical and electronic safeguards to keep your information safe,"
" including encrypted user passwords, two factor verification and "
"authentication on passwords where possible, and securing connections with"
" industry standard transport layer security. You are also welcome to "
"contact us using GnuPG encrypted e-mail. Even with all these precautions,"
" we cannot fully guarantee against the access, disclosure, alteration, or"
" deletion of data through events, including but not limited to hardware "
"or software failure or unauthorized use. Any information that you provide"
" to us is done so entirely at your own risk."
msgstr ""
#: ../../pp.rst:144
msgid "Changes and updates to privacy policy"
msgstr ""
#: ../../pp.rst:146
msgid ""
"We reserve the right to update and revise this privacy policy at any "
"time. We occasionally review this Privacy Policy to make sure it complies"
" with applicable laws and conforms to changes in our business. We may "
"need to update this Privacy Policy, and we reserve the right to do so at "
"any time. If we do revise this Privacy Policy, we will update the "
"“Effective Date” at the bottom of this page so that you can tell if it "
"has changed since your last visit. As we generally do not collect contact"
" information and also do not track your visits, we will not be able to "
"notify you directly. However, the Taler Wallet may inform you about a "
"change in the privacy policy once it detects that the policy has changed."
" Please review this Privacy Policy regularly to ensure that you are aware"
" of its terms. Any use of our Services after an amendment to our Privacy "
"Policy constitutes your acceptance to the revised or amended agreement."
msgstr ""
#: ../../pp.rst:162
msgid "International users and visitors"
msgstr ""
#: ../../pp.rst:164
msgid ""
"Our Services are hosted in Switzerland. If you are a user accessing the "
"Services from the European Union, Asia, US, or any other region with laws"
" or regulations governing personal data collection, use, and disclosure "
"that differ from Swiss laws, please be advised that through your "
"continued use of the Services, which is governed by Swiss law, you are "
"transferring your Personal Information to Switzerland and you consent to "
"that transfer."
msgstr ""
#: ../../pp.rst:173
msgid "Questions"
msgstr ""
#: ../../pp.rst:175
msgid ""
"Please contact us at privacy@taler-systems.net if you have questions "
"about our privacy practices that are not addressed in this Privacy "
"Statement."
msgstr ""

176
contrib/pp/pp.rst Normal file
View File

@ -0,0 +1,176 @@
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.
Overview
--------
Your privacy is important to us. We follow a few fundamental principles: We
dont 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 dont 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:
* Bank account details necessary when receiving funds from you to top-up your wallet or to transfer funds to you when you are being paid via Taler. At the current experimental stage, only the pseudonym and password you entered in the bank demonstrator is stored.
* The amounts being withdrawn or deposited, with associated unique transaction identifiers and cryptographic signatures authorizing the transaction. Note that for purchases, we cannot identify the buyer from the collected data, so when you spend money, we only receive non-personal information.
* When you contact us. We may collect certain information if you choose to contact us, for example to report a bug or other error with the Taler Wallet. This may include contact information such as your name, email address or phone number depending on the method you choose to contact us.
How we collect and process information
--------------------------------------
We may process your information for the following reasons:
* to transfer money as specified by our users (Taler transactions);
* to assist government entities in linking income to the underlying contract
* to support you using the Taler Wallet or to improve our Services
How we share and use the information we gather
----------------------------------------------
We may share your Personal Data or other information about you only if you are
a merchant receiving income, with your bank, to the degree necessary to
execute the payment.
We retain Personal Data to transfer funds to the accounts designated by our
users. We may retain Personal Data only for as long as mandated by law and
required for the wire transfers.
We primarily use the limited information we receive directly from you to
enhance the Taler Wallet. Some ways we may use your Personal Information are
to: Contact you when necessary to respond to your comments, answer your
questions, or obtain additional information on issues related to bugs or
errors with the Taler Wallet that you reported.
Agents or third party partners
------------------------------
We may provide your Personal Information to our employees, contractors,
agents, service providers, and designees (“Agents”) to enable them to perform
certain services for us exclusively, including: improvement and maintenance of
our software and Services. By accepting this Privacy Policy, as outlined
above, you consent to any such transfer.
Protection of us and others
---------------------------
We reserve the right to access, read, preserve, and disclose any information
that we reasonably believe is necessary to comply with the law or a court
order.
What personal information can I access or change?
-------------------------------------------------
You can request access to the information we have collected from you. You can
do this by contacting us at privacy@taler-systems.net. We will make sure to
provide you with a copy of the data we process about you. To comply with your
request, we may ask you to verify your identity. We will fulfill your request
by sending your copy electronically. For any subsequent access request, we may
charge you with an administrative fee. If you believe that the information we
have collected is incorrect, you are welcome to contact us so we can update it
and keep your data accurate. Any data that is no longer needed for purposes
specified in the “How We Use the Information We Gather” section will be
deleted after ninety (90) days.
Data retention
--------------
If you uninstall the Taler Wallet mobile applications from your device, or
request that your information be deleted, we still may retain some information
that you have provided to us to maintain the Taler Wallet or to comply with
relevant laws.
Data security
-------------
We are committed to making sure your information is protected. We employ
several physical and electronic safeguards to keep your information safe,
including encrypted user passwords, two factor verification and authentication
on passwords where possible, and securing connections with industry standard
transport layer security. You are also welcome to contact us using GnuPG
encrypted e-mail. Even with all these precautions, we cannot fully guarantee
against the access, disclosure, alteration, or deletion of data through
events, including but not limited to hardware or software failure or
unauthorized use. Any information that you provide to us is done so entirely
at your own risk.
Changes and updates to privacy policy
-------------------------------------
We reserve the right to update and revise this privacy policy at any time. We
occasionally review this Privacy Policy to make sure it complies with
applicable laws and conforms to changes in our business. We may need to update
this Privacy Policy, and we reserve the right to do so at any time. If we do
revise this Privacy Policy, we will update the “Effective Date” at the bottom
of this page so that you can tell if it has changed since your last visit. As
we generally do not collect contact information and also do not track your
visits, we will not be able to notify you directly. However, the Taler Wallet
may inform you about a change in the privacy policy once it detects that the
policy has changed. Please review this Privacy Policy regularly to ensure that
you are aware of its terms. Any use of our Services after an amendment to our
Privacy Policy constitutes your acceptance to the revised or amended
agreement.
International users and visitors
--------------------------------
Our Services are hosted in Switzerland. If you are a user accessing the
Services from the European Union, Asia, US, or any other region with laws or
regulations governing personal data collection, use, and disclosure that
differ from Swiss laws, please be advised that through your continued use of
the Services, which is governed by Swiss law, you are transferring your
Personal Information to Switzerland and you consent to that transfer.
Questions
---------
Please contact us at privacy@taler-systems.net if you have questions about our
privacy practices that are not addressed in this Privacy Statement.

View File

@ -10,6 +10,12 @@
set -eu set -eu
if [ "$#" -ne 3 ];
then
echo "illegal number of parameters"
exit 1
fi
# Ensure starting accounts exist # Ensure starting accounts exist
taler-bank-manage -c $1 --with-db $2 django provide_accounts taler-bank-manage -c $1 --with-db $2 django provide_accounts
taler-bank-manage -c $1 --with-db $2 django add_bank_account 42 taler-bank-manage -c $1 --with-db $2 django add_bank_account 42

24
contrib/taler-exchange-revoke Executable file
View File

@ -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 -SIGUSR1 $EXCHANGE_PID
exit 0

3
contrib/tos/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
sphinx.err
sphinx.log
_build/

109
contrib/tos/Makefile Normal file
View File

@ -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 <target>' where <target> 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."

View File

@ -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)

58
contrib/tos/README Normal file
View File

@ -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.

282
contrib/tos/conf.py Normal file
View File

@ -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 <http://www.gnu.org/licenses/>
@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
# "<project> v<release> 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 <link> 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"

Binary file not shown.

BIN
contrib/tos/en/0.epub Normal file

Binary file not shown.

View File

@ -1,364 +1,337 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title></title>
<meta name="author" content="Michael Widmer"/>
<meta name="created" content="2019-12-01T07:06:00"/>
<meta name="changed" content="2019-12-04T00:01:19.809905379"/>
</head>
<body lang="en">
<h1>Terms Of Service - Last Updated: 12.4.2019</h1>
<p>
Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment service <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Terms Of Service &#8212; Taler Terms of Service</title>
<link rel="stylesheet" href="_static/epub.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="terms-of-service">
<h1>Terms Of Service<a class="headerlink" href="#terms-of-service" title="Permalink to this headline"></a></h1>
<p>Last Updated: 12.4.2019</p>
<p>Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment service
through our Internet presence (collectively the “Services”). Before using our through our Internet presence (collectively the “Services”). Before using our
Services, please read the Terms of Service (the “Terms” or the “Agreement”) Services, please read the Terms of Service (the “Terms” or the “Agreement”)
carefully. carefully.</p>
</p> <div class="section" id="overview">
<h2>Overview</h2> <h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline"></a></h2>
<p> <p>This section provides a brief summary of the highlights of this
This Agreement. Please note that when you accept this Agreement, you are accepting
section provides a brief summary of the highlights of this Agreement. all of the terms and conditions and not just this section. We and possibly
Please note that when you accept this Agreement, you are accepting other third parties provide Internet services which interact with the Taler
all of the terms and conditions and not just this section. We and Wallets self-hosted personal payment application. When using the Taler Wallet
possibly other third parties provide Internet services which interact to interact with our Services, you are agreeing to our Terms, so please read
with the Taler Wallets self-hosted personal payment application. carefully.</p>
When using the Taler Wallet to interact with our Services, you are <div class="section" id="highlights">
agreeing to our Terms, so please read carefully. <h3>Highlights:<a class="headerlink" href="#highlights" title="Permalink to this headline"></a></h3>
</p> <blockquote>
<p>Highlights: <div><ul class="simple">
<ul> <li>You are responsible for keeping the data in your Taler Wallet at all times
<li>You under your control. Any losses arising from you not being in control of
are responsible for keeping the data in your Taler Wallet at all your private information are your problem.</li>
times under your control. Any losses arising from you not being in <li>We will try to transfer funds we hold in escrow for our users to any legal
control of your private information are your problem. recipient to the best of our ability within the limitations of the law and
<li>We our implementation. However, the Services offered today are highly
will try to transfer funds we hold in escrow for our users to any experimental and the set of recipients of funds is severely restricted.</li>
legal recipient to the best of our ability within the limitations of <li>For our Services, we may charge transaction fees. The specific fee structure
the law and our implementation. However, the Services offered today is provided based on the Taler protocol and should be shown to you when you
are highly experimental and the set of recipients of funds is withdraw electronic coins using a Taler Wallet. You agree and understand
severely restricted. that the Taler protocol allows for the fee structure to change.</li>
<li>For <li>You agree to not intentionally overwhelm our systems with requests and
our Services, we may charge transaction fees. The specific fee follow responsible disclosure if you find security issues in our services.</li>
structure is provided based on the Taler protocol and should be <li>We cannot be held accountable for our Services not being available due to
shown to you when you withdraw electronic coins using a Taler circumstances beyond our control. If we modify or terminate our services,
Wallet. You agree and understand that the Taler protocol allows for we will try to give you the opportunity to recover your funds. However,
the fee structure to change. given the experimental state of the Services today, this may not be
<li>You possible. You are strongly advised to limit your use of the Service
agree to not intentionally overwhelm our systems with requests and to small-scale experiments expecting total loss of all funds.</li>
follow responsible disclosure if you find security issues in our </ul>
services. </div></blockquote>
<li>We <p>These terms outline approved uses of our Services. The Services and these
cannot be held accountable for our Services not being available due Terms are still at an experimental stage. If you have any questions or
to circumstances beyond our control. If we modify or terminate our comments related to this Agreement, please send us a message to
services, we will try to give you the opportunity to recover your <a class="reference external" href="mailto:legal&#37;&#52;&#48;taler-systems&#46;com">legal<span>&#64;</span>taler-systems<span>&#46;</span>com</a>. If you do not agree to this Agreement, you must not
funds. However, given the experimental state of the Services today, use our Services.</p>
this may not be possible. You are strongly advised to limit your use </div>
of the Service to small-scale experiments expecting total loss of </div>
all funds. <div class="section" id="how-you-accept-this-policy">
</ul></p> <h2>How you accept this policy<a class="headerlink" href="#how-you-accept-this-policy" title="Permalink to this headline"></a></h2>
<p>These <p>By sending funds to us (to top-up your Taler Wallet), you acknowledge that you
terms outline approved uses of our Services. The Services and these have read, understood, and agreed to these Terms. We reserve the right to
Terms are still at an experimental stage. If you have any questions change these Terms at any time. If you disagree with the change, we may in the
or comments related to this Agreement, please send us a message to future offer you with an easy option to recover your unspent funds. However,
legal@taler-systems.com. If you do not agree to this Agreement, you in the current experimental period you acknowledge that this feature is not
must not use our Services. yet available, resulting in your funds being lost unless you accept the new
</p> Terms. If you continue to use our Services other than to recover your unspent
<h2>How you accept this policy</h2> funds, your continued use of our Services following any such change will
<p>By signify your acceptance to be bound by the then current Terms. Please check
sending funds to us (to top-up your Taler Wallet), you acknowledge the effective date above to determine if there have been any changes since you
that you have read, understood, and agreed to these Terms. We reserve have last reviewed these Terms.</p>
the right to change these Terms at any time. If you disagree with the </div>
change, we may in the future offer you with an easy option to recover <div class="section" id="services">
your unspent funds. However, in the current experimental period you <h2>Services<a class="headerlink" href="#services" title="Permalink to this headline"></a></h2>
acknowledge that this feature is not yet available, resulting in your <p>We will try to transfer funds that we hold in escrow for our users to any
funds being lost unless you accept the new Terms. If you continue to legal recipient to the best of our ability and within the limitations of the
use our Services other than to recover your unspent funds, your law and our implementation. However, the Services offered today are highly
continued use of our Services following any such change will signify experimental and the set of recipients of funds is severely restricted. The
your acceptance to be bound by the then current Terms. Please check Taler Wallet can be loaded by exchanging fiat currencies against electronic
the effective date above to determine if there have been any changes coins. We are providing this exchange service. Once your Taler Wallet is
since you have last reviewed these Terms.</p> loaded with electronic coins they can be spent for purchases if the seller is
<h2>Services</h2> accepting Taler as a means of payment. We are not guaranteeing that any seller
<p>We is accepting Taler at all or a particular seller. The seller or recipient of
will try to transfer funds that we hold in escrow for our users to deposits of electronic coins must specify the target account, as per the
any legal recipient to the best of our ability and within the design of the Taler protocol. They are responsible for following the protocol
limitations of the law and our implementation. However, the Services and specifying the correct bank account, and are solely liable for any losses
offered today are highly experimental and the set of recipients of that may arise from specifying the wrong account. We will allow the government
funds is severely restricted.</p> to link wire transfers to the underlying contract hash. It is the
<p>The responsibility of recipients to preserve the full contracts and to pay
Taler Wallet can be loaded by exchanging fiat currencies against whatever taxes and charges may be applicable. Technical issues may lead to
electronic coins. We are providing this exchange service. Once your situations where we are unable to make transfers at all or lead to incorrect
Taler Wallet is loaded with electronic coins they can be spent for transfers that cannot be reversed. We will only refuse to execute transfers if
purchases if the seller is accepting Taler as a means of payment. We the transfers are prohibited by a competent legal authority and we are ordered
are not guaranteeing that any seller is accepting Taler at all or a to do so.</p>
particular seller.</p> </div>
<p>The <div class="section" id="fees">
seller or recipient of deposits of electronic coins must specify the <h2>Fees<a class="headerlink" href="#fees" title="Permalink to this headline"></a></h2>
target account, as per the design of the Taler protocol. They are <p>You agree to pay the fees for exchanges and withdrawals completed via the
responsible for following the protocol and specifying the correct Taler Wallet (“Fees”) as defined by us, which we may change from time to
bank account, and are solely liable for any losses that may arise time. With the exception of wire transfer fees, Taler transaction fees are set
from specifying the wrong account. We will allow the government to for any electronic coin at the time of withdrawal and fixed throughout the
link wire transfers to the underlying contract hash. It is the validity period of the respective electronic coin. Your wallet should obtain
responsibility of recipients to preserve the full contracts and to and display applicable fees when withdrawing funds. Fees for coins obtained as
pay whatever taxes and charges may be applicable. Technical issues change may differ from the fees applicable to the original coin. Wire transfer
may lead to situations where we are unable to make transfers at all fees that are independent from electronic coins may change annually. You
or lead to incorrect transfers that cannot be reversed. We will only authorize us to charge or deduct applicable fees owed in connection with
refuse to execute transfers if the transfers are prohibited by a deposits, exchanges and withdrawals following the rules of the Taler protocol.
competent legal authority and we are ordered to do so.</p> We reserve the right to provide different types of rewards to users either in
<p lang="en" class="western" style="margin-bottom: 0.19in; line-height: 100%"> the form of discount for our Services or in any other form at our discretion
<br/> and without prior notice to you.</p>
<br/> </div>
<div class="section" id="eligibility">
</p> <h2>Eligibility<a class="headerlink" href="#eligibility" title="Permalink to this headline"></a></h2>
<h2>FEES</h2> <p>To be eligible to use our Services, you must be able to form legally binding
<p>You contracts or have the permission of your legal guardian. By using our
agree to pay the fees for exchanges and withdrawals completed via the Services, you represent and warrant that you meet all eligibility requirements
Taler Wallet (&quot;Fees&quot;) as defined by us, which we may change that we outline in these Terms.</p>
from time to time. With the exception of wire transfer fees, Taler </div>
transaction fees are set for any electronic coin at the time of <div class="section" id="financial-self-responsibility">
withdrawal and fixed throughout the validity period of the respective <h2>Financial self-responsibility<a class="headerlink" href="#financial-self-responsibility" title="Permalink to this headline"></a></h2>
electronic coin. Your wallet should obtain and display applicable <p>You will be responsible for maintaining the availability, integrity and
fees when withdrawing funds. Fees for coins obtained as change may confidentiality of the data stored in your wallet. When you setup a Taler
differ from the fees applicable to the original coin. Wire transfer Wallet, you are strongly advised to follow the precautionary measures offered
fees that are independent from electronic coins may change annually. by the software to minimize the chances to losse access to or control over
</p> your Wallet data. We will not be liable for any loss or damage arising from
<p>You your failure to comply with this paragraph.</p>
authorize us to charge or deduct applicable fees owed in connection </div>
with deposits, exchanges and withdrawals following the rules of the <div class="section" id="copyrights-and-trademarks">
Taler protocol.</p> <h2>Copyrights and trademarks<a class="headerlink" href="#copyrights-and-trademarks" title="Permalink to this headline"></a></h2>
<p>We <p>The Taler Wallet is released under the terms of the GNU General Public License
reserve the right to provide different types of rewards to users (GNU GPL). You have the right to access, use, and share the Taler Wallet, in
either in the form of discount for our Services or in any other form modified or unmodified form. However, the GPL is a strong copyleft license,
at our discretion and without prior notice to you.</p> which means that any derivative works must be distributed under the same
<h2>ELIGIBILITY</h2> license terms as the original software. If you have any questions, you should
<p>To review the GNU GPLs full terms and conditions at
be eligible to use our Services, you must be able to form legally <a class="reference external" href="https://www.gnu.org/licenses/gpl-3.0.en.html">https://www.gnu.org/licenses/gpl-3.0.en.html</a>. “Taler” itself is a trademark
binding contracts or have the permission of your legal guardian. By of Taler Systems SA. You are welcome to use the name in relation to processing
using our Services, you represent and warrant that you meet all payments using the Taler protocol, assuming your use is compatible with an
eligibility requirements that we outline in these Terms. official release from the GNU Project that is not older than two years.</p>
</p> </div>
<p>FINANCIAL SELF-RESPONSIBILITY</p> <div class="section" id="your-use-of-our-services">
<p>You <h2>Your use of our services<a class="headerlink" href="#your-use-of-our-services" title="Permalink to this headline"></a></h2>
will be responsible for maintaining the availability, integrity and <p>When using our Services, you agree to not take any action that intentionally
confidentiality of the data stored in your wallet. When you setup a imposes an unreasonable load on our infrastructure. If you find security
Taler Wallet, you are strongly advised to follow the precautionary problems in our Services, you agree to first report them to
measures offered by the software to minimize the chances to losse <a class="reference external" href="mailto:security&#37;&#52;&#48;taler-systems&#46;com">security<span>&#64;</span>taler-systems<span>&#46;</span>com</a> and grant us the right to publish your report. We
access to or control over your Wallet data. We will not be liable for warrant that we will ourselves publicly disclose any issues reported within 3
any loss or damage arising from your failure to comply with this months, and that we will not prosecute anyone reporting security issues if
paragraph. they did not exploit the issue beyond a proof-of-concept, and followed the
</p> above responsible disclosure practice.</p>
<h2>COPYRIGHTS and TRADEMARKS</h2> </div>
<p>The <div class="section" id="limitation-of-liability-disclaimer-of-warranties">
Taler Wallet is released under the terms of the GNU General Public <h2>Limitation of liability &amp; disclaimer of warranties<a class="headerlink" href="#limitation-of-liability-disclaimer-of-warranties" title="Permalink to this headline"></a></h2>
License (GNU GPL). You have the right to access, use, and share the <p>You understand and agree that we have no control over, and no duty to take any
Taler Wallet, in modified or unmodified form. However, the GPL is a action regarding: Failures, disruptions, errors, or delays in processing that
strong copyleft license, which means that any derivative works must you may experience while using our Services; The risk of failure of hardware,
be distributed under the same license terms as the original software. software, and Internet connections; The risk of malicious software being
If you have any questions, you should review the GNU GPLs full introduced or found in the software underlying the Taler Wallet; The risk that
terms and conditions at https://www.gnu.org/licenses/gpl-3.0.en.html. third parties may obtain unauthorized access to information stored within your
</p> Taler Wallet, including, but not limited to your Taler Wallet coins or backup
<p>"Taler" encryption keys. You release us from all liability related to any losses,
itself is a trademark of Taler Systems SA. You are welcome to use the damages, or claims arising from:</p>
name in relation to processing payments using the Taler protocol, <ol class="loweralpha simple">
assuming your use is compatible with an official release from the GNU <li>user error such as forgotten passwords, incorrectly constructed
Project that is not older than two years.
</p>
<h2>YOUR USE OF OUR SERVICES</h2>
<p>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 <a href="mailto:security@taler-systems.com">security@taler-systems.com</a>
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.</p>
<h2>LIMITATION OF LIABILITY &amp; DISCLAIMER OF WARRANTIES</h2>
<p>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.
</p>
<p>You
release us from all liability related to any losses, damages, or
claims arising from:
<ol>
<li>user error such as forgotten passwords, incorrectly constructed
transactions;</li> transactions;</li>
<li>server failure or data loss;</li> <li>server failure or data loss;</li>
<li>unauthorized access to the Taler Wallet application;</li> <li>unauthorized access to the Taler Wallet application;</li>
<li>bugs or other errors in the Taler Wallet software; and</li> <li>bugs or other errors in the Taler Wallet software; and</li>
<li>any unauthorized third party activities, including, but not limited <li>any unauthorized third party activities, including, but not limited to,
to, the use of viruses, phishing, brute forcing, or other means of the use of viruses, phishing, brute forcing, or other means of attack
attack against the Taler Wallet. We make no representations against the Taler Wallet. We make no representations concerning any
concerning any Third Party Content contained in or accessed through Third Party Content contained in or accessed through our Services.</li>
our Services.</li> </ol>
</ol> <p>Any other terms, conditions, warranties, or representations associated with
</p> such content, are solely between you and such organizations and/or
Any individuals.</p>
other terms, conditions, warranties, or representations associated </div>
with such content, are solely between you and such organizations <div class="section" id="limitation-of-liability">
and/or individuals. <h2>Limitation of liability<a class="headerlink" href="#limitation-of-liability" title="Permalink to this headline"></a></h2>
</p> <p>To the fullest extent permitted by applicable law, in no event will we or any
<h2>LIMITATION OF LIABILITY</h2> of our officers, directors, representatives, agents, servants, counsel,
</p> employees, consultants, lawyers, and other personnel authorized to act,
<p>To acting, or purporting to act on our behalf (collectively the “Taler Parties”)
the fullest extent permitted by applicable law, in no event will we be liable to you under contract, tort, strict liability, negligence, or any
or any of our officers, directors, representatives, agents, servants, other legal or equitable theory, for:</p>
counsel, employees, consultants, lawyers, and other personnel <ol class="loweralpha simple">
authorized to act, acting, or purporting to act on our behalf <li>any lost profits, data loss, cost of procurement of substitute goods or
(collectively the “Taler Parties”) be liable to you under services, or direct, indirect, incidental, special, punitive, compensatory,
contract, tort, strict liability, negligence, or any other legal or or consequential damages of any kind whatsoever resulting from:</li>
equitable theory, for: </ol>
<ol> <blockquote>
<li> <div><ol class="lowerroman simple">
any lost profits, data loss, cost of procurement of substitute goods <li>your use of, or conduct in connection with, our services;</li>
or services, or direct, indirect, incidental, special, punitive, <li>any unauthorized use of your wallet and/or private key due to your
compensatory, or consequential damages of any kind whatsoever
resulting from:
<ol>
<li>
your use of, or conduct in connection with, our services;</li>
<li>
any unauthorized use of your wallet and/or private key due to your
failure to maintain the confidentiality of your wallet;</li> failure to maintain the confidentiality of your wallet;</li>
<li>any interruption or cessation of transmission to or from the <li>any interruption or cessation of transmission to or from the services; or</li>
services; or</li> <li>any bugs, viruses, trojan horses, or the like that are found in the Taler
<li>any bugs, viruses, trojan horses, or the like that are found in the Wallet software or that may be transmitted to or through our services by
Taler Wallet software or that may be transmitted to or through our any third party (regardless of the source of origination), or</li>
services by any third party (regardless of the source of
origination)</li>
</ol> </ol>
<li>or any direct damages.</li> </div></blockquote>
<ol class="loweralpha simple" start="2">
<li>any direct damages.</li>
</ol> </ol>
</p> <p>These limitations apply regardless of legal theory, whether based on tort,
<p>These strict liability, breach of contract, breach of warranty, or any other legal
limitations apply regardless of legal theory, whether based on tort, theory, and whether or not we were advised of the possibility of such
strict liability, breach of contract, breach of warranty, or any damages. Some jurisdictions do not allow the exclusion or limitation of
other legal theory, and whether or not we were advised of the liability for consequential or incidental damages, so the above limitation may
possibility of such damages. Some jurisdictions do not allow the not apply to you.</p>
exclusion or limitation of liability for consequential or incidental </div>
damages, so the above limitation may not apply to you. <div class="section" id="warranty-disclaimer">
</p> <h2>Warranty disclaimer<a class="headerlink" href="#warranty-disclaimer" title="Permalink to this headline"></a></h2>
<h2>WARRANTY DISCLAIMER</h2> <p>Our services are provided “as is” and without warranty of any kind. To the
<p>Our maximum extent permitted by law, we disclaim all representations and
services are provided &quot;as is&quot; and without warranty of any warranties, express or implied, relating to the services and underlying
kind. To the maximum extent permitted by law, we disclaim all software or any content on the services, whether provided or owned by us or by
representations and warranties, express or implied, relating to the any third party, including without limitation, warranties of merchantability,
services and underlying software or any content on the services, fitness for a particular purpose, title, non-infringement, freedom from
whether provided or owned by us or by any third party, including computer virus, and any implied warranties arising from course of dealing,
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 course of performance, or usage in trade, all of which are expressly
disclaimed. In addition, we do not represent or warrant that the disclaimed. In addition, we do not represent or warrant that the content
content accessible via the services is accurate, complete, available, accessible via the services is accurate, complete, available, current, free of
current, free of viruses or other harmful components, or that the viruses or other harmful components, or that the results of using the services
results of using the services will meet your requirements. Some will meet your requirements. Some states do not allow the disclaimer of
states do not allow the disclaimer of implied warranties, so the implied warranties, so the foregoing disclaimers may not apply to you. This
foregoing disclaimers may not apply to you. This paragraph gives you paragraph gives you specific legal rights and you may also have other legal
specific legal rights and you may also have other legal rights that rights that vary from state to state.</p>
vary from state to state. </div>
</p> <div class="section" id="indemnity">
<h2>Indemnity<a class="headerlink" href="#indemnity" title="Permalink to this headline"></a></h2>
<h2>INDEMNITY</h2> <p>To the extent permitted by applicable law, you agree to defend, indemnify, and
<p>To hold harmless the Taler Parties from and against any and all claims, damages,
the extent permitted by applicable law, you agree to defend, obligations, losses, liabilities, costs or debt, and expenses (including, but
indemnify, and hold harmless the Taler Parties from and against any not limited to, attorneys fees) arising from: (a) your use of and access to
and all claims, damages, obligations, losses, liabilities, costs or the Services; (b) any feedback or submissions you provide to us concerning the
debt, and expenses (including, but not limited to, attorneys fees) Taler Wallet; (c) your violation of any term of this Agreement; or (d) your
arising from: (a) your use of and access to the Services; (b) any violation of any law, rule, or regulation, or the rights of any third party.</p>
feedback or submissions you provide to us concerning the Taler </div>
Wallet; (c) your violation of any term of this Agreement; or (d) your <div class="section" id="time-limitation-on-claims">
violation of any law, rule, or regulation, or the rights of any third <h2>Time limitation on claims<a class="headerlink" href="#time-limitation-on-claims" title="Permalink to this headline"></a></h2>
party. <p>You agree that any claim you may have arising out of or related to your
</p> relationship with us must be filed within one year after such claim arises,
<h2>TIME LIMITATION ON CLAIMS</h2> otherwise, your claim in permanently barred.</p>
<p>You </div>
agree that any claim you may have arising out of or related to your <div class="section" id="governing-law">
relationship with us must be filed within one year after such claim <h2>Governing law<a class="headerlink" href="#governing-law" title="Permalink to this headline"></a></h2>
arises, otherwise, your claim in permanently barred. <p>No matter where youre located, the laws of Switzerland will govern these
</p> Terms. If any provisions of these Terms are inconsistent with any applicable
<h2>GOVERNING LAW</h2> law, those provisions will be superseded or modified only to the extent such
<p>No provisions are inconsistent. The parties agree to submit to the ordinary
matter where youre located, the laws of Switzerland will govern courts in Zurich, Switzerland for exclusive jurisdiction of any dispute
these Terms. If any provisions of these Terms are inconsistent with arising out of or related to your use of the Services or your breach of these
any applicable law, those provisions will be superseded or modified Terms.</p>
only to the extent such provisions are inconsistent. The parties </div>
agree to submit to the ordinary courts in Zurich, Switzerland for <div class="section" id="termination">
exclusive jurisdiction of any dispute arising out of or related to <h2>Termination<a class="headerlink" href="#termination" title="Permalink to this headline"></a></h2>
your use of the Services or your breach of these Terms. <p>In the event of termination concerning your use of our Services, your
</p> obligations under this Agreement will still continue.</p>
<h2>TERMINATION</h2> </div>
<p> <div class="section" id="discontinuance-of-services">
the event of termination concerning your use of our Services, your <h2>Discontinuance of services<a class="headerlink" href="#discontinuance-of-services" title="Permalink to this headline"></a></h2>
obligations under this Agreement will still continue. <p>We may, in our sole discretion and without cost to you, with or without prior
</p> notice, and at any time, modify or discontinue, temporarily or permanently,
<h2>DISCONTINUANCE OF SERVICES</h2> any portion of our Services. We will use the Taler protocols provisions to
<p>We notify Wallets if our Services are to be discontinued. It is your
may, in our sole discretion and without cost to you, with or without responsibility to ensure that the Taler Wallet is online at least once every
prior notice, and at any time, modify or discontinue, temporarily or three months to observe these notifications. We shall not be held responsible
permanently, any portion of our Services. We will use the Taler or liable for any loss of funds in the event that we discontinue or depreciate
protocols provisions to notify Wallets if our Services are to be the Services and your Taler Wallet fails to transfer out the coins within a
discontinued. It is your responsibility to ensure that the Taler three months notification period.</p>
Wallet is online at least once every three months to observe these </div>
notifications. We shall not be held responsible or liable for any <div class="section" id="no-waiver">
loss of funds in the event that we discontinue or depreciate the <h2>No waiver<a class="headerlink" href="#no-waiver" title="Permalink to this headline"></a></h2>
Services and your Taler Wallet fails to transfer out the coins within <p>Our failure to exercise or delay in exercising any right, power, or privilege
a three months notification period. under this Agreement shall not operate as a waiver; nor shall any single or
</p> partial exercise of any right, power, or privilege preclude any other or
<h2>NO WAIVER</h2> further exercise thereof.</p>
<p>Our </div>
failure to exercise or delay in exercising any right, power, or <div class="section" id="severability">
privilege under this Agreement shall not operate as a waiver; nor <h2>Severability<a class="headerlink" href="#severability" title="Permalink to this headline"></a></h2>
shall any single or partial exercise of any right, power, or <p>If it turns out that any part of this Agreement is invalid, void, or for any
privilege preclude any other or further exercise thereof. reason unenforceable, that term will be deemed severable and limited or
</p> eliminated to the minimum extent necessary.</p>
<h2>SEVERABILITY</h2> </div>
<p>If <div class="section" id="force-majeure">
it turns out that any part of this Agreement is invalid, void, or for <h2>Force majeure<a class="headerlink" href="#force-majeure" title="Permalink to this headline"></a></h2>
any reason unenforceable, that term will be deemed severable and <p>We shall not be held liable for any delays, failure in performance, or
limited or eliminated to the minimum extent necessary. interruptions of service which result directly or indirectly from any cause or
</p> condition beyond our reasonable control, including but not limited to: any
<h2>FORCE MAJEURE</h2> delay or failure due to any act of God, act of civil or military authorities,
<p>We act of terrorism, civil disturbance, war, strike or other labor dispute, fire,
shall not be held liable for any delays, failure in performance, or interruption in telecommunications or Internet services or network provider
interruptions of service which result directly or indirectly from any services, failure of equipment and/or software, other catastrophe, or any
cause or condition beyond our reasonable control, including but not other occurrence which is beyond our reasonable control and shall not affect
limited to: any delay or failure due to any act of God, act of civil the validity and enforceability of any remaining provisions.</p>
or military authorities, act of terrorism, civil disturbance, war, </div>
strike or other labor dispute, fire, interruption in <div class="section" id="assignment">
telecommunications or Internet services or network provider services, <h2>Assignment<a class="headerlink" href="#assignment" title="Permalink to this headline"></a></h2>
failure of equipment and/or software, other catastrophe, or any other <p>You agree that we may assign any of our rights and/or transfer, sub-contract,
occurrence which is beyond our reasonable control and shall not or delegate any of our obligations under these Terms.</p>
affect the validity and enforceability of any remaining provisions. </div>
</p> <div class="section" id="entire-agreement">
<h2>ASSIGNMENT</h2> <h2>Entire agreement<a class="headerlink" href="#entire-agreement" title="Permalink to this headline"></a></h2>
<p>You <p>This Agreement sets forth the entire understanding and agreement as to the
agree that we may assign any of our rights and/or transfer,
sub-contract, or delegate any of our obligations under these Terms.
</p>
<h2>ENTIRE AGREEMENT</h2>
<p>This
Agreement sets forth the entire understanding and agreement as to the
subject matter hereof and supersedes any and all prior discussions, subject matter hereof and supersedes any and all prior discussions,
agreements, and understandings of any kind (including, without agreements, and understandings of any kind (including, without limitation, any
limitation, any prior versions of this Agreement) and every nature prior versions of this Agreement) and every nature between us. Except as
between us. Except as provided for above, any modification to this provided for above, any modification to this Agreement must be in writing and
Agreement must be in writing and must be signed by both parties. must be signed by both parties.</p>
</p> </div>
<h2>QUESTIONS OR COMMENTS</h2> <div class="section" id="questions-or-comments">
<p>We <h2>Questions or comments<a class="headerlink" href="#questions-or-comments" title="Permalink to this headline"></a></h2>
welcome comments, questions, concerns, or suggestions. Please send us <p>We welcome comments, questions, concerns, or suggestions. Please send us a
a message on our contact page at <tt>legal@taler-systems.com</tt>. message on our contact page at <a class="reference external" href="mailto:legal&#37;&#52;&#48;taler-systems&#46;com">legal<span>&#64;</span>taler-systems<span>&#46;</span>com</a>.</p>
</p> </div>
</body> </div>
</html>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
</body>
</html>

BIN
contrib/tos/en/0.pdf Normal file

Binary file not shown.

View File

@ -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 Last Updated: 12.4.2019
through our Internet presence (collectively the “Services”). Before using our
Services, please read the Terms of Service (the “Terms” or the “Agreement”)
carefully.
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 This section provides a brief summary of the highlights of this
Agreement. Please note that when you accept this Agreement, you are accepting Agreement. Please note that when you accept this Agreement, you are
all of the terms and conditions and not just this section. We and possibly accepting all of the terms and conditions and not just this section.
other third parties provide Internet services which interact with the Taler We and possibly other third parties provide Internet services which
Wallets self-hosted personal payment application. When using the Taler Wallet interact with the Taler Wallets self-hosted personal payment
to interact with our Services, you are agreeing to our Terms, so please read application. When using the Taler Wallet to interact with our
carefully. Services, you are agreeing to our Terms, so please read carefully.
Highlights: 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 * You are responsible for keeping the data in your Taler Wallet at
Terms are still at an experimental stage. If you have any questions or all times under your control. Any losses arising from you not
comments related to this Agreement, please send us a message to being in control of your private information are your problem.
legal@taler-systems.com. If you do not agree to this Agreement, you must not
use our Services.
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 * For our Services, we may charge transaction fees. The specific
have read, understood, and agreed to these Terms. We reserve the right to fee structure is provided based on the Taler protocol and should
change these Terms at any time. If you disagree with the change, we may in the be shown to you when you withdraw electronic coins using a Taler
future offer you with an easy option to recover your unspent funds. However, Wallet. You agree and understand that the Taler protocol allows
in the current experimental period you acknowledge that this feature is not for the fee structure to change.
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 * 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 * We cannot be held accountable for our Services not being
legal recipient to the best of our ability and within the limitations of the available due to circumstances beyond our control. If we modify
law and our implementation. However, the Services offered today are highly or terminate our services, we will try to give you the
experimental and the set of recipients of funds is severely restricted. The opportunity to recover your funds. However, given the
Taler Wallet can be loaded by exchanging fiat currencies against electronic experimental state of the Services today, this may not be
coins. We are providing this exchange service. Once your Taler Wallet is possible. You are strongly advised to limit your use of the
loaded with electronic coins they can be spent for purchases if the seller is Service to small-scale experiments expecting total loss of all
accepting Taler as a means of payment. We are not guaranteeing that any seller funds.
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 These terms outline approved uses of our Services. The Services and
design of the Taler protocol. They are responsible for following the protocol these Terms are still at an experimental stage. If you have any
and specifying the correct bank account, and are solely liable for any losses questions or comments related to this Agreement, please send us a
that may arise from specifying the wrong account. We will allow the government message to legal@taler-systems.com. If you do not agree to this
to link wire transfers to the underlying contract hash. It is the 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 responsibility of recipients to preserve the full contracts and to pay
whatever taxes and charges may be applicable. Technical issues may lead to whatever taxes and charges may be applicable. Technical issues may
situations where we are unable to make transfers at all or lead to incorrect lead to situations where we are unable to make transfers at all or
transfers that cannot be reversed. We will only refuse to execute transfers if lead to incorrect transfers that cannot be reversed. We will only
the transfers are prohibited by a competent legal authority and we are ordered refuse to execute transfers if the transfers are prohibited by a
to do so. competent legal authority and we are ordered to do so.
FEES
You agree to pay the fees for exchanges and withdrawals completed via the Fees
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 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 To be eligible to use our Services, you must be able to form legally
confidentiality of the data stored in your wallet. When you setup a Taler binding contracts or have the permission of your legal guardian. By
Wallet, you are strongly advised to follow the precautionary measures offered using our Services, you represent and warrant that you meet all
by the software to minimize the chances to losse access to or control over eligibility requirements that we outline in these Terms.
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 Financial self-responsibility
(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 GPLs 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 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 The Taler Wallet is released under the terms of the GNU General Public
action regarding: Failures, disruptions, errors, or delays in processing that License (GNU GPL). You have the right to access, use, and share the
you may experience while using our Services; The risk of failure of hardware, Taler Wallet, in modified or unmodified form. However, the GPL is a
software, and Internet connections; The risk of malicious software being strong copyleft license, which means that any derivative works must be
introduced or found in the software underlying the Taler Wallet; The risk that distributed under the same license terms as the original software. If
third parties may obtain unauthorized access to information stored within your you have any questions, you should review the GNU GPLs full terms and
Taler Wallet, including, but not limited to your Taler Wallet coins or backup conditions at https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler”
encryption keys. You release us from all liability related to any losses, itself is a trademark of Taler Systems SA. You are welcome to use the
damages, or claims arising from: 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 Your use of our services
such content, are solely between you and such organizations and/or ========================
individuals.
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 Limitation of liability & disclaimer of warranties
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, You understand and agree that we have no control over, and no duty to
strict liability, breach of contract, breach of warranty, or any other legal take any action regarding: Failures, disruptions, errors, or delays in
theory, and whether or not we were advised of the possibility of such processing that you may experience while using our Services; The risk
damages. Some jurisdictions do not allow the exclusion or limitation of of failure of hardware, software, and Internet connections; The risk
liability for consequential or incidental damages, so the above limitation may of malicious software being introduced or found in the software
not apply to you. 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 2. server failure or data loss;
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 3. unauthorized access to the Taler Wallet application;
To the extent permitted by applicable law, you agree to defend, indemnify, and 4. bugs or other errors in the Taler Wallet software; 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, attorneys 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 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 Any other terms, conditions, warranties, or representations associated
relationship with us must be filed within one year after such claim arises, with such content, are solely between you and such organizations
otherwise, your claim in permanently barred. and/or individuals.
GOVERNING LAW
No matter where youre located, the laws of Switzerland will govern these Limitation of liability
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 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.
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, attorneys 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 youre 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 In the event of termination concerning your use of our Services, your
obligations under this Agreement will still continue. 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 Discontinuance of services
notice, and at any time, modify or discontinue, temporarily or permanently, ==========================
any portion of our Services. We will use the Taler protocols 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 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 protocols 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 Our failure to exercise or delay in exercising any right, power, or
reason unenforceable, that term will be deemed severable and limited or privilege under this Agreement shall not operate as a waiver; nor
eliminated to the minimum extent necessary. 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 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 interruptions of service which result directly or indirectly from any
condition beyond our reasonable control, including but not limited to: any cause or condition beyond our reasonable control, including but not
delay or failure due to any act of God, act of civil or military authorities, limited to: any delay or failure due to any act of God, act of civil
act of terrorism, civil disturbance, war, strike or other labor dispute, fire, or military authorities, act of terrorism, civil disturbance, war,
interruption in telecommunications or Internet services or network provider strike or other labor dispute, fire, interruption in
services, failure of equipment and/or software, other catastrophe, or any telecommunications or Internet services or network provider services,
other occurrence which is beyond our reasonable control and shall not affect 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. the validity and enforceability of any remaining provisions.
ASSIGNMENT
You agree that we may assign any of our rights and/or transfer, sub-contract, Assignment
or delegate any of our obligations under these Terms. ==========
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 This Agreement sets forth the entire understanding and agreement as to
message on our contact page at legal@taler-systems.com. 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.

344
contrib/tos/en/0.xml Normal file
View File

@ -0,0 +1,344 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document PUBLIC "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML" "http://docutils.sourceforge.net/docs/ref/docutils.dtd">
<!-- Generated by Docutils 0.14 -->
<document source="/home/grothoff/research/taler/exchange/contrib/tos/tos.rst">
<section ids="terms-of-service" names="terms\ of\ service">
<title>Terms Of Service</title>
<paragraph>Last Updated: 12.4.2019</paragraph>
<paragraph>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.</paragraph>
<section ids="overview" names="overview">
<title>Overview</title>
<paragraph>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
Wallets 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.</paragraph>
<section ids="highlights" names="highlights:">
<title>Highlights:</title>
<block_quote>
<bullet_list bullet="•">
<list_item>
<paragraph>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.</paragraph>
</list_item>
<list_item>
<paragraph>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.</paragraph>
</list_item>
<list_item>
<paragraph>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.</paragraph>
</list_item>
<list_item>
<paragraph>You agree to not intentionally overwhelm our systems with requests and
follow responsible disclosure if you find security issues in our services.</paragraph>
</list_item>
<list_item>
<paragraph>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.</paragraph>
</list_item>
</bullet_list>
</block_quote>
<paragraph>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
<reference refuri="mailto:legal@taler-systems.com">legal@taler-systems.com</reference>. If you do not agree to this Agreement, you must not
use our Services.</paragraph>
</section>
</section>
<section ids="how-you-accept-this-policy" names="how\ you\ accept\ this\ policy">
<title>How you accept this policy</title>
<paragraph>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.</paragraph>
</section>
<section ids="services" names="services">
<title>Services</title>
<paragraph>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.</paragraph>
</section>
<section ids="fees" names="fees">
<title>Fees</title>
<paragraph>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.</paragraph>
</section>
<section ids="eligibility" names="eligibility">
<title>Eligibility</title>
<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.</paragraph>
</section>
<section ids="financial-self-responsibility" names="financial\ self-responsibility">
<title>Financial self-responsibility</title>
<paragraph>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.</paragraph>
</section>
<section ids="copyrights-and-trademarks" names="copyrights\ and\ trademarks">
<title>Copyrights and trademarks</title>
<paragraph>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 GPLs full terms and conditions at
<reference refuri="https://www.gnu.org/licenses/gpl-3.0.en.html">https://www.gnu.org/licenses/gpl-3.0.en.html</reference>. “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.</paragraph>
</section>
<section ids="your-use-of-our-services" names="your\ use\ of\ our\ services">
<title>Your use of our services</title>
<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
<reference refuri="mailto:security@taler-systems.com">security@taler-systems.com</reference> 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.</paragraph>
</section>
<section ids="limitation-of-liability-disclaimer-of-warranties" names="limitation\ of\ liability\ &amp;\ disclaimer\ of\ warranties">
<title>Limitation of liability &amp; disclaimer of warranties</title>
<paragraph>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:</paragraph>
<enumerated_list enumtype="loweralpha" prefix="(" suffix=")">
<list_item>
<paragraph>user error such as forgotten passwords, incorrectly constructed
transactions;</paragraph>
</list_item>
<list_item>
<paragraph>server failure or data loss;</paragraph>
</list_item>
<list_item>
<paragraph>unauthorized access to the Taler Wallet application;</paragraph>
</list_item>
<list_item>
<paragraph>bugs or other errors in the Taler Wallet software; and</paragraph>
</list_item>
<list_item>
<paragraph>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.</paragraph>
</list_item>
</enumerated_list>
<paragraph>Any other terms, conditions, warranties, or representations associated with
such content, are solely between you and such organizations and/or
individuals.</paragraph>
</section>
<section ids="limitation-of-liability" names="limitation\ of\ liability">
<title>Limitation of liability</title>
<paragraph>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:</paragraph>
<enumerated_list enumtype="loweralpha" prefix="(" suffix=")">
<list_item>
<paragraph>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:</paragraph>
</list_item>
</enumerated_list>
<block_quote>
<enumerated_list enumtype="lowerroman" prefix="(" suffix=")">
<list_item>
<paragraph>your use of, or conduct in connection with, our services;</paragraph>
</list_item>
<list_item>
<paragraph>any unauthorized use of your wallet and/or private key due to your
failure to maintain the confidentiality of your wallet;</paragraph>
</list_item>
<list_item>
<paragraph>any interruption or cessation of transmission to or from the services; or</paragraph>
</list_item>
<list_item>
<paragraph>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</paragraph>
</list_item>
</enumerated_list>
</block_quote>
<enumerated_list enumtype="loweralpha" prefix="(" start="2" suffix=")">
<list_item>
<paragraph>any direct damages.</paragraph>
</list_item>
</enumerated_list>
<paragraph>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.</paragraph>
</section>
<section ids="warranty-disclaimer" names="warranty\ disclaimer">
<title>Warranty disclaimer</title>
<paragraph>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.</paragraph>
</section>
<section ids="indemnity" names="indemnity">
<title>Indemnity</title>
<paragraph>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, attorneys 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.</paragraph>
</section>
<section ids="time-limitation-on-claims" names="time\ limitation\ on\ claims">
<title>Time limitation on claims</title>
<paragraph>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.</paragraph>
</section>
<section ids="governing-law" names="governing\ law">
<title>Governing law</title>
<paragraph>No matter where youre 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.</paragraph>
</section>
<section ids="termination" names="termination">
<title>Termination</title>
<paragraph>In the event of termination concerning your use of our Services, your
obligations under this Agreement will still continue.</paragraph>
</section>
<section ids="discontinuance-of-services" names="discontinuance\ of\ services">
<title>Discontinuance of services</title>
<paragraph>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 protocols 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.</paragraph>
</section>
<section ids="no-waiver" names="no\ waiver">
<title>No waiver</title>
<paragraph>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.</paragraph>
</section>
<section ids="severability" names="severability">
<title>Severability</title>
<paragraph>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.</paragraph>
</section>
<section ids="force-majeure" names="force\ majeure">
<title>Force majeure</title>
<paragraph>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.</paragraph>
</section>
<section ids="assignment" names="assignment">
<title>Assignment</title>
<paragraph>You agree that we may assign any of our rights and/or transfer, sub-contract,
or delegate any of our obligations under these Terms.</paragraph>
</section>
<section ids="entire-agreement" names="entire\ agreement">
<title>Entire agreement</title>
<paragraph>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.</paragraph>
</section>
<section ids="questions-or-comments" names="questions\ or\ comments">
<title>Questions or comments</title>
<paragraph>We welcome comments, questions, concerns, or suggestions. Please send us a
message on our contact page at <reference refuri="mailto:legal@taler-systems.com">legal@taler-systems.com</reference>.</paragraph>
</section>
</section>
</document>

View File

@ -0,0 +1,517 @@
# 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 <EMAIL@ADDRESS>, 2020.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: tos 0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-02-07 01:00+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 Wallets 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 GPLs 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 "Indemnity"
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, attorneys 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 youre 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 "
"protocols 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 ""
#~ msgid "Indemntiy"
#~ msgstr ""

324
contrib/tos/tos.rst Normal file
View File

@ -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
Wallets 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 GPLs 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.
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, attorneys 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 youre 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 protocols 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.

28
contrib/update-pp.sh Executable file
View File

@ -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-pp.sh en de fr it
# Error checking on
set -eu
echo "Generating PP for ETag $VERSION"
rm -f sphinx.log sphinx.err
# We process inputs using Makefile in tos/ directory
cd pp
for l in $@
do
mkdir -p $l
echo Generating PP 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/pp.$f $l/${VERSION}.$f
done
done
cd ..

28
contrib/update-tos.sh Executable file
View File

@ -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 ..

View File

@ -594,7 +594,7 @@ main (int argc,
if (GNUNET_OK != if (GNUNET_OK !=
auditor_serve_process_config ()) auditor_serve_process_config ())
return 1; return 1;
TEAH_DEPOSIT_CONFIRMATION_init ();
/* check for systemd-style FD passing */ /* check for systemd-style FD passing */
listen_pid = getenv ("LISTEN_PID"); listen_pid = getenv ("LISTEN_PID");
listen_fds = getenv ("LISTEN_FDS"); listen_fds = getenv ("LISTEN_FDS");
@ -635,7 +635,10 @@ main (int argc,
fh = TALER_MHD_open_unix_path (serve_unixpath, fh = TALER_MHD_open_unix_path (serve_unixpath,
unixpath_mode); unixpath_mode);
if (-1 == fh) if (-1 == fh)
{
TEAH_DEPOSIT_CONFIRMATION_done ();
return 1; return 1;
}
} }
mhd mhd
@ -659,6 +662,7 @@ main (int argc,
{ {
fprintf (stderr, fprintf (stderr,
"Failed to start HTTP server.\n"); "Failed to start HTTP server.\n");
TEAH_DEPOSIT_CONFIRMATION_done ();
return 1; return 1;
} }
@ -732,6 +736,7 @@ main (int argc,
break; break;
} }
TALER_AUDITORDB_plugin_unload (TAH_plugin); TALER_AUDITORDB_plugin_unload (TAH_plugin);
TEAH_DEPOSIT_CONFIRMATION_done ();
return (GNUNET_SYSERR == ret) ? 1 : 0; return (GNUNET_SYSERR == ret) ? 1 : 0;
} }

View File

@ -32,6 +32,19 @@
#include "taler-auditor-httpd_deposit-confirmation.h" #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 * We have parsed the JSON information about the deposit, do some
* basic sanity checks (especially that the signature on the coin is * 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; struct TALER_AUDITORDB_Session *session;
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
struct GNUNET_TIME_Absolute now; struct GNUNET_TIME_Absolute now;
struct GNUNET_HashCode h;
int cached;
now = GNUNET_TIME_absolute_get (); now = GNUNET_TIME_absolute_get ();
if ( (es->ep_start.abs_value_us > now.abs_value_us) || 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)"); "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 */ /* check exchange signing key signature */
skv.purpose.purpose = htonl (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY); skv.purpose.purpose = htonl (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY);
skv.purpose.size = htonl (sizeof (struct TALER_ExchangeSigningKeyValidityPS)); skv.purpose.size = htonl (sizeof (struct TALER_ExchangeSigningKeyValidityPS));
@ -80,18 +91,15 @@ verify_and_execute_deposit_confirmation (struct MHD_Connection *connection,
skv.expire = GNUNET_TIME_absolute_hton (es->ep_expire); skv.expire = GNUNET_TIME_absolute_hton (es->ep_expire);
skv.end = GNUNET_TIME_absolute_hton (es->ep_end); skv.end = GNUNET_TIME_absolute_hton (es->ep_end);
skv.signkey_pub = es->exchange_pub; skv.signkey_pub = es->exchange_pub;
if (GNUNET_OK !=
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY, /* check our cache */
&skv.purpose, GNUNET_CRYPTO_hash (&skv,
&es->master_sig.eddsa_signature, sizeof (skv),
&es->master_public_key.eddsa_pub)) &h);
{ GNUNET_assert (0 == pthread_mutex_lock (&lock));
TALER_LOG_WARNING ("Invalid signature on exchange signing key\n"); cached = GNUNET_CONTAINER_multihashmap_contains (cache,
return TALER_MHD_reply_with_error (connection, &h);
MHD_HTTP_FORBIDDEN, GNUNET_assert (0 == pthread_mutex_unlock (&lock));
TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
"master_sig");
}
session = TAH_plugin->get_session (TAH_plugin->cls); session = TAH_plugin->get_session (TAH_plugin->cls);
if (NULL == session) if (NULL == session)
@ -102,18 +110,45 @@ verify_and_execute_deposit_confirmation (struct MHD_Connection *connection,
TALER_EC_DB_SETUP_FAILED, TALER_EC_DB_SETUP_FAILED,
"failed to establish session with database"); "failed to establish session with database");
} }
/* execute transaction */ if (! cached)
qs = TAH_plugin->insert_exchange_signkey (TAH_plugin->cls,
session,
es);
if (0 > qs)
{ {
GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); /* Not in cache, need to verify the signature, persist it, and possibly cache it */
TALER_LOG_WARNING ("Failed to store exchange signing key in database\n"); if (GNUNET_OK !=
return TALER_MHD_reply_with_error (connection, GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY,
MHD_HTTP_INTERNAL_SERVER_ERROR, &skv.purpose,
TALER_EC_AUDITOR_EXCHANGE_STORE_DB_ERROR, &es->master_sig.eddsa_signature,
"failed to persist exchange signing key"); &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");
}
/* 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 */ /* 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 */ /* end of taler-auditor-httpd_deposit-confirmation.c */

View File

@ -25,6 +25,18 @@
#include <microhttpd.h> #include <microhttpd.h>
#include "taler-auditor-httpd.h" #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 * Handle a "/deposit-confirmation" request. Parses the JSON, and, if

View File

@ -5709,6 +5709,8 @@ main (int argc,
"restart", "restart",
"restart audit from the beginning (required on first run)", "restart audit from the beginning (required on first run)",
&restart), &restart),
GNUNET_GETOPT_option_timetravel ('T',
"timetravel"),
GNUNET_GETOPT_OPTION_END GNUNET_GETOPT_OPTION_END
}; };

View File

@ -704,13 +704,15 @@ check_pending_rc (void *cls,
TALER_amount_add (&total_closure_amount_lag, TALER_amount_add (&total_closure_amount_lag,
&total_closure_amount_lag, &total_closure_amount_lag,
&rc->amount)); &rc->amount));
report (report_closure_lags, if ( (0 != rc->amount.value) ||
json_pack ("{s:I, s:o, s:o, s:o, s:s}", (0 != rc->amount.fraction) )
"row", (json_int_t) rc->rowid, report (report_closure_lags,
"amount", TALER_JSON_from_amount (&rc->amount), json_pack ("{s:I, s:o, s:o, s:o, s:s}",
"deadline", json_from_time_abs (rc->execution_date), "row", (json_int_t) rc->rowid,
"wtid", GNUNET_JSON_from_data_auto (&rc->wtid), "amount", TALER_JSON_from_amount (&rc->amount),
"account", rc->receiver_account)); "deadline", json_from_time_abs (rc->execution_date),
"wtid", GNUNET_JSON_from_data_auto (&rc->wtid),
"account", rc->receiver_account));
pp.last_reserve_close_uuid pp.last_reserve_close_uuid
= GNUNET_MIN (pp.last_reserve_close_uuid, = GNUNET_MIN (pp.last_reserve_close_uuid,
rc->rowid); rc->rowid);
@ -2312,6 +2314,8 @@ main (int argc,
"restart", "restart",
"restart audit from the beginning (required on first run)", "restart audit from the beginning (required on first run)",
&restart), &restart),
GNUNET_GETOPT_option_timetravel ('T',
"timetravel"),
GNUNET_GETOPT_OPTION_END GNUNET_GETOPT_OPTION_END
}; };

View File

@ -1473,6 +1473,49 @@ echo "UPDATE deposits SET wire='$OLD_WIRE' WHERE deposit_serial_id=${SERIAL}" |
} }
# Test for duplicate wire transfer subject
function test_27() {
echo "===========27: duplicate WTID detection ================="
# Check wire transfer lag reported (no aggregator!)
# NOTE: This test is EXPECTED to fail for ~1h after
# re-generating the test database as we do not
# report lag of less than 1h (see GRACE_PERIOD in
# taler-wire-auditor.c)
if [ $DATABASE_AGE -gt 3600 ]
then
pre_audit aggregator
# Obtain data to duplicate.
ID=`echo "SELECT id FROM app_banktransaction WHERE debit_account_id=2 LIMIT 1" | psql $DB -Aqt`
WTID=`echo "SELECT subject FROM app_banktransaction WHERE debit_account_id=2 LIMIT 1" | psql $DB -Aqt`
echo "INSERT INTO app_banktransaction (amount,subject,date,credit_account_id,debit_account_id,cancelled) VALUES ('TESTKUDOS:1','$WTID',NOW(),12,2,'f')" | psql -Aqt $DB
audit_only
post_audit
echo -n "Testing inconsistency detection... "
AMOUNT=`jq -r .wire_format_inconsistencies[0].amount < test-wire-audit.json`
if test "${AMOUNT}" != "TESTKUDOS:1"
then
exit_fail "Amount wrong, got ${AMOUNT}"
fi
AMOUNT=`jq -r .total_wire_format_amount < test-wire-audit.json`
if test "${AMOUNT}" != "TESTKUDOS:1"
then
exit_fail "Wrong total wire format amount, got $AMOUNT"
fi
# cannot easily undo aggregator, hence full reload
full_reload
else
echo "Test skipped (database too new)"
fi
}
# ************************************************** # **************************************************

View File

@ -14,8 +14,8 @@ pkgcfg_DATA = \
sqldir = $(prefix)/share/taler/sql/auditor/ sqldir = $(prefix)/share/taler/sql/auditor/
sql_DATA = \ sql_DATA = \
0000.sql \ auditor-0000.sql \
0001.sql \ auditor-0001.sql \
drop0000.sql \ drop0000.sql \
restart0000.sql restart0000.sql

View File

@ -115,7 +115,7 @@ CREATE TABLE IF NOT EXISTS auditor_reserves
,auditor_reserves_rowid BIGSERIAL UNIQUE ,auditor_reserves_rowid BIGSERIAL UNIQUE
,origin_account TEXT ,origin_account TEXT
); );
CREATE INDEX auditor_reserves_by_reserve_pub CREATE INDEX IF NOT EXISTS auditor_reserves_by_reserve_pub
ON auditor_reserves ON auditor_reserves
(reserve_pub); (reserve_pub);
-- Table with the sum of the balances of all customer reserves -- 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_val INT8 NOT NULL
,reserve_profits_frac INT4 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 ON auditor_historic_reserve_summary
(master_pub (master_pub
,start_date); ,start_date);

View File

@ -35,7 +35,6 @@ TALER_AUDITORDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg)
{ {
char *plugin_name; char *plugin_name;
char *lib_name; char *lib_name;
struct GNUNET_CONFIGURATION_Handle *cfg_dup;
struct TALER_AUDITORDB_Plugin *plugin; struct TALER_AUDITORDB_Plugin *plugin;
if (GNUNET_SYSERR == if (GNUNET_SYSERR ==
@ -53,14 +52,12 @@ TALER_AUDITORDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg)
"libtaler_plugin_auditordb_%s", "libtaler_plugin_auditordb_%s",
plugin_name); plugin_name);
GNUNET_free (plugin_name); GNUNET_free (plugin_name);
cfg_dup = GNUNET_CONFIGURATION_dup (cfg);
plugin = GNUNET_PLUGIN_load (lib_name, plugin = GNUNET_PLUGIN_load (lib_name,
cfg_dup); (void *) cfg);
if (NULL != plugin) if (NULL != plugin)
plugin->library_name = lib_name; plugin->library_name = lib_name;
else else
GNUNET_free (lib_name); GNUNET_free (lib_name);
GNUNET_CONFIGURATION_destroy (cfg_dup);
return plugin; return plugin;
} }

View File

@ -80,15 +80,9 @@ struct PostgresClosure
pthread_key_t db_conn_threadlocal; pthread_key_t db_conn_threadlocal;
/** /**
* Directory with SQL statements to run to create tables. * Our configuration.
*/ */
char *sql_dir; const struct GNUNET_CONFIGURATION_Handle *cfg;
/**
* Database connection string, as read from
* the configuration.
*/
char *connection_cfg_str;
/** /**
* Which currency should we assume all amounts to be in? * Which currency should we assume all amounts to be in?
@ -114,16 +108,12 @@ postgres_drop_tables (void *cls,
{ {
struct PostgresClosure *pc = cls; struct PostgresClosure *pc = cls;
struct GNUNET_PQ_Context *conn; struct GNUNET_PQ_Context *conn;
char *exec_dir;
GNUNET_asprintf (&exec_dir, conn = GNUNET_PQ_connect_with_cfg (pc->cfg,
(drop_exchangelist) ? "%sdrop" : "%srestart", "auditordb-postgres",
pc->sql_dir); (drop_exchangelist) ? "drop" : "restart",
conn = GNUNET_PQ_connect (pc->connection_cfg_str, NULL,
exec_dir, NULL);
NULL,
NULL);
GNUNET_free (exec_dir);
if (NULL == conn) if (NULL == conn)
return GNUNET_SYSERR; return GNUNET_SYSERR;
GNUNET_PQ_disconnect (conn); GNUNET_PQ_disconnect (conn);
@ -143,10 +133,11 @@ postgres_create_tables (void *cls)
struct PostgresClosure *pc = cls; struct PostgresClosure *pc = cls;
struct GNUNET_PQ_Context *conn; struct GNUNET_PQ_Context *conn;
conn = GNUNET_PQ_connect (pc->connection_cfg_str, conn = GNUNET_PQ_connect_with_cfg (pc->cfg,
pc->sql_dir, "auditordb-postgres",
NULL, "auditor-",
NULL); NULL,
NULL);
if (NULL == conn) if (NULL == conn)
return GNUNET_SYSERR; return GNUNET_SYSERR;
GNUNET_PQ_disconnect (conn); GNUNET_PQ_disconnect (conn);
@ -734,10 +725,11 @@ postgres_get_session (void *cls)
GNUNET_PQ_reconnect_if_down (session->conn); GNUNET_PQ_reconnect_if_down (session->conn);
return session; return session;
} }
db_conn = GNUNET_PQ_connect (pc->connection_cfg_str, db_conn = GNUNET_PQ_connect_with_cfg (pc->cfg,
NULL, "auditordb-postgres",
NULL, NULL,
ps); NULL,
ps);
if (NULL == db_conn) if (NULL == db_conn)
return NULL; return NULL;
session = GNUNET_new (struct TALER_AUDITORDB_Session); session = GNUNET_new (struct TALER_AUDITORDB_Session);
@ -897,10 +889,11 @@ postgres_gc (void *cls)
}; };
now = GNUNET_TIME_absolute_get (); now = GNUNET_TIME_absolute_get ();
conn = GNUNET_PQ_connect (pc->connection_cfg_str, conn = GNUNET_PQ_connect_with_cfg (pc->cfg,
NULL, "auditordb-postgres",
NULL, NULL,
ps); NULL,
ps);
if (NULL == conn) if (NULL == conn)
return GNUNET_SYSERR; return GNUNET_SYSERR;
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@ -3244,53 +3237,19 @@ postgres_get_predicted_balance (void *cls,
void * void *
libtaler_plugin_auditordb_postgres_init (void *cls) libtaler_plugin_auditordb_postgres_init (void *cls)
{ {
struct GNUNET_CONFIGURATION_Handle *cfg = cls; const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
struct PostgresClosure *pg; struct PostgresClosure *pg;
struct TALER_AUDITORDB_Plugin *plugin; struct TALER_AUDITORDB_Plugin *plugin;
const char *ec;
pg = GNUNET_new (struct PostgresClosure); pg = GNUNET_new (struct PostgresClosure);
if (GNUNET_OK != pg->cfg = cfg;
GNUNET_CONFIGURATION_get_value_filename (cfg,
"auditordb-postgres",
"SQL_DIR",
&pg->sql_dir))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"auditordb-postgres",
"SQL_DIR");
GNUNET_free (pg);
return NULL;
}
if (0 != pthread_key_create (&pg->db_conn_threadlocal, if (0 != pthread_key_create (&pg->db_conn_threadlocal,
&db_conn_destroy)) &db_conn_destroy))
{ {
TALER_LOG_ERROR ("Cannnot create pthread key.\n"); TALER_LOG_ERROR ("Cannnot create pthread key.\n");
GNUNET_free (pg->sql_dir);
GNUNET_free (pg); GNUNET_free (pg);
return NULL; return NULL;
} }
ec = getenv ("TALER_AUDITORDB_POSTGRES_CONFIG");
if (NULL != ec)
{
pg->connection_cfg_str = GNUNET_strdup (ec);
}
else
{
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
"auditordb-postgres",
"CONFIG",
&pg->connection_cfg_str))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"auditordb-postgres",
"CONFIG");
GNUNET_free (pg->sql_dir);
GNUNET_free (pg);
return NULL;
}
}
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg, GNUNET_CONFIGURATION_get_value_string (cfg,
"taler", "taler",
@ -3300,8 +3259,6 @@ libtaler_plugin_auditordb_postgres_init (void *cls)
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"taler", "taler",
"CURRENCY"); "CURRENCY");
GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg->sql_dir);
GNUNET_free (pg); GNUNET_free (pg);
return NULL; return NULL;
} }
@ -3407,8 +3364,6 @@ libtaler_plugin_auditordb_postgres_done (void *cls)
struct TALER_AUDITORDB_Plugin *plugin = cls; struct TALER_AUDITORDB_Plugin *plugin = cls;
struct PostgresClosure *pg = plugin->cls; struct PostgresClosure *pg = plugin->cls;
GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg->sql_dir);
GNUNET_free (pg->currency); GNUNET_free (pg->currency);
GNUNET_free (pg); GNUNET_free (pg);
GNUNET_free (plugin); GNUNET_free (plugin);

View File

@ -38,6 +38,7 @@ libtalerbank_la_LDFLAGS = \
libtalerbank_la_SOURCES = \ libtalerbank_la_SOURCES = \
bank_api_admin.c \ bank_api_admin.c \
bank_api_common.c bank_api_common.h \ bank_api_common.c bank_api_common.h \
bank_api_config.c \
bank_api_credit.c \ bank_api_credit.c \
bank_api_debit.c \ bank_api_debit.c \
bank_api_transfer.c \ bank_api_transfer.c \

View File

@ -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 <http://www.gnu.org/licenses/>
*/
/**
* @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 <microhttpd.h> /* 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 */

View File

@ -30,7 +30,7 @@
/** /**
* @brief A /history Handle * @brief A /history/incoming Handle
*/ */
struct TALER_BANK_CreditHistoryHandle struct TALER_BANK_CreditHistoryHandle
{ {
@ -173,30 +173,21 @@ handle_credit_history_finished (void *cls,
GNUNET_break_op (0); GNUNET_break_op (0);
ec = TALER_JSON_get_error_code (j); ec = TALER_JSON_get_error_code (j);
break; break;
case MHD_HTTP_FORBIDDEN:
/* Access denied */
GNUNET_break_op (0);
ec = TALER_JSON_get_error_code (j);
break;
case MHD_HTTP_UNAUTHORIZED: case MHD_HTTP_UNAUTHORIZED:
/* FIXME(dold): I don't get this comment below. What signatures would the /* Nothing really to verify, bank says the HTTP Authentication
bank even verify?! */ failed. May happen if HTTP authentication is used and the
/* Nothing really to verify, bank says one of the signatures is user supplied a wrong username/password combination. */
invalid; as we checked them, this should never happen, we
should pass the JSON reply to the application */
GNUNET_break_op (0);
ec = TALER_JSON_get_error_code (j); ec = TALER_JSON_get_error_code (j);
break; break;
case MHD_HTTP_NOT_FOUND: case MHD_HTTP_NOT_FOUND:
/* Nothing really to verify, this should never /* Nothing really to verify: the bank is either unaware
happen, we should pass the JSON reply to the application */ of the endpoint (not a bank), or of the account.
GNUNET_break_op (0); We should pass the JSON (?) reply to the application */
ec = TALER_JSON_get_error_code (j); ec = TALER_JSON_get_error_code (j);
break; break;
case MHD_HTTP_INTERNAL_SERVER_ERROR: case MHD_HTTP_INTERNAL_SERVER_ERROR:
/* Server had an internal issue; we should retry, but this API /* Server had an internal issue; we should retry, but this API
leaves this to the application */ leaves this to the application */
GNUNET_break_op (0);
ec = TALER_JSON_get_error_code (j); ec = TALER_JSON_get_error_code (j);
break; break;
default: default:

View File

@ -30,7 +30,7 @@
/** /**
* @brief A /history Handle * @brief A /history/outgoing Handle
*/ */
struct TALER_BANK_DebitHistoryHandle struct TALER_BANK_DebitHistoryHandle
{ {
@ -129,16 +129,16 @@ parse_account_history (struct TALER_BANK_DebitHistoryHandle *hh,
/** /**
* Function called when we're done processing the * Function called when we're done processing the
* HTTP /history request. * HTTP /history/outgoing request.
* *
* @param cls the `struct TALER_BANK_DebitHistoryHandle` * @param cls the `struct TALER_BANK_DebitHistoryHandle`
* @param response_code HTTP response code, 0 on error * @param response_code HTTP response code, 0 on error
* @param response parsed JSON result, NULL on error * @param response parsed JSON result, NULL on error
*/ */
static void static void
handle_history_finished (void *cls, handle_debit_history_finished (void *cls,
long response_code, long response_code,
const void *response) const void *response)
{ {
struct TALER_BANK_DebitHistoryHandle *hh = cls; struct TALER_BANK_DebitHistoryHandle *hh = cls;
enum TALER_ErrorCode ec; enum TALER_ErrorCode ec;
@ -169,21 +169,19 @@ handle_history_finished (void *cls,
case MHD_HTTP_BAD_REQUEST: case MHD_HTTP_BAD_REQUEST:
/* This should never happen, either us or the bank is buggy /* This should never happen, either us or the bank is buggy
(or API version conflict); just pass JSON reply to the application */ (or API version conflict); just pass JSON reply to the application */
ec = TALER_JSON_get_error_code (j); GNUNET_break_op (0);
break;
case MHD_HTTP_FORBIDDEN:
/* Access denied */
ec = TALER_JSON_get_error_code (j); ec = TALER_JSON_get_error_code (j);
break; break;
case MHD_HTTP_UNAUTHORIZED: case MHD_HTTP_UNAUTHORIZED:
/* Nothing really to verify, bank says one of the signatures is /* Nothing really to verify, bank says the HTTP Authentication
invalid; as we checked them, this should never happen, we failed. May happen if HTTP authentication is used and the
should pass the JSON reply to the application */ user supplied a wrong username/password combination. */
ec = TALER_JSON_get_error_code (j); ec = TALER_JSON_get_error_code (j);
break; break;
case MHD_HTTP_NOT_FOUND: case MHD_HTTP_NOT_FOUND:
/* Nothing really to verify, this should never /* Nothing really to verify: the bank is either unaware
happen, we should pass the JSON reply to the application */ 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); ec = TALER_JSON_get_error_code (j);
break; break;
case MHD_HTTP_INTERNAL_SERVER_ERROR: case MHD_HTTP_INTERNAL_SERVER_ERROR:
@ -196,7 +194,7 @@ handle_history_finished (void *cls,
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Unexpected response code %u\n", "Unexpected response code %u\n",
(unsigned int) response_code); (unsigned int) response_code);
GNUNET_break (0); GNUNET_break_op (0);
ec = TALER_JSON_get_error_code (j); ec = TALER_JSON_get_error_code (j);
response_code = 0; response_code = 0;
break; break;
@ -292,7 +290,7 @@ TALER_BANK_debit_history (struct GNUNET_CURL_Context *ctx,
hh->job = GNUNET_CURL_job_add2 (ctx, hh->job = GNUNET_CURL_job_add2 (ctx,
eh, eh,
NULL, NULL,
&handle_history_finished, &handle_debit_history_finished,
hh); hh);
return hh; return hh;
} }

View File

@ -26,6 +26,24 @@
#include "taler_bank_service.h" #include "taler_bank_service.h"
#include "taler_mhd_lib.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) * Maximum POST request size (for /admin/add-incoming)
*/ */
@ -172,6 +190,11 @@ struct TALER_FAKEBANK_Handle
*/ */
uint64_t serial_counter; uint64_t serial_counter;
/**
* Currency used by the fakebank.
*/
char *currency;
/** /**
* BaseURL of the fakebank. * BaseURL of the fakebank.
*/ */
@ -527,6 +550,7 @@ TALER_FAKEBANK_stop (struct TALER_FAKEBANK_Handle *h)
h->mhd_bank = NULL; h->mhd_bank = NULL;
} }
GNUNET_free (h->my_baseurl); GNUNET_free (h->my_baseurl);
GNUNET_free (h->currency);
GNUNET_free (h); GNUNET_free (h);
} }
@ -776,7 +800,7 @@ handle_transfer (struct TALER_FAKEBANK_Handle *h,
/** /**
* Handle incoming HTTP request for / * Handle incoming HTTP request for / (home page).
* *
* @param h the fakebank handle * @param h the fakebank handle
* @param connection the connection * @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 * This is the "base" structure for both the /history and the
* /history-range API calls. * /history-range API calls.
@ -1220,6 +1267,13 @@ serve (struct TALER_FAKEBANK_Handle *h,
return handle_home_page (h, return handle_home_page (h,
connection, connection,
con_cls); 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, if ( (0 == strcmp (url,
"/admin/add-incoming")) && "/admin/add-incoming")) &&
(0 == strcasecmp (method, (0 == strcasecmp (method,
@ -1451,15 +1505,19 @@ run_mhd (void *cls)
* would have issued the correct wire transfer orders. * would have issued the correct wire transfer orders.
* *
* @param port port to listen to * @param port port to listen to
* @param currency currency the bank uses
* @return NULL on error * @return NULL on error
*/ */
struct TALER_FAKEBANK_Handle * struct TALER_FAKEBANK_Handle *
TALER_FAKEBANK_start (uint16_t port) TALER_FAKEBANK_start (uint16_t port,
const char *currency)
{ {
struct TALER_FAKEBANK_Handle *h; struct TALER_FAKEBANK_Handle *h;
GNUNET_assert (strlen (currency) < TALER_CURRENCY_LEN);
h = GNUNET_new (struct TALER_FAKEBANK_Handle); h = GNUNET_new (struct TALER_FAKEBANK_Handle);
h->port = port; h->port = port;
h->currency = GNUNET_strdup (currency);
GNUNET_asprintf (&h->my_baseurl, GNUNET_asprintf (&h->my_baseurl,
"http://localhost:%u/", "http://localhost:%u/",
(unsigned int) port); (unsigned int) port);
@ -1480,6 +1538,7 @@ TALER_FAKEBANK_start (uint16_t port)
MHD_OPTION_END); MHD_OPTION_END);
if (NULL == h->mhd_bank) if (NULL == h->mhd_bank)
{ {
GNUNET_free (h->currency);
GNUNET_free (h); GNUNET_free (h);
return NULL; return NULL;
} }

View File

@ -43,12 +43,38 @@ run (void *cls,
const char *cfgfile, const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg) const struct GNUNET_CONFIGURATION_Handle *cfg)
{ {
char *currency_string;
(void) cls; (void) cls;
(void) args; (void) args;
(void) cfgfile; (void) cfgfile;
(void) cfg; (void) cfg;
if (NULL == TALER_FAKEBANK_start (8082)) if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
"taler",
"CURRENCY",
&currency_string))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"taler",
"CURRENCY");
ret = 1; 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; ret = 0;
} }

View File

@ -156,9 +156,9 @@ static char *mode_str;
static enum BenchmarkMode mode; static enum BenchmarkMode mode;
/** /**
* Config filename. * Configuration.
*/ */
static char *cfg_filename; static struct GNUNET_CONFIGURATION_Handle *cfg;
/** /**
* Currency used. * Currency used.
@ -445,7 +445,8 @@ launch_fakebank (void *cls)
(void) cls; (void) cls;
fakebank 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) if (NULL == fakebank)
{ {
GNUNET_break (0); GNUNET_break (0);
@ -624,12 +625,11 @@ parallel_benchmark (TALER_TESTING_Main main_cb,
NULL == loglev ? "INFO" : loglev, NULL == loglev ? "INFO" : loglev,
logfile); logfile);
result = TALER_TESTING_setup result = TALER_TESTING_setup (main_cb,
(main_cb, main_cb_cls,
main_cb_cls, cfg,
cfg_filename, exchanged,
exchanged, GNUNET_YES);
GNUNET_YES);
if (GNUNET_OK != result) if (GNUNET_OK != result)
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failure in child process test suite!\n"); "Failure in child process test suite!\n");
@ -746,7 +746,7 @@ int
main (int argc, main (int argc,
char *const *argv) char *const *argv)
{ {
struct GNUNET_CONFIGURATION_Handle *cfg; char *cfg_filename = NULL;
struct GNUNET_GETOPT_CommandLineOption options[] = { struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_option_mandatory GNUNET_GETOPT_option_mandatory
(GNUNET_GETOPT_option_cfgfile (&cfg_filename)), (GNUNET_GETOPT_option_cfgfile (&cfg_filename)),
@ -798,6 +798,7 @@ main (int argc,
argc, argc,
argv))) argv)))
{ {
GNUNET_free_non_null (cfg_filename);
return BAD_CLI_ARG; return BAD_CLI_ARG;
} }
GNUNET_log_setup ("taler-exchange-benchmark", GNUNET_log_setup ("taler-exchange-benchmark",
@ -814,6 +815,7 @@ main (int argc,
else else
{ {
TALER_LOG_ERROR ("Unknown mode given: '%s'\n", mode_str); TALER_LOG_ERROR ("Unknown mode given: '%s'\n", mode_str);
GNUNET_free_non_null (cfg_filename);
return BAD_CONFIG_FILE; return BAD_CONFIG_FILE;
} }
if (NULL == cfg_filename) if (NULL == cfg_filename)
@ -825,8 +827,10 @@ main (int argc,
cfg_filename)) cfg_filename))
{ {
TALER_LOG_ERROR ("Could not parse configuration\n"); TALER_LOG_ERROR ("Could not parse configuration\n");
GNUNET_free (cfg_filename);
return BAD_CONFIG_FILE; return BAD_CONFIG_FILE;
} }
GNUNET_free (cfg_filename);
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg, GNUNET_CONFIGURATION_get_value_string (cfg,
"taler", "taler",
@ -839,6 +843,16 @@ main (int argc,
GNUNET_CONFIGURATION_destroy (cfg); GNUNET_CONFIGURATION_destroy (cfg);
return BAD_CONFIG_FILE; 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) if (howmany_clients > 10240)
{ {
TALER_LOG_ERROR ("-p option value given is too large\n"); TALER_LOG_ERROR ("-p option value given is too large\n");
@ -950,11 +964,11 @@ main (int argc,
return BAD_CONFIG_FILE; return BAD_CONFIG_FILE;
} }
} }
GNUNET_CONFIGURATION_destroy (cfg);
result = parallel_benchmark (&run, result = parallel_benchmark (&run,
NULL, NULL,
cfg_filename); cfg_filename);
GNUNET_CONFIGURATION_destroy (cfg);
/* If we're the exchange worker, we're done now. No need to print results */ /* If we're the exchange worker, we're done now. No need to print results */
if (MODE_EXCHANGE == mode) if (MODE_EXCHANGE == mode)

View File

@ -1437,6 +1437,8 @@ main (int argc,
"DKH", "DKH",
"revoke denomination key hash (DKH) and request wallets to initiate /recoup", "revoke denomination key hash (DKH) and request wallets to initiate /recoup",
&revoke_dkh), &revoke_dkh),
GNUNET_GETOPT_option_timetravel ('T',
"timetravel"),
GNUNET_GETOPT_option_absolute_time ('t', GNUNET_GETOPT_option_absolute_time ('t',
"time", "time",
"TIMESTAMP", "TIMESTAMP",

View File

@ -228,6 +228,8 @@ main (int argc,
char *const *argv) char *const *argv)
{ {
const struct GNUNET_GETOPT_CommandLineOption options[] = { const struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_option_timetravel ('T',
"timetravel"),
GNUNET_GETOPT_option_filename ('m', GNUNET_GETOPT_option_filename ('m',
"master-key", "master-key",
"FILENAME", "FILENAME",

View File

@ -83,7 +83,8 @@ taler_exchange_httpd_LDADD = \
AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH=$${TALER_PREFIX:-@prefix@}/bin:$$PATH; AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH=$${TALER_PREFIX:-@prefix@}/bin:$$PATH;
check_SCRIPTS = \ check_SCRIPTS = \
test_taler_exchange_httpd.sh test_taler_exchange_httpd.sh \
test_taler_exchange_httpd_restart.sh
if HAVE_EXPENSIVE_TESTS if HAVE_EXPENSIVE_TESTS
check_SCRIPTS += \ check_SCRIPTS += \
test_taler_exchange_httpd_afl.sh test_taler_exchange_httpd_afl.sh
@ -97,6 +98,7 @@ TESTS = \
EXTRA_DIST = \ EXTRA_DIST = \
test_taler_exchange_httpd_home/.local/share/taler/exchange/offline-keys/master.priv \ test_taler_exchange_httpd_home/.local/share/taler/exchange/offline-keys/master.priv \
test_taler_exchange_httpd.conf \ test_taler_exchange_httpd.conf \
test_taler_exchange_unix.conf \
test_taler_exchange_httpd.get \ test_taler_exchange_httpd.get \
test_taler_exchange_httpd.post \ test_taler_exchange_httpd.post \
exchange.conf \ exchange.conf \

View File

@ -582,6 +582,7 @@ shutdown_task (void *cls)
ctc = NULL; ctc = NULL;
} }
TALER_EXCHANGEDB_plugin_unload (db_plugin); TALER_EXCHANGEDB_plugin_unload (db_plugin);
db_plugin = NULL;
{ {
struct WireAccount *wa; struct WireAccount *wa;
@ -670,6 +671,7 @@ parse_wirewatch_config ()
fprintf (stderr, fprintf (stderr,
"Failed to initialize DB tables\n"); "Failed to initialize DB tables\n");
TALER_EXCHANGEDB_plugin_unload (db_plugin); TALER_EXCHANGEDB_plugin_unload (db_plugin);
db_plugin = NULL;
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
TALER_EXCHANGEDB_find_accounts (cfg, TALER_EXCHANGEDB_find_accounts (cfg,
@ -680,6 +682,7 @@ parse_wirewatch_config ()
fprintf (stderr, fprintf (stderr,
"No wire accounts configured for debit!\n"); "No wire accounts configured for debit!\n");
TALER_EXCHANGEDB_plugin_unload (db_plugin); TALER_EXCHANGEDB_plugin_unload (db_plugin);
db_plugin = NULL;
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
return GNUNET_OK; return GNUNET_OK;
@ -1179,10 +1182,9 @@ expired_reserve_cb (void *cls,
/* Reserve balance was almost zero OR soft error */ /* Reserve balance was almost zero OR soft error */
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Reserve was virtually empty, moving on\n"); "Reserve was virtually empty, moving on\n");
(void) commit_or_warn (ctc->session); (void) commit_or_warn (session);
GNUNET_free (ctc->method); erc->async_cont = GNUNET_YES;
GNUNET_free (ctc); GNUNET_assert (NULL == task);
ctc = NULL;
task = GNUNET_SCHEDULER_add_now (&run_transfers, task = GNUNET_SCHEDULER_add_now (&run_transfers,
NULL); NULL);
return qs; return qs;
@ -1223,6 +1225,7 @@ expired_reserve_cb (void *cls,
return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS; return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
} }
erc->async_cont = GNUNET_YES; erc->async_cont = GNUNET_YES;
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_transfers, task = GNUNET_SCHEDULER_add_now (&run_transfers,
NULL); NULL);
GNUNET_free (ctc->method); GNUNET_free (ctc->method);
@ -1299,6 +1302,7 @@ run_reserve_closures (void *cls)
case GNUNET_DB_STATUS_SOFT_ERROR: case GNUNET_DB_STATUS_SOFT_ERROR:
db_plugin->rollback (db_plugin->cls, db_plugin->rollback (db_plugin->cls,
session); session);
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, task = GNUNET_SCHEDULER_add_now (&run_reserve_closures,
NULL); NULL);
return; return;
@ -1308,6 +1312,7 @@ run_reserve_closures (void *cls)
reserves_idle = GNUNET_YES; reserves_idle = GNUNET_YES;
db_plugin->rollback (db_plugin->cls, db_plugin->rollback (db_plugin->cls,
session); session);
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1315,6 +1320,7 @@ run_reserve_closures (void *cls)
(void) commit_or_warn (session); (void) commit_or_warn (session);
if (GNUNET_YES == erc.async_cont) if (GNUNET_YES == erc.async_cont)
break; break;
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, task = GNUNET_SCHEDULER_add_now (&run_reserve_closures,
NULL); NULL);
return; return;
@ -1345,6 +1351,7 @@ run_aggregation (void *cls)
return; return;
if (0 == (++swap % 2)) if (0 == (++swap % 2))
{ {
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, task = GNUNET_SCHEDULER_add_now (&run_reserve_closures,
NULL); NULL);
return; return;
@ -1392,6 +1399,7 @@ run_aggregation (void *cls)
{ {
/* should re-try immediately */ /* should re-try immediately */
swap--; /* do not count failed attempts */ swap--; /* do not count failed attempts */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1408,15 +1416,21 @@ run_aggregation (void *cls)
{ {
if ( (GNUNET_NO == reserves_idle) || if ( (GNUNET_NO == reserves_idle) ||
(GNUNET_YES == test_mode) ) (GNUNET_YES == test_mode) )
{
/* Possibly more to on reserves, go for it immediately */ /* Possibly more to on reserves, go for it immediately */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_reserve_closures, task = GNUNET_SCHEDULER_add_now (&run_reserve_closures,
NULL); NULL);
}
else else
{
/* FIXME(dold): We might want to read the duration to sleep from the config */ /* FIXME(dold): We might want to read the duration to sleep from the config */
/* nothing to do, sleep for a minute and try again */ /* nothing to do, sleep for a minute and try again */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
&run_aggregation, &run_aggregation,
NULL); NULL);
}
} }
return; return;
} }
@ -1451,6 +1465,7 @@ run_aggregation (void *cls)
"Serialization issue, trying again later!\n"); "Serialization issue, trying again later!\n");
db_plugin->rollback (db_plugin->cls, db_plugin->rollback (db_plugin->cls,
session); session);
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1515,6 +1530,7 @@ run_aggregation (void *cls)
session); session);
cleanup_au (); cleanup_au ();
/* start again */ /* start again */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1531,6 +1547,7 @@ run_aggregation (void *cls)
(void) commit_or_warn (session); (void) commit_or_warn (session);
cleanup_au (); cleanup_au ();
/* start again */ /* start again */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1587,6 +1604,7 @@ run_aggregation (void *cls)
db_plugin->rollback (db_plugin->cls, db_plugin->rollback (db_plugin->cls,
session); session);
/* start again */ /* start again */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1613,6 +1631,7 @@ run_aggregation (void *cls)
/* try again */ /* try again */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Commit issue for prepared wire data; trying again later!\n"); "Commit issue for prepared wire data; trying again later!\n");
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1625,6 +1644,7 @@ run_aggregation (void *cls)
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Preparation complete, switching to transfer mode\n"); "Preparation complete, switching to transfer mode\n");
/* run alternative task: actually do wire transfer! */ /* run alternative task: actually do wire transfer! */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_transfers, task = GNUNET_SCHEDULER_add_now (&run_transfers,
NULL); NULL);
return; return;
@ -1685,6 +1705,7 @@ wire_confirm_cb (void *cls,
if (GNUNET_DB_STATUS_SOFT_ERROR == qs) if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
{ {
/* try again */ /* try again */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
} }
@ -1703,6 +1724,7 @@ wire_confirm_cb (void *cls,
{ {
case GNUNET_DB_STATUS_SOFT_ERROR: case GNUNET_DB_STATUS_SOFT_ERROR:
/* try again */ /* try again */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1716,6 +1738,7 @@ wire_confirm_cb (void *cls,
"Wire transfer complete\n"); "Wire transfer complete\n");
/* continue with #run_transfers(), just to guard /* continue with #run_transfers(), just to guard
against the unlikely case that there are more. */ against the unlikely case that there are more. */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_transfers, task = GNUNET_SCHEDULER_add_now (&run_transfers,
NULL); NULL);
return; return;
@ -1846,6 +1869,7 @@ run_transfers (void *cls)
return; return;
case GNUNET_DB_STATUS_SOFT_ERROR: case GNUNET_DB_STATUS_SOFT_ERROR:
/* try again */ /* try again */
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_transfers, task = GNUNET_SCHEDULER_add_now (&run_transfers,
NULL); NULL);
return; return;
@ -1853,6 +1877,7 @@ run_transfers (void *cls)
/* no more prepared wire transfers, go back to aggregation! */ /* no more prepared wire transfers, go back to aggregation! */
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"No more pending wire transfers, starting aggregation\n"); "No more pending wire transfers, starting aggregation\n");
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_aggregation, task = GNUNET_SCHEDULER_add_now (&run_aggregation,
NULL); NULL);
return; return;
@ -1898,6 +1923,7 @@ run (void *cls,
return; return;
} }
GNUNET_assert (NULL == task);
task = GNUNET_SCHEDULER_add_now (&run_transfers, task = GNUNET_SCHEDULER_add_now (&run_transfers,
NULL); NULL);
GNUNET_SCHEDULER_add_shutdown (&shutdown_task, GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
@ -1917,6 +1943,8 @@ main (int argc,
char *const *argv) char *const *argv)
{ {
struct GNUNET_GETOPT_CommandLineOption options[] = { struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_option_timetravel ('T',
"timetravel"),
GNUNET_GETOPT_option_flag ('t', GNUNET_GETOPT_option_flag ('t',
"test", "test",
"run in test mode and exit when idle", "run in test mode and exit when idle",

View File

@ -999,6 +999,8 @@ main (int argc,
"SECONDS", "SECONDS",
"after how long do connections timeout by default (in seconds)", "after how long do connections timeout by default (in seconds)",
&connection_timeout), &connection_timeout),
GNUNET_GETOPT_option_timetravel ('T',
"timetravel"),
#if HAVE_DEVELOPER #if HAVE_DEVELOPER
GNUNET_GETOPT_option_filename ('f', GNUNET_GETOPT_option_filename ('f',
"file-input", "file-input",

View File

@ -128,11 +128,10 @@ TEH_MHD_handler_send_json_pack_error (struct TEH_RequestHandler *rh,
(void) connection_cls; (void) connection_cls;
(void) upload_data; (void) upload_data;
(void) upload_data_size; (void) upload_data_size;
return TALER_MHD_reply_json_pack (connection, return TALER_MHD_reply_with_error (connection,
rh->response_code, rh->response_code,
"{s:s}", TALER_EC_METHOD_INVALID,
"error", rh->data);
rh->data);
} }

View File

@ -69,7 +69,7 @@ reply_refresh_melt_insufficient_funds (struct MHD_Connection *connection,
return TALER_MHD_reply_json_pack (connection, return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT, MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o, s:o, s:o, s:o, s:o}", "{s:s, s:I, s:o, s:o, s:o, s:o, s:o}",
"error", "hint",
"insufficient funds", "insufficient funds",
"code", "code",
(json_int_t) (json_int_t)

View File

@ -108,7 +108,7 @@ reply_refresh_reveal_mismatch (struct MHD_Connection *connection,
return TALER_MHD_reply_json_pack (connection, return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT, MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o}", "{s:s, s:I, s:o}",
"error", "commitment violation", "hint", "commitment violation",
"code", "code",
(json_int_t) (json_int_t)
TALER_EC_REFRESH_REVEAL_COMMITMENT_VIOLATION, TALER_EC_REFRESH_REVEAL_COMMITMENT_VIOLATION,

View File

@ -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 * Generate refund conflict failure message. Returns the
* transaction list @a tl with the details about the conflict. * transaction list @a tl with the details about the conflict.
@ -194,9 +172,10 @@ refund_transaction (void *cls,
if (0 > qs) if (0 > qs)
{ {
if (GNUNET_DB_STATUS_HARD_ERROR == qs) if (GNUNET_DB_STATUS_HARD_ERROR == qs)
*mhd_ret = reply_refund_failure (connection, *mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND, MHD_HTTP_NOT_FOUND,
TALER_EC_REFUND_COIN_NOT_FOUND); TALER_EC_REFUND_COIN_NOT_FOUND,
"database transaction failure");
return qs; return qs;
} }
deposit_found = GNUNET_NO; deposit_found = GNUNET_NO;
@ -319,9 +298,10 @@ refund_transaction (void *cls,
GNUNET_break_op (0); /* currency mismatch */ GNUNET_break_op (0); /* currency mismatch */
TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, TEH_plugin->free_coin_transaction_list (TEH_plugin->cls,
tl); tl);
*mhd_ret = reply_refund_failure (connection, *mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_PRECONDITION_FAILED, MHD_HTTP_PRECONDITION_FAILED,
TALER_EC_REFUND_CURRENCY_MISSMATCH); TALER_EC_REFUND_CURRENCY_MISSMATCH,
"currencies involved do not match");
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
@ -353,9 +333,10 @@ refund_transaction (void *cls,
/* money was already transferred to merchant, can no longer refund */ /* money was already transferred to merchant, can no longer refund */
TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, TEH_plugin->free_coin_transaction_list (TEH_plugin->cls,
tl); tl);
*mhd_ret = reply_refund_failure (connection, *mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_GONE, MHD_HTTP_GONE,
TALER_EC_REFUND_MERCHANT_ALREADY_PAID); TALER_EC_REFUND_MERCHANT_ALREADY_PAID,
"money already sent to merchant");
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
@ -366,9 +347,10 @@ refund_transaction (void *cls,
GNUNET_break_op (0); /* cannot refund more than original value */ GNUNET_break_op (0); /* cannot refund more than original value */
TEH_plugin->free_coin_transaction_list (TEH_plugin->cls, TEH_plugin->free_coin_transaction_list (TEH_plugin->cls,
tl); tl);
*mhd_ret = reply_refund_failure (connection, *mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_PRECONDITION_FAILED, MHD_HTTP_PRECONDITION_FAILED,
TALER_EC_REFUND_INSUFFICIENT_FUNDS); TALER_EC_REFUND_INSUFFICIENT_FUNDS,
"refund requested exceeds original value");
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
} }
/* Check refund fee matches fee of denomination key! */ /* Check refund fee matches fee of denomination key! */
@ -481,9 +463,10 @@ verify_and_execute_refund (struct MHD_Connection *connection,
if (0 > qs) if (0 > qs)
{ {
GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs);
return reply_refund_failure (connection, return TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND, MHD_HTTP_NOT_FOUND,
TALER_EC_REFUND_COIN_NOT_FOUND); TALER_EC_REFUND_COIN_NOT_FOUND,
"denomination of coin to be refunded not found in DB");
} }
} }

View File

@ -164,7 +164,7 @@ TEH_RESERVE_handler_reserve_status (struct TEH_RequestHandler *rh,
return TALER_MHD_reply_json_pack (connection, return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_NOT_FOUND, MHD_HTTP_NOT_FOUND,
"{s:s, s:s, s:I}", "{s:s, s:s, s:I}",
"error", "Reserve not found", "hint", "Reserve not found",
"parameter", "reserve_pub", "parameter", "reserve_pub",
"code", "code",
(json_int_t) (json_int_t)

View File

@ -74,7 +74,7 @@ reply_reserve_withdraw_insufficient_funds (struct MHD_Connection *connection,
return TALER_MHD_reply_json_pack (connection, return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT, MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o, s:o}", "{s:s, s:I, s:o, s:o}",
"error", "Insufficient funds", "hint", "insufficient funds",
"code", "code",
(json_int_t) (json_int_t)
TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS, TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS,

View File

@ -446,7 +446,7 @@ TEH_RESPONSE_reply_coin_insufficient_funds (struct MHD_Connection *connection,
return TALER_MHD_reply_json_pack (connection, return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT, MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o}", "{s:s, s:I, s:o}",
"error", "insufficient funds", "hint", "insufficient funds",
"code", (json_int_t) ec, "code", (json_int_t) ec,
"history", history); "history", history);
} }

View File

@ -340,7 +340,7 @@ history_cb (void *cls,
hh = NULL; hh = NULL;
if (TALER_EC_NONE != ec) 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", "Error fetching history: ec=%u, http_status=%u\n",
(unsigned int) ec, (unsigned int) ec,
http_status); http_status);
@ -597,7 +597,9 @@ main (int argc,
char *const *argv) char *const *argv)
{ {
struct GNUNET_GETOPT_CommandLineOption options[] = { struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_option_flag ('T', GNUNET_GETOPT_option_timetravel ('T',
"timetravel"),
GNUNET_GETOPT_option_flag ('t',
"test", "test",
"run in test mode and exit when idle", "run in test mode and exit when idle",
&test_mode), &test_mode),

View File

@ -0,0 +1,114 @@
#!/bin/bash
#
# This file is part of TALER
# Copyright (C) 2020 Taler Systems SA
#
# TALER is free software; you can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free Software
# Foundation; either version 3, or (at your option) any later version.
#
# TALER is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License along with
# TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/>
#
#
# This script launches an exchange (binding to a UNIX domain socket) and then
# restarts it in various ways (SIGHUP to re-read configuration, and SIGUSR1 to
# re-spawn a new binary). Basically, the goal is to make sure that the HTTP
# server survives these less common operations.
#
#
set -eu
# Exit, with status code "skip" (no 'real' failure)
function exit_skip() {
echo $1
exit 77
}
# Exit, with error message (hard failure)
function exit_fail() {
echo $1
kill `jobs -p` >/dev/null 2>/dev/null || true
wait
exit 1
}
echo -n "Testing for curl"
curl --version >/dev/null </dev/null || exit_skip " MISSING"
echo " FOUND"
# Clear environment from variables that override config.
unset XDG_DATA_HOME
unset XDG_CONFIG_HOME
#
echo -n "Launching exchange ..."
PREFIX=
# Uncomment this line to run with valgrind...
# PREFIX="valgrind --trace-children=yes --leak-check=yes --track-fds=yes --error-exitcode=1 --log-file=valgrind.%p"
# Setup keys.
taler-exchange-keyup -c test_taler_exchange_unix.conf || exit 1
# Setup wire accounts.
taler-exchange-wire -c test_taler_exchange_unix.conf > /dev/null || exit 1
# Run Exchange HTTPD (in background)
$PREFIX taler-exchange-httpd -c test_taler_exchange_unix.conf -i 2> test-exchange.log &
# Where should we be bound to?
UNIXPATH=`taler-config -s exchange -f -o UNIXPATH`
# Give HTTP time to start
for n in `seq 1 100`
do
echo -n "."
sleep 0.1
OK=1
curl --unix-socket "${UNIXPATH}" "http://ignored/" >/dev/null 2> /dev/null && break
OK=0
done
if [ 1 != $OK ]
then
exit_fail "Failed to launch exchange"
fi
echo " DONE"
# Finally run test...
echo -n "Reloading keys ..."
kill -SIGUSR1 $!
sleep 1
curl --unix-socket "${UNIXPATH}" "http://ignored/" >/dev/null 2> /dev/null || exit_fail "SIGUSR1 killed HTTP service"
echo " DONE"
# Finally run test...
echo -n "Restarting program ..."
kill -SIGHUP $!
sleep 1
curl --unix-socket "${UNIXPATH}" "http://ignored/" >/dev/null 2> /dev/null || exit_fail "SIGHUP killed HTTP service"
echo " DONE"
echo -n "Waiting for parent to die ..."
wait $!
echo " DONE"
echo -n "Testing child still alive ..."
curl --unix-socket "${UNIXPATH}" "http://ignored/" >/dev/null 2> /dev/null || exit_fail "SIGHUP killed HTTP service"
echo " DONE"
echo -n "Killing grandchild ..."
CPID=`ps x | grep taler-exchange-httpd | grep -v grep | awk '{print $1}'`
kill -TERM $CPID
while true
do
ps x | grep -v grep | grep taler-exchange-httpd > /dev/null || break
sleep 0.1
done
echo " DONE"
# Return status code from exchange for this script
exit 0

View File

@ -0,0 +1,137 @@
[PATHS]
# Persistant data storage for the testcase
TALER_TEST_HOME = test_taler_exchange_httpd_home/
[taler]
# Currency supported by the exchange (can only be one)
CURRENCY = EUR
CURRENCY_ROUND_UNIT = EUR:0.01
[exchange]
# Directory with our terms of service.
TERMS_DIR = ../../contrib/tos
# Etag / filename for the terms of service.
TERMS_ETAG = 0
# Directory with our privacy policy.
PRIVACY_DIR = ../../contrib/pp
# Etag / filename for the privacy policy.
PRIVACY_ETAG = 0
# MAX_REQUESTS = 2
# how long is one signkey valid?
SIGNKEY_DURATION = 4 weeks
# how long are the signatures with the signkey valid?
LEGAL_DURATION = 2 years
# how long do we generate denomination and signing keys
# ahead of time?
LOOKAHEAD_SIGN = 32 weeks 1 day
# how long do we provide to clients denomination and signing keys
# ahead of time?
LOOKAHEAD_PROVIDE = 4 weeks 1 day
# HTTP port the exchange listens to (we want to use UNIX domain sockets,
# so we use a port that just won't work on GNU/Linux without root rights)
PORT = 999
# Here we say we want to use a UNIX domain socket (to test that logic).
SERVE = unix
# Master public key used to sign the exchange's various keys
MASTER_PUBLIC_KEY = 98NJW3CQHZQGQXTY3K85K531XKPAPAVV4Q5V8PYYRR00NJGZWNVG
# How to access our database
DB = postgres
[exchangedb]
# After how long do we close idle reserves? The exchange
# and the auditor must agree on this value. We currently
# expect it to be globally defined for the whole system,
# as there is no way for wallets to query this value. Thus,
# it is only configurable for testing, and should be treated
# as constant in production.
IDLE_RESERVE_EXPIRATION_TIME = 4 weeks
[exchangedb-postgres]
CONFIG = "postgres:///talercheck"
[exchange-account-1]
PAYTO_URI = "payto://x-taler-bank/localhost:8082/3"
WIRE_RESPONSE = ${TALER_CONFIG_HOME}/account-1.json
ENABLE_DEBIT = YES
ENABLE_CREDIT = YES
TALER_BANK_AUTH_METHOD = NONE
# Wire fees are specified by wire method
[fees-x-taler-bank]
# Fees for the forseeable future...
# If you see this after 2018, update to match the next 10 years...
WIRE-FEE-2018 = EUR:0.01
WIRE-FEE-2019 = EUR:0.01
WIRE-FEE-2020 = EUR:0.01
WIRE-FEE-2021 = EUR:0.01
WIRE-FEE-2022 = EUR:0.01
WIRE-FEE-2023 = EUR:0.01
WIRE-FEE-2024 = EUR:0.01
WIRE-FEE-2025 = EUR:0.01
WIRE-FEE-2026 = EUR:0.01
WIRE-FEE-2027 = EUR:0.01
CLOSING-FEE-2018 = EUR:0.01
CLOSING-FEE-2019 = EUR:0.01
CLOSING-FEE-2020 = EUR:0.01
CLOSING-FEE-2021 = EUR:0.01
CLOSING-FEE-2022 = EUR:0.01
CLOSING-FEE-2023 = EUR:0.01
CLOSING-FEE-2024 = EUR:0.01
CLOSING-FEE-2025 = EUR:0.01
CLOSING-FEE-2026 = EUR:0.01
CLOSING-FEE-2027 = EUR:0.01
# Coins for the tests.
[coin_eur_ct_1]
value = EUR:0.01
duration_overlap = 5 minutes
duration_withdraw = 7 days
duration_spend = 2 years
duration_legal = 3 years
fee_withdraw = EUR:0.00
fee_deposit = EUR:0.00
fee_refresh = EUR:0.01
fee_refund = EUR:0.01
rsa_keysize = 1024
[coin_eur_ct_10]
value = EUR:0.10
duration_overlap = 5 minutes
duration_withdraw = 7 days
duration_spend = 2 years
duration_legal = 3 years
fee_withdraw = EUR:0.01
fee_deposit = EUR:0.01
fee_refresh = EUR:0.03
fee_refund = EUR:0.01
rsa_keysize = 1024
[coin_eur_1]
value = EUR:1
duration_overlap = 5 minutes
duration_withdraw = 7 days
duration_spend = 2 years
duration_legal = 3 years
fee_withdraw = EUR:0.01
fee_deposit = EUR:0.01
fee_refresh = EUR:0.03
fee_refund = EUR:0.01
rsa_keysize = 1024

View File

@ -15,8 +15,8 @@ pkgcfg_DATA = \
sqldir = $(prefix)/share/taler/sql/exchange/ sqldir = $(prefix)/share/taler/sql/exchange/
sql_DATA = \ sql_DATA = \
0000.sql \ exchange-0000.sql \
0001.sql \ exchange-0001.sql \
drop0000.sql drop0000.sql
EXTRA_DIST = \ EXTRA_DIST = \

View File

@ -42,7 +42,7 @@ CREATE TABLE IF NOT EXISTS denominations
,fee_refund_val INT8 NOT NULL ,fee_refund_val INT8 NOT NULL
,fee_refund_frac INT4 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 ON denominations
(expire_legal); (expire_legal);
@ -65,18 +65,18 @@ CREATE TABLE IF NOT EXISTS reserves
,gc_date INT8 NOT NULL ,gc_date INT8 NOT NULL
); );
-- index on reserves table (TODO: useless due to primary key!?) -- 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 ON reserves
(reserve_pub); (reserve_pub);
-- index for get_expired_reserves -- index for get_expired_reserves
CREATE INDEX reserves_expiration_index CREATE INDEX IF NOT EXISTS reserves_expiration_index
ON reserves ON reserves
(expiration_date (expiration_date
,current_balance_val ,current_balance_val
,current_balance_frac ,current_balance_frac
); );
-- index for reserve GC operations -- index for reserve GC operations
CREATE INDEX reserves_gc_index CREATE INDEX IF NOT EXISTS reserves_gc_index
ON reserves ON reserves
(gc_date); (gc_date);
-- reserves_in table collects the transactions which transfer funds -- 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) ,PRIMARY KEY (reserve_pub, wire_reference)
); );
-- Create indices on reserves_in -- Create indices on reserves_in
CREATE INDEX reserves_in_execution_index CREATE INDEX IF NOT EXISTS reserves_in_execution_index
ON reserves_in ON reserves_in
(exchange_account_section (exchange_account_section
,execution_date ,execution_date
); );
CREATE INDEX reserves_in_exchange_account_serial CREATE INDEX IF NOT EXISTS reserves_in_exchange_account_serial
ON reserves_in ON reserves_in
(exchange_account_section, (exchange_account_section,
reserve_in_serial_id DESC reserve_in_serial_id DESC
@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS reserves_close
,amount_frac INT4 NOT NULL ,amount_frac INT4 NOT NULL
,closing_fee_val INT8 NOT NULL ,closing_fee_val INT8 NOT NULL
,closing_fee_frac INT4 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 ON reserves_close
(reserve_pub); (reserve_pub);
-- Table with the withdraw operations that have been performed on a reserve. -- 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 ,amount_with_fee_frac INT4 NOT NULL
); );
-- Index blindcoins(reserve_pub) for get_reserves_out statement -- 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 ON reserves_out
(reserve_pub); (reserve_pub);
CREATE INDEX reserves_out_execution_date CREATE INDEX IF NOT EXISTS reserves_out_execution_date
ON reserves_out ON reserves_out
(execution_date); (execution_date);
CREATE INDEX reserves_out_for_get_withdraw_info CREATE INDEX IF NOT EXISTS reserves_out_for_get_withdraw_info
ON reserves_out ON reserves_out
(denom_pub_hash (denom_pub_hash
,h_blind_ev ,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_pub_hash BYTEA NOT NULL REFERENCES denominations (denom_pub_hash) ON DELETE CASCADE
,denom_sig BYTEA NOT NULL ,denom_sig BYTEA NOT NULL
); );
CREATE INDEX known_coins_by_denomination CREATE INDEX IF NOT EXISTS known_coins_by_denomination
ON known_coins ON known_coins
(denom_pub_hash); (denom_pub_hash);
-- Table with the commitments made when melting a coin. */ -- 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 ,amount_with_fee_frac INT4 NOT NULL
,noreveal_index 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 ON refresh_commitments
(old_coin_pub); (old_coin_pub);
-- Table with the revelations about the new coins that are to be created -- 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) ,PRIMARY KEY (rc, newcoin_index)
,UNIQUE (h_coin_ev) ,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 ON refresh_revealed_coins
(denom_pub_hash); (denom_pub_hash);
-- Table with the transfer keys of a refresh operation; includes -- 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 -- 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 -- transfer_pubs per rc, but at least in theory this helps the ORDER BY
-- clause. -- clause.
CREATE INDEX refresh_transfer_keys_coin_tpub CREATE INDEX IF NOT EXISTS refresh_transfer_keys_coin_tpub
ON refresh_transfer_keys ON refresh_transfer_keys
(rc (rc
,transfer_pub ,transfer_pub
@ -228,14 +228,14 @@ CREATE TABLE IF NOT EXISTS deposits
,UNIQUE (coin_pub, merchant_pub, h_contract_terms) ,UNIQUE (coin_pub, merchant_pub, h_contract_terms)
); );
-- Index for get_deposit_for_wtid and get_deposit_statement */ -- 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 ON deposits
(coin_pub (coin_pub
,merchant_pub ,merchant_pub
,h_contract_terms ,h_contract_terms
); );
-- Index for deposits_get_ready -- Index for deposits_get_ready
CREATE INDEX deposits_get_ready_index CREATE INDEX IF NOT EXISTS deposits_get_ready_index
ON deposits ON deposits
(tiny (tiny
,done ,done
@ -243,7 +243,7 @@ CREATE INDEX deposits_get_ready_index
,refund_deadline ,refund_deadline
); );
-- Index for deposits_iterate_matching -- Index for deposits_iterate_matching
CREATE INDEX deposits_iterate_matching CREATE INDEX IF NOT EXISTS deposits_iterate_matching
ON deposits ON deposits
(merchant_pub (merchant_pub
,h_wire ,h_wire
@ -265,7 +265,7 @@ CREATE TABLE IF NOT EXISTS refunds
,amount_with_fee_frac INT4 NOT NULL ,amount_with_fee_frac INT4 NOT NULL
,PRIMARY KEY (coin_pub, merchant_pub, h_contract_terms, rtransaction_id) ,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 ON refunds
(coin_pub); (coin_pub);
-- This table contains the data for -- 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 ,wtid_raw BYTEA CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE
); );
-- Index for lookup_transactions statement on wtid -- 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 ON aggregation_tracking
(wtid_raw); (wtid_raw);
-- Table for the wire fees. -- 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) ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
,PRIMARY KEY (wire_method, start_date) ,PRIMARY KEY (wire_method, start_date)
); );
CREATE INDEX wire_fee_gc_index CREATE INDEX IF NOT EXISTS wire_fee_gc_index
ON wire_fee ON wire_fee
(end_date); (end_date);
-- Table for /recoup information -- Table for /recoup information
@ -317,13 +317,13 @@ CREATE TABLE IF NOT EXISTS recoup
,timestamp INT8 NOT NULL ,timestamp INT8 NOT NULL
,h_blind_ev BYTEA NOT NULL REFERENCES reserves_out (h_blind_ev) ON DELETE CASCADE ,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 ON recoup
(coin_pub); (coin_pub);
CREATE INDEX recoup_by_h_blind_ev CREATE INDEX IF NOT EXISTS recoup_by_h_blind_ev
ON recoup ON recoup
(h_blind_ev); (h_blind_ev);
CREATE INDEX recoup_for_by_reserve CREATE INDEX IF NOT EXISTS recoup_for_by_reserve
ON recoup ON recoup
(coin_pub (coin_pub
,h_blind_ev ,h_blind_ev
@ -340,13 +340,13 @@ CREATE TABLE IF NOT EXISTS recoup_refresh
,timestamp INT8 NOT NULL ,timestamp INT8 NOT NULL
,h_blind_ev BYTEA NOT NULL REFERENCES refresh_revealed_coins (h_coin_ev) ON DELETE CASCADE ,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 ON recoup_refresh
(coin_pub); (coin_pub);
CREATE INDEX recoup_refresh_by_h_blind_ev CREATE INDEX IF NOT EXISTS recoup_refresh_by_h_blind_ev
ON recoup_refresh ON recoup_refresh
(h_blind_ev); (h_blind_ev);
CREATE INDEX recoup_refresh_for_by_reserve CREATE INDEX IF NOT EXISTS recoup_refresh_for_by_reserve
ON recoup_refresh ON recoup_refresh
(coin_pub (coin_pub
,h_blind_ev ,h_blind_ev
@ -360,7 +360,7 @@ CREATE TABLE IF NOT EXISTS prewire
,buf BYTEA NOT NULL ,buf BYTEA NOT NULL
); );
-- Index for wire_prepare_data_get and gc_prewire statement -- 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 ON prewire
(finished); (finished);

View File

@ -35,7 +35,6 @@ TALER_EXCHANGEDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg)
{ {
char *plugin_name; char *plugin_name;
char *lib_name; char *lib_name;
struct GNUNET_CONFIGURATION_Handle *cfg_dup;
struct TALER_EXCHANGEDB_Plugin *plugin; struct TALER_EXCHANGEDB_Plugin *plugin;
if (GNUNET_SYSERR == if (GNUNET_SYSERR ==
@ -53,13 +52,12 @@ TALER_EXCHANGEDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg)
"libtaler_plugin_exchangedb_%s", "libtaler_plugin_exchangedb_%s",
plugin_name); plugin_name);
GNUNET_free (plugin_name); GNUNET_free (plugin_name);
cfg_dup = GNUNET_CONFIGURATION_dup (cfg); plugin = GNUNET_PLUGIN_load (lib_name,
plugin = GNUNET_PLUGIN_load (lib_name, cfg_dup); (void *) cfg);
if (NULL != plugin) if (NULL != plugin)
plugin->library_name = lib_name; plugin->library_name = lib_name;
else else
GNUNET_free (lib_name); GNUNET_free (lib_name);
GNUNET_CONFIGURATION_destroy (cfg_dup);
return plugin; return plugin;
} }

View File

@ -109,10 +109,9 @@ struct PostgresClosure
pthread_key_t db_conn_threadlocal; pthread_key_t db_conn_threadlocal;
/** /**
* Database connection string, as read from * Our configuration.
* the configuration.
*/ */
char *connection_cfg_str; const struct GNUNET_CONFIGURATION_Handle *cfg;
/** /**
* Directory with SQL statements to run to create tables. * Directory with SQL statements to run to create tables.
@ -158,16 +157,12 @@ postgres_drop_tables (void *cls)
{ {
struct PostgresClosure *pc = cls; struct PostgresClosure *pc = cls;
struct GNUNET_PQ_Context *conn; struct GNUNET_PQ_Context *conn;
char *drop_dir;
GNUNET_asprintf (&drop_dir, conn = GNUNET_PQ_connect_with_cfg (pc->cfg,
"%sdrop", "exchangedb-postgres",
pc->sql_dir); "drop",
conn = GNUNET_PQ_connect (pc->connection_cfg_str, NULL,
drop_dir, NULL);
NULL,
NULL);
GNUNET_free (drop_dir);
if (NULL == conn) if (NULL == conn)
return GNUNET_SYSERR; return GNUNET_SYSERR;
GNUNET_PQ_disconnect (conn); GNUNET_PQ_disconnect (conn);
@ -187,10 +182,11 @@ postgres_create_tables (void *cls)
struct PostgresClosure *pc = cls; struct PostgresClosure *pc = cls;
struct GNUNET_PQ_Context *conn; struct GNUNET_PQ_Context *conn;
conn = GNUNET_PQ_connect (pc->connection_cfg_str, conn = GNUNET_PQ_connect_with_cfg (pc->cfg,
pc->sql_dir, "exchangedb-postgres",
NULL, "exchange-",
NULL); NULL,
NULL);
if (NULL == conn) if (NULL == conn)
return GNUNET_SYSERR; return GNUNET_SYSERR;
GNUNET_PQ_disconnect (conn); GNUNET_PQ_disconnect (conn);
@ -1387,10 +1383,11 @@ postgres_get_session (void *cls)
GNUNET_PQ_PREPARED_STATEMENT_END GNUNET_PQ_PREPARED_STATEMENT_END
}; };
db_conn = GNUNET_PQ_connect (pc->connection_cfg_str, db_conn = GNUNET_PQ_connect_with_cfg (pc->cfg,
NULL, "exchangedb-postgres",
es, NULL,
ps); es,
ps);
} }
if (NULL == db_conn) if (NULL == db_conn)
return NULL; return NULL;
@ -5371,10 +5368,11 @@ postgres_gc (void *cls)
GNUNET_PQ_PREPARED_STATEMENT_END GNUNET_PQ_PREPARED_STATEMENT_END
}; };
conn = GNUNET_PQ_connect (pg->connection_cfg_str, conn = GNUNET_PQ_connect_with_cfg (pg->cfg,
NULL, "exchangedb-postgres",
NULL, NULL,
ps); NULL,
ps);
} }
if (NULL == conn) if (NULL == conn)
return GNUNET_SYSERR; return GNUNET_SYSERR;
@ -7212,12 +7210,12 @@ postgres_select_deposits_missing_wire (void *cls,
void * void *
libtaler_plugin_exchangedb_postgres_init (void *cls) libtaler_plugin_exchangedb_postgres_init (void *cls)
{ {
struct GNUNET_CONFIGURATION_Handle *cfg = cls; const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
struct PostgresClosure *pg; struct PostgresClosure *pg;
struct TALER_EXCHANGEDB_Plugin *plugin; struct TALER_EXCHANGEDB_Plugin *plugin;
const char *ec;
pg = GNUNET_new (struct PostgresClosure); pg = GNUNET_new (struct PostgresClosure);
pg->cfg = cfg;
pg->main_self = pthread_self (); /* loaded while single-threaded! */ pg->main_self = pthread_self (); /* loaded while single-threaded! */
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_filename (cfg, GNUNET_CONFIGURATION_get_value_filename (cfg,
@ -7239,28 +7237,6 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
GNUNET_free (pg); GNUNET_free (pg);
return NULL; return NULL;
} }
ec = getenv ("TALER_EXCHANGEDB_POSTGRES_CONFIG");
if (NULL != ec)
{
pg->connection_cfg_str = GNUNET_strdup (ec);
}
else
{
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
"exchangedb-postgres",
"CONFIG",
&pg->connection_cfg_str))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"exchangedb-postgres",
"CONFIG");
GNUNET_free (pg->sql_dir);
GNUNET_free (pg);
return NULL;
}
}
if ( (GNUNET_OK != if ( (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_time (cfg, GNUNET_CONFIGURATION_get_value_time (cfg,
"exchangedb", "exchangedb",
@ -7276,7 +7252,6 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"exchangedb", "exchangedb",
"LEGAL/IDLE_RESERVE_EXPIRATION_TIME"); "LEGAL/IDLE_RESERVE_EXPIRATION_TIME");
GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg->sql_dir); GNUNET_free (pg->sql_dir);
GNUNET_free (pg); GNUNET_free (pg);
return NULL; return NULL;
@ -7290,7 +7265,6 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"taler", "taler",
"CURRENCY"); "CURRENCY");
GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg->sql_dir); GNUNET_free (pg->sql_dir);
GNUNET_free (pg); GNUNET_free (pg);
return NULL; return NULL;
@ -7406,7 +7380,6 @@ libtaler_plugin_exchangedb_postgres_done (void *cls)
/* If we launched a session for the main thread, /* If we launched a session for the main thread,
kill it here before we unload */ kill it here before we unload */
db_conn_destroy (pg->main_session); db_conn_destroy (pg->main_session);
GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg->sql_dir); GNUNET_free (pg->sql_dir);
GNUNET_free (pg->currency); GNUNET_free (pg->currency);
GNUNET_free (pg); GNUNET_free (pg);

View File

@ -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 *********************** */ /* ********************* /admin/add/incoming *********************** */
@ -160,7 +227,7 @@ TALER_BANK_admin_add_incoming_cancel (struct
TALER_BANK_AdminAddIncomingHandle *aai); TALER_BANK_AdminAddIncomingHandle *aai);
/* ********************* /taler/transfer *********************** */ /* ********************* /transfer *********************** */
/** /**
* Prepare for exeuction of a wire transfer. * Prepare for exeuction of a wire transfer.
@ -243,7 +310,7 @@ TALER_BANK_execute_wire_transfer_cancel (struct
TALER_BANK_WireExecuteHandle *weh); TALER_BANK_WireExecuteHandle *weh);
/* ********************* /taler/credits *********************** */ /* ********************* /history/incoming *********************** */
/** /**
* Handle for querying the bank for transactions * Handle for querying the bank for transactions
@ -347,7 +414,7 @@ void
TALER_BANK_credit_history_cancel (struct TALER_BANK_CreditHistoryHandle *hh); TALER_BANK_credit_history_cancel (struct TALER_BANK_CreditHistoryHandle *hh);
/* ********************* /taler/debits *********************** */ /* ********************* /history/outgoing *********************** */
/** /**
* Handle for querying the bank for transactions * Handle for querying the bank for transactions

View File

@ -80,6 +80,11 @@ enum TALER_ErrorCode
*/ */
TALER_EC_JSON_ALLOCATION_FAILURE = 7, 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 * The exchange failed to even just initialize its connection to the
* database. This response is provided with HTTP status code * database. This response is provided with HTTP status code

View File

@ -44,10 +44,12 @@ struct TALER_FAKEBANK_Handle;
* would have issued the correct wire transfer orders. * would have issued the correct wire transfer orders.
* *
* @param port port to listen to * @param port port to listen to
* @param currency which currency should the bank offer
* @return NULL on error * @return NULL on error
*/ */
struct TALER_FAKEBANK_Handle * struct TALER_FAKEBANK_Handle *
TALER_FAKEBANK_start (uint16_t port); TALER_FAKEBANK_start (uint16_t port,
const char *currency);
/** /**

View File

@ -635,7 +635,7 @@ typedef void
* @param main_cb the "run" method which coontains all the * @param main_cb the "run" method which coontains all the
* commands. * commands.
* @param main_cb_cls a closure for "run", typically NULL. * @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 * @param exchanged exchange process handle: will be put in the
* state as some commands - e.g. revoke - need to send * state as some commands - e.g. revoke - need to send
* signal to it, for example to let it know to reload the * signal to it, for example to let it know to reload the
@ -650,7 +650,7 @@ typedef void
int int
TALER_TESTING_setup (TALER_TESTING_Main main_cb, TALER_TESTING_setup (TALER_TESTING_Main main_cb,
void *main_cb_cls, void *main_cb_cls,
const char *config_filename, const struct GNUNET_CONFIGURATION_Handle *cfg,
struct GNUNET_OS_Process *exchanged, struct GNUNET_OS_Process *exchanged,
int exchange_connect); int exchange_connect);
@ -789,11 +789,13 @@ TALER_TESTING_run_bank (const char *config_filename,
* from the base URL. * from the base URL.
* *
* @param bank_url bank's base URL. * @param bank_url bank's base URL.
* @param currency currency the bank uses
* @return the fakebank process handle, or NULL if any * @return the fakebank process handle, or NULL if any
* error occurs. * error occurs.
*/ */
struct TALER_FAKEBANK_Handle * struct TALER_FAKEBANK_Handle *
TALER_TESTING_run_fakebank (const char *bank_url); TALER_TESTING_run_fakebank (const char *bank_url,
const char *currency);
/** /**

View File

@ -81,7 +81,8 @@ TALER_JSON_get_error_code (const json_t *json)
so we are dealing with a missing error code here. */ so we are dealing with a missing error code here. */
if (NULL == jc) 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; return TALER_EC_INVALID;
} }
if (json_is_integer (jc)) if (json_is_integer (jc))

View File

@ -52,6 +52,7 @@ static struct GNUNET_OS_Process *bankd;
*/ */
static int with_fakebank; static int with_fakebank;
/** /**
* Main function that will tell the interpreter what commands to * Main function that will tell the interpreter what commands to
* run. * 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 int
main (int argc, main (int argc,
char *const *argv) char *const *argv)
{ {
int rv;
const char *cfgfilename; const char *cfgfilename;
int rv;
/* These environment variables get in the way... */ /* These environment variables get in the way... */
unsetenv ("XDG_DATA_HOME"); unsetenv ("XDG_DATA_HOME");
@ -165,12 +186,13 @@ main (int argc,
return 77; return 77;
} }
} }
if (GNUNET_OK !=
rv = (GNUNET_OK == TALER_TESTING_setup (&run, GNUNET_CONFIGURATION_parse_and_run (cfgfilename,
NULL, &setup_with_cfg,
cfgfilename, NULL))
NULL, rv = 1;
GNUNET_NO)) ? 0 : 1; else
rv = 0;
if (GNUNET_NO == with_fakebank) if (GNUNET_NO == with_fakebank)
{ {

View File

@ -57,36 +57,6 @@ static char *config_filename;
#define USER42_ACCOUNT "42" #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. * 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 int
main (int argc, main (int argc,
char *const argv[]) char *const argv[])
@ -507,12 +519,6 @@ main (int argc,
return result; 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 (config_filename);
GNUNET_free (testname); GNUNET_free (testname);
dbc.plugin->drop_tables (dbc.plugin->cls); dbc.plugin->drop_tables (dbc.plugin->cls);

View File

@ -67,7 +67,7 @@ wirewatch_run (void *cls,
"taler-exchange-wirewatch", "taler-exchange-wirewatch",
"taler-exchange-wirewatch", "taler-exchange-wirewatch",
"-c", ws->config_filename, "-c", ws->config_filename,
"-T", /* exit when done */ "-t", /* exit when done */
NULL); NULL);
if (NULL == ws->wirewatch_proc) if (NULL == ws->wirewatch_proc)
{ {

View File

@ -36,11 +36,13 @@
* from the base URL. * from the base URL.
* *
* @param bank_url bank's base URL. * @param bank_url bank's base URL.
* @param currency currency the bank uses
* @return the fakebank process handle, or NULL if any * @return the fakebank process handle, or NULL if any
* error occurs. * error occurs.
*/ */
struct TALER_FAKEBANK_Handle * 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; const char *port;
long pnum; long pnum;
@ -56,7 +58,8 @@ TALER_TESTING_run_fakebank (const char *bank_url)
"Starting Fakebank on port %u (%s)\n", "Starting Fakebank on port %u (%s)\n",
(unsigned int) pnum, (unsigned int) pnum,
bank_url); bank_url);
fakebankd = TALER_FAKEBANK_start ((uint16_t) pnum); fakebankd = TALER_FAKEBANK_start ((uint16_t) pnum,
currency);
if (NULL == fakebankd) if (NULL == fakebankd)
{ {
GNUNET_break (0); GNUNET_break (0);

View File

@ -788,7 +788,7 @@ TALER_TESTING_setup_with_exchange_cfg (void *cls,
/* NOTE: this call blocks. */ /* NOTE: this call blocks. */
result = TALER_TESTING_setup (setup_ctx->main_cb, result = TALER_TESTING_setup (setup_ctx->main_cb,
setup_ctx->main_cb_cls, setup_ctx->main_cb_cls,
setup_ctx->config_filename, cfg,
exchanged, exchanged,
GNUNET_YES); GNUNET_YES);
GNUNET_break (0 == GNUNET_break (0 ==

View File

@ -124,7 +124,33 @@ TALER_TESTING_run_with_fakebank (struct TALER_TESTING_Interpreter *is,
struct TALER_TESTING_Command *commands, struct TALER_TESTING_Command *commands,
const char *bank_url) 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",
&currency))
{
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) if (NULL == is->fakebank)
{ {
GNUNET_break (0); GNUNET_break (0);
@ -529,14 +555,6 @@ struct MainContext
*/ */
struct TALER_TESTING_Interpreter *is; 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. * URL of the exchange.
*/ */
@ -683,18 +701,16 @@ do_abort (void *cls)
* and responsible to run the "run" method. * and responsible to run the "run" method.
* *
* @param cls a `struct MainContext *` * @param cls a `struct MainContext *`
* @param cfg configuration to use
*/ */
static int static void
main_exchange_connect_with_cfg (void *cls, main_wrapper_exchange_connect (void *cls)
const struct GNUNET_CONFIGURATION_Handle *cfg)
{ {
struct MainContext *main_ctx = cls; struct MainContext *main_ctx = cls;
struct TALER_TESTING_Interpreter *is = main_ctx->is; struct TALER_TESTING_Interpreter *is = main_ctx->is;
char *exchange_url; char *exchange_url;
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg, GNUNET_CONFIGURATION_get_value_string (is->cfg,
"exchange", "exchange",
"BASE_URL", "BASE_URL",
&exchange_url)) &exchange_url))
@ -702,40 +718,18 @@ main_exchange_connect_with_cfg (void *cls,
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"exchange", "exchange",
"BASE_URL"); "BASE_URL");
return GNUNET_SYSERR; return;
} }
main_ctx->exchange_url = exchange_url; main_ctx->exchange_url = exchange_url;
is->cfg = cfg;
is->timeout_task = GNUNET_SCHEDULER_add_shutdown (&do_abort, is->timeout_task = GNUNET_SCHEDULER_add_shutdown (&do_abort,
main_ctx); main_ctx);
GNUNET_break GNUNET_break
(NULL != (is->exchange = TALER_EXCHANGE_connect (NULL != (is->exchange =
(is->ctx, TALER_EXCHANGE_connect (is->ctx,
exchange_url, exchange_url,
&TALER_TESTING_cert_cb, &TALER_TESTING_cert_cb,
main_ctx, main_ctx,
TALER_EXCHANGE_OPTION_END))); 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));
} }
@ -746,7 +740,7 @@ main_wrapper_exchange_connect (void *cls)
* @param main_cb the "run" method which contains all the * @param main_cb the "run" method which contains all the
* commands. * commands.
* @param main_cb_cls a closure for "run", typically NULL. * @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 * @param exchanged exchange process handle: will be put in the
* state as some commands - e.g. revoke - need to send * state as some commands - e.g. revoke - need to send
* signal to it, for example to let it know to reload the * signal to it, for example to let it know to reload the
@ -761,7 +755,7 @@ main_wrapper_exchange_connect (void *cls)
int int
TALER_TESTING_setup (TALER_TESTING_Main main_cb, TALER_TESTING_setup (TALER_TESTING_Main main_cb,
void *main_cb_cls, void *main_cb_cls,
const char *config_filename, const struct GNUNET_CONFIGURATION_Handle *cfg,
struct GNUNET_OS_Process *exchanged, struct GNUNET_OS_Process *exchanged,
int exchange_connect) int exchange_connect)
{ {
@ -771,9 +765,6 @@ TALER_TESTING_setup (TALER_TESTING_Main main_cb,
.main_cb_cls = main_cb_cls, .main_cb_cls = main_cb_cls,
/* needed to init the curl ctx */ /* needed to init the curl ctx */
.is = &is, .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; struct GNUNET_SIGNAL_Context *shc_chld;
@ -781,6 +772,7 @@ TALER_TESTING_setup (TALER_TESTING_Main main_cb,
0, 0,
sizeof (is)); sizeof (is));
is.exchanged = exchanged; is.exchanged = exchanged;
is.cfg = cfg;
sigpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, sigpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO,
GNUNET_NO, GNUNET_NO); GNUNET_NO, GNUNET_NO);
GNUNET_assert (NULL != sigpipe); GNUNET_assert (NULL != sigpipe);