taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit a97911bcf5d67729c1188f4cb90d3a4951e2a174
parent 4a23da4a3106bcdc34db5910b82094556c68a92f
Author: Sebastian <sebasjm@taler-systems.com>
Date:   Thu,  2 Apr 2026 01:37:11 -0300

fix aml session backguard compatibility

Diffstat:
Mpackages/aml-backoffice-ui/src/hooks/officer.ts | 40++++++++++++++++++++++++++++++----------
1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/packages/aml-backoffice-ui/src/hooks/officer.ts b/packages/aml-backoffice-ui/src/hooks/officer.ts @@ -32,7 +32,8 @@ import { encodeCrock, opFixedSuccess, opKnownFailure, - unlockOfficerAccount + unlockOfficerAccount, + codecOptional, } from "@gnu-taler/taler-util"; import { buildStorageKey, @@ -47,8 +48,15 @@ const DEFAULT_SESSION_DURATION = Duration.fromSpec({ hours: 1, }); -export interface Officer { - session: LockedAccount; +interface OfficerCompatible { + /** + * @deprecated + * use session + * + * remove when not used anymore, since 2026-04 + */ + account: LockedAccount | undefined; + session: LockedAccount | undefined; when: AbsoluteTime; } @@ -67,9 +75,10 @@ export const codecForOfficerAccount = (): Codec<OfficerAccountString> => .property("unlocked", codecForAbsoluteTime) .build("OfficerAccount"); -export const codecForOfficer = (): Codec<Officer> => - buildCodecForObject<Officer>() - .property("session", codecForLockedAccount) +export const codecForOfficer = (): Codec<OfficerCompatible> => + buildCodecForObject<OfficerCompatible>() + .property("session", codecOptional(codecForLockedAccount)) + .property("account", codecOptional(codecForLockedAccount)) .property("when", codecForAbsoluteTime) .build("Officer"); @@ -82,7 +91,9 @@ export interface OfficerNotFound { export interface OfficerLocked { state: "locked"; forget: () => OperationOk<void>; - tryUnlock: (password: string) => Promise<OperationOk<void> | OperationFail<HttpStatusCode.Forbidden>>; + tryUnlock: ( + password: string, + ) => Promise<OperationOk<void> | OperationFail<HttpStatusCode.Forbidden>>; } export interface OfficerReady { state: "ready"; @@ -120,9 +131,10 @@ export function useOfficer(): OfficerState { const officer = useMemo(() => { if (!officerStorage.value) return undefined; return officerStorage.value; - }, [officerStorage.value?.session, officerStorage.value?.when.t_ms]); + }, [officerStorage.value?.account, officerStorage.value?.when.t_ms]); - if (officer === undefined) { + const currentSession = officer?.session ?? officer?.account; + if (currentSession === undefined) { return { state: "not-found", create: async (pwd: string) => { @@ -134,6 +146,7 @@ export function useOfficer(): OfficerState { extraEntropy, ); officerStorage.update({ + account: undefined, session: safe, when: AbsoluteTime.now(), }); @@ -145,6 +158,13 @@ export function useOfficer(): OfficerState { return opFixedSuccess(id); }, }; + } else if (officer?.session === undefined) { + // migrate from account to session + officerStorage.update({ + account: undefined, + session: currentSession, + when: AbsoluteTime.now(), + }); } if (session === undefined) { @@ -156,7 +176,7 @@ export function useOfficer(): OfficerState { }, tryUnlock: async (pwd: string) => { try { - const ac = await unlockOfficerAccount(officer.session, pwd); + const ac = await unlockOfficerAccount(currentSession, pwd); // accountStorage.update(ac); sessionStorage.update({ id: ac.id,