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:
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,