Skip to content

Commit

Permalink
Update .nvmrc file since it uses wrong version
Browse files Browse the repository at this point in the history
  • Loading branch information
rAskVAL committed Feb 7, 2024
1 parent 6f4415b commit 9f5921b
Show file tree
Hide file tree
Showing 5 changed files with 339 additions and 211 deletions.
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
18
18.0.0
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"packages/*"
],
"scripts": {
"adapt-build-to-ff": "ts-node --esm scripts/adaptBuildToFf.mts",
"adapt-build-to-ff": "tsx scripts/adaptBuildToFf.mts",
"build": "yarn download-chains-metadata && polkadot-dev-build-ts && yarn build:zip",
"build-storybook": "storybook build",
"build:extra": "yarn build:i18n && yarn build:ui",
Expand All @@ -33,10 +33,10 @@
"build:zip:dst:firefox": "rm -rf ./extension-firefox.zip && cd packages/extension/build && zip -r -FS ../../../extension-firefox.zip .",
"build:zip:src": "rm -rf ./source-code.zip && zip -r -x '*build/*' -x '*node_modules*' -FS ./source-code.zip packages .editorconfig .eslintignore .eslintrc.js babel.config.cjs CHANGELOG.md CONTRIBUTING.md i18next-scanner.config.js jest.config.cjs LICENSE package.json README.md tsconfig.json tsconfig.base.json tsconfig.build.json rollup.config.mjs yarn.lock .yarnrc.yml .yarn/patches .yarn/plugins .yarn/releases scripts",
"clean": "polkadot-dev-clean-build",
"download-chains-metadata": "ts-node --esm scripts/downloadMetadata.mts",
"download-chains-metadata": "tsx scripts/downloadMetadata.mts",
"lint": "polkadot-dev-run-lint",
"postinstall": "polkadot-dev-yarn-only",
"set-signer-version": "ts-node --esm scripts/setSignerVersion.mts",
"set-signer-version": "tsx scripts/setSignerVersion.mts",
"start": "yarn watch",
"storybook": "storybook dev -p 6006",
"test": "EXTENSION_PREFIX='test' polkadot-dev-run-test --detectOpenHandles",
Expand Down Expand Up @@ -64,7 +64,7 @@
"i18next-scanner": "^4.1.0",
"sinon-chrome": "^3.0.1",
"storybook": "^7.0.12",
"ts-node": "^10.9.1"
"tsx": "^4.7.0"
},
"resolutions": {
"@polkadot/api": "^10.5.1",
Expand Down
34 changes: 21 additions & 13 deletions packages/extension-base/src/background/handlers/Extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import type { SubjectInfo } from '@polkadot/ui-keyring/observable/types';
import type { KeypairType } from '@polkadot/util-crypto/types';
import type { AccountJson, AllowedPath, MessageTypes, RequestAccountChangePassword, RequestAccountCreateHardware, RequestAccountCreateSuri, RequestAccountEdit, RequestAccountExport, RequestAccountForget, RequestAccountShow, RequestAccountTie, RequestAccountValidate, RequestActiveTabUrlUpdate, RequestAuthorizeApprove, RequestAuthorizeReject, RequestBatchRestore, RequestDeriveCreate, RequestDeriveValidate, RequestJsonRestore, RequestMetadataApprove, RequestMetadataReject, RequestSeedCreate, RequestSeedValidate, RequestSigningApprovePassword, RequestSigningApproveSignature, RequestSigningCancel, RequestSigningIsLocked, RequestTypes, RequestUpdateAuthorizedAccounts, ResponseAccountExport, ResponseAuthorizeList, ResponseDeriveValidate, ResponseJsonGetAccountInfo, ResponseSeedCreate, ResponseSeedValidate, ResponseSigningIsLocked } from '../types';

import { ALLOWED_PATH } from '@polkadot/extension-base/defaults';
import { ALLOWED_PATH, PASSWORD_EXPIRY_MS } from '@polkadot/extension-base/defaults';
import { isJsonAuthentic, signJson } from '@polkadot/extension-base/utils/accountJsonIntegrity';
import { metadataExpand } from '@polkadot/extension-chains';
import { wrapBytes } from '@polkadot/extension-dapp';
Expand Down Expand Up @@ -136,18 +136,24 @@ export default class Extension {
private async refreshAccountPasswordCache (pair: KeyringPair): Promise<number> {
const { address } = pair;

const savedPassword = await chromeStorage.getPassword(address);
const savedPasswords = await chromeStorage.getItem('password-cache');

const remainingTime = savedPassword?.expiry - Date.now();
if (savedPasswords) {
const remainingTime = savedPasswords[address]?.expiresAt - Date.now();

if (remainingTime < 0) {
await chromeStorage.removePassword(address);
pair.lock();
if (remainingTime < 0) {
delete savedPasswords[address];

return 0;
await chromeStorage.setItem('password-cache', () => (savedPasswords));
pair.lock();

return 0;
}

return remainingTime;
}

return remainingTime;
return 0;
}

private accountsShow ({ address, isShowing }: RequestAccountShow): boolean {
Expand Down Expand Up @@ -338,9 +344,10 @@ export default class Extension {

const { payload } = queued;
const pair = keyring.getPair(queued.account.address);
const savedPassword = await chromeStorage.getPassword(pair.address);

const password = savedPassword?.expiry > 0 ? savedPassword?.password : inputPassword;
const savedPasswords = await chromeStorage.getItem('password-cache');

const password = savedPasswords && savedPasswords[pair.address]?.expiresAt - Date.now() > 0 ? savedPasswords[pair.address].password : inputPassword;

if (!pair) {
const error = new Error('Unable to find pair');
Expand Down Expand Up @@ -412,11 +419,12 @@ export default class Extension {
// unlike queued.account.address the following
// address is encoded with the default prefix
// which what is used for password caching mapping
await chromeStorage.setPassword(pair.address, password);

await chromeStorage.setItem('password-cache', (savedPasswords) => ({ ...savedPasswords, [pair.address]: { password, expiresAt: Date.now() + PASSWORD_EXPIRY_MS } }));
} else {
const savedExpiry = await chromeStorage.getPassword(pair.address);
const savedPasswords = await chromeStorage.getItem('password-cache');

const remainingTime = savedExpiry?.expiry - Date.now();
const remainingTime = (savedPasswords && savedPasswords[pair.address]?.expiresAt - Date.now()) || 0;

if (remainingTime <= 0) {
pair.lock();
Expand Down
67 changes: 19 additions & 48 deletions packages/extension-base/src/background/handlers/chromeStorage.ts
Original file line number Diff line number Diff line change
@@ -1,61 +1,32 @@
import { z } from 'zod';

import { PASSWORD_EXPIRY_MS } from '../../defaults';
// use namespaces to add typization for your storage data
const namespaces = { 'password-cache': z.record(z.string(), z.object({ password: z.string(), expiresAt: z.number() })) } as const satisfies Record<string, z.ZodSchema>;

const addressSchema = z.string();
const passwordSchema = z.record(z.string(), z.object({ expiry: z.number(), password: z.string() }));
export const setItem = async <N extends keyof typeof namespaces>(namespace: N, updater: (currData?: z.TypeOf<typeof namespaces[N]>) => z.TypeOf<typeof namespaces[N]>) => {
const currentData = await getItem(namespace);

type Password = { expiry: number, password?: string }

async function getPassword (address: string): Promise<Password> {
if (addressSchema.safeParse(address).success) {
const { savePass } = await chrome.storage.session.get('savePass');

const pass = passwordSchema.safeParse(savePass);

if (pass.success) {
return pass.data[address];
} else {
return { expiry: 0 };
}
} else {
return { expiry: 0 };
}
}

async function setPassword (address: string, password: string): Promise<void> {
if (addressSchema.safeParse(address).success) {
const { savePass } = await chrome.storage.session.get('savePass');
await chrome.storage.session.set({ [namespace]: updater(currentData) });
};

const savedPasswords = passwordSchema.safeParse(savePass);
export const getItem = async <N extends keyof typeof namespaces>(namespace: N): Promise<z.infer<typeof namespaces[N]> | undefined> => {
const { [namespace]: cachedData } = await chrome.storage.session.get(namespace);

if (savedPasswords.success) {
await chrome.storage.session.set({ savePass: { ...savedPasswords.data, [address]: { password, expiry: Date.now() + PASSWORD_EXPIRY_MS } } });
} else {
await chrome.storage.session.set({ savePass: { [address]: { expiry: Date.now() + PASSWORD_EXPIRY_MS, password } } });
}
} else {
console.error('Provided address did not pass validation');
try {
return namespaces[namespace].parse(cachedData);
} catch {
return undefined;
}
}

async function removePassword (address: string): Promise<void> {
if (addressSchema.safeParse(address).success) {
const { savePass } = await chrome.storage.session.get('savePass');

const pass = passwordSchema.safeParse(savePass);
};

if (pass.success) {
delete pass.data[address];
await chrome.storage.session.set({ savePass: pass.data });
}
}
}
export const removeItem = async <N extends keyof typeof namespaces>(namespace: N) => {
await chrome.storage.session.remove(namespace);
};

const chromeStorage = {
setPassword,
getPassword,
removePassword
getItem,
setItem,
removeItem
};

export default chromeStorage;
Loading

0 comments on commit 9f5921b

Please sign in to comment.