Skip to content

Commit

Permalink
fix: ignoring browser extension traffic
Browse files Browse the repository at this point in the history
  • Loading branch information
gabidobo authored and andreimarinescu committed Sep 6, 2022
1 parent f9e9b21 commit 24196bd
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 27 deletions.
2 changes: 1 addition & 1 deletion dist/index.js

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions src/index.js
Expand Up @@ -10,10 +10,9 @@ import {
addTrustedModules,
getCurrentModuleInfo,
setAllowsAll,
setIgnoreExtensions,
setPermissions,
} from './module';
import patch, {SandwormError} from './patch';
import patch, {SandwormError, setIgnoreExtensions} from './patch';

let initialized = false;
let ready = false;
Expand Down
20 changes: 8 additions & 12 deletions src/module.js
Expand Up @@ -5,7 +5,7 @@ const cachedPermissions = {};
const defaultPermissions = {module: 'root', permissions: true};
let permissions = [defaultPermissions];
let trustedModules = ['sandworm', 'react-dom', 'scheduler'];
let ignoreExtensions = true;

const sourcemaps = {};

export const addSourceMap = (file, map) => {
Expand All @@ -16,10 +16,6 @@ export const addTrustedModules = (additionalTrustedModules) => {
trustedModules = [...trustedModules, ...additionalTrustedModules];
};

export const setIgnoreExtensions = (ignoreExtensionsOption) => {
ignoreExtensions = !!ignoreExtensionsOption;
};

export const setPermissions = (newPermissions = []) => {
if (!Array.isArray(newPermissions)) {
return;
Expand Down Expand Up @@ -143,21 +139,21 @@ export const getCurrentModuleInfo = ({stack: stackInput, allowURLs = false} = {}
)
.filter((v) => v !== undefined);
let name = 'root';
let isExtension = false;

if (modules.length) {
if (
ignoreExtensions &&
(modules[0].startsWith('chrome-extension://') || modules[0].startsWith('moz-extension://'))
) {
name = 'root';
} else if (modules[0] === modules[modules.length - 1]) {
if (modules[0] === modules[modules.length - 1]) {
[name] = modules;
} else {
name = modules.filter((v, i, a) => a.indexOf(v) === i).join('>');
}

isExtension = !!modules.find(
(m) => m.startsWith('chrome-extension://') || m.startsWith('moz-extension://'),
);
}

return {name, stack, directCaller, lastModuleCaller};
return {name, stack, directCaller, lastModuleCaller, isExtension};
} catch (error) {
logger.error(error);
return {name: 'root', error: error.message};
Expand Down
12 changes: 10 additions & 2 deletions src/patch.js
@@ -1,6 +1,12 @@
import logger from './logger';
import {getCurrentModuleInfo, isModuleAllowedToExecute} from './module';

let ignoreExtensions = true;

export const setIgnoreExtensions = (ignoreExtensionsOption) => {
ignoreExtensions = !!ignoreExtensionsOption;
};

export class SandwormError extends Error {
constructor(message) {
super(message);
Expand All @@ -22,14 +28,16 @@ const buildPatch = (family, method, track = () => {}) =>
stack,
directCaller,
lastModuleCaller,
isExtension,
error,
} = getCurrentModuleInfo({
allowURLs: true,
});

if (
typeof method.minArgsToTrigger === 'number' &&
(args?.length || 0) < method.minArgsToTrigger
(typeof method.minArgsToTrigger === 'number' &&
(args?.length || 0) < method.minArgsToTrigger) ||
(ignoreExtensions && isExtension)
) {
allowed = true;
} else {
Expand Down
13 changes: 4 additions & 9 deletions tests/unit/module.test.js
Expand Up @@ -10,7 +10,6 @@ import {
isModuleAllowedToExecute,
mapStackItemToSource,
setAllowsAll,
setIgnoreExtensions,
setPermissions,
} from '../../src/module';

Expand Down Expand Up @@ -294,7 +293,6 @@ describe('module', () => {
}).name,
).toBe('module-name>other');

// Ignore extensions by default
expect(
getCurrentModuleInfo({
stack: [
Expand All @@ -305,22 +303,19 @@ describe('module', () => {
],
allowURLs: true,
}).name,
).toBe('root');
).toBe('chrome-extension://214324234523/test.js>module-name>other');

// Allow extensions
setIgnoreExtensions(false);
expect(
getCurrentModuleInfo({
stack: [
{file: 'project/node_modules/other/root.js', line: 1, column: 1},
{file: 'app.js', line: 1, column: 1},
{file: 'moz-extension://214324234523/test.js', line: 1, column: 1},
{file: 'project/node_modules/module-name/dist/index.js', line: 1, column: 1},
{file: 'chrome-extension://214324234523/test.js', line: 1, column: 1},
],
allowURLs: true,
}).name,
).toBe('chrome-extension://214324234523/test.js>module-name>other');
setIgnoreExtensions(true);
}).isExtension,
).toBeTruthy();

// Ignore URLs by default
expect(
Expand Down
33 changes: 32 additions & 1 deletion tests/unit/patch.test.js
@@ -1,5 +1,5 @@
const moduleLib = require('../../src/module');
const {default: patch, SandwormError} = require('../../src/patch');
const {default: patch, SandwormError, setIgnoreExtensions} = require('../../src/patch');

const getCurrentModuleInfoMock = jest.fn(() => ({
name: 'root',
Expand Down Expand Up @@ -100,4 +100,35 @@ describe('patch', () => {

expect(() => mod.testArgsLimit(1, 2)).toThrowError(SandwormError);
});

test('ignore extensions', () => {
moduleLib.getCurrentModuleInfo = jest.fn(() => ({
name: 'chrome-extension://aaa/test.js>one>two',
stack: [],
isExtension: true,
}));

mod.test(1);
expect(moduleLib.getCurrentModuleInfo).toBeCalledTimes(1);
expect(moduleLib.isModuleAllowedToExecute).not.toBeCalled();
expect(originalTest).toBeCalledTimes(1);

moduleLib.getCurrentModuleInfo = jest.fn(() => ({
name: 'module>moz-extension://aaa/test.js>another',
stack: [],
isExtension: true,
}));

mod.test(1);
expect(moduleLib.getCurrentModuleInfo).toBeCalledTimes(1);
expect(moduleLib.isModuleAllowedToExecute).not.toBeCalled();
expect(originalTest).toBeCalledTimes(2);

setIgnoreExtensions(false);
mod.test(1);
expect(moduleLib.getCurrentModuleInfo).toBeCalledTimes(2);
expect(moduleLib.isModuleAllowedToExecute).toBeCalledTimes(1);
expect(originalTest).toBeCalledTimes(3);
setIgnoreExtensions(true);
});
});

0 comments on commit 24196bd

Please sign in to comment.