anastasis: no more currencies per country

This commit is contained in:
Florian Dold 2022-04-14 21:00:03 +02:00
parent bc05050524
commit 3957f529bf
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
5 changed files with 302 additions and 161 deletions

View File

@ -1,7 +1,6 @@
// This file is auto-generated, do not modify.
// Generated from v0.2.0-4-g61ea83c on Tue, 05 Oct 2021 10:40:32 +0200
// Generated from v0.2.0-151-g2ae958d on Thu, 14 Apr 2022 20:38:58 +0200
// To re-generate, run contrib/gen-ts.sh from the main anastasis code base.
// XXX: Modified for demo, allowing demo providers for EUR
export const anastasisData = {
providersList: {
@ -9,44 +8,36 @@ export const anastasisData = {
"SPDX-License-Identifier": "GPL3.0-or-later",
anastasis_provider: [
{
url: "https://anastasis.demo.taler.net/",
currency: "KUDOS",
url: "https://v1.anastasis.taler.net/",
name: "Bern University of Applied Sciences, Switzerland",
},
{
url: "https://kudos.demo.anastasis.lu/",
currency: "KUDOS",
url: "https://v1.anastasis.codeblau.de/",
name: "Codeblau GmbH, Germany",
},
{
url: "https://anastasis.demo.taler.net/",
currency: "EUR",
url: "https://v1.anastasis.openw3b.org/",
name: "Openw3b Foundation, India",
},
{
url: "https://kudos.demo.anastasis.lu/",
currency: "EUR",
},
{
url: "https://anastasis.demo.taler.net/",
currency: "CHF",
},
{
url: "https://kudos.demo.anastasis.lu/",
currency: "CHF",
url: "https://v1.anastasis.lu/",
name: "Anastasis SARL, Luxembourg",
},
{
url: "http://localhost:8086/",
currency: "TESTKUDOS",
restricted: "xx",
},
{
url: "http://localhost:8087/",
currency: "TESTKUDOS",
restricted: "xx",
},
{
url: "http://localhost:8088/",
currency: "TESTKUDOS",
restricted: "xx",
},
{
url: "http://localhost:8089/",
currency: "TESTKUDOS",
restricted: "xx",
},
],
},
@ -62,7 +53,6 @@ export const anastasisData = {
de_DE: "Albanien",
en_UK: "Albania",
},
currency: "ALL",
call_code: "+355",
},
{
@ -73,7 +63,6 @@ export const anastasisData = {
de_DE: "Belgien",
en_UK: "Belgium",
},
currency: "EUR",
call_code: "+32",
},
{
@ -86,7 +75,6 @@ export const anastasisData = {
fr_FR: "Suisse",
en_UK: "Swiss",
},
currency: "CHF",
call_code: "+41",
},
{
@ -96,7 +84,6 @@ export const anastasisData = {
name_i18n: {
en_UK: "Czech Republic",
},
currency: "CZK",
call_code: "+420",
},
{
@ -110,7 +97,6 @@ export const anastasisData = {
fr_FR: "Allemagne",
en_UK: "Germany",
},
currency: "EUR",
call_code: "+49",
},
{
@ -121,7 +107,6 @@ export const anastasisData = {
name_i18n: {
en_UK: "Denmark",
},
currency: "DKK",
call_code: "+45",
},
{
@ -132,9 +117,18 @@ export const anastasisData = {
name_i18n: {
es_ES: "España",
},
currency: "EUR",
call_code: "+44",
},
{
code: "fr",
name: "France",
continent: "Europe",
name_i18n: {
de_DE: "Frankreich",
fr_FR: "La France",
},
call_code: "+33",
},
{
code: "in",
name: "India",
@ -146,7 +140,6 @@ export const anastasisData = {
fr_FR: "l'Inde",
en_UK: "India",
},
currency: "INR",
call_code: "+91",
},
{
@ -157,7 +150,6 @@ export const anastasisData = {
de_DE: "Italien",
en_UK: "Italy",
},
currency: "EUR",
call_code: "+39",
},
{
@ -170,17 +162,26 @@ export const anastasisData = {
de_CH: "Japan",
en_UK: "Japan",
},
currency: "JPY",
call_code: "+81",
},
{
code: "sl",
code: "nl",
name: "Netherlands",
continent: "Europe",
name_i18n: {
de_DE: "Niederlande",
nl_NL: "Nederland",
en_UK: "Netherlands",
},
call_code: "+31",
},
{
code: "sk",
name: "Slovakia",
continent: "Europe",
name_i18n: {
en_UK: "Slovakia",
},
currency: "EUR",
call_code: "+421",
},
{
@ -194,37 +195,20 @@ export const anastasisData = {
fr_FR: "États-Unis d'Amérique (USA)",
en_UK: "United States of America (USA)",
},
currency: "USD",
call_code: "+1",
},
{
code: "xx",
name: "Testland",
continent: "Testcontinent",
continent_i18n: { de_DE: "Testkontinent" },
continent: "Demoworld",
name_i18n: {
de_DE: "Testlandt",
de_CH: "Testlandi",
fr_FR: "Testpais",
en_UK: "Testland",
},
currency: "TESTKUDOS",
call_code: "+00",
},
{
code: "xy",
name: "Demoland",
continent: "Testcontinent",
continent_i18n: { de_DE: "Testkontinent" },
name_i18n: {
de_DE: "Demolandt",
de_CH: "Demolandi",
fr_FR: "Demopais",
en_UK: "Demoland",
},
currency: "KUDOS",
call_code: "+01",
},
],
},
countryDetails: {
@ -337,9 +321,9 @@ export const anastasisData = {
widget: "anastasis_gtk_ia_ahv",
uuid: "1da87570-ba16-4f62-8a7e-cbda92f51591",
"validation-regex":
"^(756).[0-9]{4}.[0-9]{4}.[0-9]{2}|(756)[0-9]{10}$",
"^(756)\\.[0-9]{4}\\.[0-9]{4}\\.[0-9]{2}|(756)[0-9]{10}$",
"validation-logic": "CH_AHV_check",
autocomplete: "???.????.????.??"
autocomplete: "???.????.????.??",
},
],
},
@ -402,19 +386,6 @@ export const anastasisData = {
widget: "anastasis_gtk_ia_birthplace",
uuid: "4c822e8e-89c6-11eb-95c4-8b077ad8489f",
},
{
type: "string",
name: "tax_number",
label: "Taxpayer identification number",
label_i18n: {
de_DE: "Steuerliche Identifikationsnummer",
en: "German taxpayer identification number",
},
widget: "anastasis_gtk_ia_tax_de",
uuid: "dae48f85-e3ff-47a4-a4a3-ed981ed8c3c6",
"validation-regex": "^[0-9]{11}$",
"validation-logic": "DE_TIN_check",
},
{
type: "string",
name: "social_security_number",
@ -429,6 +400,19 @@ export const anastasisData = {
"validation-logic": "DE_SVN_check",
optional: true,
},
{
type: "string",
name: "tax_number",
label: "Taxpayer identification number",
label_i18n: {
de_DE: "Steuerliche Identifikationsnummer",
en: "German taxpayer identification number",
},
widget: "anastasis_gtk_ia_tin_de",
uuid: "dae48f85-e3ff-47a4-a4a3-ed981ed8c3c6",
"validation-regex": "^[0-9]{11}$",
"validation-logic": "DE_TIN_check",
},
],
},
dk: {
@ -514,6 +498,46 @@ export const anastasisData = {
},
],
},
fr: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
required_attributes: [
{
type: "string",
name: "full_name",
label: "Full name",
widget: "anastasis_gtk_ia_full_name",
uuid: "9e8f463f-575f-42cb-85f3-759559997331",
},
{
type: "date",
name: "birthdate",
label: "Birthdate",
widget: "anastasis_gtk_ia_birthdate",
uuid: "83d655c7-bdb6-484d-904e-80c1058c8854",
},
{
type: "string",
name: "birthplace",
label: "Birthplace",
widget: "anastasis_gtk_ia_birthplace",
uuid: "4c822e8e-89c6-11eb-95c4-8b077ad8489f",
},
{
type: "string",
name: "social_security_number",
label: "Code Insee",
label_i18n: {
fr_FR: "Code Insee",
en: "INSEE code",
},
widget: "anastasis_gtk_ia_insee_fr",
uuid: "2f36a81c-3f6d-41f3-97ee-9c885bc41873",
"validation-regex": "^[0-9]{15}$",
"validation-logic": "FR_INSEE_check",
},
],
},
in: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
@ -626,6 +650,46 @@ export const anastasisData = {
},
],
},
nl: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
required_attributes: [
{
type: "string",
name: "full_name",
label: "Full name",
widget: "anastasis_gtk_ia_full_name",
uuid: "9e8f463f-575f-42cb-85f3-759559997331",
},
{
type: "date",
name: "birthdate",
label: "Birthdate",
widget: "anastasis_gtk_ia_birthdate",
uuid: "83d655c7-bdb6-484d-904e-80c1058c8854",
},
{
type: "string",
name: "birthplace",
label: "Birthplace",
widget: "anastasis_gtk_ia_birthplace",
uuid: "4c822e8e-89c6-11eb-95c4-8b077ad8489f",
},
{
type: "string",
name: "social_security_number",
label: "Citizen Service Number",
label_i18n: {
nl_NL: "Burgerservicenummer (BSN)",
en: "Citizen Service Number",
},
widget: "anastasis_gtk_ia_ssn_nl",
uuid: "b6bf1f14-1f85-4afb-af21-f54b88490bdc",
"validation-regex": "^[1-9][0-9]{8}$",
"validation-logic": "NL_BSN_check",
},
],
},
sk: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
@ -702,35 +766,7 @@ export const anastasisData = {
xx: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
required_attributes: [
{
type: "string",
name: "full_name",
label: "Full name",
widget: "anastasis_gtk_ia_full_name",
uuid: "9e8f463f-575f-42cb-85f3-759559997331",
},
{
type: "date",
name: "birthdate",
label: "Birthdate",
widget: "anastasis_gtk_ia_birthdate",
uuid: "83d655c7-bdb6-484d-904e-80c1058c8854",
},
{
type: "string",
name: "sq_number",
label: "Square number",
widget: "anastasis_gtk_xx_square",
uuid: "ed790bca-89bf-11eb-96f2-233996cf644e",
"validation-regex": "^[0-9]+$",
"validation-logic": "XX_SQUARE_check",
},
],
},
xy: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
restricted: "xx",
required_attributes: [
{
type: "string",
@ -754,6 +790,16 @@ export const anastasisData = {
uuid: "39190a95-cacb-4412-8bae-1f7da3f980b4",
"validation-regex": "^[0-9]+$",
"validation-logic": "XY_PRIME_check",
optional: true,
},
{
type: "string",
name: "sq_number",
label: "Square number",
widget: "anastasis_gtk_xx_square",
uuid: "ed790bca-89bf-11eb-96f2-233996cf644e",
"validation-regex": "^[0-9]+$",
"validation-logic": "XX_SQUARE_check",
},
],
},

View File

@ -142,23 +142,13 @@ const logger = new Logger("anastasis-core:index.ts");
const ANASTASIS_HTTP_HEADER_POLICY_META_DATA = "Anastasis-Policy-Meta-Data";
function getContinents(
opts: { requireProvider?: boolean } = {},
): ContinentInfo[] {
const currenciesWithProvider = new Set<string>();
anastasisData.providersList.anastasis_provider.forEach((x) => {
currenciesWithProvider.add(x.currency);
});
function getContinents(): ContinentInfo[] {
const continentSet = new Set<string>();
const continents: ContinentInfo[] = [];
for (const country of anastasisData.countriesList.countries) {
if (continentSet.has(country.continent)) {
continue;
}
if (opts.requireProvider && !currenciesWithProvider.has(country.currency)) {
// Country's currency doesn't have any providers => skip
continue;
}
continentSet.add(country.continent);
continents.push({
...{ name_i18n: country.continent_i18n },
@ -191,23 +181,14 @@ export class ReducerError extends Error {
* Get countries for a continent, abort with ReducerError
* exception when continent doesn't exist.
*/
function getCountries(
continent: string,
opts: { requireProvider?: boolean } = {},
): CountryInfo[] {
const currenciesWithProvider = new Set<string>();
anastasisData.providersList.anastasis_provider.forEach((x) => {
currenciesWithProvider.add(x.currency);
});
function getCountries(continent: string): CountryInfo[] {
const countries = anastasisData.countriesList.countries.filter(
(x) =>
x.continent === continent &&
(!opts.requireProvider || currenciesWithProvider.has(x.currency)),
(x) => x.continent === continent,
);
if (countries.length <= 0) {
throw new ReducerError({
code: TalerErrorCode.ANASTASIS_REDUCER_INPUT_INVALID,
hint: "continent not found",
hint: `continent ${continent} not found`,
});
}
return countries;
@ -217,9 +198,7 @@ export async function getBackupStartState(): Promise<ReducerStateBackup> {
return {
reducer_type: "backup",
backup_state: BackupStates.ContinentSelecting,
continents: getContinents({
requireProvider: true,
}),
continents: getContinents(),
};
}
@ -227,9 +206,7 @@ export async function getRecoveryStartState(): Promise<ReducerStateRecovery> {
return {
reducer_type: "recovery",
recovery_state: RecoveryStates.ContinentSelecting,
continents: getContinents({
requireProvider: true,
}),
continents: getContinents(),
};
}
@ -238,7 +215,6 @@ async function selectCountry(
args: ActionArgsSelectCountry,
): Promise<Partial<ReducerStateBackup> & Partial<ReducerStateRecovery>> {
const countryCode = args.country_code;
const currencies = args.currencies;
const country = anastasisData.countriesList.countries.find(
(x) => x.code === countryCode,
);
@ -258,7 +234,10 @@ async function selectCountry(
const providers: { [x: string]: AuthenticationProviderStatus } = {};
for (const prov of anastasisData.providersList.anastasis_provider) {
if (currencies.includes(prov.currency)) {
let shouldAdd =
country.code === prov.restricted ||
(country.code !== "xx" && !prov.restricted);
if (shouldAdd) {
providers[prov.url] = {
status: "not-contacted",
};
@ -270,7 +249,6 @@ async function selectCountry(
return {
selected_country: countryCode,
currencies,
required_attributes: ra,
authentication_providers: providers,
};
@ -1223,9 +1201,7 @@ async function backupSelectContinent(
state: ReducerStateBackup,
args: ActionArgsSelectContinent,
): Promise<ReducerStateBackup | ReducerStateError> {
const countries = getCountries(args.continent, {
requireProvider: true,
});
const countries = getCountries(args.continent);
if (countries.length <= 0) {
return {
reducer_type: "error",
@ -1245,9 +1221,7 @@ async function recoverySelectContinent(
state: ReducerStateRecovery,
args: ActionArgsSelectContinent,
): Promise<ReducerStateRecovery | ReducerStateError> {
const countries = getCountries(args.continent, {
requireProvider: true,
});
const countries = getCountries(args.continent);
return {
...state,
recovery_state: RecoveryStates.CountrySelecting,
@ -1540,6 +1514,40 @@ async function nextFromChallengeSelecting(
};
}
async function syncProviders(
state: ReducerStateRecovery,
args: void,
): Promise<ReducerStateRecovery | ReducerStateError> {
const escrowMethods = state.verbatim_recovery_document?.escrow_methods ?? [];
if (escrowMethods.length === 0) {
return {
reducer_type: "error",
code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID,
hint: "Can't sync, no escrow methods in recovery doc.",
};
}
for (const x of escrowMethods) {
const pi = state.authentication_providers?.[x.url];
if (pi?.status === "ok") {
logger.info(`provider ${x.url} is synced`);
continue;
}
const newPi = await getProviderInfo(x.url);
return {
...state,
authentication_providers: {
...state.authentication_providers,
[x.url]: newPi,
},
};
}
return {
reducer_type: "error",
code: TalerErrorCode.ANASTASIS_REDUCER_PROVIDERS_ALREADY_SYNCED,
hint: "all providers are already synced",
};
}
async function enterSecretName(
state: ReducerStateBackup,
args: ActionArgsEnterSecretName,
@ -1714,6 +1722,7 @@ const recoveryTransitions: Record<
),
...transition("poll", codecForAny(), pollChallenges),
...transition("next", codecForAny(), nextFromChallengeSelecting),
...transition("sync_providers", codecForAny(), syncProviders),
},
[RecoveryStates.ChallengeSolving]: {
...transitionRecoveryJump("back", RecoveryStates.ChallengeSelecting),

View File

@ -41,7 +41,6 @@ export interface CountryInfo {
code: string;
name: string;
continent: string;
currency: string;
}
export interface Policy {
@ -77,8 +76,6 @@ export interface ReducerStateBackup {
backup_state: BackupStates;
currencies?: string[];
continents?: ContinentInfo[];
countries?: CountryInfo[];
@ -201,7 +198,6 @@ export interface ReducerStateRecovery {
selected_continent?: string;
selected_country?: string;
currencies?: string[];
required_attributes?: UserAttributeSpec[];
@ -406,7 +402,6 @@ export const codecForActionArgSelectContinent = () =>
export interface ActionArgsSelectCountry {
country_code: string;
currencies: string[];
}
export interface ActionArgsSelectChallenge {
@ -551,5 +546,4 @@ export const codecForActionArgsSelectChallenge = () =>
export const codecForActionArgSelectCountry = () =>
buildCodecForObject<ActionArgsSelectCountry>()
.property("country_code", codecForString())
.property("currencies", codecForList(codecForString()))
.build("ActionArgSelectCountry");

View File

@ -3,6 +3,7 @@ import {
BackupStates,
RecoveryStates,
ReducerState,
ReducerStateRecovery,
} from "@gnu-taler/anastasis-core";
import { FunctionalComponent, h, VNode } from "preact";
import { AnastasisProvider } from "../context/anastasis";
@ -222,7 +223,7 @@ export const reducerStatesExample = {
challengeSolving: {
...base,
recovery_state: RecoveryStates.ChallengeSolving,
} as ReducerState,
} as ReducerStateRecovery,
challengePaying: {
...base,
recovery_state: RecoveryStates.ChallengePaying,

View File

@ -416,6 +416,13 @@ export enum TalerErrorCode {
*/
EXCHANGE_GENERIC_GLOBAL_FEES_MISSING = 1022,
/**
* The exchange was not properly configured with wire fees.
* Returned with an HTTP status code of #MHD_HTTP_INTERNAL_SERVER_ERROR (500).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_GENERIC_WIRE_FEES_MISSING = 1023,
/**
* The exchange did not find information about the specified transaction in the database.
* Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
@ -1179,6 +1186,55 @@ export enum TalerErrorCode {
*/
EXCHANGE_CREATE_PURSE_NEGATIVE_VALUE_AFTER_FEE = 1860,
/**
* The purse to be merged is not known.
* Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_MERGE_PURSE_NOT_FOUND = 1875,
/**
* The signature using the merge key is invalid.
* Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_PURSE_MERGE_INVALID_MERGE_SIGNATURE = 1876,
/**
* The signature using the reserve key is invalid.
* Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_PURSE_MERGE_INVALID_RESERVE_SIGNATURE = 1877,
/**
* The targeted purse is not yet full and thus cannot be merged. Retrying the request later may succeed.
* Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_PURSE_NOT_FULL = 1878,
/**
* The signature from the exchange over the confirmation is invalid.
* Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_PURSE_MERGE_EXCHANGE_SIGNATURE_INVALID = 1879,
/**
* The exchange of the target account is not a partner of this exchange.
* Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_MERGE_PURSE_PARTNER_UNKNOWN = 1880,
/**
* The amount in the purse is lower than the wad fee. So the request was accepted, but no transfer is expected to take place. FIXME-DOLD: good HTTP status. Suggestion: no error, make variant of 200 OK.
* Returned with an HTTP status code of #MHD_HTTP_ACCEPTED (202).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_PURSE_MERGE_WAD_FEE_EXCEEDS_PURSE_VALUE = 1881,
/**
* The auditor signature over the denomination meta data is invalid.
* Returned with an HTTP status code of #MHD_HTTP_FORBIDDEN (403).
@ -1235,6 +1291,41 @@ export enum TalerErrorCode {
*/
EXCHANGE_KYC_CHECK_AUTHORIZATION_FAILED = 1930,
/**
* The exchange does not know a contract under the given contract public key.
* Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_CONTRACTS_UNKNOWN = 1950,
/**
* The URL does not encode a valid exchange public key in its path.
* Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_CONTRACTS_INVALID_CONTRACT_PUB = 1951,
/**
* The returned encrypted contract did not decrypt.
* Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_CONTRACTS_DECRYPTION_FAILED = 1952,
/**
* The signature on the encrypted contract did not validate.
* Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_CONTRACTS_SIGNATURE_INVALID = 1953,
/**
* The decrypted contract was malformed.
* Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
* (A value of 0 indicates that the error is generated client-side).
*/
EXCHANGE_CONTRACTS_DECODING_FAILED = 1954,
/**
* The backend could not find the merchant instance specified in the request.
* Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
@ -2418,13 +2509,6 @@ export enum TalerErrorCode {
*/
ANASTASIS_TRUTH_CHALLENGE_UNKNOWN = 8112,
/**
* A challenge is already active, the service is thus not issuing a new one.
* Returned with an HTTP status code of #MHD_HTTP_ALREADY_REPORTED (208).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_TRUTH_CHALLENGE_ACTIVE = 8113,
/**
* The backend failed to initiate the authorization process.
* Returned with an HTTP status code of #MHD_HTTP_INTERNAL_SERVER_ERROR (500).
@ -2481,13 +2565,6 @@ export enum TalerErrorCode {
*/
ANASTASIS_TRUTH_RATE_LIMITED = 8121,
/**
* The authentication process did not yet complete. The user should try again later.
* Returned with an HTTP status code of #MHD_HTTP_FORBIDDEN (403).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_TRUTH_AUTH_TIMEOUT = 8122,
/**
* A request to issue a challenge is not valid for this authentication method.
* Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
@ -2511,7 +2588,7 @@ export enum TalerErrorCode {
/**
* The provided phone number is not an acceptable number.
* Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
* Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_SMS_PHONE_INVALID = 8200,
@ -2532,7 +2609,7 @@ export enum TalerErrorCode {
/**
* The provided email address is not an acceptable address.
* Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
* Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_EMAIL_INVALID = 8210,
@ -2553,7 +2630,7 @@ export enum TalerErrorCode {
/**
* The provided postal address is not an acceptable address.
* Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
* Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_POST_INVALID = 8220,
@ -2574,21 +2651,28 @@ export enum TalerErrorCode {
/**
* The provided IBAN address is not an acceptable IBAN.
* Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
* Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_IBAN_INVALID = 8230,
/**
* The provider has not yet received the IBAN wire transfer authorizing the disclosure of the key share.
* Returned with an HTTP status code of #MHD_HTTP_FORBIDDEN (403).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_IBAN_MISSING_TRANSFER = 8231,
/**
* The backend did not find a TOTP key in the data provided.
* Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
* Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_TOTP_KEY_MISSING = 8240,
/**
* The key provided does not satisfy the format restrictions for an Anastasis TOTP key.
* Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
* Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_TOTP_KEY_INVALID = 8241,
@ -2775,6 +2859,13 @@ export enum TalerErrorCode {
*/
ANASTASIS_REDUCER_INTERNAL_ERROR = 8419,
/**
* The reducer already synchronized with all providers.
* Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_REDUCER_PROVIDERS_ALREADY_SYNCED = 8420,
/**
* A generic error happened in the LibEuFin nexus. See the enclose details JSON for more information.
* Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).