Skip to content

Commit

Permalink
Merge branch 'main' into feat/8795_remove_mixpanel
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasMassart authored Mar 5, 2024
2 parents 817afab + d669eb3 commit 3256f16
Show file tree
Hide file tree
Showing 11 changed files with 374 additions and 147 deletions.
12 changes: 9 additions & 3 deletions app/components/Views/Settings/AdvancedSettings/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,18 @@ class AdvancedSettings extends PureComponent {
// A not so great way to copy objects by value

try {
const data = generateStateLogs(fullState);
const stateLogsWithReleaseDetails = generateStateLogs({
...fullState,
appVersion,
buildNumber,
});

let url = `data:text/plain;base64,${new Buffer(data).toString('base64')}`;
let url = `data:text/plain;base64,${new Buffer(
stateLogsWithReleaseDetails,
).toString('base64')}`;
// // Android accepts attachements as BASE64
if (Device.isIos()) {
await RNFS.writeFile(path, data, 'utf8');
await RNFS.writeFile(path, stateLogsWithReleaseDetails, 'utf8');
url = path;
}

Expand Down
12 changes: 7 additions & 5 deletions app/core/Vault.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ import { getLedgerKeyring } from './Ledger/Ledger';
/**
* Restores the QR keyring if it exists.
*/
export const restoreQRKeyring = async () => {
export const restoreQRKeyring = async (qrKeyring) => {
const { KeyringController } = Engine.context;
const qrKeyring = (
await KeyringController.getKeyringsByType(KeyringTypes.qr)
)[0];

if (qrKeyring) {
try {
const serializedQRKeyring = await qrKeyring.serialize();
Expand Down Expand Up @@ -98,10 +96,14 @@ export const recreateVaultWithNewPassword = async (
const hdKeyring = KeyringController.state.keyrings[0];
const existingAccountCount = hdKeyring.accounts.length;

const qrKeyring = (
await KeyringController.getKeyringsByType(KeyringTypes.qr)
)[0];

// Recreate keyring with password given to this method
await KeyringController.createNewVaultAndRestore(newPassword, seedPhrase);

await restoreQRKeyring();
await restoreQRKeyring(qrKeyring);
await restoreLedgerKeyring();

// Create previous accounts again
Expand Down
26 changes: 10 additions & 16 deletions app/core/Vault.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import Engine from './Engine';
import Logger from '../util/Logger';
import { KeyringTypes } from '@metamask/keyring-controller';
import Engine from './Engine';

import { restoreQRKeyring, restoreLedgerKeyring } from './Vault';
import { getLedgerKeyring } from './Ledger/Ledger';
import { restoreLedgerKeyring, restoreQRKeyring } from './Vault';

jest.mock('./Engine', () => ({
context: {
Expand Down Expand Up @@ -36,11 +35,9 @@ describe('Vault', () => {
const mockQRKeyring = {
serialize: jest.fn().mockResolvedValue('serialized-keyring-data'),
};
KeyringController.getKeyringsByType.mockResolvedValue([mockQRKeyring]);
await restoreQRKeyring();
expect(KeyringController.getKeyringsByType).toHaveBeenCalledWith(
KeyringTypes.qr,
);

await restoreQRKeyring(mockQRKeyring);

expect(mockQRKeyring.serialize).toHaveBeenCalled();
expect(KeyringController.restoreQRKeyring).toHaveBeenCalledWith(
'serialized-keyring-data',
Expand All @@ -49,20 +46,17 @@ describe('Vault', () => {

it('should not restore QR keyring if it does not exist', async () => {
const { KeyringController } = Engine.context;
KeyringController.getKeyringsByType.mockResolvedValue([]);
await restoreQRKeyring();
expect(KeyringController.getKeyringsByType).toHaveBeenCalledWith(
KeyringTypes.qr,
);

await restoreQRKeyring([]);

expect(KeyringController.restoreQRKeyring).not.toHaveBeenCalled();
});

it('should log error if an exception is thrown', async () => {
const { KeyringController } = Engine.context;
const error = new Error('Test error');
const mockKeyring = { serialize: jest.fn().mockRejectedValue(error) };
KeyringController.getKeyringsByType.mockResolvedValue([mockKeyring]);
await restoreQRKeyring();

await restoreQRKeyring(mockKeyring);
expect(Logger.error).toHaveBeenCalledWith(
error,
'error while trying to get qr accounts on recreate vault',
Expand Down
46 changes: 46 additions & 0 deletions app/lib/ppom/ppom-util.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { normalizeTransactionParams } from '@metamask/transaction-controller';
import * as SignatureRequestActions from '../../actions/signatureRequest'; // eslint-disable-line import/no-namespace
import * as TransactionActions from '../../actions/transaction'; // eslint-disable-line import/no-namespace
import Engine from '../../core/Engine';
Expand Down Expand Up @@ -27,6 +28,11 @@ jest.mock('../../core/Engine', () => ({
},
}));

jest.mock('@metamask/transaction-controller', () => ({
...jest.requireActual('@metamask/transaction-controller'),
normalizeTransactionParams: jest.fn(),
}));

const mockRequest = {
id: 4247010338,
jsonrpc: '2.0',
Expand Down Expand Up @@ -59,9 +65,15 @@ const mockSignatureRequest = {
};

describe('validateResponse', () => {
const normalizeTransactionParamsMock = jest.mocked(
normalizeTransactionParams,
);

beforeEach(() => {
Engine.context.PreferencesController.state.securityAlertsEnabled = true;
Engine.context.NetworkController.state.providerConfig.chainId = '0x1';

normalizeTransactionParamsMock.mockImplementation((params) => params);
});

afterEach(() => {
Expand Down Expand Up @@ -137,4 +149,38 @@ describe('validateResponse', () => {
await PPOMUtil.validateRequest(mockSignatureRequest);
expect(spy).toBeCalledTimes(2);
});

it('normalizes transaction requests before validation', async () => {
const normalizedTransactionParamsMock = {
...mockRequest.params[0],
data: '0xabcd',
};

const validateMock = jest.fn();

const ppomMock = {
validateJsonRpc: validateMock,
};

Engine.context.PPOMController.usePPOM.mockImplementation((callback: any) =>
callback(ppomMock),
);

normalizeTransactionParamsMock.mockReturnValue(
normalizedTransactionParamsMock,
);

await PPOMUtil.validateRequest(mockRequest, '123');

expect(normalizeTransactionParamsMock).toBeCalledTimes(1);
expect(normalizeTransactionParamsMock).toBeCalledWith(
mockRequest.params[0],
);

expect(validateMock).toBeCalledTimes(1);
expect(validateMock).toBeCalledWith({
...mockRequest,
params: [normalizedTransactionParamsMock],
});
});
});
22 changes: 20 additions & 2 deletions app/lib/ppom/ppom-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ import { store } from '../../store';
import { isBlockaidFeatureEnabled } from '../../util/blockaid';
import Logger from '../../util/Logger';
import { updateSecurityAlertResponse } from '../../util/transaction-controller';
import { normalizeTransactionParams } from '@metamask/transaction-controller';

const TRANSACTION_METHOD = 'eth_sendTransaction';

const ConfirmationMethods = Object.freeze([
'eth_sendRawTransaction',
'eth_sendTransaction',
TRANSACTION_METHOD,
'eth_sign',
'eth_signTypedData',
'eth_signTypedData_v1',
Expand Down Expand Up @@ -71,8 +74,9 @@ const validateRequest = async (req: any, transactionId?: string) => {
setSignatureRequestSecurityAlertResponse(RequestInProgress),
);
}
const normalizedRequest = normalizeRequest(req);
securityAlertResponse = await ppomController.usePPOM((ppom: any) =>
ppom.validateJsonRpc(req),
ppom.validateJsonRpc(normalizedRequest),
);
securityAlertResponse = {
...securityAlertResponse,
Expand Down Expand Up @@ -110,4 +114,18 @@ const validateRequest = async (req: any, transactionId?: string) => {
return securityAlertResponse;
};

function normalizeRequest(request: any) {
if (request.method !== TRANSACTION_METHOD) {
return request;
}

const transactionParams = request.params?.[0] || {};
const normalizedParams = normalizeTransactionParams(transactionParams);

return {
...request,
params: [normalizedParams],
};
}

export default { validateRequest };
27 changes: 27 additions & 0 deletions app/util/logs/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,39 @@ describe('logs :: generateStateLogs', () => {
},
};
const logs = generateStateLogs(mockStateInput);

expect(logs.includes('NftController')).toBe(false);
expect(logs.includes('TokensController')).toBe(false);
expect(logs.includes('AssetsContractController')).toBe(false);
expect(logs.includes('TokenDetectionController')).toBe(false);
expect(logs.includes('NftDetectionController')).toBe(false);
expect(logs.includes('PhishingController')).toBe(false);
expect(logs.includes("vault: 'vault mock'")).toBe(false);
});

it('generates extra logs if values added to the state object parameter', () => {
const mockStateInput = {
appVersion: '1',
buildNumber: '123',
engine: {
backgroundState: {
...initialBackgroundState,
KeyringController: {
vault: 'vault mock',
},
},
},
};
const logs = generateStateLogs(mockStateInput);

expect(logs.includes('NftController')).toBe(false);
expect(logs.includes('TokensController')).toBe(false);
expect(logs.includes('AssetsContractController')).toBe(false);
expect(logs.includes('TokenDetectionController')).toBe(false);
expect(logs.includes('NftDetectionController')).toBe(false);
expect(logs.includes('PhishingController')).toBe(false);
expect(logs.includes("vault: 'vault mock'")).toBe(false);
expect(logs.includes('appVersion')).toBe(true);
expect(logs.includes('buildNumber')).toBe(true);
});
});
10 changes: 0 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,25 +107,15 @@
]
},
"resolutions": {
"minimatch": "5.1.0",
"**/json-schema": "^0.4.0",
"react-native-svg/**/nth-check": "^2.0.1",
"**/pac-resolver": "^5.0.0",
"**/ansi-regex": "^5.0.1",
"**/immer": "^9.0.6",
"**/node-fetch": "^2.6.7",
"**/lodash": "^4.17.21",
"**/ua-parser-js": "^0.7.33",
"**/y18n": "^3.2.2",
"**/xml2js": ">=0.5.0",
"react-native-level-fs/**/bl": "^1.2.3",
"react-native-level-fs/levelup/semver": "^5.7.2",
"@metamask/contract-metadata": "^2.1.0",
"@metamask/approval-controller": "3.4.0",
"@exodus/react-native-payments/validator": "^13.7.0",
"**/qs": "6.10.3",
"simple-get": "4.0.1",
"shell-quote": "1.7.3",
"**/plist": "3.0.5",
"**/minimist": "1.2.6",
"@metamask/**/cross-fetch": "2.2.6",
Expand Down
13 changes: 0 additions & 13 deletions patches/@metamask+base-controller+4.1.1.patch

This file was deleted.

102 changes: 88 additions & 14 deletions patches/@metamask+transaction-controller+6.1.0.patch

Large diffs are not rendered by default.

7 changes: 6 additions & 1 deletion scripts/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,12 @@ buildAndroidRunFlask(){

buildIosSimulator(){
prebuild_ios
react-native run-ios --port=$WATCHER_PORT
if [ -n "$IOS_SIMULATOR" ]; then
SIM_OPTION="--simulator \"$IOS_SIMULATOR\""
else
SIM_OPTION=""
fi
react-native run-ios --port=$WATCHER_PORT $SIM_OPTION
}

buildIosSimulatorQA(){
Expand Down
Loading

0 comments on commit 3256f16

Please sign in to comment.