1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Adding middleware to filter out duplicate requests from DAPP (#16730)

This commit is contained in:
Jyoti Puri 2022-12-02 21:08:12 +05:30 committed by GitHub
parent 31bd70de62
commit a5e70cbd71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 0 deletions

View File

@ -0,0 +1,23 @@
import log from 'loglevel';
/**
* Returns a middleware that filters out requests already seen
*
* @returns {Function}
*/
export default function createDupeReqFilterMiddleware() {
const processedRequestId = [];
return function filterDuplicateRequestMiddleware(
/** @type {any} */ req,
/** @type {any} */ _res,
/** @type {Function} */ next,
/** @type {Function} */ end,
) {
if (processedRequestId.indexOf(req.id) >= 0) {
log.info(`RPC request with id ${req.id} already seen.`);
return end();
}
processedRequestId.push(req.id);
return next();
};
}

View File

@ -0,0 +1,30 @@
import createDupeReqFilterMiddleware from './createDupeReqFilterMiddleware';
describe('createDupeReqFilterMiddleware', () => {
it('call function next if request is seen first time', () => {
const filterFn = createDupeReqFilterMiddleware();
const request = { id: 1 };
const nextMock = jest.fn();
const endMock = jest.fn();
filterFn(request, undefined, nextMock, endMock);
expect(nextMock).toBeCalledTimes(1);
expect(endMock).not.toBeCalled();
});
it('call function end if request is seen second time', () => {
const filterFn = createDupeReqFilterMiddleware();
const request = { id: 1 };
const nextMock = jest.fn();
const endMock = jest.fn();
filterFn(request, undefined, nextMock, endMock);
expect(nextMock).toBeCalledTimes(1);
expect(endMock).not.toBeCalled();
filterFn(request, undefined, nextMock, endMock);
expect(nextMock).toBeCalledTimes(1);
expect(endMock).toBeCalledTimes(1);
});
});

View File

@ -113,6 +113,7 @@ import {
} from './detect-multiple-instances';
import ComposableObservableStore from './lib/ComposableObservableStore';
import AccountTracker from './lib/account-tracker';
import createDupeReqFilterMiddleware from './lib/createDupeReqFilterMiddleware';
import createLoggerMiddleware from './lib/createLoggerMiddleware';
import {
createMethodMiddleware,
@ -3730,6 +3731,10 @@ export default class MetamaskController extends EventEmitter {
engine.emit('notification', message),
);
if (isManifestV3) {
engine.push(createDupeReqFilterMiddleware());
}
// append origin to each request
engine.push(createOriginMiddleware({ origin }));