Compare commits
35 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f1fd2f6fb6 | ||
![]() |
8d4e38ccdf | ||
![]() |
e67c266ce0 | ||
![]() |
9c12df60d2 | ||
![]() |
5fb224fdfa | ||
![]() |
9a0daa480d | ||
![]() |
b041f7f8c7 | ||
![]() |
42cb2aae64 | ||
![]() |
449e3dbee6 | ||
![]() |
422bfa6c18 | ||
![]() |
f1909ec923 | ||
![]() |
a3bb8a6fe9 | ||
![]() |
3596a7e6fd | ||
![]() |
1d9b3b5001 | ||
![]() |
cf99bde088 | ||
![]() |
c3d73649a0 | ||
![]() |
a4336b105f | ||
![]() |
a56bf3101d | ||
![]() |
7822c7b9fe | ||
![]() |
15fffd25dc | ||
![]() |
1c7ec493cb | ||
![]() |
11fd9efd31 | ||
![]() |
08a1e73008 | ||
![]() |
e09546d6bb | ||
![]() |
fa0aedda92 | ||
![]() |
105aaed014 | ||
![]() |
fff55eadd6 | ||
![]() |
db43f2760a | ||
![]() |
ba0d4abc53 | ||
![]() |
65636c2b5e | ||
![]() |
4c2a7978f2 | ||
![]() |
7e97ab766a | ||
![]() |
16b1990bd9 | ||
![]() |
2c7b092376 | ||
![]() |
100f27b4be |
464
.eslintrc.js
464
.eslintrc.js
@@ -2,251 +2,251 @@ module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
es6: true,
|
||||
webextensions: true
|
||||
webextensions: true,
|
||||
},
|
||||
extends: 'eslint:recommended',
|
||||
extends: "eslint:recommended",
|
||||
globals: {
|
||||
Atomics: 'readonly',
|
||||
SharedArrayBuffer: 'readonly'
|
||||
Atomics: "readonly",
|
||||
SharedArrayBuffer: "readonly",
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018
|
||||
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
|
||||
}
|
||||
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
|
||||
}
|
||||
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
|
||||
}
|
||||
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"],
|
||||
},
|
||||
};
|
||||
|
15
Makefile
15
Makefile
@@ -32,16 +32,16 @@ ls:
|
||||
ls -lah $(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
|
||||
clean: rc clean-artifacts
|
||||
rm -fr ../i2psetproxy.js.zip ../i2p_proxy*.xpi ../i2p*.xpi *.torrent #../i2psetproxy.js_*.*
|
||||
rm -fr ../i2psetproxy.js.zip ../i2p_proxy*.xpi *.torrent #../i2psetproxy.js_*.*
|
||||
|
||||
## EVEN RELEASES are AMO RELEASES
|
||||
## ODD RELEASES are SELFHOSTED RELEASES
|
||||
|
||||
MOZ_VERSION=0.80
|
||||
VERSION=0.79
|
||||
MOZ_VERSION=0.86
|
||||
VERSION=0.85
|
||||
|
||||
## INCREMENT THIS EVERY TIME YOU DO A RELEASE
|
||||
LAST_VERSION=0.77
|
||||
LAST_VERSION=0.83
|
||||
|
||||
YELLOW=F7E59A
|
||||
ORANGE=FFC56D
|
||||
@@ -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 \
|
||||
@@ -286,6 +286,9 @@ fmt-js:
|
||||
fixjsstyle manifest.json
|
||||
#find . -path ./node_modules -prune -o -name '*.json' -exec fixjsstyle --write {} \;
|
||||
|
||||
fmt-prettier:
|
||||
find . -name '*.js*' -exec $(HOME)/node_modules/.bin/prettier -w {} \;
|
||||
|
||||
lint:
|
||||
|
||||
gjslint *.js; true
|
||||
|
48
README.md
48
README.md
@@ -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,10 +111,11 @@ Usage:
|
||||
console URL's and placing applications under their own origin.
|
||||
* 
|
||||
* [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.
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* [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.
|
||||
@@ -178,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/)
|
||||
@@ -192,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.
|
||||
|
@@ -159,12 +159,12 @@
|
||||
"message": "Web Browser (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"localPreface": {
|
||||
"message": "Localhost Browser",
|
||||
"ircPreface": {
|
||||
"message": "Dispatch IRC",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"localPrefacePrivate": {
|
||||
"message": "Localhost Browser (Private)",
|
||||
"ircPrefacePrivate": {
|
||||
"message": "Dispatch IRC (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"routerPreface": {
|
||||
|
182
background.js
182
background.js
@@ -10,8 +10,8 @@ var torrentpref = chrome.i18n.getMessage('torrentPreface');
|
||||
var torrentprefpriv = chrome.i18n.getMessage('torrentPrefacePrivate');
|
||||
var tunnelpref = chrome.i18n.getMessage('i2ptunnelPreface');
|
||||
var tunnelprefpriv = chrome.i18n.getMessage('i2ptunnelPrefacePrivate');
|
||||
var localpref = chrome.i18n.getMessage('localPreface');
|
||||
var localprefpriv = chrome.i18n.getMessage('localPrefacePrivate');
|
||||
var ircpref = chrome.i18n.getMessage('ircPreface');
|
||||
var ircprefpriv = chrome.i18n.getMessage('ircPrefacePrivate');
|
||||
var extensionpref = chrome.i18n.getMessage('extensionPreface');
|
||||
var muwirepref = chrome.i18n.getMessage('muwirePreface');
|
||||
|
||||
@@ -27,7 +27,7 @@ function onContextsGot(contexts) {
|
||||
.create({
|
||||
name: titlepref,
|
||||
color: 'orange',
|
||||
icon: 'fingerprint'
|
||||
icon: 'fingerprint',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
@@ -36,7 +36,7 @@ function onContextsGot(contexts) {
|
||||
.create({
|
||||
name: webpref,
|
||||
color: 'red',
|
||||
icon: 'circle'
|
||||
icon: 'circle',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
@@ -45,7 +45,7 @@ function onContextsGot(contexts) {
|
||||
.create({
|
||||
name: routerpref,
|
||||
color: 'blue',
|
||||
icon: 'briefcase'
|
||||
icon: 'briefcase',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
@@ -54,7 +54,7 @@ function onContextsGot(contexts) {
|
||||
.create({
|
||||
name: tunnelpref,
|
||||
color: 'green',
|
||||
icon: 'tree'
|
||||
icon: 'tree',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
@@ -63,7 +63,7 @@ function onContextsGot(contexts) {
|
||||
.create({
|
||||
name: mailpref,
|
||||
color: 'yellow',
|
||||
icon: 'briefcase'
|
||||
icon: 'briefcase',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
@@ -72,25 +72,25 @@ function onContextsGot(contexts) {
|
||||
.create({
|
||||
name: torrentpref,
|
||||
color: 'purple',
|
||||
icon: 'chill'
|
||||
icon: 'chill',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(localpref) == -1) {
|
||||
if (ids.indexOf(ircpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: localpref,
|
||||
name: ircpref,
|
||||
color: 'red',
|
||||
icon: 'fence'
|
||||
icon: 'vacation',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(localpref) == -1) {
|
||||
if (ids.indexOf(muwirepref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: muwirepref,
|
||||
color: 'turquoise',
|
||||
icon: 'gift'
|
||||
icon: 'gift',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
@@ -111,7 +111,7 @@ function onNotCreated(context) {
|
||||
browser.contextualIdentities.query({}).then(onContextsGot, onContextsError);
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != 'android') {
|
||||
browser.windows.onCreated.addListener(themeWindow);
|
||||
browser.windows.onFocusChanged.addListener(themeWindow);
|
||||
@@ -124,7 +124,7 @@ gettingInfo.then(got => {
|
||||
function themeWindowByTab(tabId) {
|
||||
function tabWindow(tab) {
|
||||
var gettingPlatformInfo = browser.runtime.getPlatformInfo();
|
||||
gettingPlatformInfo.then(got => {
|
||||
gettingPlatformInfo.then((got) => {
|
||||
if (got.os == 'android') {
|
||||
let getwindow = browser.tabs.get(tab.tabId);
|
||||
getwindow.then(themeWindow);
|
||||
@@ -167,38 +167,42 @@ function themeWindow(window) {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#363A68',
|
||||
toolbar: '#363A68'
|
||||
}
|
||||
toolbar: '#363A68',
|
||||
},
|
||||
});
|
||||
} else {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#363A68',
|
||||
toolbar: '#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: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
} else {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
}
|
||||
} else if (context.name == tunnelpref) {
|
||||
@@ -207,15 +211,15 @@ function themeWindow(window) {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
} else {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
}
|
||||
} else if (context.name == mailpref) {
|
||||
@@ -224,15 +228,15 @@ function themeWindow(window) {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
} else {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
}
|
||||
} else if (context.name == torrentpref) {
|
||||
@@ -241,15 +245,15 @@ function themeWindow(window) {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
} else {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7'
|
||||
}
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -261,13 +265,13 @@ function themeWindow(window) {
|
||||
browser.contextualIdentities
|
||||
.get(tabInfo[0].cookieStoreId)
|
||||
.then(onContextGotTheme, onThemeError);
|
||||
}else {
|
||||
} 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 {
|
||||
} else {
|
||||
browser.theme.update(window.id, { colors: null });
|
||||
}
|
||||
}
|
||||
@@ -277,7 +281,7 @@ function themeWindow(window) {
|
||||
|
||||
var querying = browser.tabs.query({
|
||||
currentWindow: true,
|
||||
active: true
|
||||
active: true,
|
||||
});
|
||||
querying.then(logTabs, onThemeError);
|
||||
}
|
||||
@@ -294,33 +298,33 @@ function setTitle(window) {
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv + ': '
|
||||
titlePreface: titleprefpriv + ': ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titlepref + ': '
|
||||
titlePreface: titlepref + ': ',
|
||||
});
|
||||
}
|
||||
} else if (context.name == webpref) {
|
||||
console.log('Active in Web window');
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: webprefpriv + ' - '
|
||||
titlePreface: webprefpriv + ' - ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: webpref + ' - '
|
||||
titlePreface: webpref + ' - ',
|
||||
});
|
||||
}
|
||||
} else if (context.name == routerpref) {
|
||||
console.log('Active in Router Console window');
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv + ' - ' + routerprefpriv + ': '
|
||||
titlePreface: titleprefpriv + ' - ' + routerprefpriv + ': ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titlepref + ' - ' + routerpref + ': '
|
||||
titlePreface: titlepref + ' - ' + routerpref + ': ',
|
||||
});
|
||||
}
|
||||
} else if (context.name == tunnelpref) {
|
||||
@@ -328,11 +332,11 @@ function setTitle(window) {
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv + ' - ' + tunnelprefpriv + ': '
|
||||
titlePreface: titleprefpriv + ' - ' + tunnelprefpriv + ': ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titlepref + ' - ' + tunnelpref + ': '
|
||||
titlePreface: titlepref + ' - ' + tunnelpref + ': ',
|
||||
});
|
||||
}
|
||||
} else if (context.name == mailpref) {
|
||||
@@ -340,11 +344,11 @@ function setTitle(window) {
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv + ' - ' + mailprefpriv + ': '
|
||||
titlePreface: titleprefpriv + ' - ' + mailprefpriv + ': ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titlepref + ' - ' + mailpref + ': '
|
||||
titlePreface: titlepref + ' - ' + mailpref + ': ',
|
||||
});
|
||||
}
|
||||
} else if (context.name == torrentpref) {
|
||||
@@ -352,23 +356,23 @@ function setTitle(window) {
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv + ' - ' + torrentprefpriv + ': '
|
||||
titlePreface: titleprefpriv + ' - ' + torrentprefpriv + ': ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: titlepref + ' - ' + torrentpref + ': '
|
||||
titlePreface: titlepref + ' - ' + torrentpref + ': ',
|
||||
});
|
||||
}
|
||||
} else if (context.name == localpref) {
|
||||
console.log('Active in Localhost window');
|
||||
} else if (context.name == ircpref) {
|
||||
console.log('Active in IRC window');
|
||||
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: localprefpriv + ' - ' + localprefpriv + ': '
|
||||
titlePreface: ircprefpriv + ' - ' + ircprefpriv + ': ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: localpref + ' - ' + localpref + ': '
|
||||
titlePreface: ircpref + ' - ' + ircpref + ': ',
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -383,37 +387,37 @@ function setTitle(window) {
|
||||
.then(onContextGotTitle, onContextError);
|
||||
} else if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ''
|
||||
titlePreface: '',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: ''
|
||||
titlePreface: '',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var querying = browser.tabs.query({
|
||||
currentWindow: true,
|
||||
active: true
|
||||
active: true,
|
||||
});
|
||||
querying.then(logTabs, onContextError);
|
||||
}
|
||||
|
||||
var gettingListenerInfo = browser.runtime.getPlatformInfo();
|
||||
gettingListenerInfo.then(got => {
|
||||
gettingListenerInfo.then((got) => {
|
||||
function onPlatformError() {
|
||||
console.log('Error finding platform info');
|
||||
}
|
||||
if (got.os != 'android') {
|
||||
browser.tabs.onCreated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
populate: true,
|
||||
});
|
||||
getting.then(setTitle, onPlatformError);
|
||||
});
|
||||
browser.tabs.onActivated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
populate: true,
|
||||
});
|
||||
getting.then(setTitle, onPlatformError);
|
||||
});
|
||||
@@ -421,24 +425,38 @@ gettingListenerInfo.then(got => {
|
||||
});
|
||||
|
||||
function handleUpdated(updateInfo) {
|
||||
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)
|
||||
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);
|
||||
}
|
||||
}else{
|
||||
console.log("keeping stored theme:", them)
|
||||
}
|
||||
}catch{
|
||||
console.log("theme storage error")
|
||||
} catch {
|
||||
console.log("theme storage error");
|
||||
}
|
||||
}
|
||||
browser.storage.local.get("originalTheme").then(maybeSet, onError);
|
||||
|
57
bookmarks.js
57
bookmarks.js
@@ -1,7 +1,8 @@
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != 'android') {
|
||||
function bookmarks(bookmarkToolbar) {
|
||||
console.log('(bookmarks)', bookmarkToolbar);
|
||||
console.log('Setting up bookmark toolbar', bookmarkToolbar);
|
||||
function bookHome(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
@@ -11,14 +12,14 @@ gettingInfo.then(got => {
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url: 'about:I2p',
|
||||
title: 'I2P Extension Home Page',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
} else {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: browser.runtime.getURL('home.html'),
|
||||
title: 'I2P Extension Home Page',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
}
|
||||
@@ -39,7 +40,7 @@ gettingInfo.then(got => {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/i2psnark',
|
||||
title: 'Bittorrent',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
@@ -47,7 +48,7 @@ gettingInfo.then(got => {
|
||||
url:
|
||||
'http://' + control_host + ':' + control_port + '/i2psnark',
|
||||
title: 'Bittorrent',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
@@ -67,14 +68,14 @@ gettingInfo.then(got => {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/home',
|
||||
title: 'I2P Console',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url: 'http://' + control_host + ':' + control_port + '/home',
|
||||
title: 'I2P Console',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
@@ -94,14 +95,14 @@ gettingInfo.then(got => {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/webmail',
|
||||
title: 'Web Mail',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url: 'http://' + control_host + ':' + control_port + '/webmail',
|
||||
title: 'Web Mail',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
@@ -122,7 +123,7 @@ gettingInfo.then(got => {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/i2ptunnel',
|
||||
title: 'Hidden Services Manager',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
@@ -130,7 +131,7 @@ gettingInfo.then(got => {
|
||||
url:
|
||||
'http://' + control_host + ':' + control_port + '/i2ptunnel',
|
||||
title: 'Hidden Services Manager',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
@@ -152,53 +153,53 @@ gettingInfo.then(got => {
|
||||
}
|
||||
|
||||
var b0 = browser.bookmarks.search({
|
||||
title: 'I2P Extension Home Page'
|
||||
title: 'I2P Extension Home Page',
|
||||
});
|
||||
b0.then(bookHome, onRejected);
|
||||
|
||||
var b1 = browser.bookmarks.search({
|
||||
title: 'Bittorrent'
|
||||
title: 'Bittorrent',
|
||||
});
|
||||
b1.then(bookTorrent, onRejected);
|
||||
|
||||
var b2 = browser.bookmarks.search({
|
||||
title: 'Hidden Services Manager'
|
||||
title: 'Hidden Services Manager',
|
||||
});
|
||||
b2.then(bookI2PTunnel, onRejected);
|
||||
|
||||
var b3 = browser.bookmarks.search({
|
||||
title: 'Web Mail'
|
||||
title: 'Web Mail',
|
||||
});
|
||||
b3.then(bookMail, onRejected);
|
||||
|
||||
var b4 = browser.bookmarks.search({
|
||||
title: 'I2P Console'
|
||||
title: 'I2P Console',
|
||||
});
|
||||
b4.then(bookConsole, onRejected);
|
||||
}
|
||||
|
||||
var bt = browser.bookmarks.search({
|
||||
query: 'Toolbar'
|
||||
query: 'Toolbar',
|
||||
});
|
||||
|
||||
function toolDir(bookmarkToolbar) {
|
||||
var ibbt = browser.bookmarks.search('I2P Toolbar');
|
||||
function setupDir(ibbt) {
|
||||
function onToolbarCreated(node) {
|
||||
var ibt = browser.bookmarks.search('I2P Toolbar');
|
||||
ibt.then(bookmarks);
|
||||
}
|
||||
if (ibbt[0] == null) {
|
||||
var ibbt = browser.bookmarks.search('I2P Toolbar');
|
||||
function setupDir(ibbt) {
|
||||
function onToolbarCreated(node) {
|
||||
var ibt = browser.bookmarks.search('I2P Toolbar');
|
||||
ibt.then(bookmarks);
|
||||
}
|
||||
if (ibbt[0] == null) {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
title: 'I2P Toolbar',
|
||||
parentId: bookmarkToolbar[0].id
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onToolbarCreated);
|
||||
}
|
||||
}
|
||||
ibbt.then(setupDir);
|
||||
}
|
||||
ibbt.then(setupDir);
|
||||
}
|
||||
bt.then(toolDir);
|
||||
bt.then(toolDir);
|
||||
|
||||
function handleCreated(id, bookmarkInfo) {
|
||||
//var propValue;
|
||||
|
2
cert.js
2
cert.js
@@ -35,7 +35,7 @@ function tabCheck(tabInfo) {
|
||||
if (host.startsWith('https')) {
|
||||
contentUpdateById('AddressCertInfo', 'certPresent');
|
||||
console.log('(cert) initiating request to check server cert');
|
||||
fetch(host).then(response => {
|
||||
fetch(host).then((response) => {
|
||||
console.log('Updating cert information', response);
|
||||
});
|
||||
} else {
|
||||
|
@@ -48,7 +48,7 @@ contentUpdateById('sources', 'sources');
|
||||
contentUpdateById('window-visit-releases', 'windowVisitReleases');
|
||||
contentUpdateById('releases', 'releases');
|
||||
|
||||
fetch('http://proxy.i2p').then(myJson => {
|
||||
fetch('http://proxy.i2p').then((myJson) => {
|
||||
console.log('FETCH RESULT', myJson);
|
||||
contentUpdateById('proxy-check', 'proxySuccessStatus');
|
||||
});
|
||||
|
16
context.js
16
context.js
@@ -11,22 +11,22 @@ function eventHandler(event) {
|
||||
browser.tabs.create({
|
||||
windowId: windowInfo.id,
|
||||
url: 'about:blank',
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
cookieStoreId: event.target.dataset.identity,
|
||||
});
|
||||
}
|
||||
if (event.target.dataset.action == 'create') {
|
||||
var creating = browser.tabs.create({
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
cookieStoreId: event.target.dataset.identity,
|
||||
});
|
||||
creating.then(onCreated, onError);
|
||||
}
|
||||
if (event.target.dataset.action == 'close-all') {
|
||||
browser.tabs
|
||||
.query({
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
cookieStoreId: event.target.dataset.identity,
|
||||
})
|
||||
.then(tabs => {
|
||||
browser.tabs.remove(tabs.map(rem => rem.id));
|
||||
.then((tabs) => {
|
||||
browser.tabs.remove(tabs.map((rem) => rem.id));
|
||||
});
|
||||
}
|
||||
event.preventDefault();
|
||||
@@ -52,9 +52,9 @@ if (browser.contextualIdentities === undefined) {
|
||||
} else {
|
||||
browser.contextualIdentities
|
||||
.query({
|
||||
name: titlepref
|
||||
name: titlepref,
|
||||
})
|
||||
.then(identities => {
|
||||
.then((identities) => {
|
||||
if (!identities.length) {
|
||||
div.innerText = "No identities returned from the API.";
|
||||
return;
|
||||
@@ -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}`;
|
||||
|
22
debian/changelog
vendored
22
debian/changelog
vendored
@@ -1,3 +1,25 @@
|
||||
i2psetproxy.js (0.83-1) UNRELEASED; urgency=low
|
||||
|
||||
* Fix a bug which was causing i2psnark to fail to isolate.
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 10 NOV 2020 1:33:50 -0400
|
||||
|
||||
|
||||
i2psetproxy.js (0.83-1) UNRELEASED; urgency=low
|
||||
|
||||
* Add a tab for I2P-Native Dispatch
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 10 NOV 2020 22:00:01 -0400
|
||||
|
||||
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
|
||||
|
@@ -1,7 +1,9 @@
|
||||
function routerHost(url) {
|
||||
console.log('(urlcheck) HANDLER URL CHECK');
|
||||
let hostname = '';
|
||||
let path = '';
|
||||
function pathcheck(str) {
|
||||
console.log('(urlcheck) HANDLER PATH CHECK', str);
|
||||
if (str != undefined) {
|
||||
let final = str.split('/')[0];
|
||||
if (final === 'i2ptunnelmgr' || final === 'i2ptunnel') {
|
||||
@@ -11,7 +13,8 @@ function routerHost(url) {
|
||||
final === 'i2psnark' ||
|
||||
final === 'torrents' ||
|
||||
final.startsWith('transmission') ||
|
||||
final.startsWith('tracker')
|
||||
final.startsWith('tracker') ||
|
||||
str.includes(':7662')
|
||||
) {
|
||||
console.log('(urlcheck) Torrent application path', final);
|
||||
return 'i2psnark';
|
||||
@@ -20,8 +23,8 @@ 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' ||
|
||||
|
46
home.css
46
home.css
@@ -1,23 +1,20 @@
|
||||
* {
|
||||
padding: 0;
|
||||
background: #1f1a24;
|
||||
color: #e6e6e7;
|
||||
color: #1f1a24;
|
||||
margin: 0
|
||||
}
|
||||
a,
|
||||
button {
|
||||
color: #3b6bbf;
|
||||
color: #1f1a24;
|
||||
text-decoration: none;
|
||||
background: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0;
|
||||
padding: 3px;
|
||||
display: inline-block;
|
||||
margin: auto
|
||||
}
|
||||
.applicationDesc {
|
||||
color: #e6e6e7;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
@@ -39,7 +36,6 @@ button {
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
width: 90%;
|
||||
outline: 0
|
||||
}
|
||||
body {
|
||||
@@ -48,14 +44,12 @@ body {
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
margin: 0 auto;
|
||||
padding: 0;
|
||||
color: #e6e6e7;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.button-list {
|
||||
display: inline-flex;
|
||||
min-height: 230px;
|
||||
min-width: 230px
|
||||
}
|
||||
@@ -67,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: #e6e6e7;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
@@ -78,7 +71,7 @@ p {
|
||||
margin: 1.5rem;
|
||||
display: block;
|
||||
border-radius: 2px;
|
||||
min-width: 95%
|
||||
min-width: 100%
|
||||
}
|
||||
#header,
|
||||
.application-info,
|
||||
@@ -90,7 +83,7 @@ p {
|
||||
margin-top: 1.5rem;
|
||||
display: block;
|
||||
border-radius: 2px;
|
||||
min-width: 95%
|
||||
min-width: 100%
|
||||
}
|
||||
h1 {
|
||||
margin: auto;
|
||||
@@ -98,6 +91,8 @@ h1 {
|
||||
font-weight: 600;
|
||||
font-size: 32px;
|
||||
color: #e6e6e7;
|
||||
background: #1f1a24;
|
||||
width: 100%;
|
||||
border-radius: 2px 2px 0 0
|
||||
}
|
||||
h2,
|
||||
@@ -108,7 +103,8 @@ h3 {
|
||||
font-size: 25px;
|
||||
color: #e6e6e7;
|
||||
border-radius: 2px 2px 0 0;
|
||||
width: 90%;
|
||||
background: #1f1a24;
|
||||
width: 100%;
|
||||
padding-left: 5%
|
||||
}
|
||||
h4 {
|
||||
@@ -118,7 +114,8 @@ h4 {
|
||||
font-size: 20px!important;
|
||||
color: #41465f;
|
||||
border-radius: 2px 2px 0 0;
|
||||
width: 90%;
|
||||
background: #1f1a24;
|
||||
width: 100%;
|
||||
padding-left: 5%
|
||||
}
|
||||
.showhider {
|
||||
@@ -126,7 +123,6 @@ h4 {
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
border: none;
|
||||
padding: 0!important;
|
||||
width: 90%;
|
||||
color: #3b6bbf;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
@@ -144,12 +140,16 @@ h4 {
|
||||
}
|
||||
ul {
|
||||
margin: auto;
|
||||
width: 85vw;
|
||||
border-radius: 2px
|
||||
border-radius: 2px;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
li {
|
||||
display: block;
|
||||
text-align: center
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
.center {
|
||||
display: block;
|
||||
@@ -264,20 +264,12 @@ button.applicationName {
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
width: 90%;
|
||||
margin: 3%
|
||||
}
|
||||
img.readyness {
|
||||
height: 100%;
|
||||
width: auto
|
||||
}
|
||||
@media only screen and (max-width: 399px) {
|
||||
.application-info {
|
||||
display: none
|
||||
}
|
||||
}
|
||||
@media only screen and (max-height: 399px) {
|
||||
body {
|
||||
flex-direction: row
|
||||
}
|
||||
input {
|
||||
color: #1f1a24
|
||||
}
|
@@ -131,11 +131,11 @@
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<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>
|
||||
<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 class="application">
|
||||
<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>
|
||||
<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>
|
||||
|
||||
|
2
home.js
2
home.js
@@ -1,4 +1,4 @@
|
||||
document.addEventListener('click', clickEvent => {
|
||||
document.addEventListener('click', (clickEvent) => {
|
||||
if (clickEvent.target.id === 'onboardingButtonZero') {
|
||||
flipVisibility('onboardingContentZero');
|
||||
} else if (clickEvent.target.id === 'onboardingButtonOne') {
|
||||
|
17
host.js
17
host.js
@@ -60,6 +60,7 @@ function i2pHost(url) {
|
||||
}
|
||||
|
||||
function routerHost(url) {
|
||||
console.log('(urlcheck) HOST URL CHECK');
|
||||
let hostname = '';
|
||||
let path = '';
|
||||
function pathcheck(str) {
|
||||
@@ -72,7 +73,8 @@ function routerHost(url) {
|
||||
final === 'i2psnark' ||
|
||||
final === 'torrents' ||
|
||||
final.startsWith('transmission') ||
|
||||
final.startsWith('tracker')
|
||||
final.startsWith('tracker') ||
|
||||
str.includes(':7662')
|
||||
) {
|
||||
console.log('(urlcheck) Torrent application path', final);
|
||||
return 'i2psnark';
|
||||
@@ -81,8 +83,8 @@ 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' ||
|
||||
@@ -111,15 +113,6 @@ 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);
|
||||
}
|
||||
|
@@ -27,11 +27,11 @@ function send(
|
||||
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
|
||||
credentials: 'same-origin', // include, *same-origin, omit
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
redirect: 'follow', // manual, *follow, error
|
||||
referrerPolicy: 'no-referrer', // no-referrer, *client
|
||||
body: requestBody // body data type must match "Content-Type" header
|
||||
body: requestBody, // body data type must match "Content-Type" header
|
||||
};
|
||||
const response = await fetch(url, opts);
|
||||
return await response.json(); // parses JSON response into native JavaScript objects
|
||||
|
Binary file not shown.
243
index.html
243
index.html
@@ -1,36 +1,34 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<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" />
|
||||
<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">
|
||||
</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
|
||||
</code></pre>
|
||||
@@ -40,7 +38,7 @@ command:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="magnet:?xt=urn:btih:5f45673bc107ec42a8b4d02aa4d5d7487949fc66">Magnet Link</a>
|
||||
<a href="magnet:?xt=urn:btih:09841bd5ca003fa37818754f4bee988698e3c0c8">Magnet Link</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
@@ -107,7 +105,7 @@ command:</p>
|
||||
<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>[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 alt="Visiting i2psnark" src="i2psnark.png" title="">
|
||||
</li>
|
||||
@@ -115,6 +113,9 @@ command:</p>
|
||||
<li><img alt="Monitoring torrents" src="transmissionrpc.png" title="">
|
||||
</li>
|
||||
|
||||
<li><img alt="Distribute your site as a torrent." src="x-i2p-torrentlocation.png" 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>
|
||||
@@ -198,9 +199,11 @@ command:</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>The Old Version</h2>
|
||||
<h2>The <strong>Other</strong> 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>
|
||||
<p>New versions of this extension create an I2P in Private Browsing mode instead, using container tabs.</p>
|
||||
|
||||
<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>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -214,194 +217,6 @@ command:</p>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<ul>
|
||||
<li><a href="magnet:?xt=urn:btih:61dcc15f0363cb027ed7d56a9dcff3408dfdf9c4">Magnet Link</a></li>
|
||||
<li><a href="./i2ppb@eyedeekay.github.io.xpi.torrent">Get the .torrent file</a></li>
|
||||
</ul>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<h3>Features</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>
|
||||
<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. If I
|
||||
can.</li>
|
||||
<li><img src="i2psnark.png" alt="Visiting i2psnark" title="" /></li>
|
||||
<li><img src="transmissionrpc.png" alt="Monitoring torrents" 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 src="clearweb.png" alt="Visiting clearweb" title="" /></li>
|
||||
</ul>
|
||||
|
||||
<h3>Video</h3>
|
||||
|
||||
<ul>
|
||||
<li><img src="i2psetproxy.js.gif" alt="Video of the plugin in action" 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>
|
||||
|
19
info.css
19
info.css
@@ -1,12 +1,20 @@
|
||||
body,
|
||||
html {
|
||||
|
||||
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;
|
||||
width: 450px;
|
||||
display: block;
|
||||
margin-left: 1em
|
||||
}
|
||||
@@ -51,5 +59,8 @@ img.readyness {
|
||||
display: none
|
||||
}
|
||||
.torrent-progress {
|
||||
width: 100%
|
||||
width: 90%
|
||||
}
|
||||
.tabicon {
|
||||
width: 32px
|
||||
}
|
66
info.js
66
info.js
@@ -1,6 +1,6 @@
|
||||
function checkPeerConnection() {
|
||||
let getting = browser.privacy.network.peerConnectionEnabled.get({});
|
||||
getting.then(got => {
|
||||
getting.then((got) => {
|
||||
let webrtc = got.value;
|
||||
console.log('checking webrtc', webrtc);
|
||||
if (document.getElementById('enable-web-rtc') !== null)
|
||||
@@ -29,7 +29,7 @@ checkSnowflake();
|
||||
|
||||
function checkHistory() {
|
||||
let getting = browser.storage.local.get("disable_history");
|
||||
getting.then(got => {
|
||||
getting.then((got) => {
|
||||
let disable_history = got.disable_history;
|
||||
if (disable_history == undefined) {
|
||||
disable_history = false;
|
||||
@@ -42,11 +42,11 @@ function checkHistory() {
|
||||
|
||||
checkHistory();
|
||||
|
||||
document.addEventListener("click", clickEvent => {
|
||||
document.addEventListener("click", (clickEvent) => {
|
||||
if (clickEvent.target.id === "window-create-help-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true
|
||||
incognito: true,
|
||||
};
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(() => {
|
||||
@@ -55,7 +55,7 @@ document.addEventListener("click", clickEvent => {
|
||||
} else if (clickEvent.target.id === "window-create-news-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true
|
||||
incognito: true,
|
||||
};
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(() => {
|
||||
@@ -68,7 +68,7 @@ document.addEventListener("click", clickEvent => {
|
||||
const url = "http://" + controlHost + ":" + controlPort;
|
||||
Http.open("GET", url);
|
||||
Http.send();
|
||||
Http.onreadystatechange = event => {
|
||||
Http.onreadystatechange = (event) => {
|
||||
console.log(Http.responseText);
|
||||
};
|
||||
}
|
||||
@@ -80,28 +80,30 @@ document.addEventListener("click", clickEvent => {
|
||||
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"){
|
||||
if (document.getElementById("label-status-list").style.display !== "none") {
|
||||
console.log("hiding label-status-list");
|
||||
document.getElementById("label-status-list").style.display = "none"
|
||||
}else{
|
||||
document.getElementById("label-status-list").style.display = "none";
|
||||
} else {
|
||||
console.log("showing label-status-list");
|
||||
document.getElementById("label-status-list").style.display = "block"
|
||||
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"){
|
||||
if (document.getElementById("label-peers-list").style.display !== "none") {
|
||||
console.log("hiding label-peers-list");
|
||||
document.getElementById("label-peers-list").style.display = "none"
|
||||
}else{
|
||||
document.getElementById("label-peers-list").style.display = "none";
|
||||
} else {
|
||||
console.log("showing label-peers-list");
|
||||
document.getElementById("label-peers-list").style.display = "block"
|
||||
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"){
|
||||
if (
|
||||
document.getElementById("label-bandwidth-list").style.display !== "none"
|
||||
) {
|
||||
console.log("hiding label-bandwidth-list");
|
||||
document.getElementById("label-bandwidth-list").style.display = "none"
|
||||
}else{
|
||||
document.getElementById("label-bandwidth-list").style.display = "none";
|
||||
} else {
|
||||
console.log("showing label-bandwidth-list");
|
||||
document.getElementById("label-bandwidth-list").style.display = "block"
|
||||
document.getElementById("label-bandwidth-list").style.display = "block";
|
||||
}
|
||||
} else if (clickEvent.target.id === "search-submit") {
|
||||
console.log("attempting to create search tab");
|
||||
@@ -157,21 +159,21 @@ document.addEventListener("click", clickEvent => {
|
||||
clickEvent.preventDefault();
|
||||
});
|
||||
|
||||
window.onload = function(e){
|
||||
window.onload = function (e) {
|
||||
if (document.getElementById("label-peers-list") != null) {
|
||||
document.getElementById("label-peers-list").style.display = "none"
|
||||
document.getElementById("label-peers-list").style.display = "none";
|
||||
}
|
||||
if (document.getElementById("label-bandwidth-list") != null) {
|
||||
document.getElementById("label-bandwidth-list").style.display = "none"
|
||||
document.getElementById("label-bandwidth-list").style.display = "none";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function proxyReadiness() {
|
||||
console.log(this.responseText);
|
||||
}
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != "android") {
|
||||
browser.history.onVisited.addListener(onVisited);
|
||||
}
|
||||
@@ -196,14 +198,14 @@ function goHome() {
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
let createRhizomeData = {
|
||||
url: "about:I2p"
|
||||
url: "about:I2p",
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createRhizomeData);
|
||||
creating.then(onTabCreated, onTabError);
|
||||
} else {
|
||||
let createData = {
|
||||
url: "home.html"
|
||||
url: "home.html",
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
@@ -221,7 +223,7 @@ function goIndex() {
|
||||
console.log("Help tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "index.html"
|
||||
url: "index.html",
|
||||
};
|
||||
console.log("visiting help");
|
||||
let creating = browser.tabs.create(createData);
|
||||
@@ -249,7 +251,7 @@ function goSearch() {
|
||||
url:
|
||||
"http://yacy.idk.i2p/yacysearch.html?" +
|
||||
"query=" +
|
||||
document.getElementById("search-query").value
|
||||
document.getElementById("search-query").value,
|
||||
};
|
||||
console.log("visiting legwork");
|
||||
let creating = browser.tabs.create(createData);
|
||||
@@ -267,7 +269,7 @@ function goTunnel() {
|
||||
console.log("I2PTunnel tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + routerAddr() + "/i2ptunnel"
|
||||
url: "http://" + routerAddr() + "/i2ptunnel",
|
||||
};
|
||||
console.log("visiting i2ptunnel");
|
||||
let creating = browser.tabs.create(createData);
|
||||
@@ -279,7 +281,7 @@ function goMail() {
|
||||
console.log("Mail tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + routerAddr() + "/susimail"
|
||||
url: "http://" + routerAddr() + "/susimail",
|
||||
};
|
||||
console.log("visiting mail");
|
||||
let creating = browser.tabs.create(createData);
|
||||
@@ -291,7 +293,7 @@ function goSnark() {
|
||||
console.log("Snark tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + routerAddr() + "/i2psnark"
|
||||
url: "http://" + routerAddr() + "/i2psnark",
|
||||
};
|
||||
console.log("visiting snark");
|
||||
let creating = browser.tabs.create(createData);
|
||||
@@ -310,7 +312,7 @@ function onVisited(historyItem) {
|
||||
function onRemoved() {
|
||||
var searching = browser.history.search({
|
||||
text: historyItem.url,
|
||||
startTime: 0
|
||||
startTime: 0,
|
||||
});
|
||||
searching.then(onCleaned);
|
||||
}
|
||||
@@ -327,6 +329,6 @@ if (UpdateContents !== undefined) UpdateContents();
|
||||
const minutes = 0.2;
|
||||
const interval = minutes * 60 * 1000;
|
||||
|
||||
setInterval(function() {
|
||||
setInterval(function () {
|
||||
if (UpdateContents !== undefined) UpdateContents();
|
||||
}, interval);
|
||||
|
@@ -1,15 +1,14 @@
|
||||
|
||||
function gotCurrent(tab) {
|
||||
function gotTitle(title) {
|
||||
let addr = title;
|
||||
document.getElementById('TypeInfo').innerHTML = '<div class=\"AddressInfo\"><a href=\"' + addr + '\">' + addr + '</a></div>';
|
||||
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
|
||||
tabId: tab[0].id,
|
||||
});
|
||||
gettingTitle.then(gotTitle);
|
||||
|
||||
}
|
||||
|
||||
function tabError(error) {
|
||||
|
@@ -26,7 +26,7 @@
|
||||
],
|
||||
"manifest_version": 2,
|
||||
"name": "__MSG_extensionName__",
|
||||
"version": "0.77",
|
||||
"version": "0.83",
|
||||
"description": "__MSG_extensionDescription__",
|
||||
"homepage_url": "https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox",
|
||||
"icons": {
|
||||
|
@@ -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
|
||||
}
|
@@ -411,7 +411,7 @@ function onError(e) {
|
||||
}
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != 'android') {
|
||||
chrome.storage.local.get(function(got) {
|
||||
let settings = checkStoredSettings(got);
|
||||
|
@@ -1,7 +1,7 @@
|
||||
var android = false;
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == 'android') {
|
||||
console.log('Running in Android detected');
|
||||
android = true;
|
||||
|
76
privacy.js
76
privacy.js
@@ -12,10 +12,10 @@ function onSet(result) {
|
||||
risky sites in your browser */
|
||||
function disableHyperlinkAuditing() {
|
||||
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
console.log('Disabling hyperlink auditing/val=', {
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
@@ -23,10 +23,10 @@ function disableHyperlinkAuditing() {
|
||||
// This enables first-party isolation
|
||||
function enableFirstPartyIsolation() {
|
||||
var setting = browser.privacy.websites.firstPartyIsolate.set({
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
console.log('Enabling first party isolation/val=', {
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
@@ -36,18 +36,18 @@ function enableFirstPartyIsolation() {
|
||||
interface for now */
|
||||
function disableEvilCookies() {
|
||||
var getting = browser.privacy.websites.cookieConfig.get({});
|
||||
getting.then(got => {
|
||||
getting.then((got) => {
|
||||
var setting = browser.privacy.websites.cookieConfig.set({
|
||||
value: {
|
||||
behavior: 'reject_third_party',
|
||||
nonPersistentCookies: got.value.nonPersistentCookies
|
||||
}
|
||||
nonPersistentCookies: got.value.nonPersistentCookies,
|
||||
},
|
||||
});
|
||||
console.log('Setting cookie behavior/val=', {
|
||||
value: {
|
||||
behavior: 'reject_third_party',
|
||||
nonPersistentCookies: got.value.nonPersistentCookies
|
||||
}
|
||||
nonPersistentCookies: got.value.nonPersistentCookies,
|
||||
},
|
||||
});
|
||||
setting.then(onSet);
|
||||
});
|
||||
@@ -67,10 +67,10 @@ function disableEvilCookies() {
|
||||
// this disables the use of referrer headers
|
||||
function disableReferrers() {
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
console.log("Disabling referrer headers/val=", {
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
@@ -78,10 +78,10 @@ function disableReferrers() {
|
||||
// enable fingerprinting resistent features(letterboxing and stuff)
|
||||
function enableResistFingerprinting() {
|
||||
var setting = browser.privacy.websites.resistFingerprinting.set({
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
console.log("Enabling resist fingerprinting/val=", {
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
@@ -89,10 +89,10 @@ function enableResistFingerprinting() {
|
||||
// This is essentially a blocklist of clearnet web-sites known to do bad tracking
|
||||
function enableTrackingProtection() {
|
||||
var setting = browser.privacy.websites.trackingProtectionMode.set({
|
||||
value: "always"
|
||||
value: "always",
|
||||
});
|
||||
console.log("Enabling tracking protection/val=", {
|
||||
value: "always"
|
||||
value: "always",
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
@@ -101,15 +101,15 @@ function enableTrackingProtection() {
|
||||
management dependent on identifying information */
|
||||
function disableDigitalRestrictionsManagement() {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "win") {
|
||||
var setting = browser.privacy.websites.protectedContentEnabled.set({
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
console.log(
|
||||
"Setting Protected Content(Digital Restrictions Management) false/val=",
|
||||
{
|
||||
value: false
|
||||
value: false,
|
||||
}
|
||||
);
|
||||
setting.then(onSet);
|
||||
@@ -134,7 +134,7 @@ function ResetPeerConnection() {
|
||||
var webrtc = true;
|
||||
console.log("No snowflake plugin found, pre-disabled WebRTC");
|
||||
var rtc = browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: webrtc
|
||||
value: webrtc,
|
||||
});
|
||||
rtc.then(AssurePeerConnection);
|
||||
}
|
||||
@@ -151,7 +151,7 @@ function ResetPeerConnection() {
|
||||
function EnablePeerConnection() {
|
||||
var webrtc = true;
|
||||
var rtc = browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: webrtc
|
||||
value: webrtc,
|
||||
});
|
||||
rtc.then(AssurePeerConnection);
|
||||
console.log("Enabled WebRTC");
|
||||
@@ -160,13 +160,13 @@ function EnablePeerConnection() {
|
||||
function AssurePeerConnection() {
|
||||
function assure(webrtc) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
browser.privacy.network.networkPredictionEnabled.set({
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "disable_non_proxied_udp"
|
||||
value: "disable_non_proxied_udp",
|
||||
});
|
||||
}
|
||||
let rtc = browser.privacy.network.peerConnectionEnabled.get({});
|
||||
@@ -174,7 +174,7 @@ function AssurePeerConnection() {
|
||||
}
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "android") {
|
||||
browser.tabs.onCreated.addListener(ResetPeerConnection);
|
||||
} else {
|
||||
@@ -185,14 +185,14 @@ gettingInfo.then(got => {
|
||||
|
||||
function ResetDisableSavePasswords() {
|
||||
browser.privacy.services.passwordSavingEnabled.set({
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
console.log("Re-disabled saved passwords");
|
||||
}
|
||||
|
||||
function EnableSavePasswords() {
|
||||
browser.privacy.services.passwordSavingEnabled.set({
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
console.log("Enabled saved passwords");
|
||||
}
|
||||
@@ -201,7 +201,7 @@ function EnableSavePasswords() {
|
||||
|
||||
var defaultSettings = {
|
||||
since: "forever",
|
||||
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"]
|
||||
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"],
|
||||
};
|
||||
|
||||
function onError(therror) {
|
||||
@@ -217,7 +217,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
const times = {
|
||||
hour: () => 1000 * 60 * 60,
|
||||
day: () => 1000 * 60 * 60 * 24,
|
||||
week: () => 1000 * 60 * 60 * 24 * 7
|
||||
week: () => 1000 * 60 * 60 * 24 * 7,
|
||||
};
|
||||
|
||||
const sinceMilliseconds = times[selectedSince].call();
|
||||
@@ -241,7 +241,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
browser.notifications.create({
|
||||
type: "basic",
|
||||
title: "Removed browsing data",
|
||||
message: `Removed ${dataTypesString}\n for I2P Browsing`
|
||||
message: `Removed ${dataTypesString}\n for I2P Browsing`,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -250,41 +250,41 @@ function forgetBrowsingData(storedSettings) {
|
||||
for (let item of historyItems) {
|
||||
if (i2pHost(item.url)) {
|
||||
browser.history.deleteUrl({
|
||||
url: item.url
|
||||
url: item.url,
|
||||
});
|
||||
browser.browsingData.removeCache({});
|
||||
console.log("cleared Cache");
|
||||
browser.browsingData
|
||||
.removePasswords({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
since,
|
||||
})
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Passwords");
|
||||
browser.browsingData
|
||||
.removeDownloads({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
since,
|
||||
})
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Downloads");
|
||||
browser.browsingData
|
||||
.removeFormData({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
since,
|
||||
})
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Form Data");
|
||||
browser.browsingData
|
||||
.removeLocalStorage({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since
|
||||
since,
|
||||
})
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Local Storage");
|
||||
|
||||
let contexts = browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
name: titlepref,
|
||||
});
|
||||
|
||||
function deepCleanCookies(cookies) {
|
||||
@@ -292,7 +292,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
var removing = browser.cookies.remove({
|
||||
firstPartyDomain: cookie.firstPartyDomain,
|
||||
name: cookie.name,
|
||||
url: item.url
|
||||
url: item.url,
|
||||
});
|
||||
removing.then(onContextGotLog, onError);
|
||||
}
|
||||
@@ -303,7 +303,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
for (let cookieStoreId of cookieStoreIds) {
|
||||
var removing = browser.cookies.getAll({
|
||||
firstPartyDomain: null,
|
||||
storeId: cookieStoreId.cookieStoreId
|
||||
storeId: cookieStoreId.cookieStoreId,
|
||||
});
|
||||
removing.then(deepCleanCookies, onError);
|
||||
}
|
||||
@@ -317,7 +317,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
|
||||
var searching = browser.history.search({
|
||||
text: "i2p",
|
||||
startTime: 0
|
||||
startTime: 0,
|
||||
});
|
||||
|
||||
searching.then(deepCleanHistory);
|
||||
|
102
proxy.js
102
proxy.js
@@ -1,17 +1,18 @@
|
||||
var titlepref = chrome.i18n.getMessage('titlePreface');
|
||||
var webpref = chrome.i18n.getMessage('webPreface');
|
||||
var ircpref = chrome.i18n.getMessage('ircPreface');
|
||||
var routerpref = chrome.i18n.getMessage('routerPreface');
|
||||
var routerprefpriv = chrome.i18n.getMessage('routerPrefacePrivate');
|
||||
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
|
||||
chrome.privacy.network.networkPredictionEnabled.set({
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: 'disable_non_proxied_udp'
|
||||
value: 'disable_non_proxied_udp',
|
||||
});
|
||||
console.log('Disabled unproxied UDP.');
|
||||
|
||||
@@ -24,41 +25,43 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
var handleProxyRequest = function(context) {
|
||||
proxy = {
|
||||
failoverTimeout: 0,
|
||||
proxyDns: false
|
||||
proxyDns: false,
|
||||
};
|
||||
if (context == 'firefox-default' || context == 'firefox-private') {
|
||||
proxy = null;
|
||||
return proxy;
|
||||
}
|
||||
console.log('(proxy), context', context);
|
||||
if (context != undefined) {
|
||||
if (context.name == titlepref) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
/*console.log("(proxy)", context.name);
|
||||
console.log("Using", proxy.type);
|
||||
console.log("proxy ", proxy.host + ":" + proxy.port);*/
|
||||
return proxy;
|
||||
} else if (context.name == routerpref) {
|
||||
if (routerHost(requestDetails.url)) {
|
||||
return proxy;
|
||||
} else if (!routerHost(requestDetails.url)) {
|
||||
if (!requestDetails.url.includes('/i2psnark/')) {
|
||||
console.log('URL', requestDetails.url);
|
||||
proxy = {
|
||||
type: 'http',
|
||||
host: 'localhost',
|
||||
port: '65535'
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
}
|
||||
return proxy;
|
||||
} else if (context.name == ircpref) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
port: getPort(),
|
||||
};
|
||||
/*console.log("(proxy)", context.name);
|
||||
console.log("Using", proxy.type);
|
||||
console.log("proxy ", proxy.host + ":" + proxy.port);*/
|
||||
if (requestDetails.url.includes(':7669')) {
|
||||
proxy = null;
|
||||
}
|
||||
} else if (context.name == routerpref) {
|
||||
if (routerHost(requestDetails.url)) {
|
||||
proxy = null;
|
||||
} else if (!routerHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
}
|
||||
return proxy;
|
||||
} else if (context.name == webpref) {
|
||||
if (localHost(requestDetails.url)) {
|
||||
@@ -66,35 +69,33 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
proxy = {
|
||||
type: 'http',
|
||||
host: 'localhost',
|
||||
port: '65535'
|
||||
port: '65535',
|
||||
};
|
||||
}
|
||||
}
|
||||
console.log('(proxy)', context.name);
|
||||
console.log('Using', proxy.type);
|
||||
console.log('proxy ', proxy.host + ':' + proxy.port);
|
||||
return proxy;
|
||||
}
|
||||
}
|
||||
if (!routerHost(requestDetails.url)) {
|
||||
if (localHost(requestDetails.url)) {
|
||||
console.log(
|
||||
'(proxy) non-routerconsole localhost url, will not interfere',
|
||||
requestDetails.url
|
||||
);
|
||||
/*proxy = {
|
||||
type: "http",
|
||||
host: "localhost",
|
||||
port: "65535"
|
||||
};*/
|
||||
if (requestDetails.url.includes(':7669')) {
|
||||
proxy = null;
|
||||
} else {
|
||||
console.log(
|
||||
'(proxy) non-routerconsole localhost url, will not interfere',
|
||||
requestDetails.url
|
||||
);
|
||||
}
|
||||
}
|
||||
} else if (i2pHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
port: getPort(),
|
||||
};
|
||||
}
|
||||
//var tab = tabGet(requestDetails.tabId);
|
||||
//tab.then(handleTabRequest,)
|
||||
return proxy;
|
||||
};
|
||||
var contextGet = async function(tabInfo) {
|
||||
@@ -109,7 +110,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) {
|
||||
@@ -120,7 +121,7 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
}
|
||||
@@ -132,7 +133,7 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
}
|
||||
@@ -147,7 +148,7 @@ var handleContextProxyRequest = async function(requestDetails) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
} else if (extensionHost(requestDetails.url)) {
|
||||
@@ -292,10 +293,19 @@ function getPort() {
|
||||
return proxy_port;
|
||||
}
|
||||
|
||||
function getConsolePort() {
|
||||
if (control_port == undefined) {
|
||||
var scheme = getScheme();
|
||||
if (scheme == 'socks') proxy_port = '7657';
|
||||
else proxy_port = '7657';
|
||||
}
|
||||
return proxy_port;
|
||||
}
|
||||
|
||||
function setupProxy() {
|
||||
console.log('Setting up Firefox WebExtension proxy');
|
||||
browser.proxy.onRequest.addListener(handleContextProxyRequest, {
|
||||
urls: ['<all_urls>']
|
||||
urls: ['<all_urls>'],
|
||||
});
|
||||
console.log('i2p settings created for WebExtension Proxy');
|
||||
}
|
||||
@@ -316,9 +326,9 @@ function updateFromStorage() {
|
||||
setupProxy();
|
||||
});
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != 'android') {
|
||||
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
|
||||
browser.windows.getAll().then((wins) => wins.forEach(themeWindow));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -329,7 +339,7 @@ SetupSettings();
|
||||
setupProxy();
|
||||
|
||||
var gettingListenerInfo = browser.runtime.getPlatformInfo();
|
||||
gettingListenerInfo.then(got => {
|
||||
gettingListenerInfo.then((got) => {
|
||||
browser.windows.onCreated.addListener(() => {
|
||||
chrome.storage.local.get(function() {
|
||||
setupProxy();
|
||||
|
121
releases.atom
121
releases.atom
@@ -4,13 +4,72 @@
|
||||
<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-06-23T03:21:35Z</updated>
|
||||
<updated>2020-11-11T03:03:56Z</updated>
|
||||
<entry>
|
||||
<id>tag:github.com,2008:Repository/169256012/0.83</id>
|
||||
<updated>2020-11-11T04:00:27Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.83"/>
|
||||
<title>0.83</title>
|
||||
<enclosure url="magnet:?xt=urn:btih:09841bd5ca003fa37818754f4bee988698e3c0c8" type="application/x-bittorrent" />
|
||||
<content type="html"><p>A simple plugin for configuring a Firefox based web browser to isolate I2P<br>
|
||||
Browsing to a single contextual identity, thus creating an I2P in Private<br>
|
||||
Browsing mode. It requires the use of a pre-installed I2P Router.<br>
|
||||
i2psetproxy.js (0.83-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Add a tab for I2P-Native Dispatch</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Sat, 10 NOV 2020 22:00:01 -0400</p>
|
||||
<p>i2psetproxy.js (0.81-1) UNRELEASED; urgency=low</p></content>
|
||||
<author>
|
||||
<name>eyedeekay</name>
|
||||
</author>
|
||||
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&v=4"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>tag:github.com,2008:Repository/169256012/0.81</id>
|
||||
<updated>2020-11-08T02:44:34Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.81"/>
|
||||
<title>0.81</title>
|
||||
<content type="html"><p>Browsing mode. It requires the use of a pre-installed I2P Router.<br>
|
||||
i2psetproxy.js (0.81-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>X-I2P-TorrentLocation header</li>
|
||||
<li>Visual tweaks</li>
|
||||
<li>Deprecate localhost browser container permanently</li>
|
||||
<li>Isolation rules improvements</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Sat, 07 NOV 2020 21:34:25 -0400</p>
|
||||
<p>i2psetproxy.js (0.79-1) UNRELEASED; urgency=low</p></content>
|
||||
<author>
|
||||
<name>eyedeekay</name>
|
||||
</author>
|
||||
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&v=4"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>tag:github.com,2008:Repository/169256012/0.79</id>
|
||||
<updated>2020-09-26T03:36:46Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.79"/>
|
||||
<title>0.79</title>
|
||||
<content type="html"><p>A simple plugin for configuring a Firefox based web browser to isolate I2P<br>
|
||||
Browsing to a single contextual identity, thus creating an I2P in Private<br>
|
||||
Browsing mode. It requires the use of a pre-installed I2P Router.<br>
|
||||
i2psetproxy.js (0.79-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Pin application tabs to the front of the tab order</li>
|
||||
<li>Refine pageaction behavior</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Mon, 24 SEP 2020 20:18:03 -0400</p>
|
||||
<p>i2psetproxy.js (0.77-1) UNRELEASED; urgency=low</p></content>
|
||||
<author>
|
||||
<name>eyedeekay</name>
|
||||
</author>
|
||||
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&v=4"/>
|
||||
</entry>
|
||||
<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"><p>Merge pull request <a class="issue-link js-issue-link" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/pull/100">#100</a> from eyedeekay/bookmarks</p>
|
||||
|
||||
<p>make the bookmarks part of a subdirectory</p></content>
|
||||
@@ -137,62 +196,4 @@ i2psetproxy.js (0.65-1) UNRELEASED; urgency=low</p>
|
||||
</author>
|
||||
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&v=4"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>tag:github.com,2008:Repository/169256012/0.63</id>
|
||||
<updated>2020-03-02T23:01:58Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.63"/>
|
||||
<title>0.63</title>
|
||||
<content type="html"><p>A simple plugin for configuring a Firefox based web browser to isolate I2P<br>
|
||||
Browsing to a single contextual identity, thus creating an I2P in Private<br>
|
||||
Browsing mode. It requires the use of a pre-installed I2P Router.<br>
|
||||
i2psetproxy.js (0.63-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>other containerizers bugfix</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Mon, 02 MAR 2020 17:54:26 -0400</p>
|
||||
<p>i2psetproxy.js (0.61-1) UNRELEASED; urgency=low</p></content>
|
||||
<author>
|
||||
<name>eyedeekay</name>
|
||||
</author>
|
||||
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&v=4"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>tag:github.com,2008:Repository/169256012/0.61</id>
|
||||
<updated>2020-03-02T22:48:06Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.61"/>
|
||||
<title>0.61</title>
|
||||
<content type="html"><p>A simple plugin for configuring a Firefox based web browser to isolate I2P<br>
|
||||
Browsing to a single contextual identity, thus creating an I2P in Private<br>
|
||||
Browsing mode. It requires the use of a pre-installed I2P Router.<br>
|
||||
i2psetproxy.js (0.61-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>other containerizers bugfix</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Mon, 02 MAR 2020 17:46:24 -0400</p>
|
||||
<p>i2psetproxy.js (0.59-1) UNRELEASED; urgency=low</p></content>
|
||||
<author>
|
||||
<name>eyedeekay</name>
|
||||
</author>
|
||||
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&v=4"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>tag:github.com,2008:Repository/169256012/0.59</id>
|
||||
<updated>2020-02-26T03:10:23Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.59"/>
|
||||
<title>0.59</title>
|
||||
<content type="html"><p>A simple plugin for configuring a Firefox based web browser to isolate I2P<br>
|
||||
Browsing to a single contextual identity, thus creating an I2P in Private<br>
|
||||
Browsing mode. It requires the use of a pre-installed I2P Router.<br>
|
||||
i2psetproxy.js (0.59-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>transmission-rpc based torrent controls</li>
|
||||
<li>bugfixes</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Tue, 25 FEB 2020 20:52:19 -0400</p>
|
||||
<p>i2psetproxy.js (0.57-1) UNRELEASED; urgency=low</p></content>
|
||||
<author>
|
||||
<name>eyedeekay</name>
|
||||
</author>
|
||||
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&v=4"/>
|
||||
</entry>
|
||||
</feed>
|
||||
|
173
script.js
173
script.js
@@ -1,5 +1,4 @@
|
||||
|
||||
browser.runtime.onMessage.addListener(request => {
|
||||
browser.runtime.onMessage.addListener((request) => {
|
||||
var response = '';
|
||||
if (request.req === 'i2p-location') {
|
||||
response = 'no-alt-location';
|
||||
@@ -13,8 +12,7 @@ browser.runtime.onMessage.addListener(request => {
|
||||
if (tag.toUpperCase() === 'X-I2P-LOCATION') {
|
||||
response = metas[i].getAttribute('content');
|
||||
}
|
||||
}catch{
|
||||
};
|
||||
} catch {};
|
||||
}
|
||||
}
|
||||
if (request.req === 'i2p-torrentlocation') {
|
||||
@@ -25,13 +23,174 @@ browser.runtime.onMessage.addListener(request => {
|
||||
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{
|
||||
};
|
||||
} catch {};
|
||||
}
|
||||
}
|
||||
return Promise.resolve({content: response});
|
||||
return Promise.resolve({ content: response });
|
||||
});
|
||||
|
410
scrub.js
410
scrub.js
@@ -4,7 +4,7 @@ var routerpref = chrome.i18n.getMessage('routerPreface');
|
||||
var mailpref = chrome.i18n.getMessage('mailPreface');
|
||||
var torrentpref = chrome.i18n.getMessage('torrentPreface');
|
||||
var tunnelpref = chrome.i18n.getMessage('i2ptunnelPreface');
|
||||
var localpref = chrome.i18n.getMessage('localPreface');
|
||||
var ircpref = chrome.i18n.getMessage('ircPreface');
|
||||
var extensionpref = chrome.i18n.getMessage('extensionPreface');
|
||||
var muwirepref = chrome.i18n.getMessage('muwirePreface');
|
||||
|
||||
@@ -27,7 +27,7 @@ var contextScrub = async function(requestDetails) {
|
||||
}
|
||||
}
|
||||
return {
|
||||
requestHeaders: requestDetails.requestHeaders
|
||||
requestHeaders: requestDetails.requestHeaders,
|
||||
};
|
||||
} else if (context.name == routerpref) {
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
@@ -39,7 +39,7 @@ var contextScrub = async function(requestDetails) {
|
||||
}
|
||||
}
|
||||
return {
|
||||
requestHeaders: requestDetails.requestHeaders
|
||||
requestHeaders: requestDetails.requestHeaders,
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -91,25 +91,25 @@ var contextScrub = async function(requestDetails) {
|
||||
var notMyContextNotMyProblem = async function() {
|
||||
var contexts = await browser.contextualIdentities.query({});
|
||||
var context1 = await browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
name: titlepref,
|
||||
});
|
||||
var context2 = await browser.contextualIdentities.query({
|
||||
name: routerpref
|
||||
name: routerpref,
|
||||
});
|
||||
var context3 = await browser.contextualIdentities.query({
|
||||
name: mailpref
|
||||
name: mailpref,
|
||||
});
|
||||
var context4 = await browser.contextualIdentities.query({
|
||||
name: torrentpref
|
||||
name: torrentpref,
|
||||
});
|
||||
var context5 = await browser.contextualIdentities.query({
|
||||
name: tunnelpref
|
||||
name: tunnelpref,
|
||||
});
|
||||
var context6 = await browser.contextualIdentities.query({
|
||||
name: localpref
|
||||
name: ircpref,
|
||||
});
|
||||
var context7 = await browser.contextualIdentities.query({
|
||||
name: muwirepref
|
||||
name: muwirepref,
|
||||
});
|
||||
var othercontexts = [];
|
||||
console.log('Contexts:', contexts);
|
||||
@@ -145,7 +145,7 @@ var contextSetup = function(requestDetails) {
|
||||
var i2pTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
name: titlepref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create() {
|
||||
@@ -159,7 +159,7 @@ var contextSetup = function(requestDetails) {
|
||||
}
|
||||
browser.pageAction.setPopup({
|
||||
tabId: tabId.id,
|
||||
popup: 'security.html'
|
||||
popup: 'security.html',
|
||||
});
|
||||
browser.pageAction.show(tabId.id);
|
||||
}
|
||||
@@ -168,7 +168,7 @@ var contextSetup = function(requestDetails) {
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
@@ -183,7 +183,7 @@ var contextSetup = function(requestDetails) {
|
||||
var routerTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: routerpref
|
||||
name: routerpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create() {
|
||||
@@ -194,7 +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});
|
||||
browser.tabs.move(tab.id, { index: 0 });
|
||||
}
|
||||
for (index = 0; index < tabs.length; index++) {
|
||||
if (index != tabs.length - 1)
|
||||
@@ -202,7 +202,7 @@ var contextSetup = function(requestDetails) {
|
||||
}
|
||||
}
|
||||
var pins = browser.tabs.query({
|
||||
cookieStoreId: context[0].cookieStoreId
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
});
|
||||
pins.then(closeOldTab, onError);
|
||||
}
|
||||
@@ -215,7 +215,7 @@ var contextSetup = function(requestDetails) {
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
@@ -230,7 +230,7 @@ var contextSetup = function(requestDetails) {
|
||||
var i2ptunnelTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: tunnelpref
|
||||
name: tunnelpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create() {
|
||||
@@ -241,7 +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});
|
||||
browser.tabs.move(tab.id, { index: 1 });
|
||||
}
|
||||
for (index = 0; index < tabs.length; index++) {
|
||||
if (index != tabs.length - 1)
|
||||
@@ -249,7 +249,7 @@ var contextSetup = function(requestDetails) {
|
||||
}
|
||||
}
|
||||
var pins = browser.tabs.query({
|
||||
cookieStoreId: context[0].cookieStoreId
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
});
|
||||
pins.then(closeOldTab, onError);
|
||||
}
|
||||
@@ -262,7 +262,7 @@ var contextSetup = function(requestDetails) {
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
@@ -277,45 +277,53 @@ var contextSetup = function(requestDetails) {
|
||||
var snarkTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: torrentpref
|
||||
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);
|
||||
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 exemptContext = await browser.contextualIdentities.query({
|
||||
name: titlepref,
|
||||
});
|
||||
let tmp = new URL(tabId.url);
|
||||
console.log('(isolate)tabid host', tmp.host);
|
||||
if (!requestDetails.url.includes('snark/' + 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);
|
||||
}
|
||||
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
|
||||
});
|
||||
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);
|
||||
@@ -324,7 +332,7 @@ var contextSetup = function(requestDetails) {
|
||||
var muwireTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: muwirepref
|
||||
name: muwirepref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create() {
|
||||
@@ -335,7 +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});
|
||||
browser.tabs.move(tab.id, { index: 4 });
|
||||
}
|
||||
for (index = 0; index < tabs.length; index++) {
|
||||
if (index != tabs.length - 1)
|
||||
@@ -343,7 +351,7 @@ var contextSetup = function(requestDetails) {
|
||||
}
|
||||
}
|
||||
var pins = browser.tabs.query({
|
||||
cookieStoreId: context[0].cookieStoreId
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
});
|
||||
pins.then(closeOldTab, onError);
|
||||
}
|
||||
@@ -356,7 +364,7 @@ var contextSetup = function(requestDetails) {
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
@@ -371,7 +379,7 @@ var contextSetup = function(requestDetails) {
|
||||
var mailTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: mailpref
|
||||
name: mailpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create() {
|
||||
@@ -382,7 +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});
|
||||
browser.tabs.move(tab.id, { index: 3 });
|
||||
}
|
||||
for (index = 0; index < tabs.length; index++) {
|
||||
if (index != tabs.length - 1)
|
||||
@@ -390,7 +398,7 @@ var contextSetup = function(requestDetails) {
|
||||
}
|
||||
}
|
||||
var pins = browser.tabs.query({
|
||||
cookieStoreId: context[0].cookieStoreId
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
});
|
||||
pins.then(closeOldTab, onError);
|
||||
}
|
||||
@@ -403,7 +411,7 @@ var contextSetup = function(requestDetails) {
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
@@ -415,34 +423,44 @@ var contextSetup = function(requestDetails) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var localTabFind = async function(tabId) {
|
||||
var ircTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: localpref
|
||||
name: ircpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log('(isolate) Closing un-isolated tab', tabId.id);
|
||||
console.log('in favor of', tab.id);
|
||||
console.log('with context', tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
if (requestDetails.url.includes(':7669')) {
|
||||
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 pins = browser.tabs.query({
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
});
|
||||
pins.then(closeOldTab, onError);
|
||||
}
|
||||
closeOldTab(tab);
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
@@ -454,10 +472,10 @@ var contextSetup = function(requestDetails) {
|
||||
}
|
||||
try {
|
||||
var anoncontext = await browser.contextualIdentities.query({
|
||||
name: titlepref
|
||||
name: titlepref,
|
||||
});
|
||||
var localcontext = await browser.contextualIdentities.query({
|
||||
name: localpref
|
||||
var irccontext = await browser.contextualIdentities.query({
|
||||
name: ircpref,
|
||||
});
|
||||
var othercontexts = await notMyContextNotMyProblem();
|
||||
var nmp = false;
|
||||
@@ -471,7 +489,7 @@ var contextSetup = function(requestDetails) {
|
||||
tabId.cookieStoreId == 'firefox-default' ||
|
||||
tabId.cookieStoreId == 'firefox-private' ||
|
||||
tabId.cookieStoreId == anoncontext[0].cookieStoreId ||
|
||||
tabId.cookieStoreId == localcontext[0].cookieStoreId ||
|
||||
tabId.cookieStoreId == irccontext[0].cookieStoreId ||
|
||||
nmp
|
||||
) {
|
||||
console.log(
|
||||
@@ -479,7 +497,7 @@ var contextSetup = function(requestDetails) {
|
||||
tabId.cookieStoreId,
|
||||
'not',
|
||||
anoncontext[0].cookieStoreId,
|
||||
localcontext[0].cookieStoreId
|
||||
irccontext[0].cookieStoreId
|
||||
);
|
||||
return;
|
||||
} else {
|
||||
@@ -510,7 +528,7 @@ var contextSetup = function(requestDetails) {
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: 'firefox-default',
|
||||
url: requestDetails.url
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
@@ -538,7 +556,7 @@ var contextSetup = function(requestDetails) {
|
||||
setcookie = browser.cookies.set({
|
||||
firstPartyDomain: i2pHostName(requestDetails.url),
|
||||
url: requestDetails.url,
|
||||
secure: true
|
||||
secure: true,
|
||||
});
|
||||
setcookie.then(onContextGotLog, onContextError);
|
||||
return requestDetails;
|
||||
@@ -550,7 +568,7 @@ var contextSetup = function(requestDetails) {
|
||||
var setcookie = browser.cookies.set({
|
||||
firstPartyDomain: i2pHostName(requestDetails.url),
|
||||
url: requestDetails.url,
|
||||
secure: true
|
||||
secure: true,
|
||||
});
|
||||
setcookie.then(onContextGotLog, onContextError);
|
||||
var i2ptab = tab.then(i2pTabFind, onContextError);
|
||||
@@ -580,7 +598,7 @@ var contextSetup = function(requestDetails) {
|
||||
}
|
||||
} else {
|
||||
if (localhost) {
|
||||
var localtab = tab.then(localTabFind, onContextError);
|
||||
var irctab = tab.then(ircTabFind, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
var normalTab = tab.then(normalTabFind, onContextError);
|
||||
@@ -599,68 +617,211 @@ var coolheadersSetup = function(e) {
|
||||
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') {
|
||||
if (
|
||||
header.name.toUpperCase() === 'I2P-LOCATION' ||
|
||||
header.name.toUpperCase() === 'X-I2P-LOCATION'
|
||||
) {
|
||||
browser.pageAction.setPopup({
|
||||
tabId: e.tabId,
|
||||
popup: 'location.html'
|
||||
popup: 'location.html',
|
||||
});
|
||||
browser.pageAction.setIcon({
|
||||
path: 'icons/i2plogo.png',
|
||||
tabId: e.tabId,
|
||||
});
|
||||
browser.pageAction.setIcon({path: 'icons/i2plogo.png', tabId: e.tabId});
|
||||
browser.pageAction.setTitle({
|
||||
tabId: e.tabId,
|
||||
title: header.value
|
||||
title: header.value,
|
||||
});
|
||||
browser.pageAction.show(e.tabId);
|
||||
break;
|
||||
}
|
||||
if (header.name.toUpperCase() === 'I2P-TORRENTLOCATION' || header.name.toUpperCase() === 'X-I2P-TORRENTLOCATION') {
|
||||
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'
|
||||
popup: 'torrent.html',
|
||||
});
|
||||
browser.pageAction.setIcon({
|
||||
path: 'icons/i2plogo.png',
|
||||
tabId: e.tabId,
|
||||
});
|
||||
browser.pageAction.setIcon({path: 'icons/i2plogo.png', tabId: e.tabId});
|
||||
browser.pageAction.show(e.tabId);
|
||||
browser.pageAction.setTitle({
|
||||
tabId: e.tabId,
|
||||
title: header.value
|
||||
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});
|
||||
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)
|
||||
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);
|
||||
}
|
||||
}
|
||||
browser.tabs.get(tobj.tabId).then(getTabURL, onError)
|
||||
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)
|
||||
browser.tabs.reload(tab.id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -671,23 +832,22 @@ function reloadError(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>']},
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking", "responseHeaders"]
|
||||
);
|
||||
|
||||
browser.webRequest.onBeforeRequest.addListener(
|
||||
contextSetup,
|
||||
{ urls: ['<all_urls>'] },
|
||||
['blocking']
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking"]
|
||||
);
|
||||
|
||||
browser.webRequest.onBeforeSendHeaders.addListener(
|
||||
contextScrub,
|
||||
{ urls: ['<all_urls>'] },
|
||||
['blocking', 'requestHeaders']
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking", "requestHeaders"]
|
||||
);
|
||||
|
19
search.css
19
search.css
@@ -20,7 +20,6 @@
|
||||
color: #fff
|
||||
}
|
||||
.topnav input[type=search] {
|
||||
width: 75%;
|
||||
padding: 6px;
|
||||
border: none;
|
||||
margin-top: 8px;
|
||||
@@ -35,17 +34,9 @@
|
||||
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
|
||||
}
|
10
sidebar.css
10
sidebar.css
@@ -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
|
||||
}
|
19
torrent.js
19
torrent.js
@@ -0,0 +1,19 @@
|
||||
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);
|
||||
|
@@ -21,7 +21,7 @@ setupExtractor();
|
||||
|
||||
function extractSession(requestDetails) {
|
||||
const hdr = requestDetails.requestHeaders.filter(
|
||||
x => x.name.toLowerCase() === "x-transmission-session-id"
|
||||
(x) => x.name.toLowerCase() === "x-transmission-session-id"
|
||||
)[0];
|
||||
if (!hdr) {
|
||||
return;
|
||||
@@ -58,21 +58,21 @@ function addUrl(torrentUrl, downloadDir) {
|
||||
console.log("Downloading torrent", torrentUrl);
|
||||
p = fetch(torrentUrl, {
|
||||
method: "GET",
|
||||
credentials: "include"
|
||||
credentials: "include",
|
||||
})
|
||||
.then(resp => {
|
||||
.then((resp) => {
|
||||
if (resp.ok) {
|
||||
return resp.blob();
|
||||
}
|
||||
throw new Error("Could not download torrent");
|
||||
})
|
||||
.then(blobToBase64)
|
||||
.then(b64 => {
|
||||
.then((b64) => {
|
||||
params.metainfo = b64;
|
||||
return rpcCall("torrent-add", params);
|
||||
});
|
||||
}
|
||||
return p.then(x => {
|
||||
return p.then((x) => {
|
||||
updateBadge();
|
||||
return x;
|
||||
});
|
||||
@@ -85,7 +85,7 @@ function handleUrl(requestDetails) {
|
||||
decodeURIComponent(
|
||||
requestDetails.url.replace("http://transmitter.web-extension/", "")
|
||||
)
|
||||
).then(x => {
|
||||
).then((x) => {
|
||||
return browser.storage.local.get("server").then(({ server }) => {
|
||||
return { redirectUrl: server.base_url + "web/" };
|
||||
});
|
||||
@@ -107,19 +107,19 @@ function createContextMenu() {
|
||||
browser.contextMenus.create({
|
||||
id: "transmitter-add",
|
||||
title: "Download with Transmission remote",
|
||||
contexts: ["link"]
|
||||
contexts: ["link"],
|
||||
});
|
||||
} else {
|
||||
browser.contextMenus.create({
|
||||
id: "transmitter-add",
|
||||
title: "Download to Default location",
|
||||
contexts: ["link"]
|
||||
contexts: ["link"],
|
||||
});
|
||||
server.locations.forEach(location => {
|
||||
server.locations.forEach((location) => {
|
||||
browser.contextMenus.create({
|
||||
id: "transmitter-add-loc-" + location.index,
|
||||
title: "Download to " + location.name,
|
||||
contexts: ["link"]
|
||||
contexts: ["link"],
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -152,42 +152,42 @@ function updateBadge() {
|
||||
) {
|
||||
return;
|
||||
}
|
||||
return rpcCall("session-stats", {}).then(response => {
|
||||
return rpcCall("session-stats", {}).then((response) => {
|
||||
const args = response.arguments; // lol the name 'arguments' means destructuring in strict mode is impossible
|
||||
switch (server.badge) {
|
||||
case "num":
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "gray" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: "" + args.activeTorrentCount
|
||||
text: "" + args.activeTorrentCount,
|
||||
});
|
||||
break;
|
||||
case "dl":
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "green" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.downloadSpeed)
|
||||
text: formatSpeed(args.downloadSpeed),
|
||||
});
|
||||
break;
|
||||
case "ul":
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "blue" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.uploadSpeed)
|
||||
text: formatSpeed(args.uploadSpeed),
|
||||
});
|
||||
break;
|
||||
case "auto":
|
||||
if (args.downloadSpeed > 0) {
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "green" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.downloadSpeed)
|
||||
text: formatSpeed(args.downloadSpeed),
|
||||
});
|
||||
} else if (args.uploadSpeed > 0) {
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "blue" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.uploadSpeed)
|
||||
text: formatSpeed(args.uploadSpeed),
|
||||
});
|
||||
} else {
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "gray" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: "" + args.activeTorrentCount
|
||||
text: "" + args.activeTorrentCount,
|
||||
});
|
||||
}
|
||||
break;
|
||||
@@ -196,20 +196,20 @@ function updateBadge() {
|
||||
});
|
||||
}
|
||||
|
||||
browser.alarms.onAlarm.addListener(alarm => {
|
||||
browser.alarms.onAlarm.addListener((alarm) => {
|
||||
if (alarm.name === "transmitter-badge-update") {
|
||||
return updateBadge();
|
||||
}
|
||||
});
|
||||
|
||||
function setupBadge() {
|
||||
browser.alarms.clear("transmitter-badge-update").then(x => {
|
||||
browser.alarms.clear("transmitter-badge-update").then((x) => {
|
||||
browser.storage.local.get("server").then(({ server }) => {
|
||||
if (!server) {
|
||||
return;
|
||||
}
|
||||
browser.alarms.create("transmitter-badge-update", {
|
||||
periodInMinutes: parseInt(server.badge_interval || "1")
|
||||
periodInMinutes: parseInt(server.badge_interval || "1"),
|
||||
});
|
||||
updateBadge();
|
||||
});
|
||||
|
@@ -6,7 +6,7 @@ function rpcCall(meth, args) {
|
||||
return browser.storage.local.get(function(server) {
|
||||
const myHeaders = {
|
||||
'Content-Type': 'application/json',
|
||||
'x-transmission-session-id': server.session
|
||||
'x-transmission-session-id': server.session,
|
||||
};
|
||||
//console.log("(torrent)", server.session)
|
||||
if (server.username !== '' || server.btrpcpass !== '') {
|
||||
@@ -19,7 +19,7 @@ function rpcCall(meth, args) {
|
||||
method: 'POST',
|
||||
headers: myHeaders,
|
||||
body: JSON.stringify({ method: meth, arguments: args }),
|
||||
credentials: 'include' // allows HTTPS client certs!
|
||||
credentials: 'include', // allows HTTPS client certs!
|
||||
})
|
||||
.then(function(response) {
|
||||
const session = response.headers.get('x-transmission-session-id');
|
||||
|
@@ -4,7 +4,7 @@ var TrpcCall = async function(meth, args) {
|
||||
const server = await browser.storage.local.get(null);
|
||||
const myHeaders = {
|
||||
'Content-Type': 'application/json',
|
||||
'x-transmission-session-id': server.session
|
||||
'x-transmission-session-id': server.session,
|
||||
};
|
||||
console.log('(torrent) session', server.session);
|
||||
if (server.username !== '' || server.btrpcpass !== '') {
|
||||
@@ -16,7 +16,7 @@ var TrpcCall = async function(meth, args) {
|
||||
method: 'POST',
|
||||
headers: myHeaders,
|
||||
body: JSON.stringify({ method: meth, arguments: args }),
|
||||
credentials: 'include' // allows HTTPS client certs!
|
||||
credentials: 'include', // allows HTTPS client certs!
|
||||
});
|
||||
|
||||
/*.then(function(response) {
|
||||
@@ -38,7 +38,7 @@ const torrentsPane = document.getElementById('torrents-pane');
|
||||
const configPane = document.getElementById('config-pane');
|
||||
|
||||
for (const opener of document.querySelectorAll('.config-opener')) {
|
||||
opener.addEventListener('click', e => {
|
||||
opener.addEventListener('click', (e) => {
|
||||
browser.runtime.openOptionsPage();
|
||||
});
|
||||
}
|
||||
@@ -53,7 +53,13 @@ const torrentsList = document.getElementById("torrents-list");
|
||||
const torrentsTpl = document.getElementById("torrents-tpl");
|
||||
const torrentsError = document.getElementById("torrents-error");
|
||||
const getArgs = {
|
||||
fields: ["name", "percentDone", "rateDownload", "rateUpload", "queuePosition"]
|
||||
fields: [
|
||||
"name",
|
||||
"percentDone",
|
||||
"rateDownload",
|
||||
"rateUpload",
|
||||
"queuePosition",
|
||||
],
|
||||
};
|
||||
let cachedTorrents = [];
|
||||
|
||||
@@ -90,7 +96,7 @@ function searchTorrents() {
|
||||
let newTorrents = cachedTorrents;
|
||||
const val = torrentsSearch.value.toLowerCase().trim();
|
||||
if (val.length > 0) {
|
||||
newTorrents = newTorrents.filter(x => x.name.toLowerCase().includes(val));
|
||||
newTorrents = newTorrents.filter((x) => x.name.toLowerCase().includes(val));
|
||||
}
|
||||
renderTorrents(newTorrents);
|
||||
}
|
||||
@@ -99,16 +105,16 @@ torrentsSearch.addEventListener("keyup", searchTorrents);
|
||||
|
||||
function refreshTorrents(server) {
|
||||
console.log("(torrent) initiating", server);
|
||||
return TrpcCall("torrent-get", getArgs).then(function(response) {
|
||||
return TrpcCall("torrent-get", getArgs).then(function (response) {
|
||||
const session = response.headers.get("x-transmission-session-id");
|
||||
if (session) {
|
||||
browser.storage.local.get({}).then(function(storage) {
|
||||
browser.storage.local.get({}).then(function (storage) {
|
||||
storage.session = session;
|
||||
browser.storage.local.set(storage);
|
||||
});
|
||||
}
|
||||
let sponse = response.json();
|
||||
sponse.then(function(response) {
|
||||
sponse.then(function (response) {
|
||||
console.log("(torrent) refreshing", response);
|
||||
let newTorrents = response.arguments.torrents;
|
||||
newTorrents.sort((x, y) => y.queuePosition - x.queuePosition);
|
||||
@@ -125,7 +131,7 @@ function refreshTorrents(server) {
|
||||
}
|
||||
|
||||
function refreshTorrentsLogErr(server) {
|
||||
return refreshTorrents(server).catch(err => {
|
||||
return refreshTorrents(server).catch((err) => {
|
||||
console.error(err);
|
||||
torrentsError.textContent = "Error: " + err.toString();
|
||||
});
|
||||
@@ -138,12 +144,12 @@ function showTorrents(server) {
|
||||
opener.href = server.base_url + "web/";
|
||||
}
|
||||
console.log("(torrent) showing torrents");
|
||||
refreshTorrents(server).catch(_ => refreshTorrentsLogErr(server));
|
||||
refreshTorrents(server).catch((_) => refreshTorrentsLogErr(server));
|
||||
setInterval(() => refreshTorrentsLogErr(server), 2000);
|
||||
}
|
||||
|
||||
//let store =
|
||||
browser.storage.local.get(function(server) {
|
||||
browser.storage.local.get(function (server) {
|
||||
console.log("(torrent) querying storage", server);
|
||||
if (server && server.base_url && server.base_url !== "") {
|
||||
showTorrents(server);
|
||||
|
27
window.html
27
window.html
@@ -18,7 +18,7 @@
|
||||
<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>
|
||||
@@ -70,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">
|
||||
@@ -100,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.
|
||||
@@ -126,7 +115,7 @@
|
||||
<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="images/i2plogo.png"></a> <!--<a class="config-opener" href="#">
|
||||
|
BIN
x-i2p-torrentlocation.png
Normal file
BIN
x-i2p-torrentlocation.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 449 KiB |
Reference in New Issue
Block a user