From 5df2f974d7d19565e92f34fb84aac8183137d6fd Mon Sep 17 00:00:00 2001 From: Thibaut Sardan <33178835+Tbaut@users.noreply.github.com> Date: Thu, 10 Dec 2020 14:51:51 +0100 Subject: [PATCH] Add a flag to get any account type for InjectedAccounts interface (#572) * add getAll and deprecate get * using a withTypes flag * change for anyType and add filtering Co-authored-by: Github Actions --- .../src/background/handlers/Tabs.ts | 18 +++++++++++------- .../extension-base/src/background/types.ts | 4 +++- packages/extension-base/src/page/Accounts.ts | 4 ++-- packages/extension-inject/src/types.ts | 4 +++- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/extension-base/src/background/handlers/Tabs.ts b/packages/extension-base/src/background/handlers/Tabs.ts index 588acb0f..b6f2ec9f 100644 --- a/packages/extension-base/src/background/handlers/Tabs.ts +++ b/packages/extension-base/src/background/handlers/Tabs.ts @@ -6,7 +6,7 @@ import type { KeyringPair } from '@polkadot/keyring/types'; import type { JsonRpcResponse } from '@polkadot/rpc-provider/types'; import type { SignerPayloadJSON, SignerPayloadRaw } from '@polkadot/types/types'; import type { SubjectInfo } from '@polkadot/ui-keyring/observable/types'; -import type { MessageTypes, RequestAuthorizeTab, RequestRpcSend, RequestRpcSubscribe, RequestRpcUnsubscribe, RequestTypes, ResponseRpcListProviders, ResponseSigning, ResponseTypes, SubscriptionMessageTypes } from '../types'; +import type { MessageTypes, RequestAccountList, RequestAuthorizeTab, RequestRpcSend, RequestRpcSubscribe, RequestRpcUnsubscribe, RequestTypes, ResponseRpcListProviders, ResponseSigning, ResponseTypes, SubscriptionMessageTypes } from '../types'; import { PHISHING_PAGE_REDIRECT } from '@polkadot/extension-base/defaults'; import { checkIfDenied } from '@polkadot/phishing'; @@ -19,13 +19,17 @@ import RequestExtrinsicSign from '../RequestExtrinsicSign'; import State from './State'; import { createSubscription, unsubscribe } from './subscriptions'; -function transformAccounts (accounts: SubjectInfo): InjectedAccount[] { +function transformAccounts (accounts: SubjectInfo, anyType = false): InjectedAccount[] { return Object .values(accounts) .filter(({ json: { meta: { isHidden } } }) => !isHidden) + .filter(({ type }) => anyType ? true : type && ['ed25519', 'sr25519', 'ecdsa'].includes(type)) .sort((a, b) => (a.json.meta.whenCreated || 0) - (b.json.meta.whenCreated || 0)) - .map(({ json: { address, meta: { genesisHash, name } } }): InjectedAccount => ({ - address, genesisHash, name + .map(({ json: { address, meta: { genesisHash, name } }, type }): InjectedAccount => ({ + address, + genesisHash, + name, + type })); } @@ -41,8 +45,8 @@ export default class Tabs { } // eslint-disable-next-line @typescript-eslint/no-unused-vars - private accountsList (url: string): InjectedAccount[] { - return transformAccounts(accountsObservable.subject.getValue()); + private accountsList (url: string, { anyType }: RequestAccountList): InjectedAccount[] { + return transformAccounts(accountsObservable.subject.getValue(), anyType); } // FIXME This looks very much like what we have in Extension @@ -168,7 +172,7 @@ export default class Tabs { return this.authorize(url, request as RequestAuthorizeTab); case 'pub(accounts.list)': - return this.accountsList(url); + return this.accountsList(url, request as RequestAccountList); case 'pub(accounts.subscribe)': return this.accountsSubscribe(url, id, port); diff --git a/packages/extension-base/src/background/types.ts b/packages/extension-base/src/background/types.ts index 086138d5..8f517443 100644 --- a/packages/extension-base/src/background/types.ts +++ b/packages/extension-base/src/background/types.ts @@ -223,7 +223,9 @@ export interface RequestAccountExport { password: string; } -export type RequestAccountList = null; +export interface RequestAccountList { + anyType?: boolean; +} export type RequestAccountSubscribe = null; diff --git a/packages/extension-base/src/page/Accounts.ts b/packages/extension-base/src/page/Accounts.ts index 02fe9750..1f871b16 100644 --- a/packages/extension-base/src/page/Accounts.ts +++ b/packages/extension-base/src/page/Accounts.ts @@ -12,8 +12,8 @@ export default class Accounts implements InjectedAccounts { sendRequest = _sendRequest; } - public get (): Promise { - return sendRequest('pub(accounts.list)'); + public get (anyType?: boolean): Promise { + return sendRequest('pub(accounts.list)', { anyType }); } public subscribe (cb: (accounts: InjectedAccount[]) => unknown): Unsubcall { diff --git a/packages/extension-inject/src/types.ts b/packages/extension-inject/src/types.ts index 442b45c3..9a4495c6 100644 --- a/packages/extension-inject/src/types.ts +++ b/packages/extension-inject/src/types.ts @@ -3,6 +3,7 @@ import type { Signer as InjectedSigner } from '@polkadot/api/types'; import type { ProviderInterface } from '@polkadot/rpc-provider/types'; +import type { KeypairType } from '@polkadot/util-crypto/types'; // eslint-disable-next-line no-undef type This = typeof globalThis; @@ -13,6 +14,7 @@ export interface InjectedAccount { address: string; genesisHash?: string | null; name?: string; + type?: KeypairType; } export interface InjectedAccountWithMeta { @@ -25,7 +27,7 @@ export interface InjectedAccountWithMeta { } export interface InjectedAccounts { - get: () => Promise; + get: (anyType?: boolean) => Promise; subscribe: (cb: (accounts: InjectedAccount[]) => void | Promise) => Unsubcall; }