Skip to content

Commit 4492c46

Browse files
committed
fix: fix for instance miss after auto-lock
1 parent fce994c commit 4492c46

File tree

9 files changed

+155
-151
lines changed

9 files changed

+155
-151
lines changed
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
export enum AlarmKey {
22
EXPIRED_PASSWORD = 'EXPIRED_PASSWORD',
33
WAKE_ALARM = 'WAKE_ALARM',
4-
WAKE_ALARM_DELAY_20S = 'WAKE_ALARM_DELAY_20S',
5-
WAKE_ALARM_DELAY_40S = 'WAKE_ALARM_DELAY_40S',
4+
WAKE_ALARM_DELAY_15S = 'WAKE_ALARM_DELAY_15S',
5+
WAKE_ALARM_DELAY_30S = 'WAKE_ALARM_DELAY_30S',
6+
WAKE_ALARM_DELAY_45S = 'WAKE_ALARM_DELAY_45S',
67
}
78

89
export const SCHEDULE_ALARMS: { key: string; periodInMinutes: number; delay: number }[] = [
910
{ key: AlarmKey.EXPIRED_PASSWORD, periodInMinutes: 1, delay: 0 },
1011
{ key: AlarmKey.WAKE_ALARM, periodInMinutes: 1, delay: 0 },
11-
{ key: AlarmKey.WAKE_ALARM_DELAY_20S, periodInMinutes: 1, delay: 20_000 },
12-
{ key: AlarmKey.WAKE_ALARM_DELAY_40S, periodInMinutes: 1, delay: 40_000 },
12+
{ key: AlarmKey.WAKE_ALARM_DELAY_15S, periodInMinutes: 1, delay: 15_000 },
13+
{ key: AlarmKey.WAKE_ALARM_DELAY_30S, periodInMinutes: 1, delay: 30_000 },
14+
{ key: AlarmKey.WAKE_ALARM_DELAY_45S, periodInMinutes: 1, delay: 45_000 },
1315
];
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { WalletResponseFailureType } from '@adena-wallet/sdk';
2+
import { isBech32Address } from '@common/utils/string-utils';
3+
import { InjectionMessage, InjectionMessageInstance } from '@inject/message';
4+
5+
export const validateInjectionData = (requestData: InjectionMessage): InjectionMessage | null => {
6+
if (!validateInjectionTransactionType(requestData)) {
7+
return InjectionMessageInstance.failure(
8+
WalletResponseFailureType.UNSUPPORTED_TYPE,
9+
{},
10+
requestData?.key,
11+
);
12+
}
13+
if (!validateInjectionTransactionMessage(requestData)) {
14+
return InjectionMessageInstance.failure(
15+
WalletResponseFailureType.ACCOUNT_MISMATCH,
16+
{},
17+
requestData?.key,
18+
);
19+
}
20+
return null;
21+
};
22+
23+
export const validateInjectionDataWithAddress = (
24+
requestData: InjectionMessage,
25+
address: string,
26+
): InjectionMessage | null => {
27+
if (!validateInjectionTransactionType(requestData)) {
28+
return InjectionMessageInstance.failure(
29+
WalletResponseFailureType.UNSUPPORTED_TYPE,
30+
{},
31+
requestData?.key,
32+
);
33+
}
34+
35+
if (!validateInjectionTransactionMessageWithAddress(requestData, address)) {
36+
return InjectionMessageInstance.failure(
37+
WalletResponseFailureType.ACCOUNT_MISMATCH,
38+
{},
39+
requestData?.key,
40+
);
41+
}
42+
43+
return null;
44+
};
45+
46+
export const validateInjectionTransactionType = (requestData: InjectionMessage): any => {
47+
const messageTypes = ['/bank.MsgSend', '/vm.m_call', '/vm.m_addpkg', '/vm.m_run'];
48+
return requestData.data?.messages.every((message: any) => messageTypes.includes(message?.type));
49+
};
50+
51+
export const validateInjectionTransactionMessage = (requestData: InjectionMessage): boolean => {
52+
const messages = requestData.data?.messages;
53+
for (const message of messages) {
54+
let address = '';
55+
switch (message?.type) {
56+
case '/bank.MsgSend':
57+
address = message.value.from_address;
58+
break;
59+
case '/vm.m_call':
60+
address = message.value.caller;
61+
break;
62+
case '/vm.m_addpkg':
63+
address = message.value.creator;
64+
break;
65+
case '/vm.m_run':
66+
address = message.value.caller;
67+
break;
68+
default:
69+
break;
70+
}
71+
72+
if (!isBech32Address(address)) {
73+
return false;
74+
}
75+
}
76+
return true;
77+
};
78+
79+
export const validateInjectionTransactionMessageWithAddress = (
80+
requestData: InjectionMessage,
81+
address: string,
82+
): boolean => {
83+
const messages = requestData.data?.messages;
84+
for (const message of messages) {
85+
let messageAddress = '';
86+
switch (message?.type) {
87+
case '/bank.MsgSend':
88+
messageAddress = message.value.from_address;
89+
break;
90+
case '/vm.m_call':
91+
messageAddress = message.value.caller;
92+
break;
93+
case '/vm.m_addpkg':
94+
messageAddress = message.value.creator;
95+
break;
96+
case '/vm.m_run':
97+
messageAddress = message.value.caller;
98+
break;
99+
default:
100+
break;
101+
}
102+
103+
if (messageAddress !== address) {
104+
return false;
105+
}
106+
}
107+
return true;
108+
};

packages/adena-extension/src/inject/message/commands/encrypt.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,20 @@ const KEY_LENGTH = 256; // AES-256 key length
66
const IV_LENGTH = 12; // GCM nonce length (12 bytes is recommended)
77

88
export async function getInMemoryKey(memoryProvider: MemoryProvider): Promise<CryptoKey | null> {
9-
const key = memoryProvider?.get(MEMORY_KEY) || null;
10-
if (!key) {
11-
const generated = await generateInMemoryKey();
12-
memoryProvider.set(MEMORY_KEY, generated);
9+
try {
10+
const key = memoryProvider?.get(MEMORY_KEY) || null;
11+
if (!key) {
12+
const generated = await generateInMemoryKey();
13+
14+
memoryProvider.set(MEMORY_KEY, generated);
15+
}
16+
17+
return memoryProvider.get(MEMORY_KEY) || null;
18+
} catch (e) {
19+
console.error(e);
1320
}
1421

15-
return memoryProvider.get(MEMORY_KEY) || null;
22+
return null;
1623
}
1724

1825
export async function clearInMemoryKey(memoryProvider: MemoryProvider): Promise<void> {

packages/adena-extension/src/inject/message/message-handler.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export class MessageHandler {
7171
case 'DO_CONTRACT':
7272
HandlerMethod.checkEstablished(core, message, sendResponse).then((isEstablished) => {
7373
if (isEstablished) {
74-
HandlerMethod.doContract(core, message, sendResponse);
74+
HandlerMethod.doContract(message, sendResponse);
7575
}
7676
});
7777
break;
@@ -139,14 +139,14 @@ export class MessageHandler {
139139
case 'SIGN_AMINO':
140140
HandlerMethod.checkEstablished(core, message, sendResponse).then((isEstablished) => {
141141
if (isEstablished) {
142-
HandlerMethod.signAmino(core, message, sendResponse);
142+
HandlerMethod.signAmino(message, sendResponse);
143143
}
144144
});
145145
break;
146146
case 'SIGN_TX':
147147
HandlerMethod.checkEstablished(core, message, sendResponse).then((isEstablished) => {
148148
if (isEstablished) {
149-
HandlerMethod.signTransaction(core, message, sendResponse);
149+
HandlerMethod.signTransaction(message, sendResponse);
150150
}
151151
});
152152
break;

packages/adena-extension/src/inject/message/methods/core.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ export class InjectCore {
129129
}
130130

131131
public async isLockedBy(inMemoryKey: CryptoKey | null): Promise<boolean> {
132-
return this.getPasswordBy(inMemoryKey).then((password) => !password);
132+
return this.getPasswordBy(inMemoryKey)
133+
.then((password) => !password)
134+
.catch(() => true);
133135
}
134136

135137
private async getPasswordBy(inMemoryKey: CryptoKey | null): Promise<string | null> {
Lines changed: 14 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
1-
import { WalletResponseFailureType, WalletResponseRejectType } from '@adena-wallet/sdk';
1+
import { WalletResponseRejectType } from '@adena-wallet/sdk';
2+
import { validateInjectionData } from '@common/validation/validation-transaction';
23
import { RoutePath } from '@types';
34
import { HandlerMethod } from '..';
45
import { InjectionMessage, InjectionMessageInstance } from '../message';
5-
import { InjectCore } from './core';
66

77
export const signAmino = async (
8-
core: InjectCore,
98
requestData: InjectionMessage,
109
sendResponse: (message: any) => void,
1110
): Promise<void> => {
12-
const inMemoryKey = await core.getInMemoryKey();
13-
14-
const isLocked = await core.isLockedBy(inMemoryKey);
15-
if (isLocked) {
16-
const address = await core.getCurrentAddress(inMemoryKey);
17-
const validationMessage = validateInjectionData(address, requestData);
18-
if (validationMessage) {
19-
sendResponse(validationMessage);
20-
return;
21-
}
11+
const validationMessage = validateInjectionData(requestData);
12+
if (validationMessage) {
13+
sendResponse(validationMessage);
14+
return;
2215
}
2316

2417
HandlerMethod.createPopup(
@@ -30,20 +23,13 @@ export const signAmino = async (
3023
};
3124

3225
export const signTransaction = async (
33-
core: InjectCore,
3426
requestData: InjectionMessage,
3527
sendResponse: (message: any) => void,
3628
): Promise<void> => {
37-
const inMemoryKey = await core.getInMemoryKey();
38-
39-
const isLocked = await core.isLockedBy(inMemoryKey);
40-
if (isLocked) {
41-
const address = await core.getCurrentAddress(inMemoryKey);
42-
const validationMessage = validateInjectionData(address, requestData);
43-
if (validationMessage) {
44-
sendResponse(validationMessage);
45-
return;
46-
}
29+
const validationMessage = validateInjectionData(requestData);
30+
if (validationMessage) {
31+
sendResponse(validationMessage);
32+
return;
4733
}
4834

4935
HandlerMethod.createPopup(
@@ -55,20 +41,13 @@ export const signTransaction = async (
5541
};
5642

5743
export const doContract = async (
58-
core: InjectCore,
5944
requestData: InjectionMessage,
6045
sendResponse: (message: any) => void,
6146
): Promise<void> => {
62-
const inMemoryKey = await core.getInMemoryKey();
63-
64-
const isLocked = await core.isLockedBy(inMemoryKey);
65-
if (isLocked) {
66-
const address = await core.getCurrentAddress(inMemoryKey);
67-
const validationMessage = validateInjectionData(address, requestData);
68-
if (validationMessage) {
69-
sendResponse(validationMessage);
70-
return;
71-
}
47+
const validationMessage = validateInjectionData(requestData);
48+
if (validationMessage) {
49+
sendResponse(validationMessage);
50+
return;
7251
}
7352

7453
HandlerMethod.createPopup(
@@ -82,97 +61,3 @@ export const doContract = async (
8261
sendResponse,
8362
);
8463
};
85-
86-
export const validateInjectionData = (
87-
address: string | null,
88-
requestData: InjectionMessage,
89-
): InjectionMessage | null => {
90-
if (!address) {
91-
return InjectionMessageInstance.failure(
92-
WalletResponseFailureType.NO_ACCOUNT,
93-
{},
94-
requestData.key,
95-
);
96-
}
97-
if (!validateInjectionAddress(address)) {
98-
return InjectionMessageInstance.failure(
99-
WalletResponseFailureType.NO_ACCOUNT,
100-
{},
101-
requestData.key,
102-
);
103-
}
104-
if (!validateInjectionTransactionType(requestData)) {
105-
return InjectionMessageInstance.failure(
106-
WalletResponseFailureType.UNSUPPORTED_TYPE,
107-
{},
108-
requestData?.key,
109-
);
110-
}
111-
if (!validateInjectionTransactionMessage(address, requestData)) {
112-
return InjectionMessageInstance.failure(
113-
WalletResponseFailureType.ACCOUNT_MISMATCH,
114-
{},
115-
requestData?.key,
116-
);
117-
}
118-
return null;
119-
};
120-
121-
export const validateInjectionAddress = (currentAccountAddress: string): boolean => {
122-
if (!currentAccountAddress || currentAccountAddress === '') {
123-
return false;
124-
}
125-
126-
return true;
127-
};
128-
129-
export const validateInjectionTransactionType = (requestData: InjectionMessage): any => {
130-
const messageTypes = ['/bank.MsgSend', '/vm.m_call', '/vm.m_addpkg', '/vm.m_run'];
131-
return requestData.data?.messages.every((message: any) => messageTypes.includes(message?.type));
132-
};
133-
134-
export const validateInjectionTransactionMessage = (
135-
currentAccountAddress: string,
136-
requestData: InjectionMessage,
137-
): boolean => {
138-
const messages = requestData.data?.messages;
139-
for (const message of messages) {
140-
switch (message?.type) {
141-
case '/bank.MsgSend':
142-
if (currentAccountAddress !== message.value.from_address) {
143-
return false;
144-
}
145-
break;
146-
case '/vm.m_call':
147-
if (message.value.caller === '') {
148-
message.value.caller = currentAccountAddress;
149-
}
150-
151-
if (currentAccountAddress !== message.value.caller) {
152-
return false;
153-
}
154-
break;
155-
case '/vm.m_addpkg':
156-
if (message.value.creator === '') {
157-
message.value.creator = currentAccountAddress;
158-
}
159-
160-
if (currentAccountAddress !== message.value.creator) {
161-
return false;
162-
}
163-
break;
164-
case '/vm.m_run':
165-
if (message.value.caller === '') {
166-
message.value.caller = currentAccountAddress;
167-
}
168-
169-
if (currentAccountAddress !== message.value.caller) {
170-
return false;
171-
}
172-
break;
173-
default:
174-
break;
175-
}
176-
}
177-
return true;
178-
};

packages/adena-extension/src/pages/popup/wallet/approve-sign-transaction/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
decodeParameter,
1717
parseParameters,
1818
} from '@common/utils/client-utils';
19+
import { validateInjectionDataWithAddress } from '@common/validation/validation-transaction';
1920
import { ApproveTransaction } from '@components/molecules';
2021
import { defaultAddressPrefix } from '@gnolang/tm2-js-client';
2122
import useAppNavigate from '@hooks/use-app-navigate';
@@ -26,7 +27,6 @@ import { useNetwork } from '@hooks/use-network';
2627
import { useGetGnotBalance } from '@hooks/wallet/use-get-gnot-balance';
2728
import { useNetworkFee } from '@hooks/wallet/use-network-fee';
2829
import { InjectionMessage, InjectionMessageInstance } from '@inject/message';
29-
import { validateInjectionData } from '@inject/message/methods';
3030
import { GnoArgumentInfo } from '@inject/message/methods/gno-connect';
3131
import { ContractMessage } from '@inject/types';
3232
import { RoutePath } from '@types';
@@ -184,9 +184,9 @@ const ApproveSignTransactionContainer: React.FC = () => {
184184
currentAccount: Account,
185185
requestData: InjectionMessage,
186186
): Promise<boolean> => {
187-
const validationMessage = validateInjectionData(
188-
await currentAccount.getAddress(defaultAddressPrefix),
187+
const validationMessage = validateInjectionDataWithAddress(
189188
requestData,
189+
await currentAccount.getAddress(defaultAddressPrefix),
190190
);
191191
if (validationMessage) {
192192
chrome.runtime.sendMessage(validationMessage);

0 commit comments

Comments
 (0)