Avoid redirecting `studio.youtube.com` & basic instance validation

This commit is contained in:
SimonBrazell 2020-02-09 11:08:04 +11:00
parent d25072f6b5
commit eb99449f72
8 changed files with 64 additions and 22 deletions

View File

@ -3,11 +3,11 @@
- [Chrome Extension](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb) - [Chrome Extension](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb)
- [Firefox Add-on](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/) - [Firefox Add-on](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/)
A simple browser extension that redirects Twitter, Youtube & Instagram requests to privacy friendly alternatives - [Nitter](https://github.com/zedeus/nitter), [Invidious](https://github.com/omarroth/invidious) & [Bibliogram](https://github.com/cloudrac3r/bibliogram). A simple browser extension that redirects Twitter, YouTube & Instagram requests to privacy friendly alternatives - [Nitter](https://github.com/zedeus/nitter), [Invidious](https://github.com/omarroth/invidious) & [Bibliogram](https://github.com/cloudrac3r/bibliogram).
Listens for and redirects requests made to the following: Listens for and redirects requests made to the following:
- **Twitter -** `twitter.com`, `www.twitter.com`, `mobile.twitter.com` - **Twitter -** `twitter.com`, `www.twitter.com`, `mobile.twitter.com`
- **Youtube -** `youtube.com`, `www.youtube.com`, `youtube-nocookie.com`, `www.youtube-nocookie.com`, `m.youtube.com` - **YouTube -** `youtube.com`, `www.youtube.com`, `youtube-nocookie.com`, `www.youtube-nocookie.com`, `m.youtube.com`
- **Instagram -** `instagram.com`, `www.instagram.com`, `help.instagram.com`, `about.instagram.com`. - **Instagram -** `instagram.com`, `www.instagram.com`, `help.instagram.com`, `about.instagram.com`.
Allows for setting custom [Nitter](https://github.com/zedeus/nitter/wiki/Instances), [Invidious](https://github.com/omarroth/invidious/wiki/Invidious-Instances) & [Bibliogram](https://github.com/cloudrac3r/bibliogram/wiki/Instances) instances and toggling redirects on & off. Allows for setting custom [Nitter](https://github.com/zedeus/nitter/wiki/Instances), [Invidious](https://github.com/omarroth/invidious/wiki/Invidious-Instances) & [Bibliogram](https://github.com/cloudrac3r/bibliogram/wiki/Instances) instances and toggling redirects on & off.

View File

@ -55,9 +55,22 @@ chrome.storage.onChanged.addListener(changes => {
} }
}); });
function redirectBibliogram(url) { function redirectYouTube(url) {
if (url.host.split('.')[0] === 'studio') {
// Avoid redirecting `studio.youtube.com`
return null;
} else {
return `${invidiousInstance}${url.pathname}${url.search}`;
}
}
function redirectTwitter(url) {
return `${nitterInstance}${url.pathname}${url.search}`
}
function redirectInstagram(url) {
if (url.pathname === '/' || url.pathname.match(instagramPathsRegex)) { if (url.pathname === '/' || url.pathname.match(instagramPathsRegex)) {
return bibliogramInstance + url.pathname + url.search; return `${bibliogramInstance}${url.pathname}${url.search}`;
} else { } else {
// Redirect user profile requests to '/u/...' // Redirect user profile requests to '/u/...'
return `${bibliogramInstance}/u${url.pathname}${url.search}`; return `${bibliogramInstance}/u${url.pathname}${url.search}`;
@ -71,23 +84,23 @@ chrome.webRequest.onBeforeRequest.addListener(
if (url.host.match(youtubeRegex)) { if (url.host.match(youtubeRegex)) {
if (!disableInvidious) { if (!disableInvidious) {
redirect = { redirect = {
redirectUrl: invidiousInstance + url.pathname + url.search redirectUrl: redirectYouTube(url)
}; };
} }
} else if (url.host.match(twitterRegex)) { } else if (url.host.match(twitterRegex)) {
if (!disableNitter) { if (!disableNitter) {
redirect = { redirect = {
redirectUrl: nitterInstance + url.pathname + url.search redirectUrl: redirectTwitter(url)
}; };
} }
} else if (url.host.match(instagramRegex)) { } else if (url.host.match(instagramRegex)) {
if (!disableBibliogram) { if (!disableBibliogram) {
redirect = { redirect = {
redirectUrl: redirectBibliogram(url) redirectUrl: redirectInstagram(url)
}; };
} }
} }
if (redirect) { if (redirect && redirect.redirectUrl) {
console.log( console.log(
'Redirecting', `"${url.toString()}"`, '=>', `"${redirect.redirectUrl}"` 'Redirecting', `"${url.toString()}"`, '=>', `"${redirect.redirectUrl}"`
); );

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -1,7 +1,7 @@
{ {
"name": "Privacy Redirect", "name": "Privacy Redirect",
"description": "Redirects Twitter, Youtube & Instagram requests to privacy friendly alternatives - Nitter, Invidious, & Bibliogram.", "description": "Redirects Twitter, YouTube & Instagram requests to privacy friendly alternatives - Nitter, Invidious, & Bibliogram.",
"version": "1.1.5", "version": "1.1.6",
"manifest_version": 2, "manifest_version": 2,
"background": { "background": {
"scripts": [ "scripts": [

View File

@ -28,9 +28,9 @@ chrome.storage.sync.get(
document.querySelector('#save').addEventListener('click', () => { document.querySelector('#save').addEventListener('click', () => {
chrome.storage.sync.set({ chrome.storage.sync.set({
nitterInstance: nitterInstance.value, nitterInstance: nitterInstance.value && nitterInstance.checkValidity() ? new URL(nitterInstance.value).origin : '',
invidiousInstance: invidiousInstance.value, invidiousInstance: invidiousInstance.value && invidiousInstance.checkValidity() ? new URL(invidiousInstance.value).origin : '',
bibliogramInstance: bibliogramInstance.value, bibliogramInstance: bibliogramInstance.value && bibliogramInstance.checkValidity() ? new URL(bibliogramInstance.value).origin : '',
disableNitter: !disableNitter.checked, disableNitter: !disableNitter.checked,
disableInvidious: !disableInvidious.checked, disableInvidious: !disableInvidious.checked,
disableBibliogram: !disableBibliogram.checked disableBibliogram: !disableBibliogram.checked

View File

@ -14,7 +14,7 @@
<img src="../../images/logo.png" alt="Privacy Redirect logo"> <img src="../../images/logo.png" alt="Privacy Redirect logo">
</div> </div>
<small> <small>
<span>Version</span>: 1.1.4</span> <span>Version:&nbsp;<span id="version"></span></span>
</small> </small>
</header> </header>

View File

@ -6,6 +6,7 @@ let bibliogramInstance = document.querySelector('#bibliogramInstance');
let disableNitter = document.querySelector('#disableNitter'); let disableNitter = document.querySelector('#disableNitter');
let disableInvidious = document.querySelector('#disableInvidious'); let disableInvidious = document.querySelector('#disableInvidious');
let disableBibliogram = document.querySelector('#disableBibliogram'); let disableBibliogram = document.querySelector('#disableBibliogram');
let version = document.querySelector('#version');
chrome.storage.sync.get( chrome.storage.sync.get(
[ [
@ -26,6 +27,8 @@ chrome.storage.sync.get(
} }
); );
version.textContent = chrome.runtime.getManifest().version;
function debounce(func, wait, immediate) { function debounce(func, wait, immediate) {
let timeout; let timeout;
return () => { return () => {
@ -42,21 +45,30 @@ function debounce(func, wait, immediate) {
}; };
let nitterInstanceChange = debounce(() => { let nitterInstanceChange = debounce(() => {
chrome.storage.sync.set({ nitterInstance: nitterInstance.value }); if (nitterInstance.checkValidity()) {
chrome.storage.sync.set({
nitterInstance: nitterInstance.value ? new URL(nitterInstance.value).origin : ''
});
}
}, 500); }, 500);
nitterInstance.addEventListener('input', nitterInstanceChange); nitterInstance.addEventListener('input', nitterInstanceChange);
let invidiousInstanceChange = debounce(() => { let invidiousInstanceChange = debounce(() => {
chrome.storage.sync.set({ invidiousInstance: invidiousInstance.value }); if (invidiousInstance.checkValidity()) {
chrome.storage.sync.set({
invidiousInstance: invidiousInstance.value ? new URL(invidiousInstance.value).origin : ''
});
}
}, 500); }, 500);
invidiousInstance.addEventListener('input', invidiousInstanceChange); invidiousInstance.addEventListener('input', invidiousInstanceChange);
let bibliogramInstanceChange = debounce(() => { let bibliogramInstanceChange = debounce(() => {
chrome.storage.sync.set({ bibliogramInstance: bibliogramInstance.value }); if (bibliogramInstance.checkValidity()) {
chrome.storage.sync.set({
bibliogramInstance: bibliogramInstance.value ? new URL(bibliogramInstance.value).origin : ''
});
}
}, 500); }, 500);
bibliogramInstance.addEventListener('input', bibliogramInstanceChange); bibliogramInstance.addEventListener('input', bibliogramInstanceChange);
disableNitter.addEventListener('change', event => { disableNitter.addEventListener('change', event => {

View File

@ -5,6 +5,8 @@
--white: #FFF; --white: #FFF;
--active: #FF5B56; --active: #FF5B56;
--space: 5px; --space: 5px;
--danger: #f04141;
--danger-light: #F9D0D5;
} }
body { body {
@ -31,7 +33,7 @@ header .logo-container {
} }
header .logo-container img { header .logo-container img {
width: 100%; max-width: 100%;
} }
header small { header small {
@ -137,10 +139,25 @@ input:checked+label:after {
padding: 10px; padding: 10px;
text-align: center; text-align: center;
text-decoration: none; text-decoration: none;
cursor: pointer;
-webkit-transition-duration: 0.4s;
transition-duration: 0.4s;
} }
.button:hover { .button:hover {
background-color: var(--active); background-color: var(--active);
color: #fff color: #fff;
}
.button:active {
background-color: var(--active);
box-shadow: 0 5px var(--dark-grey);
transform: translateY(4px);
}
input[type="url"]:invalid {
color: var(--danger);
border-color: var(--danger);
background-color: var(--danger-light);
} }