mirror of
https://github.com/andrei0x309/Brave-Detection-Blocker-Chrome-Extension.git
synced 2024-11-15 16:01:23 +00:00
first commit
This commit is contained in:
commit
d78b27c29a
7
.prettierrc
Normal file
7
.prettierrc
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"printWidth": 150,
|
||||
"trailingComma": "all",
|
||||
"singleQuote": true
|
||||
}
|
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"prettier.enable": true,
|
||||
"editor.formatOnSave": true
|
||||
}
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Andrei O.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
13
PRIVACY_POLICY.md
Normal file
13
PRIVACY_POLICY.md
Normal file
@ -0,0 +1,13 @@
|
||||
# 𝐏𝐫𝐢𝐯𝐚𝐜𝐲 𝐏𝐨𝐥𝐢𝐜𝐲:
|
||||
|
||||
## Privacy Points:
|
||||
|
||||
- This extension does not collect any data form your device.
|
||||
- This extension does not use external files, everything is packed into the extension.
|
||||
- This extension uses the manifest V3 which does not allow any third party scripts to be injected.
|
||||
- The extension needs host permissions to inject a script to modify the navigator object.
|
||||
- This extension is completely open source, the source is available on Github - [https://https://github.com/andrei0x309/Brave-Detection-Blocker-Chrome-Extension](https://https://github.com/andrei0x309/Brave-Detection-Blocker-Chrome-Extension).
|
||||
|
||||
### 𝐂𝐨𝐧𝐭𝐚𝐜𝐭:
|
||||
|
||||
Discord: andrei0x309#6562
|
31
README.md
Normal file
31
README.md
Normal file
@ -0,0 +1,31 @@
|
||||
# Brave Detection Block BDB (chrome extension):
|
||||
|
||||
![BDB LOGO](/images/BDB-ICON256.png?raw=true "BDB LOGO")
|
||||
|
||||
Although Brave is a good privacy browser it has some features that are pretty against privacy like an official method for website to detect you are running brave.
|
||||
|
||||
This method is by cheking a custom property on the navigator object, accessable at `window.navigator.brave`.
|
||||
|
||||
This is probably a point where marketing and data collection coliedes with any privacy ethos.
|
||||
|
||||
This extension is ment to delete that property and make it impossible to detect if you are running brave using that method.
|
||||
|
||||
Download from Chrome-Store(only download if you are running Brave):
|
||||
|
||||
[Brave-Detection-Blocker-Chrome-Extension](https://https://github.com/andrei0x309/Brave-Detection-Blocker-Chrome-Extension)
|
||||
|
||||
## Privacy Policy Link:
|
||||
|
||||
[PRIVACY_POLICY.md](PRIVACY_POLICY.md)
|
||||
|
||||
### License:
|
||||
|
||||
MIT
|
||||
|
||||
### Notes:
|
||||
|
||||
This extension was made to be compatible with [Random User Agent](https://github.com/tarampampam/random-user-agent/) extension.
|
||||
|
||||
### 𝐂𝐨𝐧𝐭𝐚𝐜𝐭:
|
||||
|
||||
Discord: andrei0x309#6562
|
10
_locales/en/messages.json
Normal file
10
_locales/en/messages.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"appName": {
|
||||
"message": "Brave Detection Block",
|
||||
"description": "This extension blocks the official method to detect you use brave browser, install only on Brave browser."
|
||||
},
|
||||
"appDesc": {
|
||||
"message": "Brave Detection Block",
|
||||
"description": "This extension blocks the official method to detect you use brave browser, install only on Brave browser."
|
||||
}
|
||||
}
|
28
block-script.js
Normal file
28
block-script.js
Normal file
@ -0,0 +1,28 @@
|
||||
function Navigator() {}
|
||||
newNav = new Navigator();
|
||||
const alreadyProxifiedNav = {
|
||||
userAgent: navigator.userAgent,
|
||||
appVersion: navigator.appVersion,
|
||||
platform: navigator.platform,
|
||||
vendor: navigator.vendor,
|
||||
};
|
||||
for (let prop in window.navigator) {
|
||||
if (prop === 'brave') {
|
||||
continue;
|
||||
}
|
||||
Object.defineProperty(newNav, prop, {
|
||||
value: window.navigator[prop],
|
||||
writable: true,
|
||||
});
|
||||
}
|
||||
for (let prop in alreadyProxifiedNav) {
|
||||
alreadyProxifiedNav.hasOwnProperty(prop) &&
|
||||
Object.defineProperty(newNav, prop, {
|
||||
value: alreadyProxifiedNav[prop],
|
||||
writable: true,
|
||||
});
|
||||
}
|
||||
Object.defineProperty(window, 'navigator', {
|
||||
value: newNav,
|
||||
writable: true,
|
||||
});
|
17
content-script.js
Normal file
17
content-script.js
Normal file
@ -0,0 +1,17 @@
|
||||
const nullthrows = (v) => {
|
||||
if (v == null) throw new Error("it's a null");
|
||||
return v;
|
||||
};
|
||||
|
||||
const injectScript = (src) => {
|
||||
const script = document.createElement('script');
|
||||
script.src = src;
|
||||
script.onload = function () {
|
||||
this.remove();
|
||||
};
|
||||
try {
|
||||
nullthrows(document.head || document.documentElement).appendChild(script);
|
||||
} catch {}
|
||||
};
|
||||
|
||||
injectScript(chrome.runtime.getURL('/block-script.js'));
|
BIN
images/BDB-ICON128.png
Normal file
BIN
images/BDB-ICON128.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
images/BDB-ICON16.png
Normal file
BIN
images/BDB-ICON16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 923 B |
BIN
images/BDB-ICON256.png
Normal file
BIN
images/BDB-ICON256.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
BIN
images/BDB-ICON32.png
Normal file
BIN
images/BDB-ICON32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
BIN
images/BDB-ICON48.png
Normal file
BIN
images/BDB-ICON48.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.6 KiB |
BIN
images/BDB-ICON512.png
Normal file
BIN
images/BDB-ICON512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 142 KiB |
42
manifest.json
Normal file
42
manifest.json
Normal file
@ -0,0 +1,42 @@
|
||||
{
|
||||
"manifest_version": 3,
|
||||
"name": "__MSG_appName__",
|
||||
"description": "__MSG_appDesc__",
|
||||
"default_locale": "en",
|
||||
"version": "1.0.0",
|
||||
"version_name": "1.0.0",
|
||||
"permissions": [],
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": [
|
||||
"http://*/*",
|
||||
"https://*/*"
|
||||
],
|
||||
"js": ["content-script.js"],
|
||||
"run_at": "document_start"
|
||||
}
|
||||
],
|
||||
"action": {
|
||||
"default_popup": "popup.html",
|
||||
"default_icon": {
|
||||
"16": "images/BDB-ICON16.png",
|
||||
"32": "images/BDB-ICON32.png",
|
||||
"48": "images/BDB-ICON48.png",
|
||||
"128": "images/BDB-ICON128.png"
|
||||
}
|
||||
},
|
||||
"web_accessible_resources": [
|
||||
{
|
||||
"resources": [ "block-script.js" ],
|
||||
"matches": [ "https://*/*" ]
|
||||
}
|
||||
],
|
||||
"icons": {
|
||||
"16": "images/BDB-ICON16.png",
|
||||
"32": "images/BDB-ICON32.png",
|
||||
"48": "images/BDB-ICON48.png",
|
||||
"128": "images/BDB-ICON128.png",
|
||||
"256": "images/BDB-ICON256.png",
|
||||
"512": "images/BDB-ICON512.png"
|
||||
}
|
||||
}
|
1
package.json
Normal file
1
package.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
135
popup.html
Normal file
135
popup.html
Normal file
@ -0,0 +1,135 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
button {
|
||||
outline: none;
|
||||
}
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
*:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
width: 28em;
|
||||
background: #121116;
|
||||
background-image: radial-gradient(top, circle cover, #232327 0%, #151516 80%);
|
||||
color: ghostwhite;
|
||||
}
|
||||
|
||||
.mainbody {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.pre-inline {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* // TABS */
|
||||
|
||||
.container--tabs {
|
||||
margin: 1rem 0rem 1rem 0rem;
|
||||
}
|
||||
.container--tabs .nav-tabs {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
list-style-type: none;
|
||||
border-bottom: 0.2rem solid #ff9800
|
||||
}
|
||||
.container--tabs .nav-tabs > li {
|
||||
margin-bottom: 0.1rem;
|
||||
}
|
||||
.container--tabs .nav-tabs > li > a {
|
||||
margin-right: 0.4rem;
|
||||
line-height: 1.42857143;
|
||||
padding: 0.52em;
|
||||
border: 0.2rem solid transparent;
|
||||
border-radius: 4px 4px 0 0;
|
||||
color: rgb(204, 185, 13);
|
||||
}
|
||||
.container--tabs .nav-tabs > li > a:hover {
|
||||
border-color: rgb(255, 208, 53) rgb(132, 182, 40) rgba(185, 95, 21, 0.432) rgb(172, 199, 53);
|
||||
}
|
||||
.container--tabs .nav-tabs > li.active > a,
|
||||
.container--tabs .nav-tabs > li.active > a:hover,
|
||||
.container--tabs .nav-tabs > li.active > a:focus {
|
||||
color: #f44336;
|
||||
cursor: default;
|
||||
background-color: #0000007a;
|
||||
border: 0.2rem solid #dd9003;
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
.container--tabs .tab-content {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
.container--tabs .tab-content > .tab-pane {
|
||||
display: none;
|
||||
}
|
||||
.container--tabs .tab-content > .tab-pane.active {
|
||||
display: block;
|
||||
padding: 1.5% 1.5%;
|
||||
}
|
||||
.container--tabs .tab-content > .active {
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="mainbody" style="min-width: 100%">
|
||||
<div class="container--tabs">
|
||||
<section class="row">
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active"><a href="#tab-1">Main</a></li>
|
||||
<li class=""><a href="#tab-2">Notes</a></li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div id="tab-1" class="tab-pane active">
|
||||
<h3 style="font-size: 1.1rem; text-transform: uppercase;">Brave Detection Block</h3>
|
||||
<img id="logo" src="" alt="BDB LOGO" >
|
||||
<h3>While the extension is enabled:</h3>
|
||||
<h3><pre>window.navigator.brave</pre></h3>
|
||||
<h3>can't be accessed by any website</h3>
|
||||
|
||||
</div>
|
||||
<div id="tab-2" class="tab-pane" style="font-size: 0.9rem; text-align: left">
|
||||
<h3 style="font-size: 1.1rem; text-transform: uppercase;">Notes</h3>
|
||||
This extension is used to block detection of brave browser by websites.
|
||||
<br /><br />
|
||||
It only blocks the official detection which is checking the <pre class="pre-inline">window.navigator.brave object</pre>.
|
||||
<br /><br />
|
||||
The extension does not touch the <pre class="pre-inline">user-agent</pre> or try to prevent other methods of detecting brave browser.
|
||||
<br /><br />
|
||||
For that reason to employ a higher degree of privacy is recomanded to use an <preclass="pre-inline">user-agent randomizer extension,</pre>
|
||||
set the fingerpint blocking to max in brave settings, and also allow this extension and
|
||||
the user-agent randomizer extension to work in incognito mode.
|
||||
<br /><br />
|
||||
If you want even more privacy than that use a no logs VPN doubled by a brave tor window.
|
||||
<br /><br />
|
||||
If you're even more privacy focused you could set up a private VPN on a VPS bought with a privacy crypto and only,
|
||||
use DOH for DNS doubled by TOR using only hidden services no exist nodes on a non-persistent OS decrypted at boot time
|
||||
from a scrambled hidden partition.
|
||||
<br /><br />
|
||||
(Don't know why you would employ such effort but I'm just trying to be techincal.)
|
||||
<br /><br />
|
||||
<h3>Check source at:</h3>
|
||||
<a href="https://https://github.com/andrei0x309/Brave-Detection-Blocker-Chrome-Extension">
|
||||
https://github.com/andrei0x309/Brave-Detection-Blocker-Chrome-Extension
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="popup.js"></script>
|
||||
</body>
|
||||
</html>
|
143
popup.js
Normal file
143
popup.js
Normal file
@ -0,0 +1,143 @@
|
||||
'use strict';
|
||||
|
||||
|
||||
window.addEventListener(
|
||||
'message',
|
||||
(event) => {
|
||||
if (event.data.action === 'proxyError') {
|
||||
displayAlert('error', 'Wrong data, or proxy down double check the input.');
|
||||
}
|
||||
},
|
||||
false,
|
||||
);
|
||||
|
||||
// let btn_close_alert = document.getElementById('closeAlertBtn');
|
||||
|
||||
// const btnProxyStop = document.getElementById('btnProxyStop');
|
||||
// const btnProxyStart = document.getElementById('btnProxyStart');
|
||||
|
||||
|
||||
|
||||
// const proxyTypeGroup = document.getElementById('proxyTypeGroup');
|
||||
|
||||
// const btnProxyType = [
|
||||
// document.getElementById('btnProxyTypeHttp'),
|
||||
// document.getElementById('btnProxyTypeHttps'),
|
||||
// document.getElementById('btnProxyTypeSocks4'),
|
||||
// document.getElementById('btnProxyTypeSocks5'),
|
||||
// ];
|
||||
|
||||
// for (const btn of btnProxyType) {
|
||||
// if (btn) {
|
||||
// btn.onclick = async function () {
|
||||
// const active = proxyTypeGroup.querySelector('.btn-green');
|
||||
// if (active) {
|
||||
// active.classList.remove('btn-green');
|
||||
// }
|
||||
// this.classList.add('btn-green');
|
||||
// bgP.window.extOptions.activeProxy.type = this.id.replace('btnProxyType', '').toLowerCase();
|
||||
// await bgP.window.setOptions(bgP.window.extOptions);
|
||||
// };
|
||||
// }
|
||||
// }
|
||||
|
||||
// const spanProxyStatusOn = document.getElementById('spanProxyStatusOn');
|
||||
// const spanProxyStatusOff = document.getElementById('spanProxyStatusOff');
|
||||
|
||||
// const inputproxyHost = document.getElementById('proxyHost');
|
||||
// const inputproxyPort = document.getElementById('proxyPort');
|
||||
|
||||
// const updatePopup = function (options) {
|
||||
// if (options.proxyEnabled) {
|
||||
// spanProxyStatusOff.classList.add('hidden');
|
||||
// spanProxyStatusOn.classList.remove('hidden');
|
||||
|
||||
// btnProxyStart.classList.add('hidden');
|
||||
// btnProxyStop.classList.remove('hidden');
|
||||
// } else {
|
||||
// spanProxyStatusOn.classList.add('hidden');
|
||||
// spanProxyStatusOff.classList.remove('hidden');
|
||||
|
||||
// btnProxyStart.classList.remove('hidden');
|
||||
// btnProxyStop.classList.add('hidden');
|
||||
// }
|
||||
|
||||
// if (options.activeProxy) {
|
||||
// const types = ['http', 'https', 'socks4', 'socks5'];
|
||||
// if (options.activeProxy.type) btnProxyType[types.indexOf(options.activeProxy.type)].classList.add('btn-green');
|
||||
// inputproxyHost.value = options.activeProxy.host;
|
||||
// inputproxyPort.value = options.activeProxy.port;
|
||||
// }
|
||||
// };
|
||||
|
||||
// updatePopup(bgP.window.extOptions);
|
||||
|
||||
// btnProxyStop.onclick = function () {
|
||||
// bgP.window.extOptions.proxyEnabled = false;
|
||||
// bgP.window.setOptions(bgP.window.extOptions);
|
||||
// bgP.window.disableProxy();
|
||||
// updatePopup(bgP.window.extOptions);
|
||||
// };
|
||||
|
||||
// btnProxyStart.onclick = function () {
|
||||
// bgP.window.extOptions.activeProxy.host = inputproxyHost.value;
|
||||
// bgP.window.extOptions.activeProxy.port = inputproxyPort.value;
|
||||
// bgP.window.extOptions.proxyEnabled = true;
|
||||
// bgP.window.setOptions(bgP.window.extOptions);
|
||||
// bgP.window.setProxy(bgP.window.extOptions.activeProxy);
|
||||
// updatePopup(bgP.window.extOptions);
|
||||
// };
|
||||
|
||||
// let displayAlert = (type, msg) => {
|
||||
// if (type === 'error') {
|
||||
// document.getElementById('exAlertBox').classList.remove('alert-success');
|
||||
// document.getElementById('exAlertBox').classList.add('alert-warning');
|
||||
// } else if (type === 'success') {
|
||||
// document.getElementById('exAlertBox').classList.remove('alert-warning');
|
||||
// document.getElementById('exAlertBox').classList.add('alert-success');
|
||||
// }
|
||||
|
||||
// document.getElementById('alertMsg').innerHTML = msg;
|
||||
// document.getElementById('exAlert').classList.remove('hidden');
|
||||
// };
|
||||
|
||||
// let closeAlert = () => {
|
||||
// const alert = document.getElementById('exAlert');
|
||||
// if (alert) {
|
||||
// document.getElementById('exAlert').classList.add('hidden');
|
||||
// }
|
||||
// };
|
||||
// closeAlert();
|
||||
|
||||
// btn_close_alert.addEventListener('click', function () {
|
||||
// closeAlert();
|
||||
// });
|
||||
|
||||
const myTabs = document.querySelectorAll('ul.nav-tabs > li');
|
||||
function myTabClicks(tabClickEvent) {
|
||||
for (let i = 0; i < myTabs.length; i++) {
|
||||
myTabs[i].classList.remove('active');
|
||||
}
|
||||
|
||||
const clickedTab = tabClickEvent.currentTarget;
|
||||
clickedTab.classList.add('active');
|
||||
tabClickEvent.preventDefault();
|
||||
|
||||
const myContentPanes = document.querySelectorAll('.tab-pane');
|
||||
|
||||
for (let i = 0; i < myContentPanes.length; i++) {
|
||||
myContentPanes[i].classList.remove('active');
|
||||
}
|
||||
|
||||
const anchorReference = tabClickEvent.target;
|
||||
const activePaneId = anchorReference.getAttribute('href');
|
||||
const activePane = document.querySelector(activePaneId);
|
||||
activePane.classList.add('active');
|
||||
}
|
||||
|
||||
for (let i = 0; i < myTabs.length; i++) {
|
||||
myTabs[i].addEventListener('click', myTabClicks);
|
||||
}
|
||||
|
||||
const imgURL = chrome.runtime.getURL("images/BDB-ICON256.png");
|
||||
document.getElementById("logo").src = imgURL;
|
Loading…
Reference in New Issue
Block a user