about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorSimonBrazell <simon@brazell.com.au>2020-06-08 11:50:12 +1000
committerSimonBrazell <simon@brazell.com.au>2020-06-08 11:50:12 +1000
commit0892d0c30ac973b2f01eb678af88f4dd0fc8531b (patch)
tree065a12c57c0aedc09636fef49e4f9801ae1fb776
parentCloses #38, fixes #61, closes #64 (diff)
downloadlibredirect-0892d0c30ac973b2f01eb678af88f4dd0fc8531b.zip
Closes #64, closes #38 - Fix whitelist & Twitter `/home` exception
-rw-r--r--README.md2
-rw-r--r--assets/remove-twitter-sw.js21
-rw-r--r--background.js25
-rw-r--r--manifest.json2
-rw-r--r--pages/styles.css2
5 files changed, 35 insertions, 17 deletions
diff --git a/README.md b/README.md
index 2bb6c3a1..e5ee60f5 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ Allows for setting custom [Nitter](https://github.com/zedeus/nitter/wiki/Instanc
 ## Build
 
 1.  `npm install --global web-ext`
-2.  `web-ext build`
+2.  `web-ext build --overwrite-dest`
 3.  See `web-ext-artifacts/` for outputs.
 
 ## License
diff --git a/assets/remove-twitter-sw.js b/assets/remove-twitter-sw.js
index 37200f1a..d1b30637 100644
--- a/assets/remove-twitter-sw.js
+++ b/assets/remove-twitter-sw.js
@@ -4,9 +4,23 @@ const nitterDefault = 'https://nitter.net';
 
 let disableNitter;
 let nitterInstance;
+let redirectBypassFlag;
+let whitelist;
 
 window.browser = window.browser || window.chrome;
 
+function isNotWhitelisted(url) {
+  return !whitelist.some(regex => (regex.test(url.href)));
+}
+
+function shouldRedirect(url) {
+  return !redirectBypassFlag &&
+    isNotWhitelisted(url) &&
+    !disableNitter &&
+    url.host !== nitterInstance &&
+    !url.pathname.includes('/home');
+}
+
 function redirectTwitter(url) {
   if (url.host.split('.')[0] === 'pbs') {
     return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`;
@@ -20,13 +34,16 @@ function redirectTwitter(url) {
 browser.storage.sync.get(
   ['nitterInstance', 'disableNitter', 'removeTwitterSW', 'redirectBypassFlag'],
   (result) => {
-    const redirectBypassFlag = result.redirectBypassFlag;
+    redirectBypassFlag = result.redirectBypassFlag;
     browser.storage.sync.set({
       redirectBypassFlag: false
     });
     if (!result.removeTwitterSW) {
       disableNitter = result.disableNitter;
       nitterInstance = result.nitterInstance || nitterDefault;
+      whitelist = result.whitelist ? result.whitelist.map(e => {
+        return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
+      }) : [];
       navigator.serviceWorker.getRegistrations().then(registrations => {
         for (let registration of registrations) {
           if (registration.scope === 'https://twitter.com/') {
@@ -36,7 +53,7 @@ browser.storage.sync.get(
         }
       });
       const url = new URL(window.location);
-      if (!redirectBypassFlag && !disableNitter && url.host !== nitterInstance && !url.pathname.includes('/home')) {
+      if (shouldRedirect()) {
         const redirect = redirectTwitter(url);
         console.info(
           'Redirecting', `"${url.href}"`, '=>', `"${redirect}"`
diff --git a/background.js b/background.js
index f3a50cf6..5810f42a 100644
--- a/background.js
+++ b/background.js
@@ -86,7 +86,6 @@ let onlyEmbeddedVideo;
 let videoQuality;
 let invidiousDarkMode;
 let whitelist;
-let redirectBypassFlag;
 
 window.browser = window.browser || window.chrome;
 
@@ -119,7 +118,9 @@ browser.storage.sync.get(
     onlyEmbeddedVideo = result.onlyEmbeddedVideo;
     videoQuality = result.videoQuality;
     invidiousDarkMode = result.invidiousDarkMode;
-    whitelist = result.whitelist ? result.whitelist.map(e => new RegExp(e)) : [];
+    whitelist = result.whitelist ? result.whitelist.map(e => {
+      return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
+    }) : [];
   }
 );
 
@@ -161,10 +162,9 @@ browser.storage.onChanged.addListener(changes => {
     invidiousDarkMode = changes.invidiousDarkMode.newValue;
   }
   if ('whitelist' in changes) {
-    whitelist = changes.whitelist.newValue.map(e => new RegExp(e));
-  }
-  if ('redirectBypassFlag' in changes) {
-    redirectBypassFlag = changes.redirectBypassFlag.newValue;
+    whitelist = changes.whitelist.newValue.map(e => {
+      return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
+    });
   }
 });
 
@@ -194,8 +194,9 @@ function addressToLatLng(address, callback) {
   xmlhttp.send();
 }
 
-function isWhitelisted(initiator) {
-  return initiator && whitelist.some(regex => (regex.test(initiator.href)));
+function isWhitelisted(url, initiator) {
+  return whitelist.some(regex => (regex.test(url.href))) ||
+    (initiator && whitelist.some(regex => (regex.test(initiator.href))));
 }
 
 function isFirefox() {
@@ -203,7 +204,7 @@ function isFirefox() {
 }
 
 function redirectYouTube(url, initiator, type) {
-  if (disableInvidious || isWhitelisted(initiator)) {
+  if (disableInvidious || isWhitelisted(url, initiator)) {
     return null;
   }
   if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) {
@@ -234,7 +235,7 @@ function redirectYouTube(url, initiator, type) {
 }
 
 function redirectTwitter(url, initiator) {
-  if (disableNitter || isWhitelisted(initiator)) {
+  if (disableNitter || isWhitelisted(url, initiator)) {
     return null;
   }
   if (url.pathname.includes('/home')) {
@@ -258,7 +259,7 @@ function redirectTwitter(url, initiator) {
 }
 
 function redirectInstagram(url, initiator, type) {
-  if (disableBibliogram || isWhitelisted(initiator)) {
+  if (disableBibliogram || isWhitelisted(url, initiator)) {
     return null;
   }
   // Do not redirect Bibliogram view on Instagram links
@@ -278,7 +279,7 @@ function redirectInstagram(url, initiator, type) {
 }
 
 function redirectGoogleMaps(url, initiator) {
-  if (disableOsm || isWhitelisted(initiator)) {
+  if (disableOsm || isWhitelisted(url, initiator)) {
     return null;
   }
   let redirect;
diff --git a/manifest.json b/manifest.json
index 542c81cc..b34cfc77 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
 {
   "name": "Privacy Redirect",
   "description": "Redirects Twitter, YouTube, Instagram & Google Maps requests to privacy friendly alternatives.",
-  "version": "1.1.33",
+  "version": "1.1.34",
   "manifest_version": 2,
   "background": {
     "scripts": [
diff --git a/pages/styles.css b/pages/styles.css
index c00add43..d9a7e5df 100644
--- a/pages/styles.css
+++ b/pages/styles.css
@@ -316,7 +316,7 @@ li {
 
 @media (prefers-color-scheme: light) {
 
-  body.popup, header, h1, input, select, div.tabcontent, button.tablinks.active {
+  body.popup, header, h1, input, select, div.tabcontent, button.tablinks.active, ul {
     background-color: var(--lighter);
     color: var(--text-secondary);
   }