summaryrefslogtreecommitdiff
path: root/texinfo/challenger.texi
diff options
context:
space:
mode:
Diffstat (limited to 'texinfo/challenger.texi')
-rw-r--r--texinfo/challenger.texi1501
1 files changed, 1501 insertions, 0 deletions
diff --git a/texinfo/challenger.texi b/texinfo/challenger.texi
new file mode 100644
index 00000000..9dd4654f
--- /dev/null
+++ b/texinfo/challenger.texi
@@ -0,0 +1,1501 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename challenger.info
+@documentencoding UTF-8
+@ifinfo
+@*Generated by Sphinx 5.3.0.@*
+@end ifinfo
+@settitle Taler Challenger Manual
+@defindex ge
+@paragraphindent 0
+@exampleindent 4
+@finalout
+@dircategory Network applications
+@direntry
+* GNU Taler Challenger: (challenger.info). Customer address validation service
+@end direntry
+
+@c %**end of header
+
+@copying
+@quotation
+GNU Taler 0.10.0, May 15, 2024
+
+GNU Taler team
+
+Copyright @copyright{} 2014-2024 Taler Systems SA (GPLv3+ or GFDL 1.3+)
+@end quotation
+
+@end copying
+
+@titlepage
+@title Taler Challenger Manual
+@insertcopying
+@end titlepage
+@contents
+
+@c %** start of user preamble
+
+@c %** end of user preamble
+
+@ifnottex
+@node Top
+@top Taler Challenger Manual
+@insertcopying
+@end ifnottex
+
+@c %**start of body
+@anchor{taler-challenger-manual doc}@anchor{0}
+@c This file is part of GNU TALER.
+@c
+@c Copyright (C) 2023, 2024 Taler Systems SA
+@c
+@c TALER is free software; you can redistribute it and/or modify it under the
+@c terms of the GNU Affero General Public License as published by the Free Software
+@c Foundation; either version 2.1, or (at your option) any later version.
+@c
+@c TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+@c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+@c A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+@c
+@c You should have received a copy of the GNU Affero General Public License along with
+@c TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+@c
+@c @author Christian Grothoff
+@c @author Florian Dold
+
+@menu
+* Introduction::
+* Installation::
+* Configuration Fundamentals::
+* Deployment::
+* Template Customization::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* About Challenger::
+* About this manual::
+* Architecture overview::
+
+Installation
+
+* Installing from source::
+* Installing the Challenger binary packages on Debian::
+* Installing the GNU Taler binary packages on Trisquel::
+* Installing the GNU Taler binary packages on Ubuntu::
+* Services@comma{} users@comma{} groups and file system hierarchy: Services users groups and file system hierarchy.
+
+Configuration Fundamentals
+
+* Configuration format::
+* Fundamental Setup; Address validation: Fundamental Setup Address validation.
+* Legal conditions for using the service::
+* Terms of Service::
+* Privacy Policy::
+* Legal policies directory layout::
+* Generating the Legal Terms::
+* Adding translations::
+* Updating legal documents::
+* Database Configuration::
+
+Legal policies directory layout
+
+* Example::
+
+Deployment
+
+* Serving::
+* Reverse Proxy Setup::
+* Launching Challenger::
+* Authorizing clients::
+* OAuth 2.0 integration: OAuth 2 0 integration.
+* Database management::
+
+Template Customization
+
+* enter-$ADDRESS_TYPE-form::
+* enter-tan-form::
+* invalid-pin::
+* validation-unknown::
+* invalid-request::
+* internal-error::
+
+@end detailmenu
+@end menu
+
+@node Introduction,Installation,Top,Top
+@anchor{taler-challenger-manual challenger-operator-manual}@anchor{1}@anchor{taler-challenger-manual introduction}@anchor{2}
+@chapter Introduction
+
+
+@menu
+* About Challenger::
+* About this manual::
+* Architecture overview::
+
+@end menu
+
+@node About Challenger,About this manual,,Introduction
+@anchor{taler-challenger-manual about-challenger}@anchor{3}
+@section About Challenger
+
+
+Challenger is an OAuth 2.0-compatible address validation service.
+By redirecting a user-agent to a Challenger service a client can
+have Challenger validate that the user is able to receive messages
+at a particular address and obtain that address via the @code{/info}
+endpoint.
+
+@node About this manual,Architecture overview,About Challenger,Introduction
+@anchor{taler-challenger-manual about-this-manual}@anchor{4}
+@section About this manual
+
+
+This manual targets system administrators who want to install,
+operate or integrate a challenger service. To report issues
+or learn about known limitations, please check our
+bug tracker@footnote{https://bugs.taler.net}.
+
+@node Architecture overview,,About this manual,Introduction
+@anchor{taler-challenger-manual architecture-overview}@anchor{5}
+@section Architecture overview
+
+
+The following picture gives an overview of the Challenger
+architecture and the main interactions:
+
+@image{challenger-figures/challenger,,,,png}
+
+Here, the `resource owner' is a user that is in control
+of some `address' at a messaging service. This could be
+an e-mail account, a mobile phone number (for SMS), or
+a physical mail address (using the post office as the
+messaging service).
+
+The `resource owner' makes some request that requires
+some `client' to be in need of address validation. The
+`client' is registered with the Challenger OAuth 2.0
+service and first authorizes an address validation to
+be initiated. The client then redirects the resource
+owner to the Challenger service. In step (2), the resource
+owner submits the address that they claim to own.
+
+The Challenger service then creates a TAN code and
+submits it to the given address via a configurable
+`helper script' that is specific to the type of address
+being validated. When the resource owner submits the
+correct TAN code in step (6), they are given a token
+that they can provide to the client. Using this token
+the client can then finally obtain the now validated
+address in step (8).
+
+Address data, TAN codes and meta-data such as the number
+of failed attempts to submit a TAN code are recorded
+in a Postgres database by the Challenger service.
+
+@node Installation,Configuration Fundamentals,Introduction,Top
+@anchor{taler-challenger-manual challengerinstallation}@anchor{6}@anchor{taler-challenger-manual installation}@anchor{7}
+@chapter Installation
+
+
+In this guide’s shell-session fragments, the command prompt shows two pieces
+of information:
+
+
+@itemize *
+
+@item
+Who is performing the command
+(@code{$user} vs @code{root}, and ending character @code{$} vs @code{#}).
+@end itemize
+
+@menu
+* Installing from source::
+* Installing the Challenger binary packages on Debian::
+* Installing the GNU Taler binary packages on Trisquel::
+* Installing the GNU Taler binary packages on Ubuntu::
+* Services@comma{} users@comma{} groups and file system hierarchy: Services users groups and file system hierarchy.
+
+@end menu
+
+@node Installing from source,Installing the Challenger binary packages on Debian,,Installation
+@anchor{taler-challenger-manual installing-from-source}@anchor{8}
+@section Installing from source
+
+
+The following instructions will show how to install libgnunetutil and
+the core GNU Taler libraries from source.
+
+The package sources can be find in our
+download directory@footnote{http://ftpmirror.gnu.org/taler/}.
+
+GNU Taler components version numbers follow the @code{MAJOR.MINOR.MICRO} format.
+The general rule for compatibility is that @code{MAJOR} and @code{MINOR} must match.
+Exceptions to this general rule are documented in the release notes.
+For example, Challenger 1.3.0 should be compatible with Taler exchange 1.4.x
+as the MAJOR version matches. A MAJOR version of 0 indicates experimental
+development, and you are expected to always run all of the `latest' releases
+together (no compatibility guarantees).
+
+First, the following packages need to be installed before we can compile the
+backend:
+
+
+@itemize -
+
+@item
+“Sphinx RTD Theme” Python package aka @code{python3-sphinx-rtd-theme}
+on Debian-based systems (for GNUnet documentation support, can be
+omitted if GNUnet is configured with @code{--disable-documentation})
+
+@item
+libsqlite3 >= 3.16.2
+
+@item
+GNU libunistring >= 0.9.3
+
+@item
+libcurl >= 7.26 (or libgnurl >= 7.26)
+
+@item
+libqrencode >= 4.0.0 (Taler merchant only)
+
+@item
+GNU libgcrypt >= 1.6 (1.10 or later highly recommended)
+
+@item
+libsodium >= 1.0
+
+@item
+libargon2 >= 20171227
+
+@item
+libjansson >= 2.7
+
+@item
+PostgreSQL >= 15, including libpq
+
+@item
+GNU libmicrohttpd >= 0.9.71
+
+@item
+GNUnet >= 0.20 (from source tarball@footnote{http://ftpmirror.gnu.org/gnunet/})
+
+@item
+Python3 with @code{jinja2}
+@end itemize
+
+If you are on Debian stable or later, the following command may help you
+install these dependencies:
+
+@example
+# apt-get install \
+ libqrencode-dev \
+ libsqlite3-dev \
+ libltdl-dev \
+ libunistring-dev \
+ libsodium-dev \
+ libargon2-dev \
+ libcurl4-gnutls-dev \
+ libgcrypt20-dev \
+ libjansson-dev \
+ libpq-dev \
+ libmicrohttpd-dev \
+ python3-jinja2 \
+ postgresql-15
+@end example
+
+Before you install GNUnet, you must download and install the dependencies
+mentioned in the previous section, otherwise the build may succeed, but could
+fail to export some of the tooling required by GNU Taler.
+
+On Ubuntu, you also need to install pkg-config, for example:
+
+@example
+$ apt-get install pkg-config
+@end example
+
+To install GNUnet, unpack the tarball and change
+into the resulting directory, then proceed as follows:
+
+@example
+$ ./configure [--prefix=GNUNETPFX]
+$ # Each dependency can be fetched from non standard locations via
+$ # the '--with-<LIBNAME>' option. See './configure --help'.
+$ make
+# make install
+# ldconfig
+@end example
+
+If you did not specify a prefix, GNUnet will install to @code{/usr/local},
+which requires you to run the last step as @code{root}.
+The @code{ldconfig} command (also run as @code{root}) makes the
+shared object libraries (@code{.so} files)
+visible to the various installed programs.
+
+Please note that unlike most packages, if you want to run the @code{make check}
+command, you should run it only `after' having done @code{make install}. The
+latter ensures that necessary binaries are copied to the right place.
+
+In any case, if @code{make check} fails, please consider filing a
+bug report with the Taler bug tracker@footnote{https://bugs.taler.net}.
+
+There is no need to actually run a GNUnet peer or a Taler exchange to use
+Challenger – all Challenger needs from GNUnet and Taler are a number of
+headers and libraries!
+
+After installing GNUnet, unpack the GNU Taler exchange tarball,
+change into the resulting directory, and proceed as follows:
+
+@example
+$ ./configure [--prefix=EXCHANGEPFX] \
+ [--with-gnunet=GNUNETPFX]
+$ # Each dependency can be fetched from non standard locations via
+$ # the '--with-<LIBNAME>' option. See './configure --help'.
+$ make
+# make install
+@end example
+
+If you did not specify a prefix, the exchange will install to @code{/usr/local},
+which requires you to run the last step as @code{root}. You have to specify
+@code{--with-gnunet=/usr/local} if you installed GNUnet to @code{/usr/local} in the
+previous step.
+
+TBD.
+
+Please note that unlike most packages, if you want to run the @code{make check}
+command, you should run it only `after' having done @code{make install}. The
+latter ensures that necessary binaries are copied to the right place.
+
+In any case, if @code{make check} fails, please consider filing a
+bug report with the Taler bug tracker@footnote{https://bugs.taler.net}.
+
+@node Installing the Challenger binary packages on Debian,Installing the GNU Taler binary packages on Trisquel,Installing from source,Installation
+@anchor{taler-challenger-manual installing-the-challenger-binary-packages-on-debian}@anchor{9}
+@section Installing the Challenger binary packages on Debian
+
+
+To install the GNU Taler Debian packages, first ensure that you have
+the right Debian distribution. At this time, the packages are built for
+Debian bookworm.
+
+You need to add a file to import the GNU Taler packages. Typically,
+this is done by adding a file @code{/etc/apt/sources.list.d/taler.list} that
+looks like this:
+
+@example
+deb [signed-by=/etc/apt/keyrings/taler-systems.gpg] https://deb.taler.net/apt/debian bookworm main
+@end example
+
+Next, you must import the Taler Systems SA public package signing key
+into your keyring and update the package lists:
+
+@example
+# wget -O /etc/apt/keyrings/taler-systems.gpg \
+ https://taler.net/taler-systems.gpg
+# apt update
+@end example
+
+@cartouche
+@quotation Note
+You may want to verify the correctness of the Taler Systems SA key out-of-band.
+@end quotation
+@end cartouche
+
+Now your system is ready to install the official GNU Taler binary packages
+using apt.
+
+To install the Challenger, you can now simply run:
+
+@example
+# apt install challenger
+@end example
+
+Note that the package does not perform any configuration work except for
+setting up the various users and the systemd service scripts. You still must
+configure at least the database, HTTP reverse proxy (typically with TLS
+certificates) and the terms of service.
+
+@node Installing the GNU Taler binary packages on Trisquel,Installing the GNU Taler binary packages on Ubuntu,Installing the Challenger binary packages on Debian,Installation
+@anchor{taler-challenger-manual installing-the-gnu-taler-binary-packages-on-trisquel}@anchor{a}
+@section Installing the GNU Taler binary packages on Trisquel
+
+
+To install the GNU Taler Trisquel packages, first ensure that you have
+the right Trisquel distribution. Packages are currently available for
+Trisquel GNU/Linux 10.0. Simply follow the same instructions provided
+for Ubuntu.
+
+@node Installing the GNU Taler binary packages on Ubuntu,Services users groups and file system hierarchy,Installing the GNU Taler binary packages on Trisquel,Installation
+@anchor{taler-challenger-manual installing-the-gnu-taler-binary-packages-on-ubuntu}@anchor{b}
+@section Installing the GNU Taler binary packages on Ubuntu
+
+
+To install the GNU Taler Ubuntu packages, first ensure that you have
+the right Ubuntu distribution. At this time, the packages are built for
+Ubuntu Lunar and Ubuntu Jammy. Make sure to have @code{universe} in your
+@code{/etc/apt/sources.list} (after @code{main}) as we depend on some packages
+from Ubuntu @code{universe}.
+
+A typical @code{/etc/apt/sources.list.d/taler.list} file for this setup
+would look like this for Ubuntu Lunar:
+
+@example
+deb [signed-by=/etc/apt/keyrings/taler-systems.gpg] https://deb.taler.net/apt/ubuntu/ lunar taler-lunar
+@end example
+
+For Ubuntu Mantic use this instead:
+
+@example
+deb [signed-by=/etc/apt/keyrings/taler-systems.gpg] https://deb.taler.net/apt/ubuntu/ mantic taler-mantic
+@end example
+
+For Ubuntu Noble use this instead:
+
+@example
+deb [signed-by=/etc/apt/keyrings/taler-systems.gpg] https://deb.taler.net/apt/ubuntu/ noble taler-noble
+@end example
+
+Next, you must import the Taler Systems SA public package signing key
+into your keyring and update the package lists:
+
+@example
+# wget -O /etc/apt/keyrings/taler-systems.gpg \
+ https://taler.net/taler-systems.gpg
+# apt update
+@end example
+
+@cartouche
+@quotation Note
+You may want to verify the correctness of the Taler Systems key out-of-band.
+@end quotation
+@end cartouche
+
+Now your system is ready to install the official GNU Taler binary packages
+using apt.
+
+To install the Taler exchange, you can now simply run:
+
+@example
+# apt install challenger
+@end example
+
+Note that the package does not perform any configuration work except for
+setting up the various users and the systemd service scripts. You still must
+configure at least the database, HTTP reverse proxy (typically with TLS
+certificates), and the terms of service.
+
+@node Services users groups and file system hierarchy,,Installing the GNU Taler binary packages on Ubuntu,Installation
+@anchor{taler-challenger-manual services-users-groups-and-file-system-hierarchy}@anchor{c}
+@section Services, users, groups and file system hierarchy
+
+
+The `challenger' package will use several system users
+to compartmentalize different parts of the system:
+
+
+@itemize *
+
+@item
+@code{challenger-httpd}: runs the HTTP daemon with the core business logic.
+
+@item
+@code{postgres}: runs the PostgreSQL database (from `postgresql' package).
+
+@item
+@code{www-data}: runs the frontend HTTPS service with the TLS keys (from `nginx' package).
+@end itemize
+
+The package will deploy a systemd service files in
+@code{/usr/lib/systemd/system/} for Challenger:
+
+
+@itemize *
+
+@item
+@code{challenger-httpd.service}: the Challenger logic with the public REST API.
+@end itemize
+
+@node Configuration Fundamentals,Deployment,Installation,Top
+@anchor{taler-challenger-manual configuration-fundamentals}@anchor{d}
+@chapter Configuration Fundamentals
+
+
+This chapter provides fundamental details about the exchange configuration.
+
+The configuration for all Taler components uses a single configuration file
+as entry point: @code{/etc/challenger/challenger.conf}.
+
+System defaults are automatically loaded from files in
+@code{/usr/share/challenger/config.d}. These default files should never be modified.
+
+The default configuration @code{challenger.conf} configuration file also includes all
+configuration files in @code{/etc/challenger/conf.d}.
+
+To view the entire configuration annotated with the source of each configuration option, you
+can use the @code{challenger-config} helper:
+
+@example
+[root@@exchange-online]# challenger-config --diagnostics
+< ... annotated, full configuration ... >
+@end example
+
+@cartouche
+@quotation Warning
+While @code{challenger-config} also supports rewriting configuration files, we strongly
+recommend to edit configuration files manually, as @code{challenger-config} does not
+preserve comments and, by default, rewrites @code{/etc/challenger/challenger.conf}.
+@end quotation
+@end cartouche
+
+@menu
+* Configuration format::
+* Fundamental Setup; Address validation: Fundamental Setup Address validation.
+* Legal conditions for using the service::
+* Terms of Service::
+* Privacy Policy::
+* Legal policies directory layout::
+* Generating the Legal Terms::
+* Adding translations::
+* Updating legal documents::
+* Database Configuration::
+
+@end menu
+
+@node Configuration format,Fundamental Setup Address validation,,Configuration Fundamentals
+@anchor{taler-challenger-manual configuration-format}@anchor{e}
+@section Configuration format
+
+
+All GNU Taler components are designed to possibly share the same
+configuration files. When installing a GNU Taler component, the
+installation deploys default values in configuration files located
+at $@{prefix@}/share/taler/config.d/ where $@{prefix@} is the installation
+prefix. Different components must be installed to the same prefix.
+
+In order to override these defaults, the user can write a custom configuration
+file and either pass it to the component at execution time using the `-c'
+option, or name it taler.conf and place it under $HOME/.config/ which is where
+components will look by default. Note that the systemd service files pass @code{-c
+/etc/taler/taler.conf}, thus making @code{/etc/taler/taler.conf}
+the primary location for the configuration.
+
+A config file is a text file containing sections, and each section
+contains maps options to their values. Configuration files follow
+basically the INI syntax:
+
+@example
+[section1]
+value1 = string
+value2 = 23
+
+[section2]
+value21 = string
+value22 = /path22
+@end example
+
+Comments start with a hash (@code{#}). Throughout the configuration, it is
+possible to use @code{$}-substitution for options relating to names of files or
+directories. It is also possible to provide defaults values for those
+variables that are unset, by using the following syntax:
+@code{$@{VAR:-default@}}. There are two ways a user can set the value
+of @code{$}-prefixable variables:
+
+
+@enumerate
+
+@item
+by defining them under a @code{[paths]} section:
+
+@example
+[paths]
+TALER_DEPLOYMENT_SHARED = $@{HOME@}/shared-data
+..
+[section-x]
+path-x = $@{TALER_DEPLOYMENT_SHARED@}/x
+@end example
+
+@item
+or by setting them in the environment:
+
+@example
+$ export VAR=/x
+@end example
+@end enumerate
+
+The configuration loader will give precedence to variables set under
+@code{[path]} over environment variables.
+
+The utility @code{taler-config}, which gets installed along with the exchange,
+can be used get and set configuration values without directly editing the
+configuration file. The option @code{-f} is particularly useful to resolve
+pathnames, when they use several levels of @code{$}-expanded variables. See
+@code{taler-config --help}.
+
+The repository @code{git://git.taler.net/deployment} contains example code
+for generating configuration files under @code{deployment/netzbon/}.
+
+@node Fundamental Setup Address validation,Legal conditions for using the service,Configuration format,Configuration Fundamentals
+@anchor{taler-challenger-manual fundamental-setup-address-validation}@anchor{f}
+@section Fundamental Setup: Address validation
+
+
+Each challenger service is designed to validate one type of address. Possible
+address types include:
+
+
+@itemize *
+
+@item
+phone numbers (via SMS)
+
+@item
+e-mail addresses (via SMTP)
+
+@item
+mail addresses (via postal service)
+@end itemize
+
+In principle, additional types of addresses can easily be added by extending
+the respective HTML and programs to send challenges to the new address type.
+
+To make different types of address validations possible, the Challenger
+configuration contains two configuration options.
+
+
+@enumerate
+
+@item
+The @code{ADDRESS_TYPE} configuration option informs Challenger about the
+type of address it is expected to validate. It is returned as part of
+the OAuth 2.0 @code{/info} endpoint to the client, and is typically also
+used when deciding how to render the HTML form for address entry that is
+shown to the user.
+
+@item
+The @code{AUTH_COMMAND} configuration option specifies which command
+Challenger should run to send a challenge to an address. The actual
+address is given to this subcommand as the first argument (@code{$1}),
+while the text with the challenge is passed to standard input.
+The subcommand should terminate with a status code of 0 on success.
+@end enumerate
+
+
+@float LiteralBlock
+
+@caption{/etc/challenger/challenger.conf}
+
+@example
+ [challenger]
+ ADDRESS_TYPE = email
+ AUTH_COMMAND = challenger-send-email.sh
+ # ... rest of file ...
+@end example
+
+@end float
+
+
+Challenger comes with @code{AUTH_COMMAND} shell scripts for sending e-mail, SMS
+and postal mail. Note that for SMS and postal mail the Challenger scripts uses
+third party services to actually send the SMS or print and mail the postal
+mail. These third parties naturally charge money for their services, and thus
+the Challenger administrator will need to add the respective credentials to
+the SMS and postal mail scripts before they can function. In any case, these
+scripts should be primarily seen as `examples' on how to write authentication
+commands.
+
+@cartouche
+@quotation Note
+We strongly welcome contributions for additional scripts with alternative
+providers or for new types of addresses.
+@end quotation
+@end cartouche
+
+@node Legal conditions for using the service,Terms of Service,Fundamental Setup Address validation,Configuration Fundamentals
+@anchor{taler-challenger-manual legal-conditions-for-using-the-service}@anchor{10}
+@section Legal conditions for using the service
+
+
+@c This file is part of GNU TALER.
+@c
+@c Copyright (C) 2014-2023 Taler Systems SA
+@c
+@c TALER is free software; you can redistribute it and/or modify it under the
+@c terms of the GNU Affero General Public License as published by the Free Software
+@c Foundation; either version 2.1, or (at your option) any later version.
+@c
+@c TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+@c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+@c A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+@c
+@c You should have received a copy of the GNU Affero General Public License along with
+@c TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+@c
+@c @author Christian Grothoff
+
+The service has well-known API endpoints to return its legal conditions to the
+user in various languages and various formats. This section describes how to
+setup and configure the legal conditions.
+
+@node Terms of Service,Privacy Policy,Legal conditions for using the service,Configuration Fundamentals
+@anchor{taler-challenger-manual terms-of-service}@anchor{11}
+@section Terms of Service
+
+
+The service has an endpoint “/terms” to return the terms of service (in legal
+language) of the service operator. Client software show these terms of
+service to the user when the user is first interacting with the service.
+Terms of service are optional for experimental deployments, if none are
+configured, the service will return a simple statement saying that there are
+no terms of service available.
+
+To configure the terms of service response, there are two options
+in the configuration file for the service:
+
+
+@itemize -
+
+@item
+@code{TERMS_ETAG}: The current “Etag” to return for the terms of service.
+This value must be changed whenever the terms of service are
+updated. A common value to use would be a version number.
+Note that if you change the @code{TERMS_ETAG}, you MUST also provide
+the respective files in @code{TERMS_DIR} (see below).
+
+@item
+@code{TERMS_DIR}: The directory that contains the terms of service.
+The files in the directory must be readable to the service
+process.
+@end itemize
+
+@node Privacy Policy,Legal policies directory layout,Terms of Service,Configuration Fundamentals
+@anchor{taler-challenger-manual privacy-policy}@anchor{12}
+@section Privacy Policy
+
+
+The service has an endpoint “/pp” to return the terms privacy policy (in legal
+language) of the service operator. Clients should show the privacy policy to
+the user when the user explicitly asks for it, but it should not be shown by
+default. Privacy policies are optional for experimental deployments, if none
+are configured, the service will return a simple statement saying that there
+is no privacy policy available.
+
+To configure the privacy policy response, there are two options
+in the configuration file for the service:
+
+
+@itemize -
+
+@item
+@code{PRIVACY_ETAG}: The current “Etag” to return for the privacy policy.
+This value must be changed whenever the privacy policy is
+updated. A common value to use would be a version number.
+Note that if you change the @code{PRIVACY_ETAG}, you MUST also provide
+the respective files in @code{PRIVACY_DIR} (see below).
+
+@item
+@code{PRIVACY_DIR}: The directory that contains the privacy policy.
+The files in the directory must be readable to the service
+process.
+@end itemize
+
+@node Legal policies directory layout,Generating the Legal Terms,Privacy Policy,Configuration Fundamentals
+@anchor{taler-challenger-manual legal-policies-directory-layout}@anchor{13}
+@section Legal policies directory layout
+
+
+The @code{TERMS_DIR} and @code{PRIVACY_DIR} directory structures must follow a
+particular layout. You may use the same directory for both the terms of
+service and the privacy policy, as long as you use different ETAGs. Inside of
+the directory, there should be sub-directories using two-letter language codes
+like “en”, “de”, or “jp”. Each of these directories would then hold
+translations of the current terms of service into the respective language.
+Empty directories are permitted in case translations are not available.
+
+Then, inside each language directory, files with the name of the value set as
+the @code{TERMS_ETAG} or @code{PRIVACY_ETAG} must be provided. The extension of each
+of the files should be typical for the respective mime type. The set of
+supported mime types is currently hard-coded in the service, and includes
+“.epub”, “.html”, “.md”, “.pdf” and “.txt” files. If other files are present,
+the service may show a warning on startup.
+
+@menu
+* Example::
+
+@end menu
+
+@node Example,,,Legal policies directory layout
+@anchor{taler-challenger-manual example}@anchor{14}
+@subsection Example
+
+
+A sample file structure for a @code{TERMS_ETAG} of “tos-v0” would be:
+
+
+@itemize -
+
+@item
+TERMS_DIR/en/tos-v0.txt
+
+@item
+TERMS_DIR/en/tos-v0.html
+
+@item
+TERMS_DIR/en/tos-v0.pdf
+
+@item
+TERMS_DIR/en/tos-v0.epub
+
+@item
+TERMS_DIR/en/tos-v0.md
+
+@item
+TERMS_DIR/de/tos-v0.txt
+
+@item
+TERMS_DIR/de/tos-v0.html
+
+@item
+TERMS_DIR/de/tos-v0.pdf
+
+@item
+TERMS_DIR/de/tos-v0.epub
+
+@item
+TERMS_DIR/de/tos-v0.md
+@end itemize
+
+If the user requests an HTML format with language preferences “fr” followed by
+“en”, the service would return @code{TERMS_DIR/en/tos-v0.html} lacking a version in
+French.
+
+@node Generating the Legal Terms,Adding translations,Legal policies directory layout,Configuration Fundamentals
+@anchor{taler-challenger-manual generating-the-legal-terms}@anchor{15}
+@section Generating the Legal Terms
+
+
+The @code{taler-terms-generator} script can be used to generate directories with
+terms of service and privacy policies in multiple languages and all required
+data formats from a single source file in @code{.rst} format and GNU gettext
+translations in @code{.po} format.
+
+To use the tool, you need to first write your legal conditions in English in
+reStructuredText (rst). You should find a templates in
+@code{$PREFIX/share/terms/*.rst} where @code{$PREFIX} is the location where you
+installed the service to. Whenever you make substantive changes to the legal
+terms, you must use a fresh filename and change the respective @code{ETAG}. The
+resulting file must be called @code{$ETAG.rst} and the first line of the file should be the title of the document.
+
+Once you have written the @code{$ETAG.rst} file in English, you can
+generate the first set of outputs:
+
+@example
+$ taler-terms-generator -i $ETAG
+@end example
+
+Afterwards, you should find the terms in various formats for all configured
+languages (initially only English) in @code{$PREFIX/share/terms/}. The generator
+has a few options which are documented in its man page.
+
+@node Adding translations,Updating legal documents,Generating the Legal Terms,Configuration Fundamentals
+@anchor{taler-challenger-manual adding-translations}@anchor{16}
+@section Adding translations
+
+
+Translations must be available in subdirectories
+@code{locale/$LANGUAGE/LC_MESSAGES/$ETAG.po}.
+To start translating, you first need to add a new
+language:
+
+@example
+$ taler-terms-generator -i $ETAG -l $LANGUAGE
+@end example
+
+Here, @code{$LANGUAGE} should be a two-letter language
+code like @code{de} or @code{fr}. The command will generate
+a file @code{locale/$LANGUAGE/LC_MESSAGES/$ETAG.po}
+which contains each English sentence or paragraph
+in the original document and an initially empty
+translation. Translators should update the @code{.po}
+file. Afterwards, simply re-run
+
+@example
+$ taler-terms-generator -i $ETAG
+@end example
+
+to make the current translation(s) available to the
+service.
+
+@cartouche
+@quotation Note
+You must restart the service whenever adding or updating legal documents or their translations.
+@end quotation
+@end cartouche
+
+@node Updating legal documents,Database Configuration,Adding translations,Configuration Fundamentals
+@anchor{taler-challenger-manual updating-legal-documents}@anchor{17}
+@section Updating legal documents
+
+
+When making minor changes without legal implications, edit the @code{.rst} file,
+then re-run the step to add a new language for each existing translation to
+produce an updated @code{.po} file. Translate the sentences that have changed and
+finally run the generator (without @code{-l}) on the ETAG (@code{-i $ETAG}) to
+create the final files.
+
+When making major changes with legal implications, you should first rename (or
+copy) the existing @code{.rst} file and the associated translation files to a new
+unique name. Afterwards, make the major changes, update the @code{.po} files,
+complete the translations and re-create the final files. Finally, do not
+forget to update the @code{ETAG} configuration option to the new name and to
+restart the service.
+
+@node Database Configuration,,Updating legal documents,Configuration Fundamentals
+@anchor{taler-challenger-manual database-configuration}@anchor{18}
+@section Database Configuration
+
+
+The access credentials for the Challenger database are configured in
+@code{/etc/challenger/challenger.conf}. Currently, only PostgreSQL is
+supported as a database backend.
+
+@cartouche
+@quotation Note
+The `challenger-dbconfig' tool can be used to automate the database
+setup. When using the Debian/Ubuntu packages, the user should already have
+been created, so you can just run the tool without any arguments and should
+have a working database configuration. Subsequently, you should still run
+`taler-challenger-dbinit' as the @code{challenger-httpd} user to
+initialize the database schema.
+@end quotation
+@end cartouche
+
+To create a database for Challenger on the local system, run:
+
+@example
+[root@@exchange-online]# su - postgres
+[postgres@@exchange-online]# createuser challenger-httpd
+[postgres@@exchange-online]# createdb -O challenger-httpd challenger
+[postgres@@exchange-online]# exit
+@end example
+
+This will create a @code{challenger} database owned by the @code{taler-httpd} user.
+We will use that user later to perform database maintenance operations.
+
+Assuming the above database setup, the database credentials to configure
+in the configuration file would simply be:
+
+
+@float LiteralBlock
+
+@caption{/etc/challenger/challenger.conf}
+
+@example
+[challenger]
+DB = postgres
+
+[challenger-postgres]
+CONFIG = postgres:///challenger
+@end example
+
+@end float
+
+
+If the database is run on a different host, please follow the instructions
+from the PostgreSQL manual for configuring remote access.
+
+After configuring the database credentials, the Challenger database needs
+to be initialized with the following command:
+
+@example
+[root@@exchange-online]# sudo -u challenger-httpd challenger-dbinit
+@end example
+
+@cartouche
+@quotation Note
+To run this command, the user must have @code{CREATE TABLE}, @code{CREATE
+INDEX}, @code{ALTER TABLE} and (in the future possibly even) @code{DROP TABLE}
+permissions. Those permissions are only required for this step (which may
+have to be repeated when upgrading a deployment). Afterwards, during
+normal operation, permissions to @code{CREATE} or @code{ALTER} tables are not
+required by Challenger and thus should not be granted. For more
+information, see manpages/challenger-dbinit.1.
+@end quotation
+@end cartouche
+
+@node Deployment,Template Customization,Configuration Fundamentals,Top
+@anchor{taler-challenger-manual deployment}@anchor{19}
+@chapter Deployment
+
+
+This chapter describes how to deploy Challenger once the basic installation
+and configuration are completed.
+
+@menu
+* Serving::
+* Reverse Proxy Setup::
+* Launching Challenger::
+* Authorizing clients::
+* OAuth 2.0 integration: OAuth 2 0 integration.
+* Database management::
+
+@end menu
+
+@node Serving,Reverse Proxy Setup,,Deployment
+@anchor{taler-challenger-manual challengerserving}@anchor{1a}@anchor{taler-challenger-manual serving}@anchor{1b}
+@section Serving
+
+
+The Challenger can serve HTTP over both TCP and UNIX domain socket.
+
+The following options are to be configured in the section @code{[challenger]}:
+
+
+@itemize -
+
+@item
+@code{SERVE}: Must be set to @code{tcp} to serve HTTP over TCP, or @code{unix} to serve
+HTTP over a UNIX domain socket.
+
+@item
+@code{PORT}: Set to the TCP port to listen on if @code{SERVE} is @code{tcp}.
+
+@item
+@code{UNIXPATH}: Set to the UNIX domain socket path to listen on if @code{SERVE} is
+@code{unix}.
+
+@item
+
+@table @asis
+
+@item @code{UNIXPATH_MODE}: Number giving the mode with the access permission mask
+
+for the @code{UNIXPATH} (i.e. 660 = @code{rw-rw---}). Make sure to set it in such
+a way that your reverse proxy has permissions to access the UNIX domain
+socket. The default (660) assumes that the reverse proxy is a member of
+the group under which the exchange HTTP server is running.
+@end table
+@end itemize
+
+@node Reverse Proxy Setup,Launching Challenger,Serving,Deployment
+@anchor{taler-challenger-manual challengerreverseproxy}@anchor{1c}@anchor{taler-challenger-manual reverse-proxy-setup}@anchor{1d}
+@section Reverse Proxy Setup
+
+
+By default, the @code{challenger-httpd} service listens for HTTP connections
+on a UNIX domain socket. To make the service publicly available, a reverse
+proxy such as nginx should be used. You must configure the reverse proxy
+to use TLS as this is required by OAuth 2.0.
+
+The @code{challenger} package ships with a sample configuration that can be
+enabled in nginx:
+
+@example
+[root@@exchange-online]# vim /etc/nginx/sites-available/challenger
+< ... customize configuration ... >
+[root@@exchange-online]# ln -s /etc/nginx/sites-available/challenger \
+ /etc/nginx/sites-enabled/challenger
+[root@@exchange-online]# systemctl reload nginx
+@end example
+
+@node Launching Challenger,Authorizing clients,Reverse Proxy Setup,Deployment
+@anchor{taler-challenger-manual launching-challenger}@anchor{1e}
+@section Launching Challenger
+
+
+A running exchange requires starting the following processes:
+
+
+@itemize -
+
+@item
+@code{challenger-httpd} (needs database access)
+@end itemize
+
+The processes should be started via a hypervisor like
+@code{systemd} or @code{gnunet-arm} that automatically re-starts them should they
+have terminated unexpectedly. Furthermore, the hypervisor
+`should' periodically re-start the service (say once per hour)
+to limit Postgres database memory utilization.
+
+@cartouche
+@quotation Note
+The @code{challenger-httpd} does not ship with HTTPS enabled by default.
+It must thus be run behind an HTTPS reverse proxy that performs
+TLS termination on the same system. Thus, it would typically be configured
+to listen on a UNIX domain socket.
+@end quotation
+@end cartouche
+
+Given proper packaging, all of the above are realized via a simple systemd
+target. This enables Challenger to be properly started using a simple command:
+
+@example
+# systemctl start challenger-httpd.service
+@end example
+
+@node Authorizing clients,OAuth 2 0 integration,Launching Challenger,Deployment
+@anchor{taler-challenger-manual authorizing-clients}@anchor{1f}
+@section Authorizing clients
+
+
+Before clients can use Challenger, they must be explicitly configured. Each
+client is identified via its OAuth 2.0 REDIRECT URI. Thus, a client must have
+exactly one REDIRECT URI
+
+@cartouche
+@quotation Note
+The OAuth 2.0 specification allows for a client to register
+zero or multiple REDIRECT URIs. However, zero is insecure
+as it creates an open redirector, and multiple REDIRECT URIs
+can trivially be implemented with Challenger by adding more
+clients.
+@end quotation
+@end cartouche
+
+You can add or remove clients at any time; the Challenger service does not
+need to be running, but if it is you can still add or remove clients without
+restarting the service. To add (or remove) a client, you must use the
+@code{challenger-admin} command:
+
+@example
+# sudo -u challenger-httpd challenger-admin --add=$SECRET $REDIRECT_URI
+@end example
+
+Here, @code{$SECRET} is the client secret of OAuth 2.0 which will be used in
+various parts of the protocol to authenticate the client. The
+@code{$REDIRECT_URI} is the URI where the user-agent will be redirected to upon
+completion of the process. The @code{challenger-admin} command will
+then output the `client ID', which will be a unique positive number.
+The first time you run the command, you will thus likely see:
+@code{Client added. Client ID is: 1}. This client ID, the @code{$SECRET}
+and the @code{$REDIRECT_URI} will form the foundation for the OAuth 2.0
+configuration.
+
+@node OAuth 2 0 integration,Database management,Authorizing clients,Deployment
+@anchor{taler-challenger-manual oauth-2-0-integration}@anchor{20}
+@section OAuth 2.0 integration
+
+
+When integrating Challenger into an OAuth 2.0 process, you need to provide the
+three options from the previous section, but also the authorization, token and
+info endpoints. For Challenger, these are @code{/authorize}, @code{/token} and
+@code{/info}. However, the @code{/authorize} endpoint is special, as it is actually
+@code{/authorize/$NONCE} where @code{$NONCE} is a nonce that must be first requested
+by the client using the @code{/setup/$CLIENT_ID} endpoint!
+
+@cartouche
+@quotation Note
+This extra step prevents user-agents from (ab)using the Challenger service
+to send challenges to addresses even when there is no authorized client
+that desires address validation. This is an important feature as address
+validation could be expensive.
+@end quotation
+@end cartouche
+
+Thus, to generate the authorization URL, a client must first POST to
+@code{/setup/$CLIENT_ID} using their client secret in an @code{Authorization: Bearer $SECRET}
+HTTP header to obtain a fresh @code{$NONCE}.
+
+In the GNU Taler exchange configuration, this is indicated by appending
+@code{#setup} to the @code{KYC_OAUTH2_AUTHORIZE_URL} endpoint. Be careful to quote
+the URL, as @code{#} is otherwise interpreted as the beginning of a comment by
+the configuration file syntax:
+
+
+@float LiteralBlock
+
+@caption{/etc/taler/conf.d/exchange-oauth2.conf}
+
+@example
+[kyc-provider-example-oauth2]
+LOGIC = oauth2
+# (generic options omitted)
+KYC_OAUTH2_AUTHORIZE_URL = "https://challenger.example.com/authorize#setup"
+KYC_OAUTH2_TOKEN_URL = "https://challenger.example.com/token"
+KYC_OAUTH2_INFO_URL = "https://challenger.example.com/info"
+KYC_OAUTH2_CLIENT_ID = 1
+KYC_OAUTH2_CLIENT_SECRET = "$SECRET"
+@end example
+
+@end float
+
+
+@node Database management,,OAuth 2 0 integration,Deployment
+@anchor{taler-challenger-manual database-management}@anchor{21}
+@section Database management
+
+
+@cartouche
+@quotation Note
+We advise to make good backups before experimenting with
+the database.
+@end quotation
+@end cartouche
+
+To update the Challenger database after upgrading to a newer
+version of Challenger, you should simply re-run @code{challenger-dbinit}.
+Without further options, this command is expected to preserve
+all data and only migrate the existing database to the latest
+schema:
+
+@example
+$ challenger-dbinit
+@end example
+
+To delete stale data from the Challenger database, you can use
+garbage collection:
+
+@example
+$ challenger-dbinit --garbagecollect
+@end example
+
+The Challenger database can be re-initialized using:
+
+@example
+$ challenger-dbinit --reset
+@end example
+
+However, running this command will result in all data in the database
+being lost.
+
+@node Template Customization,,Deployment,Top
+@anchor{taler-challenger-manual challengercustomization}@anchor{22}@anchor{taler-challenger-manual template-customization}@anchor{23}
+@chapter Template Customization
+
+
+The Challenger service comes with various HTML templates that are shown to
+guide users through the process. Challenger uses C implementation of mustache@footnote{https://gitlab.com/jobol/mustach} as the templating engine. This section
+describes the various templates. In general, the templates must be installed
+to the @code{share/challenger/templates/} directory. The file names must be of
+the form @code{$NAME.$LANG.must} where @code{$NAME} is the name of the template and
+@code{$LANG} is the 2-letter language code of the template. English templates
+must exist and will be used as a fallback. If the browser (user-agent) has
+provided language preferences in the HTTP header and the respective language
+exists, the correct language will be automatically served.
+
+The following subsections give details about each of the templates. The
+subsection title is the @code{$NAME} of the respective template.
+
+@menu
+* enter-$ADDRESS_TYPE-form::
+* enter-tan-form::
+* invalid-pin::
+* validation-unknown::
+* invalid-request::
+* internal-error::
+
+@end menu
+
+@node enter-$ADDRESS_TYPE-form,enter-tan-form,,Template Customization
+@anchor{taler-challenger-manual challenger-enter-address-type-form}@anchor{24}@anchor{taler-challenger-manual enter-address-type-form}@anchor{25}
+@section enter-$ADDRESS_TYPE-form
+
+
+These templates are used to ask the user to enter the address that challenger
+is expected to validate. Here, @code{$ADDRESS_TYPE} will be replaced by the
+@code{ADDRESS_TYPE} configuration option in the @code{[challenger]} section of the
+configuration file. Typical values include @code{address} (for physical mailing
+addresses), @code{phone} (for mobile phone numbers) and @code{email} (for email
+addresses). For testing, @code{file} (where the TAN code is written into a local
+file) is also supported.
+
+The template is instantiated using the following information:
+
+
+@itemize *
+
+@item
+restrictions: Object; map of keys (names of the fields of the
+address to be entered by the user) to objects with a “regex”
+(string) containing an extended Posix regular expression for
+allowed address field values, and a “hint”/”hint_i18n” giving
+a human-readable explanation to display if the value entered
+by the user does not match the regex. Keys that are not mapped
+to such an object have no restriction on the value provided by
+the user. See “ADDRESS_RESTRICTIONS” in the challenger
+configuration.
+
+@item
+fix_address: boolean; indicates if the given address cannot be changed
+anymore, the form should be read-only if set to true.
+
+@item
+nonce: String; unique value identifying the challenge, should be shown
+to the user so that they can recognize it when they receive the TAN code
+
+@item
+last_address: Object; form values from the previous submission if available,
+details depend on the @code{ADDRESS_TYPE}, should be used to pre-populate the form
+
+@item
+changes_left: Integer; number of times the address can still be changed,
+may or may not be shown to the user
+@end itemize
+
+@node enter-tan-form,invalid-pin,enter-$ADDRESS_TYPE-form,Template Customization
+@anchor{taler-challenger-manual challenger-enter-tan-form}@anchor{26}@anchor{taler-challenger-manual enter-tan-form}@anchor{27}
+@section enter-tan-form
+
+
+This page should generate the HTML form for the user to enter the TAN code
+that they received at the respective address.
+
+The template is instantiated using the following information:
+
+
+@itemize *
+
+@item
+nonce: String; unique value identifying the challenge, should be shown
+to the user so that they can match it to the TAN code they received
+
+@item
+attempts_left: Integer; how many more attempts are allowed, might be
+shown to the user, highlighting might be appropriate for low values
+such as 1 or 2 (the form will never be used if the value is zero)
+
+@item
+address: Object; the address that is being validated, might be shown
+or not
+
+@item
+transmitted: boolean; true if we just retransmitted the challenge,
+false if we sent a challenge recently and thus refused to transmit it
+again this time; might make a useful hint to the user
+
+@item
+next_tx_time: String; timestamp explaining when we would re-transmit
+the challenge the next time (at the earliest) if requested by the user
+@end itemize
+
+@node invalid-pin,validation-unknown,enter-tan-form,Template Customization
+@anchor{taler-challenger-manual challenger-invalid-pin}@anchor{28}@anchor{taler-challenger-manual invalid-pin}@anchor{29}
+@section invalid-pin
+
+
+The user has provided an invalid TAN code (HTTP 403 Forbidden).
+
+The template is instantiated using the following information:
+
+
+@itemize *
+
+@item
+ec: Integer; numeric Taler error code, should be shown to indicate the
+error compactly for reporting to developers
+
+@item
+hint: String; human-readable Taler error code, should be shown for the
+user to understand the error
+
+@item
+addresses_left: Integer; how many times is the user still allowed to
+change the address; if 0, the user should not be shown a link to jump
+to the address entry form
+
+@item
+pin_transmissions_left: Integer; how many times might the PIN still
+be retransmitted
+
+@item
+auth_attempts_left: Integer; how many times might the user still try
+entering the PIN code
+
+@item
+exhausted: Bool; if true, the PIN was not even evaluated as the user
+previously exhausted the number of attempts
+
+@item
+no_challenge: Bool; if true, the PIN was not even evaluated as no
+challenge was ever issued (the user must have skipped the step of
+providing their address first!)
+@end itemize
+
+If both `pin_transmissions_left' and `auth_attempts_left' are zero, the link
+to re-enter the PIN should be hidden and the user should only be allowed to
+specify a different address. The form will never be generated if all three
+values are zero. (Thus there is always at least one valid choice when the form
+is shown.)
+
+@node validation-unknown,invalid-request,invalid-pin,Template Customization
+@anchor{taler-challenger-manual challenger-validation-unknown}@anchor{2a}@anchor{taler-challenger-manual validation-unknown}@anchor{2b}
+@section validation-unknown
+
+
+The user has tried to access a validation process that is not known to the
+backend (HTTP 404 Not Found).
+
+The template is instantiated using the following information:
+
+
+@itemize *
+
+@item
+ec: Integer; numeric Taler error code, should be shown to indicate the
+error compactly for reporting to developers
+
+@item
+hint: String; human-readable Taler error code, should be shown for the
+user to understand the error
+
+@item
+detail: String; optional, extended human-readable text provided to elaborate
+on the error, should be shown to provide additional context
+@end itemize
+
+@node invalid-request,internal-error,validation-unknown,Template Customization
+@anchor{taler-challenger-manual challenger-invalid-request}@anchor{2c}@anchor{taler-challenger-manual invalid-request}@anchor{2d}
+@section invalid-request
+
+
+The request of the client is invalid (HTTP 400 Bad Request).
+
+The template is instantiated using the following information:
+
+
+@itemize *
+
+@item
+ec: Integer; numeric Taler error code, should be shown to indicate the
+error compactly for reporting to developers
+
+@item
+hint: String; human-readable Taler error code, should be shown for the
+user to understand the error
+
+@item
+detail: String; optional, extended human-readable text provided to elaborate
+on the error, should be shown to provide additional context
+@end itemize
+
+@node internal-error,,invalid-request,Template Customization
+@anchor{taler-challenger-manual challenger-internal-error}@anchor{2e}@anchor{taler-challenger-manual internal-error}@anchor{2f}
+@section internal-error
+
+
+The service experienced an internal error (HTTP 500 Internal Server Error).
+
+The template is instantiated using the following information:
+
+
+@itemize *
+
+@item
+ec: Integer; numeric Taler error code, should be shown to indicate the
+error compactly for reporting to developers
+
+@item
+hint: String; human-readable Taler error code, should be shown for the
+user to understand the error
+
+@item
+detail: String; optional, extended human-readable text provided to elaborate
+on the error, should be shown to provide additional context
+@end itemize
+
+@c %**end of body
+@bye