62 Commits
1.25 ... 0.41

Author SHA1 Message Date
idk
3d4a49827f Merge pull request #18 from eyedeekay/annoying-windows
plan document, don't open a new window automatically, just a tab
2019-10-31 12:24:25 -04:00
idk
fa579b8586 plan document, don't open a new window automatically, just a tab 2019-10-31 12:22:19 -04:00
idk
58b91e1a80 Merge pull request #17 from eyedeekay/webrtc
Webrtc
2019-10-28 01:17:26 -04:00
idk
997689806b add webrtc enable disable option, purge chrome, reformat 2019-10-28 01:12:40 -04:00
idk
df4d9e93a6 add option to re-enable WebRTC 2019-10-28 01:11:16 -04:00
idk
6cd37b51c0 Start working on the i2pcontrol messaging feature 2019-10-17 18:54:39 -04:00
idk
924dd29323 new AMO release 2019-10-17 00:00:55 -04:00
idk
c92c0caa0f Merge pull request #13 from eyedeekay/roadmap
Roadmap
2019-10-17 00:00:13 -04:00
idk
b278450aea New AMO Release 2019-10-16 23:59:12 -04:00
idk
1f014dd37e new roadmap 2019-10-16 19:45:16 -04:00
idk
a87722b6fc Merge pull request #12 from eyedeekay/video
add screencap
2019-10-16 19:11:33 -04:00
idk
c0ea4df7ec add screencap 2019-10-16 19:10:24 -04:00
idk
3a2fca2f26 Merge pull request #11 from eyedeekay/contextual-ids
Contextual ids
2019-10-16 17:31:57 -04:00
idk
ec1f547f09 remove the hazardous logging 2019-10-16 17:29:21 -04:00
idk
d1643e8c71 be more precise about cleaning history and stuff 2019-10-16 17:24:02 -04:00
idk
52f695691c be more precise about cleaning history and stuff 2019-10-16 15:48:06 -04:00
idk
1619181fc9 be more precise about cleaning history and stuff 2019-10-16 15:47:26 -04:00
idk
fa3c94b736 be more precise about cleaning history and stuff 2019-10-16 15:31:30 -04:00
idk
c61aa13ffc Merge pull request #8 from eyedeekay/contextual-ids
WIP: "I2P In Private Browsing Mode"
2019-10-09 19:53:50 -04:00
idk
ab0282bde9 bump 2019-10-09 17:56:29 -04:00
idk
86913e18d3 releasey goodness 2019-10-09 17:48:38 -04:00
idk
c4a2fa6ec0 releasey goodness 2019-10-08 19:10:13 -04:00
idk
14b246fc00 fix the deb 2019-10-07 23:48:15 -04:00
idk
577c10aee7 Change color on non-i2p tabs 2019-10-07 22:51:53 -04:00
idk
a51fd5ffa7 force .i2p domains into i2p browsing context 2019-10-07 21:26:52 -04:00
idk
08eeb054c3 force .i2p domains into i2p browsing context 2019-10-07 20:52:03 -04:00
idk
af08c3d800 force .i2p domains into i2p browsing context 2019-10-07 18:45:52 -04:00
idk
e6f1fbbe8b undo wrong change 2019-10-06 22:11:23 -04:00
idk
73943f9d43 fmt 2019-10-06 15:18:10 -04:00
idk
1edd41900f work on format 2019-10-06 15:14:53 -04:00
idk
b9d6171c8d Scrub user-agent in contextual identity 2019-10-06 13:58:26 -04:00
idk
00dd8fe597 Scrub user-agent in contextual identity 2019-10-06 13:56:50 -04:00
idk
556e797945 I2P in Private Browsing Mode has Liftoff! 2019-10-06 13:38:11 -04:00
idk
32997bdf68 Also going to do safe router console access in this branch. 2019-09-28 22:30:45 -04:00
idk
2ae30167ab merge master? 2019-09-28 21:59:44 -04:00
idk
3febeb5214 merge branch master 2019-09-25 01:50:03 -04:00
idk
5b554df40a Merge pull request #7 from eyedeekay/debian
Debian
2019-09-25 01:32:10 -04:00
idk
48068f24fa use the better base image 2019-09-25 00:52:16 -04:00
idk
7dd7a43686 use the better base image 2019-09-25 00:21:16 -04:00
idk
9716fd793d fix some basic lintian stuff, leave some other stuff because later is probably better on these ones 2019-09-24 22:47:10 -04:00
idk
ae6a543df5 fix some basic lintian stuff, leave some other stuff because later is probably better on these ones 2019-09-24 22:44:56 -04:00
idk
608b344c45 build it as a debian package and then test circleci 2019-09-24 22:33:30 -04:00
idk
3bda43a77d Try and get a debian-style package started 2019-08-01 00:39:03 -04:00
idk
222e3b442b save for now 2019-07-21 14:00:07 -04:00
idk
6d5b2217cb it almost knows how to change I2P identity based on contextual identity 2019-07-13 22:07:24 -04:00
idk
a6860e50be a little closer to tab-driven private browsing with i2p, re-write user agents globally 2019-07-12 02:21:14 -04:00
idk
918bb09226 Fix theming 2019-07-10 02:29:38 -04:00
idk
3b6fbd6ef1 start a contextual identity aware branch 2019-07-10 01:25:02 -04:00
idk
b42ec59d41 start a contextual identity aware branch 2019-07-10 00:47:30 -04:00
idk
6a09985b26 more chromium stuff 2019-06-29 01:47:13 -04:00
idk
769f592973 more chromium stuff 2019-06-29 01:43:16 -04:00
idk
24bde39e49 chromium compatibility 2019-06-29 00:49:59 -04:00
idk
27ba4aee8b chromium compatibility 2019-06-29 00:44:15 -04:00
idk
1b7c8fc520 set up chromium polyfill 2019-06-29 00:32:03 -04:00
idk
8a5883ba65 release prep 2019-06-28 22:50:54 -04:00
idk
c271760715 improve fomatting, add better socks defaults and enforce them 2019-06-27 15:40:43 -04:00
idk
3922f992e7 Socks defaults sanity 2019-06-24 19:20:54 -04:00
idk
d4070b345f add experiments folder 2019-06-19 10:44:17 -04:00
idk
f209af2897 update readme 2019-06-19 10:44:03 -04:00
idk
90be862c74 fix android issue 2019-06-17 19:17:11 -04:00
idk
7a3304c5f0 fix version ordering, 1.26 2019-05-03 18:58:03 -04:00
idk
bc47a48492 self-distributed version 2019-05-03 18:46:07 -04:00
40 changed files with 3359 additions and 839 deletions

12
.circleci/config.yml Normal file
View File

@@ -0,0 +1,12 @@
version: 2
jobs:
build:
docker:
- image: eyedeekay/builders
steps:
- checkout
- run:
name: Build
command: make zip

112
Makefile
View File

@@ -1,56 +1,92 @@
PREFIX:=/usr
default: zip
install: uninstall
mkdir -p /usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/
cp -rv options /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/options
cp -rv icons /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/icons
cp -rv _locales /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/_locales
cp background.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp proxy.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp info.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp content.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp info.css /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp window.html /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp manifest.json /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/
cp README.md /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp LICENSE /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
ln -sf /usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2psetproxy.js@eyedeekay.github.io
mkdir -p $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
cp -r ./chromium/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./icons/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./_locales/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./options/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.js $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.html $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.css $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.md $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.xpi $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./manifest.json $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./LICENSE $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
ln -s $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
uninstall:
rm -rf /usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2psetproxy.js@eyedeekay.github.io
rm -rf $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
clobber:
ls:
ls -lah $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io; \
ls -lah $(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
clean:
rm -f ../i2psetproxy.js.zip ../i2p_proxy*.xpi
VERSION=1.24
## EVEN RELEASES are AMO RELEASES
## ODD RELEASES are SELFHOSTED RELEASES
MOZ_VERSION=0.38
VERSION=0.39
VERSION=$(MOZ_VERSION)
#VERSION=1.27
xpi:
mv ~/Downloads/i2p_proxy-$(VERSION)-an+fx.xpi ../i2psetproxy.js@eyedeekay.github.io.xpi
cp:
cp ../i2psetproxy.js@eyedeekay.github.io.xpi ./i2psetproxy.js@eyedeekay.github.io.xpi
wget -O ../i2ppb@eyedeekay.github.io.xpi \
https://addons.mozilla.org/firefox/downloads/file/3419789/i2psetproxyjs-$(MOZ_VERSION)-an+fx.xpi
cp ../i2ppb@eyedeekay.github.io.xpi ./i2ppb@eyedeekay.github.io.xpi
version:
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
zip: version
zip --exclude="./i2psetproxy.js@eyedeekay.github.io.xpi" \
--exclude="i2psetproxy.js.png" -r -FS ../i2psetproxy.js.zip *
profile-install:
cp ./i2psetproxy.js@eyedeekay.github.io.xpi $(HOME)/.mozilla/firefox/firefox.profile.i2p/firefox.profile.i2p/extensions
cp ./i2psetproxy.js@eyedeekay.github.io.xpi $(HOME)/.mozilla/firefox/.firefox.profile.i2p.default/extensions
sudo cp ./i2psetproxy.js@eyedeekay.github.io.xpi /usr/local/lib/firefox.profile.i2p/firefox.profile.i2p/extensions/
pi: profile-install
DESC="A simple plugin for configuring an i2p browser."
zip --exclude="./i2ppb@eyedeekay.github.io.xpi" \
--exclude="./i2psetproxy.js@eyedeekay.github.io.xpi" \
--exclude="./i2psetproxy.js.png" \
--exclude="./i2psetproxy.js.gif" \
--exclude="./.git" -r -FS ../i2psetproxy.js.zip *
release:
gothub release -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d $(DESC)
cat desc | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -
upload:
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js@eyedeekay.github.io.xpi" -f "../i2psetproxy.js@eyedeekay.github.io.xpi"
delete-release:
gothub delete -u eyedeekay -r i2psetproxy.js -t $(VERSION); true
recreate-release: delete-release release upload
upload: upload-xpi upload-deb
upload-xpi:
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
upload-deb:
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
lib: libpolyfill
libpolyfill:
wget -O chromium/browser-polyfill.js https://unpkg.com/webextension-polyfill/dist/browser-polyfill.js
fmt:
find . -path ./node_modules -prune -o -name '*.js' -exec prettier --write {} \;
deborig:
rm -rf ../i2psetproxy.js-$(VERSION)
cp -r . ../i2psetproxy.js-$(VERSION)
tar \
-cvz \
--exclude=.git \
--exclude=i2psetproxy.js.gif \
-f ../i2psetproxy.js_$(VERSION).orig.tar.gz \
.
deb: deborig
cd ../i2psetproxy.js-$(VERSION) && debuild -us -uc -rfakeroot

70
PLAN.md Normal file
View File

@@ -0,0 +1,70 @@
The I2P Browser has made strides at improving users anonymity when browsing
the anonymous web inside of I2P. However, it has in many ways simply re-hashed
the existing work of Tor on the Tor Browser. This is mostly a good thing, but it
is unfortunate because in a sense we have failed to add I2P specific features
that could improve the user experience and set us apart from the Tor Browser.
I think that moving forward, we should try to extend the functionality of I2P
Browser into more I2P-specific realms and make an effort to make those things
more accessible and highlight that they are in use. I don't really know how to
explain what I mean without describing what I want to do, so
Let's avoid *adding* features to i2pbutton
------------------------------------------
i2pbutton contains alot of code from Tor which even they don't really want to
maintain. It's dying the same long, slow death it's always been dying, since
back before there was a Tor Browser and torbutton was just an easy way to
configure Tor in your Firefox browser. I don't relish the thought of being one
the last two groups on the planet maintaining an XUL extension, so I think that
we should always be trying to do less with i2pbutton and more with a modern
extension. Other advantages of modern extensions are better debugging tools
and easier-to-use, more understandable API's for doing the following other
things.
Contexts for Security and Placing Router Applications under their own Origin
----------------------------------------------------------------------------
It is possible, however unlikely, for an attack on a local service or a router
plugin to leak information about what's going on on the router console because
they will share the same origin. We can resolve this issue, though, by placing
applications each into their own origin under a so-called "Container Tab,"
completely separating eepWeb traffic and Router Console administration. The
origin of the application will be the same as the part of the application URL
*after* localhost:7657, so for instance "http://localhost:7657/torrents"
would become just "torrents" in the URL bar and have that origin.
Dynamic Themes
--------------
Since I2P Browsing and Router Console Administration are going to be separated
to their own contextual identities, we can manipulate the appearance of the
Firefox browser to accomplish 2 things: We can indicate which context we are in
both by manipulating the UI text and color, and manipulate UI elements based on
what context we're in or even what URL(In the router console) we're on. We can
use this to make router console applications appear more tightly integrated with
the functionality of the browser. It's kind of obliquely like how many
applications are written with user-interfaces that are actually just
browsers(Including Mattermost), but with us using the whole browser,
acknowledging it's presence and utility but quite literally highlighting(in
color) our unique features. So for instance, when the user is using snark it
could change color to match snark and change text to say "Torrent Client."
Application Integration - Torrents
----------------------------------
I2P's strengths are in it's applications, but many users never even make it to
the applications, and even if they do, the I2P applications often lack the
familiar workflows that people are used to. For instance, when one downloads
a torrent on the non-anonymous internet, you simply click a link and the browser
"Handles" the link, automatically launching the torrent client, adding the
torrent, and sometimes prompting the user for more actions. This isn't possible
yet with i2psnark and an external browser, but in I2P browser we can write a
"Protocol Handler" which talks to snark-rpc, replicating the ease of just
clicking a torrent link to automatically add it to a torrent client. Of course
that does require us to bundle the snark-rpc plugin. Besides that, once we've
added the torrent, we can keep talking to snark-rpc to keep track of the
download progress and display information about that in the already-available
Firefox downloads menu that users are already familiar with, so that they can
keep track of the files they are downloading after navigating away from the
snark interface, or perhaps even without needing to interact with snark at all.

153
README.md
View File

@@ -1,68 +1,103 @@
i2psetproxy.js
==============
WebExtension that does extended configuration of a dedicated i2p browser. It's
still not good enough to use on it's own, and should be combined with the Tor
Browser or the I2P Firefox Profile for now.
WebExtension that does extended configuration of a dedicated I2P browser. While
**experimental**, it's capable of enforcing the use of the I2P Proxy without
needing to touch about:config and disables several
fingerprinting/de-anonymization vectors on it's own. It is also the easiest way
to configure an I2P browser on Android without requiring the user to root their
device.
Features
--------
The Old Version
---------------
* [done] **Indicate** the i2p browser is in use visually
* [done] **Set** the http proxy to use the local i2p proxy
* [done] **Disable** risky webRTC features
* [done] **Change** the color of the browser window to indicate that i2p is in use
* [done-ish] **Reset** the HTTP Proxy tunnel to generate a new destination on-demand
* it does this by working in conjunction with this [standalone HTTP proxy](https://github.com/eyedeekay/httptunnel), currently disabled*
New versions of this extension create an I2P in Private Browsing mode instead.
Since this is a drastic change to the behavior of the old plugin, a new entry
for the new plugin has been made at a new location on addons.mozilla.org.
* This is the new version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/)
* This is the old version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/)
Android usage:
--------------
Open the following link
[Github Releases Version](https://github.com/eyedeekay/i2psetproxy.js/releases/)
in the browser you want to use for I2P. Firefox will warn you that it is about
to install an extension and indicate the permissions required. Read them over
and when you're ready, accept them. That's all it should take, your browser is
now configured to use I2P.
### addons.mozilla.org
If you would prefer to recieve automatic updates from AMO, the correct product
page for this plugin is
[I2P In Private Browsing](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/).
This absolutely requires a working outproxy. If you want to avoid the use of AMO
for updates, you can download the identical plugin from this repository's
releases page. The latest AMO Plugin will always be identical to the latest
github release, except for the version number, which must be incremented for
submission to AMO.
### Features
* [done] **Provide** a way to launch into an I2P-Specific contextual identity
(container). Intercept requests to .i2p domains and automatically route them
to the I2P container. Isolate the router console from other local
applications by automatically intercepting requests to the router console to
another container.
* [done/wip] **Indicate** the I2P browser is in use visually. Find an
acceptable way to indicate it on Android.
* [done] **Set** the http proxy to use the local I2P proxy automatically.
Provide specific configuration for other types of I2P proxies(SOCKS,
isolating HTTP)
* [done/wip] **Disable** risky webRTC features/offer the option to re-enable
them with the proxy enforced.
* [done] **Change** the color of the browser window to indicate that I2P is in
use
* [done-ish] **Reset** the HTTP Proxy tunnel to generate a new destination
on-demand
* it does this by working in conjunction with this
[standalone HTTP proxy](https://github.com/eyedeekay/httptunnel), currently
disabled*.
* [ready] **Provide** help in a variety of languages.
* [wip] **Monitor** the health and readiness of the I2P router it is
instructed to use.
* [1/2] **Handle** router console applications under their own origins and
within their own contextual identity. (1) The router console is automatically
confined to it's own container tab. (2) Use a custom protocol handler to
place each i2p application/plugin under it's own origin, shortening router
console URL's and placing applications under their own origin.
* [not started] **Handle Torrents** by talking to i2psnark-rpc plugin and then
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
can.
Usage with standalone HTTP Proxy
--------------------------------
This functionality is currently disabled.
I developed a simple HTTP proxy that can be used with this extension to enable the
user to initiate a re-start of the HTTP proxy tunnel, with a new set of keys and a
new destination. This, combined with re-setting the browser settings back to the
original defaults(which is also done by the HTTP Proxy when re-initiated), amounts
to a "Fresh Identity" feature for the I2P browser.
Before you begin, get the [Standalone HTTP proxy from here](http://github.com/eyedeekay/httptunnel)
and run it like so:
httpproxy -littleboss=start
You can also use 'go get'
go get -u github.com/eyedeekay/httptunnel/httpproxy
If you change the default host and port, you will need to alter the following guide.
In order to use it with the custom HTTP proxy, open the "Add-On's" menu and select
the options for the i2psetproxy.js plugin. Change the "Proxy" configuration from
Host: 127.0.0.1
Port: 4444
to
Host: 127.0.0.1
Port: 7950
and change the "Control" configuration from:
Host: 127.0.0.1
Port: 4444
to
Host: 127.0.0.1
Port: 7951
Now, when you press the Toopie button in the toolbar, you will see in the output
of the HTTP proxy that it has been re-started.
Screenshot
----------
### Screenshot
![Visiting i2p-projekt.i2p](i2psetproxy.js.png)
![Video of the plugin in action](i2psetproxy.js.gif)
Super Extra Important Background Info:
--------------------------------------
This plugin's viability is directly related to the viability of Mozilla and
Tor's work on hardening Firefox itself and of particular interest are the
"Uplift" and "Fusion(Firefox Using Onions)" projects.
### Links about Project Uplift
* https://wiki.mozilla.org/Security/Tor_Uplift
* https://wiki.mozilla.org/Security/FirstPartyIsolation
* https://wiki.mozilla.org/Security/Fingerprinting
* https://wiki.mozilla.org/Security/Fennec%2BTor_Project
* https://wiki.mozilla.org/Security/Tor_Uplift/Tracking
Project uplift seems to have largely been accomplished?
### Links about Project Fusion
* https://wiki.mozilla.org/Security/Fusion
* https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject
* https://blog.torproject.org/tor-heart-firefox

View File

@@ -1,6 +1,6 @@
{
"extensionName": {
"message": "i2psetproxy.js",
"message": "I2P In Private Browsing",
"description": "Name of the extension."
},
"extensionDescription": {

View File

@@ -1,180 +0,0 @@
/*******************************************************
** Proxy Auto Configure Script with I2P Host Detection.
**
** Author: Cervantes
** License: Public Domain
** Date: 11 May 2004
**
** Revised: 07 Sep 2004
** Changes:
** Proxy recursion disabled by default (strict)
** Password Authentication for session commands
** Support for http://path?i2paddresshelper=BASE64
** Support for http://i2p/BASE64/path syntax
** Revised: 17 May 2004
** Changes:
** Ability for the user to control the proxy
** status on a per browser-session basis.
********************************************************/
/* C O N F I G U R A T I O N
*/
/* Replace normal with "PROXY yourproxy:port" if you run
** behind a Proxy Server by default.
*/
var normal = "DIRECT";
/* Specify the I2P proxy connection details here.
*/
var i2pProxy = "PROXY 127.0.0.1:7950";
/* Set the default status of proxy detection here:
**
**
** [1] "auto" => Proxy will be used automatically if
** '-> an ".i2p" url is detected.
** '-> You will only be anonymous for ".i2p" domains.
**
** [2] "on" => Proxy is enabled all the time. (safest)
** '-> NB. Normal web available only via
** '-> i2p outproxies.
** '-> You can be fairly confident of anonymity.
**
** [3] "off" => Completely Bypass the proxy and therefore i2p.
** '-> no i2p sites will be accessible...
** '-> ...your browsing habits can potentially
** '-> be traced back to you!
**
*/
var proxyStatus = "on";
/* By setting statusKeyword to "all" you can set these options at runtime
** for the duration of the browser session by entering special commands
** into your browser address bar.
**
** Due to limitations in the way proxy scripting works, a malicious site
** could change your status mode by linking to command keywords...
** eg. <img src="i2p.off" ...
** This is why the default setting for statusKeyword is "limited", which only
** allows you to set the proxy status to "on". See also keywordAuthPassword.
**
** [1] "all" => All proxy status urls are available.
** '-> i2p.on, i2p.off, i2p.auto (respective to proxyStatus settings)
** '-> WARNING: Setting "all" is a big risk to your anonymity!
** '-> In this mode it is highly recommended you set an AuthPassword too!
**
** [2] "limited" => Only i2p.on is available..
** '-> This setting lasts for the duration of the browser setting.
** '-> You have to close your browser in order to revert to
** '-> your default proxyStatus configuration.
**
** [3] "off" => No command urls available.
** '-> The status mode can only be altered by editing the above
** '-> proxyStatus setting. (safest)
**
*/
var statusKeyword = "on";
/*
** By default if proxyStatus is set to "auto" the config script
** will fall back to your normal connection settings if the
** i2p proxy is offline. This is handy for browsing your locally
** hosted eepsites when your router is not running (for instance).
** However this can mean that requests to external eepsites could
** be forwarded to the outweb and potentially compromise some of
** your rights to anonymity.
** Setting "true" here enables strict mode where all requests to ".i2p"
** sites will be rejected if the i2p proxy is offline. (safest)
*/
var strict = true;
/*
** By setting an authentication password, all activated session keywords
** will require the addition of a password to prevent malicious sites from
** hijacking your proxy settings. ie. <img src="i2p.off" ...
** Users should append whatever they set here to any command keywords
** they use.
** eg. i2p.on.passw0rd
** If left blank, authentication is ignored - it is recommended that
** you use "limited" statusKeyword mode if you choose not to require a password.
** If you do require this feature then you should replace the default "passw0rd" with
** one of your own (recommend at least 8 letters with a case-sensitive alpha-numeric
** mix of characters).
**
*/
var keywordAuthPassword = "passw0rd";
/* E N D C O N F I G U R A T I O N
*/
/* Allows the proxy to fallback on "normal" settings
** '-> if the i2p router is offline.
*/
if (strict == false) {
i2pProxy = i2pProxy + "; " + normal;
}
/*Check for User Authentication Password.
*/
if (keywordAuthPassword != "") {
keywordAuthPassword = "." + keywordAuthPassword;
}
/* This function gets called every time a url is submitted
*/
function FindProxyForURL(url, host) {
/* checks for a special command url that
** '-> changes the status of the proxy script.
*/
if (statusKeyword != "off") {
if (host == "i2p.off" + keywordAuthPassword && statusKeyword == "all") {
/*Proxy is bypassed - outweb available only
*/
proxyStatus = "off";
} else if (host == "i2p.auto" + keywordAuthPassword && statusKeyword == "all") {
/* Proxy is used only for .i2p hosts otherwise
** '-> browse as normal.
*/
proxyStatus = "auto";
} else if (host == "i2p.on" + keywordAuthPassword && (statusKeyword == "limited" ||
statusKeyword == "all" )) {
/* Only I2P traffic is accepted.
*/
proxyStatus = "on";
}
}
if (proxyStatus == "off") {
/* Proxy is completely bypassed.
*/
return normal;
} else if (proxyStatus == "on") {
/* All requests are forward to the proxy.
*/
return i2pProxy;
}
host = host.toLowerCase();
/* check tld for "i2p" or oOo's new "i2paddresshelper" syntax - if found then redirect
** '-> request to the i2p proxy
*/
if (url.match(/^http:\/\/i2p\/[a-zA-Z0-9\-\~]{516}|i2paddresshelper=/i) ||
shExpMatch(host, "*.i2p")) { // seems more reliable than:
return i2pProxy; // dnsDomainIs(host, ".i2p") ||
} else { // i2pRegex.test(host)
return normal;
}
}

View File

@@ -1,180 +0,0 @@
/*******************************************************
** Proxy Auto Configure Script with I2P Host Detection.
**
** Author: Cervantes
** License: Public Domain
** Date: 11 May 2004
**
** Revised: 07 Sep 2004
** Changes:
** Proxy recursion disabled by default (strict)
** Password Authentication for session commands
** Support for http://path?i2paddresshelper=BASE64
** Support for http://i2p/BASE64/path syntax
** Revised: 17 May 2004
** Changes:
** Ability for the user to control the proxy
** status on a per browser-session basis.
********************************************************/
/* C O N F I G U R A T I O N
*/
/* Replace normal with "PROXY yourproxy:port" if you run
** behind a Proxy Server by default.
*/
var normal = "DIRECT";
/* Specify the I2P proxy connection details here.
*/
var i2pProxy = "PROXY 127.0.0.1:4444";
/* Set the default status of proxy detection here:
**
**
** [1] "auto" => Proxy will be used automatically if
** '-> an ".i2p" url is detected.
** '-> You will only be anonymous for ".i2p" domains.
**
** [2] "on" => Proxy is enabled all the time. (safest)
** '-> NB. Normal web available only via
** '-> i2p outproxies.
** '-> You can be fairly confident of anonymity.
**
** [3] "off" => Completely Bypass the proxy and therefore i2p.
** '-> no i2p sites will be accessible...
** '-> ...your browsing habits can potentially
** '-> be traced back to you!
**
*/
var proxyStatus = "on";
/* By setting statusKeyword to "all" you can set these options at runtime
** for the duration of the browser session by entering special commands
** into your browser address bar.
**
** Due to limitations in the way proxy scripting works, a malicious site
** could change your status mode by linking to command keywords...
** eg. <img src="i2p.off" ...
** This is why the default setting for statusKeyword is "limited", which only
** allows you to set the proxy status to "on". See also keywordAuthPassword.
**
** [1] "all" => All proxy status urls are available.
** '-> i2p.on, i2p.off, i2p.auto (respective to proxyStatus settings)
** '-> WARNING: Setting "all" is a big risk to your anonymity!
** '-> In this mode it is highly recommended you set an AuthPassword too!
**
** [2] "limited" => Only i2p.on is available..
** '-> This setting lasts for the duration of the browser setting.
** '-> You have to close your browser in order to revert to
** '-> your default proxyStatus configuration.
**
** [3] "off" => No command urls available.
** '-> The status mode can only be altered by editing the above
** '-> proxyStatus setting. (safest)
**
*/
var statusKeyword = "off";
/*
** By default if proxyStatus is set to "auto" the config script
** will fall back to your normal connection settings if the
** i2p proxy is offline. This is handy for browsing your locally
** hosted eepsites when your router is not running (for instance).
** However this can mean that requests to external eepsites could
** be forwarded to the outweb and potentially compromise some of
** your rights to anonymity.
** Setting "true" here enables strict mode where all requests to ".i2p"
** sites will be rejected if the i2p proxy is offline. (safest)
*/
var strict = true;
/*
** By setting an authentication password, all activated session keywords
** will require the addition of a password to prevent malicious sites from
** hijacking your proxy settings. ie. <img src="i2p.off" ...
** Users should append whatever they set here to any command keywords
** they use.
** eg. i2p.on.passw0rd
** If left blank, authentication is ignored - it is recommended that
** you use "limited" statusKeyword mode if you choose not to require a password.
** If you do require this feature then you should replace the default "passw0rd" with
** one of your own (recommend at least 8 letters with a case-sensitive alpha-numeric
** mix of characters).
**
*/
var keywordAuthPassword = "passw0rd";
/* E N D C O N F I G U R A T I O N
*/
/* Allows the proxy to fallback on "normal" settings
** '-> if the i2p router is offline.
*/
if (strict == false) {
i2pProxy = i2pProxy + "; " + normal;
}
/*Check for User Authentication Password.
*/
if (keywordAuthPassword != "") {
keywordAuthPassword = "." + keywordAuthPassword;
}
/* This function gets called every time a url is submitted
*/
function FindProxyForURL(url, host) {
/* checks for a special command url that
** '-> changes the status of the proxy script.
*/
if (statusKeyword != "off") {
if (host == "i2p.off" + keywordAuthPassword && statusKeyword == "all") {
/*Proxy is bypassed - outweb available only
*/
proxyStatus = "off";
} else if (host == "i2p.auto" + keywordAuthPassword && statusKeyword == "all") {
/* Proxy is used only for .i2p hosts otherwise
** '-> browse as normal.
*/
proxyStatus = "auto";
} else if (host == "i2p.on" + keywordAuthPassword && (statusKeyword == "limited" ||
statusKeyword == "all" )) {
/* Only I2P traffic is accepted.
*/
proxyStatus = "on";
}
}
if (proxyStatus == "off") {
/* Proxy is completely bypassed.
*/
return normal;
} else if (proxyStatus == "on") {
/* All requests are forward to the proxy.
*/
return i2pProxy;
}
host = host.toLowerCase();
/* check tld for "i2p" or oOo's new "i2paddresshelper" syntax - if found then redirect
** '-> request to the i2p proxy
*/
if (url.match(/^http:\/\/i2p\/[a-zA-Z0-9\-\~]{516}|i2paddresshelper=/i) ||
shExpMatch(host, "*.i2p")) { // seems more reliable than:
return i2pProxy; // dnsDomainIs(host, ".i2p") ||
} else { // i2pRegex.test(host)
return normal;
}
}

View File

@@ -1,57 +1,167 @@
chrome.windows.onCreated.addListener(themeWindow);
function onGot(contexts) {
var ids = [];
for (let context of contexts) {
console.log(`Name: ${context.name}`);
ids.push(context.name);
}
console.log("Checking new contexts");
if (ids.indexOf("i2pbrowser") == -1) {
browser.contextualIdentities
.create({
name: "i2pbrowser",
color: "purple",
icon: "fingerprint"
})
.then(onCreated, onError);
}
if (ids.indexOf("routerconsole") == -1) {
browser.contextualIdentities
.create({
name: "routerconsole",
color: "turquoise",
icon: "briefcase"
})
.then(onCreated, onError);
}
}
function onCreated(context) {
console.log(`New identity's ID: ${context.cookieStoreId}.`);
}
function onError(e) {
console.error(e);
}
browser.contextualIdentities.query({}).then(onGot, onError);
if (!isDroid()) {
chrome.windows.onCreated.addListener(themeWindow);
chrome.windows.onFocusChanged.addListener(themeWindow);
chrome.windows.onRemoved.addListener(themeWindow);
chrome.tabs.onUpdated.addListener(themeWindowByTab);
chrome.tabs.onActivated.addListener(themeWindowByTab);
}
var titlepref = chrome.i18n.getMessage("titlePreface");
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
function themeWindowByTab(tabId) {
function tabWindow(tab) {
getwindow = browser.windows.get(tab.windowId);
getwindow.then(themeWindow);
}
if (typeof tabId === "number") {
tab = browser.tabs.get(tabId);
tab.then(tabWindow);
} else {
tabWindow(tabId);
}
}
function themeWindow(window) {
// Check if the window is in private browsing
if (window.incognito) {
chrome.theme.update(window.id, {
// Check if the window is in private browsing
function logTabs(tabInfo) {
function onGot(context) {
if (context.name == "i2pbrowser") {
console.log("Active in I2P window");
if (window.incognito) {
chrome.theme.update(window.id, {
colors: {
frame: "#A0A0DE",
toolbar: "#A0A0DE",
frame: "#2D4470",
toolbar: "#2D4470"
}
});
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
});
}
else {
chrome.theme.update(window.id, {
});
} else {
chrome.theme.update(window.id, {
colors: {
frame: "#BFA0DE",
toolbar: "#BFA0DE",
frame: "#9DABD5",
toolbar: "#9DABD5"
}
});
chrome.windows.update(window.id, {
titlePreface: titlepref
});
});
}
} else if (context.name == "routerconsole") {
console.log("Active in I2P window");
if (window.incognito) {
chrome.theme.update(window.id, {
colors: {
frame: "#00CED1",
toolbar: "#00CED1"
}
});
} else {
chrome.theme.update(window.id, {
colors: {
frame: "#40E0D0",
toolbar: "#40E0D0"
}
});
}
} else {
console.log("Not active in I2P window");
}
}
if (tabInfo[0].cookieStoreId != "firefox-default") {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onGot, onError);
} else {
chrome.theme.reset(window.id);
}
}
var querying = browser.tabs.query({
currentWindow: true,
active: true
});
querying.then(logTabs, onError);
}
function setTitle(window){
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
});
}
else {
chrome.windows.update(window.id, {
titlePreface: titlepref
});
}
}
function setTitle(window) {
function logTabs(tabInfo) {
console.log(tabInfo);
function setTitleError(window){
alert("plugin error setting title on", window.id)
function onGot(context) {
if (context.name == "i2pbrowser") {
console.log("Active in I2P window");
console.log("Active in I2P window");
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
});
} else {
chrome.windows.update(window.id, {
titlePreface: titlepref
});
}
}
}
if (tabInfo[0].cookieStoreId != "firefox-default")
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onGot, onError);
}
var querying = browser.tabs.query({
currentWindow: true,
active: true
});
querying.then(logTabs, onError);
}
chrome.windows.onCreated.addListener(() => {
const gettingStoredSettings = chrome.storage.local.get();
gettingStoredSettings.then(setupProxy, onError);
//var gettingStoredSettings = chrome.storage.local.get();
//gettingStoredSettings.then(setupProxy, onError);
chrome.storage.local.get(function(got) {
setupProxy();
});
});
chrome.tabs.onCreated.addListener(() => {
const getting = browser.windows.getCurrent({populate: true});
getting.then(setTitle, setTitleError);
var getting = browser.windows.getCurrent({
populate: true
});
getting.then(setTitle, onError);
});

373
chromium/LICENSE Normal file
View File

@@ -0,0 +1,373 @@
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.

1261
chromium/browser-polyfill.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,17 +1,36 @@
var infoTitle = document.getElementById('text-section-header');
var infoTitle = document.getElementById("text-section-header");
infoTitle.textContent = chrome.i18n.getMessage("infoTitle");
var infoMessage = document.getElementById('text-section-helptext');
var infoMessage = document.getElementById("text-section-helptext");
infoMessage.textContent = chrome.i18n.getMessage("infoMessage");
var helpMessage = document.getElementById('window-create-forum-panel');
var helpMessage = document.getElementById("window-create-forum-panel");
helpMessage.textContent = chrome.i18n.getMessage("forumMessage");
/*
var helpMessage = document.getElementById('window-create-help-panel');
helpMessage.textContent = chrome.i18n.getMessage("helpMessage")
*/
var newsMessage = document.getElementById('window-create-news-panel');
var newsMessage = document.getElementById("window-create-news-panel");
newsMessage.textContent = chrome.i18n.getMessage("newsMessage");
var clearData = documents.getElementByID("clear-browser-data")
cleardata.textContent = chrome.i18n.getMessage("clearData");
var clearData = document.getElementById("clear-browser-data");
clearData.textContent = chrome.i18n.getMessage("clearData");
/*
document.addEventListener("click", e => {
browser.runtime.sendMessage({ url: "http://proxy.i2p" });
});
function proxyContent(message) {
var proxyData = document.getElementById("proxy-health");
proxyData.textContent = message;
console.log("Event occurred", message);
}
browser.runtime.onMessage.addListener(proxyContent);
*/
/*
function signalWebRTC(val){
console.log("signal", val)
}
*/

74
context.js Normal file
View File

@@ -0,0 +1,74 @@
//var windowIds = []
function eventHandler(event) {
if (event.target.dataset.action == "create") {
function onCreated(windowInfo) {
console.log(`Created window: ${windowInfo.id}`);
browser.tabs.create({
windowId: windowInfo.id,
url: "about:blank",
cookieStoreId: event.target.dataset.identity
});
}
function onError(error) {
console.log(`Error: ${error}`);
}
var creating = browser.windows.create({
cookieStoreId: event.target.dataset.identity
});
creating.then(onCreated, onError);
}
if (event.target.dataset.action == "close-all") {
browser.tabs
.query({
cookieStoreId: event.target.dataset.identity
})
.then(tabs => {
browser.tabs.remove(tabs.map(i => i.id));
});
}
event.preventDefault();
}
function createOptions(node, identity) {
for (let option of ["Create", "Close All"]) {
let a = document.createElement("a");
a.href = "#";
a.innerText = option;
a.dataset.action = option.toLowerCase().replace(" ", "-");
a.dataset.identity = identity.cookieStoreId;
a.addEventListener("click", eventHandler);
node.appendChild(a);
}
}
var div = document.getElementById("identity-list");
if (browser.contextualIdentities === undefined) {
div.innerText =
"browser.contextualIdentities not available. Check that the privacy.userContext.enabled pref is set to true, and reload the add-on.";
} else {
browser.contextualIdentities
.query({
name: "i2pbrowser"
})
.then(identities => {
if (!identities.length) {
div.innerText = "No identities returned from the API.";
return;
}
for (let identity of identities) {
let row = document.createElement("div");
let span = document.createElement("span");
span.className = "identity";
span.innerText = identity.name;
span.style = `color: ${identity.color}`;
console.log(identity);
row.appendChild(span);
createOptions(row, identity);
div.appendChild(row);
}
});
}

8
debian/README.Debian vendored Normal file
View File

@@ -0,0 +1,8 @@
i2psetproxy.js for Debian
Please edit this to provide information specific to
this i2psetproxy.js Debian package.
(Automatically generated by debmake Version 4.3.1)
-- idk <hankhill19580@gmail.com> Thu, 01 Aug 2019 00:32:39 -0400

19
debian/changelog vendored Normal file
View File

@@ -0,0 +1,19 @@
i2psetproxy.js (0.37-1) UNRELEASED; urgency=low
* Honor contextual ID when deleting history
-- idk <hankhill19580@gmail.com> Thu, 17 OCT 2019 00:52:19 -0400
i2psetproxy.js (0.35-1) UNRELEASED; urgency=low
* Automatically activate contexts
-- idk <hankhill19580@gmail.com> Thu, 01 Aug 2019 00:32:39 -0400
i2psetproxy.js (0.31-1) UNRELEASED; urgency=low
* Initial release. Closes: #nnnn
<nnnn is the bug number of your ITP>
-- idk <hankhill19580@gmail.com> Thu, 01 Aug 2019 00:32:39 -0400

1
debian/compat vendored Normal file
View File

@@ -0,0 +1 @@
11

17
debian/control vendored Normal file
View File

@@ -0,0 +1,17 @@
Source: i2psetproxy.js
Section: unknown
Priority: optional
Maintainer: idk <hankhill19580@gmail.com>
Build-Depends: debhelper (>=11~)
Standards-Version: 4.1.4
Homepage: https://github.com/eyedeekay/i2psetproxy.js
Package: i2psetproxy.js
Architecture: any
Multi-Arch: foreign
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: Plugin for configuring i2p in Firefox and Chromium
This is a webextension which safely configures a Browser on the
Debian operating system to use I2P. i2psetproxy.js users form
their own anonymity set, like TAILS users or Brave users do on
the Tor network.

58
debian/copyright vendored Normal file
View File

@@ -0,0 +1,58 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: i2psetproxy.js
Source: https://github.com/eyedeekay/i2psetproxy.js
Files: .gitignore
Makefile
README.md
_locales/en/messages.json
background.js
content.js
context.js
.circleci/config.yml
experiments/i2ptab.md
experiments/tunblink.md
i2psetproxy.js.png
i2psetproxy.js@eyedeekay.github.io.xpi
icons/toopie.png
info.css
info.js
manifest.json
options/options.css
options/options.js
options/options.html
package-lock.json
platform.js
privacy.js
proxy.js
scrub.js
window.html
debian/*
Copyright: MIT
License: MIT
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.
Files: chromium/browser-polyfill.js
Copyright: MPL in: chromium/LICENSE
License: MPL-2.0
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
.

1
debian/patches/series vendored Normal file
View File

@@ -0,0 +1 @@
# You must remove unused comment lines for the released package.

20
debian/rules vendored Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/make -f
%:
dh $@
override_dh_auto_install:
mkdir -p $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
cp -r ./chromium/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./icons/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./options/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./_locales/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.html $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.css $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.md $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./manifest.json $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./LICENSE $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
ln -sf $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}

1
debian/source/format vendored Normal file
View File

@@ -0,0 +1 @@
3.0 (quilt)

2
debian/source/local-options vendored Normal file
View File

@@ -0,0 +1,2 @@
#abort-on-upstream-changes
#unapply-patches

1
debian/watch vendored Normal file
View File

@@ -0,0 +1 @@
version=3

6
desc Normal file
View File

@@ -0,0 +1,6 @@
I2P in Private Browsing Mode
============================
A simple plugin for configuring a Firefox based web browser to isolate I2P
Browsing to a single contextual identity, thus creating an I2P in Private
Browsing mode. It requires the use of a pre-installed I2P Router.

3
experiments/i2ptab.md Normal file
View File

@@ -0,0 +1,3 @@
Private Browsing with I2P Tab
=============================

45
experiments/tunblink.md Normal file
View File

@@ -0,0 +1,45 @@
Usage with standalone HTTP Proxy
--------------------------------
This functionality is currently disabled.
I developed a simple HTTP proxy that can be used with this extension to enable the
user to initiate a re-start of the HTTP proxy tunnel, with a new set of keys and a
new destination. This, combined with re-setting the browser settings back to the
original defaults(which is also done by the HTTP Proxy when re-initiated), amounts
to a "Fresh Identity" feature for the I2P browser.
Before you begin, get the [Standalone HTTP proxy from here](http://github.com/eyedeekay/httptunnel)
and run it like so:
httpproxy -littleboss=start
You can also use 'go get'
go get -u github.com/eyedeekay/httptunnel/httpproxy
If you change the default host and port, you will need to alter the following guide.
In order to use it with the custom HTTP proxy, open the "Add-On's" menu and select
the options for the i2psetproxy.js plugin. Change the "Proxy" configuration from
Host: 127.0.0.1
Port: 4444
to
Host: 127.0.0.1
Port: 7950
and change the "Control" configuration from:
Host: 127.0.0.1
Port: 4444
to
Host: 127.0.0.1
Port: 7951
Now, when you press the Toopie button in the toolbar, you will see in the output
of the HTTP proxy that it has been re-started.

43
i2pcontrol.js Normal file
View File

@@ -0,0 +1,43 @@
function send(json) {
const Http = new XMLHttpRequest();
Http.withCredentials = false;
const url = "http://" + "127.0.0.1" + ":" + "7650";
Http.open("POST", url);
Http.send(json);
console.log(Http);
return Http;
}
function authenticate(user, password) {
var json = {
jsonrpc: "2.0",
id: user,
method: "Authenticate",
params: {
API: 1,
Password: password
}
};
return send(json);
}
username = "";
password = "";
function echo(string, section) {
var xhr = authenticate(username, password);
xhr.onload = function() {
resp = JSON.Parse(xhr.responseText);
json = {
jsonrpc: "2.0",
id: username,
method: "Echo",
params: {
Token: resp.Token,
Echo: string
}
};
var controlMessage = document.getElementById(section);
infoMessage.textContent = xhr.responseText;
};
}

BIN
i2psetproxy.js.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -10,3 +10,9 @@ a {
.panel {
margin: 5px;
}
span.identity {
width: 100px;
display: inline-block;
margin-left: 1em;
}

46
info.js
View File

@@ -1,4 +1,4 @@
document.addEventListener("click", (e) => {
document.addEventListener("click", e => {
function getCurrentWindow() {
return chrome.windows.getCurrent();
}
@@ -6,44 +6,52 @@ document.addEventListener("click", (e) => {
if (e.target.id === "window-create-help-panel") {
let createData = {
type: "panel",
incognito: true,
incognito: true
};
let creating = chrome.windows.create(createData);
let creating = browser.windows.create(createData);
creating.then(() => {
console.log("The help panel has been created");
});
} else if (e.target.id === "window-create-news-panel") {
let createData = {
type: "panel",
incognito: true,
incognito: true
};
let creating = chrome.windows.create(createData);
let creating = browser.windows.create(createData);
creating.then(() => {
console.log("The news panel has been created");
});
} else if (e.target.id === "generate-fresh-tunnel") {
function RefreshIdentity(){
console.log("Generating new identity")
const Http = new XMLHttpRequest();
const url='http://' + controlHost + ":" + controlPort
Http.open("GET", url);
Http.send();
Http.onreadystatechange=(e)=>{
console.log(Http.responseText)
}
function RefreshIdentity() {
console.log("Generating new identity");
const Http = new XMLHttpRequest();
const url = "http://" + controlHost + ":" + controlPort;
Http.open("GET", url);
Http.send();
Http.onreadystatechange = e => {
console.log(Http.responseText);
};
}
RefreshIdentity();
} else if (e.target.id === "window-preface-title") {
getCurrentWindow().then((currentWindow) => {
getCurrentWindow().then(currentWindow => {
let updateInfo = {
titlePreface: "I2P Help | "
}
};
chrome.windows.update(currentWindow.id, updateInfo);
});
}else if (e.target.id === "clear-browser-data") {
forgetBrowsingData()
} else if (e.target.id === "clear-browser-data") {
forgetBrowsingData();
} else if (e.target.id === "check-i2p-control") {
echo("I2P Router Detected", "panel-section-i2pcontrol-check");
} else if (e.target.id === "enable-web-rtc") {
if (e.target.checked) {
browser.runtime.sendMessage({ rtc: "enableWebRTC" });
} else {
browser.runtime.sendMessage({ rtc: "disableWebRTC" });
}
return;
}
e.preventDefault();
});

View File

@@ -1,14 +1,28 @@
{
"applications": {
"gecko": {
"id": "i2psetproxy.js@eyedeekay.github.io",
"id": "i2ppb@eyedeekay.github.io",
"strict_min_version": "60.0"
}
},
"permissions": ["theme", "browsingData", "notifications", "proxy", "privacy", "storage"],
"permissions": [
"theme",
"browsingData",
"notifications",
"proxy",
"privacy",
"storage",
"webRequest",
"webRequestBlocking",
"contextualIdentities",
"cookies",
"history",
"tabs",
"<all_urls>"
],
"manifest_version": 2,
"name": "__MSG_extensionName__",
"version": "1.24",
"version": "0.37",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://github.com/eyedeekay/i2psetproxy.js",
"icons": {
@@ -24,8 +38,21 @@
"page": "options/options.html"
},
"background": {
"scripts": ["background.js", "proxy.js", "info.js", "privacy.js" ]
"scripts": [
"privacy.js",
"platform.js",
"background.js",
"proxy.js",
"info.js",
"i2pcontrol.js",
"scrub.js"
]
},
"protocol_handlers": [{
"protocol": "web+rc",
"name": "RouterConsole",
"uriTemplate": "http://router.console/?%s"
}],
"default_locale": "en"
}

View File

@@ -33,3 +33,30 @@ label:hover {
font-size: 1.2em;
margin-bottom: 0.5em;
}
html, body {
width: 350px;
}
a {
margin: 10px;
display: inline-block;
}
.panel {
margin: 5px;
}
span.identity {
width: 100px;
display: inline-block;
margin-left: 1em;
}
.control-options {
display: none;
}
.identity-options {
display: none;
}

View File

@@ -25,7 +25,12 @@
<input type="text" data="port" id="port" value="4444"/>
</section>
<!--
<section class="scheme-options identity-options">
<div class="panel">
<div id="identity-list">Identity list?</div>
</div>
</section>
<section class="scheme-options control-options">
<div class="title" >Controller Options</div>
<p id="controlHelpText"> These options will be inert if used with the default i2p HTTP or SOCKS
@@ -37,7 +42,7 @@
<input type="text" data="controlport" id="controlport" value="4444"/>
</section>
-->
<input type="button" value="Save preferences" id="save-button"/>
<script src="options.js"></script>

View File

@@ -1,205 +1,213 @@
function isDroid() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "android") {
return true
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
return true;
} else {
return false;
}
});
}
function SetHostText() {
var hostid = document.getElementById("hostText");
hostid.textContent = chrome.i18n.getMessage("hostText");
}
function SetPortText() {
var portid = document.getElementById("portText");
portid.textContent = chrome.i18n.getMessage("portText");
}
function SetControlHostText() {
var controlhostid = document.getElementById("controlHostText");
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
}
function setupProxy() {
var controlHost = getControlHost();
var controlPort = getControlPort();
var Host = getHost();
var Port = getPort();
var Scheme = getScheme();
if (!getChrome()) {
function handleProxyRequest(requestInfo) {
console.log("proxying request via listener");
console.log(" ", Scheme, Host, ":", Port);
return {
type: Scheme,
host: Host,
port: Port,
proxyDns: true
};
}
console.log("Setting up Firefox WebExtension proxy");
browser.proxy.onRequest.addListener(handleProxyRequest, {
urls: ["<all_urls>"]
});
console.log("i2p settings created for WebExtension Proxy");
} else {
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: Scheme,
host: Host,
port: parseInt(Port)
}
}
};
chrome.proxy.settings.set(
{
value: config,
scope: "regular"
},
function() {}
);
}
}
function SetHostText(){
var hostid = document.getElementById('hostText');
hostid.textContent = chrome.i18n.getMessage("hostText");
function SetControlPortText() {
var controlportid = document.getElementById("controlPortText");
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
}
function SetPortText(){
var portid = document.getElementById('portText');
portid.textContent = chrome.i18n.getMessage("portText");
}
function SetControlHostText(){
var controlhostid = document.getElementById('controlHostText');
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
}
function SetControlPortText(){
var controlportid = document.getElementById('controlPortText');
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
}
function SetControlHelpText(){
var portid = document.getElementById('controlHelpText');
portid.textContent = chrome.i18n.getMessage("controlHelpText");
function SetControlHelpText() {
var portid = document.getElementById("controlHelpText");
portid.textContent = chrome.i18n.getMessage("controlHelpText");
}
function getScheme() {
const proxy_scheme = document.querySelector("#proxy_scheme");
console.log("Got i2p proxy scheme:", proxy_scheme.value);
return proxy_scheme.value;
const proxy_scheme = document.querySelector("#proxy_scheme");
console.log("Got i2p proxy scheme:", proxy_scheme.value);
if (proxy_scheme == "HTTP") {
return "http";
}
if (proxy_scheme == "SOCKS") {
return "socks";
}
return proxy_scheme.value;
}
function getHost() {
proxy_host = document.getElementById("host").value
console.log("Got i2p proxy host:", proxy_host);
if (proxy_host == undefined){
return "127.0.0.1"
}
return proxy_host;
proxy_host = document.getElementById("host").value;
console.log("Got i2p proxy host:", proxy_host);
if (proxy_host == undefined) {
return "127.0.0.1";
}
return proxy_host;
}
function getPort() {
proxy_port = document.getElementById("port").value
console.log("Got i2p proxy port:", proxy_port);
if (proxy_port == undefined){
return 4444
}
return proxy_port;
proxy_port = document.getElementById("port").value;
console.log("Got i2p proxy port:", proxy_port);
if (proxy_port == undefined) {
return "4444";
}
return proxy_port;
}
function getControlHost() {
control_host = document.getElementById("controlhost").value
console.log("Got i2p control host:", control_host);
if (control_host == undefined){
return "127.0.0.1"
}
return control_host;
control_host = document.getElementById("controlhost").value;
console.log("Got i2p control host:", control_host);
if (control_host == undefined) {
return "127.0.0.1";
}
return control_host;
}
function getControlPort() {
control_port = document.getElementById("controlport").value
console.log("Got i2p control port:", control_port);
if (control_port == undefined){
return 4444
}
return control_port;
}
function isFirefox() {
testPlain = navigator.userAgent.indexOf('Firefox') !== -1;
if (testPlain) {
return testPlain
}
testTorBrowser = navigator.userAgent.indexOf('Tor') !== -1;
if (testTorBrowser) {
return testTorBrowser
}
return false
control_port = document.getElementById("controlport").value;
console.log("Got i2p control port:", control_port);
if (control_port == undefined) {
return "4444";
}
return control_port;
}
function checkStoredSettings(storedSettings) {
let defaultSettings = {};
if (!storedSettings.proxy_scheme){
defaultSettings["proxy_scheme"] = "http"
}
if (!storedSettings.proxy_host) {
defaultSettings["proxy_host"] = "127.0.0.1"
}
if (!storedSettings.proxy_port) {
defaultSettings["proxy_port"] = 4444
}
if (!storedSettings.control_host) {
defaultSettings["control_host"] = "127.0.0.1"
}
if (!storedSettings.control_port) {
defaultSettings["control_port"] = 4444
}
chrome.storage.local.set(defaultSettings);
let defaultSettings = {};
if (!storedSettings.proxy_scheme) {
defaultSettings["proxy_scheme"] = "http";
}
if (!storedSettings.proxy_host) {
defaultSettings["proxy_host"] = "127.0.0.1";
}
if (!storedSettings.proxy_port) {
defaultSettings["proxy_port"] = 4444;
}
if (!storedSettings.control_host) {
defaultSettings["control_host"] = "127.0.0.1";
}
if (!storedSettings.control_port) {
defaultSettings["control_port"] = 4444;
}
chrome.storage.local.set(defaultSettings);
}
function onError(e) {
console.error(e);
}
//var controlHost = "127.0.0.1" //getControlHost()
//var controlPort = "7951" //getControlPort();
function setupProxy() {
//var controlHost = getControlHost()
//var controlPort = getControlPort()
var Host = getHost()
var Port = getPort()
if (isDroid()) {
console.log("Setting up Firefox Android proxy")
function handleProxyRequest(requestInfo) {
if (shouldProxyRequest(requestInfo)) {
console.log(`Proxying: ${requestInfo.url}`);
return {type: "http", host: Host, port: Port};
}
return {type: "http", host: Host, port: Port};
}
browser.proxy.onRequest.addListener(handleProxyRequest, {urls: ["<all_urls>"]});
console.log("i2p settings created for Firefox Android")
}else{
console.log("Setting up Firefox Desktop proxy")
var proxySettings = {
proxyType: "manual",
http: Host+":"+Port,
passthrough: "",
httpProxyAll: true
};
browser.proxy.settings.set({value:proxySettings});
console.log("i2p settings created for Firefox Desktop")
}
console.error(e);
}
function storeSettings() {
let proxy_scheme = getScheme()
let proxy_host = getHost()
let proxy_port = getPort()
let control_host = getControlHost()
let control_port = getControlPort()
chrome.storage.local.set({
proxy_scheme,
proxy_host,
proxy_port,
control_host,
control_port,
});
console.log("storing proxy scheme:", proxy_scheme)
console.log("storing proxy host:", proxy_host)
console.log("storing proxy port:", proxy_port)
console.log("storing control host:", control_host)
console.log("storing control port:", control_port)
setupProxy()
let proxy_scheme = getScheme();
let proxy_host = getHost();
let proxy_port = getPort();
let control_host = getControlHost();
let control_port = getControlPort();
chrome.storage.local.set({
proxy_scheme,
proxy_host,
proxy_port,
control_host,
control_port
});
console.log("storing proxy scheme:", proxy_scheme);
console.log("storing proxy host:", proxy_host);
console.log("storing proxy port:", proxy_port);
console.log("storing control host:", control_host);
console.log("storing control port:", control_port);
setupProxy();
}
function updateUI(restoredSettings) {
const selectList = document.querySelector("#proxy_scheme");
selectList.value = restoredSettings.proxy_scheme;
console.log("showing proxy scheme:", selectList.value);
const selectList = document.querySelector("#proxy_scheme")
selectList.value = restoredSettings.proxy_scheme
console.log("showing proxy scheme:", selectList.value)
const hostitem = document.getElementById("host");
hostitem.value = restoredSettings.proxy_host;
console.log("showing proxy host:", hostitem.value);
const hostitem = document.getElementById("host")
hostitem.value = restoredSettings.proxy_host
console.log("showing proxy host:", hostitem.value)
const portitem = document.getElementById("port");
portitem.value = restoredSettings.proxy_port;
console.log("showing proxy port:", portitem.value);
const portitem = document.getElementById("port")
portitem.value = restoredSettings.proxy_port
console.log("showing proxy port:", portitem.value)
const controlhostitem = document.getElementById("controlhost");
controlhostitem.value = restoredSettings.control_host;
console.log("showing control host:", controlhostitem.value);
/*const controlhostitem = document.getElementById("controlhost")
controlhostitem.value = restoredSettings.control_host
console.log("showing control host:", controlhostitem.value)
const controlportitem = document.getElementById("controlport");
controlportitem.value = restoredSettings.control_port;
console.log("showing control port:", controlportitem.value);
const controlportitem = document.getElementById("controlport")
controlportitem.value = restoredSettings.control_port
console.log("showing control port:", controlportitem.value)*/
SetHostText()
SetPortText()
/*SetControlHostText()
SetControlPortText()
SetControlHelpText()*/
setupProxy()
SetHostText();
SetPortText();
SetControlHostText();
SetControlPortText();
SetControlHelpText();
setupProxy();
}
function onError(e) {
console.error(e);
console.error(e);
}
chrome.storage.local.get(function(got){
checkStoredSettings(got)
updateUI(got)
chrome.storage.local.get(function(got) {
checkStoredSettings(got);
updateUI(got);
});
const saveButton = document.querySelector("#save-button");
saveButton.addEventListener("click", storeSettings);
//EXPERIMENTAL: Open in I2P Tab

13
platform.js Normal file
View File

@@ -0,0 +1,13 @@
function isDroid() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
console.log("Running in Android detected");
return true;
} else {
console.log("Running in Desktop detected");
return false;
}
});
return false;
}

View File

@@ -1,4 +1,3 @@
function onSet(result) {
if (result) {
console.log("->: Value was updated");
@@ -10,40 +9,46 @@ function onSet(result) {
// This disables queries to centralized databases of bad URLs to screen for
// risky sites in your browser
function disableHyperlinkAuditing() {
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
value: false
});
console.log("Disabling hyperlink auditing/val=", {
value: false
})
setting.then(onSet);
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
value: false
});
console.log("Disabling hyperlink auditing/val=", {
value: false
});
setting.then(onSet);
}
// This enables first-party isolation
function enableFirstPartyIsolation() {
var setting = browser.privacy.websites.firstPartyIsolate.set({
value: true
});
console.log("Enabling first party isolation/val=", {
value: true
})
setting.then(onSet);
var setting = browser.privacy.websites.firstPartyIsolate.set({
value: true
});
console.log("Enabling first party isolation/val=", {
value: true
});
setting.then(onSet);
}
// This rejects tracking cookies and third-party cookies but it
// LEAVES "Persistent" Cookies unmodified in favor of an option in the content
// interface for now
function disableEvilCookies() {
var getting = browser.privacy.websites.cookieConfig.get({});
getting.then((got) => {
var setting = browser.privacy.websites.cookieConfig.set(
{value: {behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies}}
);
console.log("Setting cookie behavior/val=", {value: {behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies}})
setting.then(onSet);
var getting = browser.privacy.websites.cookieConfig.get({});
getting.then(got => {
var setting = browser.privacy.websites.cookieConfig.set({
value: {
behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies
}
});
console.log("Setting cookie behavior/val=", {
value: {
behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies
}
});
setting.then(onSet);
});
}
// Make sure that they're gone
@@ -59,98 +64,116 @@ function disableEvilCookies() {
// this disables the use of referrer headers
function disableReferrers() {
var setting = browser.privacy.websites.referrersEnabled.set({
value: false
});
console.log("Disabling referrer headers/val=", {
value: false
})
setting.then(onSet);
var setting = browser.privacy.websites.referrersEnabled.set({
value: false
});
console.log("Disabling referrer headers/val=", {
value: false
});
setting.then(onSet);
}
// enable fingerprinting resistent features(letterboxing and stuff)
function enableResistFingerprinting() {
var setting = browser.privacy.websites.referrersEnabled.set({
value: true
});
console.log("Enabling resist fingerprinting/val=", {
value: true
})
setting.then(onSet);
var setting = browser.privacy.websites.referrersEnabled.set({
value: true
});
console.log("Enabling resist fingerprinting/val=", {
value: true
});
setting.then(onSet);
}
// This is essentially a blocklist of clearnet web-sites known to do bad tracking
function enableTrackingProtection() {
var setting = browser.privacy.websites.trackingProtectionMode.set({
value: "always"
});
console.log("Enabling tracking protection/val=", {
value: "always"
})
setting.then(onSet);
var setting = browser.privacy.websites.trackingProtectionMode.set({
value: "always"
});
console.log("Enabling tracking protection/val=", {
value: "always"
});
setting.then(onSet);
}
// This disables protected content, which is a form of digital restrictions
// management dependent on identifying information
function disableDigitalRestrictionsManagement() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.set({
value: false
});
console.log("Setting Protected Content(Digital Restrictions Management) false/val=", {
value: false
})
setting.then(onSet);
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.set({
value: false
});
console.log(
"Setting Protected Content(Digital Restrictions Management) false/val=",
{
value: false
}
});
);
setting.then(onSet);
}
});
}
function setAllPrivacy() {
disableHyperlinkAuditing()
enableFirstPartyIsolation()
disableEvilCookies()
disableReferrers()
enableTrackingProtection()
enableResistFingerprinting()
disableDigitalRestrictionsManagement()
disableHyperlinkAuditing();
enableFirstPartyIsolation();
disableEvilCookies();
disableReferrers();
enableTrackingProtection();
enableResistFingerprinting();
disableDigitalRestrictionsManagement();
}
setAllPrivacy()
setAllPrivacy();
function ResetPeerConnection(){
browser.privacy.network.peerConnectionEnabled.set({value: false});
browser.privacy.network.networkPredictionEnabled.set({value: false});
browser.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
console.log("Re-disabled WebRTC")
function ResetPeerConnection() {
browser.privacy.network.peerConnectionEnabled.set({
value: false
});
browser.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp"
});
console.log("Re-disabled WebRTC");
}
function EnablePeerConnection(){
browser.privacy.network.peerConnectionEnabled.set({value: true});
browser.privacy.network.networkPredictionEnabled.set({value: false});
browser.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
console.log("Enabled WebRTC")
function EnablePeerConnection() {
browser.privacy.network.peerConnectionEnabled.set({
value: true
});
browser.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp"
});
console.log("Enabled WebRTC");
}
ResetPeerConnection()
ResetPeerConnection();
function ResetDisableSavePasswords(){
browser.privacy.services.passwordSavingEnabled.set({value: false});
console.log("Re-disabled saved passwords")
function ResetDisableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
value: false
});
console.log("Re-disabled saved passwords");
}
function EnableSavePasswords(){
browser.privacy.services.passwordSavingEnabled.set({value: true});
console.log("Enabled saved passwords")
function EnableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
value: true
});
console.log("Enabled saved passwords");
}
//ResetDisableSavePasswords()
var defaultSettings = {
since: "forever",
dataTypes: ["history", "downloads", "cache", "cookies", "passwords", "pluginData", "formData", "serviceWorkers"]
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"]
};
var appSettings = {
@@ -163,24 +186,31 @@ function onError(e) {
}
function checkStoredSettings(storedSettings) {
browser.storage.local.set(appSettings);
chrome.storage.local.set(appSettings);
}
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(checkStoredSettings, onError);
function forgetBrowsingData(storedSettings) {
function clearCookiesContext(cookieStoreId) {}
function forgetBrowsingData(storedSettings) {
function getSince(selectedSince) {
if (selectedSince === "forever") {
return 0;
}
const times = {
hour: () => { return 1000 * 60 * 60 },
day: () => { return 1000 * 60 * 60 * 24 },
week: () => { return 1000 * 60 * 60 * 24 * 7}
}
hour: () => {
return 1000 * 60 * 60;
},
day: () => {
return 1000 * 60 * 60 * 24;
},
week: () => {
return 1000 * 60 * 60 * 24 * 7;
}
};
const sinceMilliseconds = times[selectedSince].call();
return Date.now() - sinceMilliseconds;
@@ -201,14 +231,125 @@ function forgetBrowsingData(storedSettings) {
let dataTypesString = Object.keys(dataTypes).join(", ");
let sinceString = new Date(since).toLocaleString();
browser.notifications.create({
"type": "basic",
"title": "Removed browsing data",
"message": `Removed ${dataTypesString}\nsince ${sinceString}`
type: "basic",
title: "Removed browsing data",
message: `Removed ${dataTypesString}\n for i2pbrowser`
});
}
browser.browsingData.remove({since}, dataTypes).then(notify);
function deepCleanHistory(historyItems) {
console.log("Deep cleaning history");
for (item of historyItems) {
if (i2pHost(item.url)) {
browser.history.deleteUrl({
url: item.url
});
browser.browsingData.removeCache({});
console.log("cleared Cache");
browser.browsingData
.removePasswords({
hostnames: [i2pHostName(item.url)],
since: since
})
.then(onGot);
console.log("cleared Passwords");
browser.browsingData
.removeDownloads({
hostnames: [i2pHostName(item.url)],
since: since
})
.then(onGot);
console.log("cleared Downloads");
browser.browsingData
.removeFormData({
hostnames: [i2pHostName(item.url)],
since: since
})
.then(onGot);
console.log("cleared Form Data");
browser.browsingData
.removeLocalStorage({
hostnames: [i2pHostName(item.url)],
since: since
})
.then(onGot);
console.log("cleared Local Storage");
setAllPrivacy()
ResetPeerConnection()
contexts = browser.contextualIdentities.query({
name: "i2pbrowser"
});
function deepCleanCookies(cookies) {
for (cookie of cookies) {
var removing = browser.cookies.remove({
firstPartyDomain: cookie.firstPartyDomain,
name: cookie.name,
url: item.url
});
removing.then(onGot, onError);
}
console.log("Cleared cookies");
}
function deepCleanContext(cookieStoreIds) {
for (cookieStoreId of cookieStoreIds) {
var removing = browser.cookies.getAll({
firstPartyDomain: null,
storeId: cookieStoreId.cookieStoreId
});
removing.then(deepCleanCookies, onError);
}
}
contexts.then(deepCleanContext, onError);
}
}
notify();
}
var searching = browser.history.search({
text: "i2p",
startTime: 0
});
searching.then(deepCleanHistory);
setAllPrivacy();
ResetPeerConnection();
}
function i2pHostName(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
return hostname;
}
function i2pHost(url) {
let hostname = i2pHostName(url);
return hostname.endsWith(".i2p");
}
function onGot(contexts) {
if (contexts != null) {
for (let context of contexts) {
console.log(context);
}
}
}
browser.runtime.onMessage.addListener(message);
function message(message) {
console.log(message);
if (message.rtc === "enableWebRTC") {
console.log("enableWebRTC");
EnablePeerConnection();
} else {
console.log("disableWebRTC");
ResetPeerConnection();
}
}

264
proxy.js
View File

@@ -1,67 +1,219 @@
function isFirefox() {
testPlain = navigator.userAgent.indexOf('Firefox') !== -1;
if (testPlain) {
console.log("firefox")
return testPlain
}
return false
}
browser.privacy.network.peerConnectionEnabled.set({
value: false
});
console.log("Preliminarily disabled WebRTC.");
function isDroid() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "android") {
return true
}
});
}
if (isFirefox()) {
browser.privacy.network.peerConnectionEnabled.set({value: false});
}
chrome.privacy.network.networkPredictionEnabled.set({value: false});
chrome.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
console.log("Preliminarily disabled WebRTC.")
chrome.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp"
});
function shouldProxyRequest(requestInfo) {
return true; //requestInfo.parentFrameId != -1;
return requestInfo.parentFrameId != -1;
}
var handleContextProxyRequest = async function(requestDetails) {
console.log("(proxy)Searching for proxy by context");
try {
var handleProxyRequest = function(context) {
proxy = {
failoverTimeout: 0,
type: "direct",
proxyDns: false
};
if (context.name == "i2pbrowser") {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
console.log(
"(proxy)Using",
proxy.type,
"proxy ",
proxy.host + ":" + proxy.port
);
return proxy;
}
return proxy;
};
var contextGet = async function(tabInfo) {
try {
console.log("(proxy)Tab info from Function", tabInfo);
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
return context;
} catch (error) {
console.log("(proxy)Context Error", error);
}
};
var tabFind = async function(tabId) {
try {
context = await browser.contextualIdentities.query({
name: "i2pbrowser"
});
tabId.cookieStoreId = context[0].cookieStoreId;
console.log("(proxy) forcing context", tabId.cookieStoreId);
return tabId;
} catch (error) {
console.log("(proxy)Context Error", error);
}
};
var tabGet = async function(tabId) {
try {
console.log("(proxy)Tab ID from Request", tabId);
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
console.log("(proxy)Tab error", error);
}
};
if (requestDetails.tabId > 0) {
if (proxyHost(requestDetails.url)) {
return {
type: getScheme(),
host: getHost(),
port: getPort()
};
} else if (i2pHost(requestDetails.url)) {
console.log("(Proxy)I2P URL detected, ");
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(tabFind);
requestDetails.tabId = mtab;
var context = mtab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
console.log("(proxy)Returning I2P Proxy", proxy);
return proxy;
} else {
var tab = tabGet(requestDetails.tabId);
var context = tab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
console.log("(proxy)Returning I2P Proxy", proxy);
return proxy;
}
}
} catch (error) {
console.log("(proxy)Not using I2P Proxy.", error);
}
};
var proxy_scheme = "HTTP";
function getScheme() {
if (proxy_scheme == undefined) {
proxy_scheme = "http";
}
if (proxy_scheme == "HTTP") {
proxy_scheme = "http";
}
if (proxy_scheme == "SOCKS") {
proxy_scheme = "socks";
}
if (proxy_scheme != "http" && proxy_scheme != "socks") {
proxy_scheme = "http";
}
//console.log("Got i2p proxy scheme:", proxy_scheme);
return proxy_scheme;
}
/*
var proxy_host = "127.0.0.1";
var proxy_port = "4444";
var control_host = "127.0.0.1";
var control_port = "4444";
*/
function getHost() {
if (proxy_host == undefined) {
proxy_host = "127.0.0.1";
}
return proxy_host;
}
function getPort() {
if (proxy_port == undefined) {
var scheme = getScheme();
if (scheme == "socks") {
proxy_port = "4446";
} else {
proxy_port = "4444";
}
}
return proxy_port;
}
function getControlHost() {
if (control_host == undefined) {
return "127.0.0.1";
}
return control_host;
}
function getControlPort() {
if (control_port == undefined) {
return "4444";
}
return control_port;
}
function setupProxy() {
var controlHost = "127.0.0.1" //getControlHost()
var controlPort = "7951" //getControlPort();
var Host = "127.0.0.1" //getHost()
var Port = "4444" //getPort()
if (isDroid()) {
console.log("Setting up Firefox Android proxy")
function handleProxyRequest(requestInfo) {
if (shouldProxyRequest(requestInfo)) {
console.log(`Proxying: ${requestInfo.url}`);
return {type: "http", host: Host, port: Port};
}
return {type: "http", host: Host, port: Port};
}
browser.proxy.onRequest.addListener(handleProxyRequest, {urls: ["<all_urls>"]});
console.log("i2p settings created for Firefox Android")
}else{
console.log("Setting up Firefox Desktop proxy")
var proxySettings = {
proxyType: "manual",
http: Host+":"+Port,
passthrough: "",
httpProxyAll: true
};
browser.proxy.settings.set({value:proxySettings});
console.log("i2p settings created for Firefox Desktop")
}
var controlHost = getControlHost();
var controlPort = getControlPort();
var Host = getHost();
var Port = getPort();
var Scheme = getScheme();
/**/
console.log("Setting up Firefox WebExtension proxy");
browser.proxy.onRequest.addListener(handleContextProxyRequest, {
urls: ["<all_urls>"]
});
console.log("i2p settings created for WebExtension Proxy");
/**/
}
if (isFirefox()){
// Theme all currently open windows
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
function checkStoredSettings(storedSettings) {
let defaultSettings = {};
if (!storedSettings.proxy_scheme) {
defaultSettings["proxy_scheme"] = "http";
}
if (!storedSettings.proxy_host) {
defaultSettings["proxy_host"] = "127.0.0.1";
}
if (!storedSettings.proxy_port) {
defaultSettings["proxy_port"] = 4444;
}
if (!storedSettings.control_host) {
defaultSettings["control_host"] = "127.0.0.1";
}
if (!storedSettings.control_port) {
defaultSettings["control_port"] = 4444;
}
chrome.storage.local.set(defaultSettings);
}
if (isFirefox()) {
setupProxy()
function update(restoredSettings) {
proxy_scheme = restoredSettings.proxy_scheme;
console.log("restoring proxy scheme:", proxy_scheme);
proxy_host = restoredSettings.proxy_host;
console.log("restoring proxy host:", proxy_host);
proxy_port = restoredSettings.proxy_port;
console.log("restoring proxy port:", proxy_port);
control_host = restoredSettings.control_host;
console.log("restoring control host:", control_host);
control_port = restoredSettings.control_port;
console.log("restoring control port:", control_port);
}
chrome.storage.local.get(function(got) {
checkStoredSettings(got);
update(got);
setupProxy();
});
// Theme all currently open windows
if (!isDroid()) {
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
}

267
scrub.js Normal file
View File

@@ -0,0 +1,267 @@
var contextScrub = async function(requestDetails) {
console.log("(scrub)Scrubbing info from contextualized request");
try {
var headerScrub = function(context) {
if (!context) {
console.error("Context not found");
} else {
if ((context.name = "i2pbrowser")) {
var ua = "MYOB/6.66 (AN/ON)";
if (i2pHost(requestUrl.url)) {
for (var header of requestDetails.requestHeaders) {
if (header.name.toLowerCase() === "user-agent") {
header.value = ua;
console.log("(scrub)User-Agent header modified", header.value);
}
}
}
return {
requestHeaders: requestDetails.requestHeaders
};
}
}
};
var contextGet = async function(tabInfo) {
try {
console.log("(scrub)Tab info from Function", tabInfo);
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
return context;
} catch (error) {
console.log("(scrub)Conext Error", error);
}
};
var tabFind = async function(tabId) {
try {
context = await browser.contextualIdentities.query({
name: "i2pbrowser"
});
tabId.cookieStoreId = context[0].cookieStoreId;
console.log("(scrub) forcing context", tabId.cookieStoreId);
return tabId;
} catch (error) {
console.log("(scrub)Context Error", error);
}
};
var tabGet = async function(tabId) {
try {
console.log("(scrub)Tab ID from Request", tabId);
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
console.log("(scrub)Tab error", error);
}
};
if (requestDetails.tabId > 0) {
if (i2pHost(requestDetails.url)) {
console.log("(Proxy)I2P URL detected, ");
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(tabFind);
requestDetails.tabId = mtab;
var context = mtab.then(contextGet);
var req = await context.then(headerScrub);
console.log("(scrub)Scrubbing I2P Request", req);
return req;
} else {
var tab = tabGet(requestDetails.tabId);
var context = tab.then(contextGet);
var req = await context.then(headerScrub);
console.log("(scrub)Scrubbing I2P Request", req);
return req;
}
}
} catch (error) {
console.log("(scrub)Not scrubbing non-I2P request.", error);
}
};
var contextSetup = async function(requestDetails) {
console.log("(isolate)Forcing I2P requests into context");
try {
var tabFind = async function(tabId) {
try {
context = await browser.contextualIdentities.query({
name: "i2pbrowser"
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log(
"(isolate) forcing",
requestDetails.url,
" context",
tabId.cookieStoreId,
context[0].cookieStoreId
);
function Create(window) {
function onCreated(tab) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.id);
browser.tabs.remove(window.tabs[0].id);
}
function onError(error) {
console.log(`Error: ${error}`);
}
created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url,
windowId: window.id
});
created.then(onCreated, onError);
}
getting = browser.windows.getCurrent();
getting.then(Create);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var routerTabFind = async function(tabId) {
try {
context = await browser.contextualIdentities.query({
name: "routerconsole"
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log(
"(isolate) forcing",
requestDetails.url,
" context",
tabId.cookieStoreId,
context[0].cookieStoreId
);
function Create(window) {
function onCreated(tab) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.id);
browser.tabs.remove(window.tabs[0].id);
}
function onError(error) {
console.log(`Error: ${error}`);
}
created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url,
windowId: window.id
});
created.then(onCreated, onError);
}
getting = browser.windows.getCurrent();
getting.then(Create);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var tabGet = async function(tabId) {
try {
console.log("(isolate)Tab ID from Request", tabId);
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
console.log("(isolate)Tab error", error);
}
};
if (requestDetails.tabId > 0) {
if (i2pHost(requestDetails.url)) {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(tabFind);
return requestDetails;
}
if (routerHost(requestDetails.url)) {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(routerTabFind);
return requestDetails;
}
}
} catch (error) {
console.log(
"(isolate)Not an I2P request, no need to force into alternate cookiestore.",
error
);
}
};
function i2pHostName(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
return hostname;
}
function i2pHost(url) {
let hostname = i2pHostName(url);
return hostname.endsWith(".i2p");
}
function proxyHost(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
if (hostname == "proxy.i2p") {
return true;
}
return false;
}
function routerHost(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
if (hostname === "127.0.0.1:7657") {
return true;
} else if (hostname === "localhost:7657") {
return true;
}
if (hostname === "127.0.0.1:7070") {
return true;
} else if (hostname === "localhost:7070") {
return true;
}
return false;
}
browser.webRequest.onBeforeRequest.addListener(
contextSetup,
{ urls: ["<all_urls>"] },
["blocking"]
);
browser.webRequest.onBeforeSendHeaders.addListener(
contextScrub,
{ urls: ["<all_urls>"] },
["blocking", "requestHeaders"]
);
/*
function notify(message) {
var response = await fetch('https://proxy.i2p', {
credentials: 'include'
});
const myJson = await response.json();
console.log(JSON.stringify(myJson));
console.log(message);
const Http = new XMLHttpRequest();
Http.mozAnon = true;
Http.withCredentials = true;
const url = "http://proxy.i2p";
Http.open("GET", url);
Http.send();
Http.onreadystatechange = e => {
console.log(Http.responseText);
browser.runtime.sendMessage(Http.responseText);
};
}
*/

View File

@@ -26,18 +26,29 @@
<!-- This is where I'll eventually put the tunnel control panel -->
<!-- <a href="#" id="generate-fresh-tunnel> Generate a Fresh Tunnel</a>"-->
<!-- -->
<strong><a href="#" id="clear-browser-data">Clear all browsing data</a></strong><br>
<!--<strong><a href="#" id="temp-enable-webrtc">Temporarily enable WebRTC</a></strong><br>-->
<strong><a href="#" id="clear-browser-data">Clear all browsing data</a></strong><br>
<div class="panel-section-separator"></div>
<a href="http://i2pforum.i2p" id="window-create-forum-panel">Visit the I2P Forums</a><br>
<a href="http://i2p-projekt.i2p/blog" id="window-create-news-panel">Get the latest I2P News</a><br>
<div class="panel-section-separator"></div>
<!--<div id="proxy-health">Proxy is:</div>-->
<input type="checkbox" id="enable-web-rtc" name="enablewebrtc" value="webrtc">
<label for="enable-web-rtc">Enable WebRTC <strong>with Proxy?</strong></label>
<div class="panel-section-separator"></div>
<a href="#" id="check-i2p-control">Check I2P Router Health</a><div id="panel-section-i2pcontrol-check"></div>
<div class="panel-section-separator"></div>
<div class="panel-section-identity">
<div id="identity-list"></div>
</div>
</div>
<script src="context.js"></script>
<script src="privacy.js"></script>
<script src="info.js"></script>
<script src="content.js"></script>
<script src="content.js" crossorigin="anonymous"></script>
<script src="i2pcontrol.js"></script>
</body>