58 Commits
0.77 ... 0.81

Author SHA1 Message Date
idk
a3bb8a6fe9 update pages 2020-11-07 21:44:07 -05:00
idk
3596a7e6fd Merge branch 'styles' into 'master'
Styles

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!7
2020-11-08 02:41:13 +00:00
idk
1d9b3b5001 Update changelog 2020-11-07 21:37:10 -05:00
idk
cf99bde088 change font colors on search boxes 2020-11-07 02:19:37 -05:00
idk
c3d73649a0 Switch back to a simpler light theme 2020-10-30 23:50:23 -04:00
idk
a4336b105f update the css a bit 2020-10-30 22:13:42 -04:00
idk
a56bf3101d update the css a bit 2020-10-30 22:13:29 -04:00
idk
7822c7b9fe Merge branch 'i2p-torrent-location-header' into 'master'
I2p torrent location header

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!5
2020-10-31 01:40:24 +00:00
idk
15fffd25dc make the css slightly better 2020-10-30 21:31:36 -04:00
idk
1c7ec493cb make the css slightly better 2020-10-30 21:30:55 -04:00
idk
11fd9efd31 make the css slightly better 2020-10-30 20:08:11 -04:00
idk
08a1e73008 disable localhost isolator for non-routerconsole pages, I am fairly sure it's safe now 2020-10-25 02:29:15 -04:00
idk
e09546d6bb fixup the screenshot 2020-10-12 17:59:41 -04:00
idk
fa0aedda92 fixup the links replacer 2020-10-12 01:19:50 -04:00
idk
105aaed014 update fix the case for onUpdated listeners 2020-10-11 23:43:28 -04:00
idk
fff55eadd6 update fix the case for onUpdated listeners 2020-10-11 23:43:14 -04:00
idk
db43f2760a trigger meta http-equiv when tabs are updated, instantly 2020-10-09 01:03:27 -04:00
idk
ba0d4abc53 add images and videos to the content replacer script for the bittorrent-as-cdn thing 2020-10-08 23:14:48 -04:00
idk
65636c2b5e add images and videos to the content replacer script for the bittorrent-as-cdn thing 2020-10-08 22:53:18 -04:00
idk
4c2a7978f2 add images and videos to the content replacer script for the bittorrent-as-cdn thing 2020-10-08 22:51:02 -04:00
idk
7e97ab766a undo broken check 2020-10-08 00:25:38 -04:00
idk
16b1990bd9 Only excempt snark URL's from proxy if they end do not end in a backslash, and contain /snark/ 2020-10-07 20:27:43 -04:00
idk
2c7b092376 x-i2p-torrentlocation working prototype, both Header-based and meta http-equiv based 2020-10-07 16:47:22 -04:00
idk
100f27b4be fix up some flow issues, should be OK this way 2020-10-07 12:55:26 -04:00
idk
357b1a93b4 Release the pinned apptabs 2020-09-25 23:36:35 -04:00
idk
d8d075bd76 Merge branch 'apptabs' into 'master'
Affix apptabs to front of tab order

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!4
2020-09-26 03:25:52 +00:00
idk
9fefb82c57 Merge branch 'master' into 'apptabs'
# Conflicts:
#   index.html
#   releases.atom
2020-09-26 03:25:27 +00:00
idk
566f987483 Affix apptabs to front of tab order 2020-09-25 23:20:30 -04:00
idk
0a0d065b6a Merge branch 'affix-apptabs-to-front' into 'master'
Affix apptabs to front

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!2
2020-09-26 03:04:05 +00:00
idk
69186671ed Merge branch 'master' into 'affix-apptabs-to-front'
# Conflicts:
#   debian/changelog
#   index.html
#   manifest.json
2020-09-25 03:29:57 +00:00
idk
ede59d7c3a Merge branch 'i2p-location-header' into 'master'
WIP I2P-Location Header

Closes #1

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!1
2020-09-25 03:25:03 +00:00
idk
4012bdea45 Update and release 2020-09-24 20:21:16 -04:00
idk
6d6dce88dd Update and release 2020-09-24 20:20:26 -04:00
idk
0ba0aafa7c Update and release 2020-09-24 20:19:10 -04:00
idk
87f9df4af7 update for i2p-location 2020-09-24 20:06:33 -04:00
idk
09de46cadf update for i2p-location 2020-09-24 20:06:24 -04:00
idk
a2be795853 TODO 2020-09-22 01:53:43 -04:00
idk
cf91b77e8d one last theme tweak 2020-09-22 01:51:55 -04:00
idk
a37387fa89 use meta tags too 2020-09-22 01:43:49 -04:00
idk
658f162193 use meta tags too 2020-09-22 01:42:02 -04:00
idk
1e71e8bdce Play nicer with user-supplied themes 2020-09-22 00:59:38 -04:00
idk
53b9732cae Switch to a dark theme 2020-09-21 17:18:53 -04:00
idk
c89bfa8f1e Refresh every tab when the extension is ready to force proper contextual identity 2020-09-21 13:44:26 -04:00
idk
cf7d137d00 fix xhr redirect thing when a router console page is passed to firefox as an argument at startup 2020-09-21 00:20:59 -04:00
idk
bc1ef95a16 fix xhr redirect thing when a router console page is passed to firefox as an argument at startup 2020-09-21 00:20:44 -04:00
idk
342ead307d working implementation of *header-based* x-i2p-location header, meta tag based to follow 2020-09-15 23:32:54 -04:00
idk
2bc6e9dfc2 working implementation of *header-based* x-i2p-location header, meta tag based to follow 2020-09-15 23:31:06 -04:00
idk
7219667fdb more work on alt headers and styles 2020-09-15 20:36:19 -04:00
idk
abc1882004 more work on alt headers and styles 2020-09-15 20:34:58 -04:00
idk
0d0656bcc0 more work on alt headers and styles 2020-09-15 20:21:19 -04:00
idk
bbda71c8b5 more work on alt headers and styles 2020-09-15 20:10:34 -04:00
idk
6eb6afab81 Fix up x-i2p-location 2020-09-15 19:01:05 -04:00
idk
a677552690 Switch some stuff about themes around, correct conditional for new redirector thing 2020-09-15 18:39:34 -04:00
idk
7758822256 update toopie.html 2020-09-09 23:23:02 -04:00
idk
4296fcb132 also do the torrent thing, since it actually happens in the same place and is actually really similar 2020-08-23 00:58:30 -04:00
idk
a7746d867b add first 1/4 of i2p-location header, this is the part that uses an actual header and not a meta head tag 2020-08-23 00:22:31 -04:00
idk
ea333b3cec used a standard order for apptabs 2020-07-08 17:57:41 -04:00
idk
b9ac5a5072 used a standard order for apptabs when they get pinned 2020-07-08 17:53:21 -04:00
44 changed files with 1598 additions and 916 deletions

View File

@@ -4,249 +4,249 @@ module.exports = {
es6: true,
webextensions: true
},
extends: "eslint:recommended",
extends: 'eslint:recommended',
globals: {
Atomics: "readonly",
SharedArrayBuffer: "readonly"
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",
'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",
'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": "off",
"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": "off",
"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",
'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': 'off',
'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': 'off',
'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": "off",
"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": "off",
"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": "off",
"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-unused-vars": "off",
"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": "off",
"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"]
'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': 'off',
'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': 'off',
'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': 'off',
'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-unused-vars': 'off',
'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': 'off',
'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']
}
};

3
.web-extension-id Normal file
View File

@@ -0,0 +1,3 @@
# This file was created by https://github.com/mozilla/web-ext
# Your auto-generated extension ID for addons.mozilla.org is:
i2ppb@eyedeekay.github.io

View File

@@ -37,11 +37,11 @@ clean: rc clean-artifacts
## EVEN RELEASES are AMO RELEASES
## ODD RELEASES are SELFHOSTED RELEASES
MOZ_VERSION=0.76
VERSION=0.75
MOZ_VERSION=0.82
VERSION=0.81
## INCREMENT THIS EVERY TIME YOU DO A RELEASE
LAST_VERSION=0.73
LAST_VERSION=0.79
YELLOW=F7E59A
ORANGE=FFC56D
@@ -97,20 +97,20 @@ xpi: getxpi
version:
sed -i 's|7647|7657|g' *.js* torrent/*.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
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)\",|g' manifest.json
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
sed -si 's|$(shell grep $(MOZ_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
moz-version:
sed -i 's|7647|7657|g' *.js* torrent/*.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
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
sed -si 's|$(shell grep $(VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
rhz-version:
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)1\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)1-rhizome\",|g' manifest.json
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)1-rhizome\",|g' manifest.json
sed -i 's|7657|7647|g' *.js* torrent/*.js*
zip: version
@@ -168,7 +168,7 @@ moz-sign: version clean-artifacts
@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."
$HOME/node_modules/web-ext-submit/extender.sh --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET)
$(HOME)/node_modules/web-ext-submit/extender.sh --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET)
make copyss
sleep 5
@@ -201,10 +201,10 @@ getxpi:
torrent: getxpi
rm -f "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent"
mktorrent -a http://zviyq72xcmjupynn5y2f5qa3u7bxyu34jnqmwt6czte2l7idxm7q.b32.i2p/announce \
mktorrent -a http://w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa.b32.i2p/a \
-a http://zviyq72xcmjupynn5y2f5qa3u7bxyu34jnqmwt6czte2l7idxm7q.b32.i2p/announce \
-a http://s5ikrdyjwbcgxmqetxb3nyheizftms7euacuub2hic7defkh3xhq.b32.i2p/a \
-a http://uajd4nctepxpac4c4bdyrdw7qvja2a5u3x25otfhkptcjgd53ioq.b32.i2p/announce \
-a http://w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa.b32.i2p/a \
-a http://explodie.org:6969/announce \
-a http://tracker.opentrackr.org:1337/announce \
-a http://tracker.kamigami.org:2710/announce \
@@ -283,6 +283,7 @@ fmt-js:
fixjsstyle options/*.js
fixjsstyle torrent/*.js
fixjsstyle i2pcontrol/*.js
fixjsstyle manifest.json
#find . -path ./node_modules -prune -o -name '*.json' -exec fixjsstyle --write {} \;
lint:

View File

@@ -10,6 +10,20 @@ user requests them. It also adds convenience and management features, like an
embedded I2P console and Bittorrent integration with clients using the
transmission-rpc API.
Privacy Policy
--------------
This browser extension does not collect any personal information. It requires
access to local storage and browsing data permissions in order to delete them
when directed to by the user. This browser extension does not transmit any
information to any third party, nor will it, ever.
This browser extension cannot influence telemetry carried out by browser vendors
to determine performance in their distribution channels, nor can it mitigate any
other browser vendor telemetry.
This browser extension is entirely Free, Open-Source software.
Installation(Cross-Platform):
-----------------------------
@@ -97,13 +111,19 @@ Usage:
console URL's and placing applications under their own origin.
* ![Visiting routerconsole](routerconsole.png)
* [Done] **Handle Torrents** by talking to i2psnark-rpc plugin and then
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
can.
adding them directly into the Firefox downloads drop-downs, menus, etc. Enable
the use of I2PSnark as a peer-to-peer delivery mechanism for media files.
* ![Visiting i2psnark](i2psnark.png)
* ![Monitoring torrents](transmissionrpc.png)
* [Started] Indicate the level of authenticity provided by TLS. TLS is
* ![Distribute your site as a torrent.](x-i2p-torrentlocation.png)
* [Started] **Indicate** the level of authenticity provided by TLS. TLS is
optional on I2P for now, but some sites offer it anyway. TLS support is
experimental and in the works.
* [Started] **Provide** alternate, in-I2P destinations for web sites that want to
mirror their content within I2P.
* [Started] **Enhance** the I2P browsing experience by allowing site developers
distribute some or all of their resources as torrents, allowing the torrents to
be treated effectively as a CDN.
* [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
@@ -173,11 +193,14 @@ Project uplift seems to have largely been accomplished?
* [Tor at the Heart: Firefox](https://blog.torproject.org/tor-heart-firefox) is
a blog about Tor and the relationship they have to Firefox re: TBB, Fusion.
The Old Version
---------------
The **Other** Version
---------------------
New versions of this extension create an I2P in Private Browsing mode instead.
Since this is a drastic change to the behavior of the old plugin, a new entry
New versions of this extension create an I2P in Private Browsing mode instead,
using container tabs.
Since this is a drastic change to the behavior of the old plugin, and since there
is no UI a new entry
for the new plugin has been made at a new location on addons.mozilla.org.
* This is the new version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/)
@@ -187,20 +210,6 @@ for the new plugin has been made at a new location on addons.mozilla.org.
Android usage:
--------------
Open the following link
[Github Releases Version](https://github.com/eyedeekay/i2psetproxy.js/releases/)
in the browser you want to use for I2P. Firefox will warn you that it is about
to install an extension and indicate the permissions required. Read them over
and when you're ready, accept them. That's all it should take, your browser is
now configured to use I2P.
Use the old version, on either an old version of Firefox(pre-68) or by enabling
this custom collection: [Recommended Plugins] https://addons.mozilla.org/en-US/firefox/collections/14614396/I2P-Browser-Fork/
### Android addons.mozilla.org(Temporarily Disabled)
If you would prefer to recieve automatic updates from AMO, the correct product
page for this plugin is
[I2P In Private Browsing](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/).
This absolutely requires a working outproxy. If you want to avoid the use of AMO
for updates, you can download the identical plugin from this repository's
releases page. The latest AMO Plugin will always be identical to the latest
github release, except for the version number, which must be incremented for
submission to AMO.

View File

@@ -16,13 +16,9 @@
"description": "Description of the extension."
},
"extensionVersion": {
"message": "0.71",
"message": "0.77",
"description": "Version of the extension."
},
"extensionStatus": {
"message": "It is a labs project for enhancing your I2P browsing experience.",
"description": "Release status of the extension."
},
"proxyFailedStatus": {
"message": "Proxy is not ready",
"description": "Proxy failed status."

BIN
alternate-address.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

View File

@@ -154,24 +154,10 @@ function isEmpty(obj) {
return true;
}
var oldtheme = null;
var getOldTheme = async function getOldTheme() {
let foundtheme = await browser.theme.getCurrent();
if (!isEmpty(foundtheme)) {
oldtheme = foundtheme;
console.log('Found old theme', oldtheme);
}
return oldtheme;
}
getOldTheme();
function themeWindow(window) {
// Check if the window is in private browsing
function onThemeError() {
console.log('got theme', oldtheme);
browser.theme.update(oldtheme);
console.log('theme color set error');
}
function logTabs(tabInfo) {
function onContextGotTheme(context) {
@@ -180,38 +166,42 @@ function themeWindow(window) {
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#FFC56D',
toolbar: '#FFC56D'
frame: '#363A68',
toolbar: '#363A68'
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#FFC56D',
toolbar: '#FFC56D'
frame: '#363A68',
toolbar: '#363A68'
}
});
}
browser.pageAction.setPopup({
tabId: tabInfo[0].id,
popup: 'security.html'
});
//console.log("(background) tabinfo", tabInfo[0].id)
browser.pageAction.show(tabInfo[0].id);
if (tabInfo[0].url.startsWith('https://')) {
browser.pageAction.setPopup({
tabId: tabInfo[0].id,
popup: 'security.html'
});
//console.log("(background) tabinfo", tabInfo[0].id)
browser.pageAction.show(tabInfo[0].id);
} else {
//browser.pageAction.hide(tabInfo[0].id);
}
} else if (context.name == routerpref) {
console.log('Active in Router Console window');
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#A4C8E1',
toolbar: '#A4C8E1'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#A4C8E1',
toolbar: '#A4C8E1'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
}
@@ -220,15 +210,15 @@ function themeWindow(window) {
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#D9D9D6',
toolbar: '#D9D9D6'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#D9D9D6',
toolbar: '#D9D9D6'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
}
@@ -237,15 +227,15 @@ function themeWindow(window) {
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#F7E59A',
toolbar: '#F7E59A'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#F7E59A',
toolbar: '#F7E59A'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
}
@@ -254,25 +244,18 @@ function themeWindow(window) {
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#A48FE1',
toolbar: '#A48FE1'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#A48FE1',
toolbar: '#A48FE1'
frame: '#4456B7',
toolbar: '#4456B7'
}
});
}
} else {
console.log('Not active in I2P window');
if (isEmpty(oldtheme)) {
browser.theme.reset();
} else {
browser.theme.update(window.id, oldtheme);
}
}
}
if (
@@ -282,10 +265,17 @@ function themeWindow(window) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onContextGotTheme, onThemeError);
} else if (isEmpty(oldtheme)) {
browser.theme.reset();
} else {
browser.theme.update(window.id, oldtheme);
}else {
console.log('Not active in I2P window');
function unSetTheme(them) {
console.log('unsetting theme', them);
if (Object.keys(them).length > 0) {
browser.theme.update(window.id, them.originalTheme);
}else {
browser.theme.update(window.id, { colors: null });
}
}
browser.storage.local.get('originalTheme').then(unSetTheme, onError);
}
}
@@ -435,11 +425,27 @@ gettingListenerInfo.then(got => {
});
function handleUpdated(updateInfo) {
if (updateInfo.theme) {
console.log(`Theme was applied: ${updateInfo.theme}`);
} else {
console.log("Theme was removed");
function maybeSet(them){
console.log("original theme found:", them, Object.keys(them).length)
try{
if ((Object.keys(them).length == 0) || them.originalTheme.colors == null && them.originalTheme.images == null && them.originalTheme.properties == null) {
if (updateInfo.theme.colors.frame != '#4456B7' && updateInfo.theme.colors.frame != '#363A68') {
function onSet(){
console.log("stored theme:", updateInfo.theme)
}
if (updateInfo.theme.colors != null || updateInfo.theme.images != null || updateInfo.theme.properties != null ) {
console.log("storing theme:", updateInfo.theme)
browser.storage.local.set({"originalTheme": updateInfo.theme}).then(onSet, onError)
}
}
}else{
console.log("keeping stored theme:", them)
}
}catch{
console.log("theme storage error")
}
}
browser.storage.local.get("originalTheme").then(maybeSet, onError);
}
browser.theme.onUpdated.addListener(handleUpdated);

View File

@@ -12,7 +12,6 @@ function contentUpdateById(id, message) {
contentUpdateById('text-section-header', 'extensionName');
contentUpdateById('description', 'extensionDescription');
contentUpdateById('i2pbrowser-version', 'extensionVersion');
contentUpdateById('beta', 'extensionStatus');
contentUpdateById('proxy-check', 'proxyFailedStatus');
// Control Section

View File

@@ -62,7 +62,7 @@ if (browser.contextualIdentities === undefined) {
for (let identity of identities) {
let row = document.createElement("div");
let span = document.createElement("span");
let span = document.createElement("div");
span.className = "identity";
span.innerText = identity.name;
span.style = `color: ${identity.color}`;

28
debian/changelog vendored
View File

@@ -1,8 +1,36 @@
i2psetproxy.js (0.81-1) UNRELEASED; urgency=low
* X-I2P-TorrentLocation header
* Visual tweaks
* Deprecate localhost browser container permanently
* Isolation rules improvements
-- idk <hankhill19580@gmail.com> Sat, 07 NOV 2020 21:34:25 -0400
i2psetproxy.js (0.79-1) UNRELEASED; urgency=low
* Pin application tabs to the front of the tab order
* Refine pageaction behavior
-- idk <hankhill19580@gmail.com> Mon, 24 SEP 2020 20:18:03 -0400
i2psetproxy.js (0.77-1) UNRELEASED; urgency=low
* Implement x-i2p-location header
-- idk <hankhill19580@gmail.com> Mon, 24 SEP 2020 20:18:03 -0400
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low
* Update bookmarks format
* Deprecate WebRTC State Management
-- idk <hankhill19580@gmail.com> Mon, 22 JUN 2020 11:22:37 -0400
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low
* Update bookmarks format
-- idk <hankhill19580@gmail.com> Mon, 22 JUN 2020 19:21:23 -0400
i2psetproxy.js (0.71-1) UNRELEASED; urgency=low

View File

@@ -7,7 +7,12 @@ function routerHost(url) {
if (final === 'i2ptunnelmgr' || final === 'i2ptunnel') {
console.log('(urlcheck) Tunnel application path', final);
return 'i2ptunnelmgr';
} else if (final === 'i2psnark' || final === 'torrents') {
} else if (
final === 'i2psnark' ||
final === 'torrents' ||
final.startsWith('transmission') ||
final.startsWith('tracker')
) {
console.log('(urlcheck) Torrent application path', final);
return 'i2psnark';
} else if (final === 'webmail' || final === 'susimail') {
@@ -15,13 +20,14 @@ function routerHost(url) {
return 'webmail';
} else if (final.startsWith('MuWire')) {
if (!url.includes('.png')) {
console.log('(urlcheck) MuWire application path', final);
return 'muwire';
console.log('(urlcheck) MuWire application path', final);
return 'muwire';
}
} else if (
final === 'home' ||
final === 'console' ||
final === 'dns' ||
final === 'sitemap' ||
final.startsWith('config')
) {
console.log('(urlcheck) Console application path', final);

167
home.css
View File

@@ -1,20 +1,20 @@
* {
padding: 0;
color: #1f1a24;
margin: 0
}
html {
height: 100%
}
a,
button {
color: #3b6bbf;
color: #1f1a24;
text-decoration: none;
background: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
outline: 0;
padding: 3px;
margin: auto
}
.applicationDesc {
color: #81888f;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
@@ -42,20 +42,18 @@ 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
}
.button-list {
min-height: 230px;
min-width: 230px
}
.background {
background-color: #f8f8ff;
height: 100%
}
p {
@@ -63,7 +61,6 @@ p {
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
@@ -72,12 +69,9 @@ p {
min-height: 3rem;
padding: 1rem;
margin: 1.5rem;
display: inline-block;
border: 1px solid #d9d9d6;
display: block;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
background: #f8f8ff;
min-width: 95%
min-width: 100%
}
#header,
.application-info,
@@ -87,23 +81,19 @@ p {
min-height: 3rem;
padding: 1rem;
margin-top: 1.5rem;
display: inline-block;
border: 1px solid #d9d9d6;
display: block;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
background: #f8f8ff;
min-width: 95%
min-width: 100%
}
h1 {
margin-right: auto;
margin: 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;
padding-left: 5%
color: #e6e6e7;
background: #1f1a24;
width: 100%;
border-radius: 2px 2px 0 0
}
h2,
h3 {
@@ -111,10 +101,10 @@ h3 {
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;
color: #e6e6e7;
border-radius: 2px 2px 0 0;
width: 90%;
background: #1f1a24;
width: 100%;
padding-left: 5%
}
h4 {
@@ -122,21 +112,17 @@ h4 {
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%;
background: #1f1a24;
width: 100%;
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;
@@ -153,19 +139,23 @@ h4 {
margin-bottom: 80px
}
ul {
margin-left: 2rem;
list-style: none
margin: auto;
border-radius: 2px;
width: 100%;
margin: 0;
padding: 0
}
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%
display: block;
text-align: center;
margin: 0;
padding: 0
}
.center {
display: block;
margin-left: auto;
margin-right: auto;
width: 50%
}
#readyness {
padding-top: 1rem;
@@ -173,12 +163,9 @@ li {
margin: 1rem;
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;
display: inline-block
display: block
}
#onboarding {
min-height: 5rem;
@@ -188,22 +175,22 @@ li {
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
border-radius: 2px
}
#i2pbrowser-description {
padding-top: 1rem;
padding-bottom: 1rem;
width: 50%;
min-width: 50%;
display: inline-block;
background: #dee2e6;
border: 1px solid #dee2e6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
display: block
}
html body ul.label-list li {
list-style: none;
float: left
}
html body ul.label-list li:nth-child(odd) {
clear: left
}
#linksExplain {
min-height: 5rem;
@@ -211,24 +198,15 @@ li {
margin: .5rem;
width: 30%;
min-width: 30%;
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
border-radius: 2px
}
#applicationExplain,
#controlExplain {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
width: 30%;
min-width: 30%;
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;
text-align: left!important;
float: left
}
#proxyReady {
@@ -237,13 +215,9 @@ li {
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline-block;
background: #d9d9d6;
display: block;
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
text-align: center!important
}
#proxyUnready {
min-height: 3rem;
@@ -251,13 +225,9 @@ li {
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline-block;
display: block;
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
text-align: center!important
}
#consoleOn {
min-height: 3rem;
@@ -265,13 +235,19 @@ li {
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline-block;
display: block;
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
text-align: center!important
}
.tabicon {
min-width: 64px;
min-height: 64px
}
li.application {
text-align: left
}
button.applicationName {
width: auto
}
.onboardingContent {
font-size: .8rem!important;
@@ -287,14 +263,13 @@ li {
opacity: 1
}
img {
max-width: 100%
max-width: 100%;
margin: 3%
}
img.readyness {
height: 100%;
width: auto
}
@media only screen and (max-width: 399px) {
.application-info {
display: none
}
input {
color: #1f1a24
}

View File

@@ -122,20 +122,20 @@
</p>
<ul>
<li>
<li class="application">
<a href="http://i2p-projekt.i2p/" id="window-visit-i2p">I2P Project Homepage:</a> <span class="applicationDesc" id="i2ppage">More information is available here.</span>
</li>
<li>
<li class="application">
<a href="/index.html" id="window-visit-homepage">Webextension Homepage:</a> <span class="applicationDesc" id="webpage">More information is available here.</span>
</li>
<li>
<a href="http://gittest.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox" id="window-visit-sources">Source Code:</a> <span class="applicationDesc" id="sources">Browse the source of this webextension or contribute here.</span>
<li class="application">
<a href="http://git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox" id="window-visit-sources">Source Code:</a> <span class="applicationDesc" id="sources">Browse the source of this webextension or contribute here.</span>
</li>
<li>
<a href="http://gittest.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox/-/releases" id="window-visit-releases">Releases:</a> <span class="applicationDesc" id="releases">Check for new releases here.</span>
<li class="application">
<a href="http://git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox/-/releases" id="window-visit-releases">Releases:</a> <span class="applicationDesc" id="releases">Check for new releases here.</span>
</li>
</ul>

12
host.js
View File

@@ -71,7 +71,8 @@ function routerHost(url) {
} else if (
final === 'i2psnark' ||
final === 'torrents' ||
final.startsWith('transmission')
final.startsWith('transmission') ||
final.startsWith('tracker')
) {
console.log('(urlcheck) Torrent application path', final);
return 'i2psnark';
@@ -110,6 +111,15 @@ function routerHost(url) {
if (hostname === control_host + ':' + control_port) {
return pathcheck(path);
}
if (hostname === control_host + ':' + '7662') {
return pathcheck(path);
}
if (hostname === 'localhost' + ':' + '7662') {
return pathcheck(path);
}
if (hostname === '127.0.0.1' + ':' + '7662') {
return pathcheck(path);
}
if (hostname === 'localhost' + ':' + control_port) {
return pathcheck(path);
}

Binary file not shown.

Binary file not shown.

BIN
icons/browse.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
icons/i2plogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,119 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
images/gear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

59
images/restart.svg Normal file
View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="restart.svg"
id="svg22"
version="1.1"
viewBox="0 0 512 512"
role="img"
class="svg-inline--fa fa-sync-alt fa-w-16"
data-icon="sync-alt"
data-prefix="fas"
focusable="false"
aria-hidden="true">
<metadata
id="metadata28">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs26" />
<sodipodi:namedview
inkscape:current-layer="svg22"
inkscape:window-maximized="1"
inkscape:window-y="31"
inkscape:window-x="0"
inkscape:cy="256"
inkscape:cx="256"
inkscape:zoom="1.6757812"
showgrid="false"
id="namedview24"
inkscape:window-height="1026"
inkscape:window-width="1920"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<path
style="fill:#526bce;fill-opacity:1"
id="path20"
d="M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z"
fill="currentColor" />
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

59
images/shutdown.svg Normal file
View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="shutdown.svg"
id="svg32"
version="1.1"
viewBox="0 0 512 512"
role="img"
class="svg-inline--fa fa-power-off fa-w-16"
data-icon="power-off"
data-prefix="fas"
focusable="false"
aria-hidden="true">
<metadata
id="metadata38">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs36" />
<sodipodi:namedview
inkscape:current-layer="svg32"
inkscape:window-maximized="1"
inkscape:window-y="31"
inkscape:window-x="0"
inkscape:cy="256"
inkscape:cx="256"
inkscape:zoom="1.6757812"
showgrid="false"
id="namedview34"
inkscape:window-height="1026"
inkscape:window-width="1920"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<path
style="fill:#526bce;fill-opacity:1"
id="path30"
d="M400 54.1c63 45 104 118.6 104 201.9 0 136.8-110.8 247.7-247.5 248C120 504.3 8.2 393 8 256.4 7.9 173.1 48.9 99.3 111.8 54.2c11.7-8.3 28-4.8 35 7.7L162.6 90c5.9 10.5 3.1 23.8-6.6 31-41.5 30.8-68 79.6-68 134.9-.1 92.3 74.5 168.1 168 168.1 91.6 0 168.6-74.2 168-169.1-.3-51.8-24.7-101.8-68.1-134-9.7-7.2-12.4-20.5-6.5-30.9l15.8-28.1c7-12.4 23.2-16.1 34.8-7.8zM296 264V24c0-13.3-10.7-24-24-24h-32c-13.3 0-24 10.7-24 24v240c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24z"
fill="currentColor" />
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,209 +1,233 @@
<!DOCTYPE html>
<html>
<head>
<title>I2P in Private Browsing Mode</title>
<link href="home.css" rel="stylesheet" type="text/css">
<link href="sidebar.css" rel="stylesheet" type="text/css">
<title>I2P in Private Browsing Mode</title>
<link rel="stylesheet" type="text/css" href="home.css" />
<link rel="stylesheet" type="text/css" href="sidebar.css" />
</head>
<body>
<h1>I2P in Private Browsing Mode(Firefox-Only)</h1>
<h1>I2P in Private Browsing Mode(Firefox-Only)</h1>
<p>This is an webextension which introduces a set of new "Private Browsing" modes to Firefox-based browsers(Supporting webextensions) that makes it easier to configure a browser to use I2P securely and adds features for making I2P applications easier to use. It does this by isolating I2P-specific settings to Contextual Identities within Firefox, then loading them automatically when the user requests them. It also adds convenience and management features, like an embedded I2P console and Bittorrent integration with clients using the transmission-rpc API.</p>
<p>This is an webextension which introduces a set of new "Private Browsing" modes
to Firefox-based browsers(Supporting webextensions) that makes it easier to
configure a browser to use I2P securely and adds features for making I2P
applications easier to use. It does this by isolating I2P-specific settings to
Contextual Identities within Firefox, then loading them automatically when the
user requests them. It also adds convenience and management features, like an
embedded I2P console and Bittorrent integration with clients using the
transmission-rpc API.</p>
<h2>Installation(Cross-Platform):</h2>
<h2>Privacy Policy</h2>
<p>For desktop users this addon is available from addons.mozilla.org, where you will be able to recive automatic updates: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">I2P in Private Browsing</a>.</p>
<p>This browser extension does not collect any personal information. It requires
access to local storage and browsing data permissions in order to delete them
when directed to by the user. This browser extension does not transmit any
information to any third party, nor will it, ever.</p>
<h2>Debian Installation:</h2>
<p>This browser extension cannot influence telemetry carried out by browser vendors
to determine performance in their distribution channels, nor can it mitigate any
other browser vendor telemetry. </p>
<p>Should you prefer, it is possible to install this extension system-wide by side-loading it into Debian. You can generate your own deb file by running the command:</p>
<p>This browser extension is entirely Free, Open-Source software.</p>
<pre><code> make deb
<h2>Installation(Cross-Platform):</h2>
<p>For desktop users this addon is available from addons.mozilla.org, where you
will be able to recive automatic updates:
<a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">I2P in Private Browsing</a>.</p>
<h2>Debian Installation:</h2>
<p>Should you prefer, it is possible to install this extension system-wide by
side-loading it into Debian. You can generate your own deb file by running the
command:</p>
<pre><code> make deb
</code></pre>
<p>and then you can install it with:</p>
<pre><code> sudo apt install ../i2psetproxy.js_*.deb
<p>and then you can install it with:</p>
<pre><code> sudo apt install ../i2psetproxy.js_*.deb
</code></pre>
<h2>Bittorrent Download:</h2>
<p>The self-hosted plugin is available from bittorrent both within the I2P and Clearnet Bittorrent network(With a web seed to support it in case one goes dead).</p>
<h2>Bittorrent Download:</h2>
<ul>
<li>
<a href="">Magnet Link</a>
</li>
<p>The self-hosted plugin is available from bittorrent both within the I2P and
Clearnet Bittorrent network(With a web seed to support it in case one goes
dead).</p>
<li>
<a href="./i2ppb@eyedeekay.github.io.xpi.torrent">Get the .torrent file</a>
</li>
</ul>
<ul>
<li><a href="magnet:?xt=urn:btih:5f45673bc107ec42a8b4d02aa4d5d7487949fc66">Magnet Link</a></li>
<li><a href="./i2ppb@eyedeekay.github.io.xpi.torrent">Get the .torrent file</a></li>
</ul>
<h2>Usage:</h2>
<h2>Usage:</h2>
<ul>
<li>Basically, it "Just Works." After you install the plugin, browsing to an I2P domain will automatically stop the current tab and re-open the I2P site in an I2P Browser tab.</li>
<ul>
<li>Basically, it "Just Works." After you install the plugin, browsing to an I2P
domain will automatically stop the current tab and re-open the I2P site in an
I2P Browser tab.</li>
<li>Besides that, four bookmarks are added to the "Bookmarks Toolbar," which
will take you to visit your Java I2P applications, or the "Simplified I2P
Landing Page" embedded in the plugin:</li>
<li><img src="lander.png" alt="Landing page" title="" /></li>
<li>Also, there's a menu for accessing I2P functionality while you're browsing.
It lets you control a few settings in a granular way.</li>
<li><img src="menu.png" alt="Menu" title="" /></li>
<li>You can re-enable WebRTC but force it to always use the proxy that is
enforced by the tab.</li>
<li>You can either force the browser to delete all history for I2P sites
immediately, or you can close all your I2P Browser tabs at once and delete
the history for I2P browsing when you're done.</li>
<li>That's all there is to it! Your browser is configured to safely use and
administer I2P.</li>
<li>Optionally, you can add I2PSnark-RPC and use Bittorrent-over-I2P via the
transmission-rpc interface. To do this, have a look at the torrent guide:
<a href="torrent/index.html">Torrent guide</a></li>
</ul>
<li>Besides that, four bookmarks are added to the "Bookmarks Toolbar," which will take you to visit your Java I2P applications, or the "Simplified I2P Landing Page" embedded in the plugin:</li>
<h3>Features</h3>
<li><img alt="Landing page" src="lander.png" title="">
</li>
<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><img src="i2psetproxy.js.png" alt="Visiting i2p-projekt.i2p" title="" /></li>
<li>[done] <strong>Indicate</strong> the I2P browser is in use visually. Find an
acceptable way to indicate it on Android.</li>
<li><img src="susimail.png" alt="Visiting webmail" title="" /></li>
<li>[done] <strong>Set</strong> the http proxy to use the local I2P proxy automatically.
Provide specific configuration for other types of I2P proxies(SOCKS,
isolating HTTP)</li>
<li>[done] <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><img src="i2ptunnel.png" alt="Visiting i2ptunnel" title="" /></li>
<li>[ready] <strong>Provide</strong> help in a variety of languages.</li>
<li>[done] <strong>Monitor</strong> 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.</li>
<li><img src="toopie.png" alt="Visiting toopie.html" title="" /></li>
<li>[Done] <strong>Handle</strong> router console applications under their own origins and
within their own contextual identity. (1) The router console is automatically
confined to it's own container tab. (2) Use a custom protocol handler to
place each i2p application/plugin under it's own origin, shortening router
console URL's and placing applications under their own origin.</li>
<li><img src="routerconsole.png" alt="Visiting routerconsole" title="" /></li>
<li>[Done] <strong>Handle Torrents</strong> by talking to i2psnark-rpc plugin and then
adding them directly into the Firefox downloads drop-downs, menus, etc. Enable
the use of I2PSnark as a peer-to-peer delivery mechanism for media files.</li>
<li><img src="i2psnark.png" alt="Visiting i2psnark" title="" /></li>
<li><img src="transmissionrpc.png" alt="Monitoring torrents" title="" /></li>
<li><img src="x-i2p-torrentlocation.png" alt="Distribute your site as a torrent." title="" /></li>
<li>[Started] <strong>Indicate</strong> the level of authenticity provided by TLS. TLS is
optional on I2P for now, but some sites offer it anyway. TLS support is
experimental and in the works.</li>
<li>[Started] <strong>Provide</strong> alternate, in-I2P destinations for web sites that want to
mirror their content within I2P.</li>
<li>[Started] <strong>Enhance</strong> the I2P browsing experience by allowing site developers
distribute some or all of their resources as torrents, allowing the torrents to
be treated effectively as a CDN.</li>
<li>[barely started] <strong>Isolate</strong> traffic by contextual identity to it's own HTTP
Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The
contextual identities. For now, the contextual identities used to manage
browsing are "I2P Browsing" and "Web Browsing" where I2P Browsing is capable
of using an outproxy but in the case of traffic destined for the clearnet
does not do header rewriting, and Web Browsing falls back to the Proxy
configured in Firefox. The I2P Browsing will be expanded to
<ul>
<li>I2P Amnesiac Browsing: Use for General Browsing, stores no history and
uses an HTTP Proxy with a very short tunnel-close timeout and no key-reuse.</li>
<li>I2P Social Networking: Use this for logging into social network accounts,
forums, and other interactive asynchronous public communication platforms
where your identity is behaviorally linkable. This has a very long
tunnel-close timeout and key-reuse until specifically invoked.</li>
<li>I2P Blogging: Use this for posting content to the web interface of your
blog or to other similar websites that you create content on.</li>
</ul></li>
<li><img src="clearweb.png" alt="Visiting clearweb" title="" /></li>
</ul>
<li>Also, there's a menu for accessing I2P functionality while you're browsing. It lets you control a few settings in a granular way.</li>
<h3>Video</h3>
<li><img alt="Menu" src="menu.png" title="">
</li>
<ul>
<li><img src="i2psetproxy.js.gif" alt="Video of the plugin in action" title="" /></li>
</ul>
<li>You can re-enable WebRTC but force it to always use the proxy that is enforced by the tab.</li>
<h2>Documents</h2>
<li>You can either force the browser to delete all history for I2P sites immediately, or you can close all your I2P Browser tabs at once and delete the history for I2P browsing when you're done.</li>
<ul>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Browser.Design.Documentation.pdf">Browser Outline</a></strong>: This document is an outline of each of
the browser extension's feature panels in presentation form.</li>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Landing.Page.Documentation.pdf">Smart Lander Design</a></strong>: This is the original outline of
the smart landing page which became the I2P home page within the browser and
the drop-down control panel.</li>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/wiki/Other-Extensions">Other extensions</a></strong>: and how they work with this one.</li>
</ul>
<li>That's all there is to it! Your browser is configured to safely use and administer I2P.</li>
<h2>Super Extra Important Background Info:</h2>
<li>Optionally, you can add I2PSnark-RPC and use Bittorrent-over-I2P via the transmission-rpc interface. To do this, have a look at the torrent guide: <a href="torrent/index.html">Torrent guide</a>
</li>
</ul>
<p>This plugin's viability is directly related to the viability of Mozilla and
Tor's work on hardening Firefox itself and of particular interest are the
"Uplift" and "Fusion(Firefox Using Onions)" projects.</p>
<h3>Features</h3>
<h3>Links about Project Uplift</h3>
<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>
<ul>
<li><a href="https://wiki.mozilla.org/Security/Tor_Uplift">Tor Uplift</a> is a project which
brings important features of the Tor Browser to the mainstream of Firefox
users by including patches from Tor Browser Bundle into Firefox where it is
appropriate.</li>
<li><a href="https://wiki.mozilla.org/Security/FirstPartyIsolation">First Party Isolation</a>
is a feature in Firefox and other browsers which keeps information from
leaking across first-party domains.</li>
<li><a href="https://wiki.mozilla.org/Security/Fingerprinting">Fingerprinting</a> is a
technique where a tracker attempts to extract unique information about a user
from a side-channel in order to create an identifier that can be used to
correlate the user across many sites.</li>
<li><a href="https://wiki.mozilla.org/Security/Fennec%2BTor_Project">Fennec</a> is Firefox
for Android and this link has some analysis of the privacy consequences of the
Android platform.</li>
<li><a href="https://wiki.mozilla.org/Security/Tor_Uplift/Tracking">Tracking</a> in Firefox
is surveyed here.</li>
</ul>
<li><img alt="Visiting i2p-projekt.i2p" src="i2psetproxy.js.png" title="">
</li>
<p>Project uplift seems to have largely been accomplished?</p>
<li>[done] <strong>Indicate</strong> the I2P browser is in use visually. Find an acceptable way to indicate it on Android.</li>
<h3>Links about Project Fusion</h3>
<li><img alt="Visiting webmail" src="susimail.png" title="">
</li>
<ul>
<li><a href="https://wiki.mozilla.org/Security/Fusion">Project Fusion</a> or Firefox using
Onions is a joint Mozilla/Tor effort to create an enhanced Private Browsing
mode for Firefox which uses Tor.</li>
<li><a href="https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject">Notes</a>
from a meeting about Fusion.</li>
<li><a href="https://blog.torproject.org/tor-heart-firefox">Tor at the Heart: Firefox</a> is
a blog about Tor and the relationship they have to Firefox re: TBB, Fusion.</li>
</ul>
<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>
<h2>The <strong>Other</strong> Version</h2>
<li>[done] <strong>Disable</strong> risky webRTC features/offer the option to re-enable them with the proxy enforced.</li>
<p>New versions of this extension create an I2P in Private Browsing mode instead,
using container tabs.</p>
<li>[done] <strong>Change</strong> the color of the browser window to indicate that I2P is in use</li>
<p>Since this is a drastic change to the behavior of the old plugin, and since there
is no UI a new entry
for the new plugin has been made at a new location on addons.mozilla.org.</p>
<li><img alt="Visiting i2ptunnel" src="i2ptunnel.png" title="">
</li>
<ul>
<li><p>This is the new version: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">[link]</a></p></li>
<li><p>This is the old version: <a href="https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/">[link]</a></p></li>
</ul>
<li>[ready] <strong>Provide</strong> help in a variety of languages.</li>
<h2>Android usage:</h2>
<li>[done] <strong>Monitor</strong> 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.</li>
<li><img alt="Visiting toopie.html" src="toopie.png" title="">
</li>
<li>[Done] <strong>Handle</strong> router console applications under their own origins and within their own contextual identity. (1) The router console is automatically confined to it's own container tab. (2) Use a custom protocol handler to place each i2p application/plugin under it's own origin, shortening router console URL's and placing applications under their own origin.</li>
<li><img alt="Visiting routerconsole" src="routerconsole.png" title="">
</li>
<li>[Done] <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>
<li><img alt="Visiting i2psnark" src="i2psnark.png" title="">
</li>
<li><img alt="Monitoring torrents" src="transmissionrpc.png" title="">
</li>
<li>[Started] Indicate the level of authenticity provided by TLS. TLS is optional on I2P for now, but some sites offer it anyway. TLS support is experimental and in the works.</li>
<li>[barely started] <strong>Isolate</strong> traffic by contextual identity to it's own HTTP Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The contextual identities. For now, the contextual identities used to manage browsing are "I2P Browsing" and "Web Browsing" where I2P Browsing is capable of using an outproxy but in the case of traffic destined for the clearnet does not do header rewriting, and Web Browsing falls back to the Proxy configured in Firefox. The I2P Browsing will be expanded to
<ul>
<li>I2P Amnesiac Browsing: Use for General Browsing, stores no history and uses an HTTP Proxy with a very short tunnel-close timeout and no key-reuse.</li>
<li>I2P Social Networking: Use this for logging into social network accounts, forums, and other interactive asynchronous public communication platforms where your identity is behaviorally linkable. This has a very long tunnel-close timeout and key-reuse until specifically invoked.</li>
<li>I2P Blogging: Use this for posting content to the web interface of your blog or to other similar websites that you create content on.</li>
</ul>
</li>
<li><img alt="Visiting clearweb" src="clearweb.png" title="">
</li>
</ul>
<h3>Video</h3>
<ul>
<li><img alt="Video of the plugin in action" src="i2psetproxy.js.gif" title="">
</li>
</ul>
<h2>Documents</h2>
<ul>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Browser.Design.Documentation.pdf">Browser Outline</a></strong>: This document is an outline of each of the browser extension's feature panels in presentation form.</li>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Landing.Page.Documentation.pdf">Smart Lander Design</a></strong>: This is the original outline of the smart landing page which became the I2P home page within the browser and the drop-down control panel.</li>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/wiki/Other-Extensions">Other extensions</a></strong>: and how they work with this one.</li>
</ul>
<h2>Super Extra Important Background Info:</h2>
<p>This plugin's viability is directly related to the viability of Mozilla and Tor's work on hardening Firefox itself and of particular interest are the "Uplift" and "Fusion(Firefox Using Onions)" projects.</p>
<h3>Links about Project Uplift</h3>
<ul>
<li>
<a href="https://wiki.mozilla.org/Security/Tor_Uplift">Tor Uplift</a> is a project which brings important features of the Tor Browser to the mainstream of Firefox users by including patches from Tor Browser Bundle into Firefox where it is appropriate.
</li>
<li>
<a href="https://wiki.mozilla.org/Security/FirstPartyIsolation">First Party Isolation</a> is a feature in Firefox and other browsers which keeps information from leaking across first-party domains.
</li>
<li>
<a href="https://wiki.mozilla.org/Security/Fingerprinting">Fingerprinting</a> is a technique where a tracker attempts to extract unique information about a user from a side-channel in order to create an identifier that can be used to correlate the user across many sites.
</li>
<li>
<a href="https://wiki.mozilla.org/Security/Fennec%2BTor_Project">Fennec</a> is Firefox for Android and this link has some analysis of the privacy consequences of the Android platform.
</li>
<li>
<a href="https://wiki.mozilla.org/Security/Tor_Uplift/Tracking">Tracking</a> in Firefox is surveyed here.
</li>
</ul>
<p>Project uplift seems to have largely been accomplished?</p>
<h3>Links about Project Fusion</h3>
<ul>
<li>
<a href="https://wiki.mozilla.org/Security/Fusion">Project Fusion</a> or Firefox using Onions is a joint Mozilla/Tor effort to create an enhanced Private Browsing mode for Firefox which uses Tor.
</li>
<li>
<a href="https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject">Notes</a> from a meeting about Fusion.
</li>
<li>
<a href="https://blog.torproject.org/tor-heart-firefox">Tor at the Heart: Firefox</a> is a blog about Tor and the relationship they have to Firefox re: TBB, Fusion.
</li>
</ul>
<h2>The Old Version</h2>
<p>New versions of this extension create an I2P in Private Browsing mode instead. Since this is a drastic change to the behavior of the old plugin, a new entry for the new plugin has been made at a new location on addons.mozilla.org.</p>
<ul>
<li>
<p>This is the new version: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">[link]</a></p>
</li>
<li>
<p>This is the old version: <a href="https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/">[link]</a></p>
</li>
</ul>
<h2>Android usage:</h2>
<p>Open the following link <a href="https://github.com/eyedeekay/i2psetproxy.js/releases/">Github Releases Version</a> in the browser you want to use for I2P. Firefox will warn you that it is about to install an extension and indicate the permissions required. Read them over and when you're ready, accept them. That's all it should take, your browser is now configured to use I2P.</p>
<h3>Android addons.mozilla.org(Temporarily Disabled)</h3>
<p>If you would prefer to recieve automatic updates from AMO, the correct product page for this plugin is <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">I2P In Private Browsing</a>. This absolutely requires a working outproxy. If you want to avoid the use of AMO for updates, you can download the identical plugin from this repository's releases page. The latest AMO Plugin will always be identical to the latest github release, except for the version number, which must be incremented for submission to AMO.</p>
<p>Use the old version, on either an old version of Firefox(pre-68) or by enabling
this custom collection: [Recommended Plugins] https://addons.mozilla.org/en-US/firefox/collections/14614396/I2P-Browser-Fork/</p>
</body>
</html>

View File

@@ -1,24 +1,27 @@
body,
html {
width: 50rem
}
a {
margin: 10px
width: 450px
}
.panel {
margin: 5px
margin: 5px;
width: 450px;
height: 450px
}
.panel-section-header {
width: 450px
}
#text-section-torrents-header {
width: 450px
}
span.identity {
width: 100px;
display: inline-block;
width: 450px;
display: block;
margin-left: 1em
}
figcaption {
display: inline
display: block
}
.section-header {
display: flex;
flex-direction: row;
margin-bottom: 8px
}
p {
@@ -56,5 +59,8 @@ img.readyness {
display: none
}
.torrent-progress {
width: 100%
width: 90%
}
.tabicon {
width: 32px
}

33
info.js
View File

@@ -79,6 +79,30 @@ document.addEventListener("click", clickEvent => {
} else if (clickEvent.target.id === "label-router-shutdown") {
console.log("attempting to initiate graceful shutdown");
RouterManager("ShutdownGraceful");
} else if (clickEvent.target.id === "label-router-status") {
if (document.getElementById("label-status-list").style.display !== "none"){
console.log("hiding label-status-list");
document.getElementById("label-status-list").style.display = "none"
}else{
console.log("showing label-status-list");
document.getElementById("label-status-list").style.display = "block"
}
} else if (clickEvent.target.id === "label-router-peers") {
if (document.getElementById("label-peers-list").style.display !== "none"){
console.log("hiding label-peers-list");
document.getElementById("label-peers-list").style.display = "none"
}else{
console.log("showing label-peers-list");
document.getElementById("label-peers-list").style.display = "block"
}
} else if (clickEvent.target.id === "label-router-bandwidth") {
if (document.getElementById("label-bandwidth-list").style.display !== "none"){
console.log("hiding label-bandwidth-list");
document.getElementById("label-bandwidth-list").style.display = "none"
}else{
console.log("showing label-bandwidth-list");
document.getElementById("label-bandwidth-list").style.display = "block"
}
} else if (clickEvent.target.id === "search-submit") {
console.log("attempting to create search tab");
goSearch();
@@ -133,6 +157,15 @@ document.addEventListener("click", clickEvent => {
clickEvent.preventDefault();
});
window.onload = function(e){
if (document.getElementById("label-peers-list") != null) {
document.getElementById("label-peers-list").style.display = "none"
}
if (document.getElementById("label-bandwidth-list") != null) {
document.getElementById("label-bandwidth-list").style.display = "none"
}
}
function proxyReadiness() {
console.log(this.responseText);
}

76
issues.csv Normal file
View File

@@ -0,0 +1,76 @@
"title","description"
"Moar Bookmarks","A larger set of default bookmarks in their own directory would probably be good. Stuff like the forums, zzz's forums, gitlab, stats, identiguy, postman, echobot test, fingerprint test, etc."
"privacy-breach-generic false positive with lintian","We make a request to proxy.i2p, a sort of loopback site, to ensure that the proxy is ready for the browser and provide user feedback. Lintian sees proxy.i2p as a remote site, which it isn't. Given this, the Warning issued by lintian is a false positive. This should be handled somehow."
"App-tabs for Project sites?","Not sure if this is a good idea. May want to talk to Simply Secure about it."
"Descriptive Proxy Error Page","When the proxy isn't ready, but the user enters an I2P browsing tab, provide a descriptive error page to guide the user to a solution, even if that solution is to tell them to wait 2 minutes.
States should be described:
- Router Not Present: There is no indication that I2P is installed on the system. Direct them to an I2P distribution.
- HTTP Proxy Not Ready: The router is present, but the HTTP Proxy is not up yet. Wait 2 minutes, if t>2 minutes, direct them to /i2ptunnel to troubleshoot."
"More intuitive history management, better programming interface","Right now history management is from before it used contextual identities, with some hacks on top. It needs to be changed to a better interface, which simply takes a contextual identity and clears history based on that information. This will improve security, reliability, and be useful in non-I2P contexts in the future."
"Reseed over WebRTC Data Channel","This can't be done in just this extension, but this extension is probably an important component of a future plan in which this is straightforward. This is the trickiest thing I've tried so far, K, let's define some phases here...
Phase 0: Design
=============
We're pretty different from Tor in the places where Snowflake would really matter, but it's an inspiring effort and a cool product. This process probably won't bear much resemblance to Snowflake when it's all designed, but Snowflake was the original inspiration for the idea.
What we want to do is make it possible for I2P users to easily reseed eachother in a peer-to-peer way when necessary. It must be done no more often than a normal reseed, and it must only ever be client initiated.
This is **not** a webRTC transport for I2P. That would be an entirely different project. Especially if it were to do something genuinely insane like try to incorporate browser users not otherwise running I2P into the routing process. That would be crazy, right? Right? (It might not actually be that crazy but I have enough to think about right now). This is only for reseeds.
Questions
--------------
- Where to get the reseed file? Locally or from a reseed server? Probably a server, and we act as a proxy, but we need to examine advantages and disadvantages of each. Maybe both, server then a local fallback?
- Do we need to geolocate and never fetch a reseed file for a user in a country which is already automatically in hidden mode? Probably yes. Might want to never make them reseed helpers anyway.
- How to distribute the reseed file? If it comes from a server it will be signed by a key we already trust, that's fine, but if it comes from somewhere local we may want to use an interstitial
Components
-----------------
- Browser Extension - This repo. We use it because we can to some extent assume that people using this extension are also using I2P and can thus provide a reseed from a local source if need be.
- Javascript Import - Placed on web pages, a'la Snowflake and or Flashproxy. Shows a download link that says Download reseed file over WebRTC, uses a (random?) extension user.
- Native Proxy - Runs locally, obviates the need to download the reseed in a browser by fetching it over WebRTC on behalf of the router. Will start out as a Bridge but eventually be incorporated into I2P if successful.
1. Go version, using pion/webrtc
2. Java version, using whatever that Guardian Project library is probably
Phase 1: Manual Mode
=================
Components required
-----------------------------
- Browser Extension
- Javascript Import
Phase 2: Bridged Prototype
====================
- Native Proxy, Go Version
Phase 3: Router Incorporation
======================
- Native Proxy, Java Version
"
"Torbrowser","Are there any plans to support the Torbrowser?
"
"Use pageAction to indicate Security Status of I2P Sites(TLS, etc)","https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/pageAction"
"SSH in the Browser?","TODO"
"Dat Support?","TODO"
"Secure configuration of tunnels for RPC remotes","Eventually we'll have to have configuration for different RPC endpoints for I2PControl and Bittorrent, from there it's not a stretch to let remote clients be controlled over i2p tunnels as well, but in this case we need to make sure that we require the password to be changed from the default and possibly look into using encrypted leasesets here too."
"Tidy up the settings and document where they come from and what they do","Now that this is getting more and cooler features, I need to go over what all the settings are, how they're configured, which ones are obsolete and which ones needs to be created to fully realize all the cool stuff this plugin can do. This should be done before I even introduce settings for the torrent RPC protocols which makes it another blocker for the next version."
"Internationalize website","The plugin itself supports multiple languages, but the website does not. I should fix that up ASAP."
"Plugin Tab: I2P-Bote","An I2P-Bote plugin tab is a good idea too, but a low priority since Bote isn't very active right now."
"Style Guide","Develop a consistent style guide."
"Cool idea: tab or window.privacy API","Design webextension experiment."
"Uplifting 3: Letterboxing","I dunno what's up here. This setting is privacy.resistFingerprinting.letterboxing=true or something like that. If seems like the privacy.websites.resistFingerprinting API should enables privacy.resistFingerprinting."
"Uplifting 2: audio stuff","Work with Mozilla to disable fingerprintable audio API's when privacy.resistFingerprinting=true."
"Uplifting 1: webgl","Work with Mozilla to finish webgl requirements for resistFingerprinting."
"FoxyProxy Compatibility?","This extension currently *Breaks the expected behavior of FoxyProxy* by enforcing it's rules over those described by FoxyProxy. This one might be more trouble than it's worth, in fact I think it probably is, but if it isn't, this is a nice-to-have for some of the longtime Foxy users to ease their transition. "
"Android","Somewhere in the past few releases I broke Android, probably while I was making the window-management less irritating. Find+fix."
"Whonix","I2P integration in Whonix is running into the problem of making the router console available(Which requires either a proxy exception or an extra proxy like Privoxy) without making the whole localhost available. Since that's a problem this can solve, after I deal with the linting stuff I need to get back in touch with them. Right now I'm also (ab)using include-binaries, I'll need to resolve that too."
"Update channel for non-AMO Webextension","TODO:"
1 title description
2 Moar Bookmarks A larger set of default bookmarks in their own directory would probably be good. Stuff like the forums, zzz's forums, gitlab, stats, identiguy, postman, echobot test, fingerprint test, etc.
3 privacy-breach-generic false positive with lintian We make a request to proxy.i2p, a sort of loopback site, to ensure that the proxy is ready for the browser and provide user feedback. Lintian sees proxy.i2p as a remote site, which it isn't. Given this, the Warning issued by lintian is a false positive. This should be handled somehow.
4 App-tabs for Project sites? Not sure if this is a good idea. May want to talk to Simply Secure about it.
5 Descriptive Proxy Error Page When the proxy isn't ready, but the user enters an I2P browsing tab, provide a descriptive error page to guide the user to a solution, even if that solution is to tell them to wait 2 minutes. States should be described: - Router Not Present: There is no indication that I2P is installed on the system. Direct them to an I2P distribution. - HTTP Proxy Not Ready: The router is present, but the HTTP Proxy is not up yet. Wait 2 minutes, if t>2 minutes, direct them to /i2ptunnel to troubleshoot.
6 More intuitive history management, better programming interface Right now history management is from before it used contextual identities, with some hacks on top. It needs to be changed to a better interface, which simply takes a contextual identity and clears history based on that information. This will improve security, reliability, and be useful in non-I2P contexts in the future.
7 Reseed over WebRTC Data Channel This can't be done in just this extension, but this extension is probably an important component of a future plan in which this is straightforward. This is the trickiest thing I've tried so far, K, let's define some phases here... Phase 0: Design ============= We're pretty different from Tor in the places where Snowflake would really matter, but it's an inspiring effort and a cool product. This process probably won't bear much resemblance to Snowflake when it's all designed, but Snowflake was the original inspiration for the idea. What we want to do is make it possible for I2P users to easily reseed eachother in a peer-to-peer way when necessary. It must be done no more often than a normal reseed, and it must only ever be client initiated. This is **not** a webRTC transport for I2P. That would be an entirely different project. Especially if it were to do something genuinely insane like try to incorporate browser users not otherwise running I2P into the routing process. That would be crazy, right? Right? (It might not actually be that crazy but I have enough to think about right now). This is only for reseeds. Questions -------------- - Where to get the reseed file? Locally or from a reseed server? Probably a server, and we act as a proxy, but we need to examine advantages and disadvantages of each. Maybe both, server then a local fallback? - Do we need to geolocate and never fetch a reseed file for a user in a country which is already automatically in hidden mode? Probably yes. Might want to never make them reseed helpers anyway. - How to distribute the reseed file? If it comes from a server it will be signed by a key we already trust, that's fine, but if it comes from somewhere local we may want to use an interstitial Components ----------------- - Browser Extension - This repo. We use it because we can to some extent assume that people using this extension are also using I2P and can thus provide a reseed from a local source if need be. - Javascript Import - Placed on web pages, a'la Snowflake and or Flashproxy. Shows a download link that says Download reseed file over WebRTC, uses a (random?) extension user. - Native Proxy - Runs locally, obviates the need to download the reseed in a browser by fetching it over WebRTC on behalf of the router. Will start out as a Bridge but eventually be incorporated into I2P if successful. 1. Go version, using pion/webrtc 2. Java version, using whatever that Guardian Project library is probably Phase 1: Manual Mode ================= Components required ----------------------------- - Browser Extension - Javascript Import Phase 2: Bridged Prototype ==================== - Native Proxy, Go Version Phase 3: Router Incorporation ====================== - Native Proxy, Java Version
8 Torbrowser Are there any plans to support the Torbrowser?
9 Use pageAction to indicate Security Status of I2P Sites(TLS, etc) https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/pageAction
10 SSH in the Browser? TODO
11 Dat Support? TODO
12 Secure configuration of tunnels for RPC remotes Eventually we'll have to have configuration for different RPC endpoints for I2PControl and Bittorrent, from there it's not a stretch to let remote clients be controlled over i2p tunnels as well, but in this case we need to make sure that we require the password to be changed from the default and possibly look into using encrypted leasesets here too.
13 Tidy up the settings and document where they come from and what they do Now that this is getting more and cooler features, I need to go over what all the settings are, how they're configured, which ones are obsolete and which ones needs to be created to fully realize all the cool stuff this plugin can do. This should be done before I even introduce settings for the torrent RPC protocols which makes it another blocker for the next version.
14 Internationalize website The plugin itself supports multiple languages, but the website does not. I should fix that up ASAP.
15 Plugin Tab: I2P-Bote An I2P-Bote plugin tab is a good idea too, but a low priority since Bote isn't very active right now.
16 Style Guide Develop a consistent style guide.
17 Cool idea: tab or window.privacy API Design webextension experiment.
18 Uplifting 3: Letterboxing I dunno what's up here. This setting is privacy.resistFingerprinting.letterboxing=true or something like that. If seems like the privacy.websites.resistFingerprinting API should enables privacy.resistFingerprinting.
19 Uplifting 2: audio stuff Work with Mozilla to disable fingerprintable audio API's when privacy.resistFingerprinting=true.
20 Uplifting 1: webgl Work with Mozilla to finish webgl requirements for resistFingerprinting.
21 FoxyProxy Compatibility? This extension currently *Breaks the expected behavior of FoxyProxy* by enforcing it's rules over those described by FoxyProxy. This one might be more trouble than it's worth, in fact I think it probably is, but if it isn't, this is a nice-to-have for some of the longtime Foxy users to ease their transition.
22 Android Somewhere in the past few releases I broke Android, probably while I was making the window-management less irritating. Find+fix.
23 Whonix I2P integration in Whonix is running into the problem of making the router console available(Which requires either a proxy exception or an extra proxy like Privoxy) without making the whole localhost available. Since that's a problem this can solve, after I deal with the linting stuff I need to get back in touch with them. Right now I'm also (ab)using include-binaries, I'll need to resolve that too.
24 Update channel for non-AMO Webextension TODO:

36
location.html Normal file
View File

@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="search.css" rel="stylesheet">
<link href="home.css" rel="stylesheet">
<link href="info.css" rel="stylesheet"><!--<link href="torrent/popup.css" rel="stylesheet">-->
<title>
</title>
</head>
<body>
<div id="browserpanel">
<div class="panel">
<div class="section-header panel-section panel-section-header" id="headline">
<div class="text-section-header" id="text-section-header">
<h1 id="text-section-header">This site offers an anonymous mirror on I2P</h1>
</div>
</div>
</div>
<div class="panel">
<ul>
<li>
<div class="address-info">
<span id="TypeLabel">Alternate Addresses:</span> <span id="Type"></span>
<div id="TypeInfo">
</div>
</div>
</li>
</ul>
</div>
</div>
<script src="location.js"></script>
</body>
</html>

20
location.js Normal file
View File

@@ -0,0 +1,20 @@
function gotCurrent(tab) {
function gotTitle(title) {
let addr = title;
document.getElementById('TypeInfo').innerHTML = '<div class=\"AddressInfo\"><a href=\"' + addr + '\">' + addr + '</a></div>';
}
console.log(tab);
var gettingTitle = browser.pageAction.getTitle({
tabId: tab[0].id
});
gettingTitle.then(gotTitle);
}
function tabError(error) {
console.log(`Error : ${error}`);
}
const gettingCurrent = browser.tabs.query({ active: true });
gettingCurrent.then(gotCurrent, tabError);

View File

@@ -26,22 +26,21 @@
],
"manifest_version": 2,
"name": "__MSG_extensionName__",
"version": "0.73",
"version_name": "0.73",
"version": "0.77",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox",
"icons": {
"48": "icons/toopie.png"
"48": "icons/i2plogo.png"
},
"browser_action": {
"browser_style": true,
"default_icon": "icons/toopie.png",
"default_icon": "icons/i2plogo.png",
"default_title": "__MSG_extensionName__",
"default_popup": "window.html"
},
"sidebar_action": {
"browser_style": true,
"default_icon": "icons/logo.png",
"default_icon": "icons/i2plogo.png",
"default_title": "__MSG_toopieName__",
"default_panel": "toopie.html",
"open_at_install": false
@@ -56,12 +55,17 @@
"http://*.b32.i2p/*",
"https://*.b32.i2p/*"
],
"default_panel": "security.html",
"pinned": true
},
"options_ui": {
"page": "options/options.html"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["script.js"]
}
],
"background": {
"persistent": true,
"scripts": [

View File

@@ -1,5 +1,4 @@
body {
width: 25em;
font-family: "Open Sans Light",sans-serif;
font-size: 0.9em;
font-weight: 300
@@ -14,7 +13,7 @@ section.scheme-options {
#clear-button,
section.scheme-options input,
section.scheme-options>select {
float: right
}
label {
display: block;
@@ -25,27 +24,29 @@ label:hover {
}
.title {
font-size: 1.2em;
margin-bottom: 0.5em
margin-bottom: 0.5em;
width: 100%
}
body,
html {
width: 350px
width: 100%
}
a {
margin: 10px;
display: inline-block
margin: 10px
}
.panel {
margin: 5px
}
span.identity {
width: 100px;
display: inline-block;
margin-left: 1em
}
.identity-options {
display: none
}
input {
display: inline
}
div {
width: 100%!important
}

View File

@@ -166,7 +166,7 @@ function AssurePeerConnection() {
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "proxy_only"
value: "disable_non_proxied_udp"
});
}
let rtc = browser.privacy.network.peerConnectionEnabled.get({});
@@ -343,9 +343,7 @@ function i2pHost(url) {
function onContextGotLog(contexts) {
if (contexts != null) {
for (let context of contexts) {
console.log(context);
}
console.log(contexts);
}
}

View File

@@ -4,16 +4,16 @@ var routerpref = chrome.i18n.getMessage('routerPreface');
var routerprefpriv = chrome.i18n.getMessage('routerPrefacePrivate');
browser.privacy.network.peerConnectionEnabled.set({
value: false
value: true
});
console.log('Preliminarily disabled WebRTC.');
chrome.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: 'proxy_only'
value: 'disable_non_proxied_udp'
});
console.log('Disabled unproxied UDP.');
function shouldProxyRequest(requestInfo) {
return requestInfo.parentFrameId != -1;
@@ -32,11 +32,15 @@ var handleContextProxyRequest = async function(requestDetails) {
}
if (context != undefined) {
if (context.name == titlepref) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
var tab = tabGet(requestDetails.tabId);
if (!requestDetails.url.includes('/i2psnark/')) {
console.log('URL', requestDetails.url);
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
}
/*console.log("(proxy)", context.name);
console.log("Using", proxy.type);
console.log("proxy ", proxy.host + ":" + proxy.port);*/
@@ -109,7 +113,7 @@ var handleContextProxyRequest = async function(requestDetails) {
};
var tabGet = async function(tabId) {
try {
//console.log("(proxy)Tab ID from Request", tabId);
console.log('(proxy)Tab ID from Request', tabId);
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {

View File

@@ -4,13 +4,65 @@
<link type="text/html" rel="alternate" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases"/>
<link type="application/atom+xml" rel="self" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases.atom"/>
<title>Release notes from I2P-in-Private-Browsing-Mode-Firefox</title>
<updated>2020-03-24T04:22:27Z</updated>
<updated>2020-06-23T03:21:35Z</updated>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.77</id>
<updated>2020-09-25T00:19:45Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.77"/>
<title>0.77</title>
<enclosure url="magnet:?xt=urn:btih:5f45673bc107ec42a8b4d02aa4d5d7487949fc66" type="application/x-bittorrent" />
<content type="html">&lt;p&gt;Merge pull request &lt;a class=&quot;issue-link js-issue-link&quot; href=&quot;https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/pull/100&quot;&gt;#100&lt;/a&gt; from eyedeekay/bookmarks&lt;/p&gt;
&lt;p&gt;make the bookmarks part of a subdirectory&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.75</id>
<updated>2020-06-23T03:22:59Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.75"/>
<title>0.75</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.75-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update bookmarks format&lt;/li&gt;
&lt;li&gt;Deprecate WebRTC State Management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Mon, 22 JUN 2020 11:22:37 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.73-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.73</id>
<updated>2020-03-24T23:49:45Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.73"/>
<title>0.73</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix incomplete bugfix from 0.69 again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Tue, 24 MAR 2020 19:48:14 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.71-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.71</id>
<updated>2020-03-24T23:01:20Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.71"/>
<title>0.71</title>
<enclosure url="magnet:?xt=urn:btih:337ece11e8d9318c0e11d9320e3426fe9ff15556" type="application/x-bittorrent" />
<content type="html">&lt;h1&gt;I2P in Private Browsing Mode&lt;/h1&gt;
&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
@@ -143,60 +195,4 @@ i2psetproxy.js (0.59-1) UNRELEASED; urgency=low&lt;/p&gt;
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.57</id>
<updated>2020-01-06T17:16:33Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.57"/>
<title>0.57</title>
<content type="html">&lt;h1&gt;I2P in Private Browsing Mode&lt;/h1&gt;
&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.57-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Snowflake compatibility&lt;/li&gt;
&lt;li&gt;Lots of small compatibility fixes&lt;/li&gt;
&lt;li&gt;More linter errors&lt;/li&gt;
&lt;li&gt;Make it multilingual again&lt;/li&gt;
&lt;li&gt;Distribute a torrent and a magnet link with the plugin of the plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Thu, 4 JAN 2019 16:43:58 -0400&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/docs</id>
<updated>2020-01-03T18:01:49Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/docs"/>
<title>Documentation</title>
<content type="html">&lt;p&gt;PDF&#39;s and text about the extension&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.55</id>
<updated>2020-01-06T17:17:01Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.55"/>
<title>0.55</title>
<content type="html">&lt;h1&gt;I2P in Private Browsing Mode&lt;/h1&gt;
&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.55-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get rid of Web Browsing context launcher&lt;/li&gt;
&lt;li&gt;Fix linter errors&lt;/li&gt;
&lt;li&gt;Tolerate themes&lt;/li&gt;
&lt;li&gt;Tolerate other containerizers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Thu, 2 JAN 2019 16:47:33 -0400&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
</feed>

161
script.js Normal file
View File

@@ -0,0 +1,161 @@
browser.runtime.onMessage.addListener(request => {
var response = '';
if (request.req === 'i2p-location') {
response = 'no-alt-location';
const metas = document.getElementsByTagName('meta');
for (let i = 0; i < metas.length; i++) {
try {
tag = metas[i].getAttribute('http-equiv');
if (tag.toUpperCase() === 'I2P-LOCATION') {
response = metas[i].getAttribute('content');
}
if (tag.toUpperCase() === 'X-I2P-LOCATION') {
response = metas[i].getAttribute('content');
}
}catch{
};
}
}
if (request.req === 'i2p-torrentlocation') {
response = 'no-alt-location';
const metas = document.getElementsByTagName('meta');
for (let i = 0; i < metas.length; i++) {
try {
tag = metas[i].getAttribute('http-equiv');
if (tag.toUpperCase() === 'I2P-TORRENTLOCATION') {
response = metas[i].getAttribute('content');
var imgs = document.getElementsByTagName('img');
for (let img of imgs) {
let tmpsrc = new URL(img.src);
if (tmpsrc.host == location.host) {
img.src = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
img.onerror = function() {
img.src = tmpsrc;
};
}
}
var links = document.getElementsByTagName('a');
console.log('Listing link', links);
for (let link of links) {
console.log('(Changing Link)', link);
let tmpsrc = new URL(link.href);
// console.log("link", tmpsrc.host, tmpsrc.pathname)
if (tmpsrc.host == location.host) {
if (!tmpsrc.pathname.endsWith('html') && !tmpsrc.pathname.endsWith('htm') &&
!tmpsrc.pathname.endsWith('php') && !tmpsrc.pathname.endsWith('jsp') &&
!tmpsrc.pathname.endsWith('asp') && !tmpsrc.pathname.endsWith('aspx') &&
!tmpsrc.pathname.endsWith('atom') && !tmpsrc.pathname.endsWith('rss') &&
!tmpsrc.pathname.endsWith('\/') && tmpsrc.pathname.includes('.')) {
console.log('link', tmpsrc.host, tmpsrc.pathname);
link.href = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
link.onerror = function() {
window.location.href = tmpsrc.href;
};
}
//if (!tmpsrc.pathname.endsWith('html')) { // && !tmpsrc.pathname.endsWith('htm') &&
// !tmpsrc.pathname.endsWith('php') && !tmpsrc.pathname.endsWith('jsp') &&
// !tmpsrc.pathname.endsWith('asp') && !tmpsrc.pathname.endsWith('aspx') &&
// tmpsrc.pathname.includes('.') && !tmpsrc..pathname.endsWith('/')) {
//console.log('http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;)
//link.href = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
//link.onerror = function() {
//link.src = tmpsrc;
//};
//}
}
}
var videos = document.getElementsByTagName('video');
for (let video of videos) {
let tmpsrc = new URL(video.currentSrc);
if (tmpsrc.host == location.host) {
if (!video.innerHTML.includes('127.0.0.1')) {
innerHTML = video.innerHTML;
topInnerHTML = video.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
video.innerHTML = topInnerHTML + innerHTML;
}
}
}
var audios = document.getElementsByTagName('audio');
for (let audio of audios) {
let tmpsrc = new URL(audio.currentSrc);
if (tmpsrc.host == location.host) {
if (!audio.innerHTML.includes('127.0.0.1')) {
innerHTML = audio.innerHTML;
topInnerHTML = audio.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
audio.innerHTML = topInnerHTML + innerHTML;
}
}
}
}
if (tag.toUpperCase() === 'X-I2P-TORRENTLOCATION') {
response = metas[i].getAttribute('content');
var imgs = document.getElementsByTagName('img');
for (let img of imgs) {
let tmpsrc = new URL(img.src);
if (tmpsrc.host == location.host) {
img.src = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
img.onerror = function() {
img.src = tmpsrc;
};
}
}
var links = document.getElementsByTagName('a');
console.log('Listing link', links);
for (let link of links) {
console.log('(Changing Link)', link);
let tmpsrc = new URL(link.href);
//console.log("link", tmpsrc.host, tmpsrc.pathname)
if (tmpsrc.host == location.host) {
if (!tmpsrc.pathname.endsWith('html') && !tmpsrc.pathname.endsWith('htm') &&
!tmpsrc.pathname.endsWith('php') && !tmpsrc.pathname.endsWith('jsp') &&
!tmpsrc.pathname.endsWith('asp') && !tmpsrc.pathname.endsWith('aspx') &&
!tmpsrc.pathname.endsWith('atom') && !tmpsrc.pathname.endsWith('rss') &&
!tmpsrc.pathname.endsWith('\/') && tmpsrc.pathname.includes('.')) {
console.log('link', tmpsrc.host, tmpsrc.pathname);
link.href = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
link.onerror = function() {
window.location.href = tmpsrc.href;
};
}
//if (!tmpsrc.pathname.endsWith('html')) { // && !tmpsrc.pathname.endsWith('htm') &&
// !tmpsrc.pathname.endsWith('php') && !tmpsrc.pathname.endsWith('jsp') &&
// !tmpsrc.pathname.endsWith('asp') && !tmpsrc.pathname.endsWith('aspx') &&
// tmpsrc.pathname.includes('.') && !tmpsrc..pathname.endsWith('/')) {
//console.log('http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;)
//link.href = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
//link.onerror = function() {
//link.src = tmpsrc;
//};
//}
}
}
var videos = document.getElementsByTagName('video');
for (let video of videos) {
let tmpsrc = new URL(video.currentSrc);
if (tmpsrc.host == location.host) {
if (!video.innerHTML.includes('127.0.0.1')) {
innerHTML = video.innerHTML;
topInnerHTML = video.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
video.innerHTML = topInnerHTML + innerHTML;
}
}
}
var audios = document.getElementsByTagName('audio');
for (let audio of audios) {
let tmpsrc = new URL(audio.currentSrc);
if (tmpsrc.host == location.host) {
if (!audio.innerHTML.includes('127.0.0.1')) {
innerHTML = audio.innerHTML;
topInnerHTML = audio.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
audio.innerHTML = topInnerHTML + innerHTML;
}
}
}
}
}catch{
};
}
}
return Promise.resolve({content: response});
});

280
scrub.js
View File

@@ -194,6 +194,7 @@ var contextSetup = function(requestDetails) {
console.log('in favor of', tab.id);
console.log('with context', tab.cookieStoreId);
browser.tabs.remove(tabId.id);
browser.tabs.move(tab.id, {index: 0});
}
for (index = 0; index < tabs.length; index++) {
if (index != tabs.length - 1)
@@ -205,6 +206,11 @@ var contextSetup = function(requestDetails) {
});
pins.then(closeOldTab, onError);
}
if (requestDetails.url.endsWith('xhr1.html')) {
hostname = url.split('/')[2];
let prefix = url.substr(0, url.indexOf('://') + 3);
requestDetails.url = prefix + hostname + '/home';
}
var created = browser.tabs.create({
active: true,
pinned: true,
@@ -235,6 +241,7 @@ var contextSetup = function(requestDetails) {
console.log('in favor of', tab.id);
console.log('with context', tab.cookieStoreId);
browser.tabs.remove(tabId.id);
browser.tabs.move(tab.id, {index: 1});
}
for (index = 0; index < tabs.length; index++) {
if (index != tabs.length - 1)
@@ -246,6 +253,11 @@ var contextSetup = function(requestDetails) {
});
pins.then(closeOldTab, onError);
}
if (requestDetails.url.endsWith('xhr1.html')) {
hostname = url.split('/')[2];
let prefix = url.substr(0, url.indexOf('://') + 3);
requestDetails.url = prefix + hostname + '/i2ptunnelmgr/';
}
var created = browser.tabs.create({
active: true,
pinned: true,
@@ -268,36 +280,50 @@ var contextSetup = function(requestDetails) {
name: torrentpref
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
function Create() {
function onCreated(tab) {
function closeOldTab(tabs) {
if (tabId.id != tab.id) {
console.log('(isolate) Closing un-isolated tab', tabId.id);
console.log('in favor of', tab.id);
console.log('with context', tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
for (index = 0; index < tabs.length; index++) {
if (index != tabs.length - 1)
browser.tabs.remove(tabs[index].id);
var exemptContext = await browser.contextualIdentities.query({
name: titlepref
});
let tmp = new URL(tabId.url);
console.log('tabid host', tmp.host);
if (!requestDetails.url.includes(tmp.host)) {
// if (tabId.cookieStoreId != exemptContext[0].cookieStoreId){
function Create() {
function onCreated(tab) {
function closeOldTab(tabs) {
if (tabId.id != tab.id) {
console.log('(isolate) Closing un-isolated tab', tabId.id);
console.log('in favor of', tab.id);
console.log('with context', tab.cookieStoreId);
browser.tabs.remove(tabId.id);
browser.tabs.move(tab.id, {index: 2});
}
for (index = 0; index < tabs.length; index++) {
if (index != tabs.length - 1)
browser.tabs.remove(tabs[index].id);
}
}
var pins = browser.tabs.query({
cookieStoreId: context[0].cookieStoreId
});
pins.then(closeOldTab, onError);
}
var pins = browser.tabs.query({
cookieStoreId: context[0].cookieStoreId
if (requestDetails.url.endsWith('xhr1.html')) {
hostname = url.split('/')[2];
let prefix = url.substr(0, url.indexOf('://') + 3);
requestDetails.url = prefix + hostname + '/i2psnark/';
}
var created = browser.tabs.create({
active: true,
pinned: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
pins.then(closeOldTab, onError);
created.then(onCreated, onContextError);
}
var created = browser.tabs.create({
active: true,
pinned: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
} catch (error) {
console.log('(isolate)Context Error', error);
@@ -317,6 +343,7 @@ var contextSetup = function(requestDetails) {
console.log('in favor of', tab.id);
console.log('with context', tab.cookieStoreId);
browser.tabs.remove(tabId.id);
browser.tabs.move(tab.id, {index: 4});
}
for (index = 0; index < tabs.length; index++) {
if (index != tabs.length - 1)
@@ -328,6 +355,11 @@ var contextSetup = function(requestDetails) {
});
pins.then(closeOldTab, onError);
}
if (requestDetails.url.endsWith('xhr1.html')) {
hostname = url.split('/')[2];
let prefix = url.substr(0, url.indexOf('://') + 3);
requestDetails.url = prefix + hostname + '/muwire/';
}
var created = browser.tabs.create({
active: true,
pinned: true,
@@ -358,6 +390,7 @@ var contextSetup = function(requestDetails) {
console.log('in favor of', tab.id);
console.log('with context', tab.cookieStoreId);
browser.tabs.remove(tabId.id);
browser.tabs.move(tab.id, {index: 3});
}
for (index = 0; index < tabs.length; index++) {
if (index != tabs.length - 1)
@@ -369,6 +402,11 @@ var contextSetup = function(requestDetails) {
});
pins.then(closeOldTab, onError);
}
if (requestDetails.url.endsWith('xhr1.html')) {
hostname = url.split('/')[2];
let prefix = url.substr(0, url.indexOf('://') + 3);
requestDetails.url = prefix + hostname + '/webmail/';
}
var created = browser.tabs.create({
active: true,
pinned: true,
@@ -385,7 +423,7 @@ var contextSetup = function(requestDetails) {
console.log('(isolate)Context Error', error);
}
};
var localTabFind = async function(tabId) {
/*var localTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: localpref
@@ -417,7 +455,7 @@ var contextSetup = function(requestDetails) {
} catch (error) {
console.log('(isolate)Context Error', error);
}
};
};*/
var normalTabFind = async function(tabId) {
if (tabId == undefined) {
return;
@@ -549,10 +587,10 @@ var contextSetup = function(requestDetails) {
return requestDetails;
}
} else {
if (localhost) {
/*if (localhost) {
var localtab = tab.then(localTabFind, onContextError);
return requestDetails;
}
}*/
var normalTab = tab.then(normalTabFind, onContextError);
return requestDetails;
//return requestDetails;
@@ -563,6 +601,190 @@ var contextSetup = function(requestDetails) {
}
};
var coolheadersSetup = function(e) {
var asyncSetPageAction = new Promise((resolve, reject) => {
window.setTimeout(() => {
for (i = 0; i < e.responseHeaders.length; i++) {
let header = e.responseHeaders[i];
if (e.url.startsWith('https')) {
if (header.name.toUpperCase() === 'I2P-LOCATION' || header.name.toUpperCase() === 'X-I2P-LOCATION') {
browser.pageAction.setPopup({
tabId: e.tabId,
popup: 'location.html'
});
browser.pageAction.setIcon({path: 'icons/i2plogo.png', tabId: e.tabId});
browser.pageAction.setTitle({
tabId: e.tabId,
title: header.value
});
browser.pageAction.show(e.tabId);
break;
}
if (header.name.toUpperCase() === 'I2P-TORRENTLOCATION' || header.name.toUpperCase() === 'X-I2P-TORRENTLOCATION') {
var imgs = document.getElementsByTagName('img');
for (let img of imgs) {
if (tmpsrc.host == location.host) {
img.src = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
img.onerror = function() {
img.src = tmpsrc;
};
}
}
var videos = document.getElementsByTagName('video');
for (let video of videos) {
let tmpsrc = new URL(video.currentSrc);
if (tmpsrc.host == location.host) {
if (!video.innerHTML.includes('127.0.0.1')) {
innerHTML = video.innerHTML;
topInnerHTML = video.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
video.innerHTML = topInnerHTML + innerHTML;
}
}
}
var audios = document.getElementsByTagName('audio');
for (let audio of audios) {
let tmpsrc = new URL(audio.currentSrc);
if (tmpsrc.host == location.host) {
if (!audio.innerHTML.includes('127.0.0.1')) {
innerHTML = audio.innerHTML;
topInnerHTML = audio.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
audio.innerHTML = topInnerHTML + innerHTML;
}
}
}
browser.pageAction.setPopup({
tabId: tabId.id,
popup: 'torrent.html'
});
browser.pageAction.setIcon({path: 'icons/i2plogo.png', tabId: e.tabId});
browser.pageAction.setTitle({
tabId: e.tabId,
title: header.value
});
browser.pageAction.show(e.tabId);
break;
}
}else {
if (header.name.toUpperCase() === 'I2P-TORRENTLOCATION' || header.name.toUpperCase() === 'X-I2P-TORRENTLOCATION') {
var imgs = document.getElementsByTagName('img');
for (let img of imgs) {
if (tmpsrc.host == location.host) {
img.src = 'http://127.0.0.1:7657/i2psnark/' + tmpsrc.host + tmpsrc.pathname;
img.onerror = function() {
img.src = tmpsrc;
};
}
}
var videos = document.getElementsByTagName('video');
for (let video of videos) {
let tmpsrc = new URL(video.currentSrc);
if (tmpsrc.host == location.host) {
if (!video.innerHTML.includes('127.0.0.1')) {
innerHTML = video.innerHTML;
topInnerHTML = video.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
video.innerHTML = topInnerHTML + innerHTML;
}
}
}
var audios = document.getElementsByTagName('audio');
for (let audio of audios) {
let tmpsrc = new URL(audio.currentSrc);
if (tmpsrc.host == location.host) {
if (!audio.innerHTML.includes('127.0.0.1')) {
innerHTML = audio.innerHTML;
topInnerHTML = audio.innerHTML.replace('src=\"', 'src=\"http://127.0.0.1:7657/i2psnark/' + location.host + '/');
audio.innerHTML = topInnerHTML + innerHTML;
}
}
}
browser.pageAction.setPopup({
tabId: tabId.id,
popup: 'torrent.html'
});
browser.pageAction.setIcon({path: 'icons/i2plogo.png', tabId: e.tabId});
browser.pageAction.setTitle({
tabId: e.tabId,
title: header.value
});
browser.pageAction.show(e.tabId);
break;
}
}
}
resolve({responseHeaders: e.responseHeaders});
}, 2000);
});
return asyncSetPageAction;
}
function getClearTab(tobj) {
function getTabURL(tab) {
if (tab.url.startsWith("https")){
browser.tabs.sendMessage( tab.id, {'req':'i2p-location'}).then( response => {
if (response.content.toUpperCase() != "NO-ALT-LOCATION"){
browser.pageAction.setPopup({
tabId: tab.id,
popup: 'location.html'
});
browser.pageAction.setIcon({path: 'icons/i2plogo.png', tabId: tab.id});
browser.pageAction.setTitle({
tabId: tab.id,
title: response.content
});
browser.pageAction.show(tab.id);
}
});
console.log("(pageaction)", tab.id, tab.url)
} else {
browser.tabs.sendMessage( tab.id, {'req':'i2p-torrentlocation'}).then( response => {
if (response.content.toUpperCase() != "NO-ALT-LOCATION"){
browser.pageAction.setPopup({
tabId: tab.id,
popup: 'torrent.html'
});
browser.pageAction.setIcon({path: 'icons/i2plogo.png', tabId: tab.id});
browser.pageAction.setTitle({
tabId: tab.id,
title: response.content
});
browser.pageAction.show(tab.id);
}
});
console.log("(pageaction)", tab.id, tab.url)
}
}
if (typeof(tobj) == "number"){
browser.tabs.get(tobj).then(getTabURL, onError)
}else{
browser.tabs.get(tobj.tabId).then(getTabURL, onError)
}
}
browser.tabs.onActivated.addListener(getClearTab);
browser.tabs.onUpdated.addListener(getClearTab);
function reloadTabs(tabs) {
for (let tab of tabs) {
browser.tabs.reload(tab.id)
}
}
function reloadError(error) {
console.log(`Error: ${error}`);
}
let querying = browser.tabs.query({});
querying.then(reloadTabs, onError);
// Listen for onHeaderReceived for the target page.
// Set "blocking" and "responseHeaders".
browser.webRequest.onHeadersReceived.addListener(
coolheadersSetup,
{urls: ['<all_urls>']},
["blocking", "responseHeaders"]
);
browser.webRequest.onBeforeRequest.addListener(
contextSetup,
{ urls: ['<all_urls>'] },

View File

@@ -2,13 +2,9 @@
overflow: hidden;
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%
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
.topnav a {
float: left;
@@ -24,10 +20,10 @@
color: #fff
}
.topnav input[type=search] {
float: right;
padding: 6px;
border: none;
margin-top: 8px;
color: #e6e6e7;
margin-right: 16px
}
.topnav input[type=submit] {
@@ -35,19 +31,12 @@
padding: 6px;
border: none;
margin-top: 8px;
color: #e6e6e7;
margin-right: 16px
}
@media screen and (max-width: 600px) {
.topnav a,
.topnav input[type=text] {
float: none;
display: block;
text-align: left;
width: 100%;
margin: 0;
padding: 14px
}
.topnav input[type=text] {
border: 1px solid #ccc
}
#search-query {
color: #1f1a24
}
#search-submit {
color: #1f1a24
}

View File

@@ -2,6 +2,16 @@ li {
width: 90%;
margin-left: 0
}
ul {
width: 100%
}
button {
width: 50%;
text-align: center
}
#applicationExplain {
float: unset
}
.button-list {
display: inline
}

View File

@@ -6,57 +6,81 @@
<link href="sidebar.css" rel="stylesheet" type="text/css">
</head>
<body>
<script src="i2pcontrol/i2pcontrol.js"></script>
<script src="info.js"></script>
<script src="content.js"></script>
<h1>I2P Router Information</h1>
<ul>
<li><button id="label-router-restart" target="_blank">Restart: <span id="router-restart">Gracefully restart router</span></button>
<li>
<a href="http://localhost:7657" target="_blank"><img alt="i2p router console" class="center" src="/icons/i2plogo.png"></a>
</li>
</ul>
<ul class="button-list">
<li><button id="label-router-restart" target="_blank"><img alt="Restart:" id="label-router-shutdown" src="/images/restart.svg"></button>
<br>
<span id="router-restart">Gracefully restart router</span>
</li>
<li><button id="label-router-shutdown" target="_blank">Shutdown: <span id="router-shutdown">Gracefully shutdown router</span></button>
<li><button id="label-router-shutdown" target="_blank"><img alt="Shutdown:" id="label-router-shutdown" src="/images/shutdown.svg"></button>
<br>
<span id="router-shutdown">Gracefully shutdown router</span>
</li>
</ul>
<ul>
<li><button id="label-router-status" target="_blank">Status</button>
</li>
</ul>
<ul class="label-list" id="label-status-list">
<li><span id="label-router-status">Router Status:</span> <span id="router-status">Replace with Router Status</span></li>
<li><span id="label-router-uptime">Router Uptime(Ms):</span> <span id="router-uptime">Replace with Router Uptime</span></li>
<li><span id="label-router-version">Router Version:</span> <span id="router-version">Replace with Router Version</span></li>
</ul>
<li>
<ul>
<li><span id="label-router-bw-outbound-1s">Outbound bw 1s:</span> <span id="router-net-bw-outbound-1s">Replace with Router Bandwidth Outbound 1s</span></li>
<li><span id="label-router-bw-outbound-15s">Outbound bw 15s:</span> <span id="router-net-bw-outbound-15s">Replace with Router Bandwidth Outbound 15s</span></li>
<li><span id="label-router-bw-inbound-1s">Inbound bw 1s:</span> <span id="router-net-bw-inbound-1s">Replace with Router Bandwidth Inbound 1s</span></li>
<li><span id="label-router-bw-inbound-15s">Inbound bw 15s:</span> <span id="router-net-bw-inbound-15s">Replace with Router Bandwidth Outbound 15s</span></li>
</ul>
</li>
<!--<li>
<span id="label-router-net-status">Network Status:</span>
<span id="router-net-status">Replace with Router Network Status</span>
</li>-->
<li>
<ul>
<li><span id="label-router-net-tunnels-participating">Participating Tunnels:</span> <span id="router-net-tunnels-participating">Replace with Router Participating Tunnel Count</span></li>
<li><span id="label-router-activepeers">Active Peers:</span> <span id="router-netdb-activepeers">Replace with Router Active Peers</span></li>
<li><span id="label-router-netdb-fastpeers">Fast Peers:</span> <span id="router-netdb-fastpeers">Replace with Router Fast Peers</span></li>
<li><span id="label-router-netdb-highcapacitypeers">High Capacity Peers:</span> <span id="router-netdb-highcapacitypeers">Replace with High Capacity Peers</span></li>
<li><span id="label-router-netdb-isreseeding">Reseed status:</span> <span id="router-netdb-isreseeding">Replace with Router netDB Reseeding Status</span></li>
<li><span id="label-router-netdb-knownpeers">Known Peers:</span> <span id="router-netdb-knownpeers">Replace with Router Known Peers</span></li>
</ul>
<ul>
<li><button id="label-router-bandwidth" target="_blank">Bandwidth</button>
</li>
</ul>
<script src="i2pcontrol/i2pcontrol.js"></script>
<script src="info.js"></script>
<script src="content.js"></script>
<ul class="label-list" id="label-bandwidth-list">
<li><span id="label-router-bw-outbound-1s">Outbound bw 1s:</span> <span id="router-net-bw-outbound-1s">Replace with Router Bandwidth Outbound 1s</span></li>
<li><span id="label-router-bw-outbound-15s">Outbound bw 15s:</span> <span id="router-net-bw-outbound-15s">Replace with Router Bandwidth Outbound 15s</span></li>
<li><span id="label-router-bw-inbound-1s">Inbound bw 1s:</span> <span id="router-net-bw-inbound-1s">Replace with Router Bandwidth Inbound 1s</span></li>
<li><span id="label-router-bw-inbound-15s">Inbound bw 15s:</span> <span id="router-net-bw-inbound-15s">Replace with Router Bandwidth Outbound 15s</span></li>
</ul>
<!--<li>
<span id="label-router-net-status">Network Status:</span>
<span id="router-net-status">Replace with Router Network Status</span>
</li>-->
<ul>
<li><button id="label-router-peers" target="_blank">Peers</button>
</li>
</ul>
<ul class="label-list" id="label-peers-list">
<li><span id="label-router-net-tunnels-participating">Transit Tunnels:</span> <span id="router-net-tunnels-participating">Replace with Router Participating Tunnel Count</span></li>
<li><span id="label-router-activepeers">Active Peers:</span> <span id="router-netdb-activepeers">Replace with Router Active Peers</span></li>
<li><span id="label-router-netdb-fastpeers">Fast Peers:</span> <span id="router-netdb-fastpeers">Replace with Router Fast Peers</span></li>
<li><span id="label-router-netdb-highcapacitypeers">High Capacity Peers:</span> <span id="router-netdb-highcapacitypeers">Replace with High Capacity Peers</span></li>
<li><span id="label-router-netdb-isreseeding">Reseed status:</span> <span id="router-netdb-isreseeding">Replace with Router netDB Reseeding Status</span></li>
<li><span id="label-router-netdb-knownpeers">Known Peers:</span> <span id="router-netdb-knownpeers">Replace with Router Known Peers</span></li>
</ul>
<br>
<br>
</body>
</html>

39
torrent.html Normal file
View File

@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="search.css" rel="stylesheet">
<link href="home.css" rel="stylesheet">
<link href="info.css" rel="stylesheet"><!--<link href="torrent/popup.css" rel="stylesheet">-->
<title>
</title>
</head>
<body>
<div id="browserpanel">
<div class="panel">
<div class="section-header panel-section panel-section-header" id="headline">
<div class="text-section-header" id="text-section-header">
<h1 id="text-section-header">This I2P Site has peer-to-peer resources.</h1>
</div>
</div>
</div>
<div class="panel">
<p>
To help distribute the site content, use the links below to join the swarm.
</p>
<ul>
<li>
<div class="address-info">
<span id="TypeLabel">Torrent Links:</span> <span id="Type"></span>
<div id="TypeInfo">
</div>
</div>
</li>
</ul>
</div>
</div>
<script src="torrent.js"></script>
</body>
</html>

20
torrent.js Normal file
View File

@@ -0,0 +1,20 @@
function gotCurrent(tab) {
function gotTitle(title) {
let addr = title;
document.getElementById('TypeInfo').innerHTML = '<div class=\"AddressInfo\"><a href=\"' + addr + '\">' + addr + '</a></div>';
}
console.log(tab);
var gettingTitle = browser.pageAction.getTitle({
tabId: tab[0].id
});
gettingTitle.then(gotTitle);
}
function tabError(error) {
console.log(`Error : ${error}`);
}
const gettingCurrent = browser.tabs.query({ active: true });
gettingCurrent.then(gotCurrent, tabError);

View File

@@ -12,13 +12,13 @@
<body>
<div class="section-header panel-section panel-section-header" id="topbar">
<!--<div class="text-section-header" id="text-section-header">-->
<img height="32px" src="icons/toopie.png" width="32px"> <a href="#" id="browser-action">Browse</a> <img height="32px" src="icons/torrents.png" width="32px"> <a href="#" id="torrent-action">Download</a> <!--</div>-->
<a href="#" id="browser-action"><img class="tabicon" height="32px" src="icons/browse.png" width="32px">Browse</a> <a href="#" id="torrent-action"><img class="tabicon" height="32px" src="icons/torrents.png" width="32px">Download</a> <!--</div>-->
</div>
<div id="browserpanel">
<div class="panel">
<div class="section-header panel-section panel-section-header" id="headline">
<div class="text-section-header" id="text-section-header">
<div class="text-section-header">
<h1 id="text-section-header">The Invisible Internet Browser</h1>
</div>
</div>
@@ -40,8 +40,6 @@
<div id="i2pbrowser-description">
<p id="description">You are now able to use I2P in this browser.</p>
<p id="beta">It is experimental.</p>
</div>
</div>
@@ -72,16 +70,9 @@
<li class="application"><input id="disable-history" name="disablehistory" type="checkbox" value="history"> <label for="disable-history">Disable History in I2P Tabs</label> <span class="applicationDesc" id="histDesc">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>
<p>
</p>
</div>
<div class="panel-section-separator">
</div>
<!--<div class="panel-section-separator">
</div>-->
<div class="application-info">
<p class="hideIfI2PConsoleOff">
@@ -102,25 +93,21 @@
<li class="application"><button class="applicationName" id="window-visit-snark" target="_blank">BitTorrent</button> <span class="applicationDesc" id="snark">I2P is capable of anonymous Peer-to-Peer file sharing, to use the built-in bittorrent client go here:</span></li>
</ul>
<p>
</p>
<p>
</p>
</div>
</div>
</div>
<br>
<div id="torrentpanel">
<div class="panel" id="torrentstatus">
<div class="section-header panel-section panel-section-header">
<div class="text-section-header" id="text-section-torrents-header">
<h3>Torrent Downloads</h3>
<h1>Torrent Downloads</h1>
</div>
</div>
<div hidden="" id="config-pane">
<div id="config-pane">
<strong>Torrent RPC Configuration</strong>
<br>
The server address is not set yet.
@@ -128,13 +115,13 @@
<a class="config-opener" href="#">Open the settings</a> to continue.
</div>
<div hidden="" id="torrents-pane">
<div id="torrents-pane">
<header>
<h1>Torrent Controls</h1>
<a class="webui-opener" href="#" target="_blank"><img alt="Open Web UI" src="icon.svg"></a> <!--<a class="config-opener" href="#">
<img alt="Settings" src="gear.svg"></a>
<a class="webui-opener" href="#" target="_blank"><img alt="Open Web UI" src="images/i2plogo.png"></a> <!--<a class="config-opener" href="#">
<img alt="Settings" src="images/gear.svg"></a>
<a class="info-opener" href="https://github.com/myfreeweb/transmitter" target="_blank">
<img alt="Extension Info" src="info.svg"></a>-->
<img alt="Extension Info" src="images/info.svg"></a>-->
</header>
<input id="torrents-search" placeholder="Search…" type="search">
<template id="torrents-tpl">

BIN
x-i2p-torrentlocation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 KiB