Remember last account selection for authorization (#1133)

* remember last selection

* nit for readability
This commit is contained in:
Thibaut Sardan 2022-09-01 06:59:23 +01:00 committed by GitHub
parent 85a3c58986
commit 8324ae0868
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 12 deletions

1
.gitignore vendored
View File

@ -26,3 +26,4 @@ package-lock.json
_book _book
docs/html docs/html
.idea .idea
.vscode

View File

@ -34,14 +34,6 @@ function getSuri (seed: string, type?: KeypairType): string {
: seed; : seed;
} }
function transformAccounts (accounts: SubjectInfo): AccountJson[] {
return Object.values(accounts).map(({ json: { address, meta }, type }): AccountJson => ({
address,
...meta,
type
}));
}
function isJsonPayload (value: SignerPayloadJSON | SignerPayloadRaw): value is SignerPayloadJSON { function isJsonPayload (value: SignerPayloadJSON | SignerPayloadRaw): value is SignerPayloadJSON {
return (value as SignerPayloadJSON).genesisHash !== undefined; return (value as SignerPayloadJSON).genesisHash !== undefined;
} }
@ -56,6 +48,15 @@ export default class Extension {
this.#state = state; this.#state = state;
} }
private transformAccounts (accounts: SubjectInfo): AccountJson[] {
return Object.values(accounts).map(({ json: { address, meta }, type }): AccountJson => ({
address,
isDefaultAuthSelected: this.#state.defaultAuthAccountSelection.includes(address),
...meta,
type
}));
}
private accountsCreateExternal ({ address, genesisHash, name }: RequestAccountCreateExternal): boolean { private accountsCreateExternal ({ address, genesisHash, name }: RequestAccountCreateExternal): boolean {
keyring.addExternal(address, { genesisHash, name }); keyring.addExternal(address, { genesisHash, name });
@ -127,6 +128,12 @@ export default class Extension {
}); });
this.#state.updateAuthorizedAccounts(authorizedAccountsDiff); this.#state.updateAuthorizedAccounts(authorizedAccountsDiff);
// cycle through default account selection for auth and remove any occurence of the account
const newDefaultAuthAccounts = this.#state.defaultAuthAccountSelection.filter((defaultSelectionAddress) => defaultSelectionAddress !== address);
this.#state.updateDefaultAuthAccounts(newDefaultAuthAccounts);
keyring.forgetAccount(address); keyring.forgetAccount(address);
return true; return true;
@ -181,7 +188,7 @@ export default class Extension {
private accountsSubscribe (id: string, port: chrome.runtime.Port): boolean { private accountsSubscribe (id: string, port: chrome.runtime.Port): boolean {
const cb = createSubscription<'pri(accounts.subscribe)'>(id, port); const cb = createSubscription<'pri(accounts.subscribe)'>(id, port);
const subscription = accountsObservable.subject.subscribe((accounts: SubjectInfo): void => const subscription = accountsObservable.subject.subscribe((accounts: SubjectInfo): void =>
cb(transformAccounts(accounts)) cb(this.transformAccounts(accounts))
); );
port.onDisconnect.addListener((): void => { port.onDisconnect.addListener((): void => {

View File

@ -94,6 +94,7 @@ export enum NotificationOptions {
} }
const AUTH_URLS_KEY = 'authUrls'; const AUTH_URLS_KEY = 'authUrls';
const DEFAULT_AUTH_ACCOUNTS = 'defaultAuthAccounts';
function extractMetadata (store: MetadataStore): void { function extractMetadata (store: MetadataStore): void {
store.allMap((map): void => { store.allMap((map): void => {
@ -158,6 +159,8 @@ export default class State {
public readonly signSubject: BehaviorSubject<SigningRequest[]> = new BehaviorSubject<SigningRequest[]>([]); public readonly signSubject: BehaviorSubject<SigningRequest[]> = new BehaviorSubject<SigningRequest[]>([]);
public defaultAuthAccountSelection: string[] = [];
constructor (providers: Providers = {}) { constructor (providers: Providers = {}) {
this.#providers = providers; this.#providers = providers;
@ -168,6 +171,12 @@ export default class State {
const previousAuth = JSON.parse(authString) as AuthUrls; const previousAuth = JSON.parse(authString) as AuthUrls;
this.#authUrls = previousAuth; this.#authUrls = previousAuth;
// retrieve previously set default auth accounts
const defaultAuthString = localStorage.getItem(DEFAULT_AUTH_ACCOUNTS) || '[]';
const previousDefaultAuth = JSON.parse(defaultAuthString) as string[];
this.defaultAuthAccountSelection = previousDefaultAuth;
} }
public get knownMetadata (): MetadataDef[] { public get knownMetadata (): MetadataDef[] {
@ -241,6 +250,7 @@ export default class State {
}; };
this.saveCurrentAuthList(); this.saveCurrentAuthList();
this.updateDefaultAuthAccounts(authorizedAccounts);
delete this.#authRequests[id]; delete this.#authRequests[id];
this.updateIconAuth(true); this.updateIconAuth(true);
}; };
@ -266,6 +276,15 @@ export default class State {
localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(this.#authUrls)); localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(this.#authUrls));
} }
private saveDefaultAuthAccounts () {
localStorage.setItem(DEFAULT_AUTH_ACCOUNTS, JSON.stringify(this.defaultAuthAccountSelection));
}
public updateDefaultAuthAccounts (newList: string[]) {
this.defaultAuthAccountSelection = newList;
this.saveDefaultAuthAccounts();
}
private metaComplete = (id: string, resolve: (result: boolean) => void, reject: (error: Error) => void): Resolver<boolean> => { private metaComplete = (id: string, resolve: (result: boolean) => void, reject: (error: Error) => void): Resolver<boolean> => {
const complete = (): void => { const complete = (): void => {
delete this.#metaRequests[id]; delete this.#metaRequests[id];

View File

@ -36,6 +36,7 @@ export interface AccountJson extends KeyringPair$Meta {
isExternal?: boolean; isExternal?: boolean;
isHardware?: boolean; isHardware?: boolean;
isHidden?: boolean; isHidden?: boolean;
isDefaultAuthSelected?: boolean
name?: string; name?: string;
parentAddress?: string; parentAddress?: string;
suri?: string; suri?: string;

View File

@ -27,8 +27,12 @@ function Request ({ authId, className, isFirst, request: { origin }, url }: Prop
const onAction = useContext(ActionContext); const onAction = useContext(ActionContext);
useEffect(() => { useEffect(() => {
setSelectedAccounts && setSelectedAccounts([]); const defaultAccountSelection = accounts
}, [setSelectedAccounts]); .filter(({ isDefaultAuthSelected }) => !!isDefaultAuthSelected)
.map(({ address }) => address);
setSelectedAccounts && setSelectedAccounts(defaultAccountSelection);
}, [accounts, setSelectedAccounts]);
const _onApprove = useCallback( const _onApprove = useCallback(
(): void => { (): void => {