diff --git a/src/js/matrix.js b/src/js/matrix.js index 4efadb8d..2017c695 100644 --- a/src/js/matrix.js +++ b/src/js/matrix.js @@ -82,9 +82,10 @@ var nameToStateMap = { }; var switchBitOffsets = { - 'matrix-off': 0, - 'https-strict': 2, - 'ua-spoof': 4 + 'matrix-off': 0, + 'https-strict': 2, + 'ua-spoof': 4, + 'referrer-spoof': 6 }; var switchStateToNameMap = { diff --git a/src/js/messaging-handlers.js b/src/js/messaging-handlers.js index a6560a69..72444696 100644 --- a/src/js/messaging-handlers.js +++ b/src/js/messaging-handlers.js @@ -462,6 +462,7 @@ var onMessage = function(request, sender, callback) { matrixSwitches: { 'https-strict': µm.pMatrix.evaluateSwitch('https-strict', '*') === 1, 'ua-spoof': µm.pMatrix.evaluateSwitch('ua-spoof', '*') === 1, + 'referrer-spoof': µm.pMatrix.evaluateSwitch('referrer-spoof', '*') === 1 } }; break; diff --git a/src/js/storage.js b/src/js/storage.js index dfe8943e..0414c314 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -404,19 +404,26 @@ var matrixReady = false; // TODO: to remove when everybody (and their backup file) has their - // ua-spoof setting converted into a matrix switch. + // ua-spoof/referrer-spoof setting converted into a matrix switch. var onSettingsAndMatrixReady = function() { if ( !settingsReady || !matrixReady ) { return; } - if ( µm.userSettings.hasOwnProperty('spoofUserAgent') === false ) { - return; - } + var saveMatrix = false; if ( µm.userSettings.spoofUserAgent ) { µm.tMatrix.setSwitch('ua-spoof', '*', 1); µm.pMatrix.setSwitch('ua-spoof', '*', 1); + saveMatrix = true; + } + if ( µm.userSettings.processReferer ) { + µm.tMatrix.setSwitch('referrer-spoof', '*', 1); + µm.pMatrix.setSwitch('referrer-spoof', '*', 1); + saveMatrix = true; + } + if ( saveMatrix ) { µm.saveMatrix(); } + delete µm.userSettings.processReferer; delete µm.userSettings.spoofUserAgent; µm.saveUserSettings(); }; diff --git a/src/js/traffic.js b/src/js/traffic.js index c0e27324..9707d235 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -467,13 +467,10 @@ var onBeforeSendHeadersHandler = function(details) { changed = foilCookieHeaders(µm, details) || changed; } - // TODO: use cookie cell to determine whether the referrer info must be - // foiled. - if ( µm.userSettings.processReferer && µm.mustBlock(pageStore.pageHostname, reqHostname, '*') ) { + if ( µm.tMatrix.evaluateSwitchZ('referrer-spoof', pageStore.pageHostname) ) { changed = foilRefererHeaders(µm, reqHostname, details) || changed; } - // TODO: move the master ua-spoofing switch into the matrix. if ( µm.tMatrix.evaluateSwitchZ('ua-spoof', pageStore.pageHostname) ) { changed = foilUserAgent(µm, details) || changed; // https://github.com/gorhill/httpswitchboard/issues/252 @@ -559,29 +556,29 @@ var foilCookieHeaders = function(µm, details) { var foilRefererHeaders = function(µm, toHostname, details) { var headers = details.requestHeaders; - var header; - var fromDomain, toDomain; - var i = headers.length; + var i = headers.length, header; while ( i-- ) { header = headers[i]; - if ( header.name.toLowerCase() !== 'referer' ) { - continue; - } - fromDomain = µm.URI.domainFromURI(header.value); - if ( !toDomain ) { - toDomain = µm.URI.domainFromHostname(toHostname); - } - if ( toDomain === fromDomain ) { - continue; + if ( header.name.toLowerCase() === 'referer' ) { + break; } - // console.debug('foilRefererHeaders()> foiled referer "%s" for "%s"', fromDomain, toDomain); - // https://github.com/gorhill/httpswitchboard/issues/222#issuecomment-44828402 - // Splicing instead of blanking: not sure how much it helps - headers.splice(i, 1); - µm.refererHeaderFoiledCounter++; - return true; } - return false; + if ( i === -1 ) { + return false; + } + var µmuri = µm.URI; + var fromDomain = µmuri.domainFromURI(header.value); + var toDomain = µmuri.domainFromHostname(toHostname); + if ( toDomain === fromDomain ) { + return false; + } + //console.debug('foilRefererHeaders()> foiled referer for "%s"', details.url); + //console.debug('\treferrer "%s"', header.value); + // https://github.com/gorhill/httpswitchboard/issues/222#issuecomment-44828402 + header.value = µmuri.schemeFromURI(details.url) + '://' + toHostname + '/'; + //console.debug('\treplaced with "%s"', header.value); + µm.refererHeaderFoiledCounter++; + return true; }; /******************************************************************************/ diff --git a/src/popup.html b/src/popup.html index c4a32014..9bbb34b3 100644 --- a/src/popup.html +++ b/src/popup.html @@ -35,6 +35,7 @@ diff --git a/src/privacy.html b/src/privacy.html index 6628d177..41ddf551 100644 --- a/src/privacy.html +++ b/src/privacy.html @@ -80,7 +80,7 @@
  • - +
  • diff --git a/tools/_locales/en/messages.json b/tools/_locales/en/messages.json index d9bcfffa..c3d8eb6f 100644 --- a/tools/_locales/en/messages.json +++ b/tools/_locales/en/messages.json @@ -115,6 +115,10 @@ "message": "User agent spoofing", "description": "" }, + "matrixSwitchReferrerSpoof" : { + "message": "Referrer spoofing", + "description": "" + }, "statsPageTitle" : { @@ -342,7 +346,7 @@ "description": "" }, "privacyProcessRefererPrompt" : { - "message": "Remove third-party HTTP referer information from requests to non-whitelisted hostnames.", + "message": "Spoof HTTP referrer string of third-party requests.", "description": "" }, "privacyProcessRefererHelp" : {