Compare commits

..

76 commits

Author SHA1 Message Date
55a4b89b24 fix cam btn 2024-11-25 14:40:26 -06:00
fc736da1d3 fix window size to accomidate new button 2024-11-25 14:32:43 -06:00
1c1f7934fb fix styling on sneedium camBtn 2024-11-25 14:29:55 -06:00
4bac2b0542 add webcam button 2024-11-25 14:26:46 -06:00
bad5e26a86 re-introduce yt/google redirect 2024-11-25 14:21:10 -06:00
42de741e08 since i added adblock/trackblock support this isnt really needed 2024-11-25 14:18:15 -06:00
7198b136a6 add mic/cam access 2024-11-25 14:07:39 -06:00
8d18437dfa add more adblocking, update itworks html 2024-11-25 14:02:23 -06:00
37e109f739 "patches, and patches for the patches" 2024-11-21 15:12:04 -06:00
dc9f6a45a6 Remove userscript support. 2024-11-21 15:04:35 -06:00
995962a497 finish up the rewrite 2024-11-21 14:57:11 -06:00
fbdeb5dc7b no one's sure what devops really means 2024-11-21 14:08:59 -06:00
5789eb88a2 screaming out feibely, disgusting. 2024-11-21 14:02:51 -06:00
5dada52da5 begin work on big rewrite 2024-11-21 13:55:06 -06:00
d16aa9b3f3 Update LICENSE 2024-11-14 19:58:45 +00:00
The Ghost of FOSS' Future
c0037f256e
remove irelivant msg 2024-09-10 20:55:03 -05:00
The Ghost of FOSS' Future
6531460cd0
ok thats cool 2024-09-10 20:54:30 -05:00
The Ghost of FOSS' Future
95219d7298
demote mac maker to a shortcut 2024-09-08 16:13:04 -05:00
The Ghost of FOSS' Future
c7159725e2
Add files via upload 2024-09-08 16:00:22 -05:00
The Ghost of FOSS' Future
b4e88f8b22
Update README.md 2024-09-03 19:36:14 -05:00
The Ghost of FOSS' Future
ee706b339f
nature trail to hell...
in 3d!
2024-09-03 19:14:56 -05:00
The Ghost of FOSS' Future
726d22f096
will it work?
perhaps not
2024-09-03 19:10:29 -05:00
The Ghost of FOSS' Future
f244e0f003
yet another bugsbug 2024-09-03 19:01:28 -05:00
The Ghost of FOSS' Future
010e954d7d
Hotfix for the maker 2024-09-03 18:54:32 -05:00
The Ghost of FOSS' Future
38209621b9
Make the Mac maker make Mac binaries 2024-09-03 18:51:36 -05:00
The Ghost of FOSS' Future
1bef1f1615
Add files via upload 2024-09-03 18:47:16 -05:00
The Ghost of FOSS' Future
1549b64317
Update package.json 2024-09-03 18:43:12 -05:00
The Ghost of FOSS' Future
e4776f36ad
Update package.json 2024-09-03 18:34:53 -05:00
Sam Sneed
2f64e8b41f Update 0.0.0.0 day fix to include localhost domians 2024-08-14 10:34:58 -05:00
Sam Sneed
b483e91f1e Partial 0.0.0.0 day fix 2024-08-14 10:03:19 -05:00
Sam Sneed
8b6a491ed5 Fix Google 2024-08-13 18:31:17 -05:00
Sam Sneed
252984a504 modified: libbrowz.js 2024-08-13 18:12:36 -05:00
Sam Sneed
dda48fc695 fix previous commit 2024-08-13 17:33:06 -05:00
Sam Sneed
d1c7f53d16 Only create proxy once 2024-08-13 17:32:05 -05:00
Sam Sneed
981d139755 Try to fix Google Querys 2024-08-13 17:31:03 -05:00
Sam Sneed
d484a3557b Update the maker 2024-08-13 16:41:11 -05:00
Sam Sneed
14fa018ec1 Make randomized UA strings 2024-08-13 16:38:10 -05:00
The Ghost of FOSS' Future
6d93ff50eb
Upload maker. 2024-08-13 20:58:54 +00:00
Sam Sneed
bfd42f9fa7 EXPERIMENT: DPI prevention 2024-08-13 15:36:09 -05:00
Sam Sneed
357ad09eaa Merge branch 'master' of https://github.com/Sneed-Group/sneedium 2024-08-13 14:35:20 -05:00
Sam Sneed
f70f63e41c RefreshBtn/Viewport Protection update 2024-08-13 14:35:15 -05:00
Sam Sneed
3f43c17b9e
Update README.md 2024-08-13 14:02:43 +00:00
Sam Sneed
5ef8a09ff0
Update README.md 2024-08-13 13:58:54 +00:00
Sam Sneed
1eee3a31f8
Update README.md 2024-08-13 13:56:20 +00:00
Sam Sneed
1b6b848cef
Add files via upload 2024-08-13 13:55:25 +00:00
Sam Sneed
f36b1ae72a spongebob fun pack 2024-08-12 18:44:24 -05:00
Sam Sneed
3b07296b75 update default window title and internals 2024-08-12 18:38:02 -05:00
Sam Sneed
8a2bf6c631 let's try this again 2024-08-12 18:04:40 -05:00
Sam Sneed
3a10c82fb3 small fixes :o) 2024-08-12 17:42:45 -05:00
Sam Sneed
e9c68dcf9f Add small adjustments to Google PRT 2024-08-12 17:38:03 -05:00
Sam Sneed
c6afbb7d6f Remove un-needed code that MIGHT break things. 2024-08-12 16:50:57 -05:00
Sam Sneed
842f9bf8c5 modified: libbrowz.js 2024-08-12 16:49:46 -05:00
Sam Sneed
cbc14de39d Some final fixes before next release... 2024-08-12 16:48:54 -05:00
Sam Sneed
afd1928f02 Fix the webview styling 2024-08-12 16:38:19 -05:00
Sam Sneed
1cdea46b28 Auto-normalize urls 2024-08-12 16:30:58 -05:00
Sam Sneed
434db9cd0f Update version type hack 2024-08-12 15:43:29 -05:00
Sam Sneed
af7b08ce56 We seriously missed this the whole time!?! 2024-08-12 15:41:13 -05:00
Sam Sneed
44580739d2 Merge branch 'master' of https://github.com/Sneed-Group/sneedium 2024-08-12 15:39:08 -05:00
Sam Sneed
d5dedb091c Update itworks.html to use new brandname. 2024-08-12 15:38:21 -05:00
Sam Sneed
5439fadf09
Update README.md 2024-08-12 20:22:51 +00:00
Sam Sneed
0c6344b8e0 modified: package.json 2024-08-12 15:21:52 -05:00
Sam Sneed
cd0c61e813 Update package.json license 2024-08-12 15:21:05 -05:00
Sam Sneed
039b5b14c8 Actually fix the code. 2024-08-12 15:16:12 -05:00
Sam Sneed
84f489be00
Update LICENSE.md 2024-07-30 16:40:56 -05:00
Sam Sneed
379052e5d2
Update LICENSE.md 2024-07-07 12:36:39 -05:00
Sam Sneed
88f3a44242
Merge pull request #24 from Sneed-Group/dependabot/npm_and_yarn/electron-31.0.1
Bump electron from 30.1.1 to 31.0.1
2024-06-19 20:07:22 -05:00
Sam Sneed
187c68e703
Update LICENSE.md 2024-06-17 22:18:49 +00:00
dependabot[bot]
d8aebf9372
Bump electron from 30.1.1 to 31.0.1
Bumps [electron](https://github.com/electron/electron) from 30.1.1 to 31.0.1.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v30.1.1...v31.0.1)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-13 14:02:53 +00:00
Sam Sneed
9337ec75ac
Merge pull request #16 from Sneed-Group/dependabot/npm_and_yarn/electron-squirrel-startup-tw-1.0.1
Update electron-squirrel-startup requirement from ^1.0.0 to ^1.0.1
2024-05-26 07:15:25 -07:00
Sam Sneed
b664e3f3f1
fix google news. 2024-05-26 14:14:45 +00:00
Sam Sneed
c57bcb26f9
Merge pull request #12 from Sneed-Group/dependabot/npm_and_yarn/electron-packager-tw-17.1.2
Update electron-packager requirement from ^17.1.1 to ^17.1.2
2024-05-24 20:03:56 -05:00
Sam Sneed
84b29939b7
Merge pull request #20 from Sneed-Group/dependabot/npm_and_yarn/electron-30.0.8
Bump electron from 25.9.8 to 30.0.8
2024-05-24 20:03:17 -05:00
dependabot[bot]
22c36901ee
Bump electron from 25.9.8 to 30.0.8
Bumps [electron](https://github.com/electron/electron) from 25.9.8 to 30.0.8.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v25.9.8...v30.0.8)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-24 14:08:56 +00:00
dependabot[bot]
f3b089768f
Update electron-squirrel-startup requirement from ^1.0.0 to ^1.0.1
Updates the requirements on [electron-squirrel-startup](https://github.com/mongodb-js/electron-squirrel-startup) to permit the latest version.
- [Commits](https://github.com/mongodb-js/electron-squirrel-startup/compare/v1.0.0...v1.0.1)

---
updated-dependencies:
- dependency-name: electron-squirrel-startup
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-15 14:04:15 +00:00
dependabot[bot]
d750fef706
Update electron-packager requirement from ^17.1.1 to ^17.1.2
Updates the requirements on [electron-packager](https://github.com/electron/electron-packager) to permit the latest version.
- [Release notes](https://github.com/electron/electron-packager/releases)
- [Changelog](https://github.com/electron/packager/blob/main/NEWS.md)
- [Commits](https://github.com/electron/electron-packager/compare/v17.1.1...v17.1.2)

---
updated-dependencies:
- dependency-name: electron-packager
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-17 22:49:52 +00:00
Maxwell Drake
745d4e6d12 Update 'LICENSE.md' 2024-04-04 17:57:15 +00:00
19 changed files with 8024 additions and 102 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

4
.gitignore vendored
View file

@ -1 +1,5 @@
node_modules node_modules
seedium-linux-x64
sneedium-win32-x64
seedium-linux-arm64
sneedium-win32-arm64

29
LICENSE Normal file
View file

@ -0,0 +1,29 @@
The Sammy Public License Revision 5 Sub-Revision 2 (SPL-R5 SR2)
Copyright (c) Sneed Group
This document grants permission, without charge, to any individual acquiring a copy of the software and its associated documentation files (hereinafter referred to as the "Software"). Such individuals are authorized to engage in activities related to the Software with certain restrictions (listed below), including, but not limited to, the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software. These permissions extend to persons to whom the Software is furnished, subject to compliance with the specified conditions outlined below.
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.
In making contributions to the Software, contributors irrevocably assign, transfer, and convey all rights, titles, and interests in and to their contributions to the project owner(s). This assignment is absolute and encompasses all intellectual property rights, including, but not limited to, copyrights, patents, trademarks, and trade secrets. Contributors acknowledge and consent that they have no further claim, right, or interest in their contributions and agree to relinquish any moral rights associated with the contributed content. This assignment is effective upon the act of contributing to the Software, and contributors affirm that they have the authority to make such an assignment. However, contributors retain the right to modify their contributions.
Furthermore, this document permits the reuse and redistribution of both executable binaries and source code, contingent upon the inclusion of the previously mentioned copyright notice and permission notice in all copies or substantial portions of the Software. It is imperative that you explicitly acknowledge and agree that the owner(s) retain ownership rights over the aforementioned source code.
Additionally, note that the use of AI-assisted tools, including but not limited to GitHub Copilot and ChatGPT, is expressly permitted in conjunction with this software. Users are encouraged to leverage these AI tools to enhance their experience in developing, modifying, and interacting with the Software. The permission granted herein extends to the integration and utilization of AI-generated content for coding and communication purposes. The owner(s) of the Software acknowledge and embrace the collaborative nature of AI-assisted development.
In addition, the owner of the code is granted the authority to update their copy of The Sammy Public License (SPL) to the latest revision. This update may be undertaken at the discretion of the owner to ensure alignment with any subsequent revisions made to The Sammy Public License.
Minimum Payment Requirements by Business Size:
1. Fortune 500 Companies: Companies that are included in the Fortune 500 list are required to make an annual contribution of at least 42,069 USD or an equivalent amount per project used to support the sustainability of the Software, unless no donation option is provided. Additionally, Fortune 500 companies are required to contribute their changes upstream to the Software.
2. Large Non-Fortune 500 Companies: Non-Fortune 500 large companies (defined as companies with 128 or more employees) must pay a minimum of 15,000 USD per year for the continued use of the Software.
3. Medium Businesses: Medium businesses (defined as companies with 42 to 128 employees) are required to pay a minimum of 420 USD per year for the continued use of the Software.
4. Small Businesses: Small businesses (defined as companies with 42 or fewer employees) are required to pay a minimum of 69 USD per year for the continued use of the Software.
These fees are intended to ensure the sustainability of the project and may be subject to change by the project owner(s). Payment is due annually, and the corresponding amount must be paid no later than 30 days after the beginning of each calendar year. Failure to comply with these payment terms may result in revocation of the right to use the Software.
The aforementioned copyright notice and this permission notice must be included in all copies or substantial portions of the Software.

View file

@ -1,23 +0,0 @@
The MIT License (MIT/Modified)
Copyright (c) 2023 Samuel Lord
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.
By contributing to the Software, contributors agree to give up all rights to their contributions to the project owner/owners.

View file

@ -1,7 +1,20 @@
<img src="logo.png" align="right" width="15%"/> <img src="https://github.com/Sneed-Group/sneedium/blob/master/logo.png?raw=true" align="right" width="15%"/>
# F-Stopium # Sneedium
A basic web browser in Electron. ***Now with our own, functioning adblocker and privacy redirection technologies!*** A basic web browser in Electron. ***With a functioning adblocker and privacy redirection technologies!***
[![Download latest build.](https://github.com/Sneed-Group/sneedium/blob/master/download.png?raw=true)](https://github.com/Sneed-Group/sneedium/releases)
## Testing, compiling, and creation notes
To clone and run this repository you'll need [Node.js](https://nodejs.org/en/download/) (which comes with [npm](http://npmjs.com)) installed on your computer. From your command line:
```bash
# Install dependencies
npm install
# Run the app
npm start
```
Supports compiling via electron packager. Install and run it with: Supports compiling via electron packager. Install and run it with:
@ -19,26 +32,14 @@ A basic Electron application needs just these files:
- `index.html` - A web page to render. This is the app's **renderer process**. - `index.html` - A web page to render. This is the app's **renderer process**.
- `preload.js` - A content script that runs before the renderer process loads. - `preload.js` - A content script that runs before the renderer process loads.
## To Use
To clone and run this repository you'll need [Node.js](https://nodejs.org/en/download/) (which comes with [npm](http://npmjs.com)) installed on your computer. From your command line:
```bash
# Install dependencies
npm install
# Run the app
npm start
```
## License ## License
[MIT Modified](LICENSE.md) [SPL-R5](https://github.com/Sneed-Group/sneedium/blob/master/LICENSE.md)
## Disclaimer ## Disclaimer
"Insider's Look" builds are outdated and meant for people who are just testing core functionality by default, and aren't interested in changes! If you want changes, compile it or download the new binaries. "Insider's Look" builds are outdated. If you want changes, compile it or download the new binaries.
## What is Privacy Redirection Technology (PRT)? ## What is Privacy Redirection Technology (PRT)?
This is a simple technology that replaces a bad URL with a more privacy friendly service, when we know that ADs aren't 100% blocked, or just to provide a better UX. TLDR: Clickjacking for good. This is a simple technology that replaces a bad URL with a more privacy friendly service, when we know that ADs aren't 100% blocked, or just to provide a better UX. TLDR: Clickjacking for the greater good.

BIN
download.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

View file

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --> <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'"> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'">
<title>F-Stopium</title> <title>Sneedium</title>
<link href="./styles.css" rel="stylesheet"> <link href="./styles.css" rel="stylesheet">
</head> </head>
<body> <body>
@ -12,15 +12,18 @@
<button id="nwBtn">📄</button> <button id="nwBtn">📄</button>
<input id="txtUrl" placeholder="Put the website here" name="url" type="text" onkeypress="clickPress(event)" /> <input id="txtUrl" placeholder="Put the website here" name="url" type="text" onkeypress="clickPress(event)" />
<button onclick="go(); return false;" id="goBtn"></button> <button onclick="go(); return false;" id="goBtn"></button>
<button onclick="refresh(); return false;" id="refreshBtn">🔄</button>
<button onclick="stop(); return false;" id="stopBtn">🛑</button> <button onclick="stop(); return false;" id="stopBtn">🛑</button>
<button onclick="back(); return false;" id="backBtn">⬅️</button> <button onclick="back(); return false;" id="backBtn">⬅️</button>
<button onclick="forward(); return false;" id="forwardBtn">➡️</button> <button onclick="forward(); return false;" id="forwardBtn">➡️</button>
<button id="camBtn">🎦</button>
</div> </div>
<div id="whProtection">
<tab-group new-tab-button="true" sortable="true"> <tab-group new-tab-button="true" sortable="true">
<webview id="foo" autosize plugins disablewebsecurity></webview> <webview id="foo" autosize plugins disablewebsecurity></webview>
</tab-group> </tab-group>
</div>
<script src="node_modules/electron-tabs/dist/electron-tabs.js"></script> <script src="node_modules/electron-tabs/dist/electron-tabs.js"></script>
<script type="text/javascript" src="./userscript/userscripts.js"></script>
<script type="text/javascript" src="./config.js"></script> <script type="text/javascript" src="./config.js"></script>
<script type="text/javascript" src="./libbrowz.js"></script> <script type="text/javascript" src="./libbrowz.js"></script>
</body> </body>

View file

@ -1,16 +1,19 @@
<!-- This is the Sneedium new tab page. -->
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --> <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'">
<title>F-Stopium works!</title> <title>Sneedium works!</title>
</head> </head>
<body> <body>
<img src="logo.png" align="right" width="20%"/> <img src="logo.png" align="right" width="20%"/>
<h1>Welcome to F-Stopium!</h1> <h1>Welcome to Sneedium!</h1>
<p>Put a list of URLs to userscripts in ./userscript/userscripts.js. It uses a standard JS array format and uses URLs. Config is located at: ./config.js.</p> <p>Welcome to the Sneedium Browser! You can easily compile for for macOS, Windows, and Linux as of the time of writing this. We hope you enjoy this browser as much as we did making it.</br></br>From all of us at Sneed Group.
</p>
</body> </body>
</html> </html>

View file

@ -1,22 +1,69 @@
const userAgents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/128.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edg/120.0.0.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edg/98.0.0.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"
];
function getRandomUserAgent() {
const randomIndex = Math.floor(Math.random() * userAgents.length);
return userAgents[randomIndex];
}
let currentUA = "" // We haven't loaded any websites yet. It should be blank.
let tabGroup = document.querySelector("tab-group"); let tabGroup = document.querySelector("tab-group");
function normalizeUrl(url) {
// Define regex patterns for matching URL schemes and local addresses
const httpPattern = /^http:\/\//i;
const httpsPattern = /^https:\/\//i;
const filePattern = /^file:\/\//i;
const indexPattern = /^index\.html/i;
const localPattern = /^(192\.168|127\.0|localhost)/i;
// Check if the URL already has a valid scheme
if (httpPattern.test(url) || httpsPattern.test(url) || filePattern.test(url) || indexPattern.test(url)) {
return url;
}
// Determine if the URL starts with a local address or needs HTTPS
if (localPattern.test(url)) {
return `http://${url}`;
} else {
return `https://${url}`;
}
}
let url = undefined
let browserFrame = undefined
function go() { function go() {
let browserFrame = tabGroup.getActiveTab().webview currentUA = getRandomUserAgent()
browserFrame = tabGroup.getActiveTab().webview
let browser = tabGroup.getActiveTab() let browser = tabGroup.getActiveTab()
let url = document.getElementById("txtUrl").value url = normalizeUrl(document.getElementById("txtUrl").value)
if (url.includes("youtube.com") || url.includes("youtu.be")) { if (url.includes("youtube.com") || url.includes("youtu.be")) {
url = url.replaceAll("youtube.com", "yewtu.be") url = url.replaceAll("youtube.com", "invidious.nerdvpn.de")
url = url.replaceAll("youtu.be", "yewtu.be") url = url.replaceAll("youtu.be", "invidious.nerdvpn.de")
} else if (url.includes("google.com/?q")) { } else if (url.includes("google.com/search?q") || url.includes("google.com/?q")) {
url = url.replaceAll("google.com/?q", "startpage.com/?q") // Define the URL object
} else if (url.includes("google.com") && !url.includes("maps") && !url.includes("news") && !url.includes("webstore") && !url.includes("mail")) { const serachUrlObj = new URL(url);
url = url.replaceAll("google.com", "startpage.com") //Get query from old url
const query = serachUrlObj.searchParams.get('q');
// Define the pattern for URL replacement
const searchPattern = "https://search.sparksammy.com/search.php?q=!!!QUERY!!!&p=0&t=0";
url = searchPattern.replaceAll("!!!QUERY!!!", query)
} else if (url.includes("https://news.google.com")) { } else if (url.includes("https://news.google.com")) {
url = url.replaceAll("https://news.google.com", "http://68k.news") url = url.replaceAll("https://news.google.com", "http://68k.news")
} else if (url.includes("news.google.com")) { } else if (url.includes("google.com") && !url.includes("maps") && !url.includes("news") && !url.includes("webstore") && !url.includes("drive") && !url.includes("docs") && !url.includes("sheets") && !url.includes("slides") && !url.includes("mail") && !url.includes("webstore") && !url.includes("in") && !url.includes("on") && !url.includes("jp")) {
url = url.replaceAll("news.google.com", "68k.news") url = url.replaceAll("google.com", "search.sparksammy.com")
} }
document.getElementById("txtUrl").value = "" document.getElementById("txtUrl").value = ""
browserFrame.loadURL(url); browserFrame.loadURL(url,
{userAgent: currentUA});
browserFrame.addEventListener('dom-ready', () => { browserFrame.addEventListener('dom-ready', () => {
browserFrame.insertCSS(` browserFrame.insertCSS(`
::-webkit-scrollbar { ::-webkit-scrollbar {
@ -30,11 +77,6 @@ function go() {
tabGroup.getActiveTab().setTitle(title) tabGroup.getActiveTab().setTitle(title)
console.log(title) console.log(title)
}) })
for (let i = 0; i < userscripts.length; i++) {
fetch(userscripts[i]).then( r => r.text() ).then( t => userscripts.executeJavaScript(t)).catch(() => {
console.log("Error loading userscripts! (Did you provide any?)")
})
}
} }
function stop() { function stop() {
@ -52,6 +94,15 @@ function forward() {
browserFrame.goForward() browserFrame.goForward()
} }
function refresh() {
if (typeof url != undefined) {
browserFrame.loadURL(browserFrame.getURL(),
{userAgent: currentUA});
} else {
window.location.reload()
}
}
tabGroup.setDefaultTab({ tabGroup.setDefaultTab({
title: CONF.homepageTitle, title: CONF.homepageTitle,
src: CONF.homepage, src: CONF.homepage,
@ -63,5 +114,4 @@ function clickPress(keyEvent) {
if (keyEvent.keyCode == 13) { if (keyEvent.keyCode == 13) {
go() go()
} }
} }

BIN
logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

144
main.js
View file

@ -1,34 +1,111 @@
// Modules to control application life and create native browser window // Modules to control application life and create native browser window
const {app, BrowserWindow, session, ipcMain} = require('electron') const {app, BrowserWindow, session, ipcMain, systemPreferences} = require('electron')
const path = require('path') const path = require('path')
const fetch = require("cross-fetch") const fetch = require("cross-fetch")
const { ElectronChromeExtensions } = require('electron-chrome-extensions') const { ElectronChromeExtensions } = require('electron-chrome-extensions')
const { ElectronBlocker } = require('@ghostery/adblocker-electron');
const http = require('http');
const fs = require('fs');
const { createProxy } = require('proxy');
const buildChromeContextMenu = require('electron-chrome-context-menu').default
var extensions
var mic
var cam
app.on('web-contents-created', (event, webContents) => {
webContents.on('context-menu', (e, params) => {
const menu = buildChromeContextMenu({
params,
webContents,
openLink: (url, disposition) => {
webContents.loadURL(url)
}
})
menu.popup()
})
})
ipcMain.on('windowmaker', (event, arg) => { ipcMain.on('windowmaker', (event, arg) => {
createWindow(); createWindow();
}) })
ipcMain.on('allowCam', (event, arg) => {
mic = systemPreferences.askForMediaAccess('microphone');
cam = systemPreferences.askForMediaAccess('camera');
})
const proxy = createProxy(http.createServer());
proxy.listen(3129)
//Function to enable AD Blocking...
let blocker = undefined
async function enableGoodies(s) {
blocker = await ElectronBlocker.fromLists(fetch, [
"https://github.com/uBlockOrigin/uAssets/raw/refs/heads/master/filters/ubol-filters.txt",
'https://easylist.to/easylist/easylist.txt',
'https://secure.fanboy.co.nz/fanboy-annoyance.txt',
'https://easylist.to/easylist/easyprivacy.txt',
'https://easylist-downloads.adblockplus.org/antiadblockfilters.txt',
'https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/nocoin.txt',
'https://cdn.jsdelivr.net/gh/hagezi/dns-blocklists@latest/adblock/pro.plus.txt',
"https://github.com/yokoffing/filterlists/raw/refs/heads/main/youtube_clear_view.txt",
"https://pgl.yoyo.org/as/serverlist.php?showintro=0;hostformat=adblock",
"https://github.com/uBlockOrigin/uAssets/raw/refs/heads/master/filters/unbreak.txt",
"https://github.com/uBlockOrigin/uAssets/raw/refs/heads/master/filters/quick-fixes.txt",
"https://github.com/uBlockOrigin/uAssets/raw/refs/heads/master/filters/privacy.txt",
"https://github.com/uBlockOrigin/uAssets/raw/refs/heads/master/filters/badware.txt",
"https://github.com/uBlockOrigin/uAssets/raw/refs/heads/master/filters/filters.txt"
])
blocker.enableBlockingInSession(s);
}
// 0.0.0.0 day fix
const locals = [
'0.0.0.0', '127.0.0.1', '192.168', '.local', '.example', '.staging', 'fe80::', '::1'
];
// Function to check if a URL is restricted
function isLocal(url) {
return locals.some(local => url.includes(local));
}
function createWindow () { function createWindow () {
// Create the browser window. try {
extensions = new ElectronChromeExtensions()
const extensions = new ElectronChromeExtensions({ } catch {
session: session.defaultSession console.log("Creating a new window in the same extension session...")
}) }
const mainWindow = new BrowserWindow({ const mainWindow = new BrowserWindow({
width: 1000, width: 1220,
height: 600, height: 600,
minWidth: 1220,
minHeight: 600,
webPreferences: { webPreferences: {
preload: path.join(__dirname, 'preload.js'), preload: path.join(__dirname, 'preload.js'),
webviewTag: true, webviewTag: true,
devTools: false, devTools: false,
nodeIntegration: true, nodeIntegration: false,
sandbox: true, sandbox: true,
contextIsolation: true contextIsolation: true
} }
}) })
mainWindow.removeMenu() const homePath = app.getPath('home');
const extensionsDir = path.join(homePath, 'SneedExtensions');
if (!fs.existsSync(extensionsDir)) {
fs.mkdirSync(extensionsDir, { recursive: true });
}
const extensionFolders = fs.readdirSync(extensionsDir, { withFileTypes: true })
.filter(dirent => dirent.isDirectory())
.map(dirent => path.join(extensionsDir, dirent.name));
for (const extensionPath of extensionFolders) {
extensions.loadExtension(extensionPath);
}
extensions.addTab(mainWindow.webContents, mainWindow)
mainWindow.setMinimumSize(1000, 300) mainWindow.setMinimumSize(1000, 300)
@ -94,20 +171,42 @@ const regexPatterns = [
return false; return false;
} }
session.defaultSession.setProxy({
proxyRules: 'http=localhost:3129;https=localhost:3129',
proxyBypassRules: '<local>'
})
session.defaultSession.webRequest.onBeforeRequest((details, callback) => { session.defaultSession.webRequest.onBeforeRequest((details, callback) => {
if (containsAD(details.url)) { if (containsAD(details.url)) {
return callback({cancel: true}) return callback({cancel: true})
} }
return callback({})
})
extensions.addTab(mainWindow.webContents, mainWindow) const url = new URL(details.url);
const hostname = url.hostname;
const isLocalDomain = isLocal(hostname);
// Check if the request is to a local domain
if (isLocalDomain) {
// Check if the request is initiated by a remote domain
const initiator = details.initiator ? new URL(details.initiator).hostname : '';
const isInitiatorLocal = isLocal(initiator);
if (initiator && !isInitiatorLocal) {
console.log(`[W] Local domain is being accessed by external source (${initiator}), don't allow!`);
callback({ cancel: true }); // Block request to local domains from remote sources
} else {
//console.log("Local domain is not being accessed by external source, allow..."); // debug
callback({ cancel: false }); // Allow request
}
} else {
//console.log("Request is not to a local domain, allow..."); //debug
callback({ cancel: false }); // Allow non-local requests
}
})
// and load the index.html of the app. // and load the index.html of the app.
mainWindow.loadFile('index.html') mainWindow.loadFile('index.html')
// Open the DevTools.
mainWindow.webContents.openDevTools()
return mainWindow; return mainWindow;
} }
@ -117,6 +216,7 @@ const regexPatterns = [
// Some APIs can only be used after this event occurs. // Some APIs can only be used after this event occurs.
app.whenReady().then(() => { app.whenReady().then(() => {
let x = createWindow() let x = createWindow()
enableGoodies().then()
app.on('activate', function () { app.on('activate', function () {
// On macOS it's common to re-create a window in the app when the // On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open. // dock icon is clicked and there are no other windows open.
@ -128,8 +228,20 @@ app.whenReady().then(() => {
// for applications and their menu bar to stay active until the user quits // for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q. // explicitly with Cmd + Q.
app.on('window-all-closed', function () { app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit() if (process.platform !== 'darwin') { app.quit() }
}) })
// In this file you can include the rest of your app's specific main process // In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here. // code. You can also put them in separate files and require them here.
// Set DNS and enable mic/cam
app.on('ready', () => {
app.configureHostResolver({
mode: 'secure',
dohServers: [
'https://dns9.quad9.net/dns-query',
'https://cloudflare-dns.com/dns-query'
]
});
});

7674
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,14 +1,15 @@
{ {
"name": "fstopium", "name": "sneedium",
"version": "1.0.0", "version": "1.0.0",
"description": "A Electron browser", "description": "A Electron browser",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"start": "electron-forge start", "start": "electron-forge start",
"package": "electron-forge package", "package": "electron-forge package",
"make": "npx electron-packager --platform linux,win32 --arch x64,arm64 ." "make": "npx electron-packager --platform linux,win32 --arch x64,arm64 .",
"make-mac": "npx electron-packager --platform darwin --arch x64,arm64 ."
}, },
"repository": "https://github.com/electron/electron-quick-start", "repository": "https://github.com/Sneed-Group/sneedium",
"keywords": [ "keywords": [
"Electron", "Electron",
"quick", "quick",
@ -16,8 +17,8 @@
"tutorial", "tutorial",
"demo" "demo"
], ],
"author": "FStop Tech", "author": "Sneed Group",
"license": "MIT (Modified)", "license": "SPL-R5",
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "^6.0.5", "@electron-forge/cli": "^6.0.5",
"@electron-forge/maker-deb": "^6.0.5", "@electron-forge/maker-deb": "^6.0.5",
@ -25,14 +26,18 @@
"@electron-forge/maker-rpm": "^6.0.5", "@electron-forge/maker-rpm": "^6.0.5",
"@electron-forge/maker-squirrel": "^6.0.5", "@electron-forge/maker-squirrel": "^6.0.5",
"@electron-forge/maker-zip": "^6.0.5", "@electron-forge/maker-zip": "^6.0.5",
"electron": "^25.4.0", "electron": "^31.0.1",
"electron-forge-maker-appimage": "^24.9.1", "electron-forge-maker-appimage": "^24.6.3",
"electron-packager": "^17.1.1" "electron-packager": "^17.1.2"
}, },
"dependencies": { "dependencies": {
"@ghostery/adblocker": "^2.1.1",
"@ghostery/adblocker-electron": "^2.1.1",
"cross-fetch": "^3.1.5", "cross-fetch": "^3.1.5",
"electron-chrome-context-menu": "^1.1.0",
"electron-chrome-extensions": "^3.10.0", "electron-chrome-extensions": "^3.10.0",
"electron-squirrel-startup": "^1.0.0", "electron-squirrel-startup": "^1.0.1",
"electron-tabs": "^1.0.1" "electron-tabs": "^1.0.1",
"proxy": "^2.2.0"
} }
} }

View file

@ -5,6 +5,14 @@
* *
* https://www.electronjs.org/docs/latest/tutorial/sandbox * https://www.electronjs.org/docs/latest/tutorial/sandbox
*/ */
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electron', {
enforceDomainRestrictions: (url) => ipcRenderer.sendSync('check-domain', url),
});
window.addEventListener('DOMContentLoaded', () => { window.addEventListener('DOMContentLoaded', () => {
const replaceText = (selector, text) => { const replaceText = (selector, text) => {
const element = document.getElementById(selector) const element = document.getElementById(selector)
@ -12,15 +20,24 @@ window.addEventListener('DOMContentLoaded', () => {
} }
for (const type of ['chrome', 'node', 'electron']) { for (const type of ['chrome', 'node', 'electron']) {
replaceText(`${type}-version`, process.versions[type]) replaceText(`${type}-version`, 'sneedium-version')
} }
const { ipcRenderer } = require('electron')
ipcRenderer.on('windowmaker', (event, arg) => { ipcRenderer.on('windowmaker', (event, arg) => {
console.log(arg) // prints "pong" console.log(arg)
})
ipcRenderer.on('allowCam', (event, arg) => {
console.log(arg)
}) })
//button and its event listener //button and its event listener
const makeWindowButton = document.getElementById('nwBtn'); const makeWindowButton = document.getElementById('nwBtn');
makeWindowButton.addEventListener('click', () => { makeWindowButton.addEventListener('click', () => {
ipcRenderer.send('windowmaker', 'ping') ipcRenderer.send('windowmaker', 'ping')
}) })
const camButton = document.getElementById('camBtn');
camButton.addEventListener('click', () => {
ipcRenderer.send('allowCam', 'ping')
})
}) })

View file

@ -5,3 +5,5 @@
* `contextIsolation` is turned on. Use the contextBridge API in `preload.js` * `contextIsolation` is turned on. Use the contextBridge API in `preload.js`
* to expose Node.js functionality from the main process. * to expose Node.js functionality from the main process.
*/ */
require('electron-chrome-extension/preload');

1
sneedium-maker-mac.sh Normal file
View file

@ -0,0 +1 @@
npm run make-mac

10
sneedium-maker.sh Executable file
View file

@ -0,0 +1,10 @@
y=$(date +%Y)
read -p "Sneedium # of year $y (1,2,3,4...):" v
npm run make
mkdir "Sneedium $y.$v"
mv sneedium-linux-* "Sneedium $y.$v"
mv sneedium-win32-* "Sneedium $y.$v"
tar -czvf "Sneedium $y.$v.tar.gz" "Sneedium $y.$v"
rm -rf "Sneedium $y.$v"
mkdir ~/sneedium-bins
mv "Sneedium $y.$v.tar.gz" ~/sneedium-bins

View file

@ -33,6 +33,17 @@ body {
font-size: 1.25rem; font-size: 1.25rem;
} }
#camBtn {
background-color: #a6b70d; /* Gold */
border: none;
color: white;
padding: 1% 1%;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 1.25rem;
}
#goBtn { #goBtn {
background-color: #4CAF50; /* Green */ background-color: #4CAF50; /* Green */
border: none; border: none;
@ -78,6 +89,17 @@ body {
font-size: 1.25rem; font-size: 1.25rem;
} }
#refreshBtn {
background-color: #507fac; /* Aqua */
border: none;
color: white;
padding: 1% 1%;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 1.25rem;
}
#txtUrl { #txtUrl {
border: none; border: none;
padding: 1% 1%; padding: 1% 1%;
@ -89,17 +111,30 @@ body {
} }
html, body { html, body {
height: 98%;
width: 100%; width: 100%;
justify-content: center; /* Center horizontally */
align-items: center; /* Center vertically */
}
html, body {
height: 100%; height: 100%;
margin: 0;
}
#whProtection {
width: 100%; /* % of viewport width */
height: 100%; /* % of viewport height */
border: 2vw solid rgb(70, 70, 70); /* Border color and thickness */
box-sizing: border-box;
display: block;
overflow: scroll;
} }
webview { webview {
position: absolute; width: 100%;
top: 0; height: 100%;
left: 0; border: none;
max-height: 90% !important; box-sizing: border-box; /* Ensures any padding or border inside the webview is included in the total size */
max-width: 100%; display: block; /* Ensure it behaves as a block element */
width: 1rem;
height: 90% !important;
display: inline-flex !important;
} }

View file

@ -1 +0,0 @@
var userscripts = [""]