summaryrefslogtreecommitdiff
path: root/core/api-taldir.rst
diff options
context:
space:
mode:
Diffstat (limited to 'core/api-taldir.rst')
-rw-r--r--core/api-taldir.rst258
1 files changed, 258 insertions, 0 deletions
diff --git a/core/api-taldir.rst b/core/api-taldir.rst
new file mode 100644
index 00000000..4da9bb02
--- /dev/null
+++ b/core/api-taldir.rst
@@ -0,0 +1,258 @@
+..
+ This file is part of GNU TALER.
+ Copyright (C) 2022 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 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 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, see <http://www.gnu.org/licenses/>
+
+ @author Christian Grothoff
+ @author Martin Schanzenbach
+
+
+======================
+The TalDir RESTful API
+======================
+
+This is a proposed API for the TalDir service which allows Taler wallets to
+securely associate an inbox service (URL and public key) with the address of a
+messaging service used by the wallet's user. Wallets can also lookup the
+inbox of other users. This will enable wallets to make wallet-to-wallet
+payments to distant wallets where the target user is only identified by their
+address in a messaging service. Examples for messaging services include E-mail
+and SMS.
+
+The API specified here follows the :ref:`general conventions <http-common>`
+for all details not specified in the individual requests.
+The `glossary <https://docs.taler.net/glossary.html#glossary>`_
+defines all specific terms used in this section.
+
+.. contents:: Table of Contents
+ :local:
+
+.. include:: tos.rst
+
+
+-------------------------
+Configuration information
+-------------------------
+
+.. http:get:: /config
+
+ Return the protocol version and currency supported by this service.
+
+ **Response:**
+
+ :http:statuscode:`200 OK`:
+ The body is a `VersionResponse`.
+
+ .. ts:def:: VersionResponse
+
+ interface VersionResponse {
+ // libtool-style representation of the Merchant protocol version, see
+ // https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
+ // The format is "current:revision:age".
+ version: string;
+
+ // Name of the protocol.
+ name: "taler-directory";
+
+ // Supported registration methods
+ methods: TaldirMethod[];
+
+ // fee for one month of registration
+ monthly_fee: Amount;
+
+ }
+
+ .. ts:def:: TaldirMethod
+
+ interface TaldirMethod {
+ // Name of the method, e.g. "email" or "sms".
+ name: string;
+
+ // per challenge fee
+ challenge_fee: Amount;
+
+ }
+
+--------------------
+Address registration
+--------------------
+
+.. http:post:: /register/$METHOD
+
+ Endpoint to register, extend or modify the registration for an address in
+ the directory.
+ Here, $METHOD is the type of address to register, e.g. "email", or "phone".
+ Supported methods are listed in the VersionResponse.
+ Note that duration should be given as a multiple of a month in microseconds.
+ If the duration is not a multiple of a month it will be rounded to the
+ nearest multiple. Halfway values will be rounded away from zero.
+ The cost calculation and resulting registration validity will be adjusted
+ automatically.
+ In order to only modify the data, the duration may be set to 0.
+ When the call is made with unmodified data and a duration of 0, the
+ endpoint will return how long this registration is currently paid for.
+
+ **Request**
+
+ .. ts:def:: IdentityMessage
+
+ interface IdentityMessage {
+ // Address, in $METHOD-specific format
+ address: string;
+
+ // Public key of the user to register. As string in Crockfor base32 encoding.
+ public_key: EddsaPublicKey;
+
+ // (HTTPS) endpoint URL for the inbox service.
+ inbox_url: string;
+
+ // For how long should the registration last/be extended.
+ duration: RelativeTime;
+
+ }
+
+ **Response**
+
+ :http:statuscode:`200 Ok`
+ Registration already exists for this address for the specified duration.
+ Returns for how long this registration is paid for.
+ The response format is given by `AlreadyPaidResponse`_.
+ :http:statuscode:`202 Accepted`
+ Registration was initiated, the client should check for receiving
+ a challenge at the address where registration was attempted.
+ :http:statuscode:`402 Payment Required`
+ Client needs to make a Taler payment before proceeding. See
+ standard Taler payment procedure.
+ :http:statuscode:`404 Not found`
+ The TalDir service does not support the specified method.
+ This response comes with a standard `ErrorDetail` response.
+ :http:statuscode:`429 Too Many Requests`:
+ The client exceeded the number of allowed attempts for initiating
+ a challenge for this address in the given timeframe.
+ The response format is given by `RateLimitedResponse`_.
+
+ .. _RateLimitedResponse:
+ .. ts:def:: RateLimitedResponse
+
+ interface RateLimitedResponse {
+
+ // Taler error code, TALER_EC_TALDIR_REGISTER_RATE_LIMITED.
+ code: number;
+
+ // At what frequency are new registrations allowed.
+ request_frequency: RelativeTime;
+
+ // The human readable error message.
+ hint: string;
+
+ }
+
+ .. _AlreadyPaidResponse:
+ .. ts:def:: AlreadyPaidResponse
+
+ interface AlreadyPaidResponse {
+
+ // The remaining duration for which this registration is still paid for
+ valid_for: RelativeTime;
+
+ }
+
+
+.. http:get:: /register/$H_ADDRESS/$PINTAN
+
+ Endpoint that generates an HTML Web site with a QR code and
+ ``taler://taldir/$H_ADDRESS/$PINTAN-wallet`` link for completing the
+ registration. Useful to open the registration challenge in a browser (say if
+ it was received on a different device than where the wallet is running).
+ Does NOT complete the registration, as some providers automatically click on
+ all links in messages. Yes, we do not like them doing so either, but ``GET``
+ is a "safe" method according to the HTTP standard, so technically this is
+ allowed.
+
+ Opening the link will lead the **wallet** to do the POST call below. If the
+ Taler wallet can somehow intercept the URL (say for SMS, if it has the right
+ permissions) it can skip this request and directly do the POST, as all of
+ the required new information is already encoded in the URL.
+
+ Note that the wallet must be involved before the POST is made, as the
+ wallet's public key from the registration must be hashed with the ``$PINTAN``
+ to protect the user against phishing. Otherwise, someone else might attempt
+ a concurrent registration of a different public key, and the user might
+ accidentally authorize the registration of the public key of a different
+ wallet.
+
+.. http:post:: /$H_ADDRESS
+
+ This request is the last step of a registration, proving to the TalDir that
+ the user of the wallet is indeed able to receive messages at the specified
+ address. ``$H_ADDRESS`` is the SHA-512 hash of the address to be registered in
+ Crockford base32 encoding.
+
+ **Request**
+
+ .. ts:def:: IdentityConfirmation
+
+ interface IdentityConfirmation {
+ // The solution is the SHA-512 hash of the challenge ($PINTAN) value
+ // chosen by TalDir (encoded as string just as given in the URL, but
+ // excluding the 0-termination) concatenated with the binary 32-byte
+ // value representing the wallet's EdDSA public key.
+ // The hash is provided as string in Crockford base32 encoding.
+ solution: HashCode;
+
+ }
+
+ **Response**
+
+ :http:statuscode:`204 No Content`:
+ Registration complete.
+ :http:statuscode:`403 Forbidden`:
+ The ``solution`` is invalid. Retrying immediately is allowed.
+ :http:statuscode:`404 Not found`:
+ The address is unknown (original registration attempt may have expired).
+ :http:statuscode:`429 Too Many Requests`:
+ The client exceeded the number of allowed attempts for solving
+ a challenge for this address in the given timeframe.
+
+--------------
+Address lookup
+--------------
+
+.. http:get:: /$H_ADDRESS
+
+ Lookup the public key (and mailbox service base URL) associated with
+ an address in the TalDir. Here, ``$H_ADDRESS`` is the SHA-512 hash of
+ a (presumably) registered address in Crockford base32 encoding.
+
+ **Response**
+
+ Standard HTTP cache control headers are used to specify how long the
+ registration is still expected to be valid.
+
+ :http:statuscode:`200 Ok`:
+ Registration information returned, of type `MailboxDetailResponse`
+ :http:statuscode:`404 Not found`:
+ The address is unknown (original registration may have expired).
+
+ .. _MailboxDetailResponse:
+ .. ts:def:: MailboxDetailResponse
+
+ interface MailboxDetailResponse {
+
+ // Registered public key of the user. As string in Crockford base32 encoding.
+ public_key: EddsaPublicKey;
+
+ // (HTTPS) endpoint URL for the inbox service.
+ inbox_url: string;
+
+ }