96 Commits
0.43 ... 0.51

Author SHA1 Message Date
idk
ea92d4a5b8 Merge pull request #36 from eyedeekay/rhizome
Rhizome
2019-11-29 00:07:31 +00:00
idk
51cc8c96e1 rhizome variant 2019-11-28 18:45:34 -05:00
idk
12fff599f0 rhizome variant 2019-11-28 18:44:05 -05:00
idk
30231ab974 rhizome variant 2019-11-28 18:43:32 -05:00
idk
1362ca32d9 cleanup manifest 2019-11-28 17:55:19 -05:00
idk
0c64c301c9 cleanup manifest 2019-11-28 17:54:20 -05:00
idk
38147d45e1 cleanup manifest 2019-11-28 17:54:02 -05:00
idk
093db8443c cleanup manifest 2019-11-28 17:52:35 -05:00
idk
56a220136b OK this one might work 2019-11-27 00:58:53 -05:00
idk
e903349e4c OK this one might work 2019-11-27 00:45:25 -05:00
idk
175683a8ed OK this one might work 2019-11-27 00:38:21 -05:00
idk
d7449a5e8a OK this one might work 2019-11-27 00:34:48 -05:00
idk
3bcbfc1e58 OK this one might work 2019-11-27 00:31:10 -05:00
idk
13210031e6 another hack to deal with slightly different tag behavior 2019-11-27 00:03:44 -05:00
idk
5a2acc1c1c another hack to deal with slightly different tag behavior 2019-11-26 23:26:33 -05:00
idk
4aed7e0db4 another hack to deal with slightly different tag behavior 2019-11-26 23:22:24 -05:00
idk
f4d2334900 another hack to deal with slightly different tag behavior 2019-11-26 23:15:57 -05:00
idk
7902aded0a another hack to deal with slightly different tag behavior 2019-11-26 23:06:24 -05:00
idk
256a990ebc another hack to deal with slightly different tag behavior 2019-11-26 22:45:49 -05:00
idk
ff883a2a9a Merge pull request #35 from eyedeekay/droid-compat
Bugfixes, Code Cleanup, Android Fixes
2019-11-26 15:00:07 +00:00
idk
d1943b4262 In android extension menus have tab ids, try this way of identifying them 2019-11-26 01:07:48 -05:00
idk
c96ec6c3b7 force disconnect of webrtc sessions when webrtc with proxy enabled 2019-11-25 20:42:46 -05:00
idk
6467ea6f63 enable-disable history, don't try to kill undefined tabs 2019-11-25 20:20:53 -05:00
idk
352d71af26 enable-disable history, don't try to kill undefined tabs 2019-11-25 20:20:27 -05:00
idk
ab7774ea29 enable-disable history, don't try to kill undefined tabs 2019-11-25 20:19:44 -05:00
idk
4e00c72d5f remove tabfind. Never create a window, ever. 2019-11-24 23:44:33 -05:00
idk
acd7adc9c1 remove tabfind. Never create a window, ever. 2019-11-24 23:29:06 -05:00
idk
94f0124f0f no but closer 2019-11-24 23:16:48 -05:00
idk
89523390de no but closer 2019-11-24 23:14:01 -05:00
idk
77f57d7f1e no but closer 2019-11-24 23:04:49 -05:00
idk
a33afc52d3 no but closer 2019-11-24 22:59:50 -05:00
idk
b06facacb0 no but closer 2019-11-24 22:50:43 -05:00
idk
bd4c9c0658 no but closer 2019-11-24 22:43:50 -05:00
idk
b23b90baa1 no but closer 2019-11-24 22:32:12 -05:00
idk
5b6224f9ce no but closer 2019-11-24 22:23:13 -05:00
idk
232ada5ed3 no but closer 2019-11-24 22:18:27 -05:00
idk
2fab8e042f pretty sure that'll fix it 2019-11-24 20:57:41 -05:00
idk
749ff30b5b Bring some sanity to the settings section 2019-11-24 20:43:17 -05:00
idk
f0b4a0a849 try and figure out why it works on Desktop but not Android still 2019-11-24 19:49:47 -05:00
idk
870eaa6e3e try and figure out why it works on Desktop but not Android still 2019-11-24 19:47:33 -05:00
idk
c7af1a0d72 try and figure out why it works on Desktop but not Android still 2019-11-24 18:15:38 -05:00
idk
4c10cd2855 try and figure out why it works on Desktop but not Android still 2019-11-24 18:13:34 -05:00
idk
6f45363692 reuse less function names 2019-11-24 18:04:58 -05:00
idk
8d14c945f3 reuse less function names 2019-11-24 17:43:43 -05:00
idk
070955225d reuse less function names 2019-11-24 17:28:58 -05:00
idk
9987325f1a reuse less function names 2019-11-24 17:24:34 -05:00
idk
2bbeed8385 reuse less function names 2019-11-24 17:14:43 -05:00
idk
875fe8b86d fix android maybe 2019-11-24 05:50:06 -05:00
idk
b2184119f7 fix android maybe 2019-11-24 05:41:45 -05:00
idk
cb5fa75616 fix android maybe 2019-11-24 05:29:19 -05:00
idk
5c7a80997f fix android maybe 2019-11-24 05:21:56 -05:00
idk
32035348c1 Try some android stuff 2019-11-24 04:55:39 -05:00
idk
049b79753e Try some android stuff 2019-11-24 04:54:28 -05:00
idk
25c24757d4 Try some android stuff 2019-11-24 04:32:35 -05:00
idk
2d17f4fb0f Try some android stuff 2019-11-24 04:28:14 -05:00
idk
916ee81668 Try some android stuff 2019-11-24 04:25:06 -05:00
idk
1dd48e4344 Try some android stuff 2019-11-24 04:13:12 -05:00
idk
c93e16875f Merge pull request #34 from eyedeekay/droid-compat
fix tabs
2019-11-23 22:22:55 -05:00
idk
fbaf1dca30 fix tabs 2019-11-23 22:17:20 -05:00
idk
527e91b6cf Merge pull request #33 from eyedeekay/droid-compat
Droid compat
2019-11-23 18:56:19 -05:00
idk
ee0ca69195 remove chromium polyfill 2019-11-23 18:54:48 -05:00
idk
709854c1d1 remove chromium polyfill 2019-11-23 18:47:23 -05:00
idk
9ebdcc94c5 move host checkers to own file 2019-11-23 18:41:18 -05:00
idk
9e07c3e554 add protocol handler and hide stuff that doesn't exist on Android 2019-11-23 18:37:17 -05:00
idk
399365b2b7 use tabs instead of windows to launch I2P contexts at all times. 2019-11-23 14:24:56 -05:00
idk
52381453fb Merge pull request #32 from eyedeekay/smart-home
Smart home
2019-11-22 17:57:55 -05:00
idk
317034cb5a fmt 2019-11-22 17:55:58 -05:00
idk
e9b5060203 use buttons to make the new menu work 2019-11-22 17:49:27 -05:00
idk
2ea3bc169b exclude mirrors for now 2019-11-22 17:02:54 -05:00
idk
f4c45c4834 exclude mirroring script for now 2019-11-22 17:01:03 -05:00
idk
80bcf6e7ea fix ci 2019-11-22 16:39:28 -05:00
idk
b7a887c578 fix ci 2019-11-22 16:38:36 -05:00
idk
731a929a88 mark i2p cookies secure, don't set the home page. 2019-11-22 13:24:19 -05:00
idk
8eb75be6ec improvements to release stuff 2019-11-20 19:55:41 -05:00
idk
30ce917afa use images as readiness indicators for now 2019-11-20 19:50:12 -05:00
idk
0d5fb3c1bd backport the smart homepage from the I2P Browser 2019-11-20 17:44:01 -05:00
idk
6d5f56922b update mirrorlist 2019-11-19 09:38:34 -05:00
idk
8b0bea4e7d add mirrorlist 2019-11-19 09:37:42 -05:00
idk
92057d459d add mirrorlist 2019-11-19 09:35:43 -05:00
idk
0c30b2e921 Merge pull request #29 from eyedeekay/titles
add i2ptunnel screenshot
2019-11-12 13:13:43 -05:00
idk
df1d971a4d add i2ptunnel screenshot 2019-11-12 13:11:25 -05:00
idk
9bd7485d4a Merge pull request #28 from eyedeekay/titles
update screenshots
2019-11-12 00:22:09 -05:00
idk
c98f0399d2 update screenshots 2019-11-12 00:21:35 -05:00
idk
15a20cc25f Merge pull request #27 from eyedeekay/titles
update screenshots
2019-11-12 00:14:58 -05:00
idk
b342039e8f update screenshots 2019-11-12 00:14:11 -05:00
idk
343cec93e2 Merge pull request #26 from eyedeekay/titles
Titles
2019-11-12 00:13:09 -05:00
idk
b05ee528fd update screenshots 2019-11-12 00:11:52 -05:00
idk
d7c4340b4c use per-tab title prefixes, multilingual titles, multilingual menus 2019-11-11 23:31:37 -05:00
idk
e819532f29 Merge pull request #25 from eyedeekay/update-debian
update debian and packaging info
2019-11-11 21:56:08 -05:00
idk
a1a9c8221e update debian and packaging info 2019-11-11 21:54:26 -05:00
idk
1ebf80b644 Merge pull request #24 from eyedeekay/bookmarks
Bookmarks
2019-11-11 21:53:49 -05:00
idk
3727987dd3 Merge pull request #23 from eyedeekay/more-isolation
More isolation
2019-11-11 21:53:27 -05:00
idk
34e1251292 fix bookmark 2019-11-11 21:39:35 -05:00
idk
fdf777640d fix bookmark 2019-11-11 21:38:38 -05:00
idk
4cde00c7de fix bookmark 2019-11-11 21:02:38 -05:00
idk
92ce8431a2 fix bookmark 2019-11-11 21:01:52 -05:00
40 changed files with 2430 additions and 2485 deletions

251
.eslintrc.js Normal file
View 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"]
}
};

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
README.md.asc
node_modules/
web-ext-artifacts

114
GOALS.md Normal file
View 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 its 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
* Dont 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
* Dont 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:
---------------
* Dont 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

View File

@@ -6,7 +6,6 @@ install: uninstall
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 ./chromium/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./icons/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./_locales/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./options/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
@@ -26,6 +25,7 @@ uninstall:
$(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
ls:
ls -lah $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io; \
ls -lah $(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
@@ -36,8 +36,8 @@ clean:
## EVEN RELEASES are AMO RELEASES
## ODD RELEASES are SELFHOSTED RELEASES
MOZ_VERSION=0.40
VERSION=0.41
MOZ_VERSION=0.48
VERSION=0.49
#VERSION=$(MOZ_VERSION)
#VERSION=1.27
@@ -69,17 +69,33 @@ xpi:
cp ~/Downloads/i2p_in_private_browsing-$(VERSION)-an+fx.xpi ./i2ppb@eyedeekay.github.io.xpi
version:
sed -i 's|7647|7657|g' *.js* */*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)\",|g' manifest.json
moz-version:
sed -i 's|7647|7657|g' *.js* */*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(MOZ_VERSION)\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
rhz-version:
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)-rhizome\",|g' manifest.json
sed -i 's|7657|7647|g' *.js* */*.js*
zip: version
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:
cat desc | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -
cat desc debian/changelog | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -
delete-release:
gothub delete -u eyedeekay -r i2psetproxy.js -t $(VERSION); true
@@ -88,19 +104,56 @@ recreate-release: delete-release release upload
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 rhz-submit 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-submit --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi
##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
rhz-submit: rhz-version
@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
web-ext-submit --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
#cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi
upload-xpi:
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
upload-deb:
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
lib: libpolyfill
libpolyfill:
wget -O chromium/browser-polyfill.js https://unpkg.com/webextension-polyfill/dist/browser-polyfill.js
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 . -path ./node_modules -prune -o -name '*.js' -exec prettier --write {} \;
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
@@ -118,3 +171,8 @@ deborig:
deb: deborig
cd ../i2psetproxy.js-$(VERSION) && debuild -us -uc -rfakeroot
-include mirrors.mk
dat:
wget -c -O dat.js https://bundle.run/dat-js

View File

@@ -6,7 +6,10 @@ 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, although this support may be somewhat spotty in recent versions it it
beginning to improve again. It aims to be as similar to a fully-fledged I2P
Rhizome as possible and borrows some code from I2P Rhizome(Which it is also
compatible with).
The Old Version
---------------
@@ -56,43 +59,60 @@ command:
to the I2P container. Isolate the router console from other local
applications by automatically intercepting requests to the router console to
another container.
* [done/wip] **Indicate** the I2P browser is in use visually. Find an
* [done] **Indicate** the I2P browser is in use visually. Find an
acceptable way to indicate it on Android.
* [done] **Set** the http proxy to use the local I2P proxy automatically.
Provide specific configuration for other types of I2P proxies(SOCKS,
isolating HTTP)
* [done/wip] **Disable** risky webRTC features/offer the option to re-enable
* [done] **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.
* [ready/broken/wip] **Provide** help in a variety sof 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
* [Done] **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
* [wip] **Handle Torrents** by talking to i2psnark-rpc plugin and then
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
can.
can. Right now instead of talking to snark-rpc, it uses a web-based protocl
handler that simply auto-fills the torrent into i2psnark.
* [barely started] **Isolate** traffic by contextual identity to it's own HTTP
Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The
contextual identities. For now, the contextual identities used to manage
browsing are "I2P Browsing" and "Web Browsing" where I2P Browsing is capable
of using an outproxy but in the case of traffic destined for the clearnet
does not do header rewriting, and Web Browsing falls back to the Proxy
configured in Firefox. The I2P Browsing will be expanded to
- I2P Amnesiac Browsing: Use for General Browsing, stores no history and
uses an HTTP Proxy with a very short tunnel-close timeout and no key-reuse.
- I2P Social Networking: Use this for logging into social network accounts,
forums, and other interactive asynchronous public communication platforms
where your identity is behaviorally linkable. This has a very long
tunnel-close timeout and key-reuse until specifically invoked.
- I2P Blogging: Use this for posting content to the web interface of your
blog or to other similar websites that you create content on.
### Screenshot
![Visiting i2p-projekt.i2p](i2psetproxy.js.png)
![Visiting clearweb](clearweb.png)
![Visiting routerconsole](routerconsole.png)
![Visiting webmail](susimail.png)
![Visiting i2psnark](i2psnark.png)
![Visiting i2ptunnel](i2ptunnel.png)
![Visiting clearweb](clearweb.png)
![Video of the plugin in action](i2psetproxy.js.gif)
Super Extra Important Background Info:

View File

@@ -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": {
@@ -57,10 +97,22 @@
},
"controlHostText": {
"message": "Control Host: ",
"description": "Host for the Reset Tunnel button"
"description": "Host for the Router Console"
},
"controlPortText": {
"message": "Control Port: ",
"description": "Port for the Reset Tunnel button"
"description": "Port for the Router Console"
},
"controlHostValue": {
"message": "127.0.0.1",
"description": "Host for the Router Console"
},
"controlPortValue": {
"message": "7657",
"description": "Port for the Router Console"
},
"protocolHandlerValue": {
"message": "http://__MSG_controlHostValue__:__MSG_controlPortValue__/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent",
"description": "Value for the magnet protocol handler"
}
}

View File

@@ -1,59 +1,72 @@
function onGot(contexts) {
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 onContextsGot(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("I2P Browsing") == -1) {
if (ids.indexOf(titlepref) == -1) {
browser.contextualIdentities
.create({
name: "I2P Browsing",
name: titlepref,
color: "orange",
icon: "fingerprint"
})
.then(onCreated, onError);
}
if (ids.indexOf("Web Browsing") == -1) {
if (ids.indexOf(webpref) == -1) {
browser.contextualIdentities
.create({
name: "Web Browsing",
name: webpref,
color: "red",
icon: "circle"
})
.then(onCreated, onError);
}
if (ids.indexOf("Router Console") == -1) {
if (ids.indexOf(routerpref) == -1) {
browser.contextualIdentities
.create({
name: "Router Console",
name: routerpref,
color: "blue",
icon: "briefcase"
})
.then(onCreated, onError);
}
if (ids.indexOf("Hidden Services Manager") == -1) {
if (ids.indexOf(tunnelpref) == -1) {
browser.contextualIdentities
.create({
name: "Hidden Services Manager",
name: tunnelpref,
color: "green",
icon: "tree"
})
.then(onCreated, onError);
}
if (ids.indexOf("Web Mail") == -1) {
if (ids.indexOf(mailpref) == -1) {
browser.contextualIdentities
.create({
name: "Web Mail",
name: mailpref,
color: "yellow",
icon: "briefcase"
})
.then(onCreated, onError);
}
if (ids.indexOf("Bittorrent") == -1) {
if (ids.indexOf(torrentpref) == -1) {
browser.contextualIdentities
.create({
name: "Bittorrent",
name: torrentpref,
color: "purple",
icon: "chill"
})
@@ -65,27 +78,32 @@ function onCreated(context) {
console.log(`New identity's ID: ${context.cookieStoreId}.`);
}
function onError(e) {
console.error(e);
}
browser.contextualIdentities.query({}).then(onContextsGot, onError);
browser.contextualIdentities.query({}).then(onGot, onError);
if (!isDroid()) {
chrome.windows.onCreated.addListener(themeWindow);
chrome.windows.onFocusChanged.addListener(themeWindow);
chrome.windows.onRemoved.addListener(themeWindow);
chrome.tabs.onUpdated.addListener(themeWindowByTab);
chrome.tabs.onActivated.addListener(themeWindowByTab);
}
var titlepref = chrome.i18n.getMessage("titlePreface");
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
browser.windows.onCreated.addListener(themeWindow);
browser.windows.onFocusChanged.addListener(themeWindow);
browser.windows.onRemoved.addListener(themeWindow);
browser.tabs.onUpdated.addListener(themeWindowByTab);
browser.tabs.onActivated.addListener(themeWindowByTab);
}
});
function themeWindowByTab(tabId) {
function tabWindow(tab) {
getwindow = browser.windows.get(tab.windowId);
getwindow.then(themeWindow);
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
getwindow = browser.tabs.get(tab.tabId);
getwindow.then(themeWindow);
} else {
getwindow = browser.windows.get(tab.windowId);
getwindow.then(themeWindow);
}
});
}
if (typeof tabId === "number") {
tab = browser.tabs.get(tabId);
@@ -98,86 +116,86 @@ function themeWindowByTab(tabId) {
function themeWindow(window) {
// Check if the window is in private browsing
function logTabs(tabInfo) {
function onGot(context) {
if (context.name == "I2P Browsing") {
function onContextGotTheme(context) {
if (context.name == titlepref) {
console.log("Active in I2P window");
if (window.incognito) {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#FFC56D",
toolbar: "#FFC56D"
}
});
} else {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#FFC56D",
toolbar: "#FFC56D"
}
});
}
} else if (context.name == "Router Console") {
} else if (context.name == routerpref) {
console.log("Active in Router Console window");
if (window.incognito) {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#A4C8E1",
toolbar: "#A4C8E1"
}
});
} else {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#A4C8E1",
toolbar: "#A4C8E1"
}
});
}
} else if (context.name == "Hidden Services Manager") {
} else if (context.name == tunnelpref) {
console.log("Active in Hidden Services Manager window");
if (window.incognito) {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#D9D9D6",
toolbar: "#D9D9D6"
}
});
} else {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#D9D9D6",
toolbar: "#D9D9D6"
}
});
}
} else if (context.name == "Web Mail") {
} else if (context.name == mailpref) {
console.log("Active in Web Mail window");
if (window.incognito) {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#F7E59A",
toolbar: "#F7E59A"
}
});
} else {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#F7E59A",
toolbar: "#F7E59A"
}
});
}
} else if (context.name == "Bittorrent") {
} else if (context.name == torrentpref) {
console.log("Active in Bittorrent window");
if (window.incognito) {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#A48FE1",
toolbar: "#A48FE1"
}
});
} else {
chrome.theme.update(window.id, {
browser.theme.update(window.id, {
colors: {
frame: "#A48FE1",
toolbar: "#A48FE1"
@@ -186,7 +204,7 @@ function themeWindow(window) {
}
} else {
console.log("Not active in I2P window");
chrome.theme.reset(window.id);
browser.theme.reset(window.id);
}
}
if (
@@ -195,9 +213,9 @@ function themeWindow(window) {
) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onGot, onError);
.then(onContextGotTheme, onError);
} else {
chrome.theme.reset(window.id);
browser.theme.reset(window.id);
}
}
@@ -212,77 +230,75 @@ function setTitle(window) {
function logTabs(tabInfo) {
console.log(tabInfo);
function onGot(context) {
if (context.name == "I2P Browsing") {
function onContextGotTitle(context) {
if (context.name == titlepref) {
console.log("Active in I2P window");
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
browser.windows.update(window.id, {
titlePreface: titleprefpriv + ": "
});
} else {
chrome.windows.update(window.id, {
titlePreface: titlepref
browser.windows.update(window.id, {
titlePreface: titlepref + ": "
});
}
} else if (context.name == "Web Browsing") {
} else if (context.name == webpref) {
console.log("Active in Web window");
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
browser.windows.update(window.id, {
titlePreface: ""
});
} else {
chrome.windows.update(window.id, {
titlePreface: titlepref
browser.windows.update(window.id, {
titlePreface: ""
});
}
} else if (context.name == "Router Console") {
} else if (context.name == routerpref) {
console.log("Active in Router Console window");
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + routerprefpriv + ": "
});
} else {
chrome.windows.update(window.id, {
titlePreface: titlepref
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + routerpref + ": "
});
}
} else if (context.name == "Hidden Services Manager") {
} else if (context.name == tunnelpref) {
console.log("Active in Hidden Services Manager window");
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + tunnelprefpriv + ": "
});
} else {
chrome.windows.update(window.id, {
titlePreface: titlepref
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + tunnelpref + ": "
});
}
} else if (context.name == "Web Mail") {
} else if (context.name == mailpref) {
console.log("Active in Web Mail window");
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + mailprefpriv + ": "
});
} else {
chrome.windows.update(window.id, {
titlePreface: titlepref
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + mailpref + ": "
});
}
} else if (context.name == "Bittorrent") {
} else if (context.name == torrentpref) {
console.log("Active in I2P window");
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + torrentprefpriv + ": "
});
} else {
chrome.windows.update(window.id, {
titlePreface: titlepref
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + torrentpref + ": "
});
}
}
@@ -294,14 +310,14 @@ function setTitle(window) {
) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onGot, onError);
.then(onContextGotTitle, onError);
} else {
if (window.incognito) {
chrome.windows.update(window.id, {
browser.windows.update(window.id, {
titlePreface: ""
});
} else {
chrome.windows.update(window.id, {
browser.windows.update(window.id, {
titlePreface: ""
});
}
@@ -315,17 +331,52 @@ function setTitle(window) {
querying.then(logTabs, onError);
}
chrome.windows.onCreated.addListener(() => {
/* var gettingStoredSettings = chrome.storage.local.get();
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
browser.windows.onCreated.addListener(() => {
/* var gettingStoredSettings = chrome.storage.local.get();
gettingStoredSettings.then(setupProxy, onError); */
chrome.storage.local.get(function(got) {
setupProxy();
});
chrome.storage.local.get(function(got) {
setupProxy();
});
});
}
});
chrome.tabs.onCreated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true
});
getting.then(setTitle, onError);
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
browser.tabs.onCreated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true
});
getting.then(setTitle, onError);
});
}
});
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
browser.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);

172
bookmarks.js Normal file
View File

@@ -0,0 +1,172 @@
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
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:7657/i2psnark",
title: "Bittorrent",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createBookmark = browser.bookmarks.create({
url:
"http://" + control_host + ":" + control_port + "/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:7657/webmail",
title: "Web Mail",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createBookmark = browser.bookmarks.create({
url: "http://" + control_host + ":" + control_port + "/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:7657/i2ptunnelmgr",
title: "Hidden Services Manager",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createBookmark = browser.bookmarks.create({
url:
"http://" +
control_host +
":" +
control_port +
"/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);
}
});

View File

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

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 126 KiB

View File

@@ -1,18 +1,17 @@
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");
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");
newsMessage.textContent = chrome.i18n.getMessage("newsMessage");
*/
var clearData = document.getElementById("clear-browser-data");
clearData.textContent = chrome.i18n.getMessage("clearData");
/*

View File

@@ -1,21 +1,21 @@
//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
});
}
var titlepref = chrome.i18n.getMessage("titlePreface");
function onError(error) {
console.log(`Error: ${error}`);
}
function eventHandler(event) {
function onCreated(windowInfo) {
console.log(`Created window: ${windowInfo.id}`);
browser.tabs.create({
windowId: windowInfo.id,
url: "about:blank",
cookieStoreId: event.target.dataset.identity
});
}
if (event.target.dataset.action == "create") {
var creating = browser.windows.create({
var creating = browser.tabs.create({
cookieStoreId: event.target.dataset.identity
});
creating.then(onCreated, onError);
@@ -52,7 +52,7 @@ if (browser.contextualIdentities === undefined) {
} else {
browser.contextualIdentities
.query({
name: "I2P Browsing"
name: titlepref
})
.then(identities => {
if (!identities.length) {

26
debian/changelog vendored
View File

@@ -1,3 +1,29 @@
i2psetproxy.js (0.49-1) UNRELEASED; urgency=low
* fix tabs
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 22:51:11 -0400
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

1
debian/copyright vendored
View File

@@ -28,6 +28,7 @@ Files: .gitignore
scrub.js
window.html
debian/*
*
Copyright: MIT
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a copy

1
debian/rules vendored
View File

@@ -7,7 +7,6 @@ override_dh_auto_install:
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 ./chromium/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./icons/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./options/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./_locales/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/

1
debian/source/include-binaries vendored Normal file
View File

@@ -0,0 +1 @@
i2psetproxy.js.gif

1
geti2p.url Normal file
View File

@@ -0,0 +1 @@
0.9.43

45
handler.js Normal file
View 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"]
);

286
home.css Normal file
View File

@@ -0,0 +1,286 @@
* {
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;
min-width: 95%
}
.application-info,
.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: 95%
}
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;
display: none
}
#proxy-check {
visibility: hidden
}
#info-content {
display: none
}
.consoleOn:hover #proxy-check,
.proxyReady:hover #proxy-check {
visibility: visible;
opacity: 1
}
img.readyness {
height: 100%;
width: auto
}
@media only screen and (max-width: 399px) {
.application-info {
display: none
}
}

114
home.html Normal file
View 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 id="onboardingButtonZero" 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 id="onboardingButtonOne" 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 id="onboardingButtonTwo" 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 id="onboardingButtonThree" 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 id="onboardingButtonFour" 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" target="_blank" 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" target="_blank" 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" target="_blank" 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 id="fliplinks" class="showhider">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>

24
home.js Normal file
View File

@@ -0,0 +1,24 @@
document.addEventListener("click", e => {
if (e.target.id === "onboardingButtonZero") {
flipVisibility("onboardingContentZero");
} else if (e.target.id === "onboardingButtonOne") {
flipVisibility("onboardingContentOne");
} else if (e.target.id === "onboardingButtonTwo") {
flipVisibility("onboardingContentTwo");
} else if (e.target.id === "onboardingButtonThree") {
flipVisibility("onboardingContentThree");
} else if (e.target.id === "onboardingButtonFour") {
flipVisibility("onboardingContentFour");
} else if (e.target.id === "fliplinks") {
flipVisibility("info-content");
}
});
function flipVisibility(div) {
var x = document.getElementById(div);
if (x.style.display === "none") {
x.style.display = "block";
} else {
x.style.display = "none";
}
}

111
host.js Normal file
View File

@@ -0,0 +1,111 @@
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 extensionHost(url) {
var res = url.startsWith(browser.runtime.getURL(""));
console.log("Extension URL?", res, url, browser.runtime.getURL(""));
return res;
}
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 === control_host + ":" + control_port) {
console.log("(hostcheck) router console found on configured ports");
return pathcheck(path);
} else if (hostname === "127.0.0.1:7657") {
return pathcheck(path);
} else if (hostname === "localhost:7657") {
return pathcheck(path);
}
if (hostname === "127.0.0.1:7657") {
return pathcheck(path);
} else if (hostname === "localhost:7657") {
return pathcheck(path);
}
if (hostname === "127.0.0.1:7070") {
return pathcheck(path);
} else if (hostname === "localhost:7070") {
return pathcheck(path);
}
return false;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

After

Width:  |  Height:  |  Size: 213 KiB

BIN
i2psnark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
i2ptunnel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

119
icons/i2plogo.svg Normal file
View 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
View 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>

View File

@@ -1,22 +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;
margin-left: 1em
}
figcaption {
display: inline;
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
}

160
info.js
View File

@@ -1,14 +1,33 @@
document.addEventListener("click", e => {
function getCurrentWindow() {
return chrome.windows.getCurrent();
}
function checkPeerConnection() {
var getting = browser.privacy.network.peerConnectionEnabled.get({});
getting.then(got => {
webrtc = got.value;
console.log("checking webrtc", webrtc);
document.getElementById("enable-web-rtc").checked = webrtc;
});
}
checkPeerConnection();
function checkHistory() {
var getting = browser.storage.local.get("disable_history");
getting.then(got => {
disable_history = got.disable_history;
if (disable_history == undefined) disable_history = false;
console.log("checking history", disable_history);
document.getElementById("disable-history").checked = disable_history;
});
}
checkHistory();
document.addEventListener("click", e => {
if (e.target.id === "window-create-help-panel") {
let createData = {
type: "panel",
incognito: true
};
let creating = browser.windows.create(createData);
let creating = browser.tabs.create(createData);
creating.then(() => {
console.log("The help panel has been created");
});
@@ -17,7 +36,7 @@ document.addEventListener("click", e => {
type: "panel",
incognito: true
};
let creating = browser.windows.create(createData);
let creating = browser.tabs.create(createData);
creating.then(() => {
console.log("The news panel has been created");
});
@@ -34,12 +53,18 @@ document.addEventListener("click", e => {
}
RefreshIdentity();
} else if (e.target.id === "window-preface-title") {
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();
} else if (e.target.id === "check-i2p-control") {
@@ -50,6 +75,15 @@ document.addEventListener("click", e => {
} else {
browser.runtime.sendMessage({ rtc: "disableWebRTC" });
}
//checkPeerConnection()
return;
} else if (e.target.id === "disable-history") {
if (e.target.checked) {
browser.runtime.sendMessage({ history: "disableHistory" });
} else {
browser.runtime.sendMessage({ history: "enableHistory" });
}
//checkHistory()
return;
}
@@ -60,42 +94,80 @@ function proxyReadiness() {
console.log(this.responseText);
}
//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();
//});
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
browser.history.onVisited.addListener(onVisited);
}
});
function transferComplete(evt) {
console.log(
"The transfer is complete.",
this.status,
this.statusText,
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 transferFailed(evt) {
console.log(
"An error occurred while transferring the file.",
this.status,
this.statusText,
this.responseText
);
function goTunnel() {
let createData = {
url: "http://" + control_host + ":" + control_port + "/i2ptunnel"
};
console.log("visiting homepage");
let creating = browser.tabs.create(createData);
}
function transferCanceled(evt) {
console.log(
"The transfer has been canceled by the user.",
this.status,
this.statusText,
this.responseText
);
function goMail() {
let createData = {
url: "http://" + control_host + ":" + control_port + "/susimail"
};
console.log("visiting homepage");
let creating = browser.tabs.create(createData);
}
Http.addEventListener("load", transferComplete);
Http.addEventListener("error", transferFailed);
Http.addEventListener("abort", transferCanceled);
function goSnark() {
let createData = {
url: "http://" + control_host + ":" + control_port + "/i2psnark"
};
console.log("visiting homepage");
let creating = browser.tabs.create(createData);
}
function onVisited(historyItem) {
function onCleaned(results) {
if (!results.length) {
console.log(" was removed");
} else {
console.log(" was not removed");
}
}
function onRemoved() {
var searching = browser.history.search({
text: historyItem.url,
startTime: 0
});
searching.then(onCleaned);
}
if (!history) {
if (i2pHost(historyItem.url))
var deletingUrl = browser.history.deleteUrl(historyItem.url);
deletingUrl.then(onRemoved);
}
}

View File

@@ -5,9 +5,6 @@
"strict_min_version": "60.0"
}
},
"chrome_settings_overrides": {
"homepage": "home.html"
},
"permissions": [
"theme",
"browsingData",
@@ -26,7 +23,8 @@
],
"manifest_version": 2,
"name": "__MSG_extensionName__",
"version": "0.41",
"version": "0.49",
"version_name": "0.49",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://github.com/eyedeekay/i2psetproxy.js",
"icons": {
@@ -46,18 +44,32 @@
"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": "web+rc",
"name": "RouterConsole",
"uriTemplate": "http://router.console/?%s"
}],
"protocol_handlers": [
{
"protocol": "ext+rc",
"name": "RouterConsole",
"uriTemplate": "http://127.0.0.1:7657/%s"
},
{
"protocol": "ext+dati2p",
"name": "Dat over I2P",
"uriTemplate": "/dat.html#!/%s"
},
{
"protocol": "magnet",
"name": "I2PTorrent",
"uriTemplate": "__MSG_protocolHandlerValue__"
}
],
"default_locale": "en"
}

View File

@@ -1,14 +1,3 @@
function isDroid() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
return true;
} else {
return false;
}
});
}
function SetHostText() {
var hostid = document.getElementById("hostText");
hostid.textContent = chrome.i18n.getMessage("hostText");
@@ -24,174 +13,6 @@ function SetControlHostText() {
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
}
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;
}
}
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);
}
};
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");
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
@@ -324,6 +145,75 @@ function checkStoredSettings(storedSettings) {
gettingInfo.then(gotProxyInfo);
}
function checkAndroidStoredSettings(storedSettings) {
let defaultSettings = {};
let host = "";
let port = "";
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(
defaultSettings["proxy_host"],
defaultSettings["proxy_port"],
defaultSettings["control_host"],
defaultSettings["control_port"]
);
chrome.storage.local.set(defaultSettings);
}
function onError(e) {
console.error(e);
}
@@ -346,7 +236,6 @@ function storeSettings() {
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) {
@@ -375,15 +264,25 @@ function updateUI(restoredSettings) {
SetControlHostText();
SetControlPortText();
SetControlHelpText();
setupProxy();
}
function onError(e) {
console.error(e);
}
chrome.storage.local.get(function(got) {
checkStoredSettings(got);
updateUI(got);
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
chrome.storage.local.get(function(got) {
checkStoredSettings(got);
updateUI(got);
});
} else {
chrome.storage.local.get(function(got) {
checkAndroidStoredSettings(got);
updateUI(got);
});
}
});
const saveButton = document.querySelector("#save-button");

View File

@@ -1,13 +1,30 @@
var titlepref = chrome.i18n.getMessage("titlePreface");
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
var webpref = chrome.i18n.getMessage("webPreface");
var webprefpriv = chrome.i18n.getMessage("webPrefacePrivate");
var routerpref = chrome.i18n.getMessage("routerPreface");
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
var mailpref = chrome.i18n.getMessage("mailPreface");
var mailprefpriv = chrome.i18n.getMessage("mailPrefacePrivate");
var torrentpref = chrome.i18n.getMessage("torrentPreface");
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
var android = false;
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
console.log("Running in Android detected");
android = true;
return true;
} else {
console.log("Running in Desktop detected");
return false;
}
});
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;
return android;
}

View File

@@ -1,3 +1,14 @@
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) {
console.log("->: Value was updated");
@@ -75,7 +86,7 @@ function disableReferrers() {
// enable fingerprinting resistent features(letterboxing and stuff)
function enableResistFingerprinting() {
var setting = browser.privacy.websites.referrersEnabled.set({
var setting = browser.privacy.websites.resistFingerprinting.set({
value: true
});
console.log("Enabling resist fingerprinting/val=", {
@@ -128,32 +139,56 @@ function setAllPrivacy() {
setAllPrivacy();
function ResetPeerConnection() {
browser.privacy.network.peerConnectionEnabled.set({
value: false
var webrtc = false;
var rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
browser.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp"
});
console.log("Re-disabled WebRTC");
rtc.then(AssurePeerConnection);
}
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"
var webrtc = false;
var rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(SetupPeerConnection);
console.log("Enabled WebRTC");
}
ResetPeerConnection();
function SetupPeerConnection() {
var webrtc = true;
console.log("Pre-disabled WebRTC");
rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(AssurePeerConnection);
}
function AssurePeerConnection() {
function assure(webrtc) {
browser.privacy.network.peerConnectionEnabled.set({
value: webrtc.value
});
browser.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "proxy_only"
});
}
rtc = browser.privacy.network.peerConnectionEnabled.get({});
rtc.then(assure);
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
browser.tabs.onCreated.addListener(ResetPeerConnection);
} else {
browser.windows.onCreated.addListener(ResetPeerConnection);
}
});
//AssurePeerConnection();
function ResetDisableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
@@ -185,13 +220,6 @@ function onError(e) {
console.error(e);
}
function checkStoredSettings(storedSettings) {
chrome.storage.local.set(appSettings);
}
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(checkStoredSettings, onError);
function clearCookiesContext(cookieStoreId) {}
function forgetBrowsingData(storedSettings) {
@@ -245,32 +273,32 @@ function forgetBrowsingData(storedSettings) {
hostnames: [i2pHostName(item.url)],
since
})
.then(onGot);
.then(onContextGotLog);
console.log("cleared Passwords");
browser.browsingData
.removeDownloads({
hostnames: [i2pHostName(item.url)],
since
})
.then(onGot);
.then(onContextGotLog);
console.log("cleared Downloads");
browser.browsingData
.removeFormData({
hostnames: [i2pHostName(item.url)],
since
})
.then(onGot);
.then(onContextGotLog);
console.log("cleared Form Data");
browser.browsingData
.removeLocalStorage({
hostnames: [i2pHostName(item.url)],
since
})
.then(onGot);
.then(onContextGotLog);
console.log("cleared Local Storage");
contexts = browser.contextualIdentities.query({
name: "I2P Browsing"
name: titlepref
});
function deepCleanCookies(cookies) {
@@ -280,7 +308,7 @@ function forgetBrowsingData(storedSettings) {
name: cookie.name,
url: item.url
});
removing.then(onGot, onError);
removing.then(onContextGotLog, onError);
}
console.log("Cleared cookies");
}
@@ -327,7 +355,7 @@ function i2pHost(url) {
return hostname.endsWith(".i2p");
}
function onGot(contexts) {
function onContextGotLog(contexts) {
if (contexts != null) {
for (let context of contexts) {
console.log(context);
@@ -337,13 +365,48 @@ function onGot(contexts) {
browser.runtime.onMessage.addListener(message);
function enableHistory() {
function checkStoredSettings(storedSettings) {
storedSettings["disable_history"] = false;
console.log(storedSettings);
function enablehistory(settings) {
console.log("Store History:", storedSettings);
}
var setting = browser.storage.local.set(storedSettings);
setting.then(enablehistory);
}
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(checkStoredSettings, onError);
}
function disableHistory() {
function checkStoredSettings(storedSettings) {
storedSettings["disable_history"] = true;
console.log(storedSettings);
function enablehistory(settings) {
console.log("Store History:", storedSettings);
}
var setting = browser.storage.local.set(storedSettings);
setting.then(enablehistory);
}
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(checkStoredSettings, onError);
}
function message(message) {
console.log(message);
if (message.rtc === "enableWebRTC") {
console.log("enableWebRTC");
EnablePeerConnection();
} else {
} else if (message.rtc === "disableWebRTC") {
console.log("disableWebRTC");
ResetPeerConnection();
}
if (message.history === "enableHistory") {
console.log("enableHistory");
enableHistory();
} else if (message.history === "disableHistory") {
console.log("disableHistory");
disableHistory();
}
}

294
proxy.js
View File

@@ -1,3 +1,16 @@
var titlepref = chrome.i18n.getMessage("titlePreface");
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
var webpref = chrome.i18n.getMessage("webPreface");
var webprefpriv = chrome.i18n.getMessage("webPrefacePrivate");
var routerpref = chrome.i18n.getMessage("routerPreface");
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
var mailpref = chrome.i18n.getMessage("mailPreface");
var mailprefpriv = chrome.i18n.getMessage("mailPrefacePrivate");
var torrentpref = chrome.i18n.getMessage("torrentPreface");
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
browser.privacy.network.peerConnectionEnabled.set({
value: false
});
@@ -22,8 +35,12 @@ var handleContextProxyRequest = async function(requestDetails) {
failoverTimeout: 0,
proxyDns: false
};
if (context == "firefox-default" || context == "firefox-private") {
proxy = null;
return proxy;
}
if (context != undefined) {
if (context.name == "I2P Browsing") {
if (context.name == titlepref) {
proxy = {
type: getScheme(),
host: getHost(),
@@ -38,7 +55,7 @@ var handleContextProxyRequest = async function(requestDetails) {
proxy.host + ":" + proxy.port
);
return proxy;
} else if (context.name == "Router Console") {
} else if (context.name == routerpref) {
if (routerHost(requestDetails.url)) {
return proxy;
} else if (!routerHost(requestDetails.url)) {
@@ -62,7 +79,7 @@ var handleContextProxyRequest = async function(requestDetails) {
proxy.host + ":" + proxy.port
);
return proxy;
} else if (context.name == "Web Browsing") {
} else if (context.name == webpref) {
if (localHost(requestDetails.url)) {
if (!routerHost(requestDetails.url)) {
proxy = {
@@ -110,15 +127,7 @@ var handleContextProxyRequest = async function(requestDetails) {
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);
return "firefox-default";
}
};
var tabGet = async function(tabId) {
@@ -132,12 +141,19 @@ var handleContextProxyRequest = async function(requestDetails) {
};
if (requestDetails.tabId > 0) {
if (i2pHost(requestDetails.url)) {
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);
requestDetails.tabId = tab;
var context = tab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
console.log("(proxy)Returning I2P Proxy", proxy);
return proxy;
@@ -158,6 +174,113 @@ var handleContextProxyRequest = async function(requestDetails) {
};
var proxy_scheme = "HTTP";
var proxy_host = "127.0.0.1";
var proxy_port = "4444";
var control_host = "127.0.0.1";
var control_port = "4444";
var disable_history = false;
function SetupSettings() {
console.log("Initialising Settings");
//
function checkSchemeStoredSettings(storedSettings) {
if (storedSettings.proxy_scheme != undefined) {
proxy_scheme = storedSettings.proxy_scheme;
} else {
proxy_scheme = "http";
storedSettings.proxy_scheme = proxy_scheme;
}
console.log("Initialising Proxy Scheme", storedSettings.proxy_scheme);
setupProxy();
}
var gettingSchemeStoredSettings = browser.storage.local.get("proxy_scheme");
gettingSchemeStoredSettings.then(checkSchemeStoredSettings, onError);
//
function checkHostStoredSettings(storedSettings) {
if (storedSettings.proxy_host != undefined) {
proxy_host = storedSettings.proxy_host;
} else {
proxy_host = "127.0.0.1";
storedSettings.proxy_host = proxy_host;
}
console.log("Initialising Host", storedSettings.proxy_host);
setupProxy();
}
var gettingHostStoredSettings = browser.storage.local.get("proxy_host");
gettingHostStoredSettings.then(checkHostStoredSettings, onError);
//
function checkPortStoredSettings(storedSettings) {
if (storedSettings.proxy_port != undefined) {
proxy_port = storedSettings.proxy_port;
} else {
proxy_port = "4444";
storedSettings.proxy_port = proxy_port;
}
console.log("Initialising Port", storedSettings.proxy_port);
setupProxy();
}
var gettingPortStoredSettings = browser.storage.local.get("proxy_port");
gettingPortStoredSettings.then(checkPortStoredSettings, onError);
//
function checkControlHostStoredSettings(storedSettings) {
if (storedSettings.control_host != undefined) {
control_host = storedSettings.control_host;
} else {
control_host = "127.0.0.1";
storedSettings.control_host = control_host;
}
console.log("Initialising Control Host", storedSettings.control_host);
setupProxy();
}
var gettingControlHostStoredSettings = browser.storage.local.get(
"control_host"
);
gettingControlHostStoredSettings.then(
checkControlHostStoredSettings,
onError
);
//
function checkControlPortStoredSettings(storedSettings) {
if (storedSettings.control_port != undefined) {
contro_port = storedSettings.control_port;
} else {
control_port = "7657";
storedSettings.control_port = control_port;
}
console.log("Initialising Control Port", storedSettings.control_port);
setupProxy();
}
var gettingControlPortStoredSettings = browser.storage.local.get(
"control_port"
);
gettingControlPortStoredSettings.then(
checkControlPortStoredSettings,
onError
);
//
function checkHistoryStoredSettings(storedSettings) {
if (storedSettings.disable_history != undefined) {
disable_history = storedSettings.disable_history;
} else {
disable_history = false;
storedSettings.disable_history = disable_history;
}
console.log(
"Initialising Disabled History",
storedSettings.disable_history
);
setupProxy();
}
var gettingHistoryStoredSettings = browser.storage.local.get(
"disable_history"
);
gettingHistoryStoredSettings.then(checkHistoryStoredSettings, onError);
}
function getScheme() {
if (proxy_scheme == undefined) {
@@ -176,13 +299,6 @@ function getScheme() {
return proxy_scheme;
}
/*
var proxy_host = "127.0.0.1";
var proxy_port = "4444";
var control_host = "127.0.0.1";
var control_port = "4444";
*/
function getHost() {
if (proxy_host == undefined) {
proxy_host = "127.0.0.1";
@@ -211,17 +327,17 @@ function getControlHost() {
function getControlPort() {
if (control_port == undefined) {
return "4444";
return "7657";
}
return control_port;
}
function setupProxy() {
var controlHost = getControlHost();
var controlPort = getControlPort();
var Host = getHost();
var Port = getPort();
var Scheme = getScheme();
//var controlHost = getControlHost();
//var controlPort = getControlPort();
//var Host = getHost();
//var Port = getPort();
//var Scheme = getScheme();
/**/
console.log("Setting up Firefox WebExtension proxy");
@@ -232,107 +348,35 @@ function setupProxy() {
/**/
}
function checkStoredSettings(storedSettings) {
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);
}
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;
function update() {
console.log("restoring proxy scheme:", proxy_scheme);
proxy_host = restoredSettings.proxy_host;
console.log("restoring proxy host:", proxy_host);
proxy_port = restoredSettings.proxy_port;
console.log("restoring proxy port:", proxy_port);
control_host = restoredSettings.control_host;
console.log("restoring control host:", control_host);
control_port = restoredSettings.control_port;
console.log("restoring control port:", control_port);
}
chrome.storage.local.get(function(got) {
checkStoredSettings(got);
update(got);
setupProxy();
});
// Theme all currently open windows
if (!isDroid()) {
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
function updateFromStorage() {
console.log("updating settings from storage");
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
chrome.storage.local.get(function(got) {
SetupSettings();
update();
setupProxy();
});
} else {
chrome.storage.local.get(function(got) {
SetupSettings();
update();
setupProxy();
});
}
});
}
browser.storage.onChanged.addListener(updateFromStorage);
SetupSettings();
setupProxy();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 KiB

After

Width:  |  Height:  |  Size: 242 KiB

370
scrub.js
View File

@@ -1,10 +1,23 @@
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 == "I2P Browsing") {
console.error("Context not found", context);
} else if (context.name == titlepref) {
var ua = "MYOB/6.66 (AN/ON)";
if (i2pHost(requestDetails.url)) {
for (var header of requestDetails.requestHeaders) {
@@ -17,7 +30,7 @@ var contextScrub = async function(requestDetails) {
return {
requestHeaders: requestDetails.requestHeaders
};
} else if (context.name == "Router Console") {
} else if (context.name == routerpref) {
var ua = "MYOB/6.66 (AN/ON)";
if (i2pHost(requestDetails.url)) {
for (var header of requestDetails.requestHeaders) {
@@ -39,28 +52,19 @@ var contextScrub = async function(requestDetails) {
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: "I2P Browsing"
});
tabId.cookieStoreId = context[0].cookieStoreId;
console.log("(scrub) forcing context", tabId.cookieStoreId);
return tabId;
} catch (error) {
console.log("(scrub)Context Error", error);
return "firefox-default";
}
};
var tabGet = async function(tabId) {
try {
console.log("(scrub)Tab ID from Request", tabId);
let ostype = await browser.runtime.getPlatformInfo();
if (ostype == android) tabId += 1;
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
console.log("(scrub)Tab error", error);
let tabInfo = await browser.tabs.getCurrent();
return tabInfo;
}
};
if (requestDetails.tabId > 0) {
@@ -68,18 +72,16 @@ var contextScrub = async function(requestDetails) {
var context = {};
var req = {};
if (i2pHost(requestDetails.url)) {
console.log("(Proxy)I2P URL detected, ");
console.log("(scrub)I2P URL detected, ");
tab = tabGet(requestDetails.tabId);
var mtab = tab.then(tabFind);
requestDetails.tabId = mtab;
context = mtab.then(contextGet);
req = await context.then(headerScrub);
context = tab.then(contextGet, onError);
req = await context.then(headerScrub, onError);
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);
context = tab.then(contextGet, onError);
req = await context.then(headerScrub, onError);
console.log("(scrub)Scrubbing non-I2P Request", req);
return req;
}
@@ -93,38 +95,28 @@ var contextScrub = async function(requestDetails) {
var contextSetup = async function(requestDetails) {
console.log("(isolate)Forcing I2P requests into context");
try {
var tabFind = async function(tabId) {
var i2pTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: "I2P Browsing"
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}`);
if (tabId != undefined) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.id);
}
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url,
windowId: window.id
url: requestDetails.url
});
created.then(onCreated, onError);
}
var getting = browser.windows.getCurrent();
getting.then(Create);
var getting = browser.tabs.getCurrent();
getting.then(Create, onError);
return tabId;
}
} catch (error) {
@@ -134,35 +126,25 @@ var contextSetup = async function(requestDetails) {
var routerTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: "Router Console"
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}`);
if (tabId != undefined) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.id);
}
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url,
windowId: window.id
url: requestDetails.url
});
created.then(onCreated, onError);
}
var getting = browser.windows.getCurrent();
getting.then(Create);
var getting = browser.tabs.getCurrent();
getting.then(Create, onError);
return tabId;
}
} catch (error) {
@@ -172,37 +154,25 @@ var contextSetup = async function(requestDetails) {
var i2ptunnelTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: "Hidden Services Manager"
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);
if (tabId != undefined) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.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
url: requestDetails.url
});
created.then(onCreated, onError);
}
var getting = browser.windows.getCurrent();
getting.then(Create);
var getting = browser.tabs.getCurrent();
getting.then(Create, onError);
return tabId;
}
} catch (error) {
@@ -212,35 +182,25 @@ var contextSetup = async function(requestDetails) {
var snarkTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: "Bittorrent"
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}`);
if (tabId != undefined) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.id);
}
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url,
windowId: window.id
url: requestDetails.url
});
created.then(onCreated, onError);
}
var getting = browser.windows.getCurrent();
getting.then(Create);
var getting = browser.tabs.getCurrent();
getting.then(Create, onError);
return tabId;
}
} catch (error) {
@@ -250,35 +210,25 @@ var contextSetup = async function(requestDetails) {
var mailTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: "Web Mail"
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}`);
if (tabId != undefined) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.id);
}
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url,
windowId: window.id
url: requestDetails.url
});
created.then(onCreated, onError);
}
var getting = browser.windows.getCurrent();
getting.then(Create);
var getting = browser.tabs.getCurrent();
getting.then(Create, onError);
return tabId;
}
} catch (error) {
@@ -288,7 +238,7 @@ var contextSetup = async function(requestDetails) {
var anyTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: "Web Browsing"
name: webpref
});
console.log("(ISOLATE)", tabId.cookieStoreId);
if (
@@ -296,32 +246,22 @@ var contextSetup = async function(requestDetails) {
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}`);
if (tabId != undefined) {
console.log("(isolate) Closing old, un-isolated tab");
browser.tabs.remove(tabId.id);
}
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url,
windowId: window.id
url: requestDetails.url
});
created.then(onCreated, onError);
}
var getting = browser.windows.getCurrent();
getting.then(Create);
var getting = browser.tabs.getCurrent();
getting.then(Create, onError);
return tabId;
}
}
@@ -338,144 +278,76 @@ var contextSetup = async function(requestDetails) {
console.log("(isolate)Tab error", error);
}
};
if (requestDetails == undefined) {
return requestDetails;
}
if (requestDetails.tabId > 0) {
if (proxyHost(requestDetails.url)) {
setcookie = browser.cookies.set({
firstPartyDomain: i2pHostName(requestDetails.url),
url: requestDetails.url,
secure: true
});
setcookie.then(onContextGotLog, onError);
return requestDetails;
}
console.log("(isolate)Request Details", requestDetails);
if (extensionHost(requestDetails.url)) {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(anyTabFind, onError);
return requestDetails;
}
if (i2pHost(requestDetails.url)) {
var setcookie = browser.cookies.set({
firstPartyDomain: i2pHostName(requestDetails.url),
url: requestDetails.url,
secure: true
});
setcookie.then(onContextGotLog, onError);
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(tabFind);
var mtab = tab.then(i2pTabFind, onError);
return requestDetails;
}
let routerhost = routerHost(requestDetails.url);
if (routerhost) {
if (routerhost === "i2ptunnelmgr") {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(i2ptunnelTabFind);
var mtab = tab.then(i2ptunnelTabFind, onError);
return requestDetails;
} else if (routerhost === "i2psnark") {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(snarkTabFind);
var mtab = tab.then(snarkTabFind, onError);
return requestDetails;
} else if (routerhost === "webmail") {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(mailTabFind);
var mtab = tab.then(mailTabFind, onError);
return requestDetails;
} else if (routerhost === "routerconsole") {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(routerTabFind);
var mtab = tab.then(routerTabFind, onError);
return requestDetails;
}
} else {
var tab = tabGet(requestDetails.tabId);
var mtab = tab.then(anyTabFind);
var mtab = tab.then(anyTabFind, onError);
return requestDetails;
}
}
//var tab = tabGet(requestDetails.tabId);
//var mtab = tab.then(anyTabFind);
if (typeof requestDetails == "number") {
tab = tabGet(requestDetails);
var mtab = tab.then(anyTabFind);
} else if (typeof requestDetails != undefined) {
if (typeof requestDetails.tabId > 0) {
tab = tabGet(requestDetails.tabId);
var mtab = tab.then(anyTabFind);
}
}
return requestDetails;
} catch (error) {
console.log("(isolate)Not an I2P request, blackholing", error);
}
};
function i2pHostName(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
return hostname;
}
function i2pHost(url) {
let hostname = i2pHostName(url);
return hostname.endsWith(".i2p");
}
function proxyHost(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
if (hostname == "proxy.i2p") {
return true;
}
return false;
}
function 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 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") {
console.log("(urlcheck) application path", final);
return "webmail";
} else if (final == "") {
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 {
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;
}
browser.webRequest.onBeforeRequest.addListener(
contextSetup,
{ urls: ["<all_urls>"] },
@@ -487,25 +359,3 @@ browser.webRequest.onBeforeSendHeaders.addListener(
{ 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@@ -3,50 +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">WebRTC is disabled by default, but can be enabled by checking this box.</span>
</li>
<li class="application">
<div class="panel-section-separator"></div>
<div class="panel-section-identity">
<div id="identity-list"></div>
</li>
<li class="application">
<input type="checkbox" id="disable-history" name="disablehistory" value="history">
<label for="disable-history">Disable History in I2P Tabs</label>
<span class="applicationDesc">History is automatically cleared when your I2P tabs are closed. If you want to clear history as you go, check this box.</span>
</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" target="_blank" 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" target="_blank" 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" target="_blank" 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" target="_blank" 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>
<div class="panel-section-separator"></div>
<a href="http://i2pforum.i2p" id="window-create-forum-panel">Visit the I2P Forums</a><br>
<a href="http://i2p-projekt.i2p/blog" id="window-create-news-panel">Get the latest I2P News</a><br>
<div class="panel-section-separator"></div>
<!--<div id="proxy-health">Proxy is:</div>-->
<input type="checkbox" id="enable-web-rtc" name="enablewebrtc" value="webrtc">
<label for="enable-web-rtc">Enable WebRTC <strong>with Proxy?</strong></label>
<div class="panel-section-separator"></div>
<!--<a href="#" id="check-i2p-control">Check I2P Router Health</a><div id="panel-section-i2pcontrol-check"></div>-->
<figure>
<img src="http://proxy.i2p/themes/console/images/favicon.ico" id="panel-proxy-check" alt="Proxy is not ready yet"/>
<figcaption>I2P Proxy is Ready</figcaption>
</figure>
<div class="panel-section-separator"></div>
<div class="panel-section-identity">
<div id="identity-list"></div>
</div>
</div>
<script src="context.js"></script>
<script src="privacy.js"></script>
<script src="info.js"></script>