Compare commits
53 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9b02651985 | ||
![]() |
e04db247e8 | ||
![]() |
4e30e1077b | ||
![]() |
040b57781e | ||
![]() |
07ca54a885 | ||
![]() |
e125b77d11 | ||
![]() |
851e3854a7 | ||
![]() |
0d414130a7 | ||
![]() |
25a7b523f9 | ||
![]() |
01fbf32acd | ||
![]() |
e2642553b5 | ||
![]() |
d04709e3a5 | ||
![]() |
10dd0af335 | ||
![]() |
b33a7b623b | ||
![]() |
55841f8421 | ||
![]() |
303bd90d84 | ||
![]() |
274eb1a98b | ||
![]() |
4e544dd9e4 | ||
![]() |
6fe1bc3fb5 | ||
![]() |
4897ceff7f | ||
![]() |
8551a13494 | ||
![]() |
064ec504b5 | ||
![]() |
16c9fbb19f | ||
![]() |
ca58d2e307 | ||
![]() |
fc89fe9ada | ||
![]() |
d6ece55d71 | ||
![]() |
ff9a1484b0 | ||
![]() |
70e3bee4da | ||
![]() |
cd25d95fdf | ||
![]() |
65c914a9d0 | ||
![]() |
c0bb7e234d | ||
![]() |
3fefc88a38 | ||
![]() |
5a5cc51536 | ||
![]() |
25ec2d58c1 | ||
![]() |
f896f6ef92 | ||
![]() |
e10d96905b | ||
![]() |
9e015c51ef | ||
![]() |
ff9ba99476 | ||
![]() |
ce4ec0cdfc | ||
![]() |
5b9c706cc9 | ||
![]() |
2aba15f280 | ||
![]() |
fd5364ab8e | ||
![]() |
08639cbf43 | ||
![]() |
52ba8fa837 | ||
![]() |
2b69ff05cf | ||
![]() |
6a8a9039c9 | ||
![]() |
3a52c4e2a6 | ||
![]() |
2fb1d71ae9 | ||
![]() |
185467937c | ||
![]() |
64c5c05b82 | ||
![]() |
4615513bb2 | ||
![]() |
3b63ba945d | ||
![]() |
1911641cd0 |
13
.eslintrc.js
13
.eslintrc.js
@@ -50,7 +50,7 @@ module.exports = {
|
||||
curly: "error",
|
||||
"default-case": "error",
|
||||
"default-param-last": "error",
|
||||
"dot-location": "error",
|
||||
"dot-location": "off",
|
||||
"dot-notation": "off",
|
||||
"eol-last": "error",
|
||||
eqeqeq: "off",
|
||||
@@ -59,7 +59,7 @@ module.exports = {
|
||||
"func-names": "off",
|
||||
"func-style": "off",
|
||||
"function-call-argument-newline": ["error", "consistent"],
|
||||
"function-paren-newline": "error",
|
||||
"function-paren-newline": "off",
|
||||
"generator-star-spacing": "error",
|
||||
"global-require": "error",
|
||||
"guard-for-in": "error",
|
||||
@@ -88,7 +88,7 @@ module.exports = {
|
||||
"max-classes-per-file": "error",
|
||||
"max-depth": "error",
|
||||
"max-len": "error",
|
||||
"max-lines": "error",
|
||||
"max-lines": "off",
|
||||
"max-lines-per-function": "off",
|
||||
"max-nested-callbacks": "error",
|
||||
"max-params": "error",
|
||||
@@ -96,7 +96,7 @@ module.exports = {
|
||||
"max-statements-per-line": "error",
|
||||
"multiline-comment-style": ["error", "bare-block"],
|
||||
"multiline-ternary": "error",
|
||||
"new-cap": "error",
|
||||
"new-cap": "off",
|
||||
"new-parens": "error",
|
||||
"newline-after-var": "off",
|
||||
"newline-before-return": "off",
|
||||
@@ -127,7 +127,7 @@ module.exports = {
|
||||
"no-implied-eval": "error",
|
||||
"no-import-assign": "error",
|
||||
"no-inline-comments": "error",
|
||||
"no-inner-declarations": ["error", "functions"],
|
||||
"no-inner-declarations": "off",
|
||||
"no-invalid-this": "error",
|
||||
"no-iterator": "error",
|
||||
"no-label-var": "error",
|
||||
@@ -182,6 +182,7 @@ module.exports = {
|
||||
"no-unmodified-loop-condition": "error",
|
||||
"no-unneeded-ternary": "error",
|
||||
"no-unused-expressions": "error",
|
||||
"no-unused-vars": "off",
|
||||
"no-use-before-define": "off",
|
||||
"no-useless-call": "error",
|
||||
"no-useless-computed-key": "error",
|
||||
@@ -195,7 +196,7 @@ module.exports = {
|
||||
"no-whitespace-before-property": "error",
|
||||
"nonblock-statement-body-position": "error",
|
||||
"object-curly-newline": "error",
|
||||
"object-curly-spacing": "error",
|
||||
"object-curly-spacing": "off",
|
||||
"object-property-newline": "error",
|
||||
"object-shorthand": "error",
|
||||
"one-var": "off",
|
||||
|
120
Makefile
120
Makefile
@@ -36,8 +36,8 @@ clean:
|
||||
## EVEN RELEASES are AMO RELEASES
|
||||
## ODD RELEASES are SELFHOSTED RELEASES
|
||||
|
||||
MOZ_VERSION=0.52
|
||||
VERSION=0.53
|
||||
MOZ_VERSION=0.54
|
||||
VERSION=0.55
|
||||
#VERSION=$(MOZ_VERSION)
|
||||
#VERSION=1.27
|
||||
|
||||
@@ -60,7 +60,18 @@ amo-readme:
|
||||
sed 's|</h2>|</strong>|g' | \
|
||||
sed 's|<h3>|<strong>|g' | \
|
||||
sed 's|</h3>|</strong>|g' | \
|
||||
grep -v '<img' > index.html
|
||||
grep -v '<img' > amo-index.html
|
||||
|
||||
index:
|
||||
@echo "<!DOCTYPE html>" > index.html
|
||||
@echo "<html>" >> index.html
|
||||
@echo "<head>" >> index.html
|
||||
@echo " <title>I2P in Private Browsing Mode</title>" >> index.html
|
||||
@echo " <link rel=\"stylesheet\" type=\"text/css\" href =\"home.css\" />" >> index.html
|
||||
@echo "</head>" >> index.html
|
||||
markdown README.md >> index.html
|
||||
@echo "</html>" >> index.html
|
||||
|
||||
|
||||
xpi:
|
||||
#wget -O ../i2ppb@eyedeekay.github.io.xpi \
|
||||
@@ -79,7 +90,7 @@ moz-version:
|
||||
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
|
||||
|
||||
rhz-version:
|
||||
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
|
||||
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)1\",|g' manifest.json
|
||||
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)1-rhizome\",|g' manifest.json
|
||||
sed -i 's|7657|7647|g' *.js* */*.js*
|
||||
|
||||
@@ -92,18 +103,22 @@ zip: version
|
||||
--exclude="./package-lock.json" \
|
||||
--exclude="./.node_modules" \
|
||||
--exclude="./node_modules" \
|
||||
--exclude="./.git" -r -FS ../i2psetproxy.js.zip *
|
||||
--exclude="./.git" \
|
||||
--exclude="*/*.xpi" \
|
||||
--exclude="web-ext-artifacts" \
|
||||
--exclude="./*.pdf" -r -FS ../i2psetproxy.js.zip *
|
||||
|
||||
release:
|
||||
cat desc debian/changelog | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -
|
||||
cat desc debian/changelog | gothub release -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n $(VERSION) -d -; true
|
||||
|
||||
delete-release:
|
||||
gothub delete -u eyedeekay -r i2psetproxy.js -t $(VERSION); true
|
||||
gothub delete -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION); true
|
||||
|
||||
recreate-release: delete-release release upload
|
||||
|
||||
upload: upload-xpi upload-deb
|
||||
|
||||
full-release: release submit deb upload
|
||||
|
||||
WEB_EXT_API_KEY=AMO_KEY
|
||||
WEB_EXT_API_SECRET=AMO_SECRET
|
||||
@@ -117,7 +132,7 @@ tk:
|
||||
submit: moz-sign rhz-submit moz-submit
|
||||
|
||||
clean-artifacts:
|
||||
rm web-ext-artifacts/*
|
||||
rm -fr web-ext-artifacts/*
|
||||
|
||||
##ODD NUMBERED, SELF-DISTRIBUTED VERSIONS HERE!
|
||||
moz-sign: version clean-artifacts
|
||||
@@ -125,7 +140,10 @@ moz-sign: version clean-artifacts
|
||||
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
|
||||
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
|
||||
web-ext-submit --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi
|
||||
make copyss
|
||||
|
||||
copyss:
|
||||
cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi; true
|
||||
|
||||
##EVEN NUMBERED, MOZILLA-DISTRIBUTED VERSIONS HERE!
|
||||
moz-submit: moz-version
|
||||
@@ -135,36 +153,87 @@ moz-submit: moz-version
|
||||
web-ext sign --channel listed --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
|
||||
rhz-submit: rhz-version
|
||||
@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
|
||||
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
|
||||
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
|
||||
web-ext-submit --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
@echo "Rhizome releases are disabled while browser is completed."
|
||||
#@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
|
||||
#@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
|
||||
#@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
|
||||
#web-ext-submit --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
#cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi
|
||||
|
||||
#gettorrent:
|
||||
# wget "http://127.0.0.1:7657/i2psnark/i2ppb@eyedeekay.github.io.xpi.torrent"
|
||||
|
||||
getxpi:
|
||||
gothub download -t $(VERSION) -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -n "i2ppb@eyedeekay.github.io.xpi"
|
||||
|
||||
torrent:
|
||||
mktorrent -a http://zviyq72xcmjupynn5y2f5qa3u7bxyu34jnqmwt6czte2l7idxm7q.b32.i2p/announce \
|
||||
-a http://s5ikrdyjwbcgxmqetxb3nyheizftms7euacuub2hic7defkh3xhq.b32.i2p/a \
|
||||
-a http://uajd4nctepxpac4c4bdyrdw7qvja2a5u3x25otfhkptcjgd53ioq.b32.i2p/announce \
|
||||
-a http://w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa.b32.i2p/a \
|
||||
-a http://explodie.org:6969/announce \
|
||||
-a http://tracker.opentrackr.org:1337/announce \
|
||||
-a http://tracker.kamigami.org:2710/announce \
|
||||
-a http://tracker.internetwarriors.net:1337/announce \
|
||||
-a http://tracker.darli.net:6611/announce \
|
||||
-a http://tracker.corpscorp.online:80/announce \
|
||||
-a http://tracker.bz:80/announce \
|
||||
-a http://tracker.bt4g.com:2095/announce \
|
||||
-a http://retracker.sevstar.net:2710/announce \
|
||||
-a http://h4.trakx.nibba.trade:80/announce \
|
||||
-a http://www.proxmox.com:6969/announce \
|
||||
-a http://www.loushao.net:8080/announce \
|
||||
-a http://vps02.net.orel.ru:80/announce \
|
||||
-a http://tracker4.itzmx.com:2710/announce \
|
||||
-a http://tracker3.itzmx.com:6961/announce \
|
||||
-a http://tracker2.itzmx.com:6961/announce \
|
||||
-a http://tracker1.itzmx.com:8080/announce \
|
||||
-a http://tracker01.loveapp.com:6789/announce \
|
||||
-a http://tracker.zerobytes.xyz:1337/announce \
|
||||
-a http://tracker.yoshi210.com:6969/announce \
|
||||
-a http://tracker.torrentyorg.pl:80/announce \
|
||||
-a http://tracker.nyap2p.com:8080/announce \
|
||||
-a http://tracker.lelux.fi:80/announce \
|
||||
-a http://tracker.gbitt.info:80/announce \
|
||||
-a http://pow7.com:80/announce \
|
||||
-a http://opentracker.i2p.rocks:6969/announce \
|
||||
-a http://open.acgtracker.com:1096/announce \
|
||||
-a http://open.acgnxtracker.com:80/announce \
|
||||
-a http://mail2.zelenaya.net:80/announce \
|
||||
-a http://acg.rip:6699/announce \
|
||||
-n "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi" \
|
||||
-o "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" \
|
||||
-w https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/$(VERSION)/i2ppb@eyedeekay.github.io.xpi \
|
||||
i2ppb@eyedeekay.github.io.xpi
|
||||
|
||||
upload-torrent:
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi.torrent" -f "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent"
|
||||
|
||||
upload-xpi:
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
|
||||
|
||||
upload-deb:
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION).orig.tar.gz" -f "../i2psetproxy.js_$(VERSION).orig.tar.gz"
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.debian.tar.xz" -f "../i2psetproxy.js_$(VERSION)-1.debian.tar.xz"
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.dsc" -f "../i2psetproxy.js_$(VERSION)-1.dsc"
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.changes" -f "../i2psetproxy.js_$(VERSION)-1_amd64.changes"
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.buildinfo" -f "../i2psetproxy.js_$(VERSION)-1_amd64.buildinfo"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION).orig.tar.gz" -f "../i2psetproxy.js_$(VERSION).orig.tar.gz"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.debian.tar.xz" -f "../i2psetproxy.js_$(VERSION)-1.debian.tar.xz"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.dsc" -f "../i2psetproxy.js_$(VERSION)-1.dsc"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.changes" -f "../i2psetproxy.js_$(VERSION)-1_amd64.changes"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.buildinfo" -f "../i2psetproxy.js_$(VERSION)-1_amd64.buildinfo"
|
||||
|
||||
fmt:
|
||||
cleancss -O1 all -O2 all --format beautify home.css -o .home.css && mv .home.css home.css
|
||||
cleancss -O1 all -O2 all --format beautify info.css -o .info.css && mv .info.css info.css
|
||||
#find . -path ./node_modules -prune -o -name '*.css' -exec cleancss -O1 --format beautify {} \;
|
||||
find . -path ./node_modules -prune -o -name '*.js*' -exec prettier --write {} \;
|
||||
find . -path ./node_modules -prune -o -name '*.js' -exec prettier --write {} \;
|
||||
find . -path ./node_modules -prune -o -name '*.json' -exec prettier --write {} \;
|
||||
|
||||
lint:
|
||||
eslint --fix *.js
|
||||
eslint --color *.js
|
||||
|
||||
deborig:
|
||||
deborig: fmt version
|
||||
rm -rf ../i2psetproxy.js-$(VERSION)
|
||||
cp -r . ../i2psetproxy.js-$(VERSION)
|
||||
rm -rf *.xpi web-ext-artifacts
|
||||
cd ../i2psetproxy.js-$(VERSION) && \
|
||||
rm -rf web-ext-artifacts && \
|
||||
tar \
|
||||
-cvz \
|
||||
--exclude=.git \
|
||||
@@ -173,6 +242,7 @@ deborig:
|
||||
--exclude=web-ext-artifacts \
|
||||
--exclude=*.xpi \
|
||||
--exclude=*/*.xpi \
|
||||
--exclude=*.pdf \
|
||||
-f ../i2psetproxy.js_$(VERSION).orig.tar.gz \
|
||||
.
|
||||
|
||||
|
148
README.md
148
README.md
@@ -1,50 +1,24 @@
|
||||
i2psetproxy.js
|
||||
==============
|
||||
I2P in Private Browsing Mode(Firefox-Only)
|
||||
==========================================
|
||||
|
||||
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, although this support may be somewhat spotty in recent versions it it
|
||||
beginning to improve again. It aims to be as similar to a fully-fledged I2P
|
||||
Rhizome as possible and borrows some code from I2P Rhizome(Which it is also
|
||||
compatible with).
|
||||
This is an **Experimental** webextension which introduces a set of new "Private
|
||||
Browsing" modes to Firefox-based browsers(Supporting webextensions) that makes
|
||||
it easier to configure a browser to use I2P securely and adds features for
|
||||
making I2P applications easier to use. It does this by isolating I2P-specific
|
||||
settings to Contextual Identities within Firefox, then loading them
|
||||
automatically when the user requests them. It also adds convenience and
|
||||
management features specific to I2P like protocol handlers and native messaging
|
||||
systems.
|
||||
|
||||
The Old Version
|
||||
---------------
|
||||
Installation(Cross-Platform):
|
||||
-----------------------------
|
||||
|
||||
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.
|
||||
For desktop users this addon is available from addons.mozilla.org, where you
|
||||
will be able to recive automatic updates:
|
||||
https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/.
|
||||
|
||||
* 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.
|
||||
|
||||
Debian usage:
|
||||
-------------
|
||||
Debian Installation:
|
||||
--------------------
|
||||
|
||||
Should you prefer, it is possible to install this extension system-wide by
|
||||
side-loading it into Debian. You can generate your own deb file by running the
|
||||
@@ -52,6 +26,31 @@ command:
|
||||
|
||||
make deb
|
||||
|
||||
and then you can install it with:
|
||||
|
||||
sudo apt install ../i2psetproxy.js_*.deb
|
||||
|
||||
Usage:
|
||||
------
|
||||
|
||||
* Basically, it "Just Works." After you install the plugin, browsing to an I2P
|
||||
domain will automatically stop the current tab and re-open the I2P site in an
|
||||
I2P Browser tab.
|
||||
* Besides that, four bookmarks are added to the "Bookmarks Toolbar," which
|
||||
will take you to visit your Java I2P applications, or the "Simplified I2P
|
||||
Landing Page" embedded in the plugin:
|
||||
* 
|
||||
* Also, there's a menu for accessing I2P functionality while you're browsing.
|
||||
It lets you control a few settings in a granular way.
|
||||
* 
|
||||
* You can re-enable WebRTC but force it to always use the proxy that is
|
||||
enforced by the tab.
|
||||
* You can either force the browser to delete all history for I2P sites
|
||||
immediately, or you can close all your I2P Browser tabs at once and delete
|
||||
the history for I2P browsing when you're done.
|
||||
* That's all there is to it! Your browser is configured to safely use and
|
||||
administer I2P
|
||||
|
||||
### Features
|
||||
|
||||
* [done] **Provide** a way to launch into an I2P-Specific contextual identity
|
||||
@@ -59,8 +58,10 @@ command:
|
||||
to the I2P container. Isolate the router console from other local
|
||||
applications by automatically intercepting requests to the router console to
|
||||
another container.
|
||||
* 
|
||||
* [done] **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)
|
||||
@@ -68,7 +69,8 @@ command:
|
||||
them with the proxy enforced.
|
||||
* [done] **Change** the color of the browser window to indicate that I2P is in
|
||||
use
|
||||
* [ready/broken/wip] **Provide** help in a variety sof languages.
|
||||
* 
|
||||
* [ready/broken/wip] **Provide** help in a variety of languages.
|
||||
* [wip] **Monitor** the health and readiness of the I2P router it is
|
||||
instructed to use. Currently the plugin checks whether the HTTP Proxy is
|
||||
working by fetching an image from "http://proxy.i2p" and displaying a result.
|
||||
@@ -79,10 +81,12 @@ command:
|
||||
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.
|
||||
* 
|
||||
* [wip] **Handle Torrents** by talking to i2psnark-rpc plugin and then
|
||||
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
|
||||
can. Right now instead of talking to snark-rpc, it uses a web-based protocl
|
||||
handler that simply auto-fills the torrent into i2psnark.
|
||||
* 
|
||||
* [barely started] **Isolate** traffic by contextual identity to it's own HTTP
|
||||
Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The
|
||||
contextual identities. For now, the contextual identities used to manage
|
||||
@@ -98,22 +102,20 @@ command:
|
||||
tunnel-close timeout and key-reuse until specifically invoked.
|
||||
- I2P Blogging: Use this for posting content to the web interface of your
|
||||
blog or to other similar websites that you create content on.
|
||||
* 
|
||||
|
||||
### Screenshot
|
||||
### Video
|
||||
|
||||

|
||||
* 
|
||||
|
||||

|
||||
Documents
|
||||
------------
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
* **[Browser Outline](browser.pdf)**: This document is an outline of each of
|
||||
the browser extension's feature panels in presentation form.
|
||||
* **[Smart Lander Design](smartlander.pdf)**: This is the original outline of
|
||||
the smart landing page which became the I2P home page within the browser and
|
||||
the drop-down control panel.
|
||||
|
||||
Super Extra Important Background Info:
|
||||
--------------------------------------
|
||||
@@ -136,4 +138,36 @@ Project uplift seems to have largely been accomplished?
|
||||
|
||||
* 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
|
||||
* https://blog.torproject.org/tor-heart-firefox
|
||||
|
||||
The Old Version
|
||||
---------------
|
||||
|
||||
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.
|
||||
|
||||
### Android addons.mozilla.org(Temporarily Disabled)
|
||||
|
||||
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.
|
||||
|
@@ -23,6 +23,14 @@
|
||||
"message": "Web Browser (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"localPreface": {
|
||||
"message": "Localhost Browser",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"localPrefacePrivate": {
|
||||
"message": "Localhost Browser (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"routerPreface": {
|
||||
"message": "Router Console",
|
||||
"description": "Preface for the browser titlebar"
|
||||
|
178
background.js
178
background.js
@@ -10,6 +10,8 @@ var torrentpref = chrome.i18n.getMessage("torrentPreface");
|
||||
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
|
||||
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
|
||||
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
|
||||
var localpref = chrome.i18n.getMessage("localPreface");
|
||||
var localprefpriv = chrome.i18n.getMessage("localPrefacePrivate");
|
||||
|
||||
function onContextsGot(contexts) {
|
||||
var ids = [];
|
||||
@@ -25,7 +27,7 @@ function onContextsGot(contexts) {
|
||||
color: "orange",
|
||||
icon: "fingerprint"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(webpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
@@ -34,7 +36,7 @@ function onContextsGot(contexts) {
|
||||
color: "red",
|
||||
icon: "circle"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(routerpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
@@ -43,7 +45,7 @@ function onContextsGot(contexts) {
|
||||
color: "blue",
|
||||
icon: "briefcase"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(tunnelpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
@@ -52,7 +54,7 @@ function onContextsGot(contexts) {
|
||||
color: "green",
|
||||
icon: "tree"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(mailpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
@@ -61,7 +63,7 @@ function onContextsGot(contexts) {
|
||||
color: "yellow",
|
||||
icon: "briefcase"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(torrentpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
@@ -70,20 +72,36 @@ function onContextsGot(contexts) {
|
||||
color: "purple",
|
||||
icon: "chill"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(localpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: localpref,
|
||||
color: "red",
|
||||
icon: "fence"
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
}
|
||||
|
||||
function onContextsError() {
|
||||
console.log("Error finding contextual identities, is the API enabled?");
|
||||
}
|
||||
|
||||
function onCreated(context) {
|
||||
console.log(`New identity's ID: ${context.cookieStoreId}.`);
|
||||
}
|
||||
|
||||
browser.contextualIdentities.query({}).then(onContextsGot, onError);
|
||||
function onNotCreated(context) {
|
||||
console.log(`identity ID: ${context.cookieStoreId} not created`);
|
||||
}
|
||||
|
||||
browser.contextualIdentities.query({}).then(onContextsGot, onContextsError);
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
} else {
|
||||
if (got.os != "android") {
|
||||
browser.windows.onCreated.addListener(themeWindow);
|
||||
browser.windows.onFocusChanged.addListener(themeWindow);
|
||||
browser.windows.onRemoved.addListener(themeWindow);
|
||||
@@ -94,27 +112,56 @@ gettingInfo.then(got => {
|
||||
|
||||
function themeWindowByTab(tabId) {
|
||||
function tabWindow(tab) {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
var gettingPlatformInfo = browser.runtime.getPlatformInfo();
|
||||
gettingPlatformInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
getwindow = browser.tabs.get(tab.tabId);
|
||||
let getwindow = browser.tabs.get(tab.tabId);
|
||||
getwindow.then(themeWindow);
|
||||
} else {
|
||||
getwindow = browser.windows.get(tab.windowId);
|
||||
let getwindow = browser.windows.get(tab.windowId);
|
||||
getwindow.then(themeWindow);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (typeof tabId === "number") {
|
||||
tab = browser.tabs.get(tabId);
|
||||
let tab = browser.tabs.get(tabId);
|
||||
tab.then(tabWindow);
|
||||
} else {
|
||||
tabWindow(tabId);
|
||||
}
|
||||
}
|
||||
|
||||
function isEmpty(obj) {
|
||||
if (obj === undefined || obj === null) {
|
||||
return true;
|
||||
}
|
||||
for (var key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
var oldtheme = null;
|
||||
|
||||
var getOldTheme = async function getOldTheme() {
|
||||
let foundtheme = await browser.theme.getCurrent();
|
||||
if (!isEmpty(foundtheme)) {
|
||||
oldtheme = foundtheme;
|
||||
console.log("Found old theme", oldtheme);
|
||||
}
|
||||
return oldtheme;
|
||||
};
|
||||
|
||||
getOldTheme();
|
||||
|
||||
function themeWindow(window) {
|
||||
// Check if the window is in private browsing
|
||||
function onThemeError() {
|
||||
console.log("got theme", oldtheme);
|
||||
browser.theme.update(oldtheme);
|
||||
}
|
||||
function logTabs(tabInfo) {
|
||||
function onContextGotTheme(context) {
|
||||
if (context.name == titlepref) {
|
||||
@@ -204,7 +251,11 @@ function themeWindow(window) {
|
||||
}
|
||||
} else {
|
||||
console.log("Not active in I2P window");
|
||||
browser.theme.reset(window.id);
|
||||
if (isEmpty(oldtheme)) {
|
||||
browser.theme.reset();
|
||||
} else {
|
||||
browser.theme.update(window.id, oldtheme);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (
|
||||
@@ -213,9 +264,13 @@ function themeWindow(window) {
|
||||
) {
|
||||
browser.contextualIdentities
|
||||
.get(tabInfo[0].cookieStoreId)
|
||||
.then(onContextGotTheme, onError);
|
||||
.then(onContextGotTheme, onThemeError);
|
||||
} else {
|
||||
browser.theme.reset(window.id);
|
||||
if (isEmpty(oldtheme)) {
|
||||
browser.theme.reset();
|
||||
} else {
|
||||
browser.theme.update(window.id, oldtheme);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,13 +278,15 @@ function themeWindow(window) {
|
||||
currentWindow: true,
|
||||
active: true
|
||||
});
|
||||
querying.then(logTabs, onError);
|
||||
querying.then(logTabs, onThemeError);
|
||||
}
|
||||
|
||||
function setTitle(window) {
|
||||
// Check if the window is in private browsing
|
||||
function onContextError() {
|
||||
console.log("Context Error");
|
||||
}
|
||||
function logTabs(tabInfo) {
|
||||
console.log(tabInfo);
|
||||
|
||||
function onContextGotTitle(context) {
|
||||
if (context.name == titlepref) {
|
||||
console.log("Active in I2P window");
|
||||
@@ -247,11 +304,11 @@ function setTitle(window) {
|
||||
console.log("Active in Web window");
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
titlePreface: webprefpriv + " - "
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
titlePreface: webpref + " - "
|
||||
});
|
||||
}
|
||||
} else if (context.name == routerpref) {
|
||||
@@ -278,7 +335,7 @@ function setTitle(window) {
|
||||
});
|
||||
}
|
||||
} else if (context.name == mailpref) {
|
||||
console.log("Active in Web Mail window");
|
||||
console.log("Active in I2P Web Mail window");
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
@@ -290,7 +347,7 @@ function setTitle(window) {
|
||||
});
|
||||
}
|
||||
} else if (context.name == torrentpref) {
|
||||
console.log("Active in I2P window");
|
||||
console.log("Active in I2P Torrent window");
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
@@ -301,6 +358,18 @@ function setTitle(window) {
|
||||
titlePreface: titlepref + " - " + torrentpref + ": "
|
||||
});
|
||||
}
|
||||
} else if (context.name == localpref) {
|
||||
console.log("Active in Localhost window");
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: localprefpriv + " - " + localprefpriv + ": "
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: localpref + " - " + localpref + ": "
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,17 +379,15 @@ function setTitle(window) {
|
||||
) {
|
||||
browser.contextualIdentities
|
||||
.get(tabInfo[0].cookieStoreId)
|
||||
.then(onContextGotTitle, onError);
|
||||
.then(onContextGotTitle, onContextError);
|
||||
} else if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
} else {
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
}
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -328,27 +395,38 @@ function setTitle(window) {
|
||||
currentWindow: true,
|
||||
active: true
|
||||
});
|
||||
querying.then(logTabs, onError);
|
||||
querying.then(logTabs, onContextError);
|
||||
}
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
} else {
|
||||
var gettingListenerInfo = browser.runtime.getPlatformInfo();
|
||||
gettingListenerInfo.then(got => {
|
||||
function onPlatformError() {
|
||||
console.log("Error finding platform info");
|
||||
}
|
||||
if (got.os != "android") {
|
||||
browser.windows.onCreated.addListener(() => {
|
||||
/* var gettingStoredSettings = chrome.storage.local.get();
|
||||
gettingStoredSettings.then(setupProxy, onError); */
|
||||
chrome.storage.local.get(function(got) {
|
||||
chrome.storage.local.get(function() {
|
||||
setupProxy();
|
||||
});
|
||||
});
|
||||
browser.tabs.onCreated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
});
|
||||
getting.then(setTitle, onPlatformError);
|
||||
});
|
||||
browser.tabs.onActivated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
});
|
||||
getting.then(setTitle, onPlatformError);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
} else {
|
||||
if (got.os != "android") {
|
||||
browser.tabs.onCreated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
@@ -357,11 +435,9 @@ gettingInfo.then(got => {
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
} else {
|
||||
if (got.os != "android") {
|
||||
browser.tabs.onActivated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
@@ -370,12 +446,12 @@ gettingInfo.then(got => {
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
*/
|
||||
function handleUpdated(updateInfo) {
|
||||
if (updateInfo.theme.colors) {
|
||||
if (updateInfo.theme) {
|
||||
console.log(`Theme was applied: ${updateInfo.theme}`);
|
||||
} else {
|
||||
console.log(`Theme was removed`);
|
||||
console.log("Theme was removed");
|
||||
}
|
||||
}
|
||||
|
||||
|
46
bookmarks.js
46
bookmarks.js
@@ -6,17 +6,16 @@ gettingInfo.then(got => {
|
||||
function bookHome(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url: "about:I2p",
|
||||
title: "I2P Home Page",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: browser.runtime.getURL("home.html"),
|
||||
title: "I2P Home Page",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
@@ -28,72 +27,69 @@ gettingInfo.then(got => {
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.then(gotProxyInfo);
|
||||
let gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
function bookTorrent(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: "http://localhost:7657/i2psnark",
|
||||
title: "Bittorrent",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url:
|
||||
"http://" + control_host + ":" + control_port + "/i2psnark",
|
||||
title: "Bittorrent",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.then(gotProxyInfo);
|
||||
let gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
function bookMail(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: "http://localhost:7657/webmail",
|
||||
title: "Web Mail",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url: "http://" + control_host + ":" + control_port + "/webmail",
|
||||
title: "Web Mail",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
console.log("(bookmarks) adding webmail bookmark");
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.then(gotProxyInfo);
|
||||
let gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
function bookI2PTunnel(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
@@ -103,7 +99,7 @@ gettingInfo.then(got => {
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
var createRhizomeBookmark = browser.bookmarks.create({
|
||||
url:
|
||||
"http://" +
|
||||
control_host +
|
||||
@@ -113,15 +109,15 @@ gettingInfo.then(got => {
|
||||
title: "Hidden Services Manager",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
console.log("(bookmarks) adding i2ptunnel bookmark");
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.then(gotProxyInfo);
|
||||
var gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,9 +156,9 @@ gettingInfo.then(got => {
|
||||
bt.then(bookmarks);
|
||||
|
||||
function handleCreated(id, bookmarkInfo) {
|
||||
var propValue;
|
||||
//var propValue;
|
||||
for (var propName in bookmarkInfo) {
|
||||
propValue = bookmarkInfo[propName];
|
||||
let propValue = bookmarkInfo[propName];
|
||||
console.log(propName, propValue);
|
||||
}
|
||||
}
|
||||
|
BIN
browser.pdf
Normal file
BIN
browser.pdf
Normal file
Binary file not shown.
16
context.js
16
context.js
@@ -26,7 +26,7 @@ function eventHandler(event) {
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
})
|
||||
.then(tabs => {
|
||||
browser.tabs.remove(tabs.map(i => i.id));
|
||||
browser.tabs.remove(tabs.map(rem => rem.id));
|
||||
});
|
||||
}
|
||||
event.preventDefault();
|
||||
@@ -34,13 +34,13 @@ function eventHandler(event) {
|
||||
|
||||
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);
|
||||
let alink = document.createElement("a");
|
||||
alink.href = "#";
|
||||
alink.innerText = option;
|
||||
alink.dataset.action = option.toLowerCase().replace(" ", "-");
|
||||
alink.dataset.identity = identity.cookieStoreId;
|
||||
alink.addEventListener("click", eventHandler);
|
||||
node.appendChild(alink);
|
||||
}
|
||||
}
|
||||
|
||||
|
17
debian/changelog
vendored
17
debian/changelog
vendored
@@ -1,10 +1,25 @@
|
||||
i2psetproxy.js (0.55-1) UNRELEASED; urgency=low
|
||||
|
||||
* Get rid of Web Browsing context launcher
|
||||
* Fix linter errors
|
||||
* Tolerate themes
|
||||
* Tolerate other containerizers
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 2 JAN 2019 16:47:33 -0400
|
||||
|
||||
i2psetproxy.js (0.53-1) UNRELEASED; urgency=low
|
||||
|
||||
* Quick Fix
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 20:11:30 -0400
|
||||
|
||||
i2psetproxy.js (0.51-1) UNRELEASED; urgency=low
|
||||
|
||||
* Numerous code cleanups, compatibility fixes
|
||||
* enable-disable history
|
||||
* better homepage, better control panel, saner options
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 22:51:11 -0400
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 20:10:30 -0400
|
||||
|
||||
i2psetproxy.js (0.49-1) UNRELEASED; urgency=low
|
||||
|
||||
|
1
debian/rules
vendored
1
debian/rules
vendored
@@ -15,6 +15,7 @@ override_dh_auto_install:
|
||||
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 ./*.xpi $$(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 \
|
||||
|
6
debian/source/include-binaries
vendored
6
debian/source/include-binaries
vendored
@@ -1,4 +1,6 @@
|
||||
i2psetproxy.js.gif
|
||||
i2psetproxy.js@eyedeekay.github.io.xpi
|
||||
i2pbb@eyedeekay.github.io.xpi
|
||||
web-ext-artifacts/i2p_in_private_browsing-0.51-an+fx.xpi
|
||||
i2ppb@eyedeekay.github.io.xpi
|
||||
web-ext-artifacts/i2p_in_private_browsing-0.51-an+fx.xpi
|
||||
smartlander.pdf
|
||||
browser.pdf
|
@@ -26,9 +26,9 @@ function trimHost(url) {
|
||||
return path;
|
||||
}
|
||||
|
||||
var handlerSetup = async function(requestDetails) {
|
||||
var handlerSetup = function(requestDetails) {
|
||||
//console.log("checking protocol handler listener")
|
||||
var rwurl = identifyProtocolHandler(requestDetails.url);
|
||||
let rwurl = identifyProtocolHandler(requestDetails.url);
|
||||
if (rwurl != false) {
|
||||
console.log("(handler) rewrite URL requested", rwurl);
|
||||
requestDetails.redirectUrl = rwurl;
|
||||
|
3
home.css
3
home.css
@@ -275,6 +275,9 @@ li {
|
||||
visibility: visible;
|
||||
opacity: 1
|
||||
}
|
||||
img {
|
||||
max-width: 100%
|
||||
}
|
||||
img.readyness {
|
||||
height: 100%;
|
||||
width: auto
|
||||
|
22
home.js
22
home.js
@@ -1,24 +1,24 @@
|
||||
document.addEventListener("click", e => {
|
||||
if (e.target.id === "onboardingButtonZero") {
|
||||
document.addEventListener("click", clickEvent => {
|
||||
if (clickEvent.target.id === "onboardingButtonZero") {
|
||||
flipVisibility("onboardingContentZero");
|
||||
} else if (e.target.id === "onboardingButtonOne") {
|
||||
} else if (clickEvent.target.id === "onboardingButtonOne") {
|
||||
flipVisibility("onboardingContentOne");
|
||||
} else if (e.target.id === "onboardingButtonTwo") {
|
||||
} else if (clickEvent.target.id === "onboardingButtonTwo") {
|
||||
flipVisibility("onboardingContentTwo");
|
||||
} else if (e.target.id === "onboardingButtonThree") {
|
||||
} else if (clickEvent.target.id === "onboardingButtonThree") {
|
||||
flipVisibility("onboardingContentThree");
|
||||
} else if (e.target.id === "onboardingButtonFour") {
|
||||
} else if (clickEvent.target.id === "onboardingButtonFour") {
|
||||
flipVisibility("onboardingContentFour");
|
||||
} else if (e.target.id === "fliplinks") {
|
||||
} else if (clickEvent.target.id === "fliplinks") {
|
||||
flipVisibility("info-content");
|
||||
}
|
||||
});
|
||||
|
||||
function flipVisibility(div) {
|
||||
var x = document.getElementById(div);
|
||||
if (x.style.display === "none") {
|
||||
x.style.display = "block";
|
||||
let flippable = document.getElementById(div);
|
||||
if (flippable.style.display === "none") {
|
||||
flippable.style.display = "block";
|
||||
} else {
|
||||
x.style.display = "none";
|
||||
flippable.style.display = "none";
|
||||
}
|
||||
}
|
||||
|
6
host.js
6
host.js
@@ -77,11 +77,11 @@ function routerHost(url) {
|
||||
}
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
prefix = url.substr(0, url.indexOf("://") + 3);
|
||||
let prefix = url.substr(0, url.indexOf("://") + 3);
|
||||
path = url.replace(prefix + hostname + "/", "");
|
||||
} else if (identifyProtocolHandler(url)) {
|
||||
url = identifyProtocolHandler(url);
|
||||
return routerHost(url);
|
||||
let newurl = identifyProtocolHandler(url);
|
||||
return routerHost(newurl);
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
path = url.replace(hostname + "/", "");
|
||||
|
193
index.html
193
index.html
@@ -1,44 +1,63 @@
|
||||
<strong>i2psetproxy.js</strong>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>I2P in Private Browsing Mode</title>
|
||||
<link rel="stylesheet" type="text/css" href ="home.css" />
|
||||
</head>
|
||||
<h1>i2psetproxy.js</h1>
|
||||
|
||||
WebExtension that does extended configuration of a dedicated I2P browser. While
|
||||
<strong>experimental</strong>, 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.
|
||||
<p>This is an <strong>Experimental</strong> webextension which introduces a set of new "Private
|
||||
Browsing" modes to Firefox-based browsers(Supporting webextensions) that makes
|
||||
it easier to configure a browser to use I2P securely and adds features for
|
||||
making I2P applications easier to use. It does this by isolating I2P-specific
|
||||
settings to Contextual Identities within Firefox, then loading them
|
||||
automatically when the user requests them. It also adds convenience and
|
||||
management features specific to I2P like protocol handlers and native messaging
|
||||
systems.</p>
|
||||
|
||||
<strong>The Old Version</strong>
|
||||
<h2>Installation(Cross-Platform):</h2>
|
||||
|
||||
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.
|
||||
<p>For desktop users this addon is available from addons.mozilla.org, where you
|
||||
will be able to recive automatic updates:
|
||||
https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/.</p>
|
||||
|
||||
<h2>Debian Installation:</h2>
|
||||
|
||||
<p>Should you prefer, it is possible to install this extension system-wide by
|
||||
side-loading it into Debian. You can generate your own deb file by running the
|
||||
command:</p>
|
||||
|
||||
<pre><code> make deb
|
||||
</code></pre>
|
||||
|
||||
<p>and then you can install it with:</p>
|
||||
|
||||
<pre><code> sudo apt install ../i2psetproxy.js_*.deb
|
||||
</code></pre>
|
||||
|
||||
<h2>Usage:</h2>
|
||||
|
||||
<ul>
|
||||
<li>This is the new version: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">[link]</a></li>
|
||||
<li>This is the old version: <a href="https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/">[link]</a></li>
|
||||
<li>Basically, it "Just Works." After you install the plugin, browsing to an I2P
|
||||
domain will automatically stop the current tab and re-open the I2P site in an
|
||||
I2P Browser tab.</li>
|
||||
<li>Besides that, four bookmarks are added to the "Bookmarks Toolbar," which
|
||||
will take you to visit your Java I2P applications, or the "Simplified I2P
|
||||
Landing Page" embedded in the plugin:</li>
|
||||
<li><img src="lander.png" alt="Landing page" title="" /></li>
|
||||
<li>Also, there's a menu for accessing I2P functionality while you're browsing.
|
||||
It lets you control a few settings in a granular way.</li>
|
||||
<li><img src="menu.png" alt="Menu" title="" /></li>
|
||||
<li>You can re-enable WebRTC but force it to always use the proxy that is
|
||||
enforced by the tab.</li>
|
||||
<li>You can either force the browser to delete all history for I2P sites
|
||||
immediately, or you can close all your I2P Browser tabs at once and delete
|
||||
the history for I2P browsing when you're done.</li>
|
||||
<li>That's all there is to it! Your browser is configured to safely use and
|
||||
administer I2P</li>
|
||||
</ul>
|
||||
|
||||
<strong>Android usage:</strong>
|
||||
|
||||
Open the following link
|
||||
<a href="https://github.com/eyedeekay/i2psetproxy.js/releases/">Github Releases Version</a>
|
||||
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.
|
||||
|
||||
<strong>addons.mozilla.org</strong>
|
||||
|
||||
If you would prefer to recieve automatic updates from AMO, the correct product
|
||||
page for this plugin is
|
||||
<a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">I2P In Private Browsing</a>.
|
||||
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.
|
||||
|
||||
<strong>Features</strong>
|
||||
<h3>Features</h3>
|
||||
|
||||
<ul>
|
||||
<li>[done] <strong>Provide</strong> a way to launch into an I2P-Specific contextual identity
|
||||
@@ -46,46 +65,78 @@ submission to AMO.
|
||||
to the I2P container. Isolate the router console from other local
|
||||
applications by automatically intercepting requests to the router console to
|
||||
another container.</li>
|
||||
<li>[done/wip] <strong>Indicate</strong> the I2P browser is in use visually. Find an
|
||||
<li><img src="i2psetproxy.js.png" alt="Visiting i2p-projekt.i2p" title="" /></li>
|
||||
<li>[done] <strong>Indicate</strong> the I2P browser is in use visually. Find an
|
||||
acceptable way to indicate it on Android.</li>
|
||||
<li><img src="susimail.png" alt="Visiting webmail" title="" /></li>
|
||||
<li>[done] <strong>Set</strong> the http proxy to use the local I2P proxy automatically.
|
||||
Provide specific configuration for other types of I2P proxies(SOCKS,
|
||||
isolating HTTP)</li>
|
||||
<li>[done/wip] <strong>Disable</strong> risky webRTC features/offer the option to re-enable
|
||||
<li>[done] <strong>Disable</strong> risky webRTC features/offer the option to re-enable
|
||||
them with the proxy enforced.</li>
|
||||
<li>[done] <strong>Change</strong> the color of the browser window to indicate that I2P is in
|
||||
use</li>
|
||||
<li>[done-ish] <strong>Reset</strong> the HTTP Proxy tunnel to generate a new destination
|
||||
on-demand
|
||||
<ul>
|
||||
<li>it does this by working in conjunction with this
|
||||
<a href="https://github.com/eyedeekay/httptunnel">standalone HTTP proxy</a>, currently
|
||||
disabled*.</li>
|
||||
</ul></li>
|
||||
<li>[ready] <strong>Provide</strong> help in a variety of languages.</li>
|
||||
<li><img src="i2ptunnel.png" alt="Visiting i2ptunnel" title="" /></li>
|
||||
<li>[ready/broken/wip] <strong>Provide</strong> help in a variety of languages.</li>
|
||||
<li>[wip] <strong>Monitor</strong> the health and readiness of the I2P router it is
|
||||
instructed to use.</li>
|
||||
<li>[1/2] <strong>Handle</strong> router console applications under their own origins and
|
||||
instructed to use. Currently the plugin checks whether the HTTP Proxy is
|
||||
working by fetching an image from "http://proxy.i2p" and displaying a result.
|
||||
A work-in-progress binding to i2pcontrol is available in ./i2pcontrol, it is
|
||||
inert at this time.</li>
|
||||
<li>[Done] <strong>Handle</strong> 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.</li>
|
||||
<li>[not started] <strong>Handle Torrents</strong> by talking to i2psnark-rpc plugin and then
|
||||
<li><img src="routerconsole.png" alt="Visiting routerconsole" title="" /></li>
|
||||
<li>[wip] <strong>Handle Torrents</strong> by talking to i2psnark-rpc plugin and then
|
||||
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
|
||||
can.</li>
|
||||
can. Right now instead of talking to snark-rpc, it uses a web-based protocl
|
||||
handler that simply auto-fills the torrent into i2psnark.</li>
|
||||
<li><img src="i2psnark.png" alt="Visiting i2psnark" title="" /></li>
|
||||
<li>[barely started] <strong>Isolate</strong> traffic by contextual identity to it's own HTTP
|
||||
Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The
|
||||
contextual identities. For now, the contextual identities used to manage
|
||||
browsing are "I2P Browsing" and "Web Browsing" where I2P Browsing is capable
|
||||
of using an outproxy but in the case of traffic destined for the clearnet
|
||||
does not do header rewriting, and Web Browsing falls back to the Proxy
|
||||
configured in Firefox. The I2P Browsing will be expanded to
|
||||
<ul>
|
||||
<li>I2P Amnesiac Browsing: Use for General Browsing, stores no history and
|
||||
uses an HTTP Proxy with a very short tunnel-close timeout and no key-reuse.</li>
|
||||
<li>I2P Social Networking: Use this for logging into social network accounts,
|
||||
forums, and other interactive asynchronous public communication platforms
|
||||
where your identity is behaviorally linkable. This has a very long
|
||||
tunnel-close timeout and key-reuse until specifically invoked.</li>
|
||||
<li>I2P Blogging: Use this for posting content to the web interface of your
|
||||
blog or to other similar websites that you create content on.</li>
|
||||
</ul></li>
|
||||
<li><img src="clearweb.png" alt="Visiting clearweb" title="" /></li>
|
||||
</ul>
|
||||
|
||||
<strong>Screenshot</strong>
|
||||
<h3>Video</h3>
|
||||
|
||||
<ul>
|
||||
<li><img src="i2psetproxy.js.gif" alt="Video of the plugin in action" title="" /></li>
|
||||
</ul>
|
||||
|
||||
<h2>Documents</h2>
|
||||
|
||||
<strong>Super Extra Important Background Info:</strong>
|
||||
<ul>
|
||||
<li><strong><a href="browser.pdf">Browser Outline</a></strong>: This document is an outline of each of
|
||||
the browser extension's feature panels in presentation form.</li>
|
||||
<li><strong><a href="smartlander.pdf">Smart Lander Design</a></strong>: This is the original outline of
|
||||
the smart landing page which became the I2P home page within the browser and
|
||||
the drop-down control panel.</li>
|
||||
</ul>
|
||||
|
||||
This plugin's viability is directly related to the viability of Mozilla and
|
||||
<h2>Super Extra Important Background Info:</h2>
|
||||
|
||||
<p>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.
|
||||
"Uplift" and "Fusion(Firefox Using Onions)" projects.</p>
|
||||
|
||||
<strong>Links about Project Uplift</strong>
|
||||
<h3>Links about Project Uplift</h3>
|
||||
|
||||
<ul>
|
||||
<li>https://wiki.mozilla.org/Security/Tor_Uplift</li>
|
||||
@@ -95,12 +146,44 @@ Tor's work on hardening Firefox itself and of particular interest are the
|
||||
<li>https://wiki.mozilla.org/Security/Tor_Uplift/Tracking</li>
|
||||
</ul>
|
||||
|
||||
Project uplift seems to have largely been accomplished?
|
||||
<p>Project uplift seems to have largely been accomplished?</p>
|
||||
|
||||
<strong>Links about Project Fusion</strong>
|
||||
<h3>Links about Project Fusion</h3>
|
||||
|
||||
<ul>
|
||||
<li>https://wiki.mozilla.org/Security/Fusion</li>
|
||||
<li>https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject</li>
|
||||
<li>https://blog.torproject.org/tor-heart-firefox</li>
|
||||
</ul>
|
||||
|
||||
<h2>The Old Version</h2>
|
||||
|
||||
<p>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.</p>
|
||||
|
||||
<ul>
|
||||
<li><p>This is the new version: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">[link]</a></p></li>
|
||||
<li><p>This is the old version: <a href="https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/">[link]</a></p></li>
|
||||
</ul>
|
||||
|
||||
<h2>Android usage:</h2>
|
||||
|
||||
<p>Open the following link
|
||||
<a href="https://github.com/eyedeekay/i2psetproxy.js/releases/">Github Releases Version</a>
|
||||
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.</p>
|
||||
|
||||
<h3>Android addons.mozilla.org(Temporarily Disabled)</h3>
|
||||
|
||||
<p>If you would prefer to recieve automatic updates from AMO, the correct product
|
||||
page for this plugin is
|
||||
<a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">I2P In Private Browsing</a>.
|
||||
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.</p>
|
||||
</html>
|
||||
|
94
info.js
94
info.js
@@ -1,7 +1,7 @@
|
||||
function checkPeerConnection() {
|
||||
var getting = browser.privacy.network.peerConnectionEnabled.get({});
|
||||
let getting = browser.privacy.network.peerConnectionEnabled.get({});
|
||||
getting.then(got => {
|
||||
webrtc = got.value;
|
||||
let webrtc = got.value;
|
||||
console.log("checking webrtc", webrtc);
|
||||
document.getElementById("enable-web-rtc").checked = webrtc;
|
||||
});
|
||||
@@ -10,10 +10,12 @@ function checkPeerConnection() {
|
||||
checkPeerConnection();
|
||||
|
||||
function checkHistory() {
|
||||
var getting = browser.storage.local.get("disable_history");
|
||||
let getting = browser.storage.local.get("disable_history");
|
||||
getting.then(got => {
|
||||
disable_history = got.disable_history;
|
||||
if (disable_history == undefined) disable_history = false;
|
||||
let disable_history = got.disable_history;
|
||||
if (disable_history == undefined) {
|
||||
disable_history = false;
|
||||
}
|
||||
console.log("checking history", disable_history);
|
||||
document.getElementById("disable-history").checked = disable_history;
|
||||
});
|
||||
@@ -21,8 +23,8 @@ function checkHistory() {
|
||||
|
||||
checkHistory();
|
||||
|
||||
document.addEventListener("click", e => {
|
||||
if (e.target.id === "window-create-help-panel") {
|
||||
document.addEventListener("click", clickEvent => {
|
||||
if (clickEvent.target.id === "window-create-help-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true
|
||||
@@ -31,7 +33,7 @@ document.addEventListener("click", e => {
|
||||
creating.then(() => {
|
||||
console.log("The help panel has been created");
|
||||
});
|
||||
} else if (e.target.id === "window-create-news-panel") {
|
||||
} else if (clickEvent.target.id === "window-create-news-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true
|
||||
@@ -40,54 +42,52 @@ document.addEventListener("click", e => {
|
||||
creating.then(() => {
|
||||
console.log("The news panel has been created");
|
||||
});
|
||||
} else if (e.target.id === "generate-fresh-tunnel") {
|
||||
function RefreshIdentity() {
|
||||
} else if (clickEvent.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 => {
|
||||
Http.onreadystatechange = event => {
|
||||
console.log(Http.responseText);
|
||||
};
|
||||
}
|
||||
RefreshIdentity();
|
||||
} else if (e.target.id === "window-preface-title") {
|
||||
} else if (e.target.id === "window-visit-homepage") {
|
||||
refreshIdentity();
|
||||
} else if (clickEvent.target.id === "window-preface-title") {
|
||||
} else if (clickEvent.target.id === "window-visit-homepage") {
|
||||
console.log("attempting to create homepage tab");
|
||||
goHome();
|
||||
} else if (e.target.id === "window-visit-i2ptunnel") {
|
||||
} else if (clickEvent.target.id === "window-visit-i2ptunnel") {
|
||||
console.log("attempting to create i2ptunnel tab");
|
||||
goTunnel();
|
||||
} else if (e.target.id === "window-visit-susimail") {
|
||||
} else if (clickEvent.target.id === "window-visit-susimail") {
|
||||
console.log("attempting to create susimail tab");
|
||||
goMail();
|
||||
} else if (e.target.id === "window-visit-snark") {
|
||||
} else if (clickEvent.target.id === "window-visit-snark") {
|
||||
console.log("attempting to create snark tab");
|
||||
goSnark();
|
||||
} else if (e.target.id === "clear-browser-data") {
|
||||
} else if (clickEvent.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) {
|
||||
} else if (clickEvent.target.id === "check-i2p-control") {
|
||||
//echo("I2P Router Detected", "panel-section-i2pcontrol-check");
|
||||
} else if (clickEvent.target.id === "enable-web-rtc") {
|
||||
if (clickEvent.target.checked) {
|
||||
browser.runtime.sendMessage({ rtc: "enableWebRTC" });
|
||||
} else {
|
||||
browser.runtime.sendMessage({ rtc: "disableWebRTC" });
|
||||
}
|
||||
//checkPeerConnection()
|
||||
return;
|
||||
} else if (e.target.id === "disable-history") {
|
||||
if (e.target.checked) {
|
||||
} else if (clickEvent.target.id === "disable-history") {
|
||||
if (clickEvent.target.checked) {
|
||||
browser.runtime.sendMessage({ history: "disableHistory" });
|
||||
} else {
|
||||
browser.runtime.sendMessage({ history: "enableHistory" });
|
||||
}
|
||||
//checkHistory()
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
clickEvent.preventDefault();
|
||||
});
|
||||
|
||||
function proxyReadiness() {
|
||||
@@ -103,14 +103,13 @@ gettingInfo.then(got => {
|
||||
|
||||
function goHome() {
|
||||
function gotProxyInfo(info) {
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
let createData = {
|
||||
let createRhizomeData = {
|
||||
url: "about:I2p"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
let creating = browser.tabs.create(createRhizomeData);
|
||||
} else {
|
||||
let createData = {
|
||||
url: "home.html"
|
||||
@@ -121,40 +120,56 @@ function goHome() {
|
||||
console.log("(bookmarks) adding home page bookmark");
|
||||
}
|
||||
console.log("(bookmarks) checking if we're running in an I2P Browser");
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.then(gotProxyInfo);
|
||||
var gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
|
||||
function onTabCreated() {
|
||||
console.log("Tab Created");
|
||||
}
|
||||
|
||||
function goTunnel() {
|
||||
function onTabError() {
|
||||
console.log("I2PTunnel tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + control_host + ":" + control_port + "/i2ptunnel"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
console.log("visiting i2ptunnel");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function goMail() {
|
||||
function onTabError() {
|
||||
console.log("Mail tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + control_host + ":" + control_port + "/susimail"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
console.log("visiting mail");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function goSnark() {
|
||||
function onTabError() {
|
||||
console.log("Snark tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + control_host + ":" + control_port + "/i2psnark"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
console.log("visiting snark");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function onVisited(historyItem) {
|
||||
function onCleaned(results) {
|
||||
if (!results.length) {
|
||||
console.log(" was removed");
|
||||
} else {
|
||||
if (results.length) {
|
||||
console.log(" was not removed");
|
||||
} else {
|
||||
console.log(" was removed");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,8 +181,9 @@ function onVisited(historyItem) {
|
||||
searching.then(onCleaned);
|
||||
}
|
||||
if (!history) {
|
||||
if (i2pHost(historyItem.url))
|
||||
if (i2pHost(historyItem.url)) {
|
||||
var deletingUrl = browser.history.deleteUrl(historyItem.url);
|
||||
}
|
||||
deletingUrl.then(onRemoved);
|
||||
}
|
||||
}
|
||||
|
BIN
lander.png
Normal file
BIN
lander.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 71 KiB |
@@ -23,8 +23,8 @@
|
||||
],
|
||||
"manifest_version": 2,
|
||||
"name": "__MSG_extensionName__",
|
||||
"version": "0.51",
|
||||
"version_name": "0.51",
|
||||
"version": "0.54",
|
||||
"version_name": "0.54",
|
||||
"description": "__MSG_extensionDescription__",
|
||||
"homepage_url": "https://github.com/eyedeekay/i2psetproxy.js",
|
||||
"icons": {
|
||||
|
22
platform.js
22
platform.js
@@ -1,16 +1,3 @@
|
||||
var titlepref = chrome.i18n.getMessage("titlePreface");
|
||||
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
|
||||
var webpref = chrome.i18n.getMessage("webPreface");
|
||||
var webprefpriv = chrome.i18n.getMessage("webPrefacePrivate");
|
||||
var routerpref = chrome.i18n.getMessage("routerPreface");
|
||||
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
|
||||
var mailpref = chrome.i18n.getMessage("mailPreface");
|
||||
var mailprefpriv = chrome.i18n.getMessage("mailPrefacePrivate");
|
||||
var torrentpref = chrome.i18n.getMessage("torrentPreface");
|
||||
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
|
||||
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
|
||||
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
|
||||
|
||||
var android = false;
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
@@ -21,10 +8,19 @@ gettingInfo.then(got => {
|
||||
return true;
|
||||
} else {
|
||||
console.log("Running in Desktop detected");
|
||||
android = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
function isDroid() {
|
||||
console.log("android?", android);
|
||||
if (android == undefined) {
|
||||
return false;
|
||||
}
|
||||
return android;
|
||||
}
|
||||
|
||||
function notClosable() {
|
||||
return false;
|
||||
}
|
||||
|
52
privacy.js
52
privacy.js
@@ -1,13 +1,4 @@
|
||||
var webpref = chrome.i18n.getMessage("webPreface");
|
||||
var webprefpriv = chrome.i18n.getMessage("webPrefacePrivate");
|
||||
var routerpref = chrome.i18n.getMessage("routerPreface");
|
||||
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
|
||||
var mailpref = chrome.i18n.getMessage("mailPreface");
|
||||
var mailprefpriv = chrome.i18n.getMessage("mailPrefacePrivate");
|
||||
var torrentpref = chrome.i18n.getMessage("torrentPreface");
|
||||
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
|
||||
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
|
||||
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
|
||||
var titlepref = chrome.i18n.getMessage("titlePreface");
|
||||
|
||||
function onSet(result) {
|
||||
if (result) {
|
||||
@@ -158,7 +149,7 @@ function EnablePeerConnection() {
|
||||
function SetupPeerConnection() {
|
||||
var webrtc = true;
|
||||
console.log("Pre-disabled WebRTC");
|
||||
rtc = browser.privacy.network.peerConnectionEnabled.set({
|
||||
let rtc = browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: webrtc
|
||||
});
|
||||
rtc.then(AssurePeerConnection);
|
||||
@@ -211,17 +202,10 @@ var defaultSettings = {
|
||||
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"]
|
||||
};
|
||||
|
||||
var appSettings = {
|
||||
since: "forever",
|
||||
dataTypes: [""]
|
||||
};
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
function onError(therror) {
|
||||
console.error(therror);
|
||||
}
|
||||
|
||||
function clearCookiesContext(cookieStoreId) {}
|
||||
|
||||
function forgetBrowsingData(storedSettings) {
|
||||
function getSince(selectedSince) {
|
||||
if (selectedSince === "forever") {
|
||||
@@ -261,7 +245,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
|
||||
function deepCleanHistory(historyItems) {
|
||||
console.log("Deep cleaning history");
|
||||
for (item of historyItems) {
|
||||
for (let item of historyItems) {
|
||||
if (i2pHost(item.url)) {
|
||||
browser.history.deleteUrl({
|
||||
url: item.url
|
||||
@@ -297,12 +281,12 @@ function forgetBrowsingData(storedSettings) {
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Local Storage");
|
||||
|
||||
contexts = browser.contextualIdentities.query({
|
||||
let contexts = browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
});
|
||||
|
||||
function deepCleanCookies(cookies) {
|
||||
for (cookie of cookies) {
|
||||
for (let cookie of cookies) {
|
||||
var removing = browser.cookies.remove({
|
||||
firstPartyDomain: cookie.firstPartyDomain,
|
||||
name: cookie.name,
|
||||
@@ -314,7 +298,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
}
|
||||
|
||||
function deepCleanContext(cookieStoreIds) {
|
||||
for (cookieStoreId of cookieStoreIds) {
|
||||
for (let cookieStoreId of cookieStoreIds) {
|
||||
var removing = browser.cookies.getAll({
|
||||
firstPartyDomain: null,
|
||||
storeId: cookieStoreId.cookieStoreId
|
||||
@@ -356,7 +340,7 @@ function i2pHost(url) {
|
||||
}
|
||||
|
||||
function onContextGotLog(contexts) {
|
||||
if (contexts != null) {
|
||||
if (contexts !== null) {
|
||||
for (let context of contexts) {
|
||||
console.log(context);
|
||||
}
|
||||
@@ -370,9 +354,9 @@ function enableHistory() {
|
||||
storedSettings["disable_history"] = false;
|
||||
console.log(storedSettings);
|
||||
function enablehistory(settings) {
|
||||
console.log("Store History:", storedSettings);
|
||||
console.log("Store History:", settings);
|
||||
}
|
||||
var setting = browser.storage.local.set(storedSettings);
|
||||
let setting = browser.storage.local.set(storedSettings);
|
||||
setting.then(enablehistory);
|
||||
}
|
||||
const gettingStoredSettings = browser.storage.local.get();
|
||||
@@ -384,7 +368,7 @@ function disableHistory() {
|
||||
storedSettings["disable_history"] = true;
|
||||
console.log(storedSettings);
|
||||
function enablehistory(settings) {
|
||||
console.log("Store History:", storedSettings);
|
||||
console.log("Store History:", settings);
|
||||
}
|
||||
var setting = browser.storage.local.set(storedSettings);
|
||||
setting.then(enablehistory);
|
||||
@@ -393,19 +377,19 @@ function disableHistory() {
|
||||
gettingStoredSettings.then(checkStoredSettings, onError);
|
||||
}
|
||||
|
||||
function message(message) {
|
||||
console.log(message);
|
||||
if (message.rtc === "enableWebRTC") {
|
||||
function message(recieved) {
|
||||
console.log(recieved);
|
||||
if (recieved.rtc === "enableWebRTC") {
|
||||
console.log("enableWebRTC");
|
||||
EnablePeerConnection();
|
||||
} else if (message.rtc === "disableWebRTC") {
|
||||
} else if (recieved.rtc === "disableWebRTC") {
|
||||
console.log("disableWebRTC");
|
||||
ResetPeerConnection();
|
||||
}
|
||||
if (message.history === "enableHistory") {
|
||||
if (recieved.history === "enableHistory") {
|
||||
console.log("enableHistory");
|
||||
enableHistory();
|
||||
} else if (message.history === "disableHistory") {
|
||||
} else if (recieved.history === "disableHistory") {
|
||||
console.log("disableHistory");
|
||||
disableHistory();
|
||||
}
|
||||
|
91
proxy.js
91
proxy.js
@@ -1,15 +1,7 @@
|
||||
var titlepref = chrome.i18n.getMessage("titlePreface");
|
||||
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
|
||||
var webpref = chrome.i18n.getMessage("webPreface");
|
||||
var webprefpriv = chrome.i18n.getMessage("webPrefacePrivate");
|
||||
var routerpref = chrome.i18n.getMessage("routerPreface");
|
||||
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
|
||||
var mailpref = chrome.i18n.getMessage("mailPreface");
|
||||
var mailprefpriv = chrome.i18n.getMessage("mailPrefacePrivate");
|
||||
var torrentpref = chrome.i18n.getMessage("torrentPreface");
|
||||
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
|
||||
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
|
||||
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
|
||||
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: false
|
||||
@@ -46,14 +38,9 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
console.log("(proxy)", context.name);
|
||||
console.log("Using", proxy.type);
|
||||
console.log("proxy ", proxy.host + ":" + proxy.port);
|
||||
return proxy;
|
||||
} else if (context.name == routerpref) {
|
||||
if (routerHost(requestDetails.url)) {
|
||||
@@ -70,14 +57,9 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
console.log("(proxy)", context.name);
|
||||
console.log("Using", proxy.type);
|
||||
console.log("proxy ", proxy.host + ":" + proxy.port);
|
||||
return proxy;
|
||||
} else if (context.name == webpref) {
|
||||
if (localHost(requestDetails.url)) {
|
||||
@@ -89,28 +71,23 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
};
|
||||
}
|
||||
}
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
console.log("(proxy)", context.name);
|
||||
console.log("Using", proxy.type);
|
||||
console.log("proxy ", proxy.host + ":" + proxy.port);
|
||||
return proxy;
|
||||
}
|
||||
}
|
||||
if (!routerHost(requestDetails.url)) {
|
||||
if (localHost(requestDetails.url)) {
|
||||
console.log(
|
||||
"(proxy) non-routerconsole localhost url, dropping",
|
||||
"(proxy) non-routerconsole localhost url, will not interfere",
|
||||
requestDetails.url
|
||||
);
|
||||
proxy = {
|
||||
/*proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};
|
||||
};*/
|
||||
}
|
||||
} else if (i2pHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
@@ -127,7 +104,8 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
|
||||
return context;
|
||||
} catch (error) {
|
||||
return "firefox-default";
|
||||
console.error(error);
|
||||
//return; //"firefox-default";
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
@@ -164,9 +142,9 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
return proxy;
|
||||
}
|
||||
proxy = {};
|
||||
/*proxy = {};
|
||||
console.log("(proxy)Returning unset Proxy", proxy);
|
||||
return proxy;
|
||||
return proxy;*/
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(proxy)Not using I2P Proxy.", error);
|
||||
@@ -182,19 +160,22 @@ var disable_history = false;
|
||||
|
||||
function SetupSettings() {
|
||||
console.log("Initialising Settings");
|
||||
function onSetupError() {
|
||||
console.log("Settings initialization error");
|
||||
}
|
||||
//
|
||||
function checkSchemeStoredSettings(storedSettings) {
|
||||
if (storedSettings.proxy_scheme != undefined) {
|
||||
proxy_scheme = storedSettings.proxy_scheme;
|
||||
} else {
|
||||
if (storedSettings.proxy_scheme === undefined) {
|
||||
proxy_scheme = "http";
|
||||
storedSettings.proxy_scheme = proxy_scheme;
|
||||
} else {
|
||||
proxy_scheme = storedSettings.proxy_scheme;
|
||||
}
|
||||
console.log("Initialising Proxy Scheme", storedSettings.proxy_scheme);
|
||||
setupProxy();
|
||||
}
|
||||
var gettingSchemeStoredSettings = browser.storage.local.get("proxy_scheme");
|
||||
gettingSchemeStoredSettings.then(checkSchemeStoredSettings, onError);
|
||||
gettingSchemeStoredSettings.then(checkSchemeStoredSettings, onSetupError);
|
||||
|
||||
//
|
||||
function checkHostStoredSettings(storedSettings) {
|
||||
@@ -208,7 +189,7 @@ function SetupSettings() {
|
||||
setupProxy();
|
||||
}
|
||||
var gettingHostStoredSettings = browser.storage.local.get("proxy_host");
|
||||
gettingHostStoredSettings.then(checkHostStoredSettings, onError);
|
||||
gettingHostStoredSettings.then(checkHostStoredSettings, onSetupError);
|
||||
|
||||
//
|
||||
function checkPortStoredSettings(storedSettings) {
|
||||
@@ -222,7 +203,7 @@ function SetupSettings() {
|
||||
setupProxy();
|
||||
}
|
||||
var gettingPortStoredSettings = browser.storage.local.get("proxy_port");
|
||||
gettingPortStoredSettings.then(checkPortStoredSettings, onError);
|
||||
gettingPortStoredSettings.then(checkPortStoredSettings, onSetupError);
|
||||
|
||||
//
|
||||
function checkControlHostStoredSettings(storedSettings) {
|
||||
@@ -240,16 +221,16 @@ function SetupSettings() {
|
||||
);
|
||||
gettingControlHostStoredSettings.then(
|
||||
checkControlHostStoredSettings,
|
||||
onError
|
||||
onSetupError
|
||||
);
|
||||
|
||||
//
|
||||
function checkControlPortStoredSettings(storedSettings) {
|
||||
if (storedSettings.control_port != undefined) {
|
||||
contro_port = storedSettings.control_port;
|
||||
let control_port = storedSettings.control_port;
|
||||
} else {
|
||||
control_port = "7657";
|
||||
storedSettings.control_port = control_port;
|
||||
let new_control_port = "7657";
|
||||
storedSettings.control_port = new_control_port;
|
||||
}
|
||||
console.log("Initialising Control Port", storedSettings.control_port);
|
||||
setupProxy();
|
||||
@@ -259,7 +240,7 @@ function SetupSettings() {
|
||||
);
|
||||
gettingControlPortStoredSettings.then(
|
||||
checkControlPortStoredSettings,
|
||||
onError
|
||||
onSetupError
|
||||
);
|
||||
|
||||
//
|
||||
@@ -279,7 +260,7 @@ function SetupSettings() {
|
||||
var gettingHistoryStoredSettings = browser.storage.local.get(
|
||||
"disable_history"
|
||||
);
|
||||
gettingHistoryStoredSettings.then(checkHistoryStoredSettings, onError);
|
||||
gettingHistoryStoredSettings.then(checkHistoryStoredSettings, onSetupError);
|
||||
}
|
||||
|
||||
function getScheme() {
|
||||
@@ -333,12 +314,6 @@ function getControlPort() {
|
||||
}
|
||||
|
||||
function setupProxy() {
|
||||
//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, {
|
||||
@@ -362,13 +337,13 @@ function updateFromStorage() {
|
||||
gettingInfo.then(got => {
|
||||
if (got.os != "android") {
|
||||
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
|
||||
chrome.storage.local.get(function(got) {
|
||||
chrome.storage.local.get(function() {
|
||||
SetupSettings();
|
||||
update();
|
||||
setupProxy();
|
||||
});
|
||||
} else {
|
||||
chrome.storage.local.get(function(got) {
|
||||
chrome.storage.local.get(function() {
|
||||
SetupSettings();
|
||||
update();
|
||||
setupProxy();
|
||||
|
240
scrub.js
240
scrub.js
@@ -1,24 +1,22 @@
|
||||
var titlepref = chrome.i18n.getMessage("titlePreface");
|
||||
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
|
||||
var webpref = chrome.i18n.getMessage("webPreface");
|
||||
var webprefpriv = chrome.i18n.getMessage("webPrefacePrivate");
|
||||
var routerpref = chrome.i18n.getMessage("routerPreface");
|
||||
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
|
||||
var mailpref = chrome.i18n.getMessage("mailPreface");
|
||||
var mailprefpriv = chrome.i18n.getMessage("mailPrefacePrivate");
|
||||
var torrentpref = chrome.i18n.getMessage("torrentPreface");
|
||||
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
|
||||
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
|
||||
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
|
||||
var localpref = chrome.i18n.getMessage("localPreface");
|
||||
|
||||
var contextScrub = async function(requestDetails) {
|
||||
function onHeaderError() {
|
||||
console.log("Header scrub error");
|
||||
}
|
||||
console.log("(scrub)Scrubbing info from contextualized request");
|
||||
try {
|
||||
var headerScrub = function(context) {
|
||||
var ua = "MYOB/6.66 (AN/ON)";
|
||||
if (!context) {
|
||||
console.error("Context not found", context);
|
||||
console.log("Context not found", context);
|
||||
} else if (context.name == titlepref) {
|
||||
var ua = "MYOB/6.66 (AN/ON)";
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
for (var header of requestDetails.requestHeaders) {
|
||||
if (header.name.toLowerCase() === "user-agent") {
|
||||
@@ -31,7 +29,6 @@ var contextScrub = async function(requestDetails) {
|
||||
requestHeaders: requestDetails.requestHeaders
|
||||
};
|
||||
} else if (context.name == routerpref) {
|
||||
var ua = "MYOB/6.66 (AN/ON)";
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
for (var header of requestDetails.requestHeaders) {
|
||||
if (header.name.toLowerCase() === "user-agent") {
|
||||
@@ -39,7 +36,6 @@ var contextScrub = async function(requestDetails) {
|
||||
console.log("(scrub)User-Agent header modified", header.value);
|
||||
}
|
||||
}
|
||||
} else if (routerHost(requestDetails.url)) {
|
||||
}
|
||||
return {
|
||||
requestHeaders: requestDetails.requestHeaders
|
||||
@@ -49,22 +45,21 @@ var contextScrub = async function(requestDetails) {
|
||||
var contextGet = async function(tabInfo) {
|
||||
try {
|
||||
console.log("(scrub)Tab info from Function", tabInfo);
|
||||
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
|
||||
let context = await browser.contextualIdentities.get(
|
||||
tabInfo.cookieStoreId
|
||||
);
|
||||
return context;
|
||||
} catch (error) {
|
||||
return "firefox-default";
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(scrub)Tab ID from Request", tabId);
|
||||
let ostype = await browser.runtime.getPlatformInfo();
|
||||
if (ostype == android) tabId += 1;
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
let tabInfo = await browser.tabs.getCurrent();
|
||||
return tabInfo;
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
if (requestDetails.tabId > 0) {
|
||||
@@ -74,14 +69,14 @@ var contextScrub = async function(requestDetails) {
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
console.log("(scrub)I2P URL detected, ");
|
||||
tab = tabGet(requestDetails.tabId);
|
||||
context = tab.then(contextGet, onError);
|
||||
req = await context.then(headerScrub, onError);
|
||||
context = tab.then(contextGet, onHeaderError);
|
||||
req = await context.then(headerScrub, onHeaderError);
|
||||
console.log("(scrub)Scrubbing I2P Request", req);
|
||||
return req;
|
||||
} else if (routerHost(requestDetails.url)) {
|
||||
tab = tabGet(requestDetails.tabId);
|
||||
context = tab.then(contextGet, onError);
|
||||
req = await context.then(headerScrub, onError);
|
||||
context = tab.then(contextGet, onHeaderError);
|
||||
req = await context.then(headerScrub, onHeaderError);
|
||||
console.log("(scrub)Scrubbing non-I2P Request", req);
|
||||
return req;
|
||||
}
|
||||
@@ -93,6 +88,9 @@ var contextScrub = async function(requestDetails) {
|
||||
};
|
||||
|
||||
var contextSetup = async function(requestDetails) {
|
||||
function onContextError() {
|
||||
console.log("Context launcher error");
|
||||
}
|
||||
console.log("(isolate)Forcing I2P requests into context");
|
||||
try {
|
||||
var i2pTabFind = async function(tabId) {
|
||||
@@ -101,22 +99,29 @@ var contextSetup = async function(requestDetails) {
|
||||
name: titlepref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create(window) {
|
||||
console.log("(isolate) I2P context", context[0].cookieStoreId);
|
||||
console.log("tab context", tabId.cookieStoreId);
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
if (tabId != undefined) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log("(isolate) Closing un-isolated tab", tabId.id);
|
||||
console.log("in favor of", tab.id);
|
||||
console.log("with context", tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var getting = browser.tabs.getCurrent();
|
||||
getting.then(Create, onError);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -129,22 +134,29 @@ var contextSetup = async function(requestDetails) {
|
||||
name: routerpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create(window) {
|
||||
console.log("(isolate) I2P context", context[0].cookieStoreId);
|
||||
console.log("tab context", tabId.cookieStoreId);
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
if (tabId != undefined) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log("(isolate) Closing un-isolated tab", tabId.id);
|
||||
console.log("in favor of", tab.id);
|
||||
console.log("with context", tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var getting = browser.tabs.getCurrent();
|
||||
getting.then(Create, onError);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -157,22 +169,29 @@ var contextSetup = async function(requestDetails) {
|
||||
name: tunnelpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create(window) {
|
||||
console.log("(isolate) I2P context", context[0].cookieStoreId);
|
||||
console.log("tab context", tabId.cookieStoreId);
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
if (tabId != undefined) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log("(isolate) Closing un-isolated tab", tabId.id);
|
||||
console.log("in favor of", tab.id);
|
||||
console.log("with context", tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var getting = browser.tabs.getCurrent();
|
||||
getting.then(Create, onError);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -185,22 +204,29 @@ var contextSetup = async function(requestDetails) {
|
||||
name: torrentpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create(window) {
|
||||
console.log("(isolate) I2P context", context[0].cookieStoreId);
|
||||
console.log("tab context", tabId.cookieStoreId);
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
if (tabId != undefined) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log("(isolate) Closing un-isolated tab", tabId.id);
|
||||
console.log("in favor of", tab.id);
|
||||
console.log("with context", tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var getting = browser.tabs.getCurrent();
|
||||
getting.then(Create, onError);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -213,22 +239,64 @@ var contextSetup = async function(requestDetails) {
|
||||
name: mailpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create(window) {
|
||||
console.log("(isolate) I2P context", context[0].cookieStoreId);
|
||||
console.log("tab context", tabId.cookieStoreId);
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
if (tabId != undefined) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log("(isolate) Closing un-isolated tab", tabId.id);
|
||||
console.log("in favor of", tab.id);
|
||||
console.log("with context", tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var getting = browser.tabs.getCurrent();
|
||||
getting.then(Create, onError);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
}
|
||||
};
|
||||
var localTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: localpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log("(isolate) I2P context", context[0].cookieStoreId);
|
||||
console.log("tab context", tabId.cookieStoreId);
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log("(isolate) Closing un-isolated tab", tabId.id);
|
||||
console.log("in favor of", tab.id);
|
||||
console.log("with context", tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -246,22 +314,29 @@ var contextSetup = async function(requestDetails) {
|
||||
tabId.cookieStoreId == "firefox-private"
|
||||
) {
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create(window) {
|
||||
console.log("(isolate) I2P context", context[0].cookieStoreId);
|
||||
console.log("tab context", tabId.cookieStoreId);
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
if (tabId != undefined) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log("(isolate) Closing un-isolated tab", tabId.id);
|
||||
console.log("in favor of", tab.id);
|
||||
console.log("with context", tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var getting = browser.tabs.getCurrent();
|
||||
getting.then(Create, onError);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
}
|
||||
@@ -288,13 +363,12 @@ var contextSetup = async function(requestDetails) {
|
||||
url: requestDetails.url,
|
||||
secure: true
|
||||
});
|
||||
setcookie.then(onContextGotLog, onError);
|
||||
setcookie.then(onContextGotLog, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
console.log("(isolate)Request Details", requestDetails);
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
if (extensionHost(requestDetails.url)) {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(anyTabFind, onError);
|
||||
return requestDetails;
|
||||
}
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
@@ -303,46 +377,36 @@ var contextSetup = async function(requestDetails) {
|
||||
url: requestDetails.url,
|
||||
secure: true
|
||||
});
|
||||
setcookie.then(onContextGotLog, onError);
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(i2pTabFind, onError);
|
||||
setcookie.then(onContextGotLog, onContextError);
|
||||
var i2ptab = tab.then(i2pTabFind, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
let localhost = localHost(requestDetails.url);
|
||||
let routerhost = routerHost(requestDetails.url);
|
||||
if (!routerhost) {
|
||||
if (localhost) {
|
||||
var localtab = tab.then(localTabFind, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
}
|
||||
if (routerhost) {
|
||||
if (routerhost === "i2ptunnelmgr") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(i2ptunnelTabFind, onError);
|
||||
var tunneltab = tab.then(i2ptunnelTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === "i2psnark") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(snarkTabFind, onError);
|
||||
var snarktab = tab.then(snarkTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === "webmail") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(mailTabFind, onError);
|
||||
var mailtab = tab.then(mailTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === "routerconsole") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(routerTabFind, onError);
|
||||
var routertab = tab.then(routerTabFind, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
} else {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(anyTabFind, onError);
|
||||
return requestDetails;
|
||||
}
|
||||
}
|
||||
if (typeof requestDetails == "number") {
|
||||
tab = tabGet(requestDetails);
|
||||
var mtab = tab.then(anyTabFind);
|
||||
} else if (typeof requestDetails != undefined) {
|
||||
if (typeof requestDetails.tabId > 0) {
|
||||
tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(anyTabFind);
|
||||
}
|
||||
}
|
||||
return requestDetails;
|
||||
} catch (error) {
|
||||
console.log("(isolate)Not an I2P request, blackholing", error);
|
||||
}
|
||||
|
BIN
smartlander.pdf
Normal file
BIN
smartlander.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user