From 7f7b5605408a2a11a60a02387062b3ffc017a006 Mon Sep 17 00:00:00 2001 From: lbqds Date: Wed, 13 Sep 2023 20:15:52 +0800 Subject: [PATCH] Add connection expiry --- .../background/preAuthorizationMessaging.ts | 3 +- .../extension/src/shared/preAuthorizations.ts | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/extension/src/background/preAuthorizationMessaging.ts b/packages/extension/src/background/preAuthorizationMessaging.ts index 0f269152..3832d853 100644 --- a/packages/extension/src/background/preAuthorizationMessaging.ts +++ b/packages/extension/src/background/preAuthorizationMessaging.ts @@ -1,7 +1,7 @@ import { differenceWith, isEqual } from "lodash-es" import { PreAuthorisationMessage } from "../shared/messages/PreAuthorisationMessage" -import { getPreAuthorized, isPreAuthorized, preAuthorizeStore, removePreAuthorization } from "../shared/preAuthorizations" +import { getPreAuthorized, isPreAuthorized, preAuthorizeStore, removePreAuthorization, setConnectionExpiryAlarm } from "../shared/preAuthorizations" import { withNetwork } from "../shared/wallet.service" import { addTab, sendMessageToHost } from "./activeTabs" import { UnhandledMessage } from "./background" @@ -45,6 +45,7 @@ export const handlePreAuthorizationMessage: HandleMessage< } if (authorized) { + await setConnectionExpiryAlarm(msg.data.host) const authorizedAccount = await wallet.getAccount(authorized.account) const walletAccountWithNetwork = await withNetwork(authorizedAccount) return respond({ diff --git a/packages/extension/src/shared/preAuthorizations.ts b/packages/extension/src/shared/preAuthorizations.ts index 3e3f901f..f8eaf5ad 100644 --- a/packages/extension/src/shared/preAuthorizations.ts +++ b/packages/extension/src/shared/preAuthorizations.ts @@ -9,6 +9,8 @@ import { useArrayStorage } from "./storage/hooks" import { BaseWalletAccount } from "./wallet.model" import { accountsEqual } from "./wallet.service" +const CONNECTION_EXPIRY = 7 * 24 * 60 // 7 days in minutes + interface PreAuthorization { account: BaseWalletAccount host: string @@ -53,6 +55,29 @@ export const migratePreAuthorizations = async () => { } } +const getConnectionAlarmName = (host: string) => { + return `alph:connection:${host}` +} + +const connectionExpiryListner = (alarm: browser.alarms.Alarm) => { + if (alarm.name.startsWith('alph:connection:')) { + const host = alarm.name.split(':')[2] + removePreAuthorization(host) + } +} + +export const setConnectionExpiryAlarm = async (host: string) => { + if (!browser.alarms.onAlarm.hasListener(connectionExpiryListner)) { + browser.alarms.onAlarm.addListener(connectionExpiryListner) + } + + const alarmName = getConnectionAlarmName(host) + await browser.alarms.clear(alarmName) + browser.alarms.create(alarmName, { + delayInMinutes: CONNECTION_EXPIRY, + }) +} + export const preAuthorize = async ( account: BaseWalletAccount, host: string, @@ -61,6 +86,8 @@ export const preAuthorize = async ( account, host, }) + + await setConnectionExpiryAlarm(host) } export const removePreAuthorization = async ( @@ -73,6 +100,7 @@ export const removePreAuthorization = async ( } return x.host === host }) + await browser.alarms.clear(getConnectionAlarmName(host)) } export const getPreAuthorizations = () => {