Compare commits
100 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c93e16875f | ||
![]() |
fbaf1dca30 | ||
![]() |
527e91b6cf | ||
![]() |
ee0ca69195 | ||
![]() |
709854c1d1 | ||
![]() |
9ebdcc94c5 | ||
![]() |
9e07c3e554 | ||
![]() |
399365b2b7 | ||
![]() |
52381453fb | ||
![]() |
317034cb5a | ||
![]() |
e9b5060203 | ||
![]() |
2ea3bc169b | ||
![]() |
f4c45c4834 | ||
![]() |
80bcf6e7ea | ||
![]() |
b7a887c578 | ||
![]() |
731a929a88 | ||
![]() |
8eb75be6ec | ||
![]() |
30ce917afa | ||
![]() |
0d5fb3c1bd | ||
![]() |
6d5f56922b | ||
![]() |
8b0bea4e7d | ||
![]() |
92057d459d | ||
![]() |
0c30b2e921 | ||
![]() |
df1d971a4d | ||
![]() |
9bd7485d4a | ||
![]() |
c98f0399d2 | ||
![]() |
15a20cc25f | ||
![]() |
b342039e8f | ||
![]() |
343cec93e2 | ||
![]() |
b05ee528fd | ||
![]() |
d7c4340b4c | ||
![]() |
e819532f29 | ||
![]() |
a1a9c8221e | ||
![]() |
1ebf80b644 | ||
![]() |
3727987dd3 | ||
![]() |
34e1251292 | ||
![]() |
fdf777640d | ||
![]() |
4cde00c7de | ||
![]() |
92ce8431a2 | ||
![]() |
f233972323 | ||
![]() |
f27a59c193 | ||
![]() |
b9200a4313 | ||
![]() |
b7ebbd5b79 | ||
![]() |
e631c82363 | ||
![]() |
43e6818324 | ||
![]() |
fc019c58bb | ||
![]() |
2e8a61de2e | ||
![]() |
d770abcce8 | ||
![]() |
ecda2d7102 | ||
![]() |
f670bef983 | ||
![]() |
aa71f917a6 | ||
![]() |
33cfbc324a | ||
![]() |
38d5dcb929 | ||
![]() |
994b021a95 | ||
![]() |
c2f321b26b | ||
![]() |
04d58b33be | ||
![]() |
a7562fd66e | ||
![]() |
595f02c01b | ||
![]() |
3d4a49827f | ||
![]() |
fa579b8586 | ||
![]() |
58b91e1a80 | ||
![]() |
997689806b | ||
![]() |
df4d9e93a6 | ||
![]() |
6cd37b51c0 | ||
![]() |
924dd29323 | ||
![]() |
c92c0caa0f | ||
![]() |
b278450aea | ||
![]() |
1f014dd37e | ||
![]() |
a87722b6fc | ||
![]() |
c0ea4df7ec | ||
![]() |
3a2fca2f26 | ||
![]() |
ec1f547f09 | ||
![]() |
d1643e8c71 | ||
![]() |
52f695691c | ||
![]() |
1619181fc9 | ||
![]() |
fa3c94b736 | ||
![]() |
c61aa13ffc | ||
![]() |
ab0282bde9 | ||
![]() |
86913e18d3 | ||
![]() |
c4a2fa6ec0 | ||
![]() |
14b246fc00 | ||
![]() |
577c10aee7 | ||
![]() |
a51fd5ffa7 | ||
![]() |
08eeb054c3 | ||
![]() |
af08c3d800 | ||
![]() |
e6f1fbbe8b | ||
![]() |
73943f9d43 | ||
![]() |
1edd41900f | ||
![]() |
b9d6171c8d | ||
![]() |
00dd8fe597 | ||
![]() |
556e797945 | ||
![]() |
32997bdf68 | ||
![]() |
2ae30167ab | ||
![]() |
3febeb5214 | ||
![]() |
222e3b442b | ||
![]() |
6d5b2217cb | ||
![]() |
a6860e50be | ||
![]() |
918bb09226 | ||
![]() |
3b6fbd6ef1 | ||
![]() |
b42ec59d41 |
251
.eslintrc.js
Normal file
@@ -0,0 +1,251 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
es6: true,
|
||||
webextensions: true
|
||||
},
|
||||
extends: "eslint:recommended",
|
||||
globals: {
|
||||
Atomics: "readonly",
|
||||
SharedArrayBuffer: "readonly"
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018
|
||||
},
|
||||
rules: {
|
||||
"accessor-pairs": "error",
|
||||
"array-bracket-newline": "error",
|
||||
"array-bracket-spacing": ["error", "never"],
|
||||
"array-callback-return": "error",
|
||||
"array-element-newline": "error",
|
||||
"arrow-body-style": "error",
|
||||
"arrow-parens": ["error", "as-needed"],
|
||||
"arrow-spacing": [
|
||||
"error",
|
||||
{
|
||||
after: true,
|
||||
before: true
|
||||
}
|
||||
],
|
||||
"block-scoped-var": "off",
|
||||
"block-spacing": "error",
|
||||
"brace-style": ["error", "1tbs"],
|
||||
"callback-return": "error",
|
||||
camelcase: "off",
|
||||
"capitalized-comments": "off",
|
||||
"class-methods-use-this": "error",
|
||||
"comma-dangle": "error",
|
||||
"comma-spacing": [
|
||||
"error",
|
||||
{
|
||||
after: true,
|
||||
before: false
|
||||
}
|
||||
],
|
||||
"comma-style": ["error", "last"],
|
||||
complexity: "error",
|
||||
"computed-property-spacing": ["error", "never"],
|
||||
"consistent-return": "off",
|
||||
"consistent-this": "error",
|
||||
curly: "error",
|
||||
"default-case": "error",
|
||||
"default-param-last": "error",
|
||||
"dot-location": "error",
|
||||
"dot-notation": "off",
|
||||
"eol-last": "error",
|
||||
eqeqeq: "off",
|
||||
"func-call-spacing": "error",
|
||||
"func-name-matching": "error",
|
||||
"func-names": "off",
|
||||
"func-style": "off",
|
||||
"function-call-argument-newline": ["error", "consistent"],
|
||||
"function-paren-newline": "error",
|
||||
"generator-star-spacing": "error",
|
||||
"global-require": "error",
|
||||
"guard-for-in": "error",
|
||||
"handle-callback-err": "error",
|
||||
"id-blacklist": "error",
|
||||
"id-length": "error",
|
||||
"id-match": "error",
|
||||
"implicit-arrow-linebreak": ["error", "beside"],
|
||||
indent: "off",
|
||||
"indent-legacy": "off",
|
||||
"init-declarations": "error",
|
||||
"jsx-quotes": "error",
|
||||
"key-spacing": "error",
|
||||
"keyword-spacing": [
|
||||
"error",
|
||||
{
|
||||
after: true,
|
||||
before: true
|
||||
}
|
||||
],
|
||||
"line-comment-position": "error",
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"lines-around-comment": "off",
|
||||
"lines-around-directive": "error",
|
||||
"lines-between-class-members": "error",
|
||||
"max-classes-per-file": "error",
|
||||
"max-depth": "error",
|
||||
"max-len": "error",
|
||||
"max-lines": "error",
|
||||
"max-lines-per-function": "off",
|
||||
"max-nested-callbacks": "error",
|
||||
"max-params": "error",
|
||||
"max-statements": "off",
|
||||
"max-statements-per-line": "error",
|
||||
"multiline-comment-style": ["error", "bare-block"],
|
||||
"multiline-ternary": "error",
|
||||
"new-cap": "error",
|
||||
"new-parens": "error",
|
||||
"newline-after-var": "off",
|
||||
"newline-before-return": "off",
|
||||
"newline-per-chained-call": "error",
|
||||
"no-alert": "error",
|
||||
"no-array-constructor": "error",
|
||||
"no-await-in-loop": "error",
|
||||
"no-bitwise": "error",
|
||||
"no-buffer-constructor": "error",
|
||||
"no-caller": "error",
|
||||
"no-catch-shadow": "error",
|
||||
"no-confusing-arrow": "error",
|
||||
"no-console": "off",
|
||||
"no-continue": "error",
|
||||
"no-div-regex": "error",
|
||||
"no-duplicate-imports": "error",
|
||||
"no-else-return": "off",
|
||||
"no-empty-function": "error",
|
||||
"no-eq-null": "error",
|
||||
"no-eval": "error",
|
||||
"no-extend-native": "error",
|
||||
"no-extra-bind": "error",
|
||||
"no-extra-label": "error",
|
||||
"no-extra-parens": "error",
|
||||
"no-floating-decimal": "error",
|
||||
"no-implicit-coercion": "error",
|
||||
"no-implicit-globals": "off",
|
||||
"no-implied-eval": "error",
|
||||
"no-import-assign": "error",
|
||||
"no-inline-comments": "error",
|
||||
"no-inner-declarations": ["error", "functions"],
|
||||
"no-invalid-this": "error",
|
||||
"no-iterator": "error",
|
||||
"no-label-var": "error",
|
||||
"no-labels": "error",
|
||||
"no-lone-blocks": "error",
|
||||
"no-lonely-if": "error",
|
||||
"no-loop-func": "error",
|
||||
"no-magic-numbers": "off",
|
||||
"no-mixed-operators": "error",
|
||||
"no-mixed-requires": "error",
|
||||
"no-multi-assign": "error",
|
||||
"no-multi-spaces": "error",
|
||||
"no-multi-str": "error",
|
||||
"no-multiple-empty-lines": "error",
|
||||
"no-native-reassign": "error",
|
||||
"no-negated-condition": "error",
|
||||
"no-negated-in-lhs": "error",
|
||||
"no-nested-ternary": "error",
|
||||
"no-new": "error",
|
||||
"no-new-func": "error",
|
||||
"no-new-object": "error",
|
||||
"no-new-require": "error",
|
||||
"no-new-wrappers": "error",
|
||||
"no-octal-escape": "error",
|
||||
"no-param-reassign": "error",
|
||||
"no-path-concat": "error",
|
||||
"no-plusplus": "error",
|
||||
"no-process-env": "error",
|
||||
"no-process-exit": "error",
|
||||
"no-proto": "error",
|
||||
"no-restricted-globals": "error",
|
||||
"no-restricted-imports": "error",
|
||||
"no-restricted-modules": "error",
|
||||
"no-restricted-properties": "error",
|
||||
"no-restricted-syntax": "error",
|
||||
"no-return-assign": "error",
|
||||
"no-return-await": "error",
|
||||
"no-script-url": "error",
|
||||
"no-self-compare": "error",
|
||||
"no-sequences": "error",
|
||||
"no-shadow": "error",
|
||||
"no-spaced-func": "error",
|
||||
"no-sync": "error",
|
||||
"no-tabs": "error",
|
||||
"no-template-curly-in-string": "error",
|
||||
"no-ternary": "error",
|
||||
"no-throw-literal": "error",
|
||||
"no-trailing-spaces": "error",
|
||||
"no-undef-init": "error",
|
||||
"no-undefined": "off",
|
||||
"no-underscore-dangle": "error",
|
||||
"no-unmodified-loop-condition": "error",
|
||||
"no-unneeded-ternary": "error",
|
||||
"no-unused-expressions": "error",
|
||||
"no-use-before-define": "off",
|
||||
"no-useless-call": "error",
|
||||
"no-useless-computed-key": "error",
|
||||
"no-useless-concat": "error",
|
||||
"no-useless-constructor": "error",
|
||||
"no-useless-rename": "error",
|
||||
"no-useless-return": "error",
|
||||
"no-var": "off",
|
||||
"no-void": "error",
|
||||
"no-warning-comments": "error",
|
||||
"no-whitespace-before-property": "error",
|
||||
"nonblock-statement-body-position": "error",
|
||||
"object-curly-newline": "error",
|
||||
"object-curly-spacing": "error",
|
||||
"object-property-newline": "error",
|
||||
"object-shorthand": "error",
|
||||
"one-var": "off",
|
||||
"one-var-declaration-per-line": "error",
|
||||
"operator-assignment": "error",
|
||||
"operator-linebreak": "error",
|
||||
"padded-blocks": "off",
|
||||
"padding-line-between-statements": "error",
|
||||
"prefer-arrow-callback": "off",
|
||||
"prefer-const": "off",
|
||||
"prefer-destructuring": "off",
|
||||
"prefer-named-capture-group": "error",
|
||||
"prefer-numeric-literals": "error",
|
||||
"prefer-object-spread": "error",
|
||||
"prefer-promise-reject-errors": "error",
|
||||
"prefer-reflect": "error",
|
||||
"prefer-regex-literals": "error",
|
||||
"prefer-rest-params": "error",
|
||||
"prefer-spread": "error",
|
||||
"prefer-template": "off",
|
||||
"quote-props": "off",
|
||||
quotes: ["error", "double"],
|
||||
radix: "error",
|
||||
"require-await": "error",
|
||||
"require-jsdoc": "off",
|
||||
"require-unicode-regexp": "error",
|
||||
"rest-spread-spacing": "error",
|
||||
semi: "error",
|
||||
"semi-spacing": "error",
|
||||
"semi-style": ["error", "last"],
|
||||
"sort-imports": "error",
|
||||
"sort-keys": "off",
|
||||
"sort-vars": "error",
|
||||
"space-before-blocks": "error",
|
||||
"space-before-function-paren": "off",
|
||||
"space-in-parens": ["error", "never"],
|
||||
"space-infix-ops": "error",
|
||||
"space-unary-ops": "error",
|
||||
"spaced-comment": "off",
|
||||
strict: ["error", "never"],
|
||||
"switch-colon-spacing": "error",
|
||||
"symbol-description": "error",
|
||||
"template-curly-spacing": "error",
|
||||
"template-tag-spacing": "error",
|
||||
"unicode-bom": ["error", "never"],
|
||||
"valid-jsdoc": "error",
|
||||
"vars-on-top": "off",
|
||||
"wrap-iife": "error",
|
||||
"wrap-regex": "error",
|
||||
"yield-star-spacing": "error",
|
||||
yoda: ["error", "never"]
|
||||
}
|
||||
};
|
2
.gitignore
vendored
@@ -1,2 +1,2 @@
|
||||
README.md.asc
|
||||
|
||||
node_modules/
|
||||
|
114
GOALS.md
Normal file
@@ -0,0 +1,114 @@
|
||||
These are the goals of the I2P Browser, and not really this plugin in-and-of-itself
|
||||
===================================================================================
|
||||
|
||||
A
|
||||
|
||||
User Interface:
|
||||
---------------
|
||||
|
||||
* Remove search engines
|
||||
* Replace bookmarks
|
||||
* Donate banner / UI
|
||||
* Patch Firefox to have relative (from the binary) profile directory
|
||||
* Start use the Firefox update process to update browser installations
|
||||
* Mark .i2p cookies as secure
|
||||
* Mark .i2p domains as secure connection
|
||||
* Add tests for .i2p secure marking
|
||||
* Improve the delay-the-user XUL dialogs to be more accurate in regards
|
||||
of where the router is in it’s bootup progress
|
||||
* Disable the WebIDE
|
||||
* Disable GamePad API by default
|
||||
* Disable Web Speech API by default
|
||||
* Disable the Web Audio API by default
|
||||
* UI redesign bootstrapping and configuration screens (delay-the-user dialogs)
|
||||
* Default browser choose wining should de disabled like
|
||||
browser.shell.checkDefaultBrowser, it can be default, but then
|
||||
choosen by the user without any begging ahead
|
||||
* Extend the firefox preferences UI for I2P router configuration thought
|
||||
of as "must have" or "very nice to have"
|
||||
* Shrink the BroadcastChannel API's boundaries of access or disable completely
|
||||
* Make a API white/grey/black -list, in super paranoia mode we should
|
||||
probably disable almost all, while in most cases the user probably want
|
||||
to be as close to a normal browser/web experinence that
|
||||
they are used to from before
|
||||
|
||||
Leak Avoidance:
|
||||
---------------
|
||||
|
||||
* Stop web socket DNS leak
|
||||
* If doable, slim down the CA store from unnecessary CAs
|
||||
* Disable the microphone by default
|
||||
* Ensure WebRTC is disabled in compile time
|
||||
* Disable mDNS features
|
||||
* Ensure links like sftp:// and smb:// ,
|
||||
as well as \\samba-share is blocked/denied
|
||||
* Don’t allow IndexedDB storage for third party domains (likability issue)
|
||||
* Patch the DNS service to prevent any browser or addon DNS resolution
|
||||
* Restrict what MIME types that are exposed to content scripts
|
||||
|
||||
General Security:
|
||||
-----------------
|
||||
|
||||
* Backport any security patches that might appear from Mozilla
|
||||
* Don’t allow XHR/Websockets requests towards 127.0.0.1/localhost
|
||||
* Always use the most sane form of preferences defaults in context
|
||||
of privacy and security.
|
||||
|
||||
Unnecessary Connections:
|
||||
------------------------
|
||||
|
||||
* Disable getpocket.com features and alike
|
||||
* Remove sync option from preferences
|
||||
* Clear state when the app exits, by default
|
||||
* Disable updater telemetry
|
||||
* Make firefox stop call home to mozilla for different reasons
|
||||
* Prevent non-Necko network connections
|
||||
* Figure out how to approach prerender, preconnect, and prefetch link tags
|
||||
|
||||
Disk Avoidance:
|
||||
---------------
|
||||
|
||||
* Don’t allow SSL key logging
|
||||
* Only cache media in memory
|
||||
* Disable the password saving functionality to avoid such being written to disk
|
||||
* Disable the Auto form-fill to keep as much as possible not written to disk
|
||||
|
||||
Platforms:
|
||||
----------
|
||||
|
||||
* Support for Android?
|
||||
* Support for iOS?
|
||||
|
||||
Anti-Fingerprinting:
|
||||
--------------------
|
||||
|
||||
* Test for preferences which ensures a sane default and
|
||||
something to tell when/if we break it
|
||||
* Disable support for system adding
|
||||
* Disable Firefox enterprise policies
|
||||
* Disable NTLM authentication
|
||||
* Disable SPNEGO authentication
|
||||
* Handle privacy issues regarding window.name
|
||||
* Test runner for I2P Browser test cases
|
||||
* Block loading of plugins
|
||||
* Disable OS spesific firefox features that can help fingerprint
|
||||
the end user's operating system
|
||||
* Block html5 canvas by default
|
||||
* Block by default or disable WebGL completely?
|
||||
* Never start fullscreen, always start with fixed width/height to
|
||||
avoid expose screen resolution
|
||||
* Report fake system uptime to content scripts
|
||||
* Spoof Accept-Language and Accept-Charset headers no matter browser language
|
||||
* Spoof timezone to always be UTC
|
||||
* Develop methods to reduce the accuracy of JavaScript
|
||||
performance fingerprinting
|
||||
* Always report only one CPU core (dom.maxHardwareConcurrencys)
|
||||
* Avoid Keystroke fingerprinting by messing with the event resolution
|
||||
* Disable GeoIP-based search results
|
||||
|
||||
???
|
||||
---
|
||||
|
||||
* SVG drawing
|
||||
* MathML drawing
|
||||
* I2Pd flavor
|
178
Makefile
@@ -3,74 +3,156 @@ PREFIX:=/usr
|
||||
default: zip
|
||||
|
||||
install: uninstall
|
||||
install -d $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/
|
||||
install -d options $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io/options
|
||||
install -d icons $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io/icons
|
||||
install -d _locales $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io/_locales
|
||||
install background.js $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install proxy.js $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install info.js $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install content.js $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install info.css $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install window.html $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install manifest.json $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io/
|
||||
install README.md $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install LICENSE $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
ln -sf $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2psetproxy.js@eyedeekay.github.io
|
||||
mkdir -p $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
cp -r ./icons/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./_locales/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./options/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.js $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./i2pcontrol/i2pcontrol.js $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol/i2pcontrol.js
|
||||
cp ./*.html $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.css $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.md $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.xpi $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./manifest.json $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./LICENSE $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
ln -s $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
|
||||
uninstall:
|
||||
rm -rf $(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2psetproxy.js@eyedeekay.github.io
|
||||
rm -rf $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
|
||||
clobber:
|
||||
rm -f ../i2psetproxy.js.zip ../i2p_proxy*.xpi
|
||||
|
||||
VERSION=1.27
|
||||
ls:
|
||||
ls -lah $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io; \
|
||||
ls -lah $(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
|
||||
clean:
|
||||
rm -fr ../i2psetproxy.js.zip ../i2p_proxy*.xpi ../i2p*.xpi #../i2psetproxy.js_*.*
|
||||
|
||||
## EVEN RELEASES are AMO RELEASES
|
||||
## ODD RELEASES are SELFHOSTED RELEASES
|
||||
|
||||
MOZ_VERSION=0.46
|
||||
VERSION=0.47
|
||||
#VERSION=$(MOZ_VERSION)
|
||||
#VERSION=1.27
|
||||
|
||||
YELLOW=F7E59A
|
||||
ORANGE=FFC56D
|
||||
GREY=D9D9D6
|
||||
BLUE=A4C8E1
|
||||
PURPLE=A48fE1
|
||||
|
||||
colors:
|
||||
@echo " yellow $(YELLOW) \n orange $(ORANGE) \n grey $(GREY) \n blue $(BLUE) \n purple $(PURPLE)"
|
||||
|
||||
amo-readme:
|
||||
markdown README.md | \
|
||||
sed 's|<p>||g' | \
|
||||
sed 's|</p>||g' | \
|
||||
sed 's|<h1>|<strong>|g' | \
|
||||
sed 's|</h1>|</strong>|g' | \
|
||||
sed 's|<h2>|<strong>|g' | \
|
||||
sed 's|</h2>|</strong>|g' | \
|
||||
sed 's|<h3>|<strong>|g' | \
|
||||
sed 's|</h3>|</strong>|g' | \
|
||||
grep -v '<img' > index.html
|
||||
|
||||
xpi:
|
||||
mv ~/Downloads/i2p_proxy-$(VERSION)-an+fx.xpi ../i2psetproxy.js@eyedeekay.github.io.xpi
|
||||
|
||||
cp:
|
||||
cp ../i2psetproxy.js@eyedeekay.github.io.xpi ./i2psetproxy.js@eyedeekay.github.io.xpi
|
||||
#wget -O ../i2ppb@eyedeekay.github.io.xpi \
|
||||
#https://addons.mozilla.org/firefox/downloads/file/3419789/i2psetproxyjs-$(MOZ_VERSION)-an+fx.xpi
|
||||
#cp ../i2ppb@eyedeekay.github.io.xpi ./i2ppb@eyedeekay.github.io.xpi
|
||||
cp ~/Downloads/i2p_in_private_browsing-$(VERSION)-an+fx.xpi ./i2ppb@eyedeekay.github.io.xpi
|
||||
|
||||
version:
|
||||
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
|
||||
|
||||
moz-version:
|
||||
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(MOZ_VERSION)\",|g' manifest.json
|
||||
|
||||
zip: version
|
||||
zip --exclude="./i2psetproxy.js@eyedeekay.github.io.xpi" \
|
||||
--exclude="i2psetproxy.js.png" -r -FS ../i2psetproxy.js.zip *
|
||||
|
||||
profile-install:
|
||||
cp ./i2psetproxy.js@eyedeekay.github.io.xpi $(HOME)/.mozilla/firefox/firefox.profile.i2p/firefox.profile.i2p/extensions
|
||||
cp ./i2psetproxy.js@eyedeekay.github.io.xpi $(HOME)/.mozilla/firefox/.firefox.profile.i2p.default/extensions
|
||||
|
||||
to-profile:
|
||||
cp ./i2psetproxy.js@eyedeekay.github.io.xpi $(PREFIX)/local/lib/firefox.profile.i2p/firefox.profile.i2p/extensions/
|
||||
|
||||
pi: profile-install
|
||||
|
||||
DESC="A simple plugin for configuring an i2p browser."
|
||||
zip --exclude="./i2ppb@eyedeekay.github.io.xpi" \
|
||||
--exclude="./i2psetproxy.js@eyedeekay.github.io.xpi" \
|
||||
--exclude="./i2psetproxy.js.png" \
|
||||
--exclude="./i2psetproxy.js.gif" \
|
||||
--exclude="./package.json" \
|
||||
--exclude="./package-lock.json" \
|
||||
--exclude="./.node_modules" \
|
||||
--exclude="./node_modules" \
|
||||
--exclude="./.git" -r -FS ../i2psetproxy.js.zip *
|
||||
|
||||
release:
|
||||
gothub release -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d $(DESC)
|
||||
cat desc debian/changelog | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -
|
||||
|
||||
upload:
|
||||
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js@eyedeekay.github.io.xpi" -f "../i2psetproxy.js@eyedeekay.github.io.xpi"
|
||||
delete-release:
|
||||
gothub delete -u eyedeekay -r i2psetproxy.js -t $(VERSION); true
|
||||
|
||||
lib: libpolyfill
|
||||
recreate-release: delete-release release upload
|
||||
|
||||
libpolyfill:
|
||||
wget -O chromium/browser-polyfill.min.js https://unpkg.com/webextension-polyfill/dist/browser-polyfill.min.js
|
||||
upload: upload-xpi upload-deb
|
||||
|
||||
|
||||
WEB_EXT_API_KEY=AMO_KEY
|
||||
WEB_EXT_API_SECRET=AMO_SECRET
|
||||
|
||||
|
||||
-include ../api_keys_moz.mk
|
||||
|
||||
tk:
|
||||
echo $(WEB_EXT_API_KEY)
|
||||
|
||||
submit: moz-sign moz-submit
|
||||
|
||||
##ODD NUMBERED, SELF-DISTRIBUTED VERSIONS HERE!
|
||||
moz-sign: 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 sign --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
|
||||
##EVEN NUMBERED, MOZILLA-DISTRIBUTED VERSIONS HERE!
|
||||
moz-submit: moz-version
|
||||
@echo "Using the 'submit' target to instantly sign an extension for Mozilla 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 sign --channel listed --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
|
||||
upload-xpi:
|
||||
gothub upload -R -u eyedeekay -r i2psetproxy.js -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"
|
||||
|
||||
fmt:
|
||||
find . -name '*.js' -exec jsfmt -w {} \;
|
||||
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 {} \;
|
||||
|
||||
lint:
|
||||
eslint --fix *.js
|
||||
|
||||
deborig:
|
||||
rm -rfv ../i2psetproxy.js-$(VERSION)
|
||||
cp -rv . ../i2psetproxy.js-$(VERSION)
|
||||
tar --exclude='./.git' -cvzf ../i2psetproxy.js-$(VERSION).tar.gz .
|
||||
rm -rf ../i2psetproxy.js-$(VERSION)
|
||||
cp -r . ../i2psetproxy.js-$(VERSION)
|
||||
tar \
|
||||
-cvz \
|
||||
--exclude=.git \
|
||||
--exclude=i2psetproxy.js.gif \
|
||||
--exclude=node_modules \
|
||||
-f ../i2psetproxy.js_$(VERSION).orig.tar.gz \
|
||||
.
|
||||
|
||||
deb: deborig
|
||||
cd ../i2psetproxy.js-$(VERSION) && debuild -us -uc -rfakeroot
|
||||
|
||||
-include mirrors.mk
|
||||
|
70
PLAN.md
Normal file
@@ -0,0 +1,70 @@
|
||||
The I2P Browser has made strides at improving users anonymity when browsing
|
||||
the anonymous web inside of I2P. However, it has in many ways simply re-hashed
|
||||
the existing work of Tor on the Tor Browser. This is mostly a good thing, but it
|
||||
is unfortunate because in a sense we have failed to add I2P specific features
|
||||
that could improve the user experience and set us apart from the Tor Browser.
|
||||
|
||||
I think that moving forward, we should try to extend the functionality of I2P
|
||||
Browser into more I2P-specific realms and make an effort to make those things
|
||||
more accessible and highlight that they are in use. I don't really know how to
|
||||
explain what I mean without describing what I want to do, so
|
||||
|
||||
Let's avoid *adding* features to i2pbutton
|
||||
------------------------------------------
|
||||
|
||||
i2pbutton contains alot of code from Tor which even they don't really want to
|
||||
maintain. It's dying the same long, slow death it's always been dying, since
|
||||
back before there was a Tor Browser and torbutton was just an easy way to
|
||||
configure Tor in your Firefox browser. I don't relish the thought of being one
|
||||
the last two groups on the planet maintaining an XUL extension, so I think that
|
||||
we should always be trying to do less with i2pbutton and more with a modern
|
||||
extension. Other advantages of modern extensions are better debugging tools
|
||||
and easier-to-use, more understandable API's for doing the following other
|
||||
things.
|
||||
|
||||
Contexts for Security and Placing Router Applications under their own Origin
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
It is possible, however unlikely, for an attack on a local service or a router
|
||||
plugin to leak information about what's going on on the router console because
|
||||
they will share the same origin. We can resolve this issue, though, by placing
|
||||
applications each into their own origin under a so-called "Container Tab,"
|
||||
completely separating eepWeb traffic and Router Console administration. The
|
||||
origin of the application will be the same as the part of the application URL
|
||||
*after* localhost:7657, so for instance "http://localhost:7657/torrents"
|
||||
would become just "torrents" in the URL bar and have that origin.
|
||||
|
||||
Dynamic Themes
|
||||
--------------
|
||||
|
||||
Since I2P Browsing and Router Console Administration are going to be separated
|
||||
to their own contextual identities, we can manipulate the appearance of the
|
||||
Firefox browser to accomplish 2 things: We can indicate which context we are in
|
||||
both by manipulating the UI text and color, and manipulate UI elements based on
|
||||
what context we're in or even what URL(In the router console) we're on. We can
|
||||
use this to make router console applications appear more tightly integrated with
|
||||
the functionality of the browser. It's kind of obliquely like how many
|
||||
applications are written with user-interfaces that are actually just
|
||||
browsers(Including Mattermost), but with us using the whole browser,
|
||||
acknowledging it's presence and utility but quite literally highlighting(in
|
||||
color) our unique features. So for instance, when the user is using snark it
|
||||
could change color to match snark and change text to say "Torrent Client."
|
||||
|
||||
Application Integration - Torrents
|
||||
----------------------------------
|
||||
|
||||
I2P's strengths are in it's applications, but many users never even make it to
|
||||
the applications, and even if they do, the I2P applications often lack the
|
||||
familiar workflows that people are used to. For instance, when one downloads
|
||||
a torrent on the non-anonymous internet, you simply click a link and the browser
|
||||
"Handles" the link, automatically launching the torrent client, adding the
|
||||
torrent, and sometimes prompting the user for more actions. This isn't possible
|
||||
yet with i2psnark and an external browser, but in I2P browser we can write a
|
||||
"Protocol Handler" which talks to snark-rpc, replicating the ease of just
|
||||
clicking a torrent link to automatically add it to a torrent client. Of course
|
||||
that does require us to bundle the snark-rpc plugin. Besides that, once we've
|
||||
added the torrent, we can keep talking to snark-rpc to keep track of the
|
||||
download progress and display information about that in the already-available
|
||||
Firefox downloads menu that users are already familiar with, so that they can
|
||||
keep track of the files they are downloading after navigating away from the
|
||||
snark interface, or perhaps even without needing to interact with snark at all.
|
102
README.md
@@ -6,12 +6,25 @@ WebExtension that does extended configuration of a dedicated I2P browser. While
|
||||
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.
|
||||
device. It aims to be as similar to a fully-fledged I2P browser as possible and
|
||||
borrows some code from I2P Rhizome(Which it is also compatible with).
|
||||
|
||||
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/download/1.26/i2psetproxy.js@eyedeekay.github.io.xpi)
|
||||
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
|
||||
@@ -20,23 +33,94 @@ 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-proxy](https://addons.mozilla.org/en-US/firefox/addon/I2P-proxy/).
|
||||
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:
|
||||
-------------
|
||||
|
||||
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:
|
||||
|
||||
make deb
|
||||
|
||||
### Features
|
||||
|
||||
* [done] **Indicate** the I2P browser is in use visually
|
||||
* [done] **Set** the http proxy to use the local I2P proxy
|
||||
* [done] **Disable** risky webRTC features
|
||||
* [done] **Change** the color of the browser window to indicate that I2P is in use
|
||||
* [done-ish] **Reset** the HTTP Proxy tunnel to generate a new destination on-demand
|
||||
* it does this by working in conjunction with this [standalone HTTP proxy](https://github.com/eyedeekay/httptunnel), currently disabled*
|
||||
* [done] **Provide** a way to launch into an I2P-Specific contextual identity
|
||||
(container). Intercept requests to .i2p domains and automatically route them
|
||||
to the I2P container. Isolate the router console from other local
|
||||
applications by automatically intercepting requests to the router console to
|
||||
another container.
|
||||
* [done/wip] **Indicate** the I2P browser is in use visually. Find an
|
||||
acceptable way to indicate it on Android.
|
||||
* [done] **Set** the http proxy to use the local I2P proxy automatically.
|
||||
Provide specific configuration for other types of I2P proxies(SOCKS,
|
||||
isolating HTTP)
|
||||
* [done/wip] **Disable** risky webRTC features/offer the option to re-enable
|
||||
them with the proxy enforced.
|
||||
* [done] **Change** the color of the browser window to indicate that I2P is in
|
||||
use
|
||||
* [done-ish] **Reset** the HTTP Proxy tunnel to generate a new destination
|
||||
on-demand
|
||||
* it does this by working in conjunction with this
|
||||
[standalone HTTP proxy](https://github.com/eyedeekay/httptunnel), currently
|
||||
disabled*.
|
||||
* [ready] **Provide** help in a variety of languages.
|
||||
* [wip] **Monitor** the health and readiness of the I2P router it is
|
||||
instructed to use. 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.
|
||||
* [1/2] **Handle** router console applications under their own origins and
|
||||
within their own contextual identity. (1) The router console is automatically
|
||||
confined to it's own container tab. (2) Use a custom protocol handler to
|
||||
place each i2p application/plugin under it's own origin, shortening router
|
||||
console URL's and placing applications under their own origin.
|
||||
* [not started] **Handle Torrents** by talking to i2psnark-rpc plugin and then
|
||||
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
|
||||
can.
|
||||
|
||||
### Screenshot
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Super Extra Important Background Info:
|
||||
--------------------------------------
|
||||
|
||||
This plugin's viability is directly related to the viability of Mozilla and
|
||||
Tor's work on hardening Firefox itself and of particular interest are the
|
||||
"Uplift" and "Fusion(Firefox Using Onions)" projects.
|
||||
|
||||
### Links about Project Uplift
|
||||
|
||||
* https://wiki.mozilla.org/Security/Tor_Uplift
|
||||
* https://wiki.mozilla.org/Security/FirstPartyIsolation
|
||||
* https://wiki.mozilla.org/Security/Fingerprinting
|
||||
* https://wiki.mozilla.org/Security/Fennec%2BTor_Project
|
||||
* https://wiki.mozilla.org/Security/Tor_Uplift/Tracking
|
||||
|
||||
Project uplift seems to have largely been accomplished?
|
||||
|
||||
### Links about Project Fusion
|
||||
|
||||
* https://wiki.mozilla.org/Security/Fusion
|
||||
* https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject
|
||||
* https://blog.torproject.org/tor-heart-firefox
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"extensionName": {
|
||||
"message": "i2psetproxy.js",
|
||||
"message": "I2P In Private Browsing",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"extensionDescription": {
|
||||
@@ -8,11 +8,51 @@
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"titlePreface": {
|
||||
"message": "I2P Browser - ",
|
||||
"message": "I2P Browser",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"titlePrefacePrivate": {
|
||||
"message": "I2P Browser (Private) - ",
|
||||
"message": "I2P Browser (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"webPreface": {
|
||||
"message": "Web Browser",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"webPrefacePrivate": {
|
||||
"message": "Web Browser (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"routerPreface": {
|
||||
"message": "Router Console",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"routerPrefacePrivate": {
|
||||
"message": "Router Console (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"torrentPreface": {
|
||||
"message": "Bittorrent",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"torrentPrefacePrivate": {
|
||||
"message": "Bittorrent (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"mailPreface": {
|
||||
"message": "Web Mail",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"mailPrefacePrivate": {
|
||||
"message": "Web Mail (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"i2ptunnelPreface": {
|
||||
"message": "Hidden Services Manager",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"i2ptunnelPrefacePrivate": {
|
||||
"message": "Hidden Services Manager (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"resetMessage": {
|
||||
|
385
background.js
@@ -1,83 +1,358 @@
|
||||
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");
|
||||
|
||||
function getChrome() {
|
||||
if (browser.runtime.getBrowserInfo == undefined) {
|
||||
return true
|
||||
function onGot(contexts) {
|
||||
var ids = [];
|
||||
for (let context of contexts) {
|
||||
console.log(`Name: ${context.name}`);
|
||||
ids.push(context.name);
|
||||
}
|
||||
console.log("Checking new contexts");
|
||||
if (ids.indexOf(titlepref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: titlepref,
|
||||
color: "orange",
|
||||
icon: "fingerprint"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
}
|
||||
if (ids.indexOf(webpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: webpref,
|
||||
color: "red",
|
||||
icon: "circle"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
}
|
||||
if (ids.indexOf(routerpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: routerpref,
|
||||
color: "blue",
|
||||
icon: "briefcase"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
}
|
||||
if (ids.indexOf(tunnelpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: tunnelpref,
|
||||
color: "green",
|
||||
icon: "tree"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
}
|
||||
if (ids.indexOf(mailpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: mailpref,
|
||||
color: "yellow",
|
||||
icon: "briefcase"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
}
|
||||
if (ids.indexOf(torrentpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: torrentpref,
|
||||
color: "purple",
|
||||
icon: "chill"
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
function isDroid() {
|
||||
if (!getChrome()) {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "android") {
|
||||
console.log("android detected")
|
||||
return true
|
||||
} else {
|
||||
console.log("desktop detected")
|
||||
return false
|
||||
}
|
||||
});
|
||||
}
|
||||
return false
|
||||
function onCreated(context) {
|
||||
console.log(`New identity's ID: ${context.cookieStoreId}.`);
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
}
|
||||
|
||||
browser.contextualIdentities.query({}).then(onGot, onError);
|
||||
|
||||
if (!isDroid()) {
|
||||
chrome.windows.onCreated.addListener(themeWindow);
|
||||
chrome.windows.onFocusChanged.addListener(themeWindow);
|
||||
chrome.windows.onRemoved.addListener(themeWindow);
|
||||
chrome.tabs.onUpdated.addListener(themeWindowByTab);
|
||||
chrome.tabs.onActivated.addListener(themeWindowByTab);
|
||||
} else {
|
||||
}
|
||||
|
||||
var titlepref = chrome.i18n.getMessage("titlePreface");
|
||||
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
|
||||
function themeWindowByTab(tabId) {
|
||||
function tabWindow(tab) {
|
||||
getwindow = browser.windows.get(tab.windowId);
|
||||
getwindow.then(themeWindow);
|
||||
}
|
||||
if (typeof tabId === "number") {
|
||||
tab = browser.tabs.get(tabId);
|
||||
tab.then(tabWindow);
|
||||
} else {
|
||||
tabWindow(tabId);
|
||||
}
|
||||
}
|
||||
|
||||
function themeWindow(window) {
|
||||
// Check if the window is in private browsing
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#2D4470",
|
||||
toolbar: "#2D4470",
|
||||
function logTabs(tabInfo) {
|
||||
function onGot(context) {
|
||||
if (context.name == titlepref) {
|
||||
console.log("Active in I2P window");
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#FFC56D",
|
||||
toolbar: "#FFC56D"
|
||||
}
|
||||
});
|
||||
} else {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#FFC56D",
|
||||
toolbar: "#FFC56D"
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (context.name == routerpref) {
|
||||
console.log("Active in Router Console window");
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#A4C8E1",
|
||||
toolbar: "#A4C8E1"
|
||||
}
|
||||
});
|
||||
} else {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#A4C8E1",
|
||||
toolbar: "#A4C8E1"
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (context.name == tunnelpref) {
|
||||
console.log("Active in Hidden Services Manager window");
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#D9D9D6",
|
||||
toolbar: "#D9D9D6"
|
||||
}
|
||||
});
|
||||
} else {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#D9D9D6",
|
||||
toolbar: "#D9D9D6"
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (context.name == mailpref) {
|
||||
console.log("Active in Web Mail window");
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#F7E59A",
|
||||
toolbar: "#F7E59A"
|
||||
}
|
||||
});
|
||||
} else {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#F7E59A",
|
||||
toolbar: "#F7E59A"
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (context.name == torrentpref) {
|
||||
console.log("Active in Bittorrent window");
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#A48FE1",
|
||||
toolbar: "#A48FE1"
|
||||
}
|
||||
});
|
||||
} else {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#A48FE1",
|
||||
toolbar: "#A48FE1"
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
console.log("Not active in I2P window");
|
||||
chrome.theme.reset(window.id);
|
||||
}
|
||||
});
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#9DABD5",
|
||||
toolbar: "#9DABD5",
|
||||
}
|
||||
});
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titlepref
|
||||
});
|
||||
}
|
||||
if (
|
||||
tabInfo[0].cookieStoreId != "firefox-default" &&
|
||||
tabInfo[0].cookieStoreId != "firefox-private"
|
||||
) {
|
||||
browser.contextualIdentities
|
||||
.get(tabInfo[0].cookieStoreId)
|
||||
.then(onGot, onError);
|
||||
} else {
|
||||
chrome.theme.reset(window.id);
|
||||
}
|
||||
}
|
||||
|
||||
var querying = browser.tabs.query({
|
||||
currentWindow: true,
|
||||
active: true
|
||||
});
|
||||
querying.then(logTabs, onError);
|
||||
}
|
||||
|
||||
function setTitle(window) {
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titlepref
|
||||
});
|
||||
}
|
||||
}
|
||||
function logTabs(tabInfo) {
|
||||
console.log(tabInfo);
|
||||
|
||||
function setTitleError(window) {
|
||||
alert("plugin error setting title on", window.id)
|
||||
function onGot(context) {
|
||||
if (context.name == titlepref) {
|
||||
console.log("Active in I2P window");
|
||||
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titlepref
|
||||
});
|
||||
}
|
||||
} else if (context.name == webpref) {
|
||||
console.log("Active in Web window");
|
||||
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
}
|
||||
} else if (context.name == routerpref) {
|
||||
console.log("Active in Router Console window");
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: routerprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: routerpref
|
||||
});
|
||||
}
|
||||
} else if (context.name == tunnelpref) {
|
||||
console.log("Active in Hidden Services Manager window");
|
||||
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: tunnelprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: tunnelpref
|
||||
});
|
||||
}
|
||||
} else if (context.name == mailpref) {
|
||||
console.log("Active in Web Mail window");
|
||||
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: mailprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: mailpref
|
||||
});
|
||||
}
|
||||
} else if (context.name == torrentpref) {
|
||||
console.log("Active in I2P window");
|
||||
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: torrentprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: torrentpref
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
tabInfo[0].cookieStoreId != "firefox-default" &&
|
||||
tabInfo[0].cookieStoreId != "firefox-private"
|
||||
) {
|
||||
browser.contextualIdentities
|
||||
.get(tabInfo[0].cookieStoreId)
|
||||
.then(onGot, onError);
|
||||
} else {
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: ""
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var querying = browser.tabs.query({
|
||||
currentWindow: true,
|
||||
active: true
|
||||
});
|
||||
querying.then(logTabs, onError);
|
||||
}
|
||||
|
||||
chrome.windows.onCreated.addListener(() => {
|
||||
const gettingStoredSettings = chrome.storage.local.get();
|
||||
gettingStoredSettings.then(setupProxy, onError);
|
||||
/* var gettingStoredSettings = chrome.storage.local.get();
|
||||
gettingStoredSettings.then(setupProxy, onError); */
|
||||
chrome.storage.local.get(function(got) {
|
||||
setupProxy();
|
||||
});
|
||||
});
|
||||
|
||||
chrome.tabs.onCreated.addListener(() => {
|
||||
const getting = browser.windows.getCurrent({
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
});
|
||||
getting.then(setTitle, setTitleError);
|
||||
getting.then(setTitle, onError);
|
||||
});
|
||||
|
||||
chrome.tabs.onActivated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
});
|
||||
getting.then(setTitle, onError);
|
||||
});
|
||||
|
||||
function handleUpdated(updateInfo) {
|
||||
if (updateInfo.theme.colors) {
|
||||
console.log(`Theme was applied: ${updateInfo.theme}`);
|
||||
} else {
|
||||
console.log(`Theme was removed`);
|
||||
}
|
||||
}
|
||||
|
||||
browser.theme.onUpdated.addListener(handleUpdated);
|
||||
|
153
bookmarks.js
Normal file
@@ -0,0 +1,153 @@
|
||||
function bookmarks(bookmarkToolbar) {
|
||||
console.log("Setting up bookmark toolbar", bookmarkToolbar);
|
||||
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({
|
||||
url: "about:I2p",
|
||||
title: "I2P Home Page",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
url: browser.runtime.getURL("home.html"),
|
||||
title: "I2P Home Page",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
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({
|
||||
url: "http://localhost:7647/i2psnark",
|
||||
title: "Bittorrent",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
url: "http://localhost:7657/i2psnark",
|
||||
title: "Bittorrent",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
}
|
||||
}
|
||||
console.log("(bookmarks) checking if we're running in an I2P Browser");
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.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({
|
||||
url: "http://localhost:7647/webmail",
|
||||
title: "Web Mail",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
url: "http://localhost:7657/webmail",
|
||||
title: "Web Mail",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.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);
|
||||
}
|
||||
}
|
||||
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({
|
||||
url: "http://localhost:7647/i2ptunnelmgr",
|
||||
title: "Hidden Services Manager",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
url: "http://localhost:7657/i2ptunnelmgr",
|
||||
title: "Hidden Services Manager",
|
||||
parentId: bookmarkToolbar[0].id
|
||||
});
|
||||
createBookmark.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);
|
||||
}
|
||||
}
|
||||
|
||||
function onRejected(error) {
|
||||
console.log(`An error: ${error}`);
|
||||
}
|
||||
function onCreated(node) {
|
||||
console.log("Bookmarked", node);
|
||||
}
|
||||
|
||||
var b0 = browser.bookmarks.search({
|
||||
title: "I2P Home Page"
|
||||
});
|
||||
b0.then(bookHome, onRejected);
|
||||
|
||||
var b1 = browser.bookmarks.search({
|
||||
title: "Bittorrent"
|
||||
});
|
||||
b1.then(bookTorrent, onRejected);
|
||||
|
||||
var b2 = browser.bookmarks.search({
|
||||
title: "Hidden Services Manager"
|
||||
});
|
||||
b2.then(bookI2PTunnel, onRejected);
|
||||
|
||||
var b3 = browser.bookmarks.search({
|
||||
title: "Web Mail"
|
||||
});
|
||||
b3.then(bookMail, onRejected);
|
||||
}
|
||||
|
||||
var bt = browser.bookmarks.search({
|
||||
query: "Toolbar"
|
||||
});
|
||||
|
||||
bt.then(bookmarks);
|
||||
|
||||
function handleCreated(id, bookmarkInfo) {
|
||||
var propValue;
|
||||
for (var propName in bookmarkInfo) {
|
||||
propValue = bookmarkInfo[propName];
|
||||
console.log(propName, propValue);
|
||||
}
|
||||
}
|
||||
|
||||
browser.bookmarks.onCreated.addListener(handleCreated);
|
903
chromium/browser-polyfill.min.js
vendored
@@ -1,903 +0,0 @@
|
||||
(function(a, b) {
|
||||
if ("function" == typeof define && define.amd) {
|
||||
define("webextension-polyfill", ["module"], b);
|
||||
} else if ("undefined" != typeof exports) {
|
||||
b(module);
|
||||
} else {
|
||||
var c = {
|
||||
exports: {}
|
||||
};
|
||||
b(c), a.browser = c.exports
|
||||
}
|
||||
})(this, function(a) {
|
||||
"use strict";
|
||||
if ("undefined" == typeof browser || Object.getPrototypeOf(browser) !== Object.prototype) {
|
||||
a.exports = (e => {
|
||||
const f = {
|
||||
alarms: {
|
||||
clear: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
clearAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
get: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
}
|
||||
},
|
||||
bookmarks: {
|
||||
create: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
get: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getChildren: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getRecent: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getSubTree: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getTree: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
move: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
},
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeTree: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
search: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
update: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
}
|
||||
},
|
||||
browserAction: {
|
||||
disable: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
enable: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
getBadgeBackgroundColor: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getBadgeText: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getPopup: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getTitle: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
openPopup: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
setBadgeBackgroundColor: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
setBadgeText: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
setIcon: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
setPopup: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
setTitle: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
}
|
||||
},
|
||||
browsingData: {
|
||||
remove: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
},
|
||||
removeCache: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeCookies: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeDownloads: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeFormData: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeHistory: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeLocalStorage: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removePasswords: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removePluginData: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
settings: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
}
|
||||
},
|
||||
commands: {
|
||||
getAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
}
|
||||
},
|
||||
contextMenus: {
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
update: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
}
|
||||
},
|
||||
cookies: {
|
||||
get: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getAll: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getAllCookieStores: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
set: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
devtools: {
|
||||
inspectedWindow: {
|
||||
eval: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2,
|
||||
singleCallbackArg: !1
|
||||
}
|
||||
},
|
||||
panels: {
|
||||
create: {
|
||||
minArgs: 3,
|
||||
maxArgs: 3,
|
||||
singleCallbackArg: !0
|
||||
}
|
||||
}
|
||||
},
|
||||
downloads: {
|
||||
cancel: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
download: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
erase: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getFileIcon: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
open: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
pause: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeFile: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
resume: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
search: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
show: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
}
|
||||
},
|
||||
extension: {
|
||||
isAllowedFileSchemeAccess: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
isAllowedIncognitoAccess: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
}
|
||||
},
|
||||
history: {
|
||||
addUrl: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
deleteAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
deleteRange: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
deleteUrl: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getVisits: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
search: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
i18n: {
|
||||
detectLanguage: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getAcceptLanguages: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
}
|
||||
},
|
||||
identity: {
|
||||
launchWebAuthFlow: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
idle: {
|
||||
queryState: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
management: {
|
||||
get: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
getSelf: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
setEnabled: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
},
|
||||
uninstallSelf: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
notifications: {
|
||||
clear: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
create: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
getAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
getPermissionLevel: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
update: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
}
|
||||
},
|
||||
pageAction: {
|
||||
getPopup: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getTitle: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
hide: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
setIcon: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
setPopup: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
setTitle: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
},
|
||||
show: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1,
|
||||
fallbackToNoCallback: !0
|
||||
}
|
||||
},
|
||||
permissions: {
|
||||
contains: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
request: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
runtime: {
|
||||
getBackgroundPage: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
getBrowserInfo: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
getPlatformInfo: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
openOptionsPage: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
requestUpdateCheck: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
sendMessage: {
|
||||
minArgs: 1,
|
||||
maxArgs: 3
|
||||
},
|
||||
sendNativeMessage: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
},
|
||||
setUninstallURL: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
sessions: {
|
||||
getDevices: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getRecentlyClosed: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
restore: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
storage: {
|
||||
local: {
|
||||
clear: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
get: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getBytesInUse: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
set: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
managed: {
|
||||
get: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getBytesInUse: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
sync: {
|
||||
clear: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
get: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getBytesInUse: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
set: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
}
|
||||
},
|
||||
tabs: {
|
||||
captureVisibleTab: {
|
||||
minArgs: 0,
|
||||
maxArgs: 2
|
||||
},
|
||||
create: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
detectLanguage: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
discard: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
duplicate: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
executeScript: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
get: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getCurrent: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
},
|
||||
getZoom: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getZoomSettings: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
highlight: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
insertCSS: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
move: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
},
|
||||
query: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
reload: {
|
||||
minArgs: 0,
|
||||
maxArgs: 2
|
||||
},
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
removeCSS: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
sendMessage: {
|
||||
minArgs: 2,
|
||||
maxArgs: 3
|
||||
},
|
||||
setZoom: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
setZoomSettings: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
update: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
}
|
||||
},
|
||||
topSites: {
|
||||
get: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
}
|
||||
},
|
||||
webNavigation: {
|
||||
getAllFrames: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
getFrame: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
},
|
||||
webRequest: {
|
||||
handlerBehaviorChanged: {
|
||||
minArgs: 0,
|
||||
maxArgs: 0
|
||||
}
|
||||
},
|
||||
windows: {
|
||||
create: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
get: {
|
||||
minArgs: 1,
|
||||
maxArgs: 2
|
||||
},
|
||||
getAll: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getCurrent: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
getLastFocused: {
|
||||
minArgs: 0,
|
||||
maxArgs: 1
|
||||
},
|
||||
remove: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
update: {
|
||||
minArgs: 2,
|
||||
maxArgs: 2
|
||||
}
|
||||
}
|
||||
};
|
||||
if (0 === Object.keys(f).length) {
|
||||
throw new Error("api-metadata.json has not been included in browser-polyfill");
|
||||
}
|
||||
class g extends WeakMap {
|
||||
constructor(v, w = void 0) {
|
||||
super(w), this.createItem = v
|
||||
}
|
||||
get(v) {
|
||||
return this.has(v) || this.set(v, this.createItem(v)), super.get(v)
|
||||
}
|
||||
}
|
||||
const h = v => {
|
||||
return v && "object" == typeof v && "function" == typeof v.then
|
||||
};
|
||||
const i = (v, w) => {
|
||||
return (...x) => {
|
||||
e.runtime.lastError ? v.reject(e.runtime.lastError) : w.singleCallbackArg || 1 >= x.length && !1 !== w.singleCallbackArg ? v.resolve(x[0]) : v.resolve(x)
|
||||
}
|
||||
};
|
||||
const j = v => 1 == v ? "argument" : "arguments";
|
||||
const k = (v, w) => {
|
||||
return function(y, ...z) {
|
||||
if (z.length < w.minArgs) {
|
||||
throw new Error(`Expected at least ${w.minArgs} ${j(w.minArgs)} for ${v}(), got ${z.length}`);
|
||||
}
|
||||
if (z.length > w.maxArgs) {
|
||||
throw new Error(`Expected at most ${w.maxArgs} ${j(w.maxArgs)} for ${v}(), got ${z.length}`);
|
||||
}
|
||||
return new Promise((A, B) => {
|
||||
if (w.fallbackToNoCallback) {
|
||||
try {
|
||||
y[v](...z, i({
|
||||
resolve: A,
|
||||
reject: B
|
||||
}, w))
|
||||
} catch ( C ) {
|
||||
console.warn(`${v} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", C), y[v](...z), w.fallbackToNoCallback = !1, w.noCallback = !0, A()
|
||||
}
|
||||
} else {
|
||||
w.noCallback ? (y[v](...z), A()) : y[v](...z, i({
|
||||
resolve: A,
|
||||
reject: B
|
||||
}, w))
|
||||
}
|
||||
})
|
||||
}
|
||||
};
|
||||
const l = (v, w, x) => {
|
||||
return new Proxy(w, {
|
||||
apply(y, z, A) {
|
||||
return x.call(z, v, ...A)
|
||||
}
|
||||
})
|
||||
};
|
||||
let m = Function.call.bind(Object.prototype.hasOwnProperty);
|
||||
const n = (v, w = {}, x = {}) => {
|
||||
let y = Object.create(null);
|
||||
let z = {
|
||||
has(B, C) {
|
||||
return C in v || C in y
|
||||
},
|
||||
get(B, C) {
|
||||
if (C in y) {
|
||||
return y[C];
|
||||
}
|
||||
if (C in v) {
|
||||
let E = v[C];
|
||||
if ("function" == typeof E) {
|
||||
if ("function" == typeof w[C]) {
|
||||
E = l(v, v[C], w[C]);
|
||||
} else if (m(x, C)) {
|
||||
let F = k(C, x[C]);
|
||||
E = l(v, v[C], F)
|
||||
} else {
|
||||
E = E.bind(v);
|
||||
}
|
||||
} else if ("object" == typeof E && null !== E && (m(w, C) || m(x, C))) {
|
||||
E = n(E, w[C], x[C]);
|
||||
} else {
|
||||
return Object.defineProperty(y, C, {
|
||||
configurable: !0,
|
||||
enumerable: !0,
|
||||
get() {
|
||||
return v[C]
|
||||
},
|
||||
set(F) {
|
||||
v[C] = F
|
||||
}
|
||||
}), E;
|
||||
}
|
||||
return y[C] = E, E
|
||||
}
|
||||
},
|
||||
set(B, C, D) {
|
||||
return C in y ? y[C] = D : v[C] = D, !0
|
||||
},
|
||||
defineProperty(B, C, D) {
|
||||
return Reflect.defineProperty(y, C, D)
|
||||
},
|
||||
deleteProperty(B, C) {
|
||||
return Reflect.deleteProperty(y, C)
|
||||
}
|
||||
};
|
||||
let A = Object.create(v);
|
||||
return new Proxy(A, z)
|
||||
};
|
||||
const o = v => ({
|
||||
addListener(w, x, ...y) {
|
||||
w.addListener(v.get(x), ...y)
|
||||
},
|
||||
hasListener(w, x) {
|
||||
return w.hasListener(v.get(x))
|
||||
},
|
||||
removeListener(w, x) {
|
||||
w.removeListener(v.get(x))
|
||||
}
|
||||
});
|
||||
let p = !1;
|
||||
const q = new g(v => {
|
||||
return "function" == typeof v ? function(x, y, z) {
|
||||
let B;
|
||||
let D;
|
||||
let A = !1;
|
||||
let C = new Promise(G => {
|
||||
B = function(H) {
|
||||
p || (console.warn("Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)", new Error().stack), p = !0), A = !0, G(H)
|
||||
}
|
||||
});
|
||||
try {
|
||||
D = v(x, y, B)
|
||||
} catch ( G ) {
|
||||
D = Promise.reject(G)
|
||||
}
|
||||
const E = !0 !== D && h(D);
|
||||
if (!0 !== D && !E && !A) {
|
||||
return !1;
|
||||
}
|
||||
const F = G => {
|
||||
G.then(H => {
|
||||
z(H)
|
||||
}, H => {
|
||||
let I;
|
||||
I = H && (H instanceof Error || "string" == typeof H.message) ? H.message : "An unexpected error occurred", z({
|
||||
__mozWebExtensionPolyfillReject__: !0,
|
||||
message: I
|
||||
})
|
||||
}).catch(H => {
|
||||
console.error("Failed to send onMessage rejected reply", H)
|
||||
})
|
||||
};
|
||||
return E ? F(D) : F(C), !0
|
||||
} : v
|
||||
});
|
||||
const r = ({reject:v, resolve:w} ,x) => {
|
||||
e.runtime.lastError ? e.runtime.lastError.message === "The message port closed before a response was received." ? w() : v(e.runtime.lastError) : x && x.__mozWebExtensionPolyfillReject__ ? v(new Error(x.message)) : w(x)
|
||||
};
|
||||
const s = (v, w, x, ...y) => {
|
||||
if (y.length < w.minArgs) {
|
||||
throw new Error(`Expected at least ${w.minArgs} ${j(w.minArgs)} for ${v}(), got ${y.length}`);
|
||||
}
|
||||
if (y.length > w.maxArgs) {
|
||||
throw new Error(`Expected at most ${w.maxArgs} ${j(w.maxArgs)} for ${v}(), got ${y.length}`);
|
||||
}
|
||||
return new Promise((z, A) => {
|
||||
const B = r.bind(null, {
|
||||
resolve: z,
|
||||
reject: A
|
||||
});
|
||||
y.push(B), x.sendMessage(...y)
|
||||
})
|
||||
};
|
||||
const t = {
|
||||
runtime: {
|
||||
onMessage: o(q),
|
||||
onMessageExternal: o(q),
|
||||
sendMessage: s.bind(null, "sendMessage", {
|
||||
minArgs: 1,
|
||||
maxArgs: 3
|
||||
})
|
||||
},
|
||||
tabs: {
|
||||
sendMessage: s.bind(null, "sendMessage", {
|
||||
minArgs: 2,
|
||||
maxArgs: 3
|
||||
})
|
||||
}
|
||||
};
|
||||
const u = {
|
||||
clear: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
get: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
},
|
||||
set: {
|
||||
minArgs: 1,
|
||||
maxArgs: 1
|
||||
}
|
||||
};
|
||||
return f.privacy = {
|
||||
network: {
|
||||
networkPredictionEnabled: u,
|
||||
webRTCIPHandlingPolicy: u
|
||||
},
|
||||
services: {
|
||||
passwordSavingEnabled: u
|
||||
},
|
||||
websites: {
|
||||
hyperlinkAuditingEnabled: u,
|
||||
referrersEnabled: u
|
||||
}
|
||||
}, n(e, t, f)
|
||||
})(chrome)
|
||||
} else {
|
||||
a.exports = browser
|
||||
}
|
||||
});
|
||||
//# sourceMappingURL=browser-polyfill.min.js.map
|
||||
|
||||
// webextension-polyfill v.0.4.0 (https://github.com/mozilla/webextension-polyfill)
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
BIN
clearweb.png
Normal file
After Width: | Height: | Size: 126 KiB |
36
content.js
@@ -1,17 +1,35 @@
|
||||
var infoTitle = document.getElementById('text-section-header');
|
||||
var infoTitle = document.getElementById("text-section-header");
|
||||
infoTitle.textContent = chrome.i18n.getMessage("infoTitle");
|
||||
|
||||
var infoMessage = document.getElementById('text-section-helptext');
|
||||
infoMessage.textContent = chrome.i18n.getMessage("infoMessage");
|
||||
|
||||
var helpMessage = document.getElementById('window-create-forum-panel');
|
||||
/*
|
||||
var helpMessage = document.getElementById("window-create-forum-panel");
|
||||
helpMessage.textContent = chrome.i18n.getMessage("forumMessage");
|
||||
*/
|
||||
/*
|
||||
var helpMessage = document.getElementById('window-create-help-panel');
|
||||
helpMessage.textContent = chrome.i18n.getMessage("helpMessage")
|
||||
*/
|
||||
var newsMessage = document.getElementById('window-create-news-panel');
|
||||
/*
|
||||
var newsMessage = document.getElementById("window-create-news-panel");
|
||||
newsMessage.textContent = chrome.i18n.getMessage("newsMessage");
|
||||
|
||||
var clearData = document.getElementById("clear-browser-data")
|
||||
*/
|
||||
var clearData = document.getElementById("clear-browser-data");
|
||||
clearData.textContent = chrome.i18n.getMessage("clearData");
|
||||
/*
|
||||
document.addEventListener("click", e => {
|
||||
browser.runtime.sendMessage({ url: "http://proxy.i2p" });
|
||||
});
|
||||
|
||||
function proxyContent(message) {
|
||||
var proxyData = document.getElementById("proxy-health");
|
||||
proxyData.textContent = message;
|
||||
console.log("Event occurred", message);
|
||||
}
|
||||
|
||||
browser.runtime.onMessage.addListener(proxyContent);
|
||||
*/
|
||||
|
||||
/*
|
||||
function signalWebRTC(val){
|
||||
console.log("signal", val)
|
||||
}
|
||||
*/
|
||||
|
75
context.js
Normal file
@@ -0,0 +1,75 @@
|
||||
//var windowIds = []
|
||||
|
||||
function onCreated(windowInfo) {
|
||||
console.log(`Created window: ${windowInfo.id}`);
|
||||
browser.tabs.create({
|
||||
windowId: windowInfo.id,
|
||||
url: "about:blank",
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
});
|
||||
}
|
||||
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
|
||||
function eventHandler(event) {
|
||||
if (event.target.dataset.action == "create") {
|
||||
var creating = browser.tabs.create({
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
});
|
||||
creating.then(onCreated, onError);
|
||||
}
|
||||
if (event.target.dataset.action == "close-all") {
|
||||
browser.tabs
|
||||
.query({
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
})
|
||||
.then(tabs => {
|
||||
browser.tabs.remove(tabs.map(i => i.id));
|
||||
});
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
function createOptions(node, identity) {
|
||||
for (let option of ["Create", "Close All"]) {
|
||||
let a = document.createElement("a");
|
||||
a.href = "#";
|
||||
a.innerText = option;
|
||||
a.dataset.action = option.toLowerCase().replace(" ", "-");
|
||||
a.dataset.identity = identity.cookieStoreId;
|
||||
a.addEventListener("click", eventHandler);
|
||||
node.appendChild(a);
|
||||
}
|
||||
}
|
||||
|
||||
var div = document.getElementById("identity-list");
|
||||
|
||||
if (browser.contextualIdentities === undefined) {
|
||||
div.innerText =
|
||||
"browser.contextualIdentities not available. Check that the privacy.userContext.enabled pref is set to true, and reload the add-on.";
|
||||
} else {
|
||||
browser.contextualIdentities
|
||||
.query({
|
||||
name: "I2P Browser"
|
||||
})
|
||||
.then(identities => {
|
||||
if (!identities.length) {
|
||||
div.innerText = "No identities returned from the API.";
|
||||
return;
|
||||
}
|
||||
|
||||
for (let identity of identities) {
|
||||
let row = document.createElement("div");
|
||||
let span = document.createElement("span");
|
||||
span.className = "identity";
|
||||
span.innerText = identity.name;
|
||||
span.style = `color: ${identity.color}`;
|
||||
console.log(identity);
|
||||
row.appendChild(span);
|
||||
createOptions(row, identity);
|
||||
div.appendChild(row);
|
||||
}
|
||||
});
|
||||
}
|
41
debian/changelog
vendored
@@ -1,4 +1,43 @@
|
||||
i2psetproxy.js (1.27-1) UNRELEASED; urgency=low
|
||||
i2psetproxy.js (0.47-1) UNRELEASED; urgency=low
|
||||
|
||||
* Improve android compatibility
|
||||
* Improve code organization
|
||||
* Partial protocol handlers implementation
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 18:53:11 -0400
|
||||
|
||||
i2psetproxy.js (0.45-1) UNRELEASED; urgency=low
|
||||
|
||||
* Improve the user interface a whole bunch
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Fri, 22 NOV 2019 18:17:33 -0400
|
||||
|
||||
i2psetproxy.js (0.43-1) UNRELEASED; urgency=low
|
||||
|
||||
* Contextualize All the Things
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 11 OCT 2019 12:41:33 -0400
|
||||
|
||||
i2psetproxy.js (0.41-1) UNRELEASED; urgency=low
|
||||
|
||||
* Only open tabs, not windows
|
||||
* Optionally enable WebRTC
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 31 OCT 2019 12:41:33 -0400
|
||||
|
||||
i2psetproxy.js (0.37-1) UNRELEASED; urgency=low
|
||||
|
||||
* Honor contextual ID when deleting history
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 17 OCT 2019 00:52:19 -0400
|
||||
|
||||
i2psetproxy.js (0.35-1) UNRELEASED; urgency=low
|
||||
|
||||
* Automatically activate contexts
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 01 Aug 2019 00:32:39 -0400
|
||||
|
||||
i2psetproxy.js (0.31-1) UNRELEASED; urgency=low
|
||||
|
||||
* Initial release. Closes: #nnnn
|
||||
<nnnn is the bug number of your ITP>
|
||||
|
43
debian/copyright
vendored
@@ -1,8 +1,6 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: i2psetproxy.js
|
||||
Source: https://github.com/eyedeekay/i2psetproxy.js
|
||||
#
|
||||
# Please double check copyright with the licensecheck(1) command.
|
||||
|
||||
Files: .gitignore
|
||||
Makefile
|
||||
@@ -10,6 +8,8 @@ Files: .gitignore
|
||||
_locales/en/messages.json
|
||||
background.js
|
||||
content.js
|
||||
context.js
|
||||
.circleci/config.yml
|
||||
experiments/i2ptab.md
|
||||
experiments/tunblink.md
|
||||
i2psetproxy.js.png
|
||||
@@ -20,33 +20,17 @@ Files: .gitignore
|
||||
manifest.json
|
||||
options/options.css
|
||||
options/options.js
|
||||
options/options.html
|
||||
package-lock.json
|
||||
platform.js
|
||||
privacy.js
|
||||
proxy.js
|
||||
scrub.js
|
||||
window.html
|
||||
debian/*
|
||||
*
|
||||
Copyright: MIT
|
||||
License: MIT
|
||||
|
||||
Files: chromium/browser-polyfill.min.js
|
||||
Copyright: __NO_COPYRIGHT__ in: chromium/browser-polyfill.min.js
|
||||
License: MPL-2.0
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# xml and html files (skipped):
|
||||
# window.html
|
||||
# options/options.html
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Files marked as NO_LICENSE_TEXT_FOUND may be covered by the following
|
||||
# license/copyright files.
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# License file: LICENSE
|
||||
MIT License
|
||||
.
|
||||
Copyright (c) 2019 idk
|
||||
.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
@@ -64,3 +48,12 @@ License: MPL-2.0
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
Files: chromium/browser-polyfill.js
|
||||
Copyright: MPL in: chromium/LICENSE
|
||||
License: MPL-2.0
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
.
|
||||
|
||||
|
31
debian/rules
vendored
@@ -4,19 +4,18 @@
|
||||
dh $@
|
||||
|
||||
override_dh_auto_install:
|
||||
install -d $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
|
||||
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/
|
||||
install -d options $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io/options
|
||||
install -d icons $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io/icons
|
||||
install -d _locales $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io/_locales
|
||||
install background.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install proxy.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install info.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install content.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install info.css $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install window.html $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install manifest.json $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io/
|
||||
install README.md $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
install LICENSE $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io
|
||||
ln -sf $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
|
||||
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2psetproxy.js@eyedeekay.github.io
|
||||
mkdir -p $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol \
|
||||
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
cp -r ./icons/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./options/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./_locales/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./i2pcontrol/i2pcontrol.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol/
|
||||
cp ./*.html $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.css $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.md $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./manifest.json $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./LICENSE $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
ln -sf $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
|
1
debian/source/include-binaries
vendored
Normal file
@@ -0,0 +1 @@
|
||||
i2psetproxy.js.gif
|
6
desc
Normal file
@@ -0,0 +1,6 @@
|
||||
I2P in Private Browsing Mode
|
||||
============================
|
||||
|
||||
A simple plugin for configuring a Firefox based web browser to isolate I2P
|
||||
Browsing to a single contextual identity, thus creating an I2P in Private
|
||||
Browsing mode. It requires the use of a pre-installed I2P Router.
|
45
handler.js
Normal file
@@ -0,0 +1,45 @@
|
||||
function identifyProtocolHandler(url) {
|
||||
//console.log("looking for handler-able requests")
|
||||
if (routerHost(url)) {
|
||||
if (url.includes(encodeURIComponent("ext+rc:"))) {
|
||||
return url.replace(encodeURIComponent("ext+rc:"), "");
|
||||
} else if (url.includes("ext+rc:")) {
|
||||
return url.replace("ext+rc:", "");
|
||||
}
|
||||
} else if (url.includes("ext+rc:")) {
|
||||
return url;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function trimHost(url) {
|
||||
let hostname = "";
|
||||
let prefix = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
prefix = url.substr(0, url.indexOf("://") + 3);
|
||||
hostname = url.split("/")[2];
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
}
|
||||
let path = url.replace(prefix+hostname, "")
|
||||
console.log("(handler) path", prefix+hostname, path)
|
||||
return path
|
||||
}
|
||||
|
||||
var handlerSetup = async function(requestDetails) {
|
||||
//console.log("checking protocol handler listener")
|
||||
var rwurl = identifyProtocolHandler(requestDetails.url);
|
||||
if (rwurl != false) {
|
||||
console.log("(handler) rewrite URL requested", rwurl);
|
||||
requestDetails.redirectUrl = rwurl;
|
||||
requestDetails.url = trimHost(rwurl);
|
||||
requestDetails.originUrl = trimHost(rwurl);
|
||||
}
|
||||
return requestDetails;
|
||||
};
|
||||
|
||||
browser.webRequest.onBeforeRequest.addListener(
|
||||
handlerSetup,
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking"]
|
||||
);
|
290
home.css
Normal file
@@ -0,0 +1,290 @@
|
||||
* {
|
||||
padding: 0;
|
||||
margin: 0
|
||||
}
|
||||
html {
|
||||
height: 100%
|
||||
}
|
||||
a,
|
||||
button {
|
||||
color: #3b6bbf;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.applicationDesc {
|
||||
color: #81888f;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.applicationDesc:hover,
|
||||
a:hover,
|
||||
button:hover {
|
||||
color: #495057;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
button {
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
color: #3b6bbf;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0 auto;
|
||||
padding: 0;
|
||||
color: #495057;
|
||||
background-attachment: fixed;
|
||||
background-size: 100% 100%;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.background {
|
||||
background-color: #f8f8ff;
|
||||
height: 100%
|
||||
}
|
||||
p {
|
||||
line-height: 32px;
|
||||
font-size: 17px;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
text-decoration: none;
|
||||
color: #495057;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.content {
|
||||
min-height: 3rem;
|
||||
padding: 1rem;
|
||||
margin: 1.5rem;
|
||||
display: inline-block;
|
||||
border: 1px solid #d9d9d6;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
|
||||
background: #f8f8ff
|
||||
}
|
||||
.extended-info {
|
||||
min-height: 3rem;
|
||||
padding: 1rem;
|
||||
margin-top: 1.5rem;
|
||||
display: inline-block;
|
||||
border: 1px solid #d9d9d6;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
|
||||
background: #f8f8ff;
|
||||
min-width: 50%
|
||||
}
|
||||
.application-info {
|
||||
min-height: 3rem;
|
||||
padding: 1rem;
|
||||
margin-top: 1.5rem;
|
||||
display: inline-block;
|
||||
border: 1px solid #d9d9d6;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
|
||||
background: #f8f8ff
|
||||
}
|
||||
h1 {
|
||||
margin-right: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 32px;
|
||||
text-transform: uppercase;
|
||||
color: #41465f;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 2px 2px 0 0;
|
||||
width: 90%;
|
||||
padding-left: 5%
|
||||
}
|
||||
h2,
|
||||
h3 {
|
||||
margin-right: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 25px;
|
||||
text-transform: uppercase;
|
||||
color: #41465f;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 2px 2px 0 0;
|
||||
width: 90%;
|
||||
padding-left: 5%
|
||||
}
|
||||
h4 {
|
||||
margin-right: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 20px!important;
|
||||
text-transform: uppercase;
|
||||
color: #41465f;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 2px 2px 0 0;
|
||||
width: 90%;
|
||||
padding-left: 5%
|
||||
}
|
||||
.showhider {
|
||||
margin-right: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
text-transform: uppercase;
|
||||
background: 0 0!important;
|
||||
border: none;
|
||||
padding: 0!important;
|
||||
width: 90%;
|
||||
color: #3b6bbf;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0;
|
||||
text-align: left
|
||||
}
|
||||
#links .showhider {
|
||||
font-size: 25px
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-bottom: 80px
|
||||
}
|
||||
ul {
|
||||
margin-left: 2rem;
|
||||
list-style: none
|
||||
}
|
||||
li {
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
background: #dee2e6;
|
||||
border: 1px solid #dee2e6;
|
||||
width: 64%;
|
||||
min-width: 64%;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
|
||||
margin: .5rem .5rem .5rem 32%
|
||||
}
|
||||
#readyness {
|
||||
min-height: 5rem;
|
||||
padding: .5rem;
|
||||
margin: .5rem;
|
||||
width: 42%;
|
||||
min-width: 42%;
|
||||
background: #dee2e6;
|
||||
text-align: center!important;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
#onboarding {
|
||||
min-height: 5rem;
|
||||
padding: .5rem;
|
||||
margin: .5rem;
|
||||
width: 42%;
|
||||
min-width: 42%;
|
||||
font-size: 2rem;
|
||||
background: #a48fe1;
|
||||
text-align: center!important;
|
||||
border: 1px solid #a48fe1;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
#i2pbrowser-description {
|
||||
width: 50%;
|
||||
min-width: 50%;
|
||||
min-height: 5rem;
|
||||
padding: .5rem;
|
||||
display: inline;
|
||||
background: #dee2e6;
|
||||
float: right;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
#applicationExplain,
|
||||
#linksExplain {
|
||||
min-height: 5rem;
|
||||
padding: .5rem;
|
||||
margin: .5rem;
|
||||
width: 30%;
|
||||
min-width: 30%;
|
||||
background: #dee2e6;
|
||||
float: left;
|
||||
text-align: center!important;
|
||||
border: 1px solid #dee2e6;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
#proxyReady {
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
margin: .2rem;
|
||||
width: 38%;
|
||||
min-width: 38%;
|
||||
display: inline;
|
||||
background: #d9d9d6;
|
||||
float: right;
|
||||
text-align: center!important;
|
||||
border: 1px solid #d9d9d6;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
#proxyUnready {
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
margin: .2rem;
|
||||
width: 38%;
|
||||
min-width: 38%;
|
||||
display: inline;
|
||||
float: right;
|
||||
text-align: center!important;
|
||||
border: 1px solid #ffc56d;
|
||||
border-radius: 2px;
|
||||
background: #ffc56d;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
#consoleOn {
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
margin: .2rem;
|
||||
width: 38%;
|
||||
min-width: 38%;
|
||||
display: inline;
|
||||
float: left;
|
||||
text-align: center!important;
|
||||
border: 1px solid #f7e59a;
|
||||
border-radius: 2px;
|
||||
background: #f7e59a;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
.onboardingContent {
|
||||
font-size: .8rem!important;
|
||||
text-align: left
|
||||
}
|
||||
#proxy-check {
|
||||
visibility: hidden
|
||||
}
|
||||
.consoleOn:hover #proxy-check,
|
||||
.proxyReady:hover #proxy-check {
|
||||
visibility: visible;
|
||||
opacity: 1
|
||||
}
|
||||
img.readyness {
|
||||
height: 100%;
|
||||
width: auto
|
||||
}
|
||||
@media only screen and (max-width: 768px) {
|
||||
.application-info {
|
||||
display: none
|
||||
}
|
||||
}
|
114
home.html
Normal file
@@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="home.css"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!--<div>-->
|
||||
<script src="home.js" type="text/javascript"></script>
|
||||
<div class='background'>
|
||||
<div class='content'>
|
||||
<div class='section-header'>
|
||||
<h1>I2P In Private Browsing</h1>
|
||||
</div>
|
||||
<div id="i2pbrowser-version"></div>
|
||||
<div id="i2pbrowser-description">
|
||||
<p id="description">I2P in Private Browsing is a webextension to secure and enhance your I2P use in the browser.</p>
|
||||
<p class="beta">This is an experimental product.</p>
|
||||
</div>
|
||||
<div id="readyness">
|
||||
<div id="consoleOn" class="hideIfI2PConsoleOff">
|
||||
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
|
||||
<span id="proxy-check">Proxy is ready.</span>
|
||||
</div>
|
||||
<!--<div id="proxyUnready" class="hideIfI2PProxyOn">The proxy is not ready yet.</div>-->
|
||||
<div id="proxyReady" class="hideIfI2PProxyOff">
|
||||
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
|
||||
<span id="proxy-check">Proxy is ready.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="onboarding" class="hideIfI2PConsoleOff">
|
||||
<h3 id="onboardingTitle">New to I2P? Learn more here.</h3>
|
||||
<h4 id="onboardingZero"><button class="showhider" onclick="flipVisibility('onboardingContentZero')">Protect your Privacy</button></h4>
|
||||
<p id="onboardingContentZero" class="onboardingContent">I2P Browser allows you to surf the internet using the private and secure I2P network. When using it, you are protected against tracking, surveillance, and censorship as a first-class participant in the I2P network. I2P Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser.</p>
|
||||
<h4 id="onboardingOne"><button class="showhider" onclick="flipVisibility('onboardingContentOne')">Configure your Experience</button></h4>
|
||||
<p id="onboardingContentOne" class="onboardingContent">We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do. Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them. With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
|
||||
<h4 id="onboardingTwo"><button class="showhider" onclick="flipVisibility('onboardingContentTwo')">Share Files</button></h4>
|
||||
<p id="onboardingContentTwo" class="onboardingContent">I2P is capable of using peer-to-peer applications like BitTorrent, protecting your identity when you share files. Our anonymous bittorrent client is available in the browser.</p>
|
||||
<h4 id="onboardingThree"><button class="showhider" onclick="flipVisibility('onboardingContentThree')">Hidden e-mail</button></h4>
|
||||
<p id="onboardingContentThree" class="onboardingContent">There is also an anonymous e-mail service available inside of I2P, which is accessible from our browser via the menu directly below.</p>
|
||||
<h4 id="onboardingFour"><button class="showhider" onclick="flipVisibility('onboardingContentFour')">Experience Tips</button></h4>
|
||||
<p id="onboardingContentFour" class="onboardingContent">With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
|
||||
</div>
|
||||
<!--<p class="hideIfI2POn">&aboutI2p.warn_not_running; <a href="about:i2p">&aboutI2p.refresh_text;</a> &aboutI2p.reccommend_not_running;</p>-->
|
||||
<div class="application-info">
|
||||
<p class="hideIfI2PConsoleOff">
|
||||
<h3>Applications</h3>
|
||||
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
|
||||
<ul>
|
||||
<a class="applicationName" href="http://127.0.0.1:7657/i2ptunnel">
|
||||
<li class="application">
|
||||
Hidden Services Manager <span class="applicationDesc">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span>
|
||||
</li>
|
||||
</a>
|
||||
<a class="applicationName" href="http://127.0.0.1:7657/susimail">
|
||||
<li class="application">
|
||||
E-Mail <span class="applicationDesc">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span>
|
||||
</li>
|
||||
</a>
|
||||
<a class="applicationName" href="http://127.0.0.1:7657/i2psnark">
|
||||
<li class="application">
|
||||
BitTorrent <span class="applicationDesc">I2P is capable of anonymous Peer-to-Peer file sharing, to use the built-in bittorrent client go here:</span>
|
||||
</li>
|
||||
</a>
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
<div class="extended-info">
|
||||
<h3 id="links"><button class="showhider" onclick="flipVisibility('info-content')">Links</button></h3>
|
||||
<div id="info-content">
|
||||
<p id="linksExplain">If you want to get more information about I2P, you can visit these links.</p>
|
||||
<p>
|
||||
<ul>
|
||||
<a href="https://github.com/i2p/i2p-browser">
|
||||
<li>
|
||||
I2P Browser Source Code: <span class="applicationDesc">Go here to browse the source code of our Firefox fork.</span>
|
||||
</li>
|
||||
</a>
|
||||
<a href="https://github.com/i2p/i2pbutton">
|
||||
<li>
|
||||
I2P Button Source Code: <span class="applicationDesc">Much of the functionality of the I2P Browser is implemented in the I2PButton plugin.</span>
|
||||
</li>
|
||||
</a>
|
||||
<a href="https://github.com/mikalv/i2p-browser-build-scripts">
|
||||
<li>
|
||||
I2P Browser Build Scripts: <span class="applicationDesc">These scripts are used to build the browser.</span>
|
||||
</li>
|
||||
</a>
|
||||
<a href="https://github.com/mikalv/i2p-browser-design-docs">
|
||||
<li>
|
||||
I2P Browser Design Document: <span class="applicationDesc">This is the I2P Browser Design Document.</span>
|
||||
</li>
|
||||
</a>
|
||||
<a href="http://trac.i2p2.i2p/">
|
||||
<li>
|
||||
Trac Wiki: <span class="applicationDesc">To report a bug, visit the Trac Wiki.</span>
|
||||
</li>
|
||||
</a>
|
||||
<a href="http://i2p-projekt.i2p/get-involved/donate">
|
||||
<li>
|
||||
<em>Support Us: </em> <span class="applicationDesc">I2P is funded by donations. In order to make a donation visit the project web site.</span>
|
||||
</li>
|
||||
</a>
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--</div>-->
|
||||
</body>
|
||||
</html>
|
8
home.js
Normal file
@@ -0,0 +1,8 @@
|
||||
function flipVisibility(div) {
|
||||
var x = document.getElementById(div);
|
||||
if (x.style.display === "none") {
|
||||
x.style.display = "block";
|
||||
} else {
|
||||
x.style.display = "none";
|
||||
}
|
||||
}
|
102
host.js
Normal file
@@ -0,0 +1,102 @@
|
||||
function proxyHost(url) {
|
||||
let hostname = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
}
|
||||
if (hostname == "proxy.i2p") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function localHost(url) {
|
||||
let hostname = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
}
|
||||
hostname = hostname.split(":")[0];
|
||||
if (hostname === "127.0.0.1") {
|
||||
return true;
|
||||
} else if (hostname === "localhost") {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function i2pHostName(url) {
|
||||
let hostname = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
}
|
||||
return hostname;
|
||||
}
|
||||
|
||||
function i2pHost(url) {
|
||||
let hostname = i2pHostName(url);
|
||||
return hostname.endsWith(".i2p");
|
||||
}
|
||||
|
||||
function routerHost(url) {
|
||||
let hostname = "";
|
||||
let path = "";
|
||||
function pathcheck(str) {
|
||||
if (str != undefined) {
|
||||
let final = str.split("/")[0];
|
||||
if (final === "i2ptunnelmgr" || final === "i2ptunnel") {
|
||||
console.log("(urlcheck) application path", final);
|
||||
return "i2ptunnelmgr";
|
||||
} else if (final === "i2psnark" || final === "torrents") {
|
||||
console.log("(urlcheck) application path", final);
|
||||
return "i2psnark";
|
||||
} else if (final === "webmail" || final === "susimail") {
|
||||
console.log("(urlcheck) application path", final);
|
||||
return "webmail";
|
||||
} else if (
|
||||
final === "home" ||
|
||||
final === "console" ||
|
||||
final.startsWith("config")
|
||||
) {
|
||||
console.log("(urlcheck) application path", final);
|
||||
return "routerconsole";
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
prefix = url.substr(0, url.indexOf("://") + 3);
|
||||
path = url.replace(prefix + hostname + "/", "");
|
||||
} else if (identifyProtocolHandler(url)) {
|
||||
url = identifyProtocolHandler(url);
|
||||
return routerHost(url);
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
path = url.replace(hostname + "/", "");
|
||||
}
|
||||
if (hostname === "127.0.0.1:7657") {
|
||||
return pathcheck(path);
|
||||
} else if (hostname === "localhost:7657") {
|
||||
return pathcheck(path);
|
||||
}
|
||||
|
||||
if (hostname === "127.0.0.1:7647") {
|
||||
return pathcheck(path);
|
||||
} else if (hostname === "localhost:7647") {
|
||||
return pathcheck(path);
|
||||
}
|
||||
|
||||
if (hostname === "127.0.0.1:7070") {
|
||||
return pathcheck(path);
|
||||
} else if (hostname === "localhost:7070") {
|
||||
return pathcheck(path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
47
i2pcontrol/i2pcontrol.js
Normal file
@@ -0,0 +1,47 @@
|
||||
function send(json) {
|
||||
const Http = new XMLHttpRequest();
|
||||
Http.withCredentials = false;
|
||||
const url = "http://" + "127.0.0.1" + ":" + "7650";
|
||||
Http.open("POST", url);
|
||||
Http.send(json);
|
||||
//console.log(Http);
|
||||
return Http;
|
||||
}
|
||||
|
||||
function authenticate(user, password) {
|
||||
var json = {
|
||||
jsonrpc: "2.0",
|
||||
id: user,
|
||||
method: "Authenticate",
|
||||
params: {
|
||||
API: 1,
|
||||
Password: password
|
||||
}
|
||||
};
|
||||
return send(json);
|
||||
}
|
||||
|
||||
var username = "";
|
||||
var password = "";
|
||||
|
||||
function echo(string, section) {
|
||||
var xhr = authenticate(username, password);
|
||||
console.log("(i2pcontrol) echo", xhr);
|
||||
xhr.onload = function() {
|
||||
resp = JSON.Parse(xhr.responseText);
|
||||
json = {
|
||||
jsonrpc: "2.0",
|
||||
id: username,
|
||||
method: "Echo",
|
||||
params: {
|
||||
Token: resp.Token,
|
||||
Echo: string
|
||||
}
|
||||
};
|
||||
var controlMessage = document.getElementById(section);
|
||||
console.log("(i2pcontrol) reply", xhr.responseText);
|
||||
infoMessage.textContent = xhr.responseText;
|
||||
};
|
||||
}
|
||||
|
||||
echo("test", "test");
|
BIN
i2psetproxy.js.gif
Normal file
After Width: | Height: | Size: 4.9 MiB |
Before Width: | Height: | Size: 357 KiB After Width: | Height: | Size: 213 KiB |
BIN
i2psnark.png
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
i2ptunnel.png
Normal file
After Width: | Height: | Size: 209 KiB |
119
icons/i2plogo.svg
Normal file
@@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="109.95727mm"
|
||||
height="27.706699mm"
|
||||
viewBox="0 0 109.95727 27.706699"
|
||||
version="1.1"
|
||||
id="svg4773"
|
||||
inkscape:version="0.92.1 r"
|
||||
sodipodi:docname="horizontal_color.svg">
|
||||
<defs
|
||||
id="defs4767" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.98994949"
|
||||
inkscape:cx="125.25987"
|
||||
inkscape:cy="51.24018"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="740"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata4770">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-55.768389,-115.63486)">
|
||||
<g
|
||||
id="g5355">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4516"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 55.768389,116.32817 h 5.625388 v 26.53071 h -5.625388 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4528"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="M 83.567492,142.85915 H 64.806129 v -3.94692 l 6.737086,-6.81049 c 1.994831,-2.04361 3.297929,-3.46052 3.910222,-4.24981 0.611829,-0.78977 1.052235,-1.52051 1.321681,-2.19367 0.268981,-0.67315 0.403705,-1.37046 0.403705,-2.09285 0,-1.07686 -0.296392,-1.8787 -0.890103,-2.40504 -0.593711,-0.52589 -1.38579,-0.78929 -2.377165,-0.78929 -1.040621,0 -2.050116,0.23877 -3.028948,0.71589 -0.979764,0.47756 -2.001336,1.15675 -3.066113,2.03756 l -3.083766,-3.65285 c 1.321681,-1.1261 2.416654,-1.92143 3.285851,-2.38646 0.868731,-0.46502 1.817367,-0.8232 2.845444,-1.07406 1.028078,-0.25087 2.178334,-0.3763 3.451235,-0.3763 1.676607,0 3.157633,0.30615 4.442612,0.91798 1.284979,0.61229 2.282403,1.46848 2.992248,2.56995 0.709385,1.10148 1.064782,2.36231 1.064782,3.78154 0,1.23667 -0.217415,2.39575 -0.651785,3.47912 -0.434369,1.08288 -1.107514,2.19365 -2.01946,3.33183 -0.911472,1.13818 -2.517923,2.75997 -4.818901,4.86443 l -3.451235,3.24962 v 0.2569 h 11.693973 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4532"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 92.213601,128.81343 h 1.850822 c 1.730025,0 3.024298,-0.34145 3.88374,-1.02529 0.858507,-0.68337 1.288228,-1.67846 1.288228,-2.98528 0,-1.31843 -0.360032,-2.29215 -1.079636,-2.92164 -0.720078,-0.62854 -1.848504,-0.94352 -3.384343,-0.94352 h -2.558811 z m 12.703009,-4.21033 c 0,2.85566 -0.89243,5.03911 -2.67682,6.55126 -1.78485,1.51261 -4.322284,2.26845 -7.612787,2.26845 h -2.413402 v 9.43621 h -5.625393 v -26.53071 h 8.474561 c 3.218022,0 5.664411,0.69266 7.340551,2.078 1.6752,1.38532 2.51329,3.45076 2.51329,6.19679" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4536"
|
||||
style="fill:#ffc434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 121.18308,137.09597 c 0,-3.44937 -2.79621,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44939 2.7962,6.24559 6.24557,6.24559 3.44938,0 6.24559,-2.7962 6.24559,-6.24559" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4540"
|
||||
style="fill:#60ab60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 121.18308,122.24846 c 0,-3.44937 -2.79621,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44938 2.7962,6.24559 6.24557,6.24559 3.44938,0 6.24559,-2.79621 6.24559,-6.24559" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4544"
|
||||
style="fill:#e15647;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 136.03063,137.09597 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44939,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44939 2.7962,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.7962 6.24557,-6.24559" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4548"
|
||||
style="fill:#ffc434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 136.03063,122.24846 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44939,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44938 2.7962,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.79621 6.24557,-6.24559" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4552"
|
||||
style="fill:#ffc434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 150.87814,137.09597 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44938,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44939 2.79621,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.7962 6.24557,-6.24559" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4556"
|
||||
style="fill:#60ab60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 150.87814,122.24846 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44938,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44938 2.79621,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.79621 6.24557,-6.24559" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4560"
|
||||
style="fill:#60ab60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 165.72566,137.09597 c 0,-3.44937 -2.7962,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44939 2.7962,6.24559 6.24557,6.24559 3.44939,0 6.24559,-2.7962 6.24559,-6.24559" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4564"
|
||||
style="fill:#e15647;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
|
||||
d="m 165.72566,122.24846 c 0,-3.44937 -2.7962,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44938 2.7962,6.24559 6.24557,6.24559 3.44939,0 6.24559,-2.79621 6.24559,-6.24559" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.9 KiB |
106
index.html
Normal file
@@ -0,0 +1,106 @@
|
||||
<strong>i2psetproxy.js</strong>
|
||||
|
||||
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.
|
||||
|
||||
<strong>The Old Version</strong>
|
||||
|
||||
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.
|
||||
|
||||
<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>
|
||||
</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>
|
||||
|
||||
<ul>
|
||||
<li>[done] <strong>Provide</strong> a way to launch into an I2P-Specific contextual identity
|
||||
(container). Intercept requests to .i2p domains and automatically route them
|
||||
to the I2P container. Isolate the router console from other local
|
||||
applications by automatically intercepting requests to the router console to
|
||||
another container.</li>
|
||||
<li>[done/wip] <strong>Indicate</strong> the I2P browser is in use visually. Find an
|
||||
acceptable way to indicate it on Android.</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
|
||||
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>[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
|
||||
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
|
||||
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
|
||||
can.</li>
|
||||
</ul>
|
||||
|
||||
<strong>Screenshot</strong>
|
||||
|
||||
|
||||
|
||||
<strong>Super Extra Important Background Info:</strong>
|
||||
|
||||
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.
|
||||
|
||||
<strong>Links about Project Uplift</strong>
|
||||
|
||||
<ul>
|
||||
<li>https://wiki.mozilla.org/Security/Tor_Uplift</li>
|
||||
<li>https://wiki.mozilla.org/Security/FirstPartyIsolation</li>
|
||||
<li>https://wiki.mozilla.org/Security/Fingerprinting</li>
|
||||
<li>https://wiki.mozilla.org/Security/Fennec%2BTor_Project</li>
|
||||
<li>https://wiki.mozilla.org/Security/Tor_Uplift/Tracking</li>
|
||||
</ul>
|
||||
|
||||
Project uplift seems to have largely been accomplished?
|
||||
|
||||
<strong>Links about Project Fusion</strong>
|
||||
|
||||
<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>
|
56
info.css
@@ -1,12 +1,54 @@
|
||||
html, body {
|
||||
width: 350px;
|
||||
body,
|
||||
html {
|
||||
width: 50rem
|
||||
}
|
||||
|
||||
a {
|
||||
margin: 10px;
|
||||
display: inline-block;
|
||||
margin: 10px
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin: 5px;
|
||||
margin: 5px
|
||||
}
|
||||
span.identity {
|
||||
width: 100px;
|
||||
display: inline-block;
|
||||
margin-left: 1em
|
||||
}
|
||||
figcaption {
|
||||
display: inline
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-bottom: 8px
|
||||
}
|
||||
p {
|
||||
font-size: 12px
|
||||
}
|
||||
h1 {
|
||||
font-size: 25px
|
||||
}
|
||||
h2,
|
||||
h3 {
|
||||
font-size: 18px
|
||||
}
|
||||
h4 {
|
||||
font-size: 13px!important
|
||||
}
|
||||
#links .showhider {
|
||||
font-size: 18px
|
||||
}
|
||||
#onboarding {
|
||||
font-size: 2rem
|
||||
}
|
||||
img.readyness {
|
||||
height: 2rem
|
||||
}
|
||||
#proxyUnready {
|
||||
min-height: 2rem
|
||||
}
|
||||
#proxyReady {
|
||||
min-height: 2rem
|
||||
}
|
||||
#consoleOn {
|
||||
min-height: 2rem
|
||||
}
|
141
info.js
@@ -1,4 +1,4 @@
|
||||
document.addEventListener("click", (e) => {
|
||||
document.addEventListener("click", e => {
|
||||
function getCurrentWindow() {
|
||||
return chrome.windows.getCurrent();
|
||||
}
|
||||
@@ -6,44 +6,157 @@ document.addEventListener("click", (e) => {
|
||||
if (e.target.id === "window-create-help-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true,
|
||||
incognito: true
|
||||
};
|
||||
let creating = chrome.windows.create(createData);
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(() => {
|
||||
console.log("The help panel has been created");
|
||||
});
|
||||
} else if (e.target.id === "window-create-news-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true,
|
||||
incognito: true
|
||||
};
|
||||
let creating = chrome.windows.create(createData);
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(() => {
|
||||
console.log("The news panel has been created");
|
||||
});
|
||||
} else if (e.target.id === "generate-fresh-tunnel") {
|
||||
function RefreshIdentity() {
|
||||
console.log("Generating new identity")
|
||||
console.log("Generating new identity");
|
||||
const Http = new XMLHttpRequest();
|
||||
const url = 'http://' + controlHost + ":" + controlPort
|
||||
const url = "http://" + controlHost + ":" + controlPort;
|
||||
Http.open("GET", url);
|
||||
Http.send();
|
||||
Http.onreadystatechange = (e) => {
|
||||
console.log(Http.responseText)
|
||||
}
|
||||
Http.onreadystatechange = e => {
|
||||
console.log(Http.responseText);
|
||||
};
|
||||
}
|
||||
RefreshIdentity();
|
||||
} else if (e.target.id === "window-preface-title") {
|
||||
getCurrentWindow().then((currentWindow) => {
|
||||
getCurrentWindow().then(currentWindow => {
|
||||
let updateInfo = {
|
||||
titlePreface: "I2P Help | "
|
||||
}
|
||||
};
|
||||
chrome.windows.update(currentWindow.id, updateInfo);
|
||||
});
|
||||
} else if (e.target.id === "window-visit-homepage") {
|
||||
console.log("attempting to create homepage tab");
|
||||
goHome();
|
||||
} else if (e.target.id === "window-visit-i2ptunnel") {
|
||||
console.log("attempting to create i2ptunnel tab");
|
||||
goTunnel();
|
||||
} else if (e.target.id === "window-visit-susimail") {
|
||||
console.log("attempting to create susimail tab");
|
||||
goMail();
|
||||
} else if (e.target.id === "window-visit-snark") {
|
||||
console.log("attempting to create snark tab");
|
||||
goSnark();
|
||||
} else if (e.target.id === "clear-browser-data") {
|
||||
forgetBrowsingData()
|
||||
forgetBrowsingData();
|
||||
} else if (e.target.id === "check-i2p-control") {
|
||||
echo("I2P Router Detected", "panel-section-i2pcontrol-check");
|
||||
} else if (e.target.id === "enable-web-rtc") {
|
||||
if (e.target.checked) {
|
||||
browser.runtime.sendMessage({ rtc: "enableWebRTC" });
|
||||
} else {
|
||||
browser.runtime.sendMessage({ rtc: "disableWebRTC" });
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
});
|
||||
|
||||
function proxyReadiness() {
|
||||
console.log(this.responseText);
|
||||
}
|
||||
|
||||
function goHome() {
|
||||
function gotProxyInfo(info) {
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
let createData = {
|
||||
url: "about:I2p"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
} else {
|
||||
let createData = {
|
||||
url: "home.html"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
function goTunnel() {
|
||||
let createData = {
|
||||
url: "http://127.0.0.1:7657/i2ptunnel"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
}
|
||||
|
||||
function goMail() {
|
||||
let createData = {
|
||||
url: "http://127.0.0.1:7657/susimail"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
}
|
||||
|
||||
function goSnark() {
|
||||
let createData = {
|
||||
url: "http://127.0.0.1:7657/i2psnark"
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
}
|
||||
/*
|
||||
//document.addEventListener("onpageshow", e => {
|
||||
console.log("(Check) Checking Proxy Readiness");
|
||||
const Http = new XMLHttpRequest();
|
||||
Http.addEventListener("load", proxyReadiness);
|
||||
const url = "http://proxy.i2p"; ///themes/console/images/favicon.ico";
|
||||
Http.open("GET", url);
|
||||
Http.send();
|
||||
//});
|
||||
|
||||
function transferComplete(evt) {
|
||||
console.log(
|
||||
"The transfer is complete.",
|
||||
this.status,
|
||||
this.statusText,
|
||||
this.responseText
|
||||
);
|
||||
}
|
||||
|
||||
function transferFailed(evt) {
|
||||
console.log(
|
||||
"An error occurred while transferring the file.",
|
||||
this.status,
|
||||
this.statusText,
|
||||
this.responseText
|
||||
);
|
||||
}
|
||||
|
||||
function transferCanceled(evt) {
|
||||
console.log(
|
||||
"The transfer has been canceled by the user.",
|
||||
this.status,
|
||||
this.statusText,
|
||||
this.responseText
|
||||
);
|
||||
}
|
||||
|
||||
Http.addEventListener("load", transferComplete);
|
||||
Http.addEventListener("error", transferFailed);
|
||||
Http.addEventListener("abort", transferCanceled);
|
||||
*/
|
||||
|
@@ -1,24 +1,30 @@
|
||||
{
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "i2psetproxy.js@eyedeekay.github.io",
|
||||
"id": "i2ppb@eyedeekay.github.io",
|
||||
"strict_min_version": "60.0"
|
||||
}
|
||||
},
|
||||
"content_security_policy": "script-src 'self' 'sha256-AT9pbzcnD9T9Agf3fMgPh55nsx/xONoULxPFvOb93Uo='; object-src 'self'",
|
||||
"permissions": [
|
||||
"theme",
|
||||
"browsingData",
|
||||
"bookmarks",
|
||||
"notifications",
|
||||
"proxy",
|
||||
"privacy",
|
||||
"storage",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"contextualIdentities",
|
||||
"cookies",
|
||||
"history",
|
||||
"tabs",
|
||||
"<all_urls>"
|
||||
],
|
||||
"manifest_version": 2,
|
||||
"name": "__MSG_extensionName__",
|
||||
"version": "1.27",
|
||||
"version": "0.46",
|
||||
"description": "__MSG_extensionDescription__",
|
||||
"homepage_url": "https://github.com/eyedeekay/i2psetproxy.js",
|
||||
"icons": {
|
||||
@@ -34,8 +40,30 @@
|
||||
"page": "options/options.html"
|
||||
},
|
||||
"background": {
|
||||
"scripts": ["chromium/browser-polyfill.min.js", "background.js", "proxy.js", "info.js", "privacy.js" ]
|
||||
"scripts": [
|
||||
"privacy.js",
|
||||
"platform.js",
|
||||
"background.js",
|
||||
"host.js",
|
||||
"handler.js",
|
||||
"proxy.js",
|
||||
"info.js",
|
||||
"home.js",
|
||||
"i2pcontrol/i2pcontrol.js",
|
||||
"scrub.js",
|
||||
"bookmarks.js"
|
||||
]
|
||||
},
|
||||
"protocol_handlers": [{
|
||||
"protocol": "ext+rc",
|
||||
"name": "RouterConsole",
|
||||
"uriTemplate": "http://127.0.0.1:7657/%s"
|
||||
},
|
||||
{
|
||||
"protocol": "magnet",
|
||||
"name": "I2PTorrent",
|
||||
"uriTemplate": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent"
|
||||
}],
|
||||
"default_locale": "en"
|
||||
}
|
||||
|
||||
|
@@ -1,78 +1,204 @@
|
||||
|
||||
function isDroid() {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
return true
|
||||
return true;
|
||||
} else {
|
||||
return false
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function SetHostText() {
|
||||
var hostid = document.getElementById('hostText');
|
||||
var hostid = document.getElementById("hostText");
|
||||
hostid.textContent = chrome.i18n.getMessage("hostText");
|
||||
}
|
||||
|
||||
function SetPortText() {
|
||||
var portid = document.getElementById('portText');
|
||||
var portid = document.getElementById("portText");
|
||||
portid.textContent = chrome.i18n.getMessage("portText");
|
||||
}
|
||||
|
||||
function SetControlHostText() {
|
||||
var controlhostid = document.getElementById('controlHostText');
|
||||
var controlhostid = document.getElementById("controlHostText");
|
||||
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
|
||||
}
|
||||
|
||||
function setupProxy() {
|
||||
var controlHost = getControlHost()
|
||||
var controlPort = getControlPort();
|
||||
var Host = getHost()
|
||||
var Port = getPort()
|
||||
var Scheme = getScheme()
|
||||
if (!getChrome()) {
|
||||
function handleProxyRequest(requestInfo) {
|
||||
console.log("proxying request via listener")
|
||||
console.log(" ", Scheme, Host, ":", Port,)
|
||||
return {
|
||||
type: Scheme,
|
||||
host: Host,
|
||||
port: Port,
|
||||
proxyDns: true
|
||||
var handleContextProxyRequest = async function(requestDetails) {
|
||||
console.log("(proxy)Searching for proxy by context");
|
||||
try {
|
||||
var handleProxyRequest = function(context) {
|
||||
proxy = {
|
||||
failoverTimeout: 0,
|
||||
proxyDns: false
|
||||
};
|
||||
if (context != undefined) {
|
||||
if (context.name == "i2pbrowser") {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
return proxy;
|
||||
} else if (context.name == "routerconsole") {
|
||||
if (routerHost(requestDetails.url)) {
|
||||
return proxy;
|
||||
} else if (!routerHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};
|
||||
}
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
return proxy;
|
||||
} else if (context.name == "fenced-default") {
|
||||
if (localHost(requestDetails.url)) {
|
||||
if (!routerHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};
|
||||
}
|
||||
}
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
return proxy;
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log("Setting up Firefox WebExtension proxy")
|
||||
browser.proxy.onRequest.addListener(handleProxyRequest, {
|
||||
urls: ["<all_urls>"]
|
||||
});
|
||||
console.log("i2p settings created for WebExtension Proxy")
|
||||
} else {
|
||||
var config = {
|
||||
mode: "fixed_servers",
|
||||
rules: {
|
||||
singleProxy: {
|
||||
scheme: Scheme,
|
||||
host: Host,
|
||||
port: parseInt(Port),
|
||||
},
|
||||
if (!routerHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};
|
||||
} else if (i2pHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
}
|
||||
return proxy;
|
||||
};
|
||||
var contextGet = async function(tabInfo) {
|
||||
try {
|
||||
console.log("(proxy)Tab info from Function", tabInfo);
|
||||
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
|
||||
return context;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Context Error", error);
|
||||
}
|
||||
};
|
||||
chrome.proxy.settings.set(
|
||||
{
|
||||
value: config,
|
||||
scope: 'regular'
|
||||
}, function() {});
|
||||
var tabFind = async function(tabId) {
|
||||
try {
|
||||
context = await browser.contextualIdentities.query({
|
||||
name: "i2pbrowser"
|
||||
});
|
||||
tabId.cookieStoreId = context[0].cookieStoreId;
|
||||
console.log("(proxy) forcing context", tabId.cookieStoreId);
|
||||
return tabId;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Context Error", error);
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(proxy)Tab ID from Request", tabId);
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Tab error", error);
|
||||
}
|
||||
};
|
||||
|
||||
if (requestDetails.tabId > 0) {
|
||||
if (proxyHost(requestDetails.url)) {
|
||||
console.log("(Proxy)I2P Proxy test URL detected, ", requestDetails.url);
|
||||
return {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
} else if (i2pHost(requestDetails.url)) {
|
||||
console.log("(Proxy)I2P URL detected, ");
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(tabFind);
|
||||
requestDetails.tabId = mtab;
|
||||
var context = mtab.then(contextGet);
|
||||
var proxy = await context.then(handleProxyRequest);
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
return proxy;
|
||||
} else {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var context = tab.then(contextGet);
|
||||
var proxy = await context.then(handleProxyRequest);
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
return proxy;
|
||||
}
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
return proxy;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(proxy)Not using I2P Proxy.", error);
|
||||
}
|
||||
};
|
||||
|
||||
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, {
|
||||
urls: ["<all_urls>"]
|
||||
});
|
||||
console.log("i2p settings created for WebExtension Proxy");
|
||||
/**/
|
||||
}
|
||||
|
||||
function SetControlPortText() {
|
||||
var controlportid = document.getElementById('controlPortText');
|
||||
var controlportid = document.getElementById("controlPortText");
|
||||
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
|
||||
}
|
||||
|
||||
function SetControlHelpText() {
|
||||
var portid = document.getElementById('controlHelpText');
|
||||
var portid = document.getElementById("controlHelpText");
|
||||
portid.textContent = chrome.i18n.getMessage("controlHelpText");
|
||||
}
|
||||
|
||||
@@ -80,68 +206,122 @@ function getScheme() {
|
||||
const proxy_scheme = document.querySelector("#proxy_scheme");
|
||||
console.log("Got i2p proxy scheme:", proxy_scheme.value);
|
||||
if (proxy_scheme == "HTTP") {
|
||||
return "http"
|
||||
return "http";
|
||||
}
|
||||
if (proxy_scheme == "SOCKS") {
|
||||
return "socks"
|
||||
return "socks";
|
||||
}
|
||||
return proxy_scheme.value;
|
||||
}
|
||||
|
||||
function getHost() {
|
||||
proxy_host = document.getElementById("host").value
|
||||
proxy_host = document.getElementById("host").value;
|
||||
console.log("Got i2p proxy host:", proxy_host);
|
||||
if (proxy_host == undefined) {
|
||||
return "127.0.0.1"
|
||||
return "127.0.0.1";
|
||||
}
|
||||
return proxy_host;
|
||||
}
|
||||
|
||||
function getPort() {
|
||||
proxy_port = document.getElementById("port").value
|
||||
proxy_port = document.getElementById("port").value;
|
||||
console.log("Got i2p proxy port:", proxy_port);
|
||||
if (proxy_port == undefined) {
|
||||
return "4444"
|
||||
return "4444";
|
||||
}
|
||||
return proxy_port;
|
||||
}
|
||||
|
||||
function getControlHost() {
|
||||
control_host = document.getElementById("controlhost").value
|
||||
control_host = document.getElementById("controlhost").value;
|
||||
console.log("Got i2p control host:", control_host);
|
||||
if (control_host == undefined) {
|
||||
return "127.0.0.1"
|
||||
return "127.0.0.1";
|
||||
}
|
||||
return control_host;
|
||||
}
|
||||
|
||||
function getControlPort() {
|
||||
control_port = document.getElementById("controlport").value
|
||||
control_port = document.getElementById("controlport").value;
|
||||
console.log("Got i2p control port:", control_port);
|
||||
if (control_port == undefined) {
|
||||
return "4444"
|
||||
return "4444";
|
||||
}
|
||||
return control_port;
|
||||
}
|
||||
|
||||
function checkStoredSettings(storedSettings) {
|
||||
let defaultSettings = {};
|
||||
if (!storedSettings.proxy_scheme) {
|
||||
defaultSettings["proxy_scheme"] = "http"
|
||||
function gotProxyInfo(info) {
|
||||
let defaultSettings = {};
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
console.log("proxy", "'" + host + "'", ":", port);
|
||||
if (!storedSettings.proxy_scheme) {
|
||||
defaultSettings["proxy_scheme"] = "http";
|
||||
}
|
||||
if (!storedSettings.proxy_host) {
|
||||
if (host == "") {
|
||||
defaultSettings["proxy_host"] = "127.0.0.1";
|
||||
} else {
|
||||
defaultSettings["proxy_host"] = host;
|
||||
}
|
||||
} else {
|
||||
if (host != "") {
|
||||
defaultSettings["proxy_host"] = host;
|
||||
} else {
|
||||
defaultSettings["proxy_host"] = storedSettings.proxy_host;
|
||||
}
|
||||
}
|
||||
if (!storedSettings.proxy_port) {
|
||||
if (port == undefined) {
|
||||
defaultSettings["proxy_port"] = 4444;
|
||||
} else {
|
||||
defaultSettings["proxy_port"] = port;
|
||||
}
|
||||
} else {
|
||||
if (port != undefined) {
|
||||
defaultSettings["proxy_port"] = port;
|
||||
} else {
|
||||
defaultSettings["proxy_port"] = storedSettings.proxy_port;
|
||||
}
|
||||
}
|
||||
if (!storedSettings.control_host) {
|
||||
if (host == "") {
|
||||
defaultSettings["control_host"] = "127.0.0.1";
|
||||
} else {
|
||||
defaultSettings["control_host"] = host;
|
||||
}
|
||||
} else {
|
||||
if (host != "") {
|
||||
defaultSettings["control_host"] = host;
|
||||
} else {
|
||||
defaultSettings["control_host"] = storedSettings.control_host;
|
||||
}
|
||||
}
|
||||
if (!storedSettings.control_port) {
|
||||
if (port == undefined) {
|
||||
defaultSettings["control_port"] = 4444;
|
||||
} else {
|
||||
defaultSettings["control_port"] = port;
|
||||
}
|
||||
} else {
|
||||
if (port != undefined) {
|
||||
defaultSettings["control_port"] = port;
|
||||
} else {
|
||||
defaultSettings["control_port"] = storedSettings.control_port;
|
||||
}
|
||||
}
|
||||
console.log("(browserinfo) NATIVE PROXYSETTINGS", info.value);
|
||||
console.log(
|
||||
defaultSettings["proxy_host"],
|
||||
defaultSettings["proxy_port"],
|
||||
defaultSettings["control_host"],
|
||||
defaultSettings["control_port"]
|
||||
);
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
}
|
||||
if (!storedSettings.proxy_host) {
|
||||
defaultSettings["proxy_host"] = "127.0.0.1"
|
||||
}
|
||||
if (!storedSettings.proxy_port) {
|
||||
defaultSettings["proxy_port"] = 4444
|
||||
}
|
||||
if (!storedSettings.control_host) {
|
||||
defaultSettings["control_host"] = "127.0.0.1"
|
||||
}
|
||||
if (!storedSettings.control_port) {
|
||||
defaultSettings["control_port"] = 4444
|
||||
}
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.then(gotProxyInfo);
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
@@ -149,66 +329,64 @@ function onError(e) {
|
||||
}
|
||||
|
||||
function storeSettings() {
|
||||
let proxy_scheme = getScheme()
|
||||
let proxy_host = getHost()
|
||||
let proxy_port = getPort()
|
||||
let control_host = getControlHost()
|
||||
let control_port = getControlPort()
|
||||
let proxy_scheme = getScheme();
|
||||
let proxy_host = getHost();
|
||||
let proxy_port = getPort();
|
||||
let control_host = getControlHost();
|
||||
let control_port = getControlPort();
|
||||
chrome.storage.local.set({
|
||||
proxy_scheme,
|
||||
proxy_host,
|
||||
proxy_port,
|
||||
control_host,
|
||||
control_port,
|
||||
control_port
|
||||
});
|
||||
console.log("storing proxy scheme:", proxy_scheme)
|
||||
console.log("storing proxy host:", proxy_host)
|
||||
console.log("storing proxy port:", proxy_port)
|
||||
console.log("storing control host:", control_host)
|
||||
console.log("storing control port:", control_port)
|
||||
setupProxy()
|
||||
console.log("storing proxy scheme:", proxy_scheme);
|
||||
console.log("storing proxy host:", proxy_host);
|
||||
console.log("storing proxy port:", proxy_port);
|
||||
console.log("storing control host:", control_host);
|
||||
console.log("storing control port:", control_port);
|
||||
setupProxy();
|
||||
}
|
||||
|
||||
function updateUI(restoredSettings) {
|
||||
const selectList = document.querySelector("#proxy_scheme");
|
||||
selectList.value = restoredSettings.proxy_scheme;
|
||||
console.log("showing proxy scheme:", selectList.value);
|
||||
|
||||
const selectList = document.querySelector("#proxy_scheme")
|
||||
selectList.value = restoredSettings.proxy_scheme
|
||||
console.log("showing proxy scheme:", selectList.value)
|
||||
const hostitem = document.getElementById("host");
|
||||
hostitem.value = restoredSettings.proxy_host;
|
||||
console.log("showing proxy host:", hostitem.value);
|
||||
|
||||
const hostitem = document.getElementById("host")
|
||||
hostitem.value = restoredSettings.proxy_host
|
||||
console.log("showing proxy host:", hostitem.value)
|
||||
const portitem = document.getElementById("port");
|
||||
portitem.value = restoredSettings.proxy_port;
|
||||
console.log("showing proxy port:", portitem.value);
|
||||
|
||||
const portitem = document.getElementById("port")
|
||||
portitem.value = restoredSettings.proxy_port
|
||||
console.log("showing proxy port:", portitem.value)
|
||||
const controlhostitem = document.getElementById("controlhost");
|
||||
controlhostitem.value = restoredSettings.control_host;
|
||||
console.log("showing control host:", controlhostitem.value);
|
||||
|
||||
const controlhostitem = document.getElementById("controlhost")
|
||||
controlhostitem.value = restoredSettings.control_host
|
||||
console.log("showing control host:", controlhostitem.value)
|
||||
const controlportitem = document.getElementById("controlport");
|
||||
controlportitem.value = restoredSettings.control_port;
|
||||
console.log("showing control port:", controlportitem.value);
|
||||
|
||||
const controlportitem = document.getElementById("controlport")
|
||||
controlportitem.value = restoredSettings.control_port
|
||||
console.log("showing control port:", controlportitem.value)
|
||||
|
||||
SetHostText()
|
||||
SetPortText()
|
||||
SetControlHostText()
|
||||
SetControlPortText()
|
||||
SetControlHelpText()
|
||||
setupProxy()
|
||||
SetHostText();
|
||||
SetPortText();
|
||||
SetControlHostText();
|
||||
SetControlPortText();
|
||||
SetControlHelpText();
|
||||
setupProxy();
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
}
|
||||
chrome.storage.local.get(function(got) {
|
||||
checkStoredSettings(got)
|
||||
updateUI(got)
|
||||
checkStoredSettings(got);
|
||||
updateUI(got);
|
||||
});
|
||||
|
||||
const saveButton = document.querySelector("#save-button");
|
||||
saveButton.addEventListener("click", storeSettings);
|
||||
|
||||
//EXPERIMENTAL: Open in I2P Tab
|
||||
|
||||
|
13
platform.js
Normal file
@@ -0,0 +1,13 @@
|
||||
function isDroid() {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
console.log("Running in Android detected");
|
||||
return true;
|
||||
} else {
|
||||
console.log("Running in Desktop detected");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
376
privacy.js
@@ -1,10 +1,13 @@
|
||||
|
||||
function getChrome() {
|
||||
if (chrome.runtime.getBrowserInfo == undefined) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
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");
|
||||
|
||||
function onSet(result) {
|
||||
if (result) {
|
||||
@@ -14,49 +17,49 @@ function onSet(result) {
|
||||
}
|
||||
}
|
||||
|
||||
// This disables queries to centralized databases of bad URLs to screen for
|
||||
// risky sites in your browser
|
||||
/* This disables queries to centralized databases of bad URLs to screen for
|
||||
risky sites in your browser */
|
||||
function disableHyperlinkAuditing() {
|
||||
if (!getChrome()){
|
||||
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Disabling hyperlink auditing/val=", {
|
||||
value: false
|
||||
})
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Disabling hyperlink auditing/val=", {
|
||||
value: false
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This enables first-party isolation
|
||||
function enableFirstPartyIsolation() {
|
||||
if (!getChrome()) {
|
||||
var setting = browser.privacy.websites.firstPartyIsolate.set({
|
||||
value: true
|
||||
});
|
||||
console.log("Enabling first party isolation/val=", {
|
||||
value: true
|
||||
})
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.firstPartyIsolate.set({
|
||||
value: true
|
||||
});
|
||||
console.log("Enabling first party isolation/val=", {
|
||||
value: true
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This rejects tracking cookies and third-party cookies but it
|
||||
// LEAVES "Persistent" Cookies unmodified in favor of an option in the content
|
||||
// interface for now
|
||||
/* This rejects tracking cookies and third-party cookies but it
|
||||
LEAVES "Persistent" Cookies unmodified in favor of an option in the content
|
||||
interface for now */
|
||||
function disableEvilCookies() {
|
||||
if (!getChrome()) {
|
||||
var getting = browser.privacy.websites.cookieConfig.get({});
|
||||
getting.then((got) => {
|
||||
var setting = browser.privacy.websites.cookieConfig.set(
|
||||
{value: {behavior: "reject_third_party",
|
||||
nonPersistentCookies: got.value.nonPersistentCookies}}
|
||||
);
|
||||
console.log("Setting cookie behavior/val=", {value: {behavior: "reject_third_party",
|
||||
nonPersistentCookies: got.value.nonPersistentCookies}})
|
||||
setting.then(onSet);
|
||||
});
|
||||
}
|
||||
var getting = browser.privacy.websites.cookieConfig.get({});
|
||||
getting.then(got => {
|
||||
var setting = browser.privacy.websites.cookieConfig.set({
|
||||
value: {
|
||||
behavior: "reject_third_party",
|
||||
nonPersistentCookies: got.value.nonPersistentCookies
|
||||
}
|
||||
});
|
||||
console.log("Setting cookie behavior/val=", {
|
||||
value: {
|
||||
behavior: "reject_third_party",
|
||||
nonPersistentCookies: got.value.nonPersistentCookies
|
||||
}
|
||||
});
|
||||
setting.then(onSet);
|
||||
});
|
||||
}
|
||||
|
||||
// Make sure that they're gone
|
||||
@@ -72,110 +75,116 @@ function disableEvilCookies() {
|
||||
|
||||
// this disables the use of referrer headers
|
||||
function disableReferrers() {
|
||||
if (!getChrome()){
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Disabling referrer headers/val=", {
|
||||
value: false
|
||||
})
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Disabling referrer headers/val=", {
|
||||
value: false
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// enable fingerprinting resistent features(letterboxing and stuff)
|
||||
function enableResistFingerprinting() {
|
||||
if (!getChrome()){
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: true
|
||||
});
|
||||
console.log("Enabling resist fingerprinting/val=", {
|
||||
value: true
|
||||
})
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: true
|
||||
});
|
||||
console.log("Enabling resist fingerprinting/val=", {
|
||||
value: true
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This is essentially a blocklist of clearnet web-sites known to do bad tracking
|
||||
function enableTrackingProtection() {
|
||||
if (!getChrome()) {
|
||||
var setting = browser.privacy.websites.trackingProtectionMode.set({
|
||||
value: "always"
|
||||
});
|
||||
console.log("Enabling tracking protection/val=", {
|
||||
value: "always"
|
||||
})
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.trackingProtectionMode.set({
|
||||
value: "always"
|
||||
});
|
||||
console.log("Enabling tracking protection/val=", {
|
||||
value: "always"
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This disables protected content, which is a form of digital restrictions
|
||||
// management dependent on identifying information
|
||||
/* This disables protected content, which is a form of digital restrictions
|
||||
management dependent on identifying information */
|
||||
function disableDigitalRestrictionsManagement() {
|
||||
if (!getChrome()){
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "win") {
|
||||
var setting = browser.privacy.websites.protectedContentEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Setting Protected Content(Digital Restrictions Management) false/val=", {
|
||||
value: false
|
||||
})
|
||||
setting.then(onSet);
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "win") {
|
||||
var setting = browser.privacy.websites.protectedContentEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log(
|
||||
"Setting Protected Content(Digital Restrictions Management) false/val=",
|
||||
{
|
||||
value: false
|
||||
}
|
||||
});
|
||||
);
|
||||
setting.then(onSet);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function setAllPrivacy() {
|
||||
disableHyperlinkAuditing()
|
||||
enableFirstPartyIsolation()
|
||||
disableEvilCookies()
|
||||
disableReferrers()
|
||||
enableTrackingProtection()
|
||||
enableResistFingerprinting()
|
||||
disableDigitalRestrictionsManagement()
|
||||
disableHyperlinkAuditing();
|
||||
enableFirstPartyIsolation();
|
||||
disableEvilCookies();
|
||||
disableReferrers();
|
||||
enableTrackingProtection();
|
||||
enableResistFingerprinting();
|
||||
disableDigitalRestrictionsManagement();
|
||||
}
|
||||
|
||||
setAllPrivacy()
|
||||
setAllPrivacy();
|
||||
|
||||
function ResetPeerConnection(){
|
||||
if (!getChrome()) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({value: false});
|
||||
browser.privacy.network.networkPredictionEnabled.set({value: false});
|
||||
}
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
|
||||
console.log("Re-disabled WebRTC")
|
||||
function ResetPeerConnection() {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: false
|
||||
});
|
||||
browser.privacy.network.networkPredictionEnabled.set({
|
||||
value: false
|
||||
});
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "disable_non_proxied_udp"
|
||||
});
|
||||
console.log("Re-disabled WebRTC");
|
||||
}
|
||||
|
||||
function EnablePeerConnection(){
|
||||
if (!getChrome()) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({value: true});
|
||||
browser.privacy.network.networkPredictionEnabled.set({value: false});
|
||||
}
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
|
||||
console.log("Enabled WebRTC")
|
||||
function EnablePeerConnection() {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: true
|
||||
});
|
||||
browser.privacy.network.networkPredictionEnabled.set({
|
||||
value: false
|
||||
});
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "disable_non_proxied_udp"
|
||||
});
|
||||
console.log("Enabled WebRTC");
|
||||
}
|
||||
|
||||
ResetPeerConnection()
|
||||
ResetPeerConnection();
|
||||
|
||||
function ResetDisableSavePasswords(){
|
||||
browser.privacy.services.passwordSavingEnabled.set({value: false});
|
||||
console.log("Re-disabled saved passwords")
|
||||
function ResetDisableSavePasswords() {
|
||||
browser.privacy.services.passwordSavingEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Re-disabled saved passwords");
|
||||
}
|
||||
|
||||
function EnableSavePasswords(){
|
||||
browser.privacy.services.passwordSavingEnabled.set({value: true});
|
||||
console.log("Enabled saved passwords")
|
||||
function EnableSavePasswords() {
|
||||
browser.privacy.services.passwordSavingEnabled.set({
|
||||
value: true
|
||||
});
|
||||
console.log("Enabled saved passwords");
|
||||
}
|
||||
|
||||
//ResetDisableSavePasswords()
|
||||
|
||||
|
||||
var defaultSettings = {
|
||||
since: "forever",
|
||||
dataTypes: ["history", "downloads", "cache", "cookies", "passwords", "pluginData", "formData", "serviceWorkers"]
|
||||
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"]
|
||||
};
|
||||
|
||||
var appSettings = {
|
||||
@@ -191,23 +200,22 @@ function checkStoredSettings(storedSettings) {
|
||||
chrome.storage.local.set(appSettings);
|
||||
}
|
||||
|
||||
if (!getChrome()){
|
||||
const gettingStoredSettings = browser.storage.local.get();
|
||||
gettingStoredSettings.then(checkStoredSettings, onError);
|
||||
}
|
||||
const gettingStoredSettings = browser.storage.local.get();
|
||||
gettingStoredSettings.then(checkStoredSettings, onError);
|
||||
|
||||
function clearCookiesContext(cookieStoreId) {}
|
||||
|
||||
function forgetBrowsingData(storedSettings) {
|
||||
|
||||
function getSince(selectedSince) {
|
||||
if (selectedSince === "forever") {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const times = {
|
||||
hour: () => { return 1000 * 60 * 60 },
|
||||
day: () => { return 1000 * 60 * 60 * 24 },
|
||||
week: () => { return 1000 * 60 * 60 * 24 * 7}
|
||||
}
|
||||
hour: () => 1000 * 60 * 60,
|
||||
day: () => 1000 * 60 * 60 * 24,
|
||||
week: () => 1000 * 60 * 60 * 24 * 7
|
||||
};
|
||||
|
||||
const sinceMilliseconds = times[selectedSince].call();
|
||||
return Date.now() - sinceMilliseconds;
|
||||
@@ -228,15 +236,125 @@ function forgetBrowsingData(storedSettings) {
|
||||
let dataTypesString = Object.keys(dataTypes).join(", ");
|
||||
let sinceString = new Date(since).toLocaleString();
|
||||
browser.notifications.create({
|
||||
"type": "basic",
|
||||
"title": "Removed browsing data",
|
||||
"message": `Removed ${dataTypesString}\nsince ${sinceString}`
|
||||
type: "basic",
|
||||
title: "Removed browsing data",
|
||||
message: `Removed ${dataTypesString}\n for I2P Browsing`
|
||||
});
|
||||
}
|
||||
|
||||
browser.browsingData.remove({since}, dataTypes).then(notify);
|
||||
function deepCleanHistory(historyItems) {
|
||||
console.log("Deep cleaning history");
|
||||
for (item of historyItems) {
|
||||
if (i2pHost(item.url)) {
|
||||
browser.history.deleteUrl({
|
||||
url: item.url
|
||||
});
|
||||
browser.browsingData.removeCache({});
|
||||
console.log("cleared Cache");
|
||||
browser.browsingData
|
||||
.removePasswords({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
})
|
||||
.then(onGot);
|
||||
console.log("cleared Passwords");
|
||||
browser.browsingData
|
||||
.removeDownloads({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
})
|
||||
.then(onGot);
|
||||
console.log("cleared Downloads");
|
||||
browser.browsingData
|
||||
.removeFormData({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
})
|
||||
.then(onGot);
|
||||
console.log("cleared Form Data");
|
||||
browser.browsingData
|
||||
.removeLocalStorage({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
})
|
||||
.then(onGot);
|
||||
console.log("cleared Local Storage");
|
||||
|
||||
setAllPrivacy()
|
||||
ResetPeerConnection()
|
||||
contexts = browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
});
|
||||
|
||||
function deepCleanCookies(cookies) {
|
||||
for (cookie of cookies) {
|
||||
var removing = browser.cookies.remove({
|
||||
firstPartyDomain: cookie.firstPartyDomain,
|
||||
name: cookie.name,
|
||||
url: item.url
|
||||
});
|
||||
removing.then(onGot, onError);
|
||||
}
|
||||
console.log("Cleared cookies");
|
||||
}
|
||||
|
||||
function deepCleanContext(cookieStoreIds) {
|
||||
for (cookieStoreId of cookieStoreIds) {
|
||||
var removing = browser.cookies.getAll({
|
||||
firstPartyDomain: null,
|
||||
storeId: cookieStoreId.cookieStoreId
|
||||
});
|
||||
removing.then(deepCleanCookies, onError);
|
||||
}
|
||||
}
|
||||
|
||||
contexts.then(deepCleanContext, onError);
|
||||
}
|
||||
}
|
||||
notify();
|
||||
}
|
||||
|
||||
var searching = browser.history.search({
|
||||
text: "i2p",
|
||||
startTime: 0
|
||||
});
|
||||
|
||||
searching.then(deepCleanHistory);
|
||||
|
||||
setAllPrivacy();
|
||||
ResetPeerConnection();
|
||||
}
|
||||
|
||||
function i2pHostName(url) {
|
||||
let hostname = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
}
|
||||
return hostname;
|
||||
}
|
||||
|
||||
function i2pHost(url) {
|
||||
let hostname = i2pHostName(url);
|
||||
return hostname.endsWith(".i2p");
|
||||
}
|
||||
|
||||
function onGot(contexts) {
|
||||
if (contexts != null) {
|
||||
for (let context of contexts) {
|
||||
console.log(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
browser.runtime.onMessage.addListener(message);
|
||||
|
||||
function message(message) {
|
||||
console.log(message);
|
||||
if (message.rtc === "enableWebRTC") {
|
||||
console.log("enableWebRTC");
|
||||
EnablePeerConnection();
|
||||
} else {
|
||||
console.log("disableWebRTC");
|
||||
ResetPeerConnection();
|
||||
}
|
||||
}
|
||||
|
418
proxy.js
@@ -1,32 +1,18 @@
|
||||
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");
|
||||
|
||||
function getChrome() {
|
||||
if (browser.runtime.getBrowserInfo == undefined) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
function isDroid() {
|
||||
if (!getChrome()) {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "android") {
|
||||
console.log("android detected")
|
||||
return true
|
||||
} else {
|
||||
console.log("desktop detected")
|
||||
return false
|
||||
}
|
||||
});
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
if (!getChrome()) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: false
|
||||
});
|
||||
}
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Preliminarily disabled WebRTC.");
|
||||
|
||||
chrome.privacy.network.networkPredictionEnabled.set({
|
||||
value: false
|
||||
@@ -35,169 +21,337 @@ chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "disable_non_proxied_udp"
|
||||
});
|
||||
|
||||
console.log("Preliminarily disabled WebRTC.")
|
||||
|
||||
function shouldProxyRequest(requestInfo) {
|
||||
return requestInfo.parentFrameId != -1;
|
||||
}
|
||||
|
||||
function handleProxyRequest(requestInfo) {
|
||||
console.log(`Proxying: ${requestInfo.url}`);
|
||||
console.log(" ", getScheme(), getHost(), ":", getPort(),)
|
||||
return {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
}
|
||||
var handleContextProxyRequest = async function(requestDetails) {
|
||||
console.log("(proxy)Searching for proxy by context");
|
||||
try {
|
||||
var handleProxyRequest = function(context) {
|
||||
proxy = {
|
||||
failoverTimeout: 0,
|
||||
proxyDns: false
|
||||
};
|
||||
if (context != undefined) {
|
||||
if (context.name == titlepref) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
return proxy;
|
||||
} else if (context.name == routerpref) {
|
||||
if (routerHost(requestDetails.url)) {
|
||||
return proxy;
|
||||
} else if (!routerHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};
|
||||
}
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
return proxy;
|
||||
} else if (context.name == webpref) {
|
||||
if (localHost(requestDetails.url)) {
|
||||
if (!routerHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};
|
||||
}
|
||||
}
|
||||
console.log(
|
||||
"(proxy)",
|
||||
context.name,
|
||||
"Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
return proxy;
|
||||
}
|
||||
}
|
||||
if (!routerHost(requestDetails.url)) {
|
||||
if (localHost(requestDetails.url)) {
|
||||
console.log(
|
||||
"(proxy) non-routerconsole localhost url, dropping",
|
||||
requestDetails.url
|
||||
);
|
||||
proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};
|
||||
}
|
||||
} else if (i2pHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
}
|
||||
return proxy;
|
||||
};
|
||||
var contextGet = async function(tabInfo) {
|
||||
try {
|
||||
console.log("(proxy)Tab info from Function", tabInfo);
|
||||
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
|
||||
return context;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Context Error", error);
|
||||
}
|
||||
};
|
||||
var tabFind = async function(tabId) {
|
||||
try {
|
||||
console.log("(proxy) forcing context", tabId.cookieStoreId);
|
||||
return tabId;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Context Error", error);
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(proxy)Tab ID from Request", tabId);
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Tab error", error);
|
||||
}
|
||||
};
|
||||
|
||||
var proxy_scheme = "HTTP"
|
||||
if (requestDetails.tabId > 0) {
|
||||
console.log("manifest", requestDetails);
|
||||
if (proxyHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
return proxy;
|
||||
} else if (i2pHost(requestDetails.url)) {
|
||||
console.log("(Proxy)I2P URL detected, ");
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(tabFind);
|
||||
requestDetails.tabId = mtab;
|
||||
var context = mtab.then(contextGet);
|
||||
var proxy = await context.then(handleProxyRequest);
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
return proxy;
|
||||
} else {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var context = tab.then(contextGet);
|
||||
var proxy = await context.then(handleProxyRequest);
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
return proxy;
|
||||
}
|
||||
proxy = {};
|
||||
console.log("(proxy)Returning unset Proxy", proxy);
|
||||
return proxy;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(proxy)Not using I2P Proxy.", error);
|
||||
}
|
||||
};
|
||||
|
||||
var proxy_scheme = "HTTP";
|
||||
|
||||
function getScheme() {
|
||||
if (proxy_scheme == undefined) {
|
||||
proxy_scheme = "http"
|
||||
proxy_scheme = "http";
|
||||
}
|
||||
if (proxy_scheme == "HTTP") {
|
||||
proxy_scheme = "http"
|
||||
proxy_scheme = "http";
|
||||
}
|
||||
if (proxy_scheme == "SOCKS") {
|
||||
proxy_scheme = "socks"
|
||||
proxy_scheme = "socks";
|
||||
}
|
||||
if (proxy_scheme != "http" && proxy_scheme != "socks") {
|
||||
proxy_scheme = "http"
|
||||
proxy_scheme = "http";
|
||||
}
|
||||
console.log("Got i2p proxy scheme:", proxy_scheme);
|
||||
//console.log("Got i2p proxy scheme:", proxy_scheme);
|
||||
return proxy_scheme;
|
||||
}
|
||||
|
||||
var proxy_host = "127.0.0.1"
|
||||
/*
|
||||
var proxy_host = "127.0.0.1";
|
||||
var proxy_port = "4444";
|
||||
var control_host = "127.0.0.1";
|
||||
var control_port = "4444";
|
||||
*/
|
||||
|
||||
function getHost() {
|
||||
if (proxy_host == undefined) {
|
||||
proxy_host = "127.0.0.1"
|
||||
proxy_host = "127.0.0.1";
|
||||
}
|
||||
console.log("Got i2p proxy host:", proxy_host);
|
||||
return proxy_host;
|
||||
}
|
||||
|
||||
var proxy_port = "4444"
|
||||
|
||||
function getPort() {
|
||||
if (proxy_port == undefined) {
|
||||
var scheme = getScheme()
|
||||
var scheme = getScheme();
|
||||
if (scheme == "socks") {
|
||||
proxy_port = "4446"
|
||||
proxy_port = "4446";
|
||||
} else {
|
||||
proxy_port = "4444"
|
||||
proxy_port = "4444";
|
||||
}
|
||||
}
|
||||
console.log("Got i2p proxy port:", proxy_port);
|
||||
return proxy_port;
|
||||
}
|
||||
|
||||
var control_host = "127.0.0.1"
|
||||
|
||||
function getControlHost() {
|
||||
if (control_host == undefined) {
|
||||
return "127.0.0.1"
|
||||
return "127.0.0.1";
|
||||
}
|
||||
console.log("Got i2p control host:", control_host);
|
||||
return control_host;
|
||||
}
|
||||
|
||||
var control_port = "4444"
|
||||
|
||||
function getControlPort() {
|
||||
if (control_port == undefined) {
|
||||
return "4444"
|
||||
return "4444";
|
||||
}
|
||||
console.log("Got i2p control port:", control_port);
|
||||
return control_port;
|
||||
}
|
||||
|
||||
function setupProxy() {
|
||||
var controlHost = getControlHost()
|
||||
var controlHost = getControlHost();
|
||||
var controlPort = getControlPort();
|
||||
var Host = getHost()
|
||||
var Port = getPort()
|
||||
var Scheme = getScheme()
|
||||
if (!getChrome()) {
|
||||
function handleProxyRequest(requestInfo) {
|
||||
console.log("proxying request via listener")
|
||||
console.log(" ", Scheme, Host, ":", Port,)
|
||||
return {
|
||||
type: Scheme,
|
||||
host: Host,
|
||||
port: Port,
|
||||
proxyDns: true
|
||||
}
|
||||
}
|
||||
console.log("Setting up Firefox WebExtension proxy")
|
||||
browser.proxy.onRequest.addListener(handleProxyRequest, {
|
||||
urls: ["<all_urls>"]
|
||||
});
|
||||
console.log("i2p settings created for WebExtension Proxy")
|
||||
} else {
|
||||
var config = {
|
||||
mode: "fixed_servers",
|
||||
rules: {
|
||||
singleProxy: {
|
||||
scheme: Scheme,
|
||||
host: Host,
|
||||
port: parseInt(Port),
|
||||
},
|
||||
}
|
||||
};
|
||||
chrome.proxy.settings.set(
|
||||
{
|
||||
value: config,
|
||||
scope: 'regular'
|
||||
}, function() {});
|
||||
}
|
||||
var Host = getHost();
|
||||
var Port = getPort();
|
||||
var Scheme = getScheme();
|
||||
|
||||
/**/
|
||||
console.log("Setting up Firefox WebExtension proxy");
|
||||
browser.proxy.onRequest.addListener(handleContextProxyRequest, {
|
||||
urls: ["<all_urls>"]
|
||||
});
|
||||
console.log("i2p settings created for WebExtension Proxy");
|
||||
/**/
|
||||
}
|
||||
|
||||
function checkStoredSettings(storedSettings) {
|
||||
let defaultSettings = {};
|
||||
if (!storedSettings.proxy_scheme) {
|
||||
defaultSettings["proxy_scheme"] = "http"
|
||||
function gotProxyInfo(info) {
|
||||
let defaultSettings = {};
|
||||
let host = info.value.http.split(":")[0];
|
||||
let port = info.value.http.split(":")[1];
|
||||
console.log("proxy", "'" + host + "'", ":", port);
|
||||
if (!storedSettings.proxy_scheme) {
|
||||
defaultSettings["proxy_scheme"] = "http";
|
||||
}
|
||||
if (!storedSettings.proxy_host) {
|
||||
if (host == "") {
|
||||
defaultSettings["proxy_host"] = "127.0.0.1";
|
||||
} else {
|
||||
defaultSettings["proxy_host"] = host;
|
||||
}
|
||||
} else {
|
||||
if (host != "") {
|
||||
defaultSettings["proxy_host"] = host;
|
||||
} else {
|
||||
defaultSettings["proxy_host"] = storedSettings.proxy_host;
|
||||
}
|
||||
}
|
||||
if (!storedSettings.proxy_port) {
|
||||
if (port == undefined) {
|
||||
defaultSettings["proxy_port"] = 4444;
|
||||
} else {
|
||||
defaultSettings["proxy_port"] = port;
|
||||
}
|
||||
} else {
|
||||
if (port != undefined) {
|
||||
defaultSettings["proxy_port"] = port;
|
||||
} else {
|
||||
defaultSettings["proxy_port"] = storedSettings.proxy_port;
|
||||
}
|
||||
}
|
||||
if (!storedSettings.control_host) {
|
||||
if (host == "") {
|
||||
defaultSettings["control_host"] = "127.0.0.1";
|
||||
} else {
|
||||
defaultSettings["control_host"] = host;
|
||||
}
|
||||
} else {
|
||||
if (host != "") {
|
||||
defaultSettings["control_host"] = host;
|
||||
} else {
|
||||
defaultSettings["control_host"] = storedSettings.control_host;
|
||||
}
|
||||
}
|
||||
if (!storedSettings.control_port) {
|
||||
if (port == undefined) {
|
||||
defaultSettings["control_port"] = 4444;
|
||||
} else {
|
||||
defaultSettings["control_port"] = port;
|
||||
}
|
||||
} else {
|
||||
if (port != undefined) {
|
||||
defaultSettings["control_port"] = port;
|
||||
} else {
|
||||
defaultSettings["control_port"] = storedSettings.control_port;
|
||||
}
|
||||
}
|
||||
console.log("(browserinfo) NATIVE PROXYSETTINGS", info.value);
|
||||
console.log(
|
||||
defaultSettings["proxy_host"],
|
||||
defaultSettings["proxy_port"],
|
||||
defaultSettings["control_host"],
|
||||
defaultSettings["control_port"]
|
||||
);
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
}
|
||||
if (!storedSettings.proxy_host) {
|
||||
defaultSettings["proxy_host"] = "127.0.0.1"
|
||||
}
|
||||
if (!storedSettings.proxy_port) {
|
||||
defaultSettings["proxy_port"] = 4444
|
||||
}
|
||||
if (!storedSettings.control_host) {
|
||||
defaultSettings["control_host"] = "127.0.0.1"
|
||||
}
|
||||
if (!storedSettings.control_port) {
|
||||
defaultSettings["control_port"] = 4444
|
||||
}
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
gettingInfo.then(gotProxyInfo);
|
||||
}
|
||||
|
||||
//function gotProxyInfo(info) {
|
||||
//console.log("(browserinfo)", info.value);
|
||||
//}
|
||||
|
||||
//var gettingInfo = browser.proxy.settings.get({});
|
||||
//gettingInfo.then(gotProxyInfo);
|
||||
|
||||
function update(restoredSettings) {
|
||||
proxy_scheme = restoredSettings.proxy_scheme
|
||||
console.log("restoring proxy scheme:", proxy_scheme)
|
||||
proxy_host = restoredSettings.proxy_host
|
||||
console.log("restoring proxy host:", proxy_host)
|
||||
proxy_port = restoredSettings.proxy_port
|
||||
console.log("restoring proxy port:", proxy_port)
|
||||
control_host = restoredSettings.control_host
|
||||
console.log("restoring control host:", control_host)
|
||||
control_port = restoredSettings.control_port
|
||||
console.log("restoring control port:", control_port)
|
||||
proxy_scheme = restoredSettings.proxy_scheme;
|
||||
console.log("restoring proxy scheme:", proxy_scheme);
|
||||
proxy_host = restoredSettings.proxy_host;
|
||||
console.log("restoring proxy host:", proxy_host);
|
||||
proxy_port = restoredSettings.proxy_port;
|
||||
console.log("restoring proxy port:", proxy_port);
|
||||
control_host = restoredSettings.control_host;
|
||||
console.log("restoring control host:", control_host);
|
||||
control_port = restoredSettings.control_port;
|
||||
console.log("restoring control port:", control_port);
|
||||
}
|
||||
|
||||
chrome.storage.local.get(function(got) {
|
||||
checkStoredSettings(got)
|
||||
update(got)
|
||||
setupProxy()
|
||||
checkStoredSettings(got);
|
||||
update(got);
|
||||
setupProxy();
|
||||
});
|
||||
|
||||
// Theme all currently open windows
|
||||
if (!getChrome()) {
|
||||
if (!isDroid()) {
|
||||
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
|
||||
}
|
||||
if (!isDroid()) {
|
||||
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
|
||||
}
|
||||
|
BIN
routerconsole.png
Normal file
After Width: | Height: | Size: 242 KiB |
440
scrub.js
Normal file
@@ -0,0 +1,440 @@
|
||||
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 contextScrub = async function(requestDetails) {
|
||||
console.log("(scrub)Scrubbing info from contextualized request");
|
||||
try {
|
||||
var headerScrub = function(context) {
|
||||
if (!context) {
|
||||
console.error("Context not found");
|
||||
} else if (context.name == titlepref) {
|
||||
var ua = "MYOB/6.66 (AN/ON)";
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
for (var header of requestDetails.requestHeaders) {
|
||||
if (header.name.toLowerCase() === "user-agent") {
|
||||
header.value = ua;
|
||||
console.log("(scrub)User-Agent header modified", header.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
requestHeaders: requestDetails.requestHeaders
|
||||
};
|
||||
} 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") {
|
||||
header.value = ua;
|
||||
console.log("(scrub)User-Agent header modified", header.value);
|
||||
}
|
||||
}
|
||||
} else if (routerHost(requestDetails.url)) {
|
||||
}
|
||||
return {
|
||||
requestHeaders: requestDetails.requestHeaders
|
||||
};
|
||||
}
|
||||
};
|
||||
var contextGet = async function(tabInfo) {
|
||||
try {
|
||||
console.log("(scrub)Tab info from Function", tabInfo);
|
||||
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
|
||||
return context;
|
||||
} catch (error) {
|
||||
console.log("(scrub)Conext Error", error);
|
||||
}
|
||||
};
|
||||
var tabFind = async function(tabId) {
|
||||
try {
|
||||
context = await browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
});
|
||||
tabId.cookieStoreId = context[0].cookieStoreId;
|
||||
console.log("(scrub) forcing context", tabId.cookieStoreId);
|
||||
return tabId;
|
||||
} catch (error) {
|
||||
console.log("(scrub)Context Error", error);
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(scrub)Tab ID from Request", tabId);
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
console.log("(scrub)Tab error", error);
|
||||
}
|
||||
};
|
||||
if (requestDetails.tabId > 0) {
|
||||
var tab = {};
|
||||
var context = {};
|
||||
var req = {};
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
console.log("(Proxy)I2P URL detected, ");
|
||||
tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(tabFind);
|
||||
requestDetails.tabId = mtab;
|
||||
context = mtab.then(contextGet);
|
||||
req = await context.then(headerScrub);
|
||||
console.log("(scrub)Scrubbing I2P Request", req);
|
||||
return req;
|
||||
} else if (routerHost(requestDetails.url)) {
|
||||
tab = tabGet(requestDetails.tabId);
|
||||
context = tab.then(contextGet);
|
||||
req = await context.then(headerScrub);
|
||||
console.log("(scrub)Scrubbing non-I2P Request", req);
|
||||
return req;
|
||||
}
|
||||
return req;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(scrub)Not scrubbing non-I2P request.", error);
|
||||
}
|
||||
};
|
||||
|
||||
var contextSetup = async function(requestDetails) {
|
||||
console.log("(isolate)Forcing I2P requests into context");
|
||||
try {
|
||||
var tabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing I2P Browsing",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab", window);
|
||||
browser.tabs.remove(tabId.id);
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
}
|
||||
var getting = browser.windows.getCurrent();
|
||||
getting.then(Create);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
}
|
||||
};
|
||||
var routerTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: routerpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing Router Console",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
}
|
||||
var getting = browser.windows.getCurrent();
|
||||
getting.then(Create);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
}
|
||||
};
|
||||
var i2ptunnelTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: tunnelpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing HSM context",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
if (window != undefined) {
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
}
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
}
|
||||
var getting = browser.windows.getCurrent();
|
||||
getting.then(Create);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
}
|
||||
};
|
||||
var snarkTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: torrentpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing Bittorrent",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
}
|
||||
var getting = browser.windows.getCurrent();
|
||||
getting.then(Create);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
}
|
||||
};
|
||||
var mailTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: mailpref
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing Web Mail",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
}
|
||||
var getting = browser.windows.getCurrent();
|
||||
getting.then(Create);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
}
|
||||
};
|
||||
var anyTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: webpref
|
||||
});
|
||||
console.log("(ISOLATE)", tabId.cookieStoreId);
|
||||
if (
|
||||
tabId.cookieStoreId == "firefox-default" ||
|
||||
tabId.cookieStoreId == "firefox-private"
|
||||
) {
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing Web Browsing",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
}
|
||||
var getting = browser.windows.getCurrent();
|
||||
getting.then(Create);
|
||||
return tabId;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(isolate)Tab ID from Request", tabId);
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
console.log("(isolate)Tab error", error);
|
||||
}
|
||||
};
|
||||
if (requestDetails.tabId > 0) {
|
||||
if (proxyHost(requestDetails.url)) {
|
||||
setcookie = browser.cookies.set({
|
||||
firstPartyDomain: i2pHostName(requestDetails.url),
|
||||
url: requestDetails.url,
|
||||
secure: true
|
||||
});
|
||||
setcookie.then(onGot, onError);
|
||||
return requestDetails;
|
||||
}
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
var setcookie = browser.cookies.set({
|
||||
firstPartyDomain: i2pHostName(requestDetails.url),
|
||||
url: requestDetails.url,
|
||||
secure: true
|
||||
});
|
||||
setcookie.then(onGot, onError);
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(tabFind);
|
||||
return requestDetails;
|
||||
}
|
||||
let routerhost = routerHost(requestDetails.url);
|
||||
if (routerhost) {
|
||||
if (routerhost === "i2ptunnelmgr") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(i2ptunnelTabFind);
|
||||
return requestDetails;
|
||||
} else if (routerhost === "i2psnark") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(snarkTabFind);
|
||||
return requestDetails;
|
||||
} else if (routerhost === "webmail") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(mailTabFind);
|
||||
return requestDetails;
|
||||
} else if (routerhost === "routerconsole") {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(routerTabFind);
|
||||
return requestDetails;
|
||||
}
|
||||
} else {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(anyTabFind);
|
||||
return requestDetails;
|
||||
}
|
||||
}
|
||||
//var tab = tabGet(requestDetails.tabId);
|
||||
//var mtab = tab.then(anyTabFind);
|
||||
return requestDetails;
|
||||
} catch (error) {
|
||||
console.log("(isolate)Not an I2P request, blackholing", error);
|
||||
}
|
||||
};
|
||||
|
||||
browser.webRequest.onBeforeRequest.addListener(
|
||||
contextSetup,
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking"]
|
||||
);
|
||||
|
||||
browser.webRequest.onBeforeSendHeaders.addListener(
|
||||
contextScrub,
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking", "requestHeaders"]
|
||||
);
|
||||
|
||||
/*
|
||||
function notify(message) {
|
||||
var response = await fetch('https://proxy.i2p', {
|
||||
credentials: 'include'
|
||||
});
|
||||
const myJson = await response.json();
|
||||
console.log(JSON.stringify(myJson));
|
||||
|
||||
console.log(message);
|
||||
const Http = new XMLHttpRequest();
|
||||
Http.mozAnon = true;
|
||||
Http.withCredentials = true;
|
||||
const url = "http://proxy.i2p";
|
||||
Http.open("GET", url);
|
||||
Http.send();
|
||||
Http.onreadystatechange = e => {
|
||||
console.log(Http.responseText);
|
||||
browser.runtime.sendMessage(Http.responseText);
|
||||
};
|
||||
}
|
||||
*/
|
BIN
susimail.png
Normal file
After Width: | Height: | Size: 162 KiB |
94
window.html
@@ -3,41 +3,81 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="home.css"/>
|
||||
<link rel="stylesheet" href="info.css"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="panel">
|
||||
<div class="panel-section panel-section-header">
|
||||
<div id="text-section-header" class="text-section-header">I2P Assistance</div>
|
||||
<div class="section-header panel-section panel-section-header">
|
||||
<div id="text-section-header" class="text-section-header"><h1>The Invisible Internet Browser</h1></div>
|
||||
</div>
|
||||
<div class="panel-section-separator"></div>
|
||||
<div id="i2pbrowser-version"></div>
|
||||
<div id="i2pbrowser-description">
|
||||
<p id="description">You are now able to use I2P in this browser.</p>
|
||||
<p class="beta">It is experimental.</p>
|
||||
</div>
|
||||
<div id="readyness">
|
||||
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
|
||||
<span id="proxy-check">Proxy is ready.</span>
|
||||
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
|
||||
<span id="proxy-check">Proxy is ready.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-section-separator"></div>
|
||||
<div class="browser-info">
|
||||
<p class="hideIfI2PConsoleOff">
|
||||
<h3>Controls</h3>
|
||||
<p id="applicationExplain">These controls are used to tailor your I2P Browsing Experience</p>
|
||||
<ul>
|
||||
<a id="clear-browser-data" href="#">
|
||||
<li class="application">
|
||||
Clear Browsing Data: <span class="applicationDesc">Use this to erase your browsing data.</span>
|
||||
</li>
|
||||
</a>
|
||||
<li class="application">
|
||||
<input type="checkbox" id="enable-web-rtc" name="enablewebrtc" value="webrtc">
|
||||
<label for="enable-web-rtc">Enable WebRTC <strong>with Proxy?</strong></label>
|
||||
<span class="applicationDesc">For more information about this extension, go here:</span>
|
||||
</li>
|
||||
<li class="application">
|
||||
<div class="panel-section-separator"></div>
|
||||
<div class="panel-section-identity">
|
||||
<div id="identity-list"></div>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
</p>
|
||||
</div>
|
||||
<div class="panel-section-separator"></div>
|
||||
<div class="application-info">
|
||||
<p class="hideIfI2PConsoleOff">
|
||||
<h3>Applications</h3>
|
||||
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
|
||||
<ul>
|
||||
<li class="application"><button id="window-visit-homepage" class="applicationName window-visit-homepage" href="#">
|
||||
Home Page <span class="applicationDesc">For more information about this extension, go here:</span>
|
||||
</button></li>
|
||||
<li class="application"><button id="window-visit-i2ptunnel" class="applicationName">
|
||||
Hidden Services Manager <span class="applicationDesc">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span>
|
||||
</button></li>
|
||||
<li class="application"><button id="window-visit-susimail" class="applicationName">
|
||||
E-Mail <span class="applicationDesc">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span>
|
||||
</button></li>
|
||||
<li class="application"><button id="window-visit-snark" class="applicationName">
|
||||
BitTorrent <span class="applicationDesc">I2P is capable of anonymous Peer-to-Peer file sharing, to use the built-in bittorrent client go here:</span>
|
||||
</button></li>
|
||||
</ul>
|
||||
</p>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="text-section-helptext">
|
||||
You are now free to browse the eepWeb!
|
||||
|
||||
Your browser is now configured to browse anonymously on the I2P network.
|
||||
As you browse, your traffic will be routed through other network nodes
|
||||
to disguise it's origin, both from the server and from the nodes
|
||||
themselves.
|
||||
|
||||
</div>
|
||||
|
||||
<div class="panel-section-separator"></div>
|
||||
<!-- This is where I'll eventually put the tunnel control panel -->
|
||||
<!-- <a href="#" id="generate-fresh-tunnel> Generate a Fresh Tunnel</a>"-->
|
||||
<!-- -->
|
||||
<strong><a href="#" id="clear-browser-data">Clear all browsing data</a></strong><br>
|
||||
<!--<strong><a href="#" id="temp-enable-webrtc">Temporarily enable WebRTC</a></strong><br>-->
|
||||
<div class="panel-section-separator"></div>
|
||||
<a href="http://i2pforum.i2p" id="window-create-forum-panel">Visit the I2P Forums</a><br>
|
||||
<a href="http://i2p-projekt.i2p/blog" id="window-create-news-panel">Get the latest I2P News</a><br>
|
||||
<div class="panel-section-separator"></div>
|
||||
|
||||
</div>
|
||||
|
||||
<script src="context.js"></script>
|
||||
<script src="privacy.js"></script>
|
||||
<script src="info.js"></script>
|
||||
<script src="content.js"></script>
|
||||
<script src="content.js" crossorigin="anonymous"></script>
|
||||
<script src="i2pcontrol/i2pcontrol.js"></script>
|
||||
|
||||
</body>
|
||||
|
||||
|