| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-2015 Eyeo GmbH | 3  * Copyright (C) 2006-2015 Eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 12  * GNU General Public License for more details. | 12  * GNU General Public License for more details. | 
| 13  * | 13  * | 
| 14  * You should have received a copy of the GNU General Public License | 14  * You should have received a copy of the GNU General Public License | 
| 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| 16  */ | 16  */ | 
| 17 | 17 | 
| 18 let {defaultMatcher} = require("matcher"); | 18 let {defaultMatcher} = require("matcher"); | 
| 19 let {WhitelistFilter} = require("filterClasses"); | 19 let {WhitelistFilter} = require("filterClasses"); | 
|  | 20 let {stringifyURL, getDecodedHostname, extractHostFromFrame, isThirdParty} = req
     uire("url"); | 
| 20 | 21 | 
| 21 let pagesWithKey = new ext.PageMap(); | 22 let pagesWithKey = new ext.PageMap(); | 
| 22 | 23 | 
| 23 function isWhitelisted(url, parentUrl, type, key) | 24 function isPageWhitelisted(page) | 
| 24 { | 25 { | 
|  | 26   let url = page.url; | 
| 25   let filter = defaultMatcher.matchesAny( | 27   let filter = defaultMatcher.matchesAny( | 
| 26     stripFragmentFromURL(url), | 28     stringifyURL(url), "DOCUMENT", | 
| 27     type || "DOCUMENT", | 29     getDecodedHostname(url), false, null | 
| 28     extractHostFromURL(parentUrl || url), |  | 
| 29     false, |  | 
| 30     key |  | 
| 31   ); | 30   ); | 
| 32 | 31 | 
| 33   return (filter instanceof WhitelistFilter ? filter : null); | 32   return (filter instanceof WhitelistFilter ? filter : null); | 
| 34 } | 33 } | 
| 35 exports.isWhitelisted = isWhitelisted; | 34 exports.isPageWhitelisted = isPageWhitelisted; | 
| 36 | 35 | 
| 37 function isFrameWhitelisted(page, frame, type) | 36 function isFrameWhitelisted(page, frame, type) | 
| 38 { | 37 { | 
| 39   for (; frame != null; frame = frame.parent) | 38   while (frame) | 
| 40   { | 39   { | 
| 41     let key = getKey(page, frame); | 40     let parent = frame.parent; | 
| 42     if (isWhitelisted(frame.url, (frame.parent || {}).url, type, key)) | 41     let url = frame.url; | 
|  | 42     let documentHost = extractHostFromFrame(parent) || getDecodedHostname(url); | 
|  | 43 | 
|  | 44     let filter = defaultMatcher.matchesAny( | 
|  | 45       stringifyURL(url), type || "DOCUMENT", | 
|  | 46       documentHost, isThirdParty(url, documentHost), | 
|  | 47       getKey(page, frame) | 
|  | 48     ); | 
|  | 49 | 
|  | 50     if (filter instanceof WhitelistFilter) | 
| 43       return true; | 51       return true; | 
|  | 52 | 
|  | 53     frame = parent; | 
| 44   } | 54   } | 
| 45 | 55 | 
| 46   return false; | 56   return false; | 
| 47 } | 57 } | 
| 48 exports.isFrameWhitelisted = isFrameWhitelisted; | 58 exports.isFrameWhitelisted = isFrameWhitelisted; | 
| 49 | 59 | 
| 50 function getKey(page, frame) | 60 function getKey(page, frame) | 
| 51 { | 61 { | 
| 52   let urlsWithKey = pagesWithKey.get(page); | 62   let urlsWithKey = pagesWithKey.get(page); | 
| 53   if (!urlsWithKey) | 63   if (!urlsWithKey) | 
| 54     return null; | 64     return null; | 
| 55 | 65 | 
| 56   for (; frame != null; frame = frame.parent) | 66   for (; frame != null; frame = frame.parent) | 
| 57   { | 67   { | 
| 58     if (urlsWithKey[frame.url]) | 68     let key = urlsWithKey[stringifyURL(frame.url)]; | 
| 59       return urlsWithKey[frame.url]; | 69     if (key) | 
|  | 70       return key; | 
| 60   } | 71   } | 
| 61 | 72 | 
| 62   return null; | 73   return null; | 
| 63 } | 74 } | 
| 64 exports.getKey = getKey; | 75 exports.getKey = getKey; | 
| 65 | 76 | 
| 66 function verifyKey(key, signature, url) | 77 function verifyKey(key, signature, url) | 
| 67 { | 78 { | 
| 68   url = new URL(url); |  | 
| 69   let params = [ | 79   let params = [ | 
| 70     url.pathname + url.search, // REQUEST_URI | 80     url.pathname + url.search, // REQUEST_URI | 
| 71     url.host,                  // HTTP_HOST | 81     url.host,                  // HTTP_HOST | 
| 72     window.navigator.userAgent // HTTP_USER_AGENT | 82     window.navigator.userAgent // HTTP_USER_AGENT | 
| 73   ]; | 83   ]; | 
| 74 | 84 | 
| 75   return verifySignature(key, signature, params.join("\0")); | 85   return verifySignature(key, signature, params.join("\0")); | 
| 76 } | 86 } | 
| 77 | 87 | 
| 78 function recordKey(page, url, key) | 88 function recordKey(page, url, key) | 
| 79 { | 89 { | 
| 80   let urlsWithKey = pagesWithKey.get(page); | 90   let urlsWithKey = pagesWithKey.get(page); | 
| 81 | 91 | 
| 82   if (!urlsWithKey) | 92   if (!urlsWithKey) | 
| 83   { | 93   { | 
| 84     urlsWithKey = Object.create(null); | 94     urlsWithKey = Object.create(null); | 
| 85     pagesWithKey.set(page, urlsWithKey); | 95     pagesWithKey.set(page, urlsWithKey); | 
| 86   } | 96   } | 
| 87 | 97 | 
| 88   urlsWithKey[url] = key; | 98   urlsWithKey[stringifyURL(url)] = key; | 
| 89 } | 99 } | 
| 90 | 100 | 
| 91 function processKey(token, page, frame) | 101 function processKey(token, page, frame) | 
| 92 { | 102 { | 
| 93   let url = stripFragmentFromURL(frame.url); |  | 
| 94 |  | 
| 95   if (token.indexOf("_") < 0) | 103   if (token.indexOf("_") < 0) | 
| 96     return; | 104     return; | 
| 97 | 105 | 
| 98   let [key, signature] = token.split("_", 2); | 106   let [key, signature] = token.split("_", 2); | 
| 99   key = key.replace(/=/g, ""); | 107   key = key.replace(/=/g, ""); | 
| 100 | 108 | 
| 101   if (verifyKey(key, signature, url)) | 109   if (verifyKey(key, signature, frame.url)) | 
| 102     recordKey(page, url, key); | 110     recordKey(page, frame.url, key); | 
| 103 } | 111 } | 
| 104 exports.processKey = processKey; | 112 exports.processKey = processKey; | 
| OLD | NEW | 
|---|