From e166b2691c55fa44a153bcad1f4b0f726505014b Mon Sep 17 00:00:00 2001 From: yan Date: Mon, 11 Sep 2017 23:12:35 +0000 Subject: [PATCH 1/2] apply brave UA whitelist to first-party subresources fix #10800 Test Plan: load adobe.com within Brave open the developer tools via "option + command + I" select the "Network" tab and reload adobe.com via "command + r" select on the first resource and you'll notice the correct Brave Chrome/60.0.3112.101 UA select another resource that's underneath the first one and is from Host:www.adobe.com the Brave UA should be there --- app/siteHacks.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/siteHacks.js b/app/siteHacks.js index 8ac709a1e4e..5de2315e709 100644 --- a/app/siteHacks.js +++ b/app/siteHacks.js @@ -17,19 +17,20 @@ module.exports.init = () => { } Filtering.registerBeforeSendHeadersFilteringCB((details, isPrivate) => { - if (details.resourceType !== 'mainFrame') { + const mainFrameUrl = Filtering.getMainFrameUrl(details) + if (!mainFrameUrl) { return { resourceName } } - // This filter only applies to top-level requests, so details.url == mainFrameUrl - let domain = urlParse(details.url).hostname.split('.').slice(-2).join('.') - let hack = siteHacks[domain] + const domain = urlParse(mainFrameUrl).hostname.split('.').slice(-2).join('.') + const hack = siteHacks[domain] let customCookie let requestHeaders let cancel - if (hack && hack.onBeforeSendHeaders) { + if (hack && hack.onBeforeSendHeaders && + domain === urlParse(details.url).hostname.split('.').slice(-2).join('.')) { const result = hack.onBeforeSendHeaders.call(this, details) if (result) { customCookie = result.customCookie From 25c94923b2392403b70622a4ffbe365c2f3cb93f Mon Sep 17 00:00:00 2001 From: Brian Clifton Date: Wed, 13 Sep 2017 17:08:16 -0700 Subject: [PATCH 2/2] Added unit test which ensures: - filtering.getMainFrameUrl is called (which also queries webcontents; no test for that yet) - hack considers subdomain Auditors: @diracdeltas . Auditors: Test Plan: --- test/unit/app/siteHacksTest.js | 123 +++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 test/unit/app/siteHacksTest.js diff --git a/test/unit/app/siteHacksTest.js b/test/unit/app/siteHacksTest.js new file mode 100644 index 00000000000..0cb667745e2 --- /dev/null +++ b/test/unit/app/siteHacksTest.js @@ -0,0 +1,123 @@ +/* global describe, before, after, it */ +const mockery = require('mockery') +const assert = require('assert') +const sinon = require('sinon') + +require('../braveUnit') + +describe('siteHacks unit tests', function () { + let siteHacks + let siteHacksData + let beforeSendCB + // let beforeRequestCB + let urlParse + let filtering + const fakeElectron = require('../lib/fakeElectron') + const fakeAdBlock = require('../lib/fakeAdBlock') + const fakeFiltering = { + getMainFrameUrl: (details) => { + return filtering.getMainFrameUrl(details) + }, + isResourceEnabled: (resourceName, url, isPrivate) => { + return true + }, + registerBeforeSendHeadersFilteringCB: (cb) => { + beforeSendCB = cb + }, + registerBeforeRequestFilteringCB: (cb) => { + // beforeRequestCB = cb + } + } + + before(function () { + mockery.enable({ + warnOnReplace: false, + warnOnUnregistered: false, + useCleanCache: true + }) + + mockery.registerMock('electron', fakeElectron) + mockery.registerMock('ad-block', fakeAdBlock) + urlParse = require('../../../app/common/urlParse') + mockery.registerMock('./common/urlParse', urlParse) + filtering = require('../../../app/filtering') + mockery.registerMock('./filtering', fakeFiltering) + siteHacksData = require('../../../js/data/siteHacks') + mockery.registerMock('../js/data/siteHacks', siteHacksData) + + siteHacks = require('../../../app/siteHacks') + }) + + after(function () { + mockery.disable() + }) + + describe('init', function () { + let beforeSendSpy + let beforeRequestSpy + + before(function () { + beforeSendSpy = sinon.spy(fakeFiltering, 'registerBeforeSendHeadersFilteringCB') + beforeRequestSpy = sinon.spy(fakeFiltering, 'registerBeforeRequestFilteringCB') + siteHacks.init() + }) + after(function () { + beforeSendSpy.restore() + beforeRequestSpy.restore() + }) + + it('calls Filtering.registerBeforeSendHeadersFilteringCB', function () { + assert.equal(beforeSendSpy.calledOnce, true) + }) + + describe('in the callback passed into registerBeforeSendHeadersFilteringCB', function () { + let getMainFrameUrlSpy + let onBeforeSendHeadersSpy + // let result + const details = { + resourceType: 'mainFrame', + requestHeaders: { + 'User-Agent': 'Brave Chrome/60.0.3112.101' + }, + url: 'https://subdomain.adobe.com', + tabId: 1 + } + before(function () { + getMainFrameUrlSpy = sinon.spy(fakeFiltering, 'getMainFrameUrl') + onBeforeSendHeadersSpy = sinon.spy(siteHacksData.siteHacks['adobe.com'], 'onBeforeSendHeaders') + + if (typeof beforeSendCB === 'function') { + // result = beforeSendCB(details) + beforeSendCB(details) + } + }) + after(function () { + getMainFrameUrlSpy.restore() + onBeforeSendHeadersSpy.restore() + }) + + it('calls Filtering.getMainFrameUrl', function () { + assert.equal(getMainFrameUrlSpy.calledOnce, true) + }) + + describe('when site hack is found for domain', function () { + it('calls hack.onBeforeSendHeaders', function () { + assert.equal(onBeforeSendHeadersSpy.calledOnce, true) + }) + }) + }) + + it('calls Filtering.registerBeforeRequestFilteringCB', function () { + assert.equal(beforeRequestSpy.calledOnce, true) + }) + + // describe('in the callback passed into registerBeforeRequestFilteringCB', function () { + // let result + // before(function () { + // if (typeof beforeRequestCB === 'function') { + // result = beforeRequestCB() + // } + // }) + // }) + }) +})