From a94836977ad00b1acb8817204b146f6e336f528a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Jun 2019 13:58:33 +0200 Subject: [PATCH] Extend message/request ids as string (#48) * Extend message/request ids as string * Only decode the current method (as meta available) * Dep-dup id generation --- .../src/Popup/Authorize/Request.tsx | 2 +- .../src/Popup/Signing/Details.tsx | 5 ++-- .../src/Popup/Signing/Request.tsx | 3 ++- packages/extension-ui/src/messaging.ts | 12 +++++----- .../src/background/handlers/State.ts | 24 +++++++++++-------- .../src/background/handlers/index.ts | 2 +- packages/extension/src/background/types.ts | 18 +++++++------- packages/extension/src/page/index.ts | 4 ++-- 8 files changed, 38 insertions(+), 32 deletions(-) diff --git a/packages/extension-ui/src/Popup/Authorize/Request.tsx b/packages/extension-ui/src/Popup/Authorize/Request.tsx index 39882e1d..65f7e2b4 100644 --- a/packages/extension-ui/src/Popup/Authorize/Request.tsx +++ b/packages/extension-ui/src/Popup/Authorize/Request.tsx @@ -12,7 +12,7 @@ import { ActionBar, Button, Icon, IconBox, Link, Tip, defaults, withOnAction } f import { approveAuthRequest, rejectAuthRequest } from '../../messaging'; type Props = { - authId: number, + authId: string, className?: string, isFirst: boolean, onAction: OnActionFromCtx, diff --git a/packages/extension-ui/src/Popup/Signing/Details.tsx b/packages/extension-ui/src/Popup/Signing/Details.tsx index 486e032d..3b2ca018 100644 --- a/packages/extension-ui/src/Popup/Signing/Details.tsx +++ b/packages/extension-ui/src/Popup/Signing/Details.tsx @@ -11,6 +11,7 @@ import { Metadata, Method } from '@polkadot/types'; type Props = { className?: string, genesisHash: string, + isDecoded: boolean, method: string, nonce: string, url: string @@ -39,7 +40,7 @@ function renderMethod (data: string, meta?: Metadata | null) { ); } -function Details ({ className, genesisHash, method, nonce, url }: Props) { +function Details ({ className, genesisHash, isDecoded, method, nonce, url }: Props) { const chain = findChain(genesisHash); return ( @@ -57,7 +58,7 @@ function Details ({ className, genesisHash, method, nonce, url }: Props) { nonce {nonce} - {renderMethod(method, chain ? chain.meta : null)} + {renderMethod(method, (chain && isDecoded) ? chain.meta : null)} ); diff --git a/packages/extension-ui/src/Popup/Signing/Request.tsx b/packages/extension-ui/src/Popup/Signing/Request.tsx index c19ee544..5153bc04 100644 --- a/packages/extension-ui/src/Popup/Signing/Request.tsx +++ b/packages/extension-ui/src/Popup/Signing/Request.tsx @@ -16,7 +16,7 @@ type Props = { isFirst: boolean, onAction: OnActionFromCtx, request: MessageExtrinsicSign, - signId: number, + signId: string, url: string }; @@ -33,6 +33,7 @@ function Request ({ isFirst, onAction, request: { address, genesisHash, method,
void, reject: (error: Error) => void } @@ -40,7 +40,7 @@ port.onMessage.addListener((data) => { function sendMessage (message: MessageTypes, request: any = {}): Promise { return new Promise((resolve, reject) => { - const id = ++idCounter; + const id = `${Date.now()}.${++idCounter}`; handlers[id] = { resolve, reject }; @@ -64,11 +64,11 @@ export async function getAuthRequests (): Promise> { return sendMessage('authorize.requests'); } -export async function rejectAuthRequest (id: number): Promise { +export async function rejectAuthRequest (id: string): Promise { return sendMessage('authorize.reject', { id }); } -export async function approveAuthRequest (id: number): Promise { +export async function approveAuthRequest (id: string): Promise { return sendMessage('authorize.approve', { id }); } @@ -76,11 +76,11 @@ export async function getSignRequests (): Promise> { return sendMessage('signing.requests'); } -export async function cancelSignRequest (id: number): Promise { +export async function cancelSignRequest (id: string): Promise { return sendMessage('signing.cancel', { id }); } -export async function approveSignRequest (id: number, password: string): Promise { +export async function approveSignRequest (id: string, password: string): Promise { return sendMessage('signing.approve', { id, password }); } diff --git a/packages/extension/src/background/handlers/State.ts b/packages/extension/src/background/handlers/State.ts index ffa5ad91..96efa0f6 100644 --- a/packages/extension/src/background/handlers/State.ts +++ b/packages/extension/src/background/handlers/State.ts @@ -8,7 +8,7 @@ import extension from 'extensionizer'; import { assert } from '@polkadot/util'; type AuthRequest = { - id: number, + id: string, idStr: string, request: MessageAuthorize, resolve: (result: boolean) => void, @@ -27,7 +27,7 @@ type AuthUrls = { }; type SignRequest = { - id: number, + id: string, request: MessageExtrinsicSign, resolve: (result: MessageExtrinsicSign$Response) => void, reject: (error: Error) => void, @@ -36,11 +36,15 @@ type SignRequest = { let idCounter = 0; +function getId (): string { + return `${Date.now()}.${++idCounter}`; +} + export default class State { // at the moment, we are keeping the list in memory - this should be persisted private _authUrls: AuthUrls = {}; - private _authRequests: { [index: number]: AuthRequest } = {}; - private _signRequests: { [index: number]: SignRequest } = {}; + private _authRequests: { [index: string]: AuthRequest } = {}; + private _signRequests: { [index: string]: SignRequest } = {}; get hasAuthRequests (): boolean { return this.numAuthRequests === 0; @@ -70,7 +74,7 @@ export default class State { .map(({ id, request, url }) => [id, request, url]); } - private authComplete = (id: number, fn: Function) => { + private authComplete = (id: string, fn: Function) => { return (result: boolean | Error): void => { const isAllowed = result === true; const { idStr, request: { origin }, url } = this._authRequests[id]; @@ -90,7 +94,7 @@ export default class State { }; } - private signComplete = (id: number, fn: Function) => { + private signComplete = (id: string, fn: Function) => { return (result: MessageExtrinsicSign$Response | Error): void => { delete this._signRequests[id]; this.updateIcon(); @@ -129,7 +133,7 @@ export default class State { } return new Promise((resolve, reject) => { - const id = ++idCounter; + const id = getId(); this._authRequests[id] = { id, @@ -153,16 +157,16 @@ export default class State { return true; } - getAuthRequest (id: number): AuthRequest { + getAuthRequest (id: string): AuthRequest { return this._authRequests[id]; } - getSignRequest (id: number): SignRequest { + getSignRequest (id: string): SignRequest { return this._signRequests[id]; } signQueue (url: string, request: MessageExtrinsicSign): Promise { - const id = ++idCounter; + const id = getId(); return new Promise((resolve, reject) => { this._signRequests[id] = { diff --git a/packages/extension/src/background/handlers/index.ts b/packages/extension/src/background/handlers/index.ts index 04c040a2..29f7d108 100644 --- a/packages/extension/src/background/handlers/index.ts +++ b/packages/extension/src/background/handlers/index.ts @@ -15,7 +15,7 @@ const state = new State(); const extension = new Extension(state); const tabs = new Tabs(state); -function createSubscription (id: number, port: chrome.runtime.Port): (data: any) => void { +function createSubscription (id: string, port: chrome.runtime.Port): (data: any) => void { // FIXME We are not handling actual unsubscribes yet, this is an issue return (subscription: any) => { port.postMessage({ id, subscription }); diff --git a/packages/extension/src/background/types.ts b/packages/extension/src/background/types.ts index 6561ea56..1f76c32d 100644 --- a/packages/extension/src/background/types.ts +++ b/packages/extension/src/background/types.ts @@ -6,31 +6,31 @@ import { KeypairType } from '@polkadot/util-crypto/types'; export type MessageTypes = 'authorize.approve' | 'authorize.reject' | 'authorize.requests' | 'authorize.tab' | 'accounts.create' | 'accounts.edit' | 'accounts.forget' | 'accounts.list' | 'accounts.subscribe' | 'extrinsic.sign' | 'seed.create' | 'seed.validate' | 'signing.approve' | 'signing.cancel' | 'signing.requests'; -export type AuthorizeRequest = [number, MessageAuthorize, string]; +export type AuthorizeRequest = [string, MessageAuthorize, string]; -export type SigningRequest = [number, MessageExtrinsicSign, string]; +export type SigningRequest = [string, MessageExtrinsicSign, string]; export type MessageAuthorize = { origin: string }; export type MessageAuthorizeApprove = { - id: number; + id: string; }; export type MessageAuthorizeReject = { - id: number; + id: string; }; export type MessageRequest = { - id: number, + id: string, message: MessageTypes, request: any }; export type MessageResponse = { error?: string, - id: number, + id: string, response?: any, subscription?: any }; @@ -52,12 +52,12 @@ export type MessageAccountForget = { }; export type MessageExtrinsicSignApprove = { - id: number, + id: string, password: string }; export type MessageExtrinsicSignCancel = { - id: number + id: string }; export type MessageExtrinsicSign = { @@ -69,7 +69,7 @@ export type MessageExtrinsicSign = { }; export type MessageExtrinsicSign$Response = { - id: number, + id: string, signature: string }; diff --git a/packages/extension/src/page/index.ts b/packages/extension/src/page/index.ts index 603a7ad3..9cd2149f 100644 --- a/packages/extension/src/page/index.ts +++ b/packages/extension/src/page/index.ts @@ -15,7 +15,7 @@ import Injected from './Injected'; // - resolves/rejects the promise with the result (or sub data) type Handlers = { - [index: number]: { + [index: string]: { resolve: (data: any) => void, reject: (error: Error) => void, subscriber?: (data: any) => void @@ -31,7 +31,7 @@ let idCounter = 0; // resolve once the event is resolved (by the response listener just below this) function sendMessage (message: MessageTypes, request: any = null, subscriber?: (data: any) => void): Promise { return new Promise((resolve, reject) => { - const id = ++idCounter; + const id = `${Date.now()}.${++idCounter}`; handlers[id] = { resolve, reject, subscriber };