From fdc36b4fb75201e23023a583b8eebd05b1f24f77 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 2 Nov 2021 17:02:04 +0100 Subject: anastasis-core: compute upload fees --- packages/anastasis-core/src/index.ts | 60 +++++++++++++++++++++++----- packages/anastasis-core/src/reducer-types.ts | 3 +- 2 files changed, 52 insertions(+), 11 deletions(-) (limited to 'packages/anastasis-core/src') diff --git a/packages/anastasis-core/src/index.ts b/packages/anastasis-core/src/index.ts index 07f8122e3..9bb4e347a 100644 --- a/packages/anastasis-core/src/index.ts +++ b/packages/anastasis-core/src/index.ts @@ -1,13 +1,19 @@ import { + AmountJson, + AmountLike, + Amounts, AmountString, buildSigPS, bytesToString, Codec, codecForAny, decodeCrock, + Duration, eddsaSign, encodeCrock, + getDurationRemaining, getRandomBytes, + getTimestampNow, hash, j2s, Logger, @@ -1051,27 +1057,62 @@ async function nextFromAuthenticationsEditing( async function updateUploadFees( state: ReducerStateBackup, ): Promise { - for (const prov of state.policy_providers ?? []) { - const info = state.authentication_providers![prov.provider_url]; - if (!("currency" in info)) { - continue; + const expiration = state.expiration; + if (!expiration) { + return { ...state }; + } + logger.info("updating upload fees"); + const feePerCurrency: Record = {}; + const coveredProviders = new Set(); + const addFee = (x: AmountLike) => { + x = Amounts.jsonifyAmount(x); + feePerCurrency[x.currency] = Amounts.add( + feePerCurrency[x.currency] ?? Amounts.getZero(x.currency), + x, + ).amount; + }; + const years = Duration.toIntegerYears(Duration.getRemaining(expiration)); + logger.info(`computing fees for ${years} years`); + for (const x of state.policies ?? []) { + for (const m of x.methods) { + const prov = state.authentication_providers![ + m.provider + ] as AuthenticationProviderStatusOk; + const authMethod = state.authentication_methods![m.authentication_method]; + if (!coveredProviders.has(m.provider)) { + const annualFee = Amounts.mult(prov.annual_fee, years).amount; + logger.info(`adding annual fee ${Amounts.stringify(annualFee)}`); + addFee(annualFee); + coveredProviders.add(m.provider); + } + for (const pm of prov.methods) { + if (pm.type === authMethod.type) { + addFee(pm.usage_fee); + break; + } + } } } - return { ...state, upload_fees: [] }; + return { + ...state, + upload_fees: Object.values(feePerCurrency).map((x) => ({ + fee: Amounts.stringify(x), + })), + }; } async function enterSecret( state: ReducerStateBackup, args: ActionArgEnterSecret, ): Promise { - return { + return updateUploadFees({ ...state, expiration: args.expiration, core_secret: { mime: args.secret.mime ?? "text/plain", value: args.secret.value, }, - }; + }); } async function nextFromChallengeSelecting( @@ -1102,11 +1143,10 @@ async function updateSecretExpiration( state: ReducerStateBackup, args: ActionArgsUpdateExpiration, ): Promise { - // FIXME: implement! - return { + return updateUploadFees({ ...state, expiration: args.expiration, - }; + }); } const backupTransitions: Record< diff --git a/packages/anastasis-core/src/reducer-types.ts b/packages/anastasis-core/src/reducer-types.ts index 03883ce17..2f0d324ae 100644 --- a/packages/anastasis-core/src/reducer-types.ts +++ b/packages/anastasis-core/src/reducer-types.ts @@ -66,6 +66,7 @@ export interface ReducerStateBackup { selected_country?: string; secret_name?: string; policies?: Policy[]; + /** * Policy providers are providers that we checked to be functional * and that are actually used in policies. @@ -82,7 +83,7 @@ export interface ReducerStateBackup { expiration?: Timestamp; - upload_fees?: AmountString[]; + upload_fees?: { fee: AmountString }[]; } export interface AuthMethod { -- cgit v1.2.3