Compare commits
490 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b605ea515f | ||
![]() |
a38d18c049 | ||
![]() |
a0be345f86 | ||
![]() |
e08ce1c71e | ||
![]() |
f25a29052f | ||
![]() |
13c5042006 | ||
![]() |
01ce1a2f13 | ||
![]() |
8430e3b952 | ||
![]() |
ac09b72be3 | ||
![]() |
d901711c7b | ||
![]() |
88517a7b52 | ||
![]() |
39eb695522 | ||
![]() |
009bac364c | ||
![]() |
9741b21def | ||
![]() |
df7bc109ed | ||
![]() |
8cd9b53be3 | ||
![]() |
9db61be253 | ||
![]() |
78a1794568 | ||
![]() |
aa9805e107 | ||
![]() |
a992553ffb | ||
![]() |
3a30961cd1 | ||
![]() |
a6aba7b5f7 | ||
![]() |
26c4152bf6 | ||
![]() |
8230fe92a7 | ||
![]() |
6d0cda9e67 | ||
![]() |
12992c461b | ||
![]() |
531963c1c0 | ||
![]() |
8bfb7cdd27 | ||
![]() |
40899889a0 | ||
![]() |
bc88ca80fd | ||
![]() |
3b3744ffff | ||
![]() |
9cd6ce888e | ||
![]() |
7b2216a12f | ||
![]() |
1946669b82 | ||
![]() |
bb14021bc0 | ||
![]() |
51510abaed | ||
![]() |
f837eb18d5 | ||
![]() |
bf4b160dcd | ||
![]() |
7bd08ab6e0 | ||
![]() |
647c0523e8 | ||
![]() |
58b874d17f | ||
![]() |
969d2769fd | ||
![]() |
d88d6b2f61 | ||
![]() |
b420dc0a28 | ||
![]() |
0489a2774f | ||
![]() |
49f394acca | ||
![]() |
dd788b15ca | ||
![]() |
84981fa801 | ||
![]() |
d328dd1ca0 | ||
![]() |
590f2c7cd8 | ||
![]() |
e93ad94c89 | ||
![]() |
203decf121 | ||
![]() |
5ab871b51f | ||
![]() |
858d03fa2b | ||
![]() |
374ce51eff | ||
![]() |
cd3dafe9c8 | ||
![]() |
8c256241cb | ||
![]() |
18cc8eb962 | ||
![]() |
f1fd2f6fb6 | ||
![]() |
691dff77a0 | ||
![]() |
0910986d52 | ||
![]() |
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 | ||
![]() |
357b1a93b4 | ||
![]() |
d8d075bd76 | ||
![]() |
9fefb82c57 | ||
![]() |
566f987483 | ||
![]() |
0a0d065b6a | ||
![]() |
69186671ed | ||
![]() |
ede59d7c3a | ||
![]() |
4012bdea45 | ||
![]() |
6d6dce88dd | ||
![]() |
0ba0aafa7c | ||
![]() |
87f9df4af7 | ||
![]() |
09de46cadf | ||
![]() |
a2be795853 | ||
![]() |
cf91b77e8d | ||
![]() |
a37387fa89 | ||
![]() |
658f162193 | ||
![]() |
1e71e8bdce | ||
![]() |
53b9732cae | ||
![]() |
c89bfa8f1e | ||
![]() |
cf7d137d00 | ||
![]() |
bc1ef95a16 | ||
![]() |
342ead307d | ||
![]() |
2bc6e9dfc2 | ||
![]() |
7219667fdb | ||
![]() |
abc1882004 | ||
![]() |
0d0656bcc0 | ||
![]() |
bbda71c8b5 | ||
![]() |
6eb6afab81 | ||
![]() |
a677552690 | ||
![]() |
7758822256 | ||
![]() |
4296fcb132 | ||
![]() |
a7746d867b | ||
![]() |
ea333b3cec | ||
![]() |
b9ac5a5072 | ||
![]() |
1401726f54 | ||
![]() |
11c03fb2aa | ||
![]() |
b4d1108e9c | ||
![]() |
a6b7f29bbd | ||
![]() |
1eb293d754 | ||
![]() |
f3a61d2619 | ||
![]() |
0b1aa5941b | ||
![]() |
ad5882501d | ||
![]() |
e014619881 | ||
![]() |
677c5c6a68 | ||
![]() |
a3217e2bcf | ||
![]() |
4ab7069015 | ||
![]() |
3a13270479 | ||
![]() |
a8eb2b90a2 | ||
![]() |
e54754a83a | ||
![]() |
7f3b6c7359 | ||
![]() |
50ff84111d | ||
![]() |
984643e1b2 | ||
![]() |
917fd00771 | ||
![]() |
97ee549d40 | ||
![]() |
e0232fa3bc | ||
![]() |
8d23820c65 | ||
![]() |
8a6d11594f | ||
![]() |
58dadaefc7 | ||
![]() |
eb92f1b275 | ||
![]() |
4862b0692f | ||
![]() |
377ab1d6b1 | ||
![]() |
cceeb4b613 | ||
![]() |
f109d66ab7 | ||
![]() |
0a447caa82 | ||
![]() |
1f7be5c9c3 | ||
![]() |
cd0d55d06f | ||
![]() |
8c40a01b2f | ||
![]() |
8e6832cf6c | ||
![]() |
311b837ef4 | ||
![]() |
d751622d7c | ||
![]() |
6406f70824 | ||
![]() |
96ee234a17 | ||
![]() |
87c52a0931 | ||
![]() |
d0136f2c6d | ||
![]() |
d0f4ff9fbb | ||
![]() |
2d1ae1fab8 | ||
![]() |
f8d99c8fca | ||
![]() |
aeeedc8d4c | ||
![]() |
e9e3ce085a | ||
![]() |
a192d17e68 | ||
![]() |
62d93a64c0 | ||
![]() |
aad47b03b1 | ||
![]() |
bc8317bd19 | ||
![]() |
1d209c52c8 | ||
![]() |
28901b8e65 | ||
![]() |
2ba386dc53 | ||
![]() |
25b1628b7c | ||
![]() |
f4d7217ce3 | ||
![]() |
89f64fa1be | ||
![]() |
0176755b72 | ||
![]() |
759b7f930e | ||
![]() |
7a9f347a5c | ||
![]() |
7f83404453 | ||
![]() |
e194893227 | ||
![]() |
299e6c5ba3 | ||
![]() |
0b2a615048 | ||
![]() |
49c4b09804 | ||
![]() |
be7e76524d | ||
![]() |
8be88b92a8 | ||
![]() |
b0014a3a1d | ||
![]() |
4e8b5ffd72 | ||
![]() |
f87cb9808a | ||
![]() |
b8f2d9a2c0 | ||
![]() |
76048db188 | ||
![]() |
36a87d8005 | ||
![]() |
cab085e88b | ||
![]() |
5fbd32e6eb | ||
![]() |
1de2a9e1c6 | ||
![]() |
a706eaa81f | ||
![]() |
90783c8e08 | ||
![]() |
3926cea990 | ||
![]() |
9eb0ed05ca | ||
![]() |
b3b1f138ee | ||
![]() |
db7448e19c | ||
![]() |
ce6caa0ddb | ||
![]() |
23908bae18 | ||
![]() |
9900d72709 | ||
![]() |
0bd4c09b02 | ||
![]() |
7ae922c4bc | ||
![]() |
2526de4b97 | ||
![]() |
8ee34ffd6a | ||
![]() |
d92954b738 | ||
![]() |
c5dfbe617a | ||
![]() |
bcb7830a63 | ||
![]() |
47760ab1df | ||
![]() |
52da62dcd3 | ||
![]() |
62cf0bdb1d | ||
![]() |
21d44755c3 | ||
![]() |
38d1170d87 | ||
![]() |
eb07a7079c | ||
![]() |
4f7a226574 | ||
![]() |
e8c94b2255 | ||
![]() |
c4b320e8f4 | ||
![]() |
bd4cd77905 | ||
![]() |
5068856c3d | ||
![]() |
5485ec60a1 | ||
![]() |
cd6061def5 | ||
![]() |
0e1f5921d6 | ||
![]() |
518e04a40b | ||
![]() |
87edb2c448 | ||
![]() |
c17910e501 | ||
![]() |
2be96865b6 | ||
![]() |
ba8e45d878 | ||
![]() |
55c800e048 | ||
![]() |
15a0e838b3 | ||
![]() |
fdbc208bfe | ||
![]() |
6db47ecca0 | ||
![]() |
e2326bcadb | ||
![]() |
d94074b0ce | ||
![]() |
b412103994 | ||
![]() |
b84de0b10e | ||
![]() |
3b6c164ce5 | ||
![]() |
2831ab9759 | ||
![]() |
72954ceda6 | ||
![]() |
923688b914 | ||
![]() |
79cdeade98 | ||
![]() |
aeda8818e2 | ||
![]() |
aea232e56b | ||
![]() |
8d1a76922c | ||
![]() |
708c15308d | ||
![]() |
b70b112c1b | ||
![]() |
12b5f8e7cc | ||
![]() |
14fe263e24 | ||
![]() |
e0226b4645 | ||
![]() |
b1220ca11c | ||
![]() |
5c3c56e415 | ||
![]() |
f07e6d8173 | ||
![]() |
82b9670f28 | ||
![]() |
609cc71f32 | ||
![]() |
965311627e | ||
![]() |
3b2112076b | ||
![]() |
5c268f8b3d | ||
![]() |
50e198ed2c | ||
![]() |
29d4d0b3c8 | ||
![]() |
01695e812a | ||
![]() |
d9dd454e8c | ||
![]() |
915a86c223 | ||
![]() |
a99a7067cb | ||
![]() |
074ff44066 | ||
![]() |
e54435f65d | ||
![]() |
7c48260713 | ||
![]() |
bcbe8dfd94 | ||
![]() |
7a04512440 | ||
![]() |
84d1600c35 | ||
![]() |
03e45cb00d | ||
![]() |
068548089d | ||
![]() |
07cdf98970 | ||
![]() |
12461b7277 | ||
![]() |
abb006addf | ||
![]() |
8b28bd23c1 | ||
![]() |
3d2cd87b92 | ||
![]() |
2d91e0c009 | ||
![]() |
4e30e1c613 | ||
![]() |
907a9e7d20 | ||
![]() |
ec7655bfa9 | ||
![]() |
a84f29d9f1 | ||
![]() |
de8eb976db | ||
![]() |
24fd8a98c3 | ||
![]() |
a06b349d5f | ||
![]() |
855febc1b4 | ||
![]() |
e49f7a7daf | ||
![]() |
2e9ae83daa | ||
![]() |
c222b4ed0b | ||
![]() |
493b1e3cfb | ||
![]() |
85aad86268 | ||
![]() |
7946b7592f | ||
![]() |
e79b6c7d22 | ||
![]() |
461ec921b2 | ||
![]() |
7169018292 | ||
![]() |
3dbce313a0 | ||
![]() |
db6c275321 | ||
![]() |
e2b631fafa | ||
![]() |
95ed7cb751 | ||
![]() |
e20f0d8552 | ||
![]() |
8b44325565 | ||
![]() |
4f8db01542 | ||
![]() |
e245aff6bd | ||
![]() |
7501f4c1a5 | ||
![]() |
9b02651985 | ||
![]() |
e04db247e8 | ||
![]() |
4e30e1077b | ||
![]() |
040b57781e | ||
![]() |
07ca54a885 | ||
![]() |
e125b77d11 | ||
![]() |
851e3854a7 | ||
![]() |
0d414130a7 | ||
![]() |
25a7b523f9 | ||
![]() |
3d0b7db6dc | ||
![]() |
2e8727a309 | ||
![]() |
01fbf32acd | ||
![]() |
e2642553b5 | ||
![]() |
d04709e3a5 | ||
![]() |
10dd0af335 | ||
![]() |
b33a7b623b | ||
![]() |
55841f8421 | ||
![]() |
303bd90d84 | ||
![]() |
274eb1a98b | ||
![]() |
4e544dd9e4 | ||
![]() |
6fe1bc3fb5 | ||
![]() |
4897ceff7f | ||
![]() |
8551a13494 | ||
![]() |
064ec504b5 | ||
![]() |
16c9fbb19f | ||
![]() |
ca58d2e307 | ||
![]() |
fc89fe9ada | ||
![]() |
d6ece55d71 | ||
![]() |
ff9a1484b0 | ||
![]() |
70e3bee4da | ||
![]() |
cd25d95fdf | ||
![]() |
65c914a9d0 | ||
![]() |
c0bb7e234d | ||
![]() |
3fefc88a38 | ||
![]() |
5a5cc51536 | ||
![]() |
25ec2d58c1 | ||
![]() |
f896f6ef92 | ||
![]() |
e10d96905b | ||
![]() |
9e015c51ef | ||
![]() |
ff9ba99476 | ||
![]() |
ce4ec0cdfc | ||
![]() |
5b9c706cc9 | ||
![]() |
2aba15f280 | ||
![]() |
fd5364ab8e | ||
![]() |
08639cbf43 | ||
![]() |
52ba8fa837 | ||
![]() |
2b69ff05cf | ||
![]() |
6a8a9039c9 | ||
![]() |
3a52c4e2a6 | ||
![]() |
2fb1d71ae9 | ||
![]() |
185467937c | ||
![]() |
64c5c05b82 | ||
![]() |
4615513bb2 | ||
![]() |
3b63ba945d | ||
![]() |
1911641cd0 | ||
![]() |
e18eeaf934 | ||
![]() |
ea92d4a5b8 | ||
![]() |
51cc8c96e1 | ||
![]() |
12fff599f0 | ||
![]() |
30231ab974 | ||
![]() |
1362ca32d9 | ||
![]() |
0c64c301c9 | ||
![]() |
38147d45e1 | ||
![]() |
093db8443c | ||
![]() |
56a220136b | ||
![]() |
e903349e4c | ||
![]() |
175683a8ed | ||
![]() |
d7449a5e8a | ||
![]() |
3bcbfc1e58 | ||
![]() |
13210031e6 | ||
![]() |
5a2acc1c1c | ||
![]() |
4aed7e0db4 | ||
![]() |
f4d2334900 | ||
![]() |
7902aded0a | ||
![]() |
256a990ebc | ||
![]() |
ff883a2a9a | ||
![]() |
d1943b4262 | ||
![]() |
c96ec6c3b7 | ||
![]() |
6467ea6f63 | ||
![]() |
352d71af26 | ||
![]() |
ab7774ea29 | ||
![]() |
4e00c72d5f | ||
![]() |
acd7adc9c1 | ||
![]() |
94f0124f0f | ||
![]() |
89523390de | ||
![]() |
77f57d7f1e | ||
![]() |
a33afc52d3 | ||
![]() |
b06facacb0 | ||
![]() |
bd4c9c0658 | ||
![]() |
b23b90baa1 | ||
![]() |
5b6224f9ce | ||
![]() |
232ada5ed3 | ||
![]() |
2fab8e042f | ||
![]() |
749ff30b5b | ||
![]() |
f0b4a0a849 | ||
![]() |
870eaa6e3e | ||
![]() |
c7af1a0d72 | ||
![]() |
4c10cd2855 | ||
![]() |
6f45363692 | ||
![]() |
8d14c945f3 | ||
![]() |
070955225d | ||
![]() |
9987325f1a | ||
![]() |
2bbeed8385 | ||
![]() |
875fe8b86d | ||
![]() |
b2184119f7 | ||
![]() |
cb5fa75616 | ||
![]() |
5c7a80997f | ||
![]() |
32035348c1 | ||
![]() |
049b79753e | ||
![]() |
25c24757d4 | ||
![]() |
2d17f4fb0f | ||
![]() |
916ee81668 | ||
![]() |
1dd48e4344 | ||
![]() |
c93e16875f | ||
![]() |
fbaf1dca30 | ||
![]() |
527e91b6cf | ||
![]() |
ee0ca69195 | ||
![]() |
709854c1d1 | ||
![]() |
9ebdcc94c5 | ||
![]() |
9e07c3e554 | ||
![]() |
399365b2b7 | ||
![]() |
52381453fb | ||
![]() |
317034cb5a | ||
![]() |
e9b5060203 | ||
![]() |
2ea3bc169b | ||
![]() |
f4c45c4834 | ||
![]() |
80bcf6e7ea | ||
![]() |
b7a887c578 | ||
![]() |
731a929a88 | ||
![]() |
8eb75be6ec | ||
![]() |
30ce917afa | ||
![]() |
0d5fb3c1bd | ||
![]() |
6d5f56922b | ||
![]() |
8b0bea4e7d | ||
![]() |
92057d459d | ||
![]() |
0c30b2e921 | ||
![]() |
df1d971a4d | ||
![]() |
9bd7485d4a | ||
![]() |
c98f0399d2 | ||
![]() |
15a20cc25f | ||
![]() |
b342039e8f | ||
![]() |
343cec93e2 | ||
![]() |
b05ee528fd | ||
![]() |
d7c4340b4c | ||
![]() |
e819532f29 | ||
![]() |
a1a9c8221e | ||
![]() |
1ebf80b644 | ||
![]() |
3727987dd3 | ||
![]() |
34e1251292 | ||
![]() |
fdf777640d | ||
![]() |
4cde00c7de | ||
![]() |
92ce8431a2 | ||
![]() |
f233972323 | ||
![]() |
f27a59c193 | ||
![]() |
b9200a4313 | ||
![]() |
b7ebbd5b79 | ||
![]() |
e631c82363 | ||
![]() |
43e6818324 | ||
![]() |
fc019c58bb | ||
![]() |
2e8a61de2e | ||
![]() |
d770abcce8 | ||
![]() |
ecda2d7102 | ||
![]() |
f670bef983 | ||
![]() |
aa71f917a6 | ||
![]() |
33cfbc324a | ||
![]() |
38d5dcb929 | ||
![]() |
994b021a95 | ||
![]() |
c2f321b26b | ||
![]() |
04d58b33be | ||
![]() |
a7562fd66e | ||
![]() |
595f02c01b | ||
![]() |
3d4a49827f | ||
![]() |
fa579b8586 | ||
![]() |
58b91e1a80 | ||
![]() |
997689806b | ||
![]() |
df4d9e93a6 | ||
![]() |
6cd37b51c0 |
252
.eslintrc.js
Normal file
@@ -0,0 +1,252 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
es6: true,
|
||||
webextensions: true,
|
||||
},
|
||||
extends: "eslint:recommended",
|
||||
globals: {
|
||||
Atomics: "readonly",
|
||||
SharedArrayBuffer: "readonly",
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018,
|
||||
},
|
||||
rules: {
|
||||
"accessor-pairs": "error",
|
||||
"array-bracket-newline": "error",
|
||||
"array-bracket-spacing": ["error", "never"],
|
||||
"array-callback-return": "error",
|
||||
"array-element-newline": "error",
|
||||
"arrow-body-style": "error",
|
||||
"arrow-parens": ["error", "as-needed"],
|
||||
"arrow-spacing": [
|
||||
"error",
|
||||
{
|
||||
after: true,
|
||||
before: true,
|
||||
},
|
||||
],
|
||||
"block-scoped-var": "off",
|
||||
"block-spacing": "error",
|
||||
"brace-style": ["error", "1tbs"],
|
||||
"callback-return": "error",
|
||||
camelcase: "off",
|
||||
"capitalized-comments": "off",
|
||||
"class-methods-use-this": "error",
|
||||
"comma-dangle": "error",
|
||||
"comma-spacing": [
|
||||
"error",
|
||||
{
|
||||
after: true,
|
||||
before: false,
|
||||
},
|
||||
],
|
||||
"comma-style": ["error", "last"],
|
||||
complexity: "error",
|
||||
"computed-property-spacing": ["error", "never"],
|
||||
"consistent-return": "off",
|
||||
"consistent-this": "error",
|
||||
curly: "error",
|
||||
"default-case": "error",
|
||||
"default-param-last": "error",
|
||||
"dot-location": "off",
|
||||
"dot-notation": "off",
|
||||
"eol-last": "error",
|
||||
eqeqeq: "off",
|
||||
"func-call-spacing": "error",
|
||||
"func-name-matching": "error",
|
||||
"func-names": "off",
|
||||
"func-style": "off",
|
||||
"function-call-argument-newline": ["error", "consistent"],
|
||||
"function-paren-newline": "off",
|
||||
"generator-star-spacing": "error",
|
||||
"global-require": "error",
|
||||
"guard-for-in": "error",
|
||||
"handle-callback-err": "error",
|
||||
"id-blacklist": "error",
|
||||
"id-length": "error",
|
||||
"id-match": "error",
|
||||
"implicit-arrow-linebreak": ["error", "beside"],
|
||||
indent: "off",
|
||||
"indent-legacy": "off",
|
||||
"init-declarations": "error",
|
||||
"jsx-quotes": "error",
|
||||
"key-spacing": "error",
|
||||
"keyword-spacing": [
|
||||
"error",
|
||||
{
|
||||
after: true,
|
||||
before: true,
|
||||
},
|
||||
],
|
||||
"line-comment-position": "error",
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"lines-around-comment": "off",
|
||||
"lines-around-directive": "error",
|
||||
"lines-between-class-members": "error",
|
||||
"max-classes-per-file": "error",
|
||||
"max-depth": "error",
|
||||
"max-len": "error",
|
||||
"max-lines": "off",
|
||||
"max-lines-per-function": "off",
|
||||
"max-nested-callbacks": "error",
|
||||
"max-params": "error",
|
||||
"max-statements": "off",
|
||||
"max-statements-per-line": "error",
|
||||
"multiline-comment-style": ["error", "bare-block"],
|
||||
"multiline-ternary": "error",
|
||||
"new-cap": "off",
|
||||
"new-parens": "error",
|
||||
"newline-after-var": "off",
|
||||
"newline-before-return": "off",
|
||||
"newline-per-chained-call": "error",
|
||||
"no-alert": "error",
|
||||
"no-array-constructor": "error",
|
||||
"no-await-in-loop": "error",
|
||||
"no-bitwise": "error",
|
||||
"no-buffer-constructor": "error",
|
||||
"no-caller": "error",
|
||||
"no-catch-shadow": "error",
|
||||
"no-confusing-arrow": "error",
|
||||
"no-console": "off",
|
||||
"no-continue": "error",
|
||||
"no-div-regex": "error",
|
||||
"no-duplicate-imports": "error",
|
||||
"no-else-return": "off",
|
||||
"no-empty-function": "error",
|
||||
"no-eq-null": "error",
|
||||
"no-eval": "error",
|
||||
"no-extend-native": "error",
|
||||
"no-extra-bind": "error",
|
||||
"no-extra-label": "error",
|
||||
"no-extra-parens": "error",
|
||||
"no-floating-decimal": "error",
|
||||
"no-implicit-coercion": "error",
|
||||
"no-implicit-globals": "off",
|
||||
"no-implied-eval": "error",
|
||||
"no-import-assign": "error",
|
||||
"no-inline-comments": "error",
|
||||
"no-inner-declarations": "off",
|
||||
"no-invalid-this": "error",
|
||||
"no-iterator": "error",
|
||||
"no-label-var": "error",
|
||||
"no-labels": "error",
|
||||
"no-lone-blocks": "error",
|
||||
"no-lonely-if": "error",
|
||||
"no-loop-func": "error",
|
||||
"no-magic-numbers": "off",
|
||||
"no-mixed-operators": "error",
|
||||
"no-mixed-requires": "error",
|
||||
"no-multi-assign": "error",
|
||||
"no-multi-spaces": "error",
|
||||
"no-multi-str": "error",
|
||||
"no-multiple-empty-lines": "error",
|
||||
"no-native-reassign": "error",
|
||||
"no-negated-condition": "error",
|
||||
"no-negated-in-lhs": "error",
|
||||
"no-nested-ternary": "error",
|
||||
"no-new": "error",
|
||||
"no-new-func": "error",
|
||||
"no-new-object": "error",
|
||||
"no-new-require": "error",
|
||||
"no-new-wrappers": "error",
|
||||
"no-octal-escape": "error",
|
||||
"no-param-reassign": "error",
|
||||
"no-path-concat": "error",
|
||||
"no-plusplus": "error",
|
||||
"no-process-env": "error",
|
||||
"no-process-exit": "error",
|
||||
"no-proto": "error",
|
||||
"no-restricted-globals": "error",
|
||||
"no-restricted-imports": "error",
|
||||
"no-restricted-modules": "error",
|
||||
"no-restricted-properties": "error",
|
||||
"no-restricted-syntax": "error",
|
||||
"no-return-assign": "error",
|
||||
"no-return-await": "error",
|
||||
"no-script-url": "error",
|
||||
"no-self-compare": "error",
|
||||
"no-sequences": "error",
|
||||
"no-shadow": "error",
|
||||
"no-spaced-func": "error",
|
||||
"no-sync": "error",
|
||||
"no-tabs": "error",
|
||||
"no-template-curly-in-string": "error",
|
||||
"no-ternary": "error",
|
||||
"no-throw-literal": "error",
|
||||
"no-trailing-spaces": "error",
|
||||
"no-undef-init": "error",
|
||||
"no-undefined": "off",
|
||||
"no-underscore-dangle": "error",
|
||||
"no-unmodified-loop-condition": "error",
|
||||
"no-unneeded-ternary": "error",
|
||||
"no-unused-expressions": "error",
|
||||
"no-unused-vars": "off",
|
||||
"no-use-before-define": "off",
|
||||
"no-useless-call": "error",
|
||||
"no-useless-computed-key": "error",
|
||||
"no-useless-concat": "error",
|
||||
"no-useless-constructor": "error",
|
||||
"no-useless-rename": "error",
|
||||
"no-useless-return": "error",
|
||||
"no-var": "off",
|
||||
"no-void": "error",
|
||||
"no-warning-comments": "error",
|
||||
"no-whitespace-before-property": "error",
|
||||
"nonblock-statement-body-position": "error",
|
||||
"object-curly-newline": "error",
|
||||
"object-curly-spacing": "off",
|
||||
"object-property-newline": "error",
|
||||
"object-shorthand": "error",
|
||||
"one-var": "off",
|
||||
"one-var-declaration-per-line": "error",
|
||||
"operator-assignment": "error",
|
||||
"operator-linebreak": "error",
|
||||
"padded-blocks": "off",
|
||||
"padding-line-between-statements": "error",
|
||||
"prefer-arrow-callback": "off",
|
||||
"prefer-const": "off",
|
||||
"prefer-destructuring": "off",
|
||||
"prefer-named-capture-group": "error",
|
||||
"prefer-numeric-literals": "error",
|
||||
"prefer-object-spread": "error",
|
||||
"prefer-promise-reject-errors": "error",
|
||||
"prefer-reflect": "error",
|
||||
"prefer-regex-literals": "error",
|
||||
"prefer-rest-params": "error",
|
||||
"prefer-spread": "error",
|
||||
"prefer-template": "off",
|
||||
"quote-props": "off",
|
||||
quotes: ["error", "double"],
|
||||
radix: "error",
|
||||
"require-await": "error",
|
||||
"require-jsdoc": "off",
|
||||
"require-unicode-regexp": "error",
|
||||
"rest-spread-spacing": "error",
|
||||
semi: "error",
|
||||
"semi-spacing": "error",
|
||||
"semi-style": ["error", "last"],
|
||||
"sort-imports": "error",
|
||||
"sort-keys": "off",
|
||||
"sort-vars": "error",
|
||||
"space-before-blocks": "error",
|
||||
"space-before-function-paren": "off",
|
||||
"space-in-parens": ["error", "never"],
|
||||
"space-infix-ops": "error",
|
||||
"space-unary-ops": "error",
|
||||
"spaced-comment": "off",
|
||||
strict: ["error", "never"],
|
||||
"switch-colon-spacing": "error",
|
||||
"symbol-description": "error",
|
||||
"template-curly-spacing": "error",
|
||||
"template-tag-spacing": "error",
|
||||
"unicode-bom": ["error", "never"],
|
||||
"valid-jsdoc": "error",
|
||||
"vars-on-top": "off",
|
||||
"wrap-iife": "error",
|
||||
"wrap-regex": "error",
|
||||
"yield-star-spacing": "error",
|
||||
yoda: ["error", "never"],
|
||||
},
|
||||
};
|
5
.gitignore
vendored
@@ -1,2 +1,5 @@
|
||||
README.md.asc
|
||||
|
||||
node_modules/
|
||||
web-ext-artifacts
|
||||
releases.diff
|
||||
.releases.atom
|
3
.web-extension-id
Normal file
@@ -0,0 +1,3 @@
|
||||
# This file was created by https://github.com/mozilla/web-ext
|
||||
# Your auto-generated extension ID for addons.mozilla.org is:
|
||||
i2ppb@eyedeekay.github.io
|
94
COLORS.md
Normal file
@@ -0,0 +1,94 @@
|
||||
WIP Style guidelines
|
||||
--------------------
|
||||
|
||||
|
||||
Colors currently in use from CSS
|
||||
--------------------------------
|
||||
|
||||
home.css:100: color: #41465f;
|
||||
home.css:10: color: #3b6bbf;
|
||||
home.css:113: color: #41465f;
|
||||
home.css:125: color: #41465f;
|
||||
home.css:139: color: #3b6bbf;
|
||||
home.css:17: color: #81888f;
|
||||
home.css:26: color: #495057;
|
||||
home.css:35: color: #3b6bbf;
|
||||
home.css:49: color: #495057;
|
||||
home.css:58: background-color: #f8f8ff;
|
||||
home.css:66: color: #495057;
|
||||
search.css:20: background-color: #ddd
|
||||
search.css:23: background-color: #2196f3;
|
||||
search.css:24: color: #fff
|
||||
|
||||
home.css:135: background: 0 0!important;
|
||||
home.css:161: background: #dee2e6;
|
||||
home.css:175: background: #dee2e6;
|
||||
home.css:188: background: #a48fe1;
|
||||
home.css:200: background: #dee2e6;
|
||||
home.css:214: background: #dee2e6;
|
||||
home.css:228: background: #d9d9d6;
|
||||
home.css:246: background: #ffc56d;
|
||||
home.css:260: background: #f7e59a;
|
||||
home.css:50: background-attachment: fixed;
|
||||
home.css:51: background-size: 100% 100%;
|
||||
home.css:57:.background {
|
||||
home.css:58: background-color: #f8f8ff;
|
||||
home.css:79: background: #f8f8ff;
|
||||
home.css:91: background: #f8f8ff;
|
||||
search.css:20: background-color: #ddd
|
||||
search.css:23: background-color: #2196f3;
|
||||
search.css:5: background: #dee2e6;
|
||||
|
||||
|
||||
Colors currently in use from Javascript
|
||||
---------------------------------------
|
||||
|
||||
background.js:172: colors: {
|
||||
background.js-173- frame: "#FFC56D",
|
||||
background.js-174- toolbar: "#FFC56D"
|
||||
background.js-175- }
|
||||
--
|
||||
background.js:179: colors: {
|
||||
background.js-180- frame: "#FFC56D",
|
||||
background.js-181- toolbar: "#FFC56D"
|
||||
background.js-182- }
|
||||
--
|
||||
background.js:189: colors: {
|
||||
background.js-190- frame: "#A4C8E1",
|
||||
background.js-191- toolbar: "#A4C8E1"
|
||||
background.js-192- }
|
||||
--
|
||||
background.js:196: colors: {
|
||||
background.js-197- frame: "#A4C8E1",
|
||||
background.js-198- toolbar: "#A4C8E1"
|
||||
background.js-199- }
|
||||
--
|
||||
background.js:206: colors: {
|
||||
background.js-207- frame: "#D9D9D6",
|
||||
background.js-208- toolbar: "#D9D9D6"
|
||||
background.js-209- }
|
||||
--
|
||||
background.js:213: colors: {
|
||||
background.js-214- frame: "#D9D9D6",
|
||||
background.js-215- toolbar: "#D9D9D6"
|
||||
background.js-216- }
|
||||
--
|
||||
background.js:223: colors: {
|
||||
background.js-224- frame: "#F7E59A",
|
||||
background.js-225- toolbar: "#F7E59A"
|
||||
background.js-226- }
|
||||
--
|
||||
background.js:230: colors: {
|
||||
background.js-231- frame: "#F7E59A",
|
||||
background.js-232- toolbar: "#F7E59A"
|
||||
background.js-233- }
|
||||
--
|
||||
background.js:240: colors: {
|
||||
background.js-241- frame: "#A48FE1",
|
||||
background.js-242- toolbar: "#A48FE1"
|
||||
background.js-243- }
|
||||
--
|
||||
background.js:247: colors: {
|
||||
background.js-248- frame: "#A48FE1",
|
||||
background.js-249- toolbar: "#A48FE1"
|
||||
background.js-250- }
|
114
GOALS.md
Normal file
@@ -0,0 +1,114 @@
|
||||
These are the goals of the I2P Browser, and not really this plugin in-and-of-itself
|
||||
===================================================================================
|
||||
|
||||
A
|
||||
|
||||
User Interface:
|
||||
---------------
|
||||
|
||||
* Remove search engines
|
||||
* Replace bookmarks
|
||||
* Donate banner / UI
|
||||
* Patch Firefox to have relative (from the binary) profile directory
|
||||
* Start use the Firefox update process to update browser installations
|
||||
* Mark .i2p cookies as secure
|
||||
* Mark .i2p domains as secure connection
|
||||
* Add tests for .i2p secure marking
|
||||
* Improve the delay-the-user XUL dialogs to be more accurate in regards
|
||||
of where the router is in it’s bootup progress
|
||||
* Disable the WebIDE
|
||||
* Disable GamePad API by default
|
||||
* Disable Web Speech API by default
|
||||
* Disable the Web Audio API by default
|
||||
* UI redesign bootstrapping and configuration screens (delay-the-user dialogs)
|
||||
* Default browser choose wining should de disabled like
|
||||
browser.shell.checkDefaultBrowser, it can be default, but then
|
||||
choosen by the user without any begging ahead
|
||||
* Extend the firefox preferences UI for I2P router configuration thought
|
||||
of as "must have" or "very nice to have"
|
||||
* Shrink the BroadcastChannel API's boundaries of access or disable completely
|
||||
* Make a API white/grey/black -list, in super paranoia mode we should
|
||||
probably disable almost all, while in most cases the user probably want
|
||||
to be as close to a normal browser/web experinence that
|
||||
they are used to from before
|
||||
|
||||
Leak Avoidance:
|
||||
---------------
|
||||
|
||||
* Stop web socket DNS leak
|
||||
* If doable, slim down the CA store from unnecessary CAs
|
||||
* Disable the microphone by default
|
||||
* Ensure WebRTC is disabled in compile time
|
||||
* Disable mDNS features
|
||||
* Ensure links like sftp:// and smb:// ,
|
||||
as well as \\samba-share is blocked/denied
|
||||
* Don’t allow IndexedDB storage for third party domains (likability issue)
|
||||
* Patch the DNS service to prevent any browser or addon DNS resolution
|
||||
* Restrict what MIME types that are exposed to content scripts
|
||||
|
||||
General Security:
|
||||
-----------------
|
||||
|
||||
* Backport any security patches that might appear from Mozilla
|
||||
* Don’t allow XHR/Websockets requests towards 127.0.0.1/localhost
|
||||
* Always use the most sane form of preferences defaults in context
|
||||
of privacy and security.
|
||||
|
||||
Unnecessary Connections:
|
||||
------------------------
|
||||
|
||||
* Disable getpocket.com features and alike
|
||||
* Remove sync option from preferences
|
||||
* Clear state when the app exits, by default
|
||||
* Disable updater telemetry
|
||||
* Make firefox stop call home to mozilla for different reasons
|
||||
* Prevent non-Necko network connections
|
||||
* Figure out how to approach prerender, preconnect, and prefetch link tags
|
||||
|
||||
Disk Avoidance:
|
||||
---------------
|
||||
|
||||
* Don’t allow SSL key logging
|
||||
* Only cache media in memory
|
||||
* Disable the password saving functionality to avoid such being written to disk
|
||||
* Disable the Auto form-fill to keep as much as possible not written to disk
|
||||
|
||||
Platforms:
|
||||
----------
|
||||
|
||||
* Support for Android?
|
||||
* Support for iOS?
|
||||
|
||||
Anti-Fingerprinting:
|
||||
--------------------
|
||||
|
||||
* Test for preferences which ensures a sane default and
|
||||
something to tell when/if we break it
|
||||
* Disable support for system adding
|
||||
* Disable Firefox enterprise policies
|
||||
* Disable NTLM authentication
|
||||
* Disable SPNEGO authentication
|
||||
* Handle privacy issues regarding window.name
|
||||
* Test runner for I2P Browser test cases
|
||||
* Block loading of plugins
|
||||
* Disable OS spesific firefox features that can help fingerprint
|
||||
the end user's operating system
|
||||
* Block html5 canvas by default
|
||||
* Block by default or disable WebGL completely?
|
||||
* Never start fullscreen, always start with fixed width/height to
|
||||
avoid expose screen resolution
|
||||
* Report fake system uptime to content scripts
|
||||
* Spoof Accept-Language and Accept-Charset headers no matter browser language
|
||||
* Spoof timezone to always be UTC
|
||||
* Develop methods to reduce the accuracy of JavaScript
|
||||
performance fingerprinting
|
||||
* Always report only one CPU core (dom.maxHardwareConcurrencys)
|
||||
* Avoid Keystroke fingerprinting by messing with the event resolution
|
||||
* Disable GeoIP-based search results
|
||||
|
||||
???
|
||||
---
|
||||
|
||||
* SVG drawing
|
||||
* MathML drawing
|
||||
* I2Pd flavor
|
359
Makefile
@@ -1,86 +1,367 @@
|
||||
PREFIX:=/usr
|
||||
|
||||
PREFIX?=/usr
|
||||
|
||||
default: zip
|
||||
|
||||
PWD=`pwd`
|
||||
|
||||
install: uninstall
|
||||
mkdir -p $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
cp -r ./chromium/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./icons/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./_locales/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./options/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.js $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.html $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.css $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.md $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.xpi $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./manifest.json $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./LICENSE $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
|
||||
ln -s $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
@echo $(PWD)
|
||||
cp -v ./* $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/; true
|
||||
cp -vr ./i2pcontrol $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol
|
||||
cp -vr ./torrent $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/torrent
|
||||
cp -vr ./_locales $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/_locales
|
||||
cp -vr ./icons $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/icons
|
||||
cp -vr ./options $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/options
|
||||
make link
|
||||
|
||||
link:
|
||||
ln -sf $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2ppb@eyedeekay.github.io
|
||||
|
||||
uninstall:
|
||||
rm -rf $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2ppb@eyedeekay.github.io
|
||||
|
||||
|
||||
ls:
|
||||
ls -lah $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io; \
|
||||
ls -lah $(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
|
||||
clean:
|
||||
rm -f ../i2psetproxy.js.zip ../i2p_proxy*.xpi
|
||||
clean: rc clean-artifacts
|
||||
rm -fr ../i2psetproxy.js.zip ../i2p_proxy*.xpi *.torrent #../i2psetproxy.js_*.*
|
||||
|
||||
## EVEN RELEASES are AMO RELEASES
|
||||
## ODD RELEASES are SELFHOSTED RELEASES
|
||||
|
||||
MOZ_VERSION=0.36
|
||||
VERSION=0.36
|
||||
#VERSION=1.27
|
||||
MOZ_VERSION=0.94
|
||||
VERSION=0.93
|
||||
|
||||
xpi:
|
||||
wget -O ../i2ppb@eyedeekay.github.io.xpi \
|
||||
https://addons.mozilla.org/firefox/downloads/file/3419789/i2psetproxyjs-$(MOZ_VERSION)-an+fx.xpi
|
||||
cp ../i2ppb@eyedeekay.github.io.xpi ./i2ppb@eyedeekay.github.io.xpi
|
||||
## INCREMENT THIS EVERY TIME YOU DO A RELEASE
|
||||
LAST_VERSION=0.91
|
||||
|
||||
YELLOW=F7E59A
|
||||
ORANGE=FFC56D
|
||||
GREY=D9D9D6
|
||||
BLUE=A4C8E1
|
||||
PURPLE=A48fE1
|
||||
|
||||
colors:
|
||||
@echo " yellow $(YELLOW) \n orange $(ORANGE) \n grey $(GREY) \n blue $(BLUE) \n purple $(PURPLE)"
|
||||
|
||||
amo-readme:
|
||||
markdown README.md | \
|
||||
sed 's|<p>||g' | \
|
||||
sed 's|</p>||g' | \
|
||||
sed 's|<h1>|<strong>|g' | \
|
||||
sed 's|</h1>|</strong>|g' | \
|
||||
sed 's|<h2>|<strong>|g' | \
|
||||
sed 's|</h2>|</strong>|g' | \
|
||||
sed 's|<h3>|<strong>|g' | \
|
||||
sed 's|</h3>|</strong>|g' | \
|
||||
grep -v '<img' > amo-index.html
|
||||
|
||||
MAGNET=`torrent2magnet i2ppb@eyedeekay.github.io.xpi.torrent`
|
||||
|
||||
index:
|
||||
@echo "<!DOCTYPE html>" > index.html
|
||||
@echo "<html>" >> index.html
|
||||
@echo "<head>" >> index.html
|
||||
@echo " <title>I2P in Private Browsing Mode</title>" >> index.html
|
||||
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"home.css\" />" >> index.html
|
||||
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"sidebar.css\" />" >> index.html
|
||||
@echo "</head>" >> index.html
|
||||
@echo "<body>" >> index.html
|
||||
sed "s|magnetsub|[Magnet Link]($(MAGNET))|g" README.md | sed 's|README.md|index.html|g' | markdown >> index.html
|
||||
@echo "</body>" >> index.html
|
||||
@echo "</html>" >> index.html
|
||||
|
||||
torrenthelp:
|
||||
@echo "<!DOCTYPE html>" > torrent/index.html
|
||||
@echo "<html>" >> torrent/index.html
|
||||
@echo "<head>" >> torrent/index.html
|
||||
@echo " <title>I2P in Private Browsing Mode</title>" >> torrent/index.html
|
||||
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"../home.css\" />" >> torrent/index.html
|
||||
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"../sidebar.css\" />" >> torrent/index.html
|
||||
@echo "</head>" >> torrent/index.html
|
||||
@echo "<body>" >> torrent/index.html
|
||||
sed "s|magnetsub|[Magnet Link]($(MAGNET))|g" torrent/README.md | markdown >> torrent/index.html
|
||||
@echo "</body>" >> torrent/index.html
|
||||
@echo "</html>" >> torrent/index.html
|
||||
|
||||
xpi: getxpi
|
||||
|
||||
version:
|
||||
sed -i 's|7647|7657|g' *.js* torrent/*.js*
|
||||
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
|
||||
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)\",|g' manifest.json
|
||||
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
|
||||
sed -si 's|$(shell grep $(MOZ_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
|
||||
|
||||
moz-version:
|
||||
sed -i 's|7647|7657|g' *.js* torrent/*.js*
|
||||
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(MOZ_VERSION)\",|g' manifest.json
|
||||
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
|
||||
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
|
||||
sed -si 's|$(shell grep $(VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
|
||||
|
||||
rhz-version:
|
||||
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)1\",|g' manifest.json
|
||||
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)1-rhizome\",|g' manifest.json
|
||||
sed -i 's|7657|7647|g' *.js* torrent/*.js*
|
||||
|
||||
zip: version
|
||||
zip --exclude="./i2ppb@eyedeekay.github.io.xpi" \
|
||||
--exclude="./i2psetproxy.js@eyedeekay.github.io.xpi" \
|
||||
--exclude="./i2psetproxy.js.png" \
|
||||
--exclude="./i2psetproxy.js.gif" \
|
||||
--exclude="./.git" -r -FS ../i2psetproxy.js.zip *
|
||||
--exclude="./package.json" \
|
||||
--exclude="./package-lock.json" \
|
||||
--exclude="./.node_modules" \
|
||||
--exclude="./node_modules" \
|
||||
--exclude="./.git" \
|
||||
--exclude="*/*.xpi" \
|
||||
--exclude="web-ext-artifacts" \
|
||||
--exclude="./*.pdf" -r -FS ../i2psetproxy.js.zip *
|
||||
|
||||
release:
|
||||
cat desc | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -
|
||||
rc:
|
||||
@grep "$(VERSION)" debian/changelog
|
||||
@echo "changelog is prepared"
|
||||
rm -f *.xpi
|
||||
|
||||
rtest: rc index torrenthelp
|
||||
|
||||
release: rc index torrenthelp
|
||||
cat desc debian/changelog | grep -B 10 "$(LAST_VERSION)" | gothub release -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n $(VERSION) -d -; true
|
||||
|
||||
update-release:
|
||||
cat desc debian/changelog | grep -B 10 "$(LAST_VERSION)" | gothub edit -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n $(VERSION) -d -; true
|
||||
|
||||
delete-release:
|
||||
gothub delete -u eyedeekay -r i2psetproxy.js -t $(VERSION); true
|
||||
gothub delete -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION); true
|
||||
|
||||
recreate-release: delete-release release upload
|
||||
|
||||
upload: upload-xpi upload-deb
|
||||
|
||||
full-release: release submit upload-xpi torrent upload-torrent deb upload-deb upload-rss seed
|
||||
|
||||
WEB_EXT_API_KEY=AMO_KEY
|
||||
WEB_EXT_API_SECRET=AMO_SECRET
|
||||
|
||||
|
||||
-include ../api_keys_moz.mk
|
||||
|
||||
tk:
|
||||
echo $(WEB_EXT_API_KEY)
|
||||
|
||||
submit: moz-submit moz-sign
|
||||
|
||||
clean-artifacts:
|
||||
rm -fr web-ext-artifacts/*
|
||||
|
||||
##ODD NUMBERED, SELF-DISTRIBUTED VERSIONS HERE!
|
||||
moz-sign: version clean-artifacts
|
||||
@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
|
||||
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
|
||||
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
|
||||
$(HOME)/node_modules/web-ext-submit/extender.sh --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET)
|
||||
make copyss
|
||||
sleep 5
|
||||
|
||||
copyss:
|
||||
cp web-ext-artifacts/*.xpi ../i2ppb@eyedeekay.github.io.xpi; true
|
||||
|
||||
##EVEN NUMBERED, MOZILLA-DISTRIBUTED VERSIONS HERE!
|
||||
moz-submit: moz-version
|
||||
@echo "Using the 'submit' target to instantly sign an extension for Mozilla distribution"
|
||||
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
|
||||
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
|
||||
mv manifest.json .manifest.json
|
||||
grep -v update_url .manifest.json > manifest.json
|
||||
web-ext sign --channel listed --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
sleep 5
|
||||
mv .manifest.json manifest.json
|
||||
|
||||
rhz-submit: rhz-version
|
||||
@echo "Rhizome releases are disabled while browser is completed."
|
||||
#@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
|
||||
#@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
|
||||
#@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
|
||||
#$HOME/node_modules/web-ext-submit/extender.sh --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
|
||||
#cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi
|
||||
|
||||
getxpi:
|
||||
gothub download -t $(VERSION) -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -n i2ppb@eyedeekay.github.io.xpi
|
||||
mv ./i2ppb@eyedeekay.github.io.xpi ../i2ppb-$(VERSION)@eyedeekay.github.io.xpi
|
||||
cp ../i2ppb-$(VERSION)@eyedeekay.github.io.xpi ../i2ppb@eyedeekay.github.io.xpi
|
||||
|
||||
torrent: getxpi
|
||||
rm -f "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent"
|
||||
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://explodie.org:6969/announce \
|
||||
-a http://tracker.opentrackr.org:1337/announce \
|
||||
-a http://tracker.kamigami.org:2710/announce \
|
||||
-a http://tracker.internetwarriors.net:1337/announce \
|
||||
-a http://tracker.darli.net:6611/announce \
|
||||
-a http://tracker.corpscorp.online:80/announce \
|
||||
-a http://tracker.bz:80/announce \
|
||||
-a http://tracker.bt4g.com:2095/announce \
|
||||
-a http://retracker.sevstar.net:2710/announce \
|
||||
-a http://h4.trakx.nibba.trade:80/announce \
|
||||
-a http://www.proxmox.com:6969/announce \
|
||||
-a http://www.loushao.net:8080/announce \
|
||||
-a http://vps02.net.orel.ru:80/announce \
|
||||
-a http://tracker4.itzmx.com:2710/announce \
|
||||
-a http://tracker3.itzmx.com:6961/announce \
|
||||
-a http://tracker2.itzmx.com:6961/announce \
|
||||
-a http://tracker1.itzmx.com:8080/announce \
|
||||
-a http://tracker01.loveapp.com:6789/announce \
|
||||
-a http://tracker.zerobytes.xyz:1337/announce \
|
||||
-a http://tracker.yoshi210.com:6969/announce \
|
||||
-a http://tracker.torrentyorg.pl:80/announce \
|
||||
-a http://tracker.nyap2p.com:8080/announce \
|
||||
-a http://tracker.lelux.fi:80/announce \
|
||||
-a http://tracker.gbitt.info:80/announce \
|
||||
-a http://pow7.com:80/announce \
|
||||
-a http://opentracker.i2p.rocks:6969/announce \
|
||||
-a http://open.acgtracker.com:1096/announce \
|
||||
-a http://open.acgnxtracker.com:80/announce \
|
||||
-a http://mail2.zelenaya.net:80/announce \
|
||||
-a http://acg.rip:6699/announce \
|
||||
-n "i2ppb-$(VERSION)@eyedeekay.github.io.xpi" \
|
||||
-o "i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" \
|
||||
-w https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/$(VERSION)/i2ppb@eyedeekay.github.io.xpi \
|
||||
../i2ppb@eyedeekay.github.io.xpi; true
|
||||
cp -v "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" "./i2ppb@eyedeekay.github.io.xpi.torrent"
|
||||
make index
|
||||
|
||||
upload-torrent:
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi.torrent" -f "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent"
|
||||
|
||||
upload-xpi:
|
||||
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "../i2ppb@eyedeekay.github.io.xpi"
|
||||
|
||||
upload-deb:
|
||||
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION).orig.tar.gz" -f "../i2psetproxy.js_$(VERSION).orig.tar.gz"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.debian.tar.xz" -f "../i2psetproxy.js_$(VERSION)-1.debian.tar.xz"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.dsc" -f "../i2psetproxy.js_$(VERSION)-1.dsc"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.changes" -f "../i2psetproxy.js_$(VERSION)-1_amd64.changes"
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.buildinfo" -f "../i2psetproxy.js_$(VERSION)-1_amd64.buildinfo"
|
||||
|
||||
lib: libpolyfill
|
||||
upload-docs:
|
||||
gothub release -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Documentation" -d "PDF's and text about the extension"; true
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Landing Page Documentation.pdf" -f ../smartlander.pdf
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Browser Design Documentation.pdf" -f ../browser.pdf
|
||||
|
||||
libpolyfill:
|
||||
wget -O chromium/browser-polyfill.js https://unpkg.com/webextension-polyfill/dist/browser-polyfill.js
|
||||
fmt: fmt-css fmt-html fmt-js
|
||||
|
||||
fmt:
|
||||
find . -path ./node_modules -prune -o -name '*.js' -exec prettier --write {} \;
|
||||
fmt-css:
|
||||
cleancss -O1 all -O2 all --format beautify home.css -o .home.css && mv .home.css home.css
|
||||
cleancss -O1 all -O2 all --format beautify info.css -o .info.css && mv .info.css info.css
|
||||
cleancss -O1 all -O2 all --format beautify search.css -o .search.css && mv .search.css search.css
|
||||
cleancss -O1 all -O2 all --format beautify sidebar.css -o .sidebar.css && mv .sidebar.css sidebar.css
|
||||
cleancss -O1 all -O2 all --format beautify options/options.css -o options/.options.css && mv options/.options.css options/options.css
|
||||
|
||||
deborig:
|
||||
rm -rfv ../i2psetproxy.js-$(VERSION)
|
||||
cp -rv . ../i2psetproxy.js-$(VERSION)
|
||||
tar --exclude='./.git' --exclude="./node_modules" -cvzf ../i2psetproxy.js_$(VERSION).orig.tar.gz .
|
||||
fmt-html:
|
||||
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes index.html > .index.html; mv .index.html index.html
|
||||
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes window.html > .window.html; mv .window.html window.html
|
||||
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes home.html > .home.html; mv .home.html home.html
|
||||
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes toopie.html > .toopie.html; mv .toopie.html toopie.html
|
||||
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes security.html > .security.html; mv .security.html security.html
|
||||
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes options/options.html > options/.options.html; mv options/.options.html options/options.html
|
||||
|
||||
fmt-js:
|
||||
fixjsstyle *.js
|
||||
fixjsstyle options/*.js
|
||||
fixjsstyle torrent/*.js
|
||||
fixjsstyle i2pcontrol/*.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
|
||||
#eslint --color *.js
|
||||
|
||||
deborig: version
|
||||
rm -rf ../i2psetproxy.js-$(VERSION)
|
||||
mkdir -p ../i2psetproxy.js-$(VERSION)
|
||||
cp -r ./* ../i2psetproxy.js-$(VERSION)
|
||||
cd ../i2psetproxy.js-$(VERSION) && \
|
||||
rm -rf web-ext-artifacts .git node_modules && \
|
||||
tar \
|
||||
-cvz \
|
||||
--exclude=i2psetproxy.js.gif \
|
||||
--exclude=*.pdf \
|
||||
-f ../i2psetproxy.js_$(VERSION).orig.tar.gz \
|
||||
.
|
||||
|
||||
deb: deborig
|
||||
cd ../i2psetproxy.js-$(VERSION) && debuild -us -uc -rfakeroot
|
||||
|
||||
-include mirrors.mk
|
||||
|
||||
dat:
|
||||
wget -c -O dat.js https://bundle.run/dat-js
|
||||
|
||||
rss: torrent
|
||||
rm -f releases.diff
|
||||
mv releases.atom .releases.atom
|
||||
wget https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases.atom
|
||||
sed -i "s|<title>$(VERSION)</title>|<title>$(VERSION)</title>\n <enclosure url=\"$(MAGNET)\" type=\"application/x-bittorrent\" />|g" releases.atom
|
||||
|
||||
upload-rss: rss
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "releases.atom" -f releases.atom
|
||||
|
||||
upload-updatemanifest:
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "updateManifest.json" -f updateManifest.json
|
||||
|
||||
webext:
|
||||
web-ext run -u "about:devtools-toolbox?type=extension&id=i2ppb%40eyedeekay.github.io"
|
||||
|
||||
snark-mirror:
|
||||
http_proxy=http://127.0.0.1:4444 wget -c -O ../i2psnark-rpc.su3 http://stats.i2p/i2p/plugins/i2psnark-rpc.su3
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psnark-rpc.su3" -f ../i2psnark-rpc.su3
|
||||
http_proxy=http://127.0.0.1:4444 wget -c -O ../i2psnark-rpc-update.su3 http://stats.i2p/i2p/plugins/i2psnark-rpc-update.su3
|
||||
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psnark-rpc-update.su3" -f ../i2psnark-rpc-update.su3
|
||||
|
||||
seed:
|
||||
cp -v "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" "$(HOME)/.i2p/i2psnark"
|
||||
cp -v "../i2ppb-$(VERSION)@eyedeekay.github.io.xpi" "$(HOME)/.i2p/i2psnark"
|
||||
|
||||
wire:
|
||||
cp -v "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" "$(HOME)/i2p/MuWireDownloads/"
|
||||
cp -v "../i2ppb-$(VERSION)@eyedeekay.github.io.xpi" "$(HOME)/i2p/MuWireDownloads/"
|
||||
|
||||
ndtest:
|
||||
web-ext run -u about:debugging \
|
||||
-u http://127.0.0.1:7657/home \
|
||||
-u http://127.0.0.1:7657/i2ptunnel \
|
||||
-u http://127.0.0.1:7657/i2psnark \
|
||||
-u http://127.0.0.1:7657/webmail \
|
||||
-u http://127.0.0.1:7657/MuWire \
|
||||
-u http://idk.i2p/video.html \
|
||||
-u http://idk.i2p \
|
||||
-u http://stats.i2p \
|
||||
-u https://ramble.pw \
|
||||
-u https://ramble.pw/f/i2p \
|
||||
|
||||
lht-test:
|
||||
web-ext run -u about:debugging \
|
||||
-u http://localhost:7657/home \
|
||||
-u http://localhost:7657/i2ptunnel \
|
||||
-u http://localhost:7657/i2psnark \
|
||||
-u http://localhost:7657/webmail \
|
||||
-u http://localhost:7657/MuWire/ \
|
||||
-u http://idk.i2p
|
||||
|
70
PLAN.md
Normal file
@@ -0,0 +1,70 @@
|
||||
The I2P Browser has made strides at improving users anonymity when browsing
|
||||
the anonymous web inside of I2P. However, it has in many ways simply re-hashed
|
||||
the existing work of Tor on the Tor Browser. This is mostly a good thing, but it
|
||||
is unfortunate because in a sense we have failed to add I2P specific features
|
||||
that could improve the user experience and set us apart from the Tor Browser.
|
||||
|
||||
I think that moving forward, we should try to extend the functionality of I2P
|
||||
Browser into more I2P-specific realms and make an effort to make those things
|
||||
more accessible and highlight that they are in use. I don't really know how to
|
||||
explain what I mean without describing what I want to do, so
|
||||
|
||||
Let's avoid *adding* features to i2pbutton
|
||||
------------------------------------------
|
||||
|
||||
i2pbutton contains alot of code from Tor which even they don't really want to
|
||||
maintain. It's dying the same long, slow death it's always been dying, since
|
||||
back before there was a Tor Browser and torbutton was just an easy way to
|
||||
configure Tor in your Firefox browser. I don't relish the thought of being one
|
||||
the last two groups on the planet maintaining an XUL extension, so I think that
|
||||
we should always be trying to do less with i2pbutton and more with a modern
|
||||
extension. Other advantages of modern extensions are better debugging tools
|
||||
and easier-to-use, more understandable API's for doing the following other
|
||||
things.
|
||||
|
||||
Contexts for Security and Placing Router Applications under their own Origin
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
It is possible, however unlikely, for an attack on a local service or a router
|
||||
plugin to leak information about what's going on on the router console because
|
||||
they will share the same origin. We can resolve this issue, though, by placing
|
||||
applications each into their own origin under a so-called "Container Tab,"
|
||||
completely separating eepWeb traffic and Router Console administration. The
|
||||
origin of the application will be the same as the part of the application URL
|
||||
*after* localhost:7657, so for instance "http://localhost:7657/torrents"
|
||||
would become just "torrents" in the URL bar and have that origin.
|
||||
|
||||
Dynamic Themes
|
||||
--------------
|
||||
|
||||
Since I2P Browsing and Router Console Administration are going to be separated
|
||||
to their own contextual identities, we can manipulate the appearance of the
|
||||
Firefox browser to accomplish 2 things: We can indicate which context we are in
|
||||
both by manipulating the UI text and color, and manipulate UI elements based on
|
||||
what context we're in or even what URL(In the router console) we're on. We can
|
||||
use this to make router console applications appear more tightly integrated with
|
||||
the functionality of the browser. It's kind of obliquely like how many
|
||||
applications are written with user-interfaces that are actually just
|
||||
browsers(Including Mattermost), but with us using the whole browser,
|
||||
acknowledging it's presence and utility but quite literally highlighting(in
|
||||
color) our unique features. So for instance, when the user is using snark it
|
||||
could change color to match snark and change text to say "Torrent Client."
|
||||
|
||||
Application Integration - Torrents
|
||||
----------------------------------
|
||||
|
||||
I2P's strengths are in it's applications, but many users never even make it to
|
||||
the applications, and even if they do, the I2P applications often lack the
|
||||
familiar workflows that people are used to. For instance, when one downloads
|
||||
a torrent on the non-anonymous internet, you simply click a link and the browser
|
||||
"Handles" the link, automatically launching the torrent client, adding the
|
||||
torrent, and sometimes prompting the user for more actions. This isn't possible
|
||||
yet with i2psnark and an external browser, but in I2P browser we can write a
|
||||
"Protocol Handler" which talks to snark-rpc, replicating the ease of just
|
||||
clicking a torrent link to automatically add it to a torrent client. Of course
|
||||
that does require us to bundle the snark-rpc plugin. Besides that, once we've
|
||||
added the torrent, we can keep talking to snark-rpc to keep track of the
|
||||
download progress and display information about that in the already-available
|
||||
Firefox downloads menu that users are already familiar with, so that they can
|
||||
keep track of the files they are downloading after navigating away from the
|
||||
snark interface, or perhaps even without needing to interact with snark at all.
|
224
README.md
@@ -1,38 +1,82 @@
|
||||
i2psetproxy.js
|
||||
==============
|
||||
I2P in Private Browsing Mode(Firefox-Only)
|
||||
==========================================
|
||||
|
||||
WebExtension that does extended configuration of a dedicated I2P browser. While
|
||||
**experimental**, it's capable of enforcing the use of the I2P Proxy without
|
||||
needing to touch about:config and disables several
|
||||
fingerprinting/de-anonymization vectors on it's own. It is also the easiest way
|
||||
to configure an I2P browser on Android without requiring the user to root their
|
||||
device.
|
||||
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.
|
||||
|
||||
The Old Version
|
||||
---------------
|
||||
|
||||
New versions of this extension create an I2P in Private Browsing mode instead.
|
||||
Since this is a drastic change to the behavior of the old plugin, a new entry
|
||||
for the new plugin has been made at a new location on addons.mozilla.org.
|
||||
|
||||
Android usage:
|
||||
Privacy Policy
|
||||
--------------
|
||||
|
||||
Open the following link [Github Releases Version](https://github.com/eyedeekay/i2psetproxy.js/releases/download/1.26/i2psetproxy.js@eyedeekay.github.io.xpi)
|
||||
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.
|
||||
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.
|
||||
|
||||
### addons.mozilla.org
|
||||
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.
|
||||
|
||||
If you would prefer to recieve automatic updates from AMO, the correct product
|
||||
page for this plugin is [I2P-proxy](https://addons.mozilla.org/en-US/firefox/addon/I2P-proxy/).
|
||||
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.
|
||||
This browser extension is entirely Free, Open-Source software.
|
||||
|
||||
Installation(Cross-Platform):
|
||||
-----------------------------
|
||||
|
||||
For desktop users this addon is available from addons.mozilla.org, where you
|
||||
will be able to recive automatic updates:
|
||||
[I2P in Private Browsing](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/).
|
||||
|
||||
Debian Installation:
|
||||
--------------------
|
||||
|
||||
Should you prefer, it is possible to install this extension system-wide by
|
||||
side-loading it into Debian. You can generate your own deb file by running the
|
||||
command:
|
||||
|
||||
make deb
|
||||
|
||||
and then you can install it with:
|
||||
|
||||
sudo apt install ../i2psetproxy.js_*.deb
|
||||
|
||||
Bittorrent Download:
|
||||
--------------------
|
||||
|
||||
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).
|
||||
|
||||
* magnetsub
|
||||
* [Get the .torrent file](./i2ppb@eyedeekay.github.io.xpi.torrent)
|
||||
|
||||
Usage:
|
||||
------
|
||||
|
||||
* Basically, it "Just Works." After you install the plugin, browsing to an I2P
|
||||
domain will automatically stop the current tab and re-open the I2P site in an
|
||||
I2P Browser tab.
|
||||
* Besides that, four bookmarks are added to the "Bookmarks Toolbar," which
|
||||
will take you to visit your Java I2P applications, or the "Simplified I2P
|
||||
Landing Page" embedded in the plugin:
|
||||
* 
|
||||
* Also, there's a menu for accessing I2P functionality while you're browsing.
|
||||
It lets you control a few settings in a granular way.
|
||||
* 
|
||||
* You can re-enable WebRTC but force it to always use the proxy that is
|
||||
enforced by the tab.
|
||||
* You can either force the browser to delete all history for I2P sites
|
||||
immediately, or you can close all your I2P Browser tabs at once and delete
|
||||
the history for I2P browsing when you're done.
|
||||
* That's all there is to it! Your browser is configured to safely use and
|
||||
administer I2P.
|
||||
* 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:
|
||||
[Torrent guide](torrent/README.md)
|
||||
|
||||
### Features
|
||||
|
||||
@@ -41,33 +85,75 @@ submission to AMO.
|
||||
to the I2P container. Isolate the router console from other local
|
||||
applications by automatically intercepting requests to the router console to
|
||||
another container.
|
||||
* [done/wip] **Indicate** the I2P browser is in use visually. Find an
|
||||
* 
|
||||
* [done] **Indicate** the I2P browser is in use visually. Find an
|
||||
acceptable way to indicate it on Android.
|
||||
* 
|
||||
* [done] **Set** the http proxy to use the local I2P proxy automatically.
|
||||
Provide specific configuration for other types of I2P proxies(SOCKS,
|
||||
isolating HTTP)
|
||||
* [done/wip] **Disable** risky webRTC features/offer the option to re-enable
|
||||
* [done] **Disable** risky webRTC features/offer the option to re-enable
|
||||
them with the proxy enforced.
|
||||
* [done] **Change** the color of the browser window to indicate that I2P is in use
|
||||
* [done-ish] **Reset** the HTTP Proxy tunnel to generate a new destination on-demand
|
||||
* it does this by working in conjunction with this [standalone HTTP proxy](https://github.com/eyedeekay/httptunnel), currently disabled*.
|
||||
* [done] **Change** the color of the browser window to indicate that I2P is in
|
||||
use
|
||||
* 
|
||||
* [ready] **Provide** help in a variety of languages.
|
||||
* [wip] **Monitor** the health and readiness of the I2P router it is
|
||||
instructed to use.
|
||||
* [1/2] **Handle** router console applications under their own origins and
|
||||
* [done] **Monitor** the health and readiness of the I2P router it is
|
||||
instructed to use. Currently the plugin checks whether the HTTP Proxy is
|
||||
working by fetching an image from "http://proxy.i2p" and displaying a result.
|
||||
A work-in-progress binding to i2pcontrol is available in ./i2pcontrol, it is
|
||||
inert at this time.
|
||||
* 
|
||||
* [Done] **Handle** router console applications under their own origins and
|
||||
within their own contextual identity. (1) The router console is automatically
|
||||
confined to it's own container tab. (2) Use a custom protocol handler to
|
||||
place each i2p application/plugin under it's own origin, shortening router
|
||||
console URL's and placing applications under their own origin.
|
||||
* [not started] **Handle Torrents** by talking to i2psnark-rpc plugin and then
|
||||
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
|
||||
can.
|
||||
* 
|
||||
* [Done] **Handle Torrents** 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.
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* [Started] **Indicate** the level of authenticity provided by TLS. TLS is
|
||||
optional on I2P for now, but some sites offer it anyway. TLS support is
|
||||
experimental and in the works.
|
||||
* [Started] **Provide** alternate, in-I2P destinations for web sites that want to
|
||||
mirror their content within I2P.
|
||||
* [Started] **Enhance** the I2P browsing experience by allowing site developers
|
||||
distribute some or all of their resources as torrents, allowing the torrents to
|
||||
be treated effectively as a CDN.
|
||||
* [barely started] **Isolate** traffic by contextual identity to it's own HTTP
|
||||
Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The
|
||||
contextual identities. For now, the contextual identities used to manage
|
||||
browsing are "I2P Browsing" and "Web Browsing" where I2P Browsing is capable
|
||||
of using an outproxy but in the case of traffic destined for the clearnet
|
||||
does not do header rewriting, and Web Browsing falls back to the Proxy
|
||||
configured in Firefox. The I2P Browsing will be expanded to
|
||||
- I2P Amnesiac Browsing: Use for General Browsing, stores no history and
|
||||
uses an HTTP Proxy with a very short tunnel-close timeout and no key-reuse.
|
||||
- I2P Social Networking: Use this for logging into social network accounts,
|
||||
forums, and other interactive asynchronous public communication platforms
|
||||
where your identity is behaviorally linkable. This has a very long
|
||||
tunnel-close timeout and key-reuse until specifically invoked.
|
||||
- I2P Blogging: Use this for posting content to the web interface of your
|
||||
blog or to other similar websites that you create content on.
|
||||
* 
|
||||
|
||||
### Screenshot
|
||||
### Video
|
||||
|
||||

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

|
||||
Documents
|
||||
------------
|
||||
|
||||
* **[Browser Outline](https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Browser.Design.Documentation.pdf)**: This document is an outline of each of
|
||||
the browser extension's feature panels in presentation form.
|
||||
* **[Smart Lander Design](https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Landing.Page.Documentation.pdf)**: This is the original outline of
|
||||
the smart landing page which became the I2P home page within the browser and
|
||||
the drop-down control panel.
|
||||
* **[Other extensions](https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/wiki/Other-Extensions)**: and how they work with this one.
|
||||
|
||||
Super Extra Important Background Info:
|
||||
--------------------------------------
|
||||
@@ -78,16 +164,52 @@ Tor's work on hardening Firefox itself and of particular interest are the
|
||||
|
||||
### Links about Project Uplift
|
||||
|
||||
* https://wiki.mozilla.org/Security/Tor_Uplift
|
||||
* https://wiki.mozilla.org/Security/FirstPartyIsolation
|
||||
* https://wiki.mozilla.org/Security/Fingerprinting
|
||||
* https://wiki.mozilla.org/Security/Fennec%2BTor_Project
|
||||
* https://wiki.mozilla.org/Security/Tor_Uplift/Tracking
|
||||
* [Tor Uplift](https://wiki.mozilla.org/Security/Tor_Uplift) 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.
|
||||
* [First Party Isolation](https://wiki.mozilla.org/Security/FirstPartyIsolation)
|
||||
is a feature in Firefox and other browsers which keeps information from
|
||||
leaking across first-party domains.
|
||||
* [Fingerprinting](https://wiki.mozilla.org/Security/Fingerprinting) 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.
|
||||
* [Fennec](https://wiki.mozilla.org/Security/Fennec%2BTor_Project) is Firefox
|
||||
for Android and this link has some analysis of the privacy consequences of the
|
||||
Android platform.
|
||||
* [Tracking](https://wiki.mozilla.org/Security/Tor_Uplift/Tracking) in Firefox
|
||||
is surveyed here.
|
||||
|
||||
Project uplift seems to have largely been accomplished?
|
||||
|
||||
### Links about Project Fusion
|
||||
|
||||
* https://wiki.mozilla.org/Security/Fusion
|
||||
* https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject
|
||||
* https://blog.torproject.org/tor-heart-firefox
|
||||
* [Project Fusion](https://wiki.mozilla.org/Security/Fusion) or Firefox using
|
||||
Onions is a joint Mozilla/Tor effort to create an enhanced Private Browsing
|
||||
mode for Firefox which uses Tor.
|
||||
* [Notes](https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject)
|
||||
from a meeting about Fusion.
|
||||
* [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 **Other** Version
|
||||
---------------------
|
||||
|
||||
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/)
|
||||
|
||||
* This is the old version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/)
|
||||
|
||||
Android usage:
|
||||
--------------
|
||||
|
||||
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/
|
||||
|
||||
|
@@ -3,16 +3,216 @@
|
||||
"message": "I2P In Private Browsing",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"toopieName": {
|
||||
"message": "toopie.html",
|
||||
"description": "Name of the sidebar."
|
||||
},
|
||||
"toopieTLS": {
|
||||
"message": "Site Properties",
|
||||
"description": "Name of the security panel."
|
||||
},
|
||||
"extensionDescription": {
|
||||
"message": "Set up a browser to use the i2p http proxy automatically",
|
||||
"message": "Your browser is now set up to use I2P.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"extensionVersion": {
|
||||
"message": "0.77",
|
||||
"description": "Version of the extension."
|
||||
},
|
||||
"proxyFailedStatus": {
|
||||
"message": "Proxy is not ready",
|
||||
"description": "Proxy failed status."
|
||||
},
|
||||
"proxySuccessStatus": {
|
||||
"message": "Proxy is ready",
|
||||
"description": "Proxy failed status."
|
||||
},
|
||||
"controlHeader": {
|
||||
"message": "Control",
|
||||
"description": "Headline for control panel."
|
||||
},
|
||||
"controlExplain": {
|
||||
"message": "These controls are used to tailor your I2P Browsing Experience",
|
||||
"description": "Introduce the control panel."
|
||||
},
|
||||
"clearData": {
|
||||
"message": "Clear Browsing Data: ",
|
||||
"description": "Clear Browsing Data menu item."
|
||||
},
|
||||
"clearDesc": {
|
||||
"message": "Use this to erase your I2P browsing data.",
|
||||
"description": "Clear browsing data action description."
|
||||
},
|
||||
"enableWebRTC": {
|
||||
"message": "Enable WebRTC with proxy?",
|
||||
"description": "WebRTC checkbox label."
|
||||
},
|
||||
"rtcDesc": {
|
||||
"message": "WebRTC is disabled by default, but you can turn it back on and force it to honor the proxy. If you are a user of the Snowflake browser extension, this option is disabled and WebRTC is turned on by default.",
|
||||
"description": "WebRTC action description"
|
||||
},
|
||||
"disableHistory": {
|
||||
"message": "Disable History in I2P Tabs?",
|
||||
"description": "History checkbox label."
|
||||
},
|
||||
"histDesc": {
|
||||
"message": "History is automatically cleared when your I2P tabs are closed. If you want to clear history as you go, check this box.",
|
||||
"description": "History action description"
|
||||
},
|
||||
"applicationHeader": {
|
||||
"message": "Applications",
|
||||
"description": "Header for applications section."
|
||||
},
|
||||
"applicationExplain": {
|
||||
"message": "These applications work with I2P directly to provide them with security and privacy.",
|
||||
"description": "Description for application section."
|
||||
},
|
||||
"windowVisitConsole": {
|
||||
"message": "Router Console: ",
|
||||
"description": "Router Console label."
|
||||
},
|
||||
"routerConsole": {
|
||||
"message": "The entrypoint for all other I2P applications is the I2P Router Console. To visit it, click here.",
|
||||
"description": "Description for the router console."
|
||||
},
|
||||
"windowVisitHomepage": {
|
||||
"message": "Home Page: ",
|
||||
"description": "Home page for the extension label."
|
||||
},
|
||||
"abouthome": {
|
||||
"message": "For more information about this extension, visit this page.",
|
||||
"description": "Description for the extension button page."
|
||||
},
|
||||
"windowVisitHelppage": {
|
||||
"message": "Help Page: ",
|
||||
"description": "Help page for the extension label."
|
||||
},
|
||||
"help": {
|
||||
"message": "For more information about this extension, visit this page.",
|
||||
"description": "Description for the extension button page."
|
||||
},
|
||||
"windowVisitI2ptunnel": {
|
||||
"message": "Hidden Services Manager: ",
|
||||
"description": "Title for i2ptunnel"
|
||||
},
|
||||
"i2ptunnel": {
|
||||
"message": "I2P has a web-based interface for configuring .i2p services like web sites which you can set up.",
|
||||
"description": "Description for i2ptunnel"
|
||||
},
|
||||
"windowVisitSusimail": {
|
||||
"message": "E-Mail: ",
|
||||
"description": "Title for e-mail"
|
||||
},
|
||||
"susimail": {
|
||||
"message": "I2P also bundles a webmail client which can be used to access in-I2P e-mail.",
|
||||
"description": "Description for e-mail"
|
||||
},
|
||||
"windowVisitSnark": {
|
||||
"message": "Bittorrent: ",
|
||||
"description": "Title for Bittorrent"
|
||||
},
|
||||
"snark": {
|
||||
"message": "I2P is capable of anonymous Peer-to-Peer file sharing using the built-in bittorrent application.",
|
||||
"description": "Description for Bittorrent"
|
||||
},
|
||||
"windowVisitSources": {
|
||||
"message": "Extension Source Code: ",
|
||||
"description": "Title for source code link"
|
||||
},
|
||||
"sources": {
|
||||
"message": "Browse the source code here",
|
||||
"description": "Description for the Source code link"
|
||||
},
|
||||
"windowVisitWebPage": {
|
||||
"message": "Extension Home Page: ",
|
||||
"description": "Visit extension homepage on Github"
|
||||
},
|
||||
"homepage": {
|
||||
"message": "More information is available here",
|
||||
"description": "Find more information"
|
||||
},
|
||||
"windowVisitReleases": {
|
||||
"message": "Extension Releases: ",
|
||||
"description": "Visit the release page"
|
||||
},
|
||||
"releases": {
|
||||
"message": "Check for new releases here",
|
||||
"description": "Description for new release page"
|
||||
},
|
||||
"titlePreface": {
|
||||
"message": "I2P Browser - ",
|
||||
"message": "I2P Browser",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"titlePrefacePrivate": {
|
||||
"message": "I2P Browser (Private) - ",
|
||||
"message": "I2P Browser (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"extensionPreface": {
|
||||
"message": "I2P Management",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"webPreface": {
|
||||
"message": "Web Browser",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"webPrefacePrivate": {
|
||||
"message": "Web Browser (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"ircPreface": {
|
||||
"message": "Dispatch IRC",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"ircPrefacePrivate": {
|
||||
"message": "Dispatch IRC (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"botePreface": {
|
||||
"message": "I2P-Bote Mail",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"botePrefacePrivate": {
|
||||
"message": "I2P-Bote Mail (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"routerPreface": {
|
||||
"message": "Router Console",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"routerPrefacePrivate": {
|
||||
"message": "Router Console (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"torrentPreface": {
|
||||
"message": "Bittorrent",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"torrentPrefacePrivate": {
|
||||
"message": "Bittorrent (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"mailPreface": {
|
||||
"message": "Web Mail",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"mailPrefacePrivate": {
|
||||
"message": "Web Mail (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"i2ptunnelPreface": {
|
||||
"message": "Hidden Services Manager",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"i2ptunnelPrefacePrivate": {
|
||||
"message": "Hidden Services Manager (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"muwirePreface": {
|
||||
"message": "MuWire",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"muwirePrefacePrivate": {
|
||||
"message": "MuWire (Private)",
|
||||
"description": "Preface for the browser titlebar"
|
||||
},
|
||||
"resetMessage": {
|
||||
@@ -39,9 +239,9 @@
|
||||
"message": "Visit the I2P Forum to learn more or ask for assistance",
|
||||
"description": "Help Message"
|
||||
},
|
||||
"clearData": {
|
||||
"message": "Clear all browsing data",
|
||||
"description": "Help Message"
|
||||
"proxyHelpText": {
|
||||
"message": "Configure your I2P proxy here.",
|
||||
"description": "Help for configuring the options for the Reset Tunnel button"
|
||||
},
|
||||
"hostText": {
|
||||
"message": "Host: ",
|
||||
@@ -52,15 +252,51 @@
|
||||
"description": "Port for the HTTP or SOCKS5 Proxy"
|
||||
},
|
||||
"controlHelpText": {
|
||||
"message": "These options will be inert if used with the default i2p HTTP or SOCKS proxy.",
|
||||
"message": "Configure your router console here.",
|
||||
"description": "Help for configuring the options for the Reset Tunnel button"
|
||||
},
|
||||
"controlHostText": {
|
||||
"message": "Control Host: ",
|
||||
"description": "Host for the Reset Tunnel button"
|
||||
"description": "Host for the Router Console"
|
||||
},
|
||||
"controlPortText": {
|
||||
"message": "Control Port: ",
|
||||
"description": "Port for the Reset Tunnel button"
|
||||
"description": "Port for the Router Console"
|
||||
},
|
||||
"controlHostValue": {
|
||||
"message": "127.0.0.1",
|
||||
"description": "Host for the Router Console"
|
||||
},
|
||||
"controlPortValue": {
|
||||
"message": "7657",
|
||||
"description": "Port for the Router Console"
|
||||
},
|
||||
"isBase32": {
|
||||
"message": "I2P Base32-Formatted Address",
|
||||
"description": "Message for site info panel base32"
|
||||
},
|
||||
"isHostName": {
|
||||
"message": "I2P Jump Hostname",
|
||||
"description": "Message for the site info panel hostname"
|
||||
},
|
||||
"siteLabel": {
|
||||
"message": "Address/Site Information:",
|
||||
"description": "Label for i2p site info"
|
||||
},
|
||||
"certLabel": {
|
||||
"message": "Certificate Information:",
|
||||
"description": "Label for certificate info"
|
||||
},
|
||||
"certAbsent": {
|
||||
"message": "This site is not using HTTPS. It is still verified cryptographically by I2P.",
|
||||
"description": "Content for certificate info if absent"
|
||||
},
|
||||
"certPresent": {
|
||||
"message": "This site is using HTTPS. HTTPS over I2P is experimental and requires self-signed certificates or alternate root authorites.",
|
||||
"description": "Content for certificate info if present"
|
||||
},
|
||||
"protocolHandlerValue": {
|
||||
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent",
|
||||
"description": "Value for the magnet protocol handler"
|
||||
}
|
||||
}
|
||||
|
302
_locales/es/messages.json
Normal file
@@ -0,0 +1,302 @@
|
||||
{
|
||||
"extensionName": {
|
||||
"message": "I2P en navegación privada",
|
||||
"description": "Nombre de la extensión."
|
||||
},
|
||||
"toopieName": {
|
||||
"message": "toopie.html",
|
||||
"description": "Nombre de la barra lateral."
|
||||
},
|
||||
"toopieTLS": {
|
||||
"message": "Propiedades del sitio",
|
||||
"description": "Nombre del panel de seguridad."
|
||||
},
|
||||
"extensionDescription": {
|
||||
"message": "Su navegador ahora está configurado para usar I2P.",
|
||||
"description": "Descripción de la extensión."
|
||||
},
|
||||
"extensionVersion": {
|
||||
"message": "0,77",
|
||||
"description": "Versión de la extensión."
|
||||
},
|
||||
"proxyFailedStatus": {
|
||||
"message": "El proxy no está listo",
|
||||
"description": "Estado fallido del proxy."
|
||||
},
|
||||
"proxySuccessStatus": {
|
||||
"message": "El proxy está listo",
|
||||
"description": "Estado fallido del proxy."
|
||||
},
|
||||
"controlHeader": {
|
||||
"message": "Control",
|
||||
"description": "Título del panel de control."
|
||||
},
|
||||
"controlExplain": {
|
||||
"message": "Estos controles se utilizan para personalizar su experiencia de navegación I2P",
|
||||
"description": "Introduce el panel de control."
|
||||
},
|
||||
"clearData": {
|
||||
"message": "Borrar datos de navegación:",
|
||||
"description": "Elemento de menú Borrar datos de navegación."
|
||||
},
|
||||
"clearDesc": {
|
||||
"message": "Use esto para borrar sus datos de navegación I2P.",
|
||||
"description": "Borrar descripción de la acción de datos de navegación."
|
||||
},
|
||||
"enableWebRTC": {
|
||||
"message": "¿Habilitar WebRTC con proxy?",
|
||||
"description": "Etiqueta de casilla de verificación de WebRTC."
|
||||
},
|
||||
"rtcDesc": {
|
||||
"message": "WebRTC está deshabilitado de forma predeterminada, pero puede volver a encenderlo y forzarlo para que respete el proxy. Si es un usuario de la extensión del navegador Snowflake, esta opción está deshabilitada y WebRTC está activado de forma predeterminada.",
|
||||
"description": "Descripción de la acción de WebRTC"
|
||||
},
|
||||
"disableHistory": {
|
||||
"message": "¿Deshabilitar el historial en las pestañas I2P?",
|
||||
"description": "Etiqueta de casilla de verificación del historial."
|
||||
},
|
||||
"histDesc": {
|
||||
"message": "El historial se borra automáticamente cuando se cierran las pestañas de I2P. Si desea borrar el historial sobre la marcha, marque esta casilla.",
|
||||
"description": "Descripción de la acción del historial"
|
||||
},
|
||||
"applicationHeader": {
|
||||
"message": "Aplicaciones",
|
||||
"description": "Encabezado de la sección de aplicaciones."
|
||||
},
|
||||
"applicationExplain": {
|
||||
"message": "Estas aplicaciones funcionan con I2P directamente para brindarles seguridad y privacidad.",
|
||||
"description": "Descripción de la sección de aplicación."
|
||||
},
|
||||
"windowVisitConsole": {
|
||||
"message": "Consola del enrutador:",
|
||||
"description": "Etiqueta de la consola del enrutador."
|
||||
},
|
||||
"routerConsole": {
|
||||
"message": "El punto de entrada para todas las demás aplicaciones I2P es la consola del enrutador I2P. Para visitarla, haga clic aquí.",
|
||||
"description": "Descripción de la consola del enrutador."
|
||||
},
|
||||
"windowVisitHomepage": {
|
||||
"message": "Página de inicio:",
|
||||
"description": "Página de inicio para la etiqueta de extensión."
|
||||
},
|
||||
"abouthome": {
|
||||
"message": "Para obtener más información sobre esta extensión, visite esta página.",
|
||||
"description": "Descripción de la página del botón de extensión."
|
||||
},
|
||||
"windowVisitHelppage": {
|
||||
"message": "Página de ayuda:",
|
||||
"description": "Página de ayuda para la etiqueta de extensión."
|
||||
},
|
||||
"help": {
|
||||
"message": "Para obtener más información sobre esta extensión, visite esta página.",
|
||||
"description": "Descripción de la página del botón de extensión."
|
||||
},
|
||||
"windowVisitI2ptunnel": {
|
||||
"message": "Administrador de servicios ocultos:",
|
||||
"description": "Título para i2ptunnel"
|
||||
},
|
||||
"i2ptunnel": {
|
||||
"message": "I2P tiene una interfaz basada en web para configurar servicios .i2p como sitios web que puede configurar.",
|
||||
"description": "Descripción de i2ptunnel"
|
||||
},
|
||||
"windowVisitSusimail": {
|
||||
"message": "Correo electrónico:",
|
||||
"descripción": "Título del correo electrónico"
|
||||
},
|
||||
"susimail": {
|
||||
"message": "I2P también incluye un cliente de correo web que se puede utilizar para acceder al correo electrónico in-I2P.",
|
||||
"description": "Descripción para correo electrónico"
|
||||
},
|
||||
"windowVisitSnark": {
|
||||
"message": "Bittorrent:",
|
||||
"description": "Título para Bittorrent"
|
||||
},
|
||||
"snark": {
|
||||
"message": "I2P es capaz de compartir archivos de igual a igual de forma anónima utilizando la aplicación bittorrent incorporada.",
|
||||
"description": "Descripción de Bittorrent"
|
||||
},
|
||||
"windowVisitSources": {
|
||||
"message": "Código fuente de extensión:",
|
||||
"description": "Título del enlace del código fuente"
|
||||
},
|
||||
"sources": {
|
||||
"message": "Examine el código fuente aquí",
|
||||
"description": "Descripción del enlace del código fuente"
|
||||
},
|
||||
"windowVisitWebPage": {
|
||||
"message": "Página de inicio de la extensión:",
|
||||
"description": "Visita la página de inicio de la extensión en Github"
|
||||
},
|
||||
"homepage": {
|
||||
"message": "Hay más información disponible aquí",
|
||||
"description": "Encontrar más información"
|
||||
},
|
||||
"windowVisitReleases": {
|
||||
"message": "Extension Releases:",
|
||||
"description": "Visite la página de lanzamiento"
|
||||
},
|
||||
"releases": {
|
||||
"message": "Compruebe si hay nuevas versiones aquí",
|
||||
"description": "Descripción de la nueva página de lanzamiento"
|
||||
},
|
||||
"titlePreface": {
|
||||
"message": "Navegador I2P",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"titlePrefacePrivate": {
|
||||
"message": "Navegador I2P (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"extensionPreface": {
|
||||
"message": "Gestión I2P",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"webPreface": {
|
||||
"message": "Navegador web",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"webPrefacePrivate": {
|
||||
"message": "Navegador web (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"ircPreface": {
|
||||
"message": "Envío de IRC",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"ircPrefacePrivate": {
|
||||
"message": "Despacho de IRC (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"botePreface": {
|
||||
"message": "I2P-Bote Mail",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"botePrefacePrivate": {
|
||||
"message": "I2P-Bote Mail (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"routerPreface": {
|
||||
"message": "Consola del enrutador",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"routerPrefacePrivate": {
|
||||
"message": "Consola del enrutador (privada)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"torrentPreface": {
|
||||
"message": "Bittorrent",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"torrentPrefacePrivate": {
|
||||
"message": "Bittorrent (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"mailPreface": {
|
||||
"message": "Correo web",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"mailPrefacePrivate": {
|
||||
"message": "Correo web (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"i2ptunnelPreface": {
|
||||
"message": "Administrador de servicios ocultos",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"i2ptunnelPrefacePrivate": {
|
||||
"message": "Administrador de servicios ocultos (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"muwirePreface": {
|
||||
"message": "MuWire",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"muwirePrefacePrivate": {
|
||||
"message": "MuWire (privado)",
|
||||
"description": "Prefacio de la barra de título del navegador"
|
||||
},
|
||||
"resetMessage": {
|
||||
"message": "Reset Tunnel",
|
||||
"description": "Mensaje para el botón Reset Tunnel"
|
||||
},
|
||||
"infoTitle": {
|
||||
"message": "Ayuda I2P",
|
||||
"description": "Título del menú de ayuda"
|
||||
},
|
||||
"infoMessage": {
|
||||
"message": "¡Ahora puede navegar libremente por eepWeb! Su navegador ahora está configurado para navegar de forma anónima en la red I2P. Mientras navega, su tráfico se enrutará a través de otros nodos de red para disfrazar su origen, tanto desde el servidor de los propios nodos. ",
|
||||
"description": "Mensaje de ayuda"
|
||||
},
|
||||
"helpMessage": {
|
||||
"message": "Obtén ayuda adicional",
|
||||
"description": "Mensaje de ayuda"
|
||||
},
|
||||
"newsMessage": {
|
||||
"message": "Visite el blog de I2P para conocer las últimas novedades sobre i2p.",
|
||||
"description": "Mensaje de ayuda"
|
||||
},
|
||||
"forumMessage": {
|
||||
"message": "Visite el Foro I2P para obtener más información o solicitar ayuda",
|
||||
"description": "Mensaje de ayuda"
|
||||
},
|
||||
"proxyHelpText": {
|
||||
"message": "Configure aquí su proxy I2P",
|
||||
"description": "Ayuda para configurar las opciones del botón Reset Tunnel"
|
||||
},
|
||||
"hostText": {
|
||||
"message": "Anfitrión:",
|
||||
"description": "Host para el proxy HTTP o SOCKS5"
|
||||
},
|
||||
"portText": {
|
||||
"message": "Puerto:",
|
||||
"description": "Puerto para el proxy HTTP o SOCKS5"
|
||||
},
|
||||
"controlHelpText": {
|
||||
"message": "Configure aquí la consola de su enrutador.",
|
||||
"description": "Ayuda para configurar las opciones del botón Reset Tunnel"
|
||||
},
|
||||
"controlHostText": {
|
||||
"message": "Host de control:",
|
||||
"description": "Host para la consola del enrutador"
|
||||
},
|
||||
"controlPortText": {
|
||||
"message": "Puerto de control:",
|
||||
"description": "Puerto para la consola del enrutador"
|
||||
},
|
||||
"controlHostValue": {
|
||||
"message": "127.0.0.1",
|
||||
"description": "Host para la consola del enrutador"
|
||||
},
|
||||
"controlPortValue": {
|
||||
"message": "7657",
|
||||
"description": "Puerto para la consola del enrutador"
|
||||
},
|
||||
"isBase32": {
|
||||
"message": "Dirección con formato I2P Base32",
|
||||
"description": "Mensaje para el panel de información del sitio base32"
|
||||
},
|
||||
"isHostName": {
|
||||
"message": "Nombre de host de salto I2P",
|
||||
"description": "Mensaje para el nombre de host del panel de información del sitio"
|
||||
},
|
||||
"siteLabel": {
|
||||
"message": "Dirección / Información del sitio:",
|
||||
"description": "Etiqueta para la información del sitio i2p"
|
||||
},
|
||||
"certLabel": {
|
||||
"message": "Información del certificado:",
|
||||
"description": "Etiqueta para la información del certificado"
|
||||
},
|
||||
"certAbsent": {
|
||||
"message": "Este sitio no está usando HTTPS. I2P aún lo verifica criptográficamente.",
|
||||
"description": "Contenido de la información del certificado si no está"
|
||||
},
|
||||
"certPresent": {
|
||||
"message": "Este sitio utiliza HTTPS. HTTPS sobre I2P es experimental y requiere certificados autofirmados o autorizaciones raíz alternativas.",
|
||||
"description": "Contenido de la información del certificado si está presente"
|
||||
},
|
||||
"protocolHandlerValue": {
|
||||
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent",
|
||||
"description": "Valor para el controlador de protocolo magnético"
|
||||
}
|
||||
}
|
BIN
alternate-address.png
Normal file
After Width: | Height: | Size: 314 KiB |
555
background.js
@@ -1,182 +1,485 @@
|
||||
function onGot(contexts) {
|
||||
var titlepref = chrome.i18n.getMessage('titlePreface');
|
||||
var titleprefpriv = chrome.i18n.getMessage('titlePrefacePrivate');
|
||||
var webpref = chrome.i18n.getMessage('webPreface');
|
||||
var webprefpriv = chrome.i18n.getMessage('webPrefacePrivate');
|
||||
var routerpref = chrome.i18n.getMessage('routerPreface');
|
||||
var routerprefpriv = chrome.i18n.getMessage('routerPrefacePrivate');
|
||||
var mailpref = chrome.i18n.getMessage('mailPreface');
|
||||
var mailprefpriv = chrome.i18n.getMessage('mailPrefacePrivate');
|
||||
var torrentpref = chrome.i18n.getMessage('torrentPreface');
|
||||
var torrentprefpriv = chrome.i18n.getMessage('torrentPrefacePrivate');
|
||||
var tunnelpref = chrome.i18n.getMessage('i2ptunnelPreface');
|
||||
var tunnelprefpriv = chrome.i18n.getMessage('i2ptunnelPrefacePrivate');
|
||||
var ircpref = chrome.i18n.getMessage('ircPreface');
|
||||
var ircprefpriv = chrome.i18n.getMessage('ircPrefacePrivate');
|
||||
var extensionpref = chrome.i18n.getMessage('extensionPreface');
|
||||
var muwirepref = chrome.i18n.getMessage('muwirePreface');
|
||||
var muwireprefpriv = chrome.i18n.getMessage('muwirePrefacePrivate');
|
||||
var botepref = chrome.i18n.getMessage('botePreface');
|
||||
|
||||
function onError(err) {
|
||||
console.log('(background)', err);
|
||||
}
|
||||
|
||||
function onContextGotLog(contexts) {
|
||||
if (contexts != null) {
|
||||
console.log(contexts);
|
||||
}
|
||||
}
|
||||
|
||||
function onContextsGot(contexts) {
|
||||
var ids = [];
|
||||
for (let context of contexts) {
|
||||
console.log(`Name: ${context.name}`);
|
||||
console.log(`Name : ${context.name}`);
|
||||
ids.push(context.name);
|
||||
}
|
||||
console.log("Checking new contexts");
|
||||
if (ids.indexOf("i2pbrowser") == -1) {
|
||||
function onCreated(context) {
|
||||
console.log(`New identity's ID: ${context.cookieStoreId}.`);
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
}
|
||||
console.log('Checking new contexts');
|
||||
if (ids.indexOf(titlepref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: "i2pbrowser",
|
||||
color: "purple",
|
||||
icon: "fingerprint"
|
||||
name: titlepref,
|
||||
color: 'orange',
|
||||
icon: 'fingerprint',
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf("routerconsole") == -1) {
|
||||
function onCreated(context) {
|
||||
console.log(`New identity's ID: ${context.cookieStoreId}.`);
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
}
|
||||
if (ids.indexOf(webpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: "routerconsole",
|
||||
color: "turquoise",
|
||||
icon: "briefcase"
|
||||
name: webpref,
|
||||
color: 'red',
|
||||
icon: 'circle',
|
||||
})
|
||||
.then(onCreated, onError);
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(routerpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: routerpref,
|
||||
color: 'blue',
|
||||
icon: 'briefcase',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(tunnelpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: tunnelpref,
|
||||
color: 'green',
|
||||
icon: 'tree',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(mailpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: mailpref,
|
||||
color: 'yellow',
|
||||
icon: 'briefcase',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(torrentpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: torrentpref,
|
||||
color: 'purple',
|
||||
icon: 'chill',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(ircpref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: ircpref,
|
||||
color: 'red',
|
||||
icon: 'vacation',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(muwirepref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: muwirepref,
|
||||
color: 'turquoise',
|
||||
icon: 'gift',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
if (ids.indexOf(botepref) == -1) {
|
||||
browser.contextualIdentities
|
||||
.create({
|
||||
name: botepref,
|
||||
color: 'blue',
|
||||
icon: 'fence',
|
||||
})
|
||||
.then(onCreated, onNotCreated);
|
||||
}
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
function onContextsError() {
|
||||
console.log('Error finding contextual identities, is the API enabled?');
|
||||
}
|
||||
|
||||
browser.contextualIdentities.query({}).then(onGot, onError);
|
||||
|
||||
if (!isDroid()) {
|
||||
chrome.windows.onCreated.addListener(themeWindow);
|
||||
chrome.tabs.onUpdated.addListener(themeWindowByTab);
|
||||
chrome.tabs.onActivated.addListener(themeWindowByTab);
|
||||
function onCreated(context) {
|
||||
console.log(' ID:', context.cookieStoreId, 'created.');
|
||||
}
|
||||
|
||||
var titlepref = chrome.i18n.getMessage("titlePreface");
|
||||
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
|
||||
function onNotCreated(context) {
|
||||
console.log('ID:', context.cookieStoreId, 'not created.');
|
||||
}
|
||||
|
||||
function themeWindowByTab(tab) {
|
||||
getwindow = browser.windows.get(tab.windowId);
|
||||
getwindow.then(themeWindow);
|
||||
browser.contextualIdentities.query({}).then(onContextsGot, onContextsError);
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != 'android') {
|
||||
browser.windows.onCreated.addListener(themeWindow);
|
||||
browser.windows.onFocusChanged.addListener(themeWindow);
|
||||
browser.windows.onRemoved.addListener(themeWindow);
|
||||
browser.tabs.onUpdated.addListener(themeWindowByTab);
|
||||
browser.tabs.onActivated.addListener(themeWindowByTab);
|
||||
}
|
||||
});
|
||||
|
||||
function themeWindowByTab(tabId) {
|
||||
function tabWindow(tab) {
|
||||
var gettingPlatformInfo = browser.runtime.getPlatformInfo();
|
||||
gettingPlatformInfo.then((got) => {
|
||||
if (got.os == 'android') {
|
||||
let getwindow = browser.tabs.get(tab.tabId);
|
||||
getwindow.then(themeWindow);
|
||||
} else {
|
||||
let getwindow = browser.windows.get(tab.windowId);
|
||||
getwindow.then(themeWindow);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (typeof tabId === 'number') {
|
||||
let tab = browser.tabs.get(tabId);
|
||||
tab.then(tabWindow);
|
||||
} else {
|
||||
tabWindow(tabId);
|
||||
}
|
||||
}
|
||||
|
||||
function isEmpty(obj) {
|
||||
if (obj === undefined || obj === null) {
|
||||
return true;
|
||||
}
|
||||
for (var key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function themeWindow(window) {
|
||||
// Check if the window is in private browsing
|
||||
function onThemeError() {
|
||||
console.log('theme color set error');
|
||||
}
|
||||
function dynamicTheme() {
|
||||
if (window.incognito) {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
} else {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#4456B7',
|
||||
toolbar: '#4456B7',
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
function browserTheme() {
|
||||
console.log('Active in I2P window');
|
||||
if (window.incognito) {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#363A68',
|
||||
toolbar: '#363A68',
|
||||
},
|
||||
});
|
||||
} else {
|
||||
browser.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: '#363A68',
|
||||
toolbar: '#363A68',
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
function logTabs(tabInfo) {
|
||||
console.log(tabInfo);
|
||||
|
||||
function onGot(context) {
|
||||
if (context.name == "i2pbrowser") {
|
||||
console.log("Active in I2P window");
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#2D4470",
|
||||
toolbar: "#2D4470"
|
||||
}
|
||||
function onContextGotTheme(context) {
|
||||
if (context.name == titlepref) {
|
||||
browserTheme();
|
||||
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 {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#9DABD5",
|
||||
toolbar: "#9DABD5"
|
||||
}
|
||||
});
|
||||
//browser.pageAction.hide(tabInfo[0].id);
|
||||
}
|
||||
} else if (context.name == "routerconsole") {
|
||||
console.log("Active in I2P window");
|
||||
if (window.incognito) {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#00CED1",
|
||||
toolbar: "#00CED1"
|
||||
}
|
||||
});
|
||||
} else {
|
||||
chrome.theme.update(window.id, {
|
||||
colors: {
|
||||
frame: "#40E0D0",
|
||||
toolbar: "#40E0D0"
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
console.log("Not active in I2P window");
|
||||
} else if (context.name == routerpref) {
|
||||
console.log('Active in Router Console window');
|
||||
dynamicTheme();
|
||||
} else if (context.name == tunnelpref) {
|
||||
console.log('Active in Hidden Services Manager window');
|
||||
dynamicTheme();
|
||||
} else if (context.name == mailpref) {
|
||||
console.log('Active in Web Mail window');
|
||||
dynamicTheme();
|
||||
} else if (context.name == torrentpref) {
|
||||
console.log('Active in Bittorrent window');
|
||||
dynamicTheme();
|
||||
} else if (context.name == botepref) {
|
||||
console.log('Active in Bote window');
|
||||
dynamicTheme();
|
||||
} else if (context.name == ircpref) {
|
||||
console.log('Active in IRC window');
|
||||
dynamicTheme();
|
||||
} else if (context.name == muwirepref) {
|
||||
console.log('Active in MuWire window');
|
||||
dynamicTheme();
|
||||
}
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
}
|
||||
if (tabInfo[0].cookieStoreId != "firefox-default") {
|
||||
if (
|
||||
tabInfo[0].cookieStoreId != 'firefox-default' &&
|
||||
tabInfo[0].cookieStoreId != 'firefox-private'
|
||||
) {
|
||||
browser.contextualIdentities
|
||||
.get(tabInfo[0].cookieStoreId)
|
||||
.then(onGot, onError);
|
||||
.then(onContextGotTheme, onThemeError);
|
||||
} else {
|
||||
chrome.theme.reset(window.id);
|
||||
console.log('Not active in I2P window');
|
||||
function unSetTheme(them) {
|
||||
console.log('unsetting theme', them);
|
||||
if (Object.keys(them).length > 0) {
|
||||
browser.theme.update(window.id, them.originalTheme);
|
||||
} else {
|
||||
browser.theme.update(window.id, { colors: null });
|
||||
}
|
||||
}
|
||||
browser.storage.local.get('originalTheme').then(unSetTheme, onError);
|
||||
}
|
||||
}
|
||||
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var querying = browser.tabs.query({
|
||||
currentWindow: true,
|
||||
active: true
|
||||
active: true,
|
||||
});
|
||||
querying.then(logTabs, onError);
|
||||
querying.then(logTabs, onThemeError);
|
||||
}
|
||||
|
||||
function setTitle(window) {
|
||||
// Check if the window is in private browsing
|
||||
function onContextError() {
|
||||
console.log('Context Error');
|
||||
}
|
||||
function setTitle(title, privtitle) {
|
||||
if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: privtitle + ': ',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: title + ': ',
|
||||
});
|
||||
}
|
||||
}
|
||||
function logTabs(tabInfo) {
|
||||
console.log(tabInfo);
|
||||
|
||||
function onGot(context) {
|
||||
if (context.name == "i2pbrowser") {
|
||||
console.log("Active in I2P window");
|
||||
|
||||
console.log("Active in I2P window");
|
||||
if (window.incognito) {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titleprefpriv
|
||||
});
|
||||
} else {
|
||||
chrome.windows.update(window.id, {
|
||||
titlePreface: titlepref
|
||||
});
|
||||
}
|
||||
function onContextGotTitle(context) {
|
||||
if (context.name == titlepref) {
|
||||
console.log('Active in I2P window');
|
||||
setTitle(titlepref, titleprefpriv);
|
||||
} else if (context.name == muwirepref) {
|
||||
console.log('Active in MuWire window');
|
||||
setTitle(muwirepref, muwireprefpriv);
|
||||
} else if (context.name == routerpref) {
|
||||
console.log('Active in Router Console window');
|
||||
setTitle(routerpref, routerprefpriv);
|
||||
} else if (context.name == botepref) {
|
||||
console.log('Active in Bote window');
|
||||
setTitle(botepref, boteprefpriv);
|
||||
} else if (context.name == tunnelpref) {
|
||||
console.log('Active in Hidden Services Manager window');
|
||||
setTitle(tunnelpref, tunnelprefpriv);
|
||||
} else if (context.name == mailpref) {
|
||||
console.log('Active in I2P Web Mail window');
|
||||
setTitle(mailpref, mailprefpriv);
|
||||
} else if (context.name == torrentpref) {
|
||||
console.log('Active in I2P Torrent window');
|
||||
setTitle(torrentpref, torrentprefpriv);
|
||||
} else if (context.name == ircpref) {
|
||||
console.log('Active in IRC window');
|
||||
setTitle(ircpref, ircprefpriv);
|
||||
}
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
}
|
||||
if (tabInfo[0].cookieStoreId != "firefox-default")
|
||||
if (
|
||||
tabInfo[0].cookieStoreId != 'firefox-default' &&
|
||||
tabInfo[0].cookieStoreId != 'firefox-private'
|
||||
) {
|
||||
browser.contextualIdentities
|
||||
.get(tabInfo[0].cookieStoreId)
|
||||
.then(onGot, onError);
|
||||
.then(onContextGotTitle, onContextError);
|
||||
} else if (window.incognito) {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: '',
|
||||
});
|
||||
} else {
|
||||
browser.windows.update(window.id, {
|
||||
titlePreface: '',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var querying = browser.tabs.query({
|
||||
currentWindow: true,
|
||||
active: true
|
||||
active: true,
|
||||
});
|
||||
querying.then(logTabs, onError);
|
||||
querying.then(logTabs, onContextError);
|
||||
}
|
||||
|
||||
chrome.windows.onCreated.addListener(() => {
|
||||
//var gettingStoredSettings = chrome.storage.local.get();
|
||||
//gettingStoredSettings.then(setupProxy, onError);
|
||||
chrome.storage.local.get(function(got) {
|
||||
setupProxy();
|
||||
});
|
||||
var gettingListenerInfo = browser.runtime.getPlatformInfo();
|
||||
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,
|
||||
});
|
||||
getting.then(setTitle, onPlatformError);
|
||||
});
|
||||
browser.tabs.onActivated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true,
|
||||
});
|
||||
getting.then(setTitle, onPlatformError);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
chrome.tabs.onCreated.addListener(() => {
|
||||
var getting = browser.windows.getCurrent({
|
||||
populate: true
|
||||
});
|
||||
getting.then(setTitle, onError);
|
||||
});
|
||||
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 != null) {
|
||||
if (
|
||||
updateInfo.theme.colors.frame != "#4456B7" &&
|
||||
updateInfo.theme.colors.frame != "#363A68"
|
||||
) {
|
||||
function onSet() {
|
||||
console.log("stored theme:", updateInfo.theme);
|
||||
}
|
||||
if (
|
||||
updateInfo.theme.colors != null &&
|
||||
updateInfo.theme.images != null &&
|
||||
updateInfo.theme.properties != null
|
||||
) {
|
||||
console.log("storing theme:", updateInfo.theme);
|
||||
browser.storage.local
|
||||
.set({ originalTheme: updateInfo.theme })
|
||||
.then(onSet, onError);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("keeping stored theme:", them);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("theme storage error", e);
|
||||
}
|
||||
}
|
||||
browser.storage.local.get("originalTheme").then(maybeSet, onError);
|
||||
}
|
||||
|
||||
browser.theme.onUpdated.addListener(handleUpdated);
|
||||
|
||||
function handleClick() {
|
||||
console.log("Opening page action");
|
||||
browser.pageAction.openPopup();
|
||||
}
|
||||
browser.pageAction.onClicked.addListener(handleClick);
|
||||
|
||||
async function certCheck(details) {
|
||||
if (details.url.startsWith("https")) {
|
||||
console.log("(cert) https site", details.url);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!details.url.includes(".i2p")) {
|
||||
return;
|
||||
}
|
||||
|
||||
var tabs = await browser.tabs.query({ active: true });
|
||||
|
||||
if (tabs == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("(cert) checking cert", tabs);
|
||||
|
||||
for (tab in tabs) {
|
||||
if (details.url == tabs[tab].url) {
|
||||
console.log("(cert) right tab", tabs[tab].id);
|
||||
try {
|
||||
let securityInfo = await browser.webRequest.getSecurityInfo(
|
||||
details.requestId,
|
||||
{ certificateChain: true }
|
||||
);
|
||||
console.log("(cert) state is complete", securityInfo);
|
||||
console.log("(cert) certificates", securityInfo.certificates);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Listen for onHeaderReceived for the target page.
|
||||
// Set "blocking" and "responseHeaders".
|
||||
browser.webRequest.onHeadersReceived.addListener(
|
||||
certCheck,
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking", "responseHeaders"]
|
||||
);
|
||||
|
||||
function onClosedWindowCheck() {
|
||||
var getContext = browser.contextualIdentities.query({ name: titlepref });
|
||||
function checkTabs(ctx) {
|
||||
function conditionallyDelete(tabs) {
|
||||
if (tabs.length == 0) {
|
||||
browser.contextualIdentities.remove(ctx[0].cookieStoreId);
|
||||
browser.contextualIdentities
|
||||
.query({})
|
||||
.then(onContextsGot, onContextsError);
|
||||
}
|
||||
}
|
||||
var tabs = browser.tabs.query({ cookieStoreId: ctx[0].cookieStoreId });
|
||||
tabs.then(conditionallyDelete, onError);
|
||||
}
|
||||
getContext.then(checkTabs, onError);
|
||||
}
|
||||
|
||||
browser.tabs.onRemoved.addListener(onClosedWindowCheck);
|
||||
browser.windows.onRemoved.addListener(onClosedWindowCheck);
|
||||
browser.windows.onCreated.addListener(onClosedWindowCheck);
|
||||
|
245
bookmarks.js
Normal file
@@ -0,0 +1,245 @@
|
||||
function bookmarksSetup() {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
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) {
|
||||
function gotProxyInfo(info) {
|
||||
let port = info.value.http.split(':')[1];
|
||||
if (port == '7644') {
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url: 'about:I2p',
|
||||
title: 'I2P Extension Home Page',
|
||||
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,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
}
|
||||
console.log('(bookmarks) adding home page bookmark');
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
let gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
function bookTorrent(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let port = info.value.http.split(':')[1];
|
||||
if (port == '7644') {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/i2psnark',
|
||||
title: 'Bittorrent',
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
let createRhizomeBookmark = browser.bookmarks.create({
|
||||
url:
|
||||
'http://' + control_host + ':' + control_port + '/i2psnark',
|
||||
title: 'Bittorrent',
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
let gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
function bookConsole(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let port = info.value.http.split(':')[1];
|
||||
if (port == '7644') {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/home',
|
||||
title: 'I2P Console',
|
||||
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,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
let gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
function bookMail(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let port = info.value.http.split(':')[1];
|
||||
if (port == '7644') {
|
||||
let createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/webmail',
|
||||
title: 'Web Mail',
|
||||
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,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
console.log('(bookmarks) adding webmail bookmark');
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
let gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
function bookI2PTunnel(bookmarkItems) {
|
||||
if (!bookmarkItems.length) {
|
||||
function gotProxyInfo(info) {
|
||||
let port = info.value.http.split(':')[1];
|
||||
if (port == '7644') {
|
||||
var createBookmark = browser.bookmarks.create({
|
||||
url: 'http://localhost:7657/i2ptunnel',
|
||||
title: 'Hidden Services Manager',
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createBookmark.then(onCreated);
|
||||
} else {
|
||||
var createRhizomeBookmark = browser.bookmarks.create({
|
||||
url:
|
||||
'http://' +
|
||||
control_host +
|
||||
':' +
|
||||
control_port +
|
||||
'/i2ptunnel',
|
||||
title: 'Hidden Services Manager',
|
||||
parentId: bookmarkToolbar[0].id,
|
||||
});
|
||||
createRhizomeBookmark.then(onCreated);
|
||||
}
|
||||
console.log('(bookmarks) adding i2ptunnel bookmark');
|
||||
}
|
||||
console.log(
|
||||
"(bookmarks) checking if we're running in an I2P Browser"
|
||||
);
|
||||
var gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
}
|
||||
|
||||
function onRejected(error) {
|
||||
console.log(`An error : ${error}`);
|
||||
}
|
||||
function onCreated(node) {
|
||||
console.log('Bookmarked', node);
|
||||
}
|
||||
|
||||
var b0 = browser.bookmarks.search({
|
||||
title: 'I2P Extension Home Page',
|
||||
});
|
||||
b0.then(bookHome, onRejected);
|
||||
|
||||
var b1 = browser.bookmarks.search({
|
||||
title: 'Bittorrent',
|
||||
});
|
||||
b1.then(bookTorrent, onRejected);
|
||||
|
||||
var b2 = browser.bookmarks.search({
|
||||
title: 'Hidden Services Manager',
|
||||
});
|
||||
b2.then(bookI2PTunnel, onRejected);
|
||||
|
||||
var b3 = browser.bookmarks.search({
|
||||
title: 'Web Mail',
|
||||
});
|
||||
b3.then(bookMail, onRejected);
|
||||
|
||||
var b4 = browser.bookmarks.search({
|
||||
title: 'I2P Console',
|
||||
});
|
||||
b4.then(bookConsole, onRejected);
|
||||
defaultSettings['bookmarks_state'] = true;
|
||||
}
|
||||
|
||||
var bt = browser.bookmarks.search({
|
||||
query: 'Toolbar',
|
||||
});
|
||||
|
||||
function toolDir(bookmarkToolbar) {
|
||||
let defaultSettings = {};
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
console.log('(bookmarks) created');
|
||||
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,
|
||||
});
|
||||
createBookmark.then(onToolbarCreated);
|
||||
}
|
||||
}
|
||||
ibbt.then(setupDir);
|
||||
}
|
||||
bt.then(toolDir);
|
||||
|
||||
function handleCreated(id, bookmarkInfo) {
|
||||
//var propValue;
|
||||
for (var propName in bookmarkInfo) {
|
||||
let propValue = bookmarkInfo[propName];
|
||||
console.log(propName, propValue);
|
||||
}
|
||||
}
|
||||
|
||||
browser.bookmarks.onCreated.addListener(handleCreated);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function conditionalBookmarksSetup(obj) {
|
||||
console.log('(bookmarks) state', obj.bookmarks_state);
|
||||
if (obj.bookmarks_state == false) {
|
||||
bookmarksSetup();
|
||||
}
|
||||
if (obj.bookmarks_state == undefined) {
|
||||
bookmarksSetup();
|
||||
}
|
||||
}
|
||||
|
||||
if (browser != null) {
|
||||
let gettingStorage = browser.storage.local.get('bookmarks_state');
|
||||
gettingStorage.then(conditionalBookmarksSetup, bookmarksSetup);
|
||||
}
|
||||
|
||||
const bookmarksButton = document.getElementById('bookmarksButton');
|
||||
if (bookmarksButton != null) {
|
||||
bookmarksButton.addEventListener('click', bookmarksSetup);
|
||||
}
|
52
cert.js
Normal file
@@ -0,0 +1,52 @@
|
||||
function blankContent(id) {
|
||||
let infoTitle = document.getElementById(id);
|
||||
if (infoTitle === null) {
|
||||
console.log('content error', id);
|
||||
return;
|
||||
}
|
||||
infoTitle.textContent = '';
|
||||
}
|
||||
|
||||
function contentUpdateById(id, message) {
|
||||
let infoTitle = document.getElementById(id);
|
||||
let messageContent = chrome.i18n.getMessage(message);
|
||||
if (infoTitle === null) {
|
||||
console.log('content error', id, messageContent);
|
||||
return;
|
||||
}
|
||||
infoTitle.textContent = messageContent;
|
||||
}
|
||||
|
||||
contentUpdateById('TypeLabel', 'siteLabel');
|
||||
|
||||
contentUpdateById('CertLabel', 'certLabel');
|
||||
|
||||
function tabCheck(tabInfo) {
|
||||
// Information Section
|
||||
console.log('(cert) checking tab');
|
||||
var host = tabInfo[0].url.split('.i2p')[0] + '.i2p';
|
||||
if (host.length < 51) {
|
||||
contentUpdateById('AddressInfo', 'isHostName');
|
||||
} else {
|
||||
if (host.endsWith('b32.i2p')) {
|
||||
contentUpdateById('AddressInfo', 'isBase32');
|
||||
}
|
||||
}
|
||||
if (host.startsWith('https')) {
|
||||
contentUpdateById('AddressCertInfo', 'certPresent');
|
||||
console.log('(cert) initiating request to check server cert');
|
||||
fetch(host).then((response) => {
|
||||
console.log('Updating cert information', response);
|
||||
});
|
||||
} else {
|
||||
contentUpdateById("AddressCertInfo", "certAbsent");
|
||||
blankContent("SignedLabel");
|
||||
}
|
||||
}
|
||||
|
||||
function tabError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
|
||||
const gettingCurrent = browser.tabs.query({ active: true });
|
||||
gettingCurrent.then(tabCheck, tabError);
|
373
chromium/LICENSE
@@ -1,373 +0,0 @@
|
||||
Mozilla Public License Version 2.0
|
||||
==================================
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
1.1. "Contributor"
|
||||
means each individual or legal entity that creates, contributes to
|
||||
the creation of, or owns Covered Software.
|
||||
|
||||
1.2. "Contributor Version"
|
||||
means the combination of the Contributions of others (if any) used
|
||||
by a Contributor and that particular Contributor's Contribution.
|
||||
|
||||
1.3. "Contribution"
|
||||
means Covered Software of a particular Contributor.
|
||||
|
||||
1.4. "Covered Software"
|
||||
means Source Code Form to which the initial Contributor has attached
|
||||
the notice in Exhibit A, the Executable Form of such Source Code
|
||||
Form, and Modifications of such Source Code Form, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.5. "Incompatible With Secondary Licenses"
|
||||
means
|
||||
|
||||
(a) that the initial Contributor has attached the notice described
|
||||
in Exhibit B to the Covered Software; or
|
||||
|
||||
(b) that the Covered Software was made available under the terms of
|
||||
version 1.1 or earlier of the License, but not also under the
|
||||
terms of a Secondary License.
|
||||
|
||||
1.6. "Executable Form"
|
||||
means any form of the work other than Source Code Form.
|
||||
|
||||
1.7. "Larger Work"
|
||||
means a work that combines Covered Software with other material, in
|
||||
a separate file or files, that is not Covered Software.
|
||||
|
||||
1.8. "License"
|
||||
means this document.
|
||||
|
||||
1.9. "Licensable"
|
||||
means having the right to grant, to the maximum extent possible,
|
||||
whether at the time of the initial grant or subsequently, any and
|
||||
all of the rights conveyed by this License.
|
||||
|
||||
1.10. "Modifications"
|
||||
means any of the following:
|
||||
|
||||
(a) any file in Source Code Form that results from an addition to,
|
||||
deletion from, or modification of the contents of Covered
|
||||
Software; or
|
||||
|
||||
(b) any new file in Source Code Form that contains any Covered
|
||||
Software.
|
||||
|
||||
1.11. "Patent Claims" of a Contributor
|
||||
means any patent claim(s), including without limitation, method,
|
||||
process, and apparatus claims, in any patent Licensable by such
|
||||
Contributor that would be infringed, but for the grant of the
|
||||
License, by the making, using, selling, offering for sale, having
|
||||
made, import, or transfer of either its Contributions or its
|
||||
Contributor Version.
|
||||
|
||||
1.12. "Secondary License"
|
||||
means either the GNU General Public License, Version 2.0, the GNU
|
||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||
Public License, Version 3.0, or any later versions of those
|
||||
licenses.
|
||||
|
||||
1.13. "Source Code Form"
|
||||
means the form of the work preferred for making modifications.
|
||||
|
||||
1.14. "You" (or "Your")
|
||||
means an individual or a legal entity exercising rights under this
|
||||
License. For legal entities, "You" includes any entity that
|
||||
controls, is controlled by, or is under common control with You. For
|
||||
purposes of this definition, "control" means (a) the power, direct
|
||||
or indirect, to cause the direction or management of such entity,
|
||||
whether by contract or otherwise, or (b) ownership of more than
|
||||
fifty percent (50%) of the outstanding shares or beneficial
|
||||
ownership of such entity.
|
||||
|
||||
2. License Grants and Conditions
|
||||
--------------------------------
|
||||
|
||||
2.1. Grants
|
||||
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license:
|
||||
|
||||
(a) under intellectual property rights (other than patent or trademark)
|
||||
Licensable by such Contributor to use, reproduce, make available,
|
||||
modify, display, perform, distribute, and otherwise exploit its
|
||||
Contributions, either on an unmodified basis, with Modifications, or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||
for sale, have made, import, and otherwise transfer either its
|
||||
Contributions or its Contributor Version.
|
||||
|
||||
2.2. Effective Date
|
||||
|
||||
The licenses granted in Section 2.1 with respect to any Contribution
|
||||
become effective for each Contribution on the date the Contributor first
|
||||
distributes such Contribution.
|
||||
|
||||
2.3. Limitations on Grant Scope
|
||||
|
||||
The licenses granted in this Section 2 are the only rights granted under
|
||||
this License. No additional rights or licenses will be implied from the
|
||||
distribution or licensing of Covered Software under this License.
|
||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||
Contributor:
|
||||
|
||||
(a) for any code that a Contributor has removed from Covered Software;
|
||||
or
|
||||
|
||||
(b) for infringements caused by: (i) Your and any other third party's
|
||||
modifications of Covered Software, or (ii) the combination of its
|
||||
Contributions with other software (except as part of its Contributor
|
||||
Version); or
|
||||
|
||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||
its Contributions.
|
||||
|
||||
This License does not grant any rights in the trademarks, service marks,
|
||||
or logos of any Contributor (except as may be necessary to comply with
|
||||
the notice requirements in Section 3.4).
|
||||
|
||||
2.4. Subsequent Licenses
|
||||
|
||||
No Contributor makes additional grants as a result of Your choice to
|
||||
distribute the Covered Software under a subsequent version of this
|
||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||
permitted under the terms of Section 3.3).
|
||||
|
||||
2.5. Representation
|
||||
|
||||
Each Contributor represents that the Contributor believes its
|
||||
Contributions are its original creation(s) or it has sufficient rights
|
||||
to grant the rights to its Contributions conveyed by this License.
|
||||
|
||||
2.6. Fair Use
|
||||
|
||||
This License is not intended to limit any rights You have under
|
||||
applicable copyright doctrines of fair use, fair dealing, or other
|
||||
equivalents.
|
||||
|
||||
2.7. Conditions
|
||||
|
||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||
in Section 2.1.
|
||||
|
||||
3. Responsibilities
|
||||
-------------------
|
||||
|
||||
3.1. Distribution of Source Form
|
||||
|
||||
All distribution of Covered Software in Source Code Form, including any
|
||||
Modifications that You create or to which You contribute, must be under
|
||||
the terms of this License. You must inform recipients that the Source
|
||||
Code Form of the Covered Software is governed by the terms of this
|
||||
License, and how they can obtain a copy of this License. You may not
|
||||
attempt to alter or restrict the recipients' rights in the Source Code
|
||||
Form.
|
||||
|
||||
3.2. Distribution of Executable Form
|
||||
|
||||
If You distribute Covered Software in Executable Form then:
|
||||
|
||||
(a) such Covered Software must also be made available in Source Code
|
||||
Form, as described in Section 3.1, and You must inform recipients of
|
||||
the Executable Form how they can obtain a copy of such Source Code
|
||||
Form by reasonable means in a timely manner, at a charge no more
|
||||
than the cost of distribution to the recipient; and
|
||||
|
||||
(b) You may distribute such Executable Form under the terms of this
|
||||
License, or sublicense it under different terms, provided that the
|
||||
license for the Executable Form does not attempt to limit or alter
|
||||
the recipients' rights in the Source Code Form under this License.
|
||||
|
||||
3.3. Distribution of a Larger Work
|
||||
|
||||
You may create and distribute a Larger Work under terms of Your choice,
|
||||
provided that You also comply with the requirements of this License for
|
||||
the Covered Software. If the Larger Work is a combination of Covered
|
||||
Software with a work governed by one or more Secondary Licenses, and the
|
||||
Covered Software is not Incompatible With Secondary Licenses, this
|
||||
License permits You to additionally distribute such Covered Software
|
||||
under the terms of such Secondary License(s), so that the recipient of
|
||||
the Larger Work may, at their option, further distribute the Covered
|
||||
Software under the terms of either this License or such Secondary
|
||||
License(s).
|
||||
|
||||
3.4. Notices
|
||||
|
||||
You may not remove or alter the substance of any license notices
|
||||
(including copyright notices, patent notices, disclaimers of warranty,
|
||||
or limitations of liability) contained within the Source Code Form of
|
||||
the Covered Software, except that You may alter any license notices to
|
||||
the extent required to remedy known factual inaccuracies.
|
||||
|
||||
3.5. Application of Additional Terms
|
||||
|
||||
You may choose to offer, and to charge a fee for, warranty, support,
|
||||
indemnity or liability obligations to one or more recipients of Covered
|
||||
Software. However, You may do so only on Your own behalf, and not on
|
||||
behalf of any Contributor. You must make it absolutely clear that any
|
||||
such warranty, support, indemnity, or liability obligation is offered by
|
||||
You alone, and You hereby agree to indemnify every Contributor for any
|
||||
liability incurred by such Contributor as a result of warranty, support,
|
||||
indemnity or liability terms You offer. You may include additional
|
||||
disclaimers of warranty and limitations of liability specific to any
|
||||
jurisdiction.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation
|
||||
---------------------------------------------------
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Software due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description must
|
||||
be placed in a text file included with all distributions of the Covered
|
||||
Software under this License. Except to the extent prohibited by statute
|
||||
or regulation, such description must be sufficiently detailed for a
|
||||
recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Termination
|
||||
--------------
|
||||
|
||||
5.1. The rights granted under this License will terminate automatically
|
||||
if You fail to comply with any of its terms. However, if You become
|
||||
compliant, then the rights granted under this License from a particular
|
||||
Contributor are reinstated (a) provisionally, unless and until such
|
||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||
ongoing basis, if such Contributor fails to notify You of the
|
||||
non-compliance by some reasonable means prior to 60 days after You have
|
||||
come back into compliance. Moreover, Your grants from a particular
|
||||
Contributor are reinstated on an ongoing basis if such Contributor
|
||||
notifies You of the non-compliance by some reasonable means, this is the
|
||||
first time You have received notice of non-compliance with this License
|
||||
from such Contributor, and You become compliant prior to 30 days after
|
||||
Your receipt of the notice.
|
||||
|
||||
5.2. If You initiate litigation against any entity by asserting a patent
|
||||
infringement claim (excluding declaratory judgment actions,
|
||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||
directly or indirectly infringes any patent, then the rights granted to
|
||||
You by any and all Contributors for the Covered Software under Section
|
||||
2.1 of this License shall terminate.
|
||||
|
||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||
end user license agreements (excluding distributors and resellers) which
|
||||
have been validly granted by You or Your distributors under this License
|
||||
prior to termination shall survive termination.
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 6. Disclaimer of Warranty *
|
||||
* ------------------------- *
|
||||
* *
|
||||
* Covered Software is provided under this License on an "as is" *
|
||||
* basis, without warranty of any kind, either expressed, implied, or *
|
||||
* statutory, including, without limitation, warranties that the *
|
||||
* Covered Software is free of defects, merchantable, fit for a *
|
||||
* particular purpose or non-infringing. The entire risk as to the *
|
||||
* quality and performance of the Covered Software is with You. *
|
||||
* Should any Covered Software prove defective in any respect, You *
|
||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||
* essential part of this License. No use of any Covered Software is *
|
||||
* authorized under this License except under this disclaimer. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 7. Limitation of Liability *
|
||||
* -------------------------- *
|
||||
* *
|
||||
* Under no circumstances and under no legal theory, whether tort *
|
||||
* (including negligence), contract, or otherwise, shall any *
|
||||
* Contributor, or anyone who distributes Covered Software as *
|
||||
* permitted above, be liable to You for any direct, indirect, *
|
||||
* special, incidental, or consequential damages of any character *
|
||||
* including, without limitation, damages for lost profits, loss of *
|
||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||
* and all other commercial damages or losses, even if such party *
|
||||
* shall have been informed of the possibility of such damages. This *
|
||||
* limitation of liability shall not apply to liability for death or *
|
||||
* personal injury resulting from such party's negligence to the *
|
||||
* extent applicable law prohibits such limitation. Some *
|
||||
* jurisdictions do not allow the exclusion or limitation of *
|
||||
* incidental or consequential damages, so this exclusion and *
|
||||
* limitation may not apply to You. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
8. Litigation
|
||||
-------------
|
||||
|
||||
Any litigation relating to this License may be brought only in the
|
||||
courts of a jurisdiction where the defendant maintains its principal
|
||||
place of business and such litigation shall be governed by laws of that
|
||||
jurisdiction, without reference to its conflict-of-law provisions.
|
||||
Nothing in this Section shall prevent a party's ability to bring
|
||||
cross-claims or counter-claims.
|
||||
|
||||
9. Miscellaneous
|
||||
----------------
|
||||
|
||||
This License represents the complete agreement concerning the subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. Any law or regulation which provides
|
||||
that the language of a contract shall be construed against the drafter
|
||||
shall not be used to construe this License against a Contributor.
|
||||
|
||||
10. Versions of the License
|
||||
---------------------------
|
||||
|
||||
10.1. New Versions
|
||||
|
||||
Mozilla Foundation is the license steward. Except as provided in Section
|
||||
10.3, no one other than the license steward has the right to modify or
|
||||
publish new versions of this License. Each version will be given a
|
||||
distinguishing version number.
|
||||
|
||||
10.2. Effect of New Versions
|
||||
|
||||
You may distribute the Covered Software under the terms of the version
|
||||
of the License under which You originally received the Covered Software,
|
||||
or under the terms of any subsequent version published by the license
|
||||
steward.
|
||||
|
||||
10.3. Modified Versions
|
||||
|
||||
If you create software not governed by this License, and you want to
|
||||
create a new license for such software, you may create and use a
|
||||
modified version of this License if you rename the license and remove
|
||||
any references to the name of the license steward (except to note that
|
||||
such modified license differs from this License).
|
||||
|
||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||
Licenses
|
||||
|
||||
If You choose to distribute Source Code Form that is Incompatible With
|
||||
Secondary Licenses under the terms of this version of the License, the
|
||||
notice described in Exhibit B of this License must be attached.
|
||||
|
||||
Exhibit A - Source Code Form License Notice
|
||||
-------------------------------------------
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to look
|
||||
for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
|
||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||
---------------------------------------------------------
|
||||
|
||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||
defined by the Mozilla Public License, v. 2.0.
|
BIN
clearweb.png
Normal file
After Width: | Height: | Size: 126 KiB |
18
config.js
Normal file
@@ -0,0 +1,18 @@
|
||||
var proxy_scheme = 'HTTP';
|
||||
var proxy_host = '127.0.0.1';
|
||||
var proxy_port = '4444';
|
||||
|
||||
var control_host = '127.0.0.1';
|
||||
var control_port = '7657';
|
||||
|
||||
var rpc_host = '127.0.0.1';
|
||||
var rpc_port = '7657';
|
||||
var rpc_path = 'jsonrpc';
|
||||
var rpc_pass = 'itoopie';
|
||||
|
||||
var bt_rpc_host = '127.0.0.1';
|
||||
var bt_rpc_port = '7657';
|
||||
var bt_rpc_path = 'transmission/rpc';
|
||||
var bt_rpc_pass = 'transmission';
|
||||
|
||||
var disable_history = false;
|
64
content.js
@@ -1,17 +1,53 @@
|
||||
var infoTitle = document.getElementById("text-section-header");
|
||||
infoTitle.textContent = chrome.i18n.getMessage("infoTitle");
|
||||
function contentUpdateById(id, message) {
|
||||
let infoTitle = document.getElementById(id);
|
||||
let messageContent = chrome.i18n.getMessage(message);
|
||||
if (infoTitle === null) {
|
||||
console.log('content error', id, messageContent);
|
||||
return;
|
||||
}
|
||||
infoTitle.textContent = messageContent;
|
||||
}
|
||||
|
||||
var infoMessage = document.getElementById("text-section-helptext");
|
||||
infoMessage.textContent = chrome.i18n.getMessage("infoMessage");
|
||||
// Information Section
|
||||
contentUpdateById('text-section-header', 'extensionName');
|
||||
contentUpdateById('description', 'extensionDescription');
|
||||
contentUpdateById('i2pbrowser-version', 'extensionVersion');
|
||||
contentUpdateById('proxy-check', 'proxyFailedStatus');
|
||||
|
||||
var helpMessage = document.getElementById("window-create-forum-panel");
|
||||
helpMessage.textContent = chrome.i18n.getMessage("forumMessage");
|
||||
/*
|
||||
var helpMessage = document.getElementById('window-create-help-panel');
|
||||
helpMessage.textContent = chrome.i18n.getMessage("helpMessage")
|
||||
*/
|
||||
var newsMessage = document.getElementById("window-create-news-panel");
|
||||
newsMessage.textContent = chrome.i18n.getMessage("newsMessage");
|
||||
// Control Section
|
||||
contentUpdateById('controlHeader', 'controlHeader');
|
||||
contentUpdateById('controlExplain', 'controlExplain');
|
||||
contentUpdateById('clear-browser-data', 'clearData');
|
||||
contentUpdateById('clear-desc', 'clearDesc');
|
||||
contentUpdateById('enable-web-rtc', 'enableWebRTC');
|
||||
contentUpdateById('rtcDesc', 'rtcDesc');
|
||||
contentUpdateById('disable-history', 'disableHistory');
|
||||
contentUpdateById('histDesc', 'histDesc');
|
||||
|
||||
var clearData = document.getElementById("clear-browser-data");
|
||||
clearData.textContent = chrome.i18n.getMessage("clearData");
|
||||
// Application Section
|
||||
contentUpdateById('applicationHeader', 'applicationHeader');
|
||||
contentUpdateById('applicationExplain', 'applicationExplain');
|
||||
contentUpdateById('window-visit-index', 'windowVisitHelppage');
|
||||
contentUpdateById('help', 'help');
|
||||
contentUpdateById('window-visit-router', 'windowVisitConsole');
|
||||
contentUpdateById('routerConsole', 'routerConsole');
|
||||
contentUpdateById('window-visit-homepage', 'windowVisitHomepage');
|
||||
contentUpdateById('abouthome', 'abouthome');
|
||||
contentUpdateById('window-visit-i2ptunnel', 'windowVisitI2ptunnel');
|
||||
contentUpdateById('i2ptunnel', 'i2ptunnel');
|
||||
contentUpdateById('window-visit-susimail', 'windowVisitSusiMail');
|
||||
contentUpdateById('susimail', 'susimail');
|
||||
contentUpdateById('window-visit-snark', 'windowVisitSnark');
|
||||
contentUpdateById('snark', 'snark');
|
||||
|
||||
// Homepage Section
|
||||
contentUpdateById('window-visit-webpage', 'windowVisitWebPage');
|
||||
contentUpdateById('webpage', 'help');
|
||||
contentUpdateById('window-visit-sources', 'windowVisitSources');
|
||||
contentUpdateById('sources', 'sources');
|
||||
contentUpdateById('window-visit-releases', 'windowVisitReleases');
|
||||
contentUpdateById('releases', 'releases');
|
||||
|
||||
fetch('http://proxy.i2p').then((myJson) => {
|
||||
contentUpdateById('proxy-check', 'proxySuccessStatus');
|
||||
});
|
||||
|
59
context.js
@@ -1,31 +1,32 @@
|
||||
//var windowIds = []
|
||||
var titlepref = chrome.i18n.getMessage('titlePreface');
|
||||
|
||||
function onError(error) {
|
||||
console.log(`Error : ${error}`);
|
||||
}
|
||||
|
||||
function eventHandler(event) {
|
||||
if (event.target.dataset.action == "create") {
|
||||
function onCreated(windowInfo) {
|
||||
console.log(`Created window: ${windowInfo.id}`);
|
||||
browser.tabs.create({
|
||||
windowId: windowInfo.id,
|
||||
url: "about:blank",
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
});
|
||||
}
|
||||
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
var creating = browser.windows.create({
|
||||
cookieStoreId: event.target.dataset.identity
|
||||
function onCreated(windowInfo) {
|
||||
console.log(`Created window : ${windowInfo.id}`);
|
||||
browser.tabs.create({
|
||||
windowId: windowInfo.id,
|
||||
url: 'about:blank',
|
||||
cookieStoreId: event.target.dataset.identity,
|
||||
});
|
||||
}
|
||||
if (event.target.dataset.action == 'create') {
|
||||
var creating = browser.tabs.create({
|
||||
cookieStoreId: event.target.dataset.identity,
|
||||
});
|
||||
creating.then(onCreated, onError);
|
||||
}
|
||||
if (event.target.dataset.action == "close-all") {
|
||||
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(i => i.id));
|
||||
.then((tabs) => {
|
||||
browser.tabs.remove(tabs.map((rem) => rem.id));
|
||||
});
|
||||
}
|
||||
event.preventDefault();
|
||||
@@ -33,13 +34,13 @@ function eventHandler(event) {
|
||||
|
||||
function createOptions(node, identity) {
|
||||
for (let option of ["Create", "Close All"]) {
|
||||
let a = document.createElement("a");
|
||||
a.href = "#";
|
||||
a.innerText = option;
|
||||
a.dataset.action = option.toLowerCase().replace(" ", "-");
|
||||
a.dataset.identity = identity.cookieStoreId;
|
||||
a.addEventListener("click", eventHandler);
|
||||
node.appendChild(a);
|
||||
let alink = document.createElement("a");
|
||||
alink.href = "#";
|
||||
alink.innerText = option;
|
||||
alink.dataset.action = option.toLowerCase().replace(" ", "-");
|
||||
alink.dataset.identity = identity.cookieStoreId;
|
||||
alink.addEventListener("click", eventHandler);
|
||||
node.appendChild(alink);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,9 +52,9 @@ if (browser.contextualIdentities === undefined) {
|
||||
} else {
|
||||
browser.contextualIdentities
|
||||
.query({
|
||||
name: "i2pbrowser"
|
||||
name: titlepref,
|
||||
})
|
||||
.then(identities => {
|
||||
.then((identities) => {
|
||||
if (!identities.length) {
|
||||
div.innerText = "No identities returned from the API.";
|
||||
return;
|
||||
@@ -61,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}`;
|
||||
|
200
debian/changelog
vendored
@@ -1,10 +1,208 @@
|
||||
i2psetproxy.js (0.93-1) UNRELEASED; urgency=low
|
||||
|
||||
* Emergency fix of the first one
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 14 DEC 2020 5:18:53 -0400
|
||||
|
||||
i2psetproxy.js (0.91-1) UNRELEASED; urgency=low
|
||||
|
||||
* Exclude clearnet code hosting sites from scrub checks
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 14 DEC 2020 2:46:23 -0400
|
||||
|
||||
i2psetproxy.js (0.89-1) UNRELEASED; urgency=low
|
||||
|
||||
* Pages with lots of AJAX requests could trigger a performance degradation
|
||||
* Improve performance of x-i2p-* headers and meta tags
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 13 DEC 2020 2:22:00 -0400
|
||||
|
||||
i2psetproxy.js (0.87-1) UNRELEASED; urgency=low
|
||||
|
||||
* Disable searching for i2p sites in non-i2p search engines
|
||||
* Add contexts for i2pbote and Dispatch
|
||||
* Remain in tighter control of x-i2p-torrentlocation priority
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 10 NOV 2020 1:33:50 -0400
|
||||
|
||||
i2psetproxy.js (0.85-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
|
||||
* Refine pageaction behavior
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 24 SEP 2020 20:18:03 -0400
|
||||
|
||||
i2psetproxy.js (0.77-1) UNRELEASED; urgency=low
|
||||
|
||||
* Implement x-i2p-location header
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 24 SEP 2020 20:18:03 -0400
|
||||
|
||||
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low
|
||||
|
||||
* Update bookmarks format
|
||||
* Deprecate WebRTC State Management
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 22 JUN 2020 11:22:37 -0400
|
||||
|
||||
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low
|
||||
|
||||
* Update bookmarks format
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 22 JUN 2020 19:21:23 -0400
|
||||
|
||||
i2psetproxy.js (0.71-1) UNRELEASED; urgency=low
|
||||
|
||||
* Fix incomplete bugfix from 0.69
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 24 MAR 2020 0:19:59 -0400
|
||||
|
||||
i2psetproxy.js (0.71-1) UNRELEASED; urgency=low
|
||||
|
||||
* Fix incomplete bugfix from 0.69
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 24 MAR 2020 0:19:59 -0400
|
||||
|
||||
i2psetproxy.js (0.69-1) UNRELEASED; urgency=low
|
||||
|
||||
* Add MuWire contextual ID
|
||||
* Fix bug occurring on certain modded I2P installs
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 24 MAR 2020 0:12:02 -0400
|
||||
|
||||
i2psetproxy.js (0.67-1) UNRELEASED; urgency=low
|
||||
|
||||
* Tweak some default settings that should have gone into 65
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 17 MAR 2020 22:58:55 -0400
|
||||
|
||||
i2psetproxy.js (0.65-1) UNRELEASED; urgency=low
|
||||
|
||||
* Initial prototype of certs implementation
|
||||
* Use "pinned apptabs" to minimize the number of tabs occupied by an app
|
||||
* Get ready for self-hosted updates but with bittorrent because it's cooler
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 17 MAR 2020 22:58:55 -0400
|
||||
|
||||
i2psetproxy.js (0.63-1) UNRELEASED; urgency=low
|
||||
|
||||
* other containerizers bugfix
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 02 MAR 2020 17:54:26 -0400
|
||||
|
||||
i2psetproxy.js (0.61-1) UNRELEASED; urgency=low
|
||||
|
||||
* other containerizers bugfix
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 02 MAR 2020 17:46:24 -0400
|
||||
|
||||
i2psetproxy.js (0.59-1) UNRELEASED; urgency=low
|
||||
|
||||
* transmission-rpc based torrent controls
|
||||
* bugfixes
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 25 FEB 2020 20:52:19 -0400
|
||||
|
||||
i2psetproxy.js (0.57-1) UNRELEASED; urgency=low
|
||||
|
||||
* Snowflake compatibility
|
||||
* Lots of small compatibility fixes
|
||||
* More linter errors
|
||||
* Make it multilingual again
|
||||
* Distribute a torrent and a magnet link with the plugin of the plugin
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 4 JAN 2020 16:43:58 -0400
|
||||
|
||||
i2psetproxy.js (0.55-1) UNRELEASED; urgency=low
|
||||
|
||||
* Get rid of Web Browsing context launcher
|
||||
* Fix linter errors
|
||||
* Tolerate themes
|
||||
* Tolerate other containerizers
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 2 JAN 2020 16:47:33 -0400
|
||||
|
||||
i2psetproxy.js (0.53-1) UNRELEASED; urgency=low
|
||||
|
||||
* Quick Fix
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 20:11:30 -0400
|
||||
|
||||
i2psetproxy.js (0.51-1) UNRELEASED; urgency=low
|
||||
|
||||
* Numerous code cleanups, compatibility fixes
|
||||
* enable-disable history
|
||||
* better homepage, better control panel, saner options
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 20:10:30 -0400
|
||||
|
||||
i2psetproxy.js (0.49-1) UNRELEASED; urgency=low
|
||||
|
||||
* fix tabs
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 22:51:11 -0400
|
||||
|
||||
i2psetproxy.js (0.47-1) UNRELEASED; urgency=low
|
||||
|
||||
* Improve android compatibility
|
||||
* Improve code organization
|
||||
* Partial protocol handlers implementation
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 18:53:11 -0400
|
||||
|
||||
i2psetproxy.js (0.45-1) UNRELEASED; urgency=low
|
||||
|
||||
* Improve the user interface a whole bunch
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Fri, 22 NOV 2019 18:17:33 -0400
|
||||
|
||||
i2psetproxy.js (0.43-1) UNRELEASED; urgency=low
|
||||
|
||||
* Contextualize All the Things
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Mon, 11 OCT 2019 12:41:33 -0400
|
||||
|
||||
i2psetproxy.js (0.41-1) UNRELEASED; urgency=low
|
||||
|
||||
* Only open tabs, not windows
|
||||
* Optionally enable WebRTC
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 31 OCT 2019 12:41:33 -0400
|
||||
|
||||
i2psetproxy.js (0.37-1) UNRELEASED; urgency=low
|
||||
|
||||
* Honor contextual ID when deleting history
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 17 OCT 2019 00:52:19 -0400
|
||||
|
||||
i2psetproxy.js (0.35-1) UNRELEASED; urgency=low
|
||||
|
||||
* Automatically activate contexts
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 01 Aug 2019 00:32:39 -0400
|
||||
|
||||
|
||||
i2psetproxy.js (0.31-1) UNRELEASED; urgency=low
|
||||
|
||||
* Initial release. Closes: #nnnn
|
||||
|
1
debian/copyright
vendored
@@ -28,6 +28,7 @@ Files: .gitignore
|
||||
scrub.js
|
||||
window.html
|
||||
debian/*
|
||||
*
|
||||
Copyright: MIT
|
||||
License: MIT
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
|
6
debian/postinst
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#! /bin/sh
|
||||
|
||||
ln -sf /usr/share/webext/i2ppb@eyedeekay.github.io \
|
||||
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2ppb@eyedeekay.github.io
|
||||
|
||||
touch /usr/share/webext/i2ppb@eyedeekay.github.io/manifest.json
|
17
debian/rules
vendored
@@ -3,18 +3,7 @@
|
||||
%:
|
||||
dh $@
|
||||
|
||||
export PREFIX=debian/i2psetproxy.js/usr
|
||||
|
||||
override_dh_auto_install:
|
||||
mkdir -p $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
cp -r ./chromium/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./icons/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./options/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp -r ./_locales/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.html $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.css $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./*.md $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./manifest.json $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
cp ./LICENSE $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
|
||||
ln -sf $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
|
||||
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||
make install
|
||||
|
3
debian/source/include-binaries
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
i2psetproxy.js.gif
|
||||
smartlander.pdf
|
||||
browser.pdf
|
1
geti2p.url
Normal file
@@ -0,0 +1 @@
|
||||
0.9.43
|
116
handler.js
Normal file
@@ -0,0 +1,116 @@
|
||||
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') {
|
||||
console.log('(urlcheck) Tunnel application path', final);
|
||||
return 'i2ptunnelmgr';
|
||||
} else if (
|
||||
final === 'i2psnark' ||
|
||||
final === 'torrents' ||
|
||||
final.startsWith('transmission') ||
|
||||
final.startsWith('tracker') ||
|
||||
url.includes(':7662')
|
||||
) {
|
||||
console.log('(urlcheck) Torrent application path', final);
|
||||
return 'i2psnark';
|
||||
} else if (final === 'webmail' || final === 'susimail') {
|
||||
console.log('(urlcheck) Mail application path', final);
|
||||
return 'webmail';
|
||||
} else if (final.startsWith('MuWire')) {
|
||||
if (!url.includes('.png')) {
|
||||
console.log('(urlcheck) MuWire application path', final);
|
||||
return 'muwire';
|
||||
}
|
||||
} else if (final.startsWith('i2pbote')) {
|
||||
if (!url.includes('.png')) {
|
||||
console.log('(urlcheck) I2PBote application path', final);
|
||||
return 'i2pbote';
|
||||
}
|
||||
} else if (
|
||||
final === 'home' ||
|
||||
final === 'console' ||
|
||||
final === 'dns' ||
|
||||
final === 'sitemap' ||
|
||||
final.startsWith('config')
|
||||
) {
|
||||
console.log('(urlcheck) Console application path', final);
|
||||
return 'routerconsole';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (url.indexOf('://') > -1) {
|
||||
hostname = url.split('/')[2];
|
||||
let prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
path = url.replace(prefix + hostname + '/', '');
|
||||
} else if (identifyProtocolHandler(url)) {
|
||||
let newurl = identifyProtocolHandler(url);
|
||||
return routerHost(newurl);
|
||||
} else {
|
||||
hostname = url.split('/')[0];
|
||||
path = url.replace(hostname + '/', '');
|
||||
}
|
||||
if (hostname === control_host + ':' + control_port) {
|
||||
//console.log("(hostcheck) router console found on configured ports");
|
||||
return pathcheck(path);
|
||||
}
|
||||
if (hostname === 'localhost' + ':' + control_port) {
|
||||
//console.log("(hostcheck) router console found on configured ports");
|
||||
return pathcheck(path);
|
||||
}
|
||||
if (hostname === '127.0.0.1' + ':' + control_port) {
|
||||
return pathcheck(path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function identifyProtocolHandler(url) {
|
||||
//console.log("looking for handler-able requests")
|
||||
if (routerHost(url)) {
|
||||
if (url.includes(encodeURIComponent('ext+rc:'))) {
|
||||
return url.replace(encodeURIComponent('ext+rc:'), '');
|
||||
} else if (url.includes('ext+rc:')) {
|
||||
return url.replace('ext+rc:', '');
|
||||
}
|
||||
} else if (url.includes('ext+rc:')) {
|
||||
return url;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function trimHost(url) {
|
||||
let hostname = '';
|
||||
let prefix = '';
|
||||
if (url.indexOf('://') > -1) {
|
||||
prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
hostname = url.split('/')[2];
|
||||
} else {
|
||||
hostname = url.split('/')[0];
|
||||
}
|
||||
let path = url.replace(prefix + hostname, '');
|
||||
console.log('(handler) path', prefix + hostname, path);
|
||||
return path;
|
||||
}
|
||||
|
||||
var handlerSetup = function(requestDetails) {
|
||||
//console.log("checking protocol handler listener")
|
||||
let rwurl = identifyProtocolHandler(requestDetails.url);
|
||||
if (rwurl != false) {
|
||||
console.log('(handler) rewrite URL requested', rwurl);
|
||||
requestDetails.redirectUrl = rwurl;
|
||||
requestDetails.url = trimHost(rwurl);
|
||||
requestDetails.originUrl = trimHost(rwurl);
|
||||
}
|
||||
return requestDetails;
|
||||
};
|
||||
/*
|
||||
browser.webRequest.onBeforeRequest.addListener(handlerSetup, {
|
||||
urls: ['<all_urls>'],
|
||||
});
|
||||
*/
|
281
home.css
Normal file
@@ -0,0 +1,281 @@
|
||||
* {
|
||||
padding: 0;
|
||||
color: #1f1a24;
|
||||
margin: 0
|
||||
}
|
||||
a,
|
||||
button {
|
||||
color: #1f1a24;
|
||||
text-decoration: none;
|
||||
background: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0;
|
||||
padding: 3px;
|
||||
margin: auto
|
||||
}
|
||||
.applicationDesc {
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.applicationDesc:hover,
|
||||
a:hover,
|
||||
button:hover {
|
||||
color: #495057;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
button {
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
color: #3b6bbf;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
margin: 0 auto;
|
||||
padding: 0;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.button-list {
|
||||
min-height: 230px;
|
||||
min-width: 230px
|
||||
}
|
||||
.background {
|
||||
height: 100%
|
||||
}
|
||||
p {
|
||||
line-height: 32px;
|
||||
font-size: 17px;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0
|
||||
}
|
||||
.content {
|
||||
min-height: 3rem;
|
||||
padding: 1rem;
|
||||
margin: 1.5rem;
|
||||
display: block;
|
||||
border-radius: 2px;
|
||||
min-width: 100%
|
||||
}
|
||||
#header,
|
||||
.application-info,
|
||||
.browser-info,
|
||||
.extended-info,
|
||||
.search-info {
|
||||
min-height: 3rem;
|
||||
padding: 1rem;
|
||||
margin-top: 1.5rem;
|
||||
display: block;
|
||||
border-radius: 2px;
|
||||
min-width: 100%
|
||||
}
|
||||
h1 {
|
||||
margin: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 32px;
|
||||
color: #e6e6e7;
|
||||
background: #1f1a24;
|
||||
width: 100%;
|
||||
border-radius: 2px 2px 0 0
|
||||
}
|
||||
h2,
|
||||
h3 {
|
||||
margin-right: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 25px;
|
||||
color: #e6e6e7;
|
||||
border-radius: 2px 2px 0 0;
|
||||
background: #1f1a24;
|
||||
width: 100%;
|
||||
padding-left: 5%
|
||||
}
|
||||
h4 {
|
||||
margin-right: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 20px!important;
|
||||
color: #41465f;
|
||||
border-radius: 2px 2px 0 0;
|
||||
background: #1f1a24;
|
||||
width: 100%;
|
||||
padding-left: 5%
|
||||
}
|
||||
.showhider {
|
||||
margin-right: auto;
|
||||
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
|
||||
border: none;
|
||||
padding: 0!important;
|
||||
color: #3b6bbf;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
word-wrap: break-word;
|
||||
outline: 0;
|
||||
text-align: left
|
||||
}
|
||||
#links .showhider {
|
||||
font-size: 25px
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-bottom: 80px
|
||||
}
|
||||
ul {
|
||||
margin: auto;
|
||||
border-radius: 2px;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
li {
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
.center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 50%
|
||||
}
|
||||
#readyness {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
margin: 1rem;
|
||||
width: 42%;
|
||||
min-width: 42%;
|
||||
text-align: center!important;
|
||||
border-radius: 2px;
|
||||
display: block
|
||||
}
|
||||
#onboarding {
|
||||
min-height: 5rem;
|
||||
padding: .5rem;
|
||||
margin: .5rem;
|
||||
margin-top: 4rem;
|
||||
width: 42%;
|
||||
min-width: 42%;
|
||||
font-size: 2rem;
|
||||
text-align: center!important;
|
||||
border-radius: 2px
|
||||
}
|
||||
#i2pbrowser-description {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
width: 50%;
|
||||
min-width: 50%;
|
||||
display: block
|
||||
}
|
||||
html body ul.label-list li {
|
||||
list-style: none;
|
||||
float: left
|
||||
}
|
||||
html body ul.label-list li:nth-child(odd) {
|
||||
clear: left
|
||||
}
|
||||
#linksExplain {
|
||||
min-height: 5rem;
|
||||
padding: .5rem;
|
||||
margin: .5rem;
|
||||
width: 30%;
|
||||
min-width: 30%;
|
||||
text-align: center!important;
|
||||
border-radius: 2px
|
||||
}
|
||||
#applicationExplain,
|
||||
#controlExplain {
|
||||
min-height: 5rem;
|
||||
padding: .5rem;
|
||||
margin: .5rem;
|
||||
text-align: left!important;
|
||||
float: left
|
||||
}
|
||||
#proxyReady {
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
margin: .2rem;
|
||||
width: 38%;
|
||||
min-width: 38%;
|
||||
display: block;
|
||||
float: right;
|
||||
text-align: center!important
|
||||
}
|
||||
#proxyUnready {
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
margin: .2rem;
|
||||
width: 38%;
|
||||
min-width: 38%;
|
||||
display: block;
|
||||
float: right;
|
||||
text-align: center!important
|
||||
}
|
||||
#consoleOn {
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
margin: .2rem;
|
||||
width: 38%;
|
||||
min-width: 38%;
|
||||
display: block;
|
||||
float: left;
|
||||
text-align: center!important
|
||||
}
|
||||
.tabicon {
|
||||
min-width: 64px;
|
||||
min-height: 64px
|
||||
}
|
||||
li.application {
|
||||
text-align: left
|
||||
}
|
||||
button.applicationName {
|
||||
width: auto
|
||||
}
|
||||
.onboardingContent {
|
||||
font-size: .8rem!important;
|
||||
text-align: left;
|
||||
display: none
|
||||
}
|
||||
#info-content {
|
||||
display: none
|
||||
}
|
||||
.consoleOn:hover #proxy-check,
|
||||
.proxyReady:hover #proxy-check {
|
||||
visibility: visible;
|
||||
opacity: 1
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
margin: 3%
|
||||
}
|
||||
img.readyness {
|
||||
height: 100%;
|
||||
width: auto
|
||||
}
|
||||
input {
|
||||
color: #1f1a24
|
||||
}
|
||||
#hidden {
|
||||
display: none
|
||||
}
|
||||
.hidden {
|
||||
display: none
|
||||
}
|
151
home.html
Normal file
@@ -0,0 +1,151 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link href="home.css" rel="stylesheet">
|
||||
<link href="search.css" rel="stylesheet">
|
||||
<link href="sidebar.css" rel="stylesheet">
|
||||
<title>
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<!--<div>-->
|
||||
|
||||
<div class='background'>
|
||||
<div class='content'>
|
||||
<div class="text-section-header">
|
||||
<h1 id="text-section-header">I2P Browsing</h1>
|
||||
</div>
|
||||
|
||||
<div id="i2pbrowser-version">
|
||||
</div>
|
||||
|
||||
<div id="i2pbrowser-description">
|
||||
<p id="description">I2P in Private Browsing is a webextension to secure and enhance your I2P use in the browser.</p>
|
||||
|
||||
<p id="beta">This is an experimental product.</p>
|
||||
</div>
|
||||
|
||||
<div id="readyness">
|
||||
<!--<div id="consoleOn" class="hideIfI2PConsoleOff">
|
||||
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
|
||||
<span id="proxy-check">Proxy is ready.</span>
|
||||
</div>-->
|
||||
<!--<div id="proxyUnready" class="hideIfI2PProxyOn">The proxy is not ready yet.</div>-->
|
||||
|
||||
<div class="hideIfI2PProxyOff" id="proxyReady">
|
||||
<img alt="Proxy is not ready." class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png"> <span id="proxy-check">Proxy is ready.</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hideIfI2PConsoleOff" id="onboarding">
|
||||
<h3 id="onboardingTitle">New to I2P? Learn more here.</h3>
|
||||
|
||||
<h4 id="onboardingZero"><button class="showhider" id="onboardingButtonZero">Protect your Privacy</button>
|
||||
</h4>
|
||||
|
||||
<p class="onboardingContent" id="onboardingContentZero">I2P Browser allows you to surf the internet using the private and secure I2P network. When using it, you are protected against tracking, surveillance, and censorship as a first-class participant in the I2P network. I2P Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser.</p>
|
||||
|
||||
<h4 id="onboardingOne"><button class="showhider" id="onboardingButtonOne">Configure your Experience</button>
|
||||
</h4>
|
||||
|
||||
<p class="onboardingContent" id="onboardingContentOne">We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do. Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them. With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
|
||||
|
||||
<h4 id="onboardingTwo"><button class="showhider" id="onboardingButtonTwo">Share Files</button>
|
||||
</h4>
|
||||
|
||||
<p class="onboardingContent" id="onboardingContentTwo">I2P is capable of using peer-to-peer applications like BitTorrent, protecting your identity when you share files. Our anonymous bittorrent client is available in the browser.</p>
|
||||
|
||||
<h4 id="onboardingThree"><button class="showhider" id="onboardingButtonThree">Hidden e-mail</button>
|
||||
</h4>
|
||||
|
||||
<p class="onboardingContent" id="onboardingContentThree">There is also an anonymous e-mail service available inside of I2P, which is accessible from our browser via the menu directly below.</p>
|
||||
|
||||
<h4 id="onboardingFour"><button class="showhider" id="onboardingButtonFour">Experience Tips</button>
|
||||
</h4>
|
||||
|
||||
<p class="onboardingContent" id="onboardingContentFour">With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
|
||||
</div>
|
||||
<!--<p class="hideIfI2POn">&aboutI2p.warn_not_running; <a href="about:i2p">&aboutI2p.refresh_text;</a> &aboutI2p.reccommend_not_running;</p>-->
|
||||
|
||||
<div class="application-info">
|
||||
<p class="hideIfI2PConsoleOff">
|
||||
</p>
|
||||
|
||||
<h3 id="applicationHeader">Applications</h3>
|
||||
|
||||
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
|
||||
|
||||
<ul>
|
||||
<!--<li class="application">
|
||||
<a class="applicationName" href="http://legwork.i2p" id="window-link-toopie" target="_blank">Search:</a> <span class="applicationDesc" id="search">Legwork is an in-I2P search engine.</span>
|
||||
<div class="topnav">
|
||||
<form action="http://legwork.i2p/yacysearch.html?" method="get">
|
||||
<input id="search-query" name="query" placeholder="Search on legwork.i2p(Opens a new tab)" type="search"> <input id="search-submit" text="Submit" type="submit">
|
||||
</form>
|
||||
</div>
|
||||
</li>-->
|
||||
|
||||
<li class="application">
|
||||
<a class="applicationName" href="toopie.html" id="window-visit-toopie">Toopie</a> <span class="applicationDesc" id="toopie">For information about your I2P router status, go here:</span>
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<a class="applicationName" href="http://127.0.0.1:7657/" id="window-visit-router">Router Console</a> <span class="applicationDesc" id="routerConsole">The entrypoint for all other I2P applications is the I2P Router Console. To visit it, click here.</span>
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<a class="applicationName" href="http://127.0.0.1:7657/i2ptunnel" id="window-visit-i2ptunnel">Hidden Services Manager</a> <span class="applicationDesc" id="i2ptunnel">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span>
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<a class="applicationName" href="http://127.0.0.1:7657/susimail" id="window-visit-susimail">E-Mail</a> <span class="applicationDesc" id="susimail">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span>
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<a class="applicationName" href="http://127.0.0.1:7657/i2psnark" id="window-visit-snark">BitTorrent</a> <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>
|
||||
</div>
|
||||
|
||||
<div class="extended-info">
|
||||
<h3 id="links"><button class="showhider" id="fliplinks">Links</button>
|
||||
</h3>
|
||||
|
||||
<div id="info-content">
|
||||
<p id="linksExplain">If you want to get more information about I2P, you can visit these links.</p>
|
||||
|
||||
<p>
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li class="application">
|
||||
<a href="http://i2p-projekt.i2p/" id="window-visit-i2p">I2P Project Homepage:</a> <span class="applicationDesc" id="i2ppage">More information is available here.</span>
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<a href="/index.html" id="window-visit-homepage">Webextension Homepage:</a> <span class="applicationDesc" id="webpage">More information is available here.</span>
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<a href="http://git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox" id="window-visit-sources">Source Code:</a> <span class="applicationDesc" id="sources">Browse the source of this webextension or contribute here.</span>
|
||||
</li>
|
||||
|
||||
<li class="application">
|
||||
<a href="http://git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox/-/releases" id="window-visit-releases">Releases:</a> <span class="applicationDesc" id="releases">Check for new releases here.</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="home.js" type="text/javascript"></script>
|
||||
<script src="content.js" type="text/javascript"></script> <!--</div>-->
|
||||
</body>
|
||||
</html>
|
25
home.js
Normal file
@@ -0,0 +1,25 @@
|
||||
document.addEventListener('click', (clickEvent) => {
|
||||
if (clickEvent.target.id === 'onboardingButtonZero') {
|
||||
flipVisibility('onboardingContentZero');
|
||||
} else if (clickEvent.target.id === 'onboardingButtonOne') {
|
||||
flipVisibility('onboardingContentOne');
|
||||
} else if (clickEvent.target.id === 'onboardingButtonTwo') {
|
||||
flipVisibility('onboardingContentTwo');
|
||||
} else if (clickEvent.target.id === 'onboardingButtonThree') {
|
||||
flipVisibility('onboardingContentThree');
|
||||
} else if (clickEvent.target.id === 'onboardingButtonFour') {
|
||||
flipVisibility('onboardingContentFour');
|
||||
} else if (clickEvent.target.id === 'fliplinks') {
|
||||
flipVisibility('info-content');
|
||||
}
|
||||
});
|
||||
|
||||
function flipVisibility(div) {
|
||||
console.log('(home) seeking flippable', div);
|
||||
let flippable = document.getElementById(div);
|
||||
if (flippable.style.display !== 'block') {
|
||||
flippable.style.display = 'block';
|
||||
} else {
|
||||
flippable.style.display = 'none';
|
||||
}
|
||||
}
|
157
host.js
Normal file
@@ -0,0 +1,157 @@
|
||||
function proxyHost(url) {
|
||||
let hostname = '';
|
||||
if (url.indexOf('://') > -1) {
|
||||
hostname = url.split('/')[2];
|
||||
} else {
|
||||
hostname = url.split('/')[0];
|
||||
}
|
||||
if (hostname == 'proxy.i2p') {
|
||||
return true;
|
||||
}
|
||||
if (
|
||||
hostname == 'c6lilt4cr5x7jifxridpkesf2zgfwqfchtp6laihr4pdqomq25iq.b32.i2p'
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function localHost(url) {
|
||||
let hostname = '';
|
||||
if (url.indexOf('://') > -1) {
|
||||
hostname = url.split('/')[2];
|
||||
} else {
|
||||
hostname = url.split('/')[0];
|
||||
}
|
||||
hostname = hostname.split(':')[0];
|
||||
if (hostname === '127.0.0.1') {
|
||||
return true;
|
||||
} else if (hostname === 'localhost') {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function extensionHost(url) {
|
||||
if (url.originUrl !== undefined) {
|
||||
var res = url.originUrl.startsWith(browser.runtime.getURL(''));
|
||||
if (res) return res;
|
||||
}
|
||||
if (url.url !== undefined) {
|
||||
var res = url.url.startsWith(browser.runtime.getURL(''));
|
||||
if (res) return res;
|
||||
}
|
||||
}
|
||||
|
||||
function i2pHostName(url) {
|
||||
let hostname = '';
|
||||
console.log('(hosts)', url);
|
||||
let u = new URL(url);
|
||||
if (u.host.endsWith('.i2p')) {
|
||||
hostname = u.host;
|
||||
} else if (url.includes('=')) {
|
||||
if (url.includes('.i2p')) {
|
||||
lsit = url.split('=');
|
||||
for (let item in lsit) {
|
||||
var items = lsit[item].split(`\ % `); //"\%")
|
||||
for (let p in items) {
|
||||
if (items[p].includes('.i2p')) {
|
||||
hostname = items[p].replace('3D', 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (hostname != '') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (url.indexOf('://') > -1) {
|
||||
hostname = url.split('/')[2];
|
||||
} else {
|
||||
hostname = url.split('/')[0];
|
||||
}
|
||||
console.log('(hosts) scrub', hostname);
|
||||
return hostname;
|
||||
}
|
||||
|
||||
function i2pHost(url) {
|
||||
let hostname = i2pHostName(url);
|
||||
return hostname.endsWith('.i2p');
|
||||
}
|
||||
|
||||
function routerHost(url) {
|
||||
// console.log("(urlcheck) HOST URL CHECK");
|
||||
let hostname = '';
|
||||
let path = '';
|
||||
function pathcheck(str) {
|
||||
if (str != undefined) {
|
||||
let final = str.split('/')[0];
|
||||
if (final === 'i2ptunnelmgr' || final === 'i2ptunnel') {
|
||||
console.log('(urlcheck) Tunnel application path', final);
|
||||
return 'i2ptunnelmgr';
|
||||
} else if (
|
||||
final === 'i2psnark' ||
|
||||
final === 'torrents' ||
|
||||
final.startsWith('transmission') ||
|
||||
final.startsWith('tracker') ||
|
||||
url.includes(':7662')
|
||||
) {
|
||||
console.log('(urlcheck) Torrent application path', final);
|
||||
return 'i2psnark';
|
||||
} else if (final === 'webmail' || final === 'susimail') {
|
||||
console.log('(urlcheck) Mail application path', final);
|
||||
return 'webmail';
|
||||
} else if (final.startsWith('MuWire')) {
|
||||
if (!url.includes('.png')) {
|
||||
console.log('(urlcheck) MuWire application path', final);
|
||||
return 'muwire';
|
||||
}
|
||||
} else if (final.startsWith('i2pbote')) {
|
||||
if (!url.includes('.png')) {
|
||||
console.log('(urlcheck) I2PBote application path', final);
|
||||
return 'i2pbote';
|
||||
}
|
||||
} else if (
|
||||
final === 'home' ||
|
||||
final === 'console' ||
|
||||
final === 'dns' ||
|
||||
final === 'susidns' ||
|
||||
final.startsWith('susidns') ||
|
||||
final === 'sitemap' ||
|
||||
final.startsWith('config')
|
||||
) {
|
||||
console.log('(urlcheck) Console application path', final);
|
||||
return 'routerconsole';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (url.indexOf('://') > -1) {
|
||||
hostname = url.split('/')[2];
|
||||
let prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
path = url.replace(prefix + hostname + '/', '');
|
||||
} else if (identifyProtocolHandler(url)) {
|
||||
let newurl = identifyProtocolHandler(url);
|
||||
return routerHost(newurl);
|
||||
} else {
|
||||
hostname = url.split('/')[0];
|
||||
path = url.replace(hostname + '/', '');
|
||||
}
|
||||
if (hostname === control_host + ':' + control_port) {
|
||||
return pathcheck(path);
|
||||
}
|
||||
if (hostname === 'localhost' + ':' + control_port) {
|
||||
return pathcheck(path);
|
||||
}
|
||||
if (hostname === '127.0.0.1' + ':' + control_port) {
|
||||
return pathcheck(path);
|
||||
}
|
||||
if (hostname === 'localhost' + ':' + 7070) {
|
||||
return pathcheck(path);
|
||||
}
|
||||
if (hostname === '127.0.0.1' + ':' + 7070) {
|
||||
return pathcheck(path);
|
||||
}
|
||||
return false;
|
||||
}
|
5
i2pcontrol/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
i2pcontrol.js
|
||||
=============
|
||||
|
||||
This is inside of the webextension for now, but it's actually a fully-fledged,
|
||||
standalone library for talking to i2pcontrol.
|
391
i2pcontrol/i2pcontrol.js
Normal file
@@ -0,0 +1,391 @@
|
||||
var hello = 'hello i2pcontrol';
|
||||
|
||||
function makeid(length) {
|
||||
var result = '';
|
||||
var characters =
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
var charactersLength = characters.length;
|
||||
for (var i = 0; i < length; i++) {
|
||||
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function send(
|
||||
message,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc"
|
||||
) {
|
||||
async function postData(url = "", data = {}) {
|
||||
// Default options are marked with *
|
||||
let requestBody = JSON.stringify(data);
|
||||
//console.log("(i2pcontrol) sending request", requestBody);
|
||||
let opts = {
|
||||
method: 'POST', // *GET, POST, PUT, DELETE, etc.
|
||||
mode: 'cors', // no-cors, *cors, same-origin
|
||||
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
|
||||
credentials: 'same-origin', // include, *same-origin, omit
|
||||
headers: {
|
||||
'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
|
||||
};
|
||||
const response = await fetch(url, opts);
|
||||
return await response.json(); // parses JSON response into native JavaScript objects
|
||||
}
|
||||
|
||||
//console.log("http://" + control_host + ":" + control_port + "/" + control_path)
|
||||
return postData(
|
||||
'http://' + control_host + ':' + control_port + '/' + control_path + '/',
|
||||
message
|
||||
);
|
||||
}
|
||||
|
||||
async function authenticate(
|
||||
password = "itoopie",
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc"
|
||||
) {
|
||||
var json = new Object();
|
||||
json['id'] = makeid(6);
|
||||
json['jsonrpc'] = '2.0';
|
||||
json['method'] = 'Authenticate';
|
||||
json['params'] = new Object();
|
||||
json['params']['API'] = 1;
|
||||
json['params']['Password'] = password;
|
||||
return send(json, control_host, control_port, control_path);
|
||||
}
|
||||
|
||||
async function GetToken(
|
||||
password = "itoopie",
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc"
|
||||
) {
|
||||
function gettoken(authtoken) {
|
||||
return authtoken.result.Token;
|
||||
}
|
||||
let me = authenticate(password, control_host, control_port, control_path);
|
||||
return await me.then(gettoken);
|
||||
}
|
||||
|
||||
async function Echo(
|
||||
message,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function echo(token) {
|
||||
console.log('(i2pcontrol) testing I2PControl connection');
|
||||
var json = new Object();
|
||||
json['id'] = makeid(6);
|
||||
json['jsonrpc'] = '2.0';
|
||||
json['method'] = 'Echo';
|
||||
json['params'] = new Object();
|
||||
json['params']['Token'] = token;
|
||||
json['params']['Echo'] = message;
|
||||
return send(json, control_host, control_port, control_path);
|
||||
}
|
||||
let token = GetToken(password, control_host, control_port, control_path);
|
||||
let done = await token.then(echo);
|
||||
return done;
|
||||
}
|
||||
|
||||
function UpdateEchoElementByID(
|
||||
Query,
|
||||
ID,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc"
|
||||
) {
|
||||
function updateelement(update) {
|
||||
//console.log("(i2pcontrol)", update);
|
||||
if (document.getElementById(ID) !== null)
|
||||
document.getElementById(ID).innerText = update;
|
||||
}
|
||||
let net = Echo(Query, control_host, control_port, control_path, password);
|
||||
net.then(updateleement);
|
||||
}
|
||||
|
||||
async function GetRate(
|
||||
Query,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function getrate(token) {
|
||||
var json = new Object();
|
||||
json['id'] = makeid(6);
|
||||
json['jsonrpc'] = '2.0';
|
||||
json['method'] = 'I2PControl';
|
||||
json['params'] = new Object();
|
||||
json['params']['Token'] = token;
|
||||
json['params']['Stat'] = Query;
|
||||
json['params']['Period'] = 2000;
|
||||
return send(json, control_host, control_port, control_path);
|
||||
}
|
||||
let token = GetToken(password, control_host, control_port, control_path);
|
||||
let done = await token.then(getrate);
|
||||
return done;
|
||||
}
|
||||
|
||||
function UpdateGetRateElementByID(
|
||||
Query,
|
||||
ID,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc"
|
||||
) {
|
||||
function updateelement(update) {
|
||||
//console.log("(i2pcontrol)", update);
|
||||
if (document.getElementById(ID) !== null)
|
||||
document.getElementById(ID).innerText = update;
|
||||
}
|
||||
let net = GetRate(Query, control_host, control_port, control_path, password);
|
||||
net.then(updateleement);
|
||||
}
|
||||
|
||||
async function I2PControl(
|
||||
Query,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function i2pcontrol(token) {
|
||||
var json = new Object();
|
||||
json['id'] = makeid(6);
|
||||
json['jsonrpc'] = '2.0';
|
||||
json['method'] = 'I2PControl';
|
||||
json['params'] = new Object();
|
||||
json['params']['Token'] = token;
|
||||
json['params'][Query] = null;
|
||||
return send(json, control_host, control_port, control_path);
|
||||
}
|
||||
let token = GetToken(password, control_host, control_port, control_path);
|
||||
let done = await token.then(i2pcontrol);
|
||||
return done;
|
||||
}
|
||||
|
||||
function UpdateI2PControlElementByID(
|
||||
Query,
|
||||
ID,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc"
|
||||
) {
|
||||
function updateelement(update) {
|
||||
//console.log("(i2pcontrol)", update);
|
||||
if (document.getElementById(ID) !== null)
|
||||
document.getElementById(ID).innerText = update;
|
||||
}
|
||||
let net = I2PControl(
|
||||
Query,
|
||||
control_host,
|
||||
control_port,
|
||||
control_path,
|
||||
password
|
||||
);
|
||||
net.then(updateleement);
|
||||
}
|
||||
|
||||
async function RouterInfo(
|
||||
Query,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function routerinfo(token) {
|
||||
var json = new Object();
|
||||
json['id'] = makeid(6);
|
||||
json['jsonrpc'] = '2.0';
|
||||
json['method'] = 'RouterInfo';
|
||||
json['params'] = new Object();
|
||||
json['params']['Token'] = token;
|
||||
json['params'][Query] = null;
|
||||
return send(json, control_host, control_port, control_path);
|
||||
}
|
||||
let token = GetToken(password, control_host, control_port, control_path);
|
||||
let done = await token.then(routerinfo);
|
||||
return done;
|
||||
}
|
||||
|
||||
function UpdateRouterInfoElementByID(
|
||||
Query,
|
||||
ID,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function updateelement(update) {
|
||||
/*console.log(
|
||||
"(i2pcontrol) element",
|
||||
update.result[Query],
|
||||
ID,
|
||||
document.getElementById(ID)
|
||||
);*/
|
||||
if (document.getElementById(ID) !== null)
|
||||
document.getElementById(ID).innerText = update.result[Query];
|
||||
}
|
||||
|
||||
let net = RouterInfo(
|
||||
Query,
|
||||
control_host,
|
||||
control_port,
|
||||
control_path,
|
||||
password
|
||||
);
|
||||
net.then(updateelement);
|
||||
}
|
||||
|
||||
async function RouterManager(
|
||||
Query,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function routermanager(token) {
|
||||
var json = new Object();
|
||||
json['id'] = makeid(6);
|
||||
json['jsonrpc'] = '2.0';
|
||||
json['method'] = 'RouterManager';
|
||||
json['params'] = new Object();
|
||||
json['params']['Token'] = token;
|
||||
json['params'][Query] = null;
|
||||
return send(json, control_host, control_port, control_path);
|
||||
}
|
||||
let token = GetToken(password, control_host, control_port, control_path);
|
||||
let done = await token.then(routermanager);
|
||||
return done;
|
||||
}
|
||||
|
||||
function UpdateRouterManagerElementByID(
|
||||
Query,
|
||||
ID,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function updateelement(update) {
|
||||
//console.log("(i2pcontrol)", update);
|
||||
if (document.getElementById(ID) !== null)
|
||||
document.getElementById(ID).innerText = update;
|
||||
}
|
||||
let net = RouterManager(
|
||||
Query,
|
||||
control_host,
|
||||
control_port,
|
||||
control_path,
|
||||
password
|
||||
);
|
||||
net.then(updateleement);
|
||||
}
|
||||
|
||||
async function NetworkSetting(
|
||||
Query,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function networksetting(token) {
|
||||
var json = new Object();
|
||||
json['id'] = makeid(6);
|
||||
json['jsonrpc'] = '2.0';
|
||||
json['method'] = 'NetworkSetting';
|
||||
json['params'] = new Object();
|
||||
json['params']['Token'] = token;
|
||||
json['params'][Query] = null;
|
||||
return send(json, control_host, control_port, control_path);
|
||||
}
|
||||
let token = GetToken(password, control_host, control_port, control_path);
|
||||
let done = await token.then(networksetting);
|
||||
return done;
|
||||
}
|
||||
|
||||
function UpdateNetworkSettingElementByID(
|
||||
Query,
|
||||
ID,
|
||||
control_host = "127.0.0.1",
|
||||
control_port = "7657",
|
||||
control_path = "jsonrpc",
|
||||
password = "itoopie"
|
||||
) {
|
||||
function updateelement(update) {
|
||||
//console.log("(i2pcontrol)", update);
|
||||
document.getElementById(ID).innerText = update;
|
||||
}
|
||||
let net = NetworkSetting(
|
||||
Query,
|
||||
control_host,
|
||||
control_port,
|
||||
control_path,
|
||||
password
|
||||
);
|
||||
net.then(updateleement);
|
||||
}
|
||||
|
||||
function UpdateContents() {
|
||||
UpdateRouterInfoElementByID('i2p.router.status', 'router-status');
|
||||
UpdateRouterInfoElementByID('i2p.router.uptime', 'router-uptime');
|
||||
UpdateRouterInfoElementByID('i2p.router.version', 'router-version');
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.net.bw.inbound.1s',
|
||||
'router-net-bw-inbound-1s'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.net.bw.inbound.15s',
|
||||
'router-net-bw-inbound-15s'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.net.bw.outbound.1s',
|
||||
'router-net-bw-outbound-1s'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.net.bw.outbound.15s',
|
||||
'router-net-bw-outbound-15s'
|
||||
);
|
||||
UpdateRouterInfoElementByID('i2p.router.net.status', 'router-net-status');
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.net.tunnels.participating',
|
||||
'router-net-tunnels-participating'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.netdb.activepeers',
|
||||
'router-netdb-activepeers'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.netdb.fastpeers',
|
||||
'router-netdb-fastpeers'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.netdb.highcapacitypeers',
|
||||
'router-netdb-highcapacitypeers'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.netdb.isreseeding',
|
||||
'router-netdb-isreseeding'
|
||||
);
|
||||
UpdateRouterInfoElementByID(
|
||||
'i2p.router.netdb.knownpeers',
|
||||
'router-netdb-knownpeers'
|
||||
);
|
||||
}
|
||||
|
||||
var done = Echo(hello);
|
||||
done.then(Done);
|
||||
|
||||
function Done(output) {
|
||||
console.log('(i2pcontrol) I2PControl connection tested,', output);
|
||||
return output;
|
||||
}
|
BIN
i2ppb-0.77@eyedeekay.github.io.xpi.torrent
Normal file
BIN
i2ppb@eyedeekay.github.io.xpi.torrent
Normal file
Before Width: | Height: | Size: 357 KiB After Width: | Height: | Size: 213 KiB |
BIN
i2psnark.png
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
i2ptunnel.png
Normal file
After Width: | Height: | Size: 209 KiB |
BIN
icons/browse.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
icons/i2plogo.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
icons/torrents.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
images/gear.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
59
images/restart.svg
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="restart.svg"
|
||||
id="svg22"
|
||||
version="1.1"
|
||||
viewBox="0 0 512 512"
|
||||
role="img"
|
||||
class="svg-inline--fa fa-sync-alt fa-w-16"
|
||||
data-icon="sync-alt"
|
||||
data-prefix="fas"
|
||||
focusable="false"
|
||||
aria-hidden="true">
|
||||
<metadata
|
||||
id="metadata28">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs26" />
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="svg22"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="31"
|
||||
inkscape:window-x="0"
|
||||
inkscape:cy="256"
|
||||
inkscape:cx="256"
|
||||
inkscape:zoom="1.6757812"
|
||||
showgrid="false"
|
||||
id="namedview24"
|
||||
inkscape:window-height="1026"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<path
|
||||
style="fill:#526bce;fill-opacity:1"
|
||||
id="path20"
|
||||
d="M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z"
|
||||
fill="currentColor" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
59
images/shutdown.svg
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="shutdown.svg"
|
||||
id="svg32"
|
||||
version="1.1"
|
||||
viewBox="0 0 512 512"
|
||||
role="img"
|
||||
class="svg-inline--fa fa-power-off fa-w-16"
|
||||
data-icon="power-off"
|
||||
data-prefix="fas"
|
||||
focusable="false"
|
||||
aria-hidden="true">
|
||||
<metadata
|
||||
id="metadata38">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs36" />
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="svg32"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="31"
|
||||
inkscape:window-x="0"
|
||||
inkscape:cy="256"
|
||||
inkscape:cx="256"
|
||||
inkscape:zoom="1.6757812"
|
||||
showgrid="false"
|
||||
id="namedview34"
|
||||
inkscape:window-height="1026"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<path
|
||||
style="fill:#526bce;fill-opacity:1"
|
||||
id="path30"
|
||||
d="M400 54.1c63 45 104 118.6 104 201.9 0 136.8-110.8 247.7-247.5 248C120 504.3 8.2 393 8 256.4 7.9 173.1 48.9 99.3 111.8 54.2c11.7-8.3 28-4.8 35 7.7L162.6 90c5.9 10.5 3.1 23.8-6.6 31-41.5 30.8-68 79.6-68 134.9-.1 92.3 74.5 168.1 168 168.1 91.6 0 168.6-74.2 168-169.1-.3-51.8-24.7-101.8-68.1-134-9.7-7.2-12.4-20.5-6.5-30.9l15.8-28.1c7-12.4 23.2-16.1 34.8-7.8zM296 264V24c0-13.3-10.7-24-24-24h-32c-13.3 0-24 10.7-24 24v240c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24z"
|
||||
fill="currentColor" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
222
index.html
Normal file
@@ -0,0 +1,222 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>I2P in Private Browsing Mode</title>
|
||||
<link href="home.css" rel="stylesheet" type="text/css">
|
||||
<link href="sidebar.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<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>
|
||||
|
||||
<h2>Privacy Policy</h2>
|
||||
|
||||
<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>
|
||||
|
||||
<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>This browser extension is entirely Free, Open-Source software.</p>
|
||||
|
||||
<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>
|
||||
<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:991cc1181d816c20629caef454ebabf14785fbf7">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 alt="Landing page" src="lander.png" 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 alt="Menu" src="menu.png" 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 alt="Visiting i2p-projekt.i2p" src="i2psetproxy.js.png" 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 alt="Visiting webmail" src="susimail.png" 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 alt="Visiting i2ptunnel" src="i2ptunnel.png" 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 alt="Visiting toopie.html" src="toopie.png" title="">
|
||||
</li>
|
||||
|
||||
<li>[Done] <strong>Handle</strong> router console applications under their own origins and within their own contextual identity. (1) The router console is automatically confined to it's own container tab. (2) Use a custom protocol handler to place each i2p application/plugin under it's own origin, shortening router console URL's and placing applications under their own origin.</li>
|
||||
|
||||
<li><img alt="Visiting routerconsole" src="routerconsole.png" title="">
|
||||
</li>
|
||||
|
||||
<li>[Done] <strong>Handle Torrents</strong> by talking to i2psnark-rpc plugin and then adding them directly into the Firefox downloads drop-downs, menus, etc. 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>
|
||||
|
||||
<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>
|
||||
|
||||
<li>[Started] <strong>Enhance</strong> the I2P browsing experience by allowing site developers distribute some or all of their resources as torrents, allowing the torrents to be treated effectively as a CDN.</li>
|
||||
|
||||
<li>[barely started] <strong>Isolate</strong> traffic by contextual identity to it's own HTTP Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The contextual identities. For now, the contextual identities used to manage browsing are "I2P Browsing" and "Web Browsing" where I2P Browsing is capable of using an outproxy but in the case of traffic destined for the clearnet does not do header rewriting, and Web Browsing falls back to the Proxy configured in Firefox. The I2P Browsing will be expanded to
|
||||
<ul>
|
||||
<li>I2P Amnesiac Browsing: Use for General Browsing, stores no history and uses an HTTP Proxy with a very short tunnel-close timeout and no key-reuse.</li>
|
||||
|
||||
<li>I2P Social Networking: Use this for logging into social network accounts, forums, and other interactive asynchronous public communication platforms where your identity is behaviorally linkable. This has a very long tunnel-close timeout and key-reuse until specifically invoked.</li>
|
||||
|
||||
<li>I2P Blogging: Use this for posting content to the web interface of your blog or to other similar websites that you create content on.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><img alt="Visiting clearweb" src="clearweb.png" title="">
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Video</h3>
|
||||
|
||||
<ul>
|
||||
<li><img alt="Video of the plugin in action" src="i2psetproxy.js.gif" title="">
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>Documents</h2>
|
||||
|
||||
<ul>
|
||||
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Browser.Design.Documentation.pdf">Browser Outline</a></strong>: This document is an outline of each of the browser extension's feature panels in presentation form.</li>
|
||||
|
||||
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Landing.Page.Documentation.pdf">Smart Lander Design</a></strong>: This is the original outline of the smart landing page which became the I2P home page within the browser and the drop-down control panel.</li>
|
||||
|
||||
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/wiki/Other-Extensions">Other extensions</a></strong>: and how they work with this one.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Super Extra Important Background Info:</h2>
|
||||
|
||||
<p>This plugin's viability is directly related to the viability of Mozilla and Tor's work on hardening Firefox itself and of particular interest are the "Uplift" and "Fusion(Firefox Using Onions)" projects.</p>
|
||||
|
||||
<h3>Links about Project Uplift</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://wiki.mozilla.org/Security/Tor_Uplift">Tor Uplift</a> is a project which brings important features of the Tor Browser to the mainstream of Firefox users by including patches from Tor Browser Bundle into Firefox where it is appropriate.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://wiki.mozilla.org/Security/FirstPartyIsolation">First Party Isolation</a> is a feature in Firefox and other browsers which keeps information from leaking across first-party domains.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://wiki.mozilla.org/Security/Fingerprinting">Fingerprinting</a> is a technique where a tracker attempts to extract unique information about a user from a side-channel in order to create an identifier that can be used to correlate the user across many sites.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://wiki.mozilla.org/Security/Fennec%2BTor_Project">Fennec</a> is Firefox for Android and this link has some analysis of the privacy consequences of the Android platform.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://wiki.mozilla.org/Security/Tor_Uplift/Tracking">Tracking</a> in Firefox is surveyed here.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Project uplift seems to have largely been accomplished?</p>
|
||||
|
||||
<h3>Links about Project Fusion</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://wiki.mozilla.org/Security/Fusion">Project Fusion</a> or Firefox using Onions is a joint Mozilla/Tor effort to create an enhanced Private Browsing mode for Firefox which uses Tor.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject">Notes</a> from a meeting about Fusion.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://blog.torproject.org/tor-heart-firefox">Tor at the Heart: Firefox</a> is a blog about Tor and the relationship they have to Firefox re: TBB, Fusion.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>The <strong>Other</strong> Version</h2>
|
||||
|
||||
<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>
|
||||
<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>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>
|
72
info.css
@@ -1,18 +1,66 @@
|
||||
html, body {
|
||||
width: 350px;
|
||||
body,
|
||||
html {
|
||||
width: 450px
|
||||
}
|
||||
|
||||
a {
|
||||
margin: 10px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin: 5px;
|
||||
width: 450px;
|
||||
height: 450px
|
||||
}
|
||||
.panel-section-header {
|
||||
width: 450px
|
||||
}
|
||||
#text-section-torrents-header {
|
||||
width: 450px
|
||||
}
|
||||
|
||||
span.identity {
|
||||
width: 100px;
|
||||
display: inline-block;
|
||||
margin-left: 1em;
|
||||
width: 450px;
|
||||
display: block;
|
||||
margin-left: 1em
|
||||
}
|
||||
figcaption {
|
||||
display: block
|
||||
}
|
||||
.section-header {
|
||||
margin-bottom: 8px
|
||||
}
|
||||
p {
|
||||
font-size: 12px
|
||||
}
|
||||
h1 {
|
||||
font-size: 25px
|
||||
}
|
||||
h2,
|
||||
h3 {
|
||||
font-size: 18px
|
||||
}
|
||||
h4 {
|
||||
font-size: 13px!important
|
||||
}
|
||||
#links .showhider {
|
||||
font-size: 18px
|
||||
}
|
||||
#onboarding {
|
||||
font-size: 2rem
|
||||
}
|
||||
img.readyness {
|
||||
height: 2rem
|
||||
}
|
||||
#proxyUnready {
|
||||
min-height: 2rem
|
||||
}
|
||||
#proxyReady {
|
||||
min-height: 2rem
|
||||
}
|
||||
#consoleOn {
|
||||
min-height: 2rem
|
||||
}
|
||||
#torrentpanel {
|
||||
display: none
|
||||
}
|
||||
.torrent-progress {
|
||||
width: 90%
|
||||
}
|
||||
.tabicon {
|
||||
width: 32px
|
||||
}
|
346
info.js
@@ -1,50 +1,346 @@
|
||||
document.addEventListener("click", e => {
|
||||
function getCurrentWindow() {
|
||||
return chrome.windows.getCurrent();
|
||||
}
|
||||
function checkPeerConnection() {
|
||||
let getting = browser.privacy.network.peerConnectionEnabled.get({});
|
||||
getting.then((got) => {
|
||||
let webrtc = got.value;
|
||||
console.log('checking webrtc', webrtc);
|
||||
if (document.getElementById('enable-web-rtc') !== null)
|
||||
document.getElementById('enable-web-rtc').checked = webrtc;
|
||||
});
|
||||
}
|
||||
|
||||
if (e.target.id === "window-create-help-panel") {
|
||||
checkPeerConnection();
|
||||
|
||||
function checkSnowflake() {
|
||||
try {
|
||||
function snowflake(snowflake) {
|
||||
console.log("snowflake plugin found, leaving WebRTC alone", snowflake);
|
||||
AssurePeerConnection();
|
||||
}
|
||||
var snowflakeInfo = browser.management.get(
|
||||
"{b11bea1f-a888-4332-8d8a-cec2be7d24b9}" // string
|
||||
);
|
||||
snowflakeInfo.then(snowflake);
|
||||
} catch {
|
||||
console.log("snowflake not found");
|
||||
}
|
||||
}
|
||||
|
||||
checkSnowflake();
|
||||
|
||||
function checkHistory() {
|
||||
let getting = browser.storage.local.get("disable_history");
|
||||
getting.then((got) => {
|
||||
let disable_history = got.disable_history;
|
||||
if (disable_history == undefined) {
|
||||
disable_history = false;
|
||||
}
|
||||
console.log("checking history", disable_history);
|
||||
if (document.getElementById("disable-history") !== null)
|
||||
document.getElementById("disable-history").checked = disable_history;
|
||||
});
|
||||
}
|
||||
|
||||
checkHistory();
|
||||
|
||||
document.addEventListener("click", (clickEvent) => {
|
||||
if (clickEvent.target.id === "window-create-help-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true
|
||||
incognito: true,
|
||||
};
|
||||
let creating = chrome.windows.create(createData);
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(() => {
|
||||
console.log("The help panel has been created");
|
||||
});
|
||||
} else if (e.target.id === "window-create-news-panel") {
|
||||
} else if (clickEvent.target.id === "window-create-news-panel") {
|
||||
let createData = {
|
||||
type: "panel",
|
||||
incognito: true
|
||||
incognito: true,
|
||||
};
|
||||
let creating = chrome.windows.create(createData);
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(() => {
|
||||
console.log("The news panel has been created");
|
||||
});
|
||||
} else if (e.target.id === "generate-fresh-tunnel") {
|
||||
function RefreshIdentity() {
|
||||
} else if (clickEvent.target.id === "visit-irc") {
|
||||
browser.sidebarAction.setPanel({ panel: "http://127.0.0.1:7669" });
|
||||
browser.sidebarAction.open();
|
||||
} else if (clickEvent.target.id === "generate-fresh-tunnel") {
|
||||
function refreshIdentity() {
|
||||
console.log("Generating new identity");
|
||||
const Http = new XMLHttpRequest();
|
||||
const url = "http://" + controlHost + ":" + controlPort;
|
||||
Http.open("GET", url);
|
||||
Http.send();
|
||||
Http.onreadystatechange = e => {
|
||||
Http.onreadystatechange = (event) => {
|
||||
console.log(Http.responseText);
|
||||
};
|
||||
}
|
||||
RefreshIdentity();
|
||||
} else if (e.target.id === "window-preface-title") {
|
||||
getCurrentWindow().then(currentWindow => {
|
||||
let updateInfo = {
|
||||
titlePreface: "I2P Help | "
|
||||
};
|
||||
chrome.windows.update(currentWindow.id, updateInfo);
|
||||
});
|
||||
} else if (e.target.id === "clear-browser-data") {
|
||||
refreshIdentity();
|
||||
} else if (clickEvent.target.id === "label-router-restart") {
|
||||
console.log("attempting to initiate graceful restart");
|
||||
RouterManager("RestartGraceful");
|
||||
} else if (clickEvent.target.id === "label-router-shutdown") {
|
||||
console.log("attempting to initiate graceful shutdown");
|
||||
RouterManager("ShutdownGraceful");
|
||||
} else if (clickEvent.target.id === "label-router-status") {
|
||||
if (document.getElementById("label-status-list").style.display !== "none") {
|
||||
console.log("hiding label-status-list");
|
||||
document.getElementById("label-status-list").style.display = "none";
|
||||
} else {
|
||||
console.log("showing label-status-list");
|
||||
document.getElementById("label-status-list").style.display = "block";
|
||||
}
|
||||
} else if (clickEvent.target.id === "label-router-peers") {
|
||||
if (document.getElementById("label-peers-list").style.display !== "none") {
|
||||
console.log("hiding label-peers-list");
|
||||
document.getElementById("label-peers-list").style.display = "none";
|
||||
} else {
|
||||
console.log("showing label-peers-list");
|
||||
document.getElementById("label-peers-list").style.display = "block";
|
||||
}
|
||||
} else if (clickEvent.target.id === "label-router-bandwidth") {
|
||||
if (
|
||||
document.getElementById("label-bandwidth-list").style.display !== "none"
|
||||
) {
|
||||
console.log("hiding label-bandwidth-list");
|
||||
document.getElementById("label-bandwidth-list").style.display = "none";
|
||||
} else {
|
||||
console.log("showing label-bandwidth-list");
|
||||
document.getElementById("label-bandwidth-list").style.display = "block";
|
||||
}
|
||||
} else if (clickEvent.target.id === "search-submit") {
|
||||
console.log("attempting to create search tab");
|
||||
goSearch();
|
||||
} else if (clickEvent.target.id === "browser-action") {
|
||||
console.log("showing a browser action");
|
||||
showBrowsing();
|
||||
} else if (clickEvent.target.id === "torrent-action") {
|
||||
console.log("showing a torrent action");
|
||||
showTorrentsMenu();
|
||||
} else if (clickEvent.target.id === "window-preface-title") {
|
||||
console.log("attempting to create homepage tab");
|
||||
goHome();
|
||||
} else if (clickEvent.target.id === "window-visit-index") {
|
||||
console.log("attempting to create index tab");
|
||||
goIndex();
|
||||
} else if (clickEvent.target.id === "window-visit-homepage") {
|
||||
console.log("attempting to create homepage tab");
|
||||
goHome();
|
||||
} else if (clickEvent.target.id === "window-visit-toopie") {
|
||||
console.log("attempting to create toopie tab");
|
||||
goToopie();
|
||||
} else if (clickEvent.target.id === "window-visit-i2ptunnel") {
|
||||
console.log("attempting to create i2ptunnel tab");
|
||||
goTunnel();
|
||||
} else if (clickEvent.target.id === "window-visit-susimail") {
|
||||
console.log("attempting to create susimail tab");
|
||||
goMail();
|
||||
} else if (clickEvent.target.id === "window-visit-snark") {
|
||||
console.log("attempting to create snark tab");
|
||||
goSnark();
|
||||
} else if (clickEvent.target.id === "clear-browser-data") {
|
||||
forgetBrowsingData();
|
||||
} else if (e.target.id === "check-i2p-control") {
|
||||
echo("I2P Router Detected", "panel-section-i2pcontrol-check");
|
||||
} else if (clickEvent.target.id === "check-i2p-control") {
|
||||
//echo("I2P Router Detected", "panel-section-i2pcontrol-check");
|
||||
} else if (clickEvent.target.id === "enable-web-rtc") {
|
||||
if (clickEvent.target.checked) {
|
||||
browser.runtime.sendMessage({ rtc: "enableWebRTC" });
|
||||
} else {
|
||||
browser.runtime.sendMessage({ rtc: "disableWebRTC" });
|
||||
}
|
||||
checkPeerConnection();
|
||||
return;
|
||||
} else if (clickEvent.target.id === "disable-history") {
|
||||
if (clickEvent.target.checked) {
|
||||
browser.runtime.sendMessage({ history: "disableHistory" });
|
||||
} else {
|
||||
browser.runtime.sendMessage({ history: "enableHistory" });
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
clickEvent.preventDefault();
|
||||
});
|
||||
|
||||
window.onload = function (e) {
|
||||
if (document.getElementById("label-peers-list") != null) {
|
||||
document.getElementById("label-peers-list").style.display = "none";
|
||||
}
|
||||
if (document.getElementById("label-bandwidth-list") != null) {
|
||||
document.getElementById("label-bandwidth-list").style.display = "none";
|
||||
}
|
||||
};
|
||||
|
||||
function proxyReadiness() {
|
||||
console.log(this.responseText);
|
||||
}
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != "android") {
|
||||
browser.history.onVisited.addListener(onVisited);
|
||||
}
|
||||
});
|
||||
|
||||
function showBrowsing() {
|
||||
var x = document.getElementById("browserpanel");
|
||||
x.style.display = "block";
|
||||
var y = document.getElementById("torrentpanel");
|
||||
y.style.display = "none";
|
||||
}
|
||||
|
||||
function showTorrentsMenu() {
|
||||
var x = document.getElementById("browserpanel");
|
||||
x.style.display = "none";
|
||||
var y = document.getElementById("torrentpanel");
|
||||
y.style.display = "block";
|
||||
}
|
||||
|
||||
function goHome() {
|
||||
function gotProxyInfo(info) {
|
||||
let port = info.value.http.split(":")[1];
|
||||
if (port == "7644") {
|
||||
let createRhizomeData = {
|
||||
url: "about:I2p",
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createRhizomeData);
|
||||
creating.then(onTabCreated, onTabError);
|
||||
} else {
|
||||
let createData = {
|
||||
url: "home.html",
|
||||
};
|
||||
console.log("visiting homepage");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(onTabCreated, onTabError);
|
||||
}
|
||||
console.log("(bookmarks) adding home page bookmark");
|
||||
}
|
||||
console.log("(bookmarks) checking if we're running in an I2P Browser");
|
||||
var gettingProxyInfo = browser.proxy.settings.get({});
|
||||
gettingProxyInfo.then(gotProxyInfo);
|
||||
}
|
||||
|
||||
function goIndex() {
|
||||
function onTabError() {
|
||||
console.log("Help tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "index.html",
|
||||
};
|
||||
console.log("visiting help");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function goToopie() {
|
||||
function onTabError() {
|
||||
console.log("Toopie tab created");
|
||||
}
|
||||
console.log("visiting toopie");
|
||||
let creating = browser.sidebarAction.open();
|
||||
creating.then(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function onTabCreated() {
|
||||
console.log("Tab Created");
|
||||
}
|
||||
|
||||
function goSearch() {
|
||||
function onTabError() {
|
||||
console.log("Search tab created");
|
||||
}
|
||||
let createData = {
|
||||
url:
|
||||
"http://yacy.idk.i2p/yacysearch.html?" +
|
||||
"query=" +
|
||||
document.getElementById("search-query").value,
|
||||
};
|
||||
console.log("visiting legwork");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function routerAddr() {
|
||||
if (!control_host) var control_host = "127.0.0.1";
|
||||
if (!control_port) var control_port = "7657";
|
||||
return control_host + ":" + control_port;
|
||||
}
|
||||
|
||||
function goTunnel() {
|
||||
function onTabError() {
|
||||
console.log("I2PTunnel tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + routerAddr() + "/i2ptunnel",
|
||||
};
|
||||
console.log("visiting i2ptunnel");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function goMail() {
|
||||
function onTabError() {
|
||||
console.log("Mail tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + routerAddr() + "/susimail",
|
||||
};
|
||||
console.log("visiting mail");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function goSnark() {
|
||||
function onTabError() {
|
||||
console.log("Snark tab created");
|
||||
}
|
||||
let createData = {
|
||||
url: "http://" + routerAddr() + "/i2psnark",
|
||||
};
|
||||
console.log("visiting snark");
|
||||
let creating = browser.tabs.create(createData);
|
||||
creating.then(onTabCreated, onTabError);
|
||||
}
|
||||
|
||||
function onVisited(historyItem) {
|
||||
function onCleaned(results) {
|
||||
if (results.length) {
|
||||
console.log(" was not removed");
|
||||
} else {
|
||||
console.log(" was removed");
|
||||
}
|
||||
}
|
||||
|
||||
function onRemoved() {
|
||||
var searching = browser.history.search({
|
||||
text: historyItem.url,
|
||||
startTime: 0,
|
||||
});
|
||||
searching.then(onCleaned);
|
||||
}
|
||||
if (!history) {
|
||||
if (i2pHost(historyItem.url)) {
|
||||
var deletingUrl = browser.history.deleteUrl(historyItem.url);
|
||||
}
|
||||
deletingUrl.then(onRemoved);
|
||||
}
|
||||
}
|
||||
|
||||
if (UpdateContents !== undefined) UpdateContents();
|
||||
|
||||
const minutes = 0.2;
|
||||
const interval = minutes * 60 * 1000;
|
||||
|
||||
setInterval(function () {
|
||||
if (UpdateContents !== undefined) UpdateContents();
|
||||
}, interval);
|
||||
|
||||
fetch("http://127.0.0.1:7669").then((myJson) => {
|
||||
if (myJson.status == 200) {
|
||||
let irc = document.getElementById("visit-irc");
|
||||
if (irc != null) {
|
||||
irc.classList.remove("hidden");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
76
issues.csv
Normal file
@@ -0,0 +1,76 @@
|
||||
"title","description"
|
||||
"Moar Bookmarks","A larger set of default bookmarks in their own directory would probably be good. Stuff like the forums, zzz's forums, gitlab, stats, identiguy, postman, echobot test, fingerprint test, etc."
|
||||
"privacy-breach-generic false positive with lintian","We make a request to proxy.i2p, a sort of loopback site, to ensure that the proxy is ready for the browser and provide user feedback. Lintian sees proxy.i2p as a remote site, which it isn't. Given this, the Warning issued by lintian is a false positive. This should be handled somehow."
|
||||
"App-tabs for Project sites?","Not sure if this is a good idea. May want to talk to Simply Secure about it."
|
||||
"Descriptive Proxy Error Page","When the proxy isn't ready, but the user enters an I2P browsing tab, provide a descriptive error page to guide the user to a solution, even if that solution is to tell them to wait 2 minutes.
|
||||
|
||||
States should be described:
|
||||
|
||||
- Router Not Present: There is no indication that I2P is installed on the system. Direct them to an I2P distribution.
|
||||
- HTTP Proxy Not Ready: The router is present, but the HTTP Proxy is not up yet. Wait 2 minutes, if t>2 minutes, direct them to /i2ptunnel to troubleshoot."
|
||||
"More intuitive history management, better programming interface","Right now history management is from before it used contextual identities, with some hacks on top. It needs to be changed to a better interface, which simply takes a contextual identity and clears history based on that information. This will improve security, reliability, and be useful in non-I2P contexts in the future."
|
||||
"Reseed over WebRTC Data Channel","This can't be done in just this extension, but this extension is probably an important component of a future plan in which this is straightforward. This is the trickiest thing I've tried so far, K, let's define some phases here...
|
||||
|
||||
Phase 0: Design
|
||||
=============
|
||||
|
||||
We're pretty different from Tor in the places where Snowflake would really matter, but it's an inspiring effort and a cool product. This process probably won't bear much resemblance to Snowflake when it's all designed, but Snowflake was the original inspiration for the idea.
|
||||
|
||||
What we want to do is make it possible for I2P users to easily reseed eachother in a peer-to-peer way when necessary. It must be done no more often than a normal reseed, and it must only ever be client initiated.
|
||||
|
||||
This is **not** a webRTC transport for I2P. That would be an entirely different project. Especially if it were to do something genuinely insane like try to incorporate browser users not otherwise running I2P into the routing process. That would be crazy, right? Right? (It might not actually be that crazy but I have enough to think about right now). This is only for reseeds.
|
||||
|
||||
Questions
|
||||
--------------
|
||||
|
||||
- Where to get the reseed file? Locally or from a reseed server? Probably a server, and we act as a proxy, but we need to examine advantages and disadvantages of each. Maybe both, server then a local fallback?
|
||||
- Do we need to geolocate and never fetch a reseed file for a user in a country which is already automatically in hidden mode? Probably yes. Might want to never make them reseed helpers anyway.
|
||||
- How to distribute the reseed file? If it comes from a server it will be signed by a key we already trust, that's fine, but if it comes from somewhere local we may want to use an interstitial
|
||||
|
||||
Components
|
||||
-----------------
|
||||
|
||||
- Browser Extension - This repo. We use it because we can to some extent assume that people using this extension are also using I2P and can thus provide a reseed from a local source if need be.
|
||||
- Javascript Import - Placed on web pages, a'la Snowflake and or Flashproxy. Shows a download link that says Download reseed file over WebRTC, uses a (random?) extension user.
|
||||
- Native Proxy - Runs locally, obviates the need to download the reseed in a browser by fetching it over WebRTC on behalf of the router. Will start out as a Bridge but eventually be incorporated into I2P if successful.
|
||||
1. Go version, using pion/webrtc
|
||||
2. Java version, using whatever that Guardian Project library is probably
|
||||
|
||||
Phase 1: Manual Mode
|
||||
=================
|
||||
|
||||
Components required
|
||||
-----------------------------
|
||||
|
||||
- Browser Extension
|
||||
- Javascript Import
|
||||
|
||||
|
||||
Phase 2: Bridged Prototype
|
||||
====================
|
||||
|
||||
- Native Proxy, Go Version
|
||||
|
||||
Phase 3: Router Incorporation
|
||||
======================
|
||||
|
||||
- Native Proxy, Java Version
|
||||
"
|
||||
"Torbrowser","Are there any plans to support the Torbrowser?
|
||||
"
|
||||
"Use pageAction to indicate Security Status of I2P Sites(TLS, etc)","https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/pageAction"
|
||||
"SSH in the Browser?","TODO"
|
||||
"Dat Support?","TODO"
|
||||
"Secure configuration of tunnels for RPC remotes","Eventually we'll have to have configuration for different RPC endpoints for I2PControl and Bittorrent, from there it's not a stretch to let remote clients be controlled over i2p tunnels as well, but in this case we need to make sure that we require the password to be changed from the default and possibly look into using encrypted leasesets here too."
|
||||
"Tidy up the settings and document where they come from and what they do","Now that this is getting more and cooler features, I need to go over what all the settings are, how they're configured, which ones are obsolete and which ones needs to be created to fully realize all the cool stuff this plugin can do. This should be done before I even introduce settings for the torrent RPC protocols which makes it another blocker for the next version."
|
||||
"Internationalize website","The plugin itself supports multiple languages, but the website does not. I should fix that up ASAP."
|
||||
"Plugin Tab: I2P-Bote","An I2P-Bote plugin tab is a good idea too, but a low priority since Bote isn't very active right now."
|
||||
"Style Guide","Develop a consistent style guide."
|
||||
"Cool idea: tab or window.privacy API","Design webextension experiment."
|
||||
"Uplifting 3: Letterboxing","I dunno what's up here. This setting is privacy.resistFingerprinting.letterboxing=true or something like that. If seems like the privacy.websites.resistFingerprinting API should enables privacy.resistFingerprinting."
|
||||
"Uplifting 2: audio stuff","Work with Mozilla to disable fingerprintable audio API's when privacy.resistFingerprinting=true."
|
||||
"Uplifting 1: webgl","Work with Mozilla to finish webgl requirements for resistFingerprinting."
|
||||
"FoxyProxy Compatibility?","This extension currently *Breaks the expected behavior of FoxyProxy* by enforcing it's rules over those described by FoxyProxy. This one might be more trouble than it's worth, in fact I think it probably is, but if it isn't, this is a nice-to-have for some of the longtime Foxy users to ease their transition. "
|
||||
"Android","Somewhere in the past few releases I broke Android, probably while I was making the window-management less irritating. Find+fix."
|
||||
"Whonix","I2P integration in Whonix is running into the problem of making the router console available(Which requires either a proxy exception or an extra proxy like Privoxy) without making the whole localhost available. Since that's a problem this can solve, after I deal with the linting stuff I need to get back in touch with them. Right now I'm also (ab)using include-binaries, I'll need to resolve that too."
|
||||
"Update channel for non-AMO Webextension","TODO:"
|
|
BIN
lander.png
Normal file
After Width: | Height: | Size: 237 KiB |
36
location.html
Normal file
@@ -0,0 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link href="search.css" rel="stylesheet">
|
||||
<link href="home.css" rel="stylesheet">
|
||||
<!--<link href="info.css" rel="stylesheet">--><!--<link href="torrent/popup.css" rel="stylesheet">-->
|
||||
|
||||
<title>
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="browserpanel">
|
||||
<div class="panel">
|
||||
<div class="section-header panel-section panel-section-header" id="headline">
|
||||
<div class="text-section-header" id="text-section-header">
|
||||
<h1 id="text-section-header">This site offers an anonymous mirror on I2P</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<ul>
|
||||
<li>
|
||||
<div class="address-info">
|
||||
<span id="TypeLabel">Alternate Addresses:</span> <span id="Type"></span>
|
||||
<div id="TypeInfo">
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<script src="location.js"></script>
|
||||
</body>
|
||||
</html>
|
19
location.js
Normal file
@@ -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);
|
@@ -7,11 +7,16 @@
|
||||
},
|
||||
"permissions": [
|
||||
"theme",
|
||||
"alarms",
|
||||
"browsingData",
|
||||
"bookmarks",
|
||||
"contextMenus",
|
||||
"management",
|
||||
"notifications",
|
||||
"proxy",
|
||||
"privacy",
|
||||
"storage",
|
||||
"webNavigation",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"contextualIdentities",
|
||||
@@ -22,38 +27,76 @@
|
||||
],
|
||||
"manifest_version": 2,
|
||||
"name": "__MSG_extensionName__",
|
||||
"version": "0.36",
|
||||
"version": "0.91",
|
||||
"description": "__MSG_extensionDescription__",
|
||||
"homepage_url": "https://github.com/eyedeekay/i2psetproxy.js",
|
||||
"homepage_url": "https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox",
|
||||
"icons": {
|
||||
"48": "icons/toopie.png"
|
||||
"48": "icons/i2plogo.png"
|
||||
},
|
||||
"browser_action": {
|
||||
"browser_style": true,
|
||||
"default_icon": "icons/toopie.png",
|
||||
"default_icon": "icons/i2plogo.png",
|
||||
"default_title": "__MSG_extensionName__",
|
||||
"default_popup": "window.html"
|
||||
},
|
||||
"sidebar_action": {
|
||||
"browser_style": true,
|
||||
"default_icon": "icons/i2plogo.png",
|
||||
"default_title": "__MSG_toopieName__",
|
||||
"default_panel": "toopie.html",
|
||||
"open_at_install": false
|
||||
},
|
||||
"page_action": {
|
||||
"browser_style": true,
|
||||
"default_title": "__MSG_toopieTLS__",
|
||||
"default_icon": "icons/toopie.png",
|
||||
"show_matches": [
|
||||
"http://*.i2p/*",
|
||||
"https://*.i2p/*",
|
||||
"http://*.b32.i2p/*",
|
||||
"https://*.b32.i2p/*"
|
||||
],
|
||||
"pinned": true
|
||||
},
|
||||
"options_ui": {
|
||||
"page": "options/options.html"
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["<all_urls>"],
|
||||
"js": ["script.js"]
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"persistent": true,
|
||||
"scripts": [
|
||||
"chromium/browser-polyfill.js",
|
||||
"config.js",
|
||||
"torrent/common.js",
|
||||
"torrent/background.js",
|
||||
"i2pcontrol/i2pcontrol.js",
|
||||
"host.js",
|
||||
"privacy.js",
|
||||
"platform.js",
|
||||
"background.js",
|
||||
"handler.js",
|
||||
"proxy.js",
|
||||
"info.js",
|
||||
"i2pcontrol.js",
|
||||
"scrub.js"
|
||||
"home.js",
|
||||
"scrub.js",
|
||||
"bookmarks.js"
|
||||
]
|
||||
},
|
||||
"protocol_handlers": [{
|
||||
"protocol": "web+rc",
|
||||
"name": "RouterConsole",
|
||||
"uriTemplate": "http://router.console/?%s"
|
||||
}],
|
||||
"protocol_handlers": [
|
||||
{
|
||||
"protocol": "ext+rc",
|
||||
"name": "RouterConsole",
|
||||
"uriTemplate": "http://127.0.0.1:7657/%s"
|
||||
},
|
||||
{
|
||||
"protocol": "magnet",
|
||||
"name": "I2PTorrent",
|
||||
"uriTemplate": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent"
|
||||
}
|
||||
],
|
||||
"default_locale": "en"
|
||||
}
|
||||
|
||||
|
@@ -1,62 +1,52 @@
|
||||
body {
|
||||
width: 25em;
|
||||
font-family: "Open Sans Light", sans-serif;
|
||||
font-family: "Open Sans Light",sans-serif;
|
||||
font-size: 0.9em;
|
||||
font-weight: 300;
|
||||
font-weight: 300
|
||||
}
|
||||
|
||||
section.scheme-options {
|
||||
padding: 0.5em 0;
|
||||
margin: 1em 0;
|
||||
margin: 1em 0
|
||||
}
|
||||
|
||||
#clear-button {
|
||||
margin: 0 1.3em 1em 0;
|
||||
margin: 0 1.3em 1em 0
|
||||
}
|
||||
|
||||
#clear-button,
|
||||
section.scheme-options input,
|
||||
section.scheme-options>select,
|
||||
#clear-button {
|
||||
float: right;
|
||||
section.scheme-options>select {
|
||||
|
||||
}
|
||||
|
||||
label {
|
||||
display: block;
|
||||
padding: 0.2em 0;
|
||||
margin-top: 1em
|
||||
}
|
||||
|
||||
label:hover {
|
||||
background-color: #EAEFF2;
|
||||
background-color: #eaeff2
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
width: 100%
|
||||
}
|
||||
|
||||
html, body {
|
||||
width: 350px;
|
||||
body,
|
||||
html {
|
||||
width: 100%
|
||||
}
|
||||
|
||||
a {
|
||||
margin: 10px;
|
||||
display: inline-block;
|
||||
margin: 10px
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin: 5px;
|
||||
margin: 5px
|
||||
}
|
||||
|
||||
span.identity {
|
||||
width: 100px;
|
||||
display: inline-block;
|
||||
margin-left: 1em;
|
||||
margin-left: 1em
|
||||
}
|
||||
|
||||
.control-options {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.identity-options {
|
||||
display: none;
|
||||
display: none
|
||||
}
|
||||
input {
|
||||
|
||||
}
|
||||
div {
|
||||
width: 100%!important
|
||||
}
|
@@ -1,51 +1,95 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="options.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<link href="/home.css" rel="stylesheet">
|
||||
<link href="options.css" rel="stylesheet">
|
||||
<title>
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<section class="scheme-options">
|
||||
<span class="title">Proxy Scheme:</span> <select id="proxy_scheme">
|
||||
<option selected value="http">
|
||||
HTTP
|
||||
</option>
|
||||
<option value="socks5">
|
||||
SOCKS5
|
||||
</option>
|
||||
</select>
|
||||
</section>
|
||||
|
||||
<section class="scheme-options">
|
||||
<span class="title">Proxy Scheme:</span>
|
||||
<select id="proxy_scheme">
|
||||
<option value="http" selected="selected">HTTP</option>
|
||||
<option value="socks5">SOCKS5</option>
|
||||
</select>
|
||||
<span class="title">Bookmarks Status:</span> <input id="bookmarksState" name="bookmarksstate" type="checkbox" value="bookmarksstate"> <label for="bookmarksState">Bookmarks were created at install-time. <button id="bookmarksButton" type="submit">Re-Create Bookmarks</button></label>
|
||||
</section>
|
||||
|
||||
<section class="scheme-options proxy-options">
|
||||
<div class="title" >Proxy Options</div>
|
||||
|
||||
<label id="portText">Host: </label>
|
||||
<input type="text" data="host" id="host" value="127.0.0.1"/>
|
||||
<br>
|
||||
<label id="hostText">Port: </label>
|
||||
<input type="text" data="port" id="port" value="4444"/>
|
||||
|
||||
<section class="scheme-options proxy-options" id="proxy-options">
|
||||
<label for="bookmarksState"></label>
|
||||
<div class="title">
|
||||
<label for="bookmarksState">Proxy Options</label>
|
||||
</div>
|
||||
<label for="bookmarksState"></label>
|
||||
<p id="proxyHelpText"><label for="bookmarksState"></label>
|
||||
</p>
|
||||
<label for="bookmarksState"><label id="portText">Host:</label> <input data="host" id="host" type="text" value="127.0.0.1">
|
||||
<br>
|
||||
<label id="hostText">Port:</label> <input data="port" id="port" type="text" value="4444"></label>
|
||||
</section>
|
||||
<section class="scheme-options identity-options">
|
||||
<!--<section class="scheme-options identity-options">
|
||||
<div class="panel">
|
||||
<div id="identity-list">Identity list?</div>
|
||||
</div>
|
||||
</section>-->
|
||||
|
||||
<section class="scheme-options console-options" id="console-options">
|
||||
<div>
|
||||
<div class="title">
|
||||
Router Console Options
|
||||
</div>
|
||||
|
||||
<p id="controlHelpText">Configure your router console options here.</p>
|
||||
<label id="controlPortText">Console Host:</label> <input data="controlhost" id="controlhost" type="text" value="127.0.0.1">
|
||||
<br>
|
||||
<label id="controlHostText">Console Port:</label> <input data="controlport" id="controlport" type="text" value="7657">
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="scheme-options control-options">
|
||||
<div class="title" >Controller Options</div>
|
||||
<p id="controlHelpText"> These options will be inert if used with the default i2p HTTP or SOCKS
|
||||
proxy. </p>
|
||||
<label id="controlPortText">Control Host: </label>
|
||||
<input type="text" data="controlhost" id="controlhost" value="127.0.0.1"/>
|
||||
<br>
|
||||
<label id="controlHostText">Control Port: </label>
|
||||
<input type="text" data="controlport" id="controlport" value="4444"/>
|
||||
<section class="scheme-options control-options" id="control-options">
|
||||
<div>
|
||||
<div class="title">
|
||||
I2PControl RPC Client Options
|
||||
</div>
|
||||
|
||||
<p id="rpcHelpText">Configure your I2PControl options here.</p>
|
||||
<label id="rpcPortText">Control Host:</label> <input data="rpchost" id="rpchost" type="text" value="127.0.0.1">
|
||||
<br>
|
||||
<label id="rpcHostText">Control Port:</label> <input data="rpcport" id="rpcport" type="text" value="7657">
|
||||
<br>
|
||||
<label id="rpcPathText">Control Path:</label> <input data="rpcpath" id="rpcpath" type="text" value="jsonrpc">
|
||||
<br>
|
||||
<label id="rpcPassText">Control Password:</label> <input data="rpcpass" id="rpcpass" type="text" value="itoopie">
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<input type="button" value="Save preferences" id="save-button"/>
|
||||
|
||||
<script src="options.js"></script>
|
||||
</body>
|
||||
<section class="scheme-options transmission-options" id="transmission-options">
|
||||
<div>
|
||||
<div class="title">
|
||||
Bittorrent RPC Client Options
|
||||
</div>
|
||||
|
||||
<p id="rpcHelpText">Configure your Bittorrent options here.</p>
|
||||
<label id="btRpcHostText">Torrent RPC Host:</label> <input data="btrpchost" id="btrpchost" type="text" value="127.0.0.1">
|
||||
<br>
|
||||
<label id="btRpcPortText">Torrent RPC Port:</label> <input data="btrpcport" id="btrpcport" type="text" value="7657">
|
||||
<br>
|
||||
<label id="btRpcPathText">Torrent RPC Path:</label> <input data="btrpcpath" id="btrpcpath" type="text" value="transmission/">
|
||||
<br>
|
||||
<label id="rpcPassText">Torrent RPC Password:</label> <input data="btrpcpass" id="btrpcpass" type="text" value="">
|
||||
</div>
|
||||
</section>
|
||||
<input id="save-button" type="button" value="Save preferences">
|
||||
<script src="options.js"></script>
|
||||
<script src="/bookmarks.js"></script> <!--<script src="/torrent/browser-polyfill.min.js"></script>
|
||||
<script src="/torrent/options.js"></script>-->
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -1,148 +1,343 @@
|
||||
function isDroid() {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
function SetBookButton() {
|
||||
// var bmid = document.getElementById("bookmark");
|
||||
//bmid.textContent = chrome.i18n.getMessage("bookmarkButton");
|
||||
}
|
||||
|
||||
function SetHostText() {
|
||||
var hostid = document.getElementById("hostText");
|
||||
hostid.textContent = chrome.i18n.getMessage("hostText");
|
||||
var hostid = document.getElementById('hostText');
|
||||
hostid.textContent = chrome.i18n.getMessage('hostText');
|
||||
}
|
||||
|
||||
function SetPortText() {
|
||||
var portid = document.getElementById("portText");
|
||||
portid.textContent = chrome.i18n.getMessage("portText");
|
||||
var portid = document.getElementById('portText');
|
||||
portid.textContent = chrome.i18n.getMessage('portText');
|
||||
}
|
||||
|
||||
function SetPortHelpText() {
|
||||
var portid = document.getElementById('proxyHelpText');
|
||||
portid.textContent = chrome.i18n.getMessage('proxyHelpText');
|
||||
}
|
||||
|
||||
function SetControlHostText() {
|
||||
var controlhostid = document.getElementById("controlHostText");
|
||||
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
|
||||
}
|
||||
|
||||
function setupProxy() {
|
||||
var controlHost = getControlHost();
|
||||
var controlPort = getControlPort();
|
||||
var Host = getHost();
|
||||
var Port = getPort();
|
||||
var Scheme = getScheme();
|
||||
if (!getChrome()) {
|
||||
function handleProxyRequest(requestInfo) {
|
||||
console.log("proxying request via listener");
|
||||
console.log(" ", Scheme, Host, ":", Port);
|
||||
return {
|
||||
type: Scheme,
|
||||
host: Host,
|
||||
port: Port,
|
||||
proxyDns: true
|
||||
};
|
||||
}
|
||||
console.log("Setting up Firefox WebExtension proxy");
|
||||
browser.proxy.onRequest.addListener(handleProxyRequest, {
|
||||
urls: ["<all_urls>"]
|
||||
});
|
||||
console.log("i2p settings created for WebExtension Proxy");
|
||||
} else {
|
||||
var config = {
|
||||
mode: "fixed_servers",
|
||||
rules: {
|
||||
singleProxy: {
|
||||
scheme: Scheme,
|
||||
host: Host,
|
||||
port: parseInt(Port)
|
||||
}
|
||||
}
|
||||
};
|
||||
chrome.proxy.settings.set(
|
||||
{
|
||||
value: config,
|
||||
scope: "regular"
|
||||
},
|
||||
function() {}
|
||||
);
|
||||
}
|
||||
var controlhostid = document.getElementById('controlHostText');
|
||||
controlhostid.textContent = chrome.i18n.getMessage('controlHostText');
|
||||
}
|
||||
|
||||
function SetControlPortText() {
|
||||
var controlportid = document.getElementById("controlPortText");
|
||||
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
|
||||
var controlportid = document.getElementById('controlPortText');
|
||||
controlportid.textContent = chrome.i18n.getMessage('controlPortText');
|
||||
}
|
||||
|
||||
function SetControlHelpText() {
|
||||
var portid = document.getElementById("controlHelpText");
|
||||
portid.textContent = chrome.i18n.getMessage("controlHelpText");
|
||||
var portid = document.getElementById('controlHelpText');
|
||||
portid.textContent = chrome.i18n.getMessage('controlHelpText');
|
||||
}
|
||||
|
||||
function getBookmarksCreated() {
|
||||
bookmarks_state = document.getElementById('bookmarks').value;
|
||||
console.log('(options)Got i2p bookmarks state:', bookmarks_state);
|
||||
if (bookmarks_state == undefined) {
|
||||
return false;
|
||||
}
|
||||
if (bookmarks_state == 'false') {
|
||||
return false;
|
||||
}
|
||||
if (bookmarks_state == 'true') {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getScheme() {
|
||||
const proxy_scheme = document.querySelector("#proxy_scheme");
|
||||
console.log("Got i2p proxy scheme:", proxy_scheme.value);
|
||||
if (proxy_scheme == "HTTP") {
|
||||
return "http";
|
||||
const proxy_scheme = document.querySelector('#proxy_scheme');
|
||||
console.log('(options)Got i2p proxy scheme:', proxy_scheme.value);
|
||||
if (proxy_scheme.value == 'HTTP') {
|
||||
return 'http';
|
||||
}
|
||||
if (proxy_scheme == "SOCKS") {
|
||||
return "socks";
|
||||
if (proxy_scheme.value == 'SOCKS') {
|
||||
return 'socks';
|
||||
}
|
||||
return proxy_scheme.value;
|
||||
if (proxy_scheme.value == 'http') return 'http';
|
||||
if (proxy_scheme.value == 'socks') return 'socks';
|
||||
else return 'http';
|
||||
}
|
||||
|
||||
function getHost() {
|
||||
proxy_host = document.getElementById("host").value;
|
||||
console.log("Got i2p proxy host:", proxy_host);
|
||||
proxy_host = document.getElementById('host').value;
|
||||
console.log('(options)Got i2p proxy host:', proxy_host);
|
||||
if (proxy_host == undefined) {
|
||||
return "127.0.0.1";
|
||||
return '127.0.0.1';
|
||||
}
|
||||
return proxy_host;
|
||||
}
|
||||
|
||||
function getPort() {
|
||||
proxy_port = document.getElementById("port").value;
|
||||
console.log("Got i2p proxy port:", proxy_port);
|
||||
proxy_port = document.getElementById('port').value;
|
||||
console.log('(options)Got i2p proxy port:', proxy_port);
|
||||
if (proxy_port == undefined) {
|
||||
return "4444";
|
||||
return '4444';
|
||||
}
|
||||
return proxy_port;
|
||||
}
|
||||
|
||||
function getControlHost() {
|
||||
control_host = document.getElementById("controlhost").value;
|
||||
console.log("Got i2p control host:", control_host);
|
||||
control_host = document.getElementById('controlhost').value;
|
||||
console.log('(options)Got i2p control host:', control_host);
|
||||
if (control_host == undefined) {
|
||||
return "127.0.0.1";
|
||||
return '127.0.0.1';
|
||||
}
|
||||
return control_host;
|
||||
}
|
||||
|
||||
function getControlPort() {
|
||||
control_port = document.getElementById("controlport").value;
|
||||
console.log("Got i2p control port:", control_port);
|
||||
control_port = document.getElementById('controlport').value;
|
||||
console.log('(options)Got i2p control port:', control_port);
|
||||
if (control_port == undefined) {
|
||||
return "4444";
|
||||
return '4444';
|
||||
}
|
||||
return control_port;
|
||||
}
|
||||
|
||||
function getRPCHost() {
|
||||
rpc_host = document.getElementById('rpchost').value;
|
||||
console.log('(options)Got i2pcontrol rpc host:', rpc_host);
|
||||
if (rpc_host == undefined) {
|
||||
return '127.0.0.1';
|
||||
}
|
||||
return rpc_host;
|
||||
}
|
||||
|
||||
function getRPCPort() {
|
||||
rpc_port = document.getElementById('rpcport').value;
|
||||
console.log('(options)Got i2pcontrol rpc port:', rpc_port);
|
||||
if (rpc_port == undefined) {
|
||||
return '7657';
|
||||
}
|
||||
return rpc_port;
|
||||
}
|
||||
|
||||
function getRPCPath() {
|
||||
rpc_path = document.getElementById('rpcpath').value;
|
||||
console.log('(options)Got i2pcontrol rpc path:', rpc_path);
|
||||
if (rpc_path == undefined) {
|
||||
return 'jsonrpc';
|
||||
}
|
||||
return rpc_path;
|
||||
}
|
||||
|
||||
function getRPCPass() {
|
||||
rpc_pass = document.getElementById('rpcpass').value;
|
||||
console.log('(options)Got i2pcontrol rpc password:');
|
||||
if (rpc_pass == undefined) {
|
||||
return 'itoopie';
|
||||
}
|
||||
return rpc_pass;
|
||||
}
|
||||
|
||||
function getBTRPCHost() {
|
||||
bt_rpc_host = document.getElementById('btrpchost').value;
|
||||
console.log('(options)Got torrent rpc host:', bt_rpc_host);
|
||||
if (bt_rpc_host == undefined) {
|
||||
return '127.0.0.1';
|
||||
}
|
||||
return bt_rpc_host;
|
||||
}
|
||||
|
||||
function getBTRPCPort() {
|
||||
bt_rpc_port = document.getElementById('btrpcport').value;
|
||||
console.log('(options)Got torrent rpc port:', bt_rpc_port);
|
||||
if (bt_rpc_port == undefined) {
|
||||
return '7657';
|
||||
}
|
||||
return bt_rpc_port;
|
||||
}
|
||||
|
||||
function getBTRPCPath() {
|
||||
bt_rpc_path = document.getElementById('btrpcpath').value;
|
||||
console.log('(options)Got torrent rpc path:', bt_rpc_path);
|
||||
if (bt_rpc_path == undefined) {
|
||||
return 'transmission/rpc';
|
||||
}
|
||||
return bt_rpc_path;
|
||||
}
|
||||
|
||||
function getBTRPCPass() {
|
||||
bt_rpc_pass = document.getElementById('btrpcpass').value;
|
||||
console.log('(options)Got torrent rpc password:');
|
||||
if (bt_rpc_pass == undefined) {
|
||||
return 'itoopie';
|
||||
}
|
||||
return bt_rpc_pass;
|
||||
}
|
||||
|
||||
function checkStoredSettings(storedSettings) {
|
||||
function gotProxyInfo(info) {
|
||||
let defaultSettings = {};
|
||||
let host = info.value.http.split(':')[0];
|
||||
let port = info.value.http.split(':')[1];
|
||||
if (port != 7644) {
|
||||
port = undefined;
|
||||
}
|
||||
console.log('(options)proxy', "'" + host + "'", ':', port);
|
||||
if (!storedSettings['bookmarks_state'])
|
||||
defaultSettings['bookmarks_state'] = false;
|
||||
else defaultSettings['bookmarks_state'] = storedSettings['bookmarks_state'];
|
||||
if (!storedSettings['proxy_scheme'])
|
||||
defaultSettings['proxy_scheme'] = 'http';
|
||||
else defaultSettings['proxy_scheme'] = storedSettings['proxy_scheme'];
|
||||
if (!storedSettings['proxy_host']) {
|
||||
if (host == '') defaultSettings['proxy_host'] = '127.0.0.1';
|
||||
else defaultSettings['proxy_host'] = host;
|
||||
} else defaultSettings['proxy_host'] = storedSettings['proxy_host'];
|
||||
|
||||
if (!storedSettings['proxy_port']) {
|
||||
if (port == undefined) defaultSettings['proxy_port'] = 4444;
|
||||
else if (port == 7644) defaultSettings['proxy_port'] = port;
|
||||
else defaultSettings['proxy_port'] = 4444;
|
||||
} else defaultSettings['proxy_port'] = storedSettings.proxy_port;
|
||||
|
||||
if (!storedSettings['control_host']) {
|
||||
if (host == '') defaultSettings['control_host'] = '127.0.0.1';
|
||||
else defaultSettings['control_host'] = host;
|
||||
} else defaultSettings['control_host'] = storedSettings.control_host;
|
||||
|
||||
if (!storedSettings['control_port']) {
|
||||
defaultSettings['control_port'] = 7657;
|
||||
} else defaultSettings['control_port'] = storedSettings.control_port;
|
||||
|
||||
if (!storedSettings['rpc_host']) {
|
||||
if (host == '') defaultSettings['rpc_host'] = '127.0.0.1';
|
||||
else defaultSettings['rpc_host'] = host;
|
||||
} else defaultSettings['rpc_host'] = storedSettings.rpc_host;
|
||||
|
||||
if (!storedSettings['rpc_port']) {
|
||||
defaultSettings['rpc_port'] = 7657;
|
||||
} else defaultSettings['rpc_port'] = storedSettings.rpc_port;
|
||||
|
||||
if (!storedSettings['rpc_path']) {
|
||||
defaultSettings['rpc_path'] = 'jsonrpc';
|
||||
} else defaultSettings['rpc_path'] = storedSettings.rpc_path;
|
||||
|
||||
if (!storedSettings['rpc_pass']) {
|
||||
defaultSettings['rpc_pass'] = 'itoopie';
|
||||
} else defaultSettings['rpc_pass'] = storedSettings.rpc_pass;
|
||||
|
||||
if (!storedSettings['bt_rpc_host']) {
|
||||
if (host == '') defaultSettings['bt_rpc_host'] = '127.0.0.1';
|
||||
else defaultSettings['bt_rpc_host'] = host;
|
||||
} else defaultSettings['bt_rpc_host'] = storedSettings.bt_rpc_host;
|
||||
|
||||
if (!storedSettings['bt_rpc_port']) {
|
||||
defaultSettings['bt_rpc_port'] = 7657;
|
||||
} else defaultSettings['bt_rpc_port'] = storedSettings.bt_rpc_port;
|
||||
|
||||
if (!storedSettings['bt_rpc_path']) {
|
||||
defaultSettings['bt_rpc_path'] = 'transmission/';
|
||||
} else defaultSettings['bt_rpc_path'] = storedSettings.bt_rpc_path;
|
||||
|
||||
if (!storedSettings['bt_rpc_pass']) {
|
||||
defaultSettings['bt_rpc_pass'] = 'transmission';
|
||||
} else defaultSettings['bt_rpc_pass'] = storedSettings.bt_rpc_pass;
|
||||
|
||||
console.log('(options)(browserinfo) NATIVE PROXYSETTINGS', info.value);
|
||||
defaultSettings['base_url'] =
|
||||
'http://' +
|
||||
defaultSettings['bt_rpc_host'] +
|
||||
':' +
|
||||
defaultSettings['bt_rpc_port'] +
|
||||
'/' +
|
||||
defaultSettings['bt_rpc_path'];
|
||||
console.log(
|
||||
'(options)',
|
||||
defaultSettings['proxy_scheme'],
|
||||
defaultSettings['proxy_host'],
|
||||
defaultSettings['proxy_port'],
|
||||
defaultSettings['control_host'],
|
||||
defaultSettings['control_port'],
|
||||
defaultSettings['base_url']
|
||||
);
|
||||
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
return defaultSettings;
|
||||
}
|
||||
var gettingInfo = browser.proxy.settings.get({});
|
||||
return gettingInfo.then(gotProxyInfo);
|
||||
}
|
||||
|
||||
function checkAndroidStoredSettings(storedSettings) {
|
||||
let defaultSettings = {};
|
||||
if (!storedSettings.proxy_scheme) {
|
||||
defaultSettings["proxy_scheme"] = "http";
|
||||
}
|
||||
if (!storedSettings.proxy_host) {
|
||||
defaultSettings["proxy_host"] = "127.0.0.1";
|
||||
}
|
||||
if (!storedSettings.proxy_port) {
|
||||
defaultSettings["proxy_port"] = 4444;
|
||||
}
|
||||
if (!storedSettings.control_host) {
|
||||
defaultSettings["control_host"] = "127.0.0.1";
|
||||
}
|
||||
if (!storedSettings.control_port) {
|
||||
defaultSettings["control_port"] = 4444;
|
||||
}
|
||||
let host = '';
|
||||
let port = '';
|
||||
if (!storedSettings['bookmarks_state'])
|
||||
defaultSettings['bookmarks_state'] = false;
|
||||
else defaultSettings['bookmarks_state'] = storedSettings['bookmarks_state'];
|
||||
if (!storedSettings['proxy_scheme']) defaultSettings['proxy_scheme'] = 'http';
|
||||
else defaultSettings['proxy_scheme'] = storedSettings['proxy_scheme'];
|
||||
if (!storedSettings['proxy_host']) {
|
||||
if (host == '') defaultSettings['proxy_host'] = '127.0.0.1';
|
||||
else defaultSettings['proxy_host'] = host;
|
||||
} else defaultSettings['proxy_host'] = storedSettings['proxy_host'];
|
||||
|
||||
if (!storedSettings['proxy_port']) {
|
||||
if (port == undefined) defaultSettings['proxy_port'] = 4444;
|
||||
else if (port == 7644) defaultSettings['proxy_port'] = port;
|
||||
else defaultSettings['proxy_port'] = 4444;
|
||||
} else defaultSettings['proxy_port'] = storedSettings.proxy_port;
|
||||
|
||||
if (!storedSettings['control_host']) {
|
||||
if (host == '') defaultSettings['control_host'] = '127.0.0.1';
|
||||
else defaultSettings['control_host'] = host;
|
||||
} else defaultSettings['control_host'] = storedSettings.control_host;
|
||||
|
||||
if (!storedSettings['control_port']) {
|
||||
defaultSettings['control_port'] = 7657;
|
||||
} else defaultSettings['control_port'] = storedSettings.control_port;
|
||||
|
||||
if (!storedSettings['rpc_host']) {
|
||||
if (host == '') defaultSettings['rpc_host'] = '127.0.0.1';
|
||||
else defaultSettings['rpc_host'] = host;
|
||||
} else defaultSettings['rpc_host'] = storedSettings.rpc_host;
|
||||
|
||||
if (!storedSettings['rpc_port']) {
|
||||
defaultSettings['rpc_port'] = 7657;
|
||||
} else defaultSettings['rpc_port'] = storedSettings.rpc_port;
|
||||
|
||||
if (!storedSettings['rpc_path']) {
|
||||
defaultSettings['rpc_path'] = 'jsonrpc';
|
||||
} else defaultSettings['rpc_path'] = storedSettings.rpc_path;
|
||||
|
||||
if (!storedSettings['rpc_pass']) {
|
||||
defaultSettings['rpc_pass'] = 'itoopie';
|
||||
} else defaultSettings['rpc_pass'] = storedSettings.rpc_pass;
|
||||
|
||||
if (!storedSettings['bt_rpc_host']) {
|
||||
if (host == '') defaultSettings['bt_rpc_host'] = '127.0.0.1';
|
||||
else defaultSettings['bt_rpc_host'] = host;
|
||||
} else defaultSettings['bt_rpc_host'] = storedSettings.bt_rpc_host;
|
||||
|
||||
if (!storedSettings['bt_rpc_port']) {
|
||||
defaultSettings['bt_rpc_port'] = 7657;
|
||||
} else defaultSettings['bt_rpc_port'] = storedSettings.bt_rpc_port;
|
||||
|
||||
if (!storedSettings['bt_rpc_path']) {
|
||||
defaultSettings['bt_rpc_path'] = 'transmission/rpc';
|
||||
} else defaultSettings['bt_rpc_path'] = storedSettings.bt_rpc_path;
|
||||
|
||||
if (!storedSettings['bt_rpc_pass']) {
|
||||
defaultSettings['bt_rpc_pass'] = 'transmission';
|
||||
} else defaultSettings['bt_rpc_pass'] = storedSettings.bt_rpc_pass;
|
||||
|
||||
console.log('(options)(browserinfo) NATIVE PROXYSETTINGS', info.value);
|
||||
console.log(
|
||||
'(options)',
|
||||
defaultSettings['proxy_scheme'],
|
||||
defaultSettings['proxy_host'],
|
||||
defaultSettings['proxy_port'],
|
||||
defaultSettings['control_host'],
|
||||
defaultSettings['control_port']
|
||||
);
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
return defaultSettings;
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
@@ -150,64 +345,117 @@ function onError(e) {
|
||||
}
|
||||
|
||||
function storeSettings() {
|
||||
let proxy_scheme = getScheme();
|
||||
let proxy_host = getHost();
|
||||
let proxy_port = getPort();
|
||||
let control_host = getControlHost();
|
||||
let control_port = getControlPort();
|
||||
chrome.storage.local.set({
|
||||
proxy_scheme,
|
||||
proxy_host,
|
||||
proxy_port,
|
||||
control_host,
|
||||
control_port
|
||||
});
|
||||
console.log("storing proxy scheme:", proxy_scheme);
|
||||
console.log("storing proxy host:", proxy_host);
|
||||
console.log("storing proxy port:", proxy_port);
|
||||
console.log("storing control host:", control_host);
|
||||
console.log("storing control port:", control_port);
|
||||
setupProxy();
|
||||
let storableSettings = {};
|
||||
storableSettings['bookmarks_state'] = getBookmarksCreated();
|
||||
storableSettings['proxy_scheme'] = getScheme();
|
||||
storableSettings['proxy_host'] = getHost();
|
||||
storableSettings['proxy_port'] = getPort();
|
||||
storableSettings['control_host'] = getControlHost();
|
||||
storableSettings['control_port'] = getControlPort();
|
||||
storableSettings['rpc_host'] = getRPCHost();
|
||||
storableSettings['rpc_port'] = getRPCPort();
|
||||
storableSettings['rpc_path'] = getRPCPath();
|
||||
storableSettings['rpc_pass'] = getRPCPass();
|
||||
storableSettings['bt_rpc_host'] = getBTRPCHost();
|
||||
storableSettings['bt_rpc_port'] = getBTRPCPort();
|
||||
storableSettings['bt_rpc_path'] = getBTRPCPath();
|
||||
storableSettings['bt_rpc_pass'] = getBTRPCPass();
|
||||
storableSettings['base_url'] =
|
||||
'http://' + bt_rpc_host + ':' + bt_rpc_port + '/' + bt_rpc_path;
|
||||
console.log('storing', storableSettings);
|
||||
chrome.storage.local.set(storableSettings);
|
||||
}
|
||||
|
||||
function updateUI(restoredSettings) {
|
||||
const selectList = document.querySelector("#proxy_scheme");
|
||||
selectList.value = restoredSettings.proxy_scheme;
|
||||
console.log("showing proxy scheme:", selectList.value);
|
||||
const selectList = document.querySelector('#proxy_scheme');
|
||||
if (selectList != undefined) selectList.value = restoredSettings.proxy_scheme;
|
||||
//console.log("(options)showing proxy scheme:", selectList.value);
|
||||
|
||||
const hostitem = document.getElementById("host");
|
||||
hostitem.value = restoredSettings.proxy_host;
|
||||
console.log("showing proxy host:", hostitem.value);
|
||||
console.log(restoredSettings);
|
||||
const bms = document.getElementById('bookmarksState');
|
||||
if (bms != undefined) bms.checked = restoredSettings.bookmarks_state;
|
||||
|
||||
const portitem = document.getElementById("port");
|
||||
portitem.value = restoredSettings.proxy_port;
|
||||
console.log("showing proxy port:", portitem.value);
|
||||
const hostitem = document.getElementById('host');
|
||||
if (hostitem != undefined) hostitem.value = restoredSettings.proxy_host;
|
||||
//console.log("(options)showing proxy host:", hostitem.value);
|
||||
|
||||
const controlhostitem = document.getElementById("controlhost");
|
||||
controlhostitem.value = restoredSettings.control_host;
|
||||
console.log("showing control host:", controlhostitem.value);
|
||||
const portitem = document.getElementById('port');
|
||||
if (portitem != undefined) portitem.value = restoredSettings.proxy_port;
|
||||
//console.log("(options)showing proxy port:", portitem.value);
|
||||
|
||||
const controlportitem = document.getElementById("controlport");
|
||||
controlportitem.value = restoredSettings.control_port;
|
||||
console.log("showing control port:", controlportitem.value);
|
||||
const controlhostitem = document.getElementById('controlhost');
|
||||
if (controlhostitem == undefined)
|
||||
controlhostitem.value = restoredSettings.control_host;
|
||||
//console.log("(options)showing control host:", controlhostitem.value);
|
||||
|
||||
const controlportitem = document.getElementById('controlport');
|
||||
if (controlportitem == undefined)
|
||||
controlportitem.value = restoredSettings.control_port;
|
||||
//console.log("(options)showing control port:", controlportitem.value);
|
||||
|
||||
const rpchostitem = document.getElementById('rpchost');
|
||||
if (rpchostitem != undefined) rpchostitem.value = restoredSettings.rpc_host;
|
||||
//console.log("(options)showing rpc host:", rpchostitem.value);
|
||||
|
||||
const rpcportitem = document.getElementById('rpcport');
|
||||
if (rpcportitem != undefined) rpcportitem.value = restoredSettings.rpc_port;
|
||||
//console.log("(options)showing rpc port:", rpcportitem.value);
|
||||
|
||||
const rpcpathitem = document.getElementById('rpcpath');
|
||||
if (rpcpathitem != undefined) rpcpathitem.value = restoredSettings.rpc_path;
|
||||
//console.log("(options)showing rpc path:", rpcpathitem.value);
|
||||
|
||||
const rpcpassitem = document.getElementById('rpcpass');
|
||||
if (rpcpassitem != undefined) rpcpassitem.value = restoredSettings.rpc_pass;
|
||||
//console.log("(options)showing rpc pass:");
|
||||
|
||||
const btrpchostitem = document.getElementById('btrpchost');
|
||||
if (btrpchostitem != undefined)
|
||||
btrpchostitem.value = restoredSettings.rpc_host;
|
||||
//console.log("(options)showing bt rpc host:", btrpchostitem.value);
|
||||
|
||||
const btrpcportitem = document.getElementById('btrpcport');
|
||||
if (btrpcportitem != undefined)
|
||||
btrpcportitem.value = restoredSettings.rpc_port;
|
||||
//console.log("(options)showing rbt pc port:", rpcportitem.value);
|
||||
|
||||
const btrpcpathitem = document.getElementById('btrpcpath');
|
||||
if (btrpcpathitem != undefined)
|
||||
btrpcpathitem.value = restoredSettings.rpc_path;
|
||||
//console.log("(options)showing bt rpc path:", btrpcpathitem.value);
|
||||
|
||||
const btrpcpassitem = document.getElementById('btrpcpass');
|
||||
if (btrpcpassitem != undefined)
|
||||
btrpcpassitem.value = restoredSettings.rpc_pass;
|
||||
//console.log("(options)showing bt rpc pass:");
|
||||
|
||||
SetBookButton();
|
||||
SetHostText();
|
||||
SetPortText();
|
||||
SetPortHelpText();
|
||||
SetControlHostText();
|
||||
SetControlPortText();
|
||||
SetControlHelpText();
|
||||
setupProxy();
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
}
|
||||
chrome.storage.local.get(function(got) {
|
||||
checkStoredSettings(got);
|
||||
updateUI(got);
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != 'android') {
|
||||
chrome.storage.local.get(function(got) {
|
||||
let settings = checkStoredSettings(got);
|
||||
settings.then(updateUI);
|
||||
});
|
||||
} else {
|
||||
chrome.storage.local.get(function(got) {
|
||||
checkAndroidStoredSettings(got);
|
||||
updateUI(got);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const saveButton = document.querySelector("#save-button");
|
||||
saveButton.addEventListener("click", storeSettings);
|
||||
|
||||
//EXPERIMENTAL: Open in I2P Tab
|
||||
const saveButton = document.querySelector('#save-button');
|
||||
saveButton.addEventListener('click', storeSettings);
|
||||
|
35
platform.js
@@ -1,23 +1,26 @@
|
||||
function getChrome() {
|
||||
if (browser.runtime.getBrowserInfo == undefined) {
|
||||
console.log("Running in Chrome detected");
|
||||
var android = false;
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == 'android') {
|
||||
console.log('Running in Android detected');
|
||||
android = true;
|
||||
return true;
|
||||
} else {
|
||||
console.log('Running in Desktop detected');
|
||||
android = false;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
function isDroid() {
|
||||
if (!getChrome()) {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "android") {
|
||||
console.log("Running in Android detected");
|
||||
return true;
|
||||
} else {
|
||||
console.log("Running in Desktop detected");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
console.log('android?', android);
|
||||
if (android == undefined) {
|
||||
return false;
|
||||
}
|
||||
return android;
|
||||
}
|
||||
|
||||
function notClosable() {
|
||||
return false;
|
||||
}
|
||||
|
489
privacy.js
@@ -1,67 +1,78 @@
|
||||
function getChrome() {
|
||||
if (chrome.runtime.getBrowserInfo == undefined) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
var titlepref = chrome.i18n.getMessage('titlePreface');
|
||||
|
||||
function onSet(result) {
|
||||
if (result) {
|
||||
console.log("->: Value was updated");
|
||||
console.log('->: Value was updated');
|
||||
} else {
|
||||
console.log("-X: Value was not updated");
|
||||
console.log('-X: Value was not updated');
|
||||
}
|
||||
}
|
||||
|
||||
// This disables queries to centralized databases of bad URLs to screen for
|
||||
// risky sites in your browser
|
||||
/* This disables queries to centralized databases of bad URLs to screen for
|
||||
risky sites in your browser */
|
||||
function disableHyperlinkAuditing() {
|
||||
if (!getChrome()) {
|
||||
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Disabling hyperlink auditing/val=", {
|
||||
value: false
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
|
||||
value: false,
|
||||
});
|
||||
console.log('Disabling hyperlink auditing/val=', {
|
||||
value: false,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// UNINSTALL ONLY
|
||||
function enableHyperlinkAuditing() {
|
||||
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.clear();
|
||||
console.log('Disabling hyperlink auditing/val=', {
|
||||
value: false,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This enables first-party isolation
|
||||
function enableFirstPartyIsolation() {
|
||||
if (!getChrome()) {
|
||||
var setting = browser.privacy.websites.firstPartyIsolate.set({
|
||||
value: true
|
||||
});
|
||||
console.log("Enabling first party isolation/val=", {
|
||||
value: true
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.firstPartyIsolate.set({
|
||||
value: true,
|
||||
});
|
||||
console.log('Enabling first party isolation/val=', {
|
||||
value: true,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This rejects tracking cookies and third-party cookies but it
|
||||
// LEAVES "Persistent" Cookies unmodified in favor of an option in the content
|
||||
// interface for now
|
||||
// UNINSTALL ONLY
|
||||
function disableFirstPartyIsolation() {
|
||||
var setting = browser.privacy.websites.firstPartyIsolate.clear();
|
||||
console.log('Enabling first party isolation/val=', {
|
||||
value: true,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
/* This rejects tracking cookies and third-party cookies but it
|
||||
LEAVES "Persistent" Cookies unmodified in favor of an option in the content
|
||||
interface for now */
|
||||
function disableEvilCookies() {
|
||||
if (!getChrome()) {
|
||||
var getting = browser.privacy.websites.cookieConfig.get({});
|
||||
getting.then(got => {
|
||||
var setting = browser.privacy.websites.cookieConfig.set({
|
||||
value: {
|
||||
behavior: "reject_third_party",
|
||||
nonPersistentCookies: got.value.nonPersistentCookies
|
||||
}
|
||||
});
|
||||
console.log("Setting cookie behavior/val=", {
|
||||
value: {
|
||||
behavior: "reject_third_party",
|
||||
nonPersistentCookies: got.value.nonPersistentCookies
|
||||
}
|
||||
});
|
||||
setting.then(onSet);
|
||||
var getting = browser.privacy.websites.cookieConfig.get({});
|
||||
getting.then((got) => {
|
||||
var setting = browser.privacy.websites.cookieConfig.set({
|
||||
value: {
|
||||
behavior: 'reject_third_party',
|
||||
nonPersistentCookies: got.value.nonPersistentCookies,
|
||||
},
|
||||
});
|
||||
}
|
||||
console.log('Setting cookie behavior/val=', {
|
||||
value: {
|
||||
behavior: 'reject_third_party',
|
||||
nonPersistentCookies: got.value.nonPersistentCookies,
|
||||
},
|
||||
});
|
||||
setting.then(onSet);
|
||||
});
|
||||
}
|
||||
|
||||
function enableEvilCookies() {
|
||||
var getting = browser.privacy.websites.cookieConfig.clear();
|
||||
}
|
||||
|
||||
// Make sure that they're gone
|
||||
@@ -77,65 +88,123 @@ function disableEvilCookies() {
|
||||
|
||||
// this disables the use of referrer headers
|
||||
function disableReferrers() {
|
||||
if (!getChrome()) {
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Disabling referrer headers/val=", {
|
||||
value: false
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: false,
|
||||
});
|
||||
console.log("Disabling referrer headers/val=", {
|
||||
value: false,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// UNINSATALL ONLY
|
||||
function enableReferrers() {
|
||||
var setting = browser.privacy.websites.referrersEnabled.clear();
|
||||
console.log("Disabling referrer headers/val=", {
|
||||
value: false,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// enable fingerprinting resistent features(letterboxing and stuff)
|
||||
function enableResistFingerprinting() {
|
||||
if (!getChrome()) {
|
||||
var setting = browser.privacy.websites.referrersEnabled.set({
|
||||
value: true
|
||||
});
|
||||
console.log("Enabling resist fingerprinting/val=", {
|
||||
value: true
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.resistFingerprinting.set({
|
||||
value: true,
|
||||
});
|
||||
console.log("Enabling resist fingerprinting/val=", {
|
||||
value: true,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// UNINSTALL ONLY
|
||||
function disableResistFingerprinting() {
|
||||
var setting = browser.privacy.websites.resistFingerprinting.clear();
|
||||
console.log("Enabling resist fingerprinting/val=", {
|
||||
value: false,
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This is essentially a blocklist of clearnet web-sites known to do bad tracking
|
||||
function enableTrackingProtection() {
|
||||
if (!getChrome()) {
|
||||
var setting = browser.privacy.websites.trackingProtectionMode.set({
|
||||
value: "always"
|
||||
});
|
||||
console.log("Enabling tracking protection/val=", {
|
||||
value: "always"
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
var setting = browser.privacy.websites.trackingProtectionMode.set({
|
||||
value: "always",
|
||||
});
|
||||
console.log("Enabling tracking protection/val=", {
|
||||
value: "always",
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
// This disables protected content, which is a form of digital restrictions
|
||||
// management dependent on identifying information
|
||||
function disableDigitalRestrictionsManagement() {
|
||||
if (!getChrome()) {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then(got => {
|
||||
if (got.os == "win") {
|
||||
var setting = browser.privacy.websites.protectedContentEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log(
|
||||
"Setting Protected Content(Digital Restrictions Management) false/val=",
|
||||
{
|
||||
value: false
|
||||
}
|
||||
);
|
||||
setting.then(onSet);
|
||||
}
|
||||
});
|
||||
}
|
||||
// UNINSTALL ONLY
|
||||
function disableTrackingProtection() {
|
||||
var setting = browser.privacy.websites.trackingProtectionMode.clear();
|
||||
console.log("Enabling tracking protection/val=", {
|
||||
value: "always",
|
||||
});
|
||||
setting.then(onSet);
|
||||
}
|
||||
|
||||
/* This disables protected content, which is a form of digital restrictions
|
||||
management dependent on identifying information */
|
||||
function disableDigitalRestrictionsManagement() {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "win") {
|
||||
var setting = browser.privacy.websites.protectedContentEnabled.set({
|
||||
value: false,
|
||||
});
|
||||
console.log(
|
||||
"Setting Protected Content(Digital Restrictions Management) false/val=",
|
||||
{
|
||||
value: false,
|
||||
}
|
||||
);
|
||||
setting.then(onSet);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// UNINSTALL ONLY
|
||||
function disableDigitalRestrictionsManagement() {
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "win") {
|
||||
var setting = browser.privacy.websites.protectedContentEnabled.clear();
|
||||
console.log(
|
||||
"Setting Protected Content(Digital Restrictions Management) false/val=",
|
||||
{
|
||||
value: true,
|
||||
}
|
||||
);
|
||||
setting.then(onSet);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function unsetAllPrivacy() {
|
||||
enableHyperlinkAuditing();
|
||||
disableFirstPartyIsolation();
|
||||
enableEvilCookies();
|
||||
enableReferrers();
|
||||
disableTrackingProtection();
|
||||
disableResistFingerprinting();
|
||||
enableDigitalRestrictionsManagement();
|
||||
UnsetPeerConnection();
|
||||
EnableSavePasswords();
|
||||
}
|
||||
|
||||
browser.management.onUninstalled.addListener((info) => {
|
||||
function gotSelf(selfinfo) {
|
||||
if (info.name == selfinfo.name) {
|
||||
unsetAllPrivacy();
|
||||
}
|
||||
}
|
||||
var gettingSelf = browser.management.getSelf();
|
||||
gettingSelf.then(gotSelf);
|
||||
});
|
||||
|
||||
function setAllPrivacy() {
|
||||
disableHyperlinkAuditing();
|
||||
enableFirstPartyIsolation();
|
||||
@@ -149,48 +218,70 @@ function setAllPrivacy() {
|
||||
setAllPrivacy();
|
||||
|
||||
function ResetPeerConnection() {
|
||||
if (!getChrome()) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: false
|
||||
});
|
||||
browser.privacy.network.networkPredictionEnabled.set({
|
||||
value: false
|
||||
function reset(snowflake) {
|
||||
var webrtc = true;
|
||||
console.log("No snowflake plugin found, pre-disabled WebRTC");
|
||||
var rtc = browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: webrtc,
|
||||
});
|
||||
rtc.then(AssurePeerConnection);
|
||||
}
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "disable_non_proxied_udp"
|
||||
});
|
||||
console.log("Re-disabled WebRTC");
|
||||
function snowflake(snowflake) {
|
||||
console.log("snowflake plugin found, leaving WebRTC alone", snowflake);
|
||||
AssurePeerConnection();
|
||||
}
|
||||
var snowflakeInfo = browser.management.get(
|
||||
"{b11bea1f-a888-4332-8d8a-cec2be7d24b9}" // string
|
||||
);
|
||||
snowflakeInfo.then(snowflake, reset);
|
||||
}
|
||||
|
||||
function EnablePeerConnection() {
|
||||
if (!getChrome()) {
|
||||
function AssurePeerConnection() {
|
||||
function assure(webrtc) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: true
|
||||
value: true,
|
||||
});
|
||||
browser.privacy.network.networkPredictionEnabled.set({
|
||||
value: false
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "disable_non_proxied_udp",
|
||||
});
|
||||
}
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "disable_non_proxied_udp"
|
||||
});
|
||||
console.log("Enabled WebRTC");
|
||||
let rtc = browser.privacy.network.peerConnectionEnabled.get({});
|
||||
rtc.then(assure);
|
||||
}
|
||||
|
||||
ResetPeerConnection();
|
||||
// UNINSTALL ONLY
|
||||
function UnsetPeerConnection() {
|
||||
function assure(webrtc) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: true,
|
||||
});
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({
|
||||
value: "default",
|
||||
});
|
||||
}
|
||||
let rtc = browser.privacy.network.peerConnectionEnabled.get({});
|
||||
rtc.then(assure);
|
||||
}
|
||||
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os == "android") {
|
||||
browser.tabs.onCreated.addListener(ResetPeerConnection);
|
||||
} else {
|
||||
browser.windows.onCreated.addListener(ResetPeerConnection);
|
||||
}
|
||||
});
|
||||
//AssurePeerConnection();
|
||||
|
||||
function ResetDisableSavePasswords() {
|
||||
browser.privacy.services.passwordSavingEnabled.set({
|
||||
value: false
|
||||
value: false,
|
||||
});
|
||||
console.log("Re-disabled saved passwords");
|
||||
}
|
||||
|
||||
function EnableSavePasswords() {
|
||||
browser.privacy.services.passwordSavingEnabled.set({
|
||||
value: true
|
||||
});
|
||||
browser.privacy.services.passwordSavingEnabled.clear();
|
||||
console.log("Enabled saved passwords");
|
||||
}
|
||||
|
||||
@@ -198,29 +289,13 @@ function EnableSavePasswords() {
|
||||
|
||||
var defaultSettings = {
|
||||
since: "forever",
|
||||
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"]
|
||||
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"],
|
||||
};
|
||||
|
||||
var appSettings = {
|
||||
since: "forever",
|
||||
dataTypes: [""]
|
||||
};
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
function onError(therror) {
|
||||
console.error(therror);
|
||||
}
|
||||
|
||||
function checkStoredSettings(storedSettings) {
|
||||
chrome.storage.local.set(appSettings);
|
||||
}
|
||||
|
||||
if (!getChrome()) {
|
||||
const gettingStoredSettings = browser.storage.local.get();
|
||||
gettingStoredSettings.then(checkStoredSettings, onError);
|
||||
}
|
||||
|
||||
function clearCookiesContext(cookieStoreId) {}
|
||||
|
||||
function forgetBrowsingData(storedSettings) {
|
||||
function getSince(selectedSince) {
|
||||
if (selectedSince === "forever") {
|
||||
@@ -228,15 +303,9 @@ function forgetBrowsingData(storedSettings) {
|
||||
}
|
||||
|
||||
const times = {
|
||||
hour: () => {
|
||||
return 1000 * 60 * 60;
|
||||
},
|
||||
day: () => {
|
||||
return 1000 * 60 * 60 * 24;
|
||||
},
|
||||
week: () => {
|
||||
return 1000 * 60 * 60 * 24 * 7;
|
||||
}
|
||||
hour: () => 1000 * 60 * 60,
|
||||
day: () => 1000 * 60 * 60 * 24,
|
||||
week: () => 1000 * 60 * 60 * 24 * 7,
|
||||
};
|
||||
|
||||
const sinceMilliseconds = times[selectedSince].call();
|
||||
@@ -260,69 +329,69 @@ function forgetBrowsingData(storedSettings) {
|
||||
browser.notifications.create({
|
||||
type: "basic",
|
||||
title: "Removed browsing data",
|
||||
message: `Removed ${dataTypesString}\n for i2pbrowser`
|
||||
message: `Removed ${dataTypesString}\n for I2P Browsing`,
|
||||
});
|
||||
}
|
||||
|
||||
function deepCleanHistory(historyItems) {
|
||||
console.log("Deep cleaning history");
|
||||
for (item of historyItems) {
|
||||
for (let item of historyItems) {
|
||||
if (i2pHost(item.url)) {
|
||||
browser.history.deleteUrl({
|
||||
url: item.url
|
||||
url: item.url,
|
||||
});
|
||||
browser.browsingData.removeCache({});
|
||||
console.log("cleared Cache");
|
||||
browser.browsingData
|
||||
.removePasswords({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since: since
|
||||
since,
|
||||
})
|
||||
.then(onGot);
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Passwords");
|
||||
browser.browsingData
|
||||
.removeDownloads({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since: since
|
||||
since,
|
||||
})
|
||||
.then(onGot);
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Downloads");
|
||||
browser.browsingData
|
||||
.removeFormData({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since: since
|
||||
since,
|
||||
})
|
||||
.then(onGot);
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Form Data");
|
||||
browser.browsingData
|
||||
.removeLocalStorage({
|
||||
hostnames: [i2pHostName(item.url)],
|
||||
since: since
|
||||
since,
|
||||
})
|
||||
.then(onGot);
|
||||
.then(onContextGotLog);
|
||||
console.log("cleared Local Storage");
|
||||
|
||||
contexts = browser.contextualIdentities.query({
|
||||
name: "i2pbrowser"
|
||||
let contexts = browser.contextualIdentities.query({
|
||||
name: titlepref,
|
||||
});
|
||||
|
||||
function deepCleanCookies(cookies) {
|
||||
for (cookie of cookies) {
|
||||
for (let cookie of cookies) {
|
||||
var removing = browser.cookies.remove({
|
||||
firstPartyDomain: cookie.firstPartyDomain,
|
||||
name: cookie.name,
|
||||
url: item.url
|
||||
url: item.url,
|
||||
});
|
||||
removing.then(onGot, onError);
|
||||
removing.then(onContextGotLog, onError);
|
||||
}
|
||||
console.log("Cleared cookies")
|
||||
console.log("Cleared cookies");
|
||||
}
|
||||
|
||||
function deepCleanContext(cookieStoreIds) {
|
||||
for (cookieStoreId of cookieStoreIds) {
|
||||
for (let cookieStoreId of cookieStoreIds) {
|
||||
var removing = browser.cookies.getAll({
|
||||
firstPartyDomain: null,
|
||||
storeId: cookieStoreId.cookieStoreId
|
||||
storeId: cookieStoreId.cookieStoreId,
|
||||
});
|
||||
removing.then(deepCleanCookies, onError);
|
||||
}
|
||||
@@ -336,7 +405,7 @@ function forgetBrowsingData(storedSettings) {
|
||||
|
||||
var searching = browser.history.search({
|
||||
text: "i2p",
|
||||
startTime: 0
|
||||
startTime: 0,
|
||||
});
|
||||
|
||||
searching.then(deepCleanHistory);
|
||||
@@ -347,29 +416,99 @@ function forgetBrowsingData(storedSettings) {
|
||||
|
||||
function i2pHostName(url) {
|
||||
let hostname = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
console.log("(hosts)", url);
|
||||
let u = new URL(url);
|
||||
if (u.host.endsWith(".i2p")) {
|
||||
hostname = u.host;
|
||||
} else if (url.includes("=")) {
|
||||
console.log("(hosts) scrub 1", url);
|
||||
if (url.includes(".i2p")) {
|
||||
lsit = url.split("=");
|
||||
console.log("(hosts) scrub 2", hostname);
|
||||
for (let item in lsit) {
|
||||
var items = lsit[item].split(`\ % `); //"\%")
|
||||
for (let p in items) {
|
||||
if (items[p].includes(".i2p")) {
|
||||
hostname = items[p].replace("3D", 1);
|
||||
}
|
||||
console.log("(hosts) scrub 3", hostname);
|
||||
break;
|
||||
}
|
||||
if (hostname != "") {
|
||||
console.log("(hosts) scrub 4", hostname);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
console.log("(hosts) scrub 5", hostname);
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
console.log("(hosts) scrub 6", hostname);
|
||||
}
|
||||
console.log("(hosts) scrub 7", hostname);
|
||||
return hostname;
|
||||
}
|
||||
|
||||
function i2pHost(url) {
|
||||
let hostname = i2pHostName(url);
|
||||
if (hostname.endsWith(".i2p")) {
|
||||
console.log("(hostname) i2p", hostname);
|
||||
}
|
||||
return hostname.endsWith(".i2p");
|
||||
}
|
||||
|
||||
function onGot(contexts) {
|
||||
function onContextGotLog(contexts) {
|
||||
if (contexts != null) {
|
||||
for (let context of contexts) {
|
||||
console.log(context);
|
||||
}
|
||||
console.log(contexts);
|
||||
}
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
browser.runtime.onMessage.addListener(message);
|
||||
|
||||
function enableHistory() {
|
||||
function checkStoredSettings(storedSettings) {
|
||||
storedSettings["disable_history"] = false;
|
||||
console.log(storedSettings);
|
||||
function enablehistory(settings) {
|
||||
console.log("Store History:", settings);
|
||||
}
|
||||
let setting = browser.storage.local.set(storedSettings);
|
||||
setting.then(enablehistory);
|
||||
}
|
||||
const gettingStoredSettings = browser.storage.local.get();
|
||||
gettingStoredSettings.then(checkStoredSettings, onError);
|
||||
}
|
||||
|
||||
//browser.contextualIdentities.query("i2pbrowser").then(clearCookiesContext, onError);
|
||||
function disableHistory() {
|
||||
function checkStoredSettings(storedSettings) {
|
||||
storedSettings["disable_history"] = true;
|
||||
console.log(storedSettings);
|
||||
function enablehistory(settings) {
|
||||
console.log("Store History:", settings);
|
||||
}
|
||||
var setting = browser.storage.local.set(storedSettings);
|
||||
setting.then(enablehistory);
|
||||
}
|
||||
const gettingStoredSettings = browser.storage.local.get();
|
||||
gettingStoredSettings.then(checkStoredSettings, onError);
|
||||
}
|
||||
|
||||
function message(recieved) {
|
||||
console.log(recieved);
|
||||
if (recieved.rtc === "enableWebRTC") {
|
||||
console.log("enableWebRTC");
|
||||
AssurePeerConnection();
|
||||
} else if (recieved.rtc === "disableWebRTC") {
|
||||
console.log("disableWebRTC");
|
||||
ResetPeerConnection();
|
||||
}
|
||||
if (recieved.history === "enableHistory") {
|
||||
console.log("enableHistory");
|
||||
enableHistory();
|
||||
} else if (recieved.history === "disableHistory") {
|
||||
console.log("disableHistory");
|
||||
disableHistory();
|
||||
}
|
||||
}
|
||||
|
479
proxy.js
@@ -1,129 +1,318 @@
|
||||
if (!getChrome()) {
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
value: false
|
||||
});
|
||||
console.log("Preliminarily disabled WebRTC.");
|
||||
}
|
||||
var titlepref = chrome.i18n.getMessage('titlePreface');
|
||||
var webpref = chrome.i18n.getMessage('webPreface');
|
||||
var ircpref = chrome.i18n.getMessage('ircPreface');
|
||||
var torrentpref = chrome.i18n.getMessage('torrentPreface');
|
||||
var routerpref = chrome.i18n.getMessage('routerPreface');
|
||||
var routerprefpriv = chrome.i18n.getMessage('routerPrefacePrivate');
|
||||
var ircpref = chrome.i18n.getMessage('ircPreface');
|
||||
|
||||
browser.privacy.network.peerConnectionEnabled.set({
|
||||
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.');
|
||||
|
||||
function shouldProxyRequest(requestInfo) {
|
||||
return requestInfo.parentFrameId != -1;
|
||||
}
|
||||
|
||||
var handleContextProxyRequest = async function(requestDetails) {
|
||||
console.log("(proxy)Searching for proxy by context");
|
||||
function ircProxy() {
|
||||
if (!requestDetails.url.includes('7669')) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
}
|
||||
if (requestDetails.url.includes(':7669')) {
|
||||
proxy = null;
|
||||
return proxy;
|
||||
}
|
||||
}
|
||||
function btProxy() {
|
||||
proxy = routerProxy();
|
||||
if (requestDetails.url.includes(':7662')) {
|
||||
proxy = null;
|
||||
return proxy;
|
||||
}
|
||||
console.log('(bt proxy)', proxy);
|
||||
return proxy;
|
||||
}
|
||||
function mainProxy() {
|
||||
console.log('(proxy) mainproxy 0');
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
let url = new URL(requestDetails.url);
|
||||
if (
|
||||
requestDetails.url.startsWith(
|
||||
'http://' + getHost() + ':' + getConsolePort() + '/i2psnark/'
|
||||
)
|
||||
) {
|
||||
//+url.host)) {
|
||||
console.log('(proxy) mainproxy 2', url);
|
||||
proxy = null;
|
||||
}
|
||||
return proxy;
|
||||
}
|
||||
function routerProxy() {
|
||||
if (routerHost(requestDetails.url)) {
|
||||
proxy = null;
|
||||
return proxy;
|
||||
} else if (!routerHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
}
|
||||
}
|
||||
try {
|
||||
var handleProxyRequest = function(context) {
|
||||
proxy = {
|
||||
failoverTimeout: 0,
|
||||
type: "direct",
|
||||
proxyDns: false
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
if (context.name == "i2pbrowser") {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort()
|
||||
};
|
||||
console.log(
|
||||
"(proxy)Using",
|
||||
proxy.type,
|
||||
"proxy ",
|
||||
proxy.host + ":" + proxy.port
|
||||
);
|
||||
|
||||
if (context == 'firefox-default' || context == 'firefox-private') {
|
||||
proxy = null;
|
||||
return proxy;
|
||||
}
|
||||
|
||||
if (context != undefined) {
|
||||
console.log('(proxy), context', context);
|
||||
proxy = routerProxy();
|
||||
if (context.name == ircpref) {
|
||||
proxy = ircProxy();
|
||||
return proxy;
|
||||
} else if (context.name == titlepref) {
|
||||
proxy = mainProxy();
|
||||
return proxy;
|
||||
} else if (context.name == routerpref) {
|
||||
proxy = routerProxy();
|
||||
return proxy;
|
||||
} else if (context.name == torrentpref) {
|
||||
proxy = btProxy();
|
||||
return proxy;
|
||||
}
|
||||
return proxy;
|
||||
} else {
|
||||
if (!routerHost(requestDetails.url)) {
|
||||
if (localHost(requestDetails.url)) {
|
||||
if (requestDetails.url.includes(':7669')) {
|
||||
proxy = null;
|
||||
} else if (requestDetails.url.includes(':7662')) {
|
||||
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(),
|
||||
};
|
||||
}
|
||||
//var tab = tabGet(requestDetails.tabId);
|
||||
//tab.then(handleTabRequest,)
|
||||
return proxy;
|
||||
}
|
||||
return proxy;
|
||||
};
|
||||
var contextGet = async function(tabInfo) {
|
||||
try {
|
||||
console.log("(proxy)Tab info from Function", tabInfo);
|
||||
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
|
||||
return context;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Context Error", error);
|
||||
}
|
||||
};
|
||||
var tabFind = async function(tabId) {
|
||||
try {
|
||||
context = await browser.contextualIdentities.query({
|
||||
name: "i2pbrowser"
|
||||
});
|
||||
tabId.cookieStoreId = context[0].cookieStoreId;
|
||||
console.log("(proxy) forcing context", tabId.cookieStoreId);
|
||||
return tabId;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Context Error", error);
|
||||
console.error(error);
|
||||
return 'firefox-default';
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(proxy)Tab ID from Request", tabId);
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
console.log("(proxy)Tab error", error);
|
||||
console.log('(proxy)Tab error', error);
|
||||
}
|
||||
};
|
||||
|
||||
if (proxyHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
}
|
||||
if (requestDetails.originUrl == browser.runtime.getURL('security.html')) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
}
|
||||
if (
|
||||
requestDetails.cookieStoreId == 'firefox-default' ||
|
||||
requestDetails.cookieStoreId == 'firefox-private'
|
||||
) {
|
||||
return browser.proxy.settings.get({});
|
||||
}
|
||||
if (requestDetails.tabId > 0) {
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
console.log("(Proxy)I2P URL detected, ");
|
||||
if (requestDetails.url.includes('MuWire')) {
|
||||
return;
|
||||
}
|
||||
if (proxyHost(requestDetails.url)) {
|
||||
proxy = {
|
||||
type: getScheme(),
|
||||
host: getHost(),
|
||||
port: getPort(),
|
||||
};
|
||||
return proxy;
|
||||
} else if (extensionHost(requestDetails.url)) {
|
||||
return;
|
||||
} else if (i2pHost(requestDetails.url)) {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(tabFind);
|
||||
requestDetails.tabId = mtab;
|
||||
var context = mtab.then(contextGet);
|
||||
requestDetails.tabId = tab;
|
||||
var context = tab.then(contextGet);
|
||||
var proxy = await context.then(handleProxyRequest);
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
//console.log('(proxy)Returning I2P Proxy', proxy);
|
||||
return proxy;
|
||||
} else {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var context = tab.then(contextGet);
|
||||
var proxy = await context.then(handleProxyRequest);
|
||||
console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
//console.log("(proxy)Returning I2P Proxy", proxy);
|
||||
return proxy;
|
||||
}
|
||||
/*proxy = {};
|
||||
console.log("(proxy)Returning unset Proxy", proxy);
|
||||
return proxy;*/
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(proxy)Not using I2P Proxy.", error);
|
||||
console.log('(proxy)Not using I2P Proxy.', error);
|
||||
}
|
||||
};
|
||||
|
||||
var proxy_scheme = "HTTP";
|
||||
|
||||
function getScheme() {
|
||||
if (proxy_scheme == undefined) {
|
||||
proxy_scheme = "http";
|
||||
}
|
||||
if (proxy_scheme == "HTTP") {
|
||||
proxy_scheme = "http";
|
||||
}
|
||||
if (proxy_scheme == "SOCKS") {
|
||||
proxy_scheme = "socks";
|
||||
}
|
||||
if (proxy_scheme != "http" && proxy_scheme != "socks") {
|
||||
proxy_scheme = "http";
|
||||
}
|
||||
//console.log("Got i2p proxy scheme:", proxy_scheme);
|
||||
return proxy_scheme;
|
||||
}
|
||||
|
||||
/*
|
||||
var proxy_host = "127.0.0.1";
|
||||
var proxy_port = "4444";
|
||||
var control_host = "127.0.0.1";
|
||||
var control_port = "4444";
|
||||
*/
|
||||
function SetupSettings() {
|
||||
console.log('Initialising Settings');
|
||||
function onSetupError() {
|
||||
console.log('Settings initialization error');
|
||||
}
|
||||
//
|
||||
function checkSchemeStoredSettings(storedSettings) {
|
||||
if (storedSettings.proxy_scheme == undefined)
|
||||
storedSettings.proxy_scheme = 'http';
|
||||
else proxy_scheme = storedSettings.proxy_scheme;
|
||||
|
||||
console.log('Initialising Proxy Scheme', storedSettings.proxy_scheme);
|
||||
setupProxy();
|
||||
}
|
||||
var gettingSchemeStoredSettings = browser.storage.local.get('proxy_scheme');
|
||||
gettingSchemeStoredSettings.then(checkSchemeStoredSettings, onSetupError);
|
||||
|
||||
//
|
||||
function checkHostStoredSettings(storedSettings) {
|
||||
if (storedSettings.proxy_host == undefined)
|
||||
storedSettings.proxy_host = '127.0.0.1';
|
||||
else proxy_host = storedSettings.proxy_host;
|
||||
|
||||
console.log('Initialising Host', storedSettings.proxy_host);
|
||||
setupProxy();
|
||||
}
|
||||
var gettingHostStoredSettings = browser.storage.local.get('proxy_host');
|
||||
gettingHostStoredSettings.then(checkHostStoredSettings, onSetupError);
|
||||
|
||||
//
|
||||
function checkPortStoredSettings(storedSettings) {
|
||||
if (storedSettings.proxy_port == undefined)
|
||||
storedSettings.proxy_port = '4444';
|
||||
else proxy_port = storedSettings.proxy_port;
|
||||
|
||||
console.log('Initialising Port', storedSettings.proxy_port);
|
||||
setupProxy();
|
||||
}
|
||||
var gettingPortStoredSettings = browser.storage.local.get('proxy_port');
|
||||
gettingPortStoredSettings.then(checkPortStoredSettings, onSetupError);
|
||||
|
||||
//
|
||||
function checkControlHostStoredSettings(storedSettings) {
|
||||
if (storedSettings.control_host == undefined)
|
||||
storedSettings.control_host = '127.0.0.1';
|
||||
else control_host = storedSettings.control_host;
|
||||
|
||||
console.log('Initialising Control Host', storedSettings.control_host);
|
||||
setupProxy();
|
||||
}
|
||||
var gettingControlHostStoredSettings = browser.storage.local.get(
|
||||
'control_host'
|
||||
);
|
||||
gettingControlHostStoredSettings.then(
|
||||
checkControlHostStoredSettings,
|
||||
onSetupError
|
||||
);
|
||||
|
||||
//
|
||||
function checkControlPortStoredSettings(storedSettings) {
|
||||
if (storedSettings.control_port == undefined)
|
||||
storedSettings.control_port = '7657';
|
||||
else control_port = storedSettings.control_port;
|
||||
|
||||
console.log('Initialising Control Port', storedSettings.control_port);
|
||||
setupProxy();
|
||||
}
|
||||
var gettingControlPortStoredSettings = browser.storage.local.get(
|
||||
'control_port'
|
||||
);
|
||||
gettingControlPortStoredSettings.then(
|
||||
checkControlPortStoredSettings,
|
||||
onSetupError
|
||||
);
|
||||
|
||||
//
|
||||
function checkHistoryStoredSettings(storedSettings) {
|
||||
if (storedSettings.disable_history == undefined)
|
||||
storedSettings.disable_history = false;
|
||||
else disable_history = storedSettings.disable_history;
|
||||
|
||||
console.log(
|
||||
'Initialising Disabled History',
|
||||
storedSettings.disable_history
|
||||
);
|
||||
setupProxy();
|
||||
}
|
||||
var gettingHistoryStoredSettings = browser.storage.local.get(
|
||||
'disable_history'
|
||||
);
|
||||
gettingHistoryStoredSettings.then(checkHistoryStoredSettings, onSetupError);
|
||||
}
|
||||
|
||||
function getScheme() {
|
||||
if (proxy_scheme == 'HTTP') return 'http';
|
||||
if (proxy_scheme == 'SOCKS') return 'socks';
|
||||
if (proxy_scheme == 'http') return 'http';
|
||||
if (proxy_scheme == 'socks') return 'socks';
|
||||
else return 'http';
|
||||
}
|
||||
|
||||
function getHost() {
|
||||
if (proxy_host == undefined) {
|
||||
proxy_host = "127.0.0.1";
|
||||
proxy_host = '127.0.0.1';
|
||||
}
|
||||
return proxy_host;
|
||||
}
|
||||
@@ -131,106 +320,62 @@ function getHost() {
|
||||
function getPort() {
|
||||
if (proxy_port == undefined) {
|
||||
var scheme = getScheme();
|
||||
if (scheme == "socks") {
|
||||
proxy_port = "4446";
|
||||
} else {
|
||||
proxy_port = "4444";
|
||||
}
|
||||
if (scheme == 'socks') proxy_port = '4446';
|
||||
else proxy_port = '4444';
|
||||
}
|
||||
return proxy_port;
|
||||
}
|
||||
|
||||
function getControlHost() {
|
||||
if (control_host == undefined) {
|
||||
return "127.0.0.1";
|
||||
}
|
||||
return control_host;
|
||||
}
|
||||
|
||||
function getControlPort() {
|
||||
function getConsolePort() {
|
||||
if (control_port == undefined) {
|
||||
return "4444";
|
||||
var scheme = getScheme();
|
||||
if (scheme == 'socks') proxy_port = '7657';
|
||||
else control_port = '7657';
|
||||
}
|
||||
return control_port;
|
||||
}
|
||||
|
||||
function setupProxy() {
|
||||
var controlHost = getControlHost();
|
||||
var controlPort = getControlPort();
|
||||
var Host = getHost();
|
||||
var Port = getPort();
|
||||
var Scheme = getScheme();
|
||||
if (!getChrome()) {
|
||||
/**/
|
||||
console.log("Setting up Firefox WebExtension proxy");
|
||||
browser.proxy.onRequest.addListener(handleContextProxyRequest, {
|
||||
urls: ["<all_urls>"]
|
||||
console.log('Setting up Firefox WebExtension proxy');
|
||||
browser.proxy.onRequest.addListener(handleContextProxyRequest, {
|
||||
urls: ['<all_urls>'],
|
||||
});
|
||||
console.log('i2p settings created for WebExtension Proxy');
|
||||
}
|
||||
|
||||
function update() {
|
||||
console.log('restoring proxy scheme:', proxy_scheme);
|
||||
console.log('restoring proxy host:', proxy_host);
|
||||
console.log('restoring proxy port:', proxy_port);
|
||||
console.log('restoring control host:', control_host);
|
||||
console.log('restoring control port:', control_port);
|
||||
}
|
||||
|
||||
function updateFromStorage() {
|
||||
console.log('updating settings from storage');
|
||||
chrome.storage.local.get(function() {
|
||||
SetupSettings();
|
||||
update();
|
||||
setupProxy();
|
||||
});
|
||||
var gettingInfo = browser.runtime.getPlatformInfo();
|
||||
gettingInfo.then((got) => {
|
||||
if (got.os != 'android') {
|
||||
browser.windows.getAll().then((wins) => wins.forEach(themeWindow));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
updateFromStorage();
|
||||
browser.storage.onChanged.addListener(updateFromStorage);
|
||||
SetupSettings();
|
||||
setupProxy();
|
||||
|
||||
var gettingListenerInfo = browser.runtime.getPlatformInfo();
|
||||
gettingListenerInfo.then((got) => {
|
||||
browser.windows.onCreated.addListener(() => {
|
||||
chrome.storage.local.get(function() {
|
||||
setupProxy();
|
||||
});
|
||||
console.log("i2p settings created for WebExtension Proxy");
|
||||
/**/
|
||||
} else {
|
||||
var config = {
|
||||
mode: "fixed_servers",
|
||||
rules: {
|
||||
singleProxy: {
|
||||
scheme: Scheme,
|
||||
host: Host,
|
||||
port: parseInt(Port)
|
||||
}
|
||||
}
|
||||
};
|
||||
chrome.proxy.settings.set(
|
||||
{
|
||||
value: config,
|
||||
scope: "regular"
|
||||
},
|
||||
function() {}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function checkStoredSettings(storedSettings) {
|
||||
let defaultSettings = {};
|
||||
if (!storedSettings.proxy_scheme) {
|
||||
defaultSettings["proxy_scheme"] = "http";
|
||||
}
|
||||
if (!storedSettings.proxy_host) {
|
||||
defaultSettings["proxy_host"] = "127.0.0.1";
|
||||
}
|
||||
if (!storedSettings.proxy_port) {
|
||||
defaultSettings["proxy_port"] = 4444;
|
||||
}
|
||||
if (!storedSettings.control_host) {
|
||||
defaultSettings["control_host"] = "127.0.0.1";
|
||||
}
|
||||
if (!storedSettings.control_port) {
|
||||
defaultSettings["control_port"] = 4444;
|
||||
}
|
||||
chrome.storage.local.set(defaultSettings);
|
||||
}
|
||||
|
||||
function update(restoredSettings) {
|
||||
proxy_scheme = restoredSettings.proxy_scheme;
|
||||
console.log("restoring proxy scheme:", proxy_scheme);
|
||||
proxy_host = restoredSettings.proxy_host;
|
||||
console.log("restoring proxy host:", proxy_host);
|
||||
proxy_port = restoredSettings.proxy_port;
|
||||
console.log("restoring proxy port:", proxy_port);
|
||||
control_host = restoredSettings.control_host;
|
||||
console.log("restoring control host:", control_host);
|
||||
control_port = restoredSettings.control_port;
|
||||
console.log("restoring control port:", control_port);
|
||||
}
|
||||
|
||||
chrome.storage.local.get(function(got) {
|
||||
checkStoredSettings(got);
|
||||
update(got);
|
||||
setupProxy();
|
||||
});
|
||||
});
|
||||
|
||||
// Theme all currently open windows
|
||||
if (!getChrome()) {
|
||||
if (!isDroid()) {
|
||||
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
|
||||
}
|
||||
}
|
||||
|
198
releases.atom
Normal file
@@ -0,0 +1,198 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US">
|
||||
<id>tag:github.com,2008:https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases</id>
|
||||
<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-12-14T19:47:34Z</updated>
|
||||
<entry>
|
||||
<id>tag:github.com,2008:Repository/169256012/0.91</id>
|
||||
<updated>2020-12-14T19:47:59Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.91"/>
|
||||
<title>0.91</title>
|
||||
<enclosure url="magnet:?xt=urn:btih:991cc1181d816c20629caef454ebabf14785fbf7" 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.91-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Exclude clearnet code hosting sites from scrub checks</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Sat, 14 DEC 2020 2:46:23 -0400</p>
|
||||
<p>i2psetproxy.js (0.89-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.89</id>
|
||||
<updated>2020-12-13T19:11:13Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.89"/>
|
||||
<title>0.89</title>
|
||||
<content type="html"><p>============================</p>
|
||||
<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.89-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Pages with lots of AJAX requests could trigger a performance degradation</li>
|
||||
<li>Improve performance of x-i2p-* headers and meta tags</li>
|
||||
</ul>
|
||||
<p>i2psetproxy.js (0.87-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.87</id>
|
||||
<updated>2020-12-06T18:37:57Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.87"/>
|
||||
<title>0.87</title>
|
||||
<content type="html"><p>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.87-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Disable searching for i2p sites in non-i2p search engines</li>
|
||||
<li>Add contexts for i2pbote and Dispatch</li>
|
||||
<li>Remain in tighter control of x-i2p-torrentlocation priority</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Sat, 10 NOV 2020 1:33:50 -0400</p>
|
||||
<p>i2psetproxy.js (0.85-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.85</id>
|
||||
<updated>2020-11-11T06:44:44Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.85"/>
|
||||
<title>0.85</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.85-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Fix a bug which was causing i2psnark to fail to isolate.</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Sat, 10 NOV 2020 1:33:50 -0400</p>
|
||||
<p>i2psetproxy.js (0.83-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.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>
|
||||
<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>
|
||||
<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>
|
||||
<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.75</id>
|
||||
<updated>2020-06-23T03:22:59Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.75"/>
|
||||
<title>0.75</title>
|
||||
<content type="html"><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.75-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Update bookmarks format</li>
|
||||
<li>Deprecate WebRTC State Management</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Mon, 22 JUN 2020 11:22:37 -0400</p>
|
||||
<p>i2psetproxy.js (0.73-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.73</id>
|
||||
<updated>2020-03-24T23:49:45Z</updated>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.73"/>
|
||||
<title>0.73</title>
|
||||
<content type="html"><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.73-1) UNRELEASED; urgency=low</p>
|
||||
<ul>
|
||||
<li>Fix incomplete bugfix from 0.69 again</li>
|
||||
</ul>
|
||||
<p>-- idk <a href="mailto:hankhill19580@gmail.com">hankhill19580@gmail.com</a> Tue, 24 MAR 2020 19:48:14 -0400</p>
|
||||
<p>i2psetproxy.js (0.71-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>
|
BIN
routerconsole.png
Normal file
After Width: | Height: | Size: 242 KiB |
151
script.js
Normal file
@@ -0,0 +1,151 @@
|
||||
browser.runtime.onMessage.addListener((request) => {
|
||||
var response = 'no-alt-location';
|
||||
console.log(request);
|
||||
if (request.req === 'i2p-location') {
|
||||
var tag = document.querySelector('meta[http-equiv="i2p-location"]');
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
if (tag) response = tag.content;
|
||||
}
|
||||
var tag = document.querySelector('meta[http-equiv="x-i2p-location"]');
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
if (tag) response = tag.content;
|
||||
}
|
||||
}
|
||||
if (request.req === 'i2p-torrentlocation') {
|
||||
var tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
response = i2pTorrent(tag);
|
||||
}
|
||||
var tag = document.querySelector(
|
||||
'meta[http-equiv="x-i2p-torrentlocation"]'
|
||||
);
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
response = i2pTorrent(tag);
|
||||
}
|
||||
}
|
||||
return Promise.resolve({ content: response });
|
||||
});
|
||||
|
||||
window.document.onload = function (e) {
|
||||
console.log("presetting x-i2p-torrentlocation");
|
||||
var tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
response = i2pTorrent(tag);
|
||||
}
|
||||
var tag = document.querySelector('meta[http-equiv="x-i2p-torrentlocation"]');
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
response = i2pTorrent(tag);
|
||||
}
|
||||
};
|
||||
|
||||
console.log("presetting x-i2p-torrentlocation");
|
||||
var tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
response = i2pTorrent(tag);
|
||||
}
|
||||
var tag = document.querySelector('meta[http-equiv="x-i2p-torrentlocation"]');
|
||||
if (tag != undefined) {
|
||||
console.log(tag);
|
||||
response = i2pTorrent(tag);
|
||||
}
|
||||
|
||||
function i2pTorrent(tag) {
|
||||
let response = "no-alt-location";
|
||||
if (tag) {
|
||||
response = tag.content;
|
||||
var imgs = document.getElementsByTagName("img");
|
||||
console.log("rewriting torrent link");
|
||||
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 videos = document.getElementsByTagName("video");
|
||||
for (let video of videos) {
|
||||
video.setAttribute("preload", "none");
|
||||
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 + "/"
|
||||
);
|
||||
// let url = new URL("http://127.0.0.1:7657/i2psnark/"+location.host+"/"location.path)
|
||||
console.log(
|
||||
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname
|
||||
); //+"/"location.path)
|
||||
video.src =
|
||||
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname;
|
||||
video.innerHTML = topInnerHTML; // + innerHTML;
|
||||
video.onerror = function () {
|
||||
console.log("video error");
|
||||
video.innerHTML = topInnerHTML + innerHTML;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
var audios = document.getElementsByTagName("audio");
|
||||
for (let audio of audios) {
|
||||
audio.setAttribute("preload", "none");
|
||||
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 + "/"
|
||||
);
|
||||
//console.log("http://127.0.0.1:7657/i2psnark/" + location); //.host+"/"location.path)
|
||||
console.log(
|
||||
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname
|
||||
); //+"/"location.path)
|
||||
audio.src =
|
||||
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname;
|
||||
audio.innerHTML = topInnerHTML; // + innerHTML;
|
||||
audio.onerror = function () {
|
||||
console.log("audio error");
|
||||
audio.innerHTML = topInnerHTML + innerHTML;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
var links = document.getElementsByTagName("a");
|
||||
for (let link of links) {
|
||||
let tmpsrc = new URL(link.href);
|
||||
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(".")
|
||||
) {
|
||||
link.href =
|
||||
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname;
|
||||
link.onerror = function () {
|
||||
window.location.href = tmpsrc.href;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
898
scrub.js
@@ -1,232 +1,838 @@
|
||||
var titlepref = chrome.i18n.getMessage('titlePreface');
|
||||
var webpref = chrome.i18n.getMessage('webPreface');
|
||||
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 ircpref = chrome.i18n.getMessage('ircPreface');
|
||||
var extensionpref = chrome.i18n.getMessage('extensionPreface');
|
||||
var muwirepref = chrome.i18n.getMessage('muwirePreface');
|
||||
var botepref = chrome.i18n.getMessage('botePreface');
|
||||
|
||||
var contextScrub = async function(requestDetails) {
|
||||
console.log("(scrub)Scrubbing info from contextualized request");
|
||||
function onHeaderError() {
|
||||
console.log('Header scrub error');
|
||||
}
|
||||
try {
|
||||
var headerScrub = function(context) {
|
||||
var ua = 'MYOB/6.66 (AN/ON)';
|
||||
if (!context) {
|
||||
console.error("Context not found");
|
||||
} else {
|
||||
if ((context.name = "i2pbrowser")) {
|
||||
var ua = "MYOB/6.66 (AN/ON)";
|
||||
if (i2pHost(requestUrl.url)) {
|
||||
for (var header of requestDetails.requestHeaders) {
|
||||
if (header.name.toLowerCase() === "user-agent") {
|
||||
header.value = ua;
|
||||
console.log("(scrub)User-Agent header modified", header.value);
|
||||
}
|
||||
}
|
||||
} else if (context.name == titlepref) {
|
||||
for (var header of requestDetails.requestHeaders) {
|
||||
if (header.name.toLowerCase() === 'user-agent') {
|
||||
header.value = ua;
|
||||
}
|
||||
return {
|
||||
requestHeaders: requestDetails.requestHeaders
|
||||
};
|
||||
}
|
||||
return {
|
||||
requestHeaders: requestDetails.requestHeaders,
|
||||
};
|
||||
}
|
||||
};
|
||||
var contextGet = async function(tabInfo) {
|
||||
try {
|
||||
console.log("(scrub)Tab info from Function", tabInfo);
|
||||
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
|
||||
//console.log("(scrub)Tab info from Function", tabInfo);
|
||||
let context = await browser.contextualIdentities.get(
|
||||
tabInfo.cookieStoreId
|
||||
);
|
||||
return context;
|
||||
} catch (error) {
|
||||
console.log("(scrub)Conext Error", error);
|
||||
}
|
||||
};
|
||||
var tabFind = async function(tabId) {
|
||||
try {
|
||||
context = await browser.contextualIdentities.query({
|
||||
name: "i2pbrowser"
|
||||
});
|
||||
tabId.cookieStoreId = context[0].cookieStoreId;
|
||||
console.log("(scrub) forcing context", tabId.cookieStoreId);
|
||||
return tabId;
|
||||
} catch (error) {
|
||||
console.log("(scrub)Context Error", error);
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(scrub)Tab ID from Request", tabId);
|
||||
//console.log("(scrub)Tab ID from Request", tabId);
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
console.log("(scrub)Tab error", error);
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
if (requestDetails.tabId > 0) {
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
console.log("(Proxy)I2P URL detected, ");
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(tabFind);
|
||||
requestDetails.tabId = mtab;
|
||||
var context = mtab.then(contextGet);
|
||||
var req = await context.then(headerScrub);
|
||||
console.log("(scrub)Scrubbing I2P Request", req);
|
||||
return req;
|
||||
} else {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var context = tab.then(contextGet);
|
||||
var req = await context.then(headerScrub);
|
||||
console.log("(scrub)Scrubbing I2P Request", req);
|
||||
return req;
|
||||
}
|
||||
tab = tabGet(requestDetails.tabId);
|
||||
context = tab.then(contextGet, onHeaderError);
|
||||
req = context.then(headerScrub, onHeaderError);
|
||||
//console.log("(scrub)Scrubbing I2P Request", req);
|
||||
return req;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(scrub)Not scrubbing non-I2P request.", error);
|
||||
console.log('(scrub)Not scrubbing non-I2P request.', error);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var contextSetup = async function(requestDetails) {
|
||||
console.log("(isolate)Forcing I2P requests into context");
|
||||
var notMyContextNotMyProblem = async function() {
|
||||
var contexts = await browser.contextualIdentities.query({});
|
||||
var context1 = await browser.contextualIdentities.query({
|
||||
name: titlepref,
|
||||
});
|
||||
var context2 = await browser.contextualIdentities.query({
|
||||
name: routerpref,
|
||||
});
|
||||
var context3 = await browser.contextualIdentities.query({
|
||||
name: mailpref,
|
||||
});
|
||||
var context4 = await browser.contextualIdentities.query({
|
||||
name: torrentpref,
|
||||
});
|
||||
var context5 = await browser.contextualIdentities.query({
|
||||
name: tunnelpref,
|
||||
});
|
||||
var context6 = await browser.contextualIdentities.query({
|
||||
name: ircpref,
|
||||
});
|
||||
var context7 = await browser.contextualIdentities.query({
|
||||
name: muwirepref,
|
||||
});
|
||||
var context7 = await browser.contextualIdentities.query({
|
||||
name: botepref,
|
||||
});
|
||||
var othercontexts = [];
|
||||
console.log('Contexts:', contexts);
|
||||
for (context in contexts) {
|
||||
if (
|
||||
contexts[context].cookieStoreId == context1[0].cookieStoreId ||
|
||||
contexts[context].cookieStoreId == context2[0].cookieStoreId ||
|
||||
contexts[context].cookieStoreId == context3[0].cookieStoreId ||
|
||||
contexts[context].cookieStoreId == context4[0].cookieStoreId ||
|
||||
contexts[context].cookieStoreId == context5[0].cookieStoreId ||
|
||||
contexts[context].cookieStoreId == context6[0].cookieStoreId ||
|
||||
contexts[context].cookieStoreId == context7[0].cookieStoreId
|
||||
) {
|
||||
console.log(
|
||||
'Context found',
|
||||
contexts[context].cookieStoreId,
|
||||
'is my responsibility'
|
||||
);
|
||||
} else {
|
||||
//console.log("Context found", contexts[context].cookieStoreId, "is not my responsibility")
|
||||
othercontexts.push(contexts[context]);
|
||||
}
|
||||
}
|
||||
return othercontexts;
|
||||
}
|
||||
|
||||
var contextSetup = function(requestDetails) {
|
||||
function onContextError() {
|
||||
console.log('Context launcher error');
|
||||
}
|
||||
//console.log("(isolate)Forcing I2P requests into context");
|
||||
try {
|
||||
var tabFind = async function(tabId) {
|
||||
var i2pTabFind = async function(tabId) {
|
||||
try {
|
||||
context = await browser.contextualIdentities.query({
|
||||
name: "i2pbrowser"
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: titlepref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
function closeOldTab() {
|
||||
if (tabId.id != tab.id) {
|
||||
console.log('(isolate) Closing un-isolated tab', tabId.id);
|
||||
console.log('in favor of', tab.id);
|
||||
console.log('with context', tab.cookieStoreId);
|
||||
browser.tabs.remove(tabId.id);
|
||||
}
|
||||
browser.pageAction.setPopup({
|
||||
tabId: tabId.id,
|
||||
popup: 'security.html',
|
||||
});
|
||||
browser.pageAction.show(tabId.id);
|
||||
}
|
||||
closeOldTab(tab);
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
created = browser.tabs.create({
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
getting = browser.windows.create();
|
||||
getting.then(Create);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var routerTabFind = async function(tabId) {
|
||||
try {
|
||||
context = await browser.contextualIdentities.query({
|
||||
name: "routerconsole"
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: routerpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
console.log(
|
||||
"(isolate) forcing",
|
||||
requestDetails.url,
|
||||
" context",
|
||||
tabId.cookieStoreId,
|
||||
context[0].cookieStoreId
|
||||
);
|
||||
function Create(window) {
|
||||
function Create() {
|
||||
function onCreated(tab) {
|
||||
console.log("(isolate) Closing old, un-isolated tab");
|
||||
browser.tabs.remove(tabId.id);
|
||||
browser.tabs.remove(window.tabs[0].id);
|
||||
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: 0 });
|
||||
}
|
||||
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);
|
||||
}
|
||||
function onError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
if (requestDetails.url.endsWith('xhr1.html')) {
|
||||
hostname = url.split('/')[2];
|
||||
let prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
requestDetails.url = prefix + hostname + '/home';
|
||||
}
|
||||
created = browser.tabs.create({
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
windowId: window.id
|
||||
});
|
||||
created.then(onCreated, onError);
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
getting = browser.windows.create();
|
||||
getting.then(Create);
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("(isolate)Context Error", error);
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var i2ptunnelTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: tunnelpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
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: 0 });
|
||||
}
|
||||
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);
|
||||
}
|
||||
if (requestDetails.url.endsWith('xhr1.html')) {
|
||||
hostname = url.split('/')[2];
|
||||
let prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
requestDetails.url = prefix + hostname + '/i2ptunnelmgr/';
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var snarkTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: torrentpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
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: 0 });
|
||||
}
|
||||
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);
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var muwireTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: muwirepref,
|
||||
});
|
||||
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: 0 });
|
||||
}
|
||||
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);
|
||||
}
|
||||
if (requestDetails.url.endsWith('xhr1.html')) {
|
||||
hostname = url.split('/')[2];
|
||||
let prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
requestDetails.url = prefix + hostname + '/muwire/';
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var i2pboteTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: botepref,
|
||||
});
|
||||
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: 0 });
|
||||
}
|
||||
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);
|
||||
}
|
||||
if (requestDetails.url.endsWith('xhr1.html')) {
|
||||
hostname = url.split('/')[2];
|
||||
let prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
requestDetails.url = prefix + hostname + '/i2pbote/';
|
||||
}
|
||||
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;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var mailTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: mailpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
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: 0 });
|
||||
}
|
||||
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);
|
||||
}
|
||||
if (requestDetails.url.endsWith('xhr1.html')) {
|
||||
hostname = url.split('/')[2];
|
||||
let prefix = url.substr(0, url.indexOf('://') + 3);
|
||||
requestDetails.url = prefix + hostname + '/webmail/';
|
||||
}
|
||||
var created = browser.tabs.create({
|
||||
active: true,
|
||||
pinned: true,
|
||||
cookieStoreId: context[0].cookieStoreId,
|
||||
url: requestDetails.url,
|
||||
});
|
||||
created.then(onCreated, onContextError);
|
||||
}
|
||||
var gettab = browser.tabs.get(tabId.id);
|
||||
gettab.then(Create, onContextError);
|
||||
return tabId;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var ircTabFind = async function(tabId) {
|
||||
try {
|
||||
var context = await browser.contextualIdentities.query({
|
||||
name: ircpref,
|
||||
});
|
||||
if (tabId.cookieStoreId != context[0].cookieStoreId) {
|
||||
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);
|
||||
browser.tabs.move(tab.id, { index: 0 });
|
||||
}
|
||||
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 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;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('(isolate)Context Error', error);
|
||||
}
|
||||
};
|
||||
var tabGet = async function(tabId) {
|
||||
try {
|
||||
console.log("(isolate)Tab ID from Request", tabId);
|
||||
//console.log("(isolate)Tab ID from Request", tabId);
|
||||
let tabInfo = await browser.tabs.get(tabId);
|
||||
return tabInfo;
|
||||
} catch (error) {
|
||||
console.log("(isolate)Tab error", error);
|
||||
console.log('(isolate)Tab error', error);
|
||||
}
|
||||
};
|
||||
if (requestDetails == undefined) {
|
||||
return requestDetails;
|
||||
}
|
||||
if (proxyHost(requestDetails.url)) {
|
||||
setcookie = browser.cookies.set({
|
||||
firstPartyDomain: i2pHostName(requestDetails.url),
|
||||
url: requestDetails.url,
|
||||
secure: true,
|
||||
});
|
||||
setcookie.then(onContextGotLog, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
|
||||
if (requestDetails.tabId > 0) {
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(tabFind);
|
||||
return requestDetails;
|
||||
}
|
||||
if (routerHost(requestDetails.url)) {
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
var mtab = tab.then(routerTabFind);
|
||||
return requestDetails;
|
||||
var tab = tabGet(requestDetails.tabId);
|
||||
tab.then(isolate);
|
||||
|
||||
function isolate(oldtab) {
|
||||
let localhost = localHost(requestDetails.url);
|
||||
let routerhost = routerHost(requestDetails.url);
|
||||
if (routerhost) {
|
||||
if (routerhost === 'i2ptunnelmgr') {
|
||||
var tunneltab = tab.then(i2ptunnelTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === 'i2psnark') {
|
||||
var snarktab = tab.then(snarkTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === 'webmail') {
|
||||
var mailtab = tab.then(mailTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === 'muwire') {
|
||||
var routertab = tab.then(muwireTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === 'i2pbote') {
|
||||
var routertab = tab.then(i2pboteTabFind, onContextError);
|
||||
return requestDetails;
|
||||
} else if (routerhost === 'routerconsole') {
|
||||
var routertab = tab.then(routerTabFind, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
} else {
|
||||
if (localhost) {
|
||||
var irctab = tab.then(ircTabFind, onContextError);
|
||||
return requestDetails;
|
||||
}
|
||||
}
|
||||
// if (oldtab.cookieStoreId == 'firefox-default') {
|
||||
if (i2pHost(requestDetails.url)) {
|
||||
var thn = i2pHostName(requestDetails.url);
|
||||
if (requestDetails.url.includes('=' + thn)) {
|
||||
if (
|
||||
!requestDetails.url.includes('://github.com') ||
|
||||
!requestDetails.url.includes('://notabug.org') ||
|
||||
!requestDetails.url.includes('://i2pgit.org') ||
|
||||
!requestDetails.url.includes('://gitlab.com')
|
||||
) {
|
||||
if (!localhost) {
|
||||
console.log('(scrub)checking search hostnames =' + thn);
|
||||
var tpt = requestDetails.url.split('=' + thn, 2);
|
||||
requestDetails.url =
|
||||
'http://' + thn + '/' + tpt[1].replace('%2F', '');
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('(scrub) new hostname', requestDetails.url);
|
||||
var setcookie = browser.cookies.set({
|
||||
firstPartyDomain: i2pHostName(requestDetails.url),
|
||||
url: requestDetails.url,
|
||||
secure: true,
|
||||
});
|
||||
setcookie.then(onContextGotLog, onContextError);
|
||||
if (!routerhost) {
|
||||
var i2ptab = tab.then(i2pTabFind, onContextError);
|
||||
}
|
||||
return requestDetails;
|
||||
}
|
||||
if (extensionHost(requestDetails)) {
|
||||
return requestDetails;
|
||||
}
|
||||
|
||||
//}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(
|
||||
"(isolate)Not an I2P request, no need to force into alternate cookiestore.",
|
||||
error
|
||||
);
|
||||
console.log('(isolate)Not an I2P request, blackholing', error);
|
||||
}
|
||||
};
|
||||
|
||||
function i2pHostName(url) {
|
||||
let hostname = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
var coolheadersSetup = function(e) {
|
||||
var asyncSetPageAction = new Promise((resolve, reject) => {
|
||||
window.setTimeout(() => {
|
||||
if (e.tabId != undefined) {
|
||||
popup = browser.pageAction.getPopup({ tabId: e.tabId });
|
||||
popup.then(gotPopup);
|
||||
}
|
||||
function gotPopup(p) {
|
||||
console.log('(scrub) checking popup', p);
|
||||
if (p.length != 0) return;
|
||||
let headers = e.responseHeaders.filter((word) =>
|
||||
word.name.toUpperCase().includes('I2P')
|
||||
);
|
||||
for (i = headers.length - 1; i >= 0; i--) {
|
||||
let header = headers[i];
|
||||
console.log('(scrub) checking header', header);
|
||||
if (header.name.toUpperCase().endsWith('I2P-LOCATION')) {
|
||||
var tab = browser.tabs.get(e.tabId);
|
||||
tab.then(altSrc);
|
||||
function altSrc(tab) {
|
||||
console.log('(scrub) X-I2P-LOCATION');
|
||||
let url = new URL(header.value);
|
||||
browser.pageAction.setPopup({
|
||||
tabId: e.tabId,
|
||||
popup: 'location.html',
|
||||
});
|
||||
browser.pageAction.setIcon({
|
||||
path: 'icons/i2plogo.png',
|
||||
tabId: e.tabId,
|
||||
});
|
||||
let eurl = new URL(tab.url);
|
||||
browser.pageAction.setTitle({
|
||||
tabId: e.tabId,
|
||||
title: 'http://' + url.host + eurl.pathname,
|
||||
});
|
||||
browser.pageAction.show(e.tabId);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
if (header.name.toUpperCase().endsWith('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;
|
||||
video.onerror = function() {
|
||||
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;
|
||||
audio.onerror = function() {
|
||||
audio.innerHTML = topInnerHTML + innerHTML;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
browser.pageAction.setPopup({
|
||||
tabId: tabId.id,
|
||||
popup: 'torrent.html',
|
||||
});
|
||||
browser.pageAction.setIcon({
|
||||
path: 'icons/i2plogo.png',
|
||||
tabId: e.tabId,
|
||||
});
|
||||
browser.pageAction.setTitle({
|
||||
tabId: e.tabId,
|
||||
title: header.value,
|
||||
});
|
||||
browser.pageAction.show(e.tabId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
resolve({ responseHeaders: e.responseHeaders });
|
||||
}, 2000);
|
||||
});
|
||||
return asyncSetPageAction;
|
||||
};
|
||||
|
||||
function getTabURL(tab) {
|
||||
if (tab.url.startsWith("https")) {
|
||||
try {
|
||||
browser.tabs
|
||||
.sendMessage(tab.id, { req: "i2p-location" })
|
||||
.then((response) => {
|
||||
if (response != undefined) {
|
||||
console.log("(scrub) i2p-location response object", 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);
|
||||
} catch (e) {
|
||||
console.log("(pageaction)", e);
|
||||
}
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
try {
|
||||
browser.tabs
|
||||
.sendMessage(tab.id, { req: "i2p-torrentlocation" })
|
||||
.then((response) => {
|
||||
if (response != undefined) {
|
||||
console.log("(scrub) i2p-location response object", 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);
|
||||
} catch (e) {
|
||||
console.log("(pageaction)", e);
|
||||
}
|
||||
}
|
||||
return hostname;
|
||||
}
|
||||
|
||||
function i2pHost(url) {
|
||||
let hostname = i2pHostName(url);
|
||||
return hostname.endsWith(".i2p");
|
||||
}
|
||||
|
||||
function routerHost(url) {
|
||||
let hostname = "";
|
||||
if (url.indexOf("://") > -1) {
|
||||
hostname = url.split("/")[2];
|
||||
function getClearTab(tobj) {
|
||||
function setupTabs(tobj) {
|
||||
if (typeof tobj == "number") {
|
||||
browser.tabs.get(tobj).then(getTabURL, onError);
|
||||
}
|
||||
if (typeof tobj.tabId == "number") {
|
||||
console.log("(scrub) tobj", tobj);
|
||||
browser.tabs.get(tobj.tabId).then(getTabURL, onError);
|
||||
} else {
|
||||
for (let tab in tobj.tabIds) {
|
||||
console.log("(scrub) tab", tobj.tabIds[tab]);
|
||||
browser.tabs.get(tobj.tabIds[tab]).then(getTabURL, onError);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tobj != undefined) {
|
||||
setupTabs(tobj);
|
||||
} else {
|
||||
hostname = url.split("/")[0];
|
||||
browser.tabs.query({}).then(setupTabs);
|
||||
}
|
||||
if (hostname === "127.0.0.1:7657") {
|
||||
return true;
|
||||
} else if (hostname === "localhost:7657") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (hostname === "127.0.0.1:7070") {
|
||||
return true;
|
||||
} else if (hostname === "localhost:7070") {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
browser.webRequest.onBeforeRequest.addListener(
|
||||
contextSetup,
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking"]
|
||||
const filter = {
|
||||
url: [{ hostContains: ".i2p" }],
|
||||
};
|
||||
|
||||
function logOnDOMContentLoaded(details) {
|
||||
console.log(`onDOMContentLoaded: ${details.url}`);
|
||||
}
|
||||
|
||||
browser.tabs.onActivated.addListener(getClearTab);
|
||||
browser.tabs.onAttached.addListener(getClearTab);
|
||||
browser.tabs.onCreated.addListener(getClearTab);
|
||||
browser.tabs.onDetached.addListener(getClearTab);
|
||||
browser.tabs.onHighlighted.addListener(getClearTab);
|
||||
browser.tabs.onMoved.addListener(getClearTab);
|
||||
browser.tabs.onReplaced.addListener(getClearTab);
|
||||
|
||||
browser.pageAction.onClicked.addListener(getClearTab);
|
||||
|
||||
function reloadTabs(tabs) {
|
||||
for (let tab of tabs) {
|
||||
browser.tabs.reload(tab.id);
|
||||
}
|
||||
}
|
||||
|
||||
function reloadError(error) {
|
||||
console.log(`Error: ${error}`);
|
||||
}
|
||||
|
||||
let querying = browser.tabs.query({});
|
||||
querying.then(reloadTabs, onError);
|
||||
|
||||
// Listen for onHeaderReceived for the target page.
|
||||
// Set "blocking" and "responseHeaders".
|
||||
browser.webRequest.onHeadersReceived.addListener(
|
||||
coolheadersSetup,
|
||||
{ urls: ["*://*.i2p/*", "https://*/*"] },
|
||||
["responseHeaders"]
|
||||
);
|
||||
|
||||
browser.webNavigation.onDOMContentLoaded.addListener(getClearTab, filter);
|
||||
browser.webNavigation.onDOMContentLoaded.addListener(
|
||||
logOnDOMContentLoaded,
|
||||
filter
|
||||
);
|
||||
|
||||
browser.webRequest.onBeforeRequest.addListener(contextSetup, {
|
||||
urls: ["*://*.i2p/*", "*://localhost/*", "*://127.0.0.1/*", "*://*/*i2p*"],
|
||||
});
|
||||
|
||||
browser.webRequest.onBeforeSendHeaders.addListener(
|
||||
contextScrub,
|
||||
{ urls: ["<all_urls>"] },
|
||||
["blocking", "requestHeaders"]
|
||||
{ urls: ["*://*.i2p/*"] },
|
||||
["requestHeaders"]
|
||||
);
|
||||
|
42
search.css
Normal file
@@ -0,0 +1,42 @@
|
||||
.topnav {
|
||||
overflow: hidden;
|
||||
min-height: 3rem;
|
||||
padding: .5rem;
|
||||
min-width: 64%;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
|
||||
}
|
||||
.topnav a {
|
||||
float: left;
|
||||
display: block;
|
||||
text-align: center;
|
||||
padding: 14px 16px
|
||||
}
|
||||
.topnav a:hover {
|
||||
background-color: #ddd
|
||||
}
|
||||
.topnav a.active {
|
||||
background-color: #2196f3;
|
||||
color: #fff
|
||||
}
|
||||
.topnav input[type=search] {
|
||||
padding: 6px;
|
||||
border: none;
|
||||
margin-top: 8px;
|
||||
color: #e6e6e7;
|
||||
margin-right: 16px
|
||||
}
|
||||
.topnav input[type=submit] {
|
||||
float: right;
|
||||
padding: 6px;
|
||||
border: none;
|
||||
margin-top: 8px;
|
||||
color: #e6e6e7;
|
||||
margin-right: 16px
|
||||
}
|
||||
#search-query {
|
||||
color: #1f1a24
|
||||
}
|
||||
#search-submit {
|
||||
color: #1f1a24
|
||||
}
|
55
security.html
Normal file
@@ -0,0 +1,55 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link href="search.css" rel="stylesheet">
|
||||
<link href="home.css" rel="stylesheet"><!--<link href="info.css" rel="stylesheet">--><!--<link href="torrent/popup.css" rel="stylesheet">-->
|
||||
|
||||
<title>
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="browserpanel">
|
||||
<div class="panel">
|
||||
<div class="section-header panel-section panel-section-header" id="headline">
|
||||
<div class="text-section-header" id="text-section-header">
|
||||
<h1 id="text-section-header">I2P Site Properties</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<ul>
|
||||
<li>
|
||||
<div class="address-info">
|
||||
<div id="addresstype">
|
||||
<span id="TypeLabel">Address Type:</span> <span id="Type"></span>
|
||||
<div id="TypeInfo">
|
||||
<span id="AddressInfo"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<div class="tls-info">
|
||||
<div id="sitecert">
|
||||
<span id="CertLabel">Certificate Information:</span> <span id="Cert"></span>
|
||||
<div id="CertInfo">
|
||||
<span id="AddressCertInfo"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<div id="signingcert">
|
||||
<span id="SignedLabel">Signed By:</span> <span id="Signed"></span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<script src="cert.js"></script>
|
||||
</body>
|
||||
</html>
|
23
sidebar.css
Normal file
@@ -0,0 +1,23 @@
|
||||
li {
|
||||
width: 90%;
|
||||
margin-left: 0
|
||||
}
|
||||
ul {
|
||||
width: 100%
|
||||
}
|
||||
button {
|
||||
width: 50%;
|
||||
text-align: center
|
||||
}
|
||||
#applicationExplain {
|
||||
float: unset
|
||||
}
|
||||
.button-list {
|
||||
display: inline
|
||||
}
|
||||
#hidden {
|
||||
display: none
|
||||
}
|
||||
.hidden {
|
||||
display: none
|
||||
}
|
BIN
susimail.png
Normal file
After Width: | Height: | Size: 162 KiB |
86
toopie.html
Normal file
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>I2P Router Information</title>
|
||||
<link href="home.css" rel="stylesheet" type="text/css">
|
||||
<link href="sidebar.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<script src="i2pcontrol/i2pcontrol.js"></script>
|
||||
<script src="info.js"></script>
|
||||
<script src="content.js"></script>
|
||||
<h1>I2P Router Information</h1>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a href="http://localhost:7657" target="_blank"><img alt="i2p router console" class="center" src="/icons/i2plogo.png"></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="button-list">
|
||||
<li><button id="label-router-restart" target="_blank"><img alt="Restart:" id="label-router-shutdown" src="/images/restart.svg"></button>
|
||||
<br>
|
||||
<span id="router-restart">Gracefully restart router</span>
|
||||
</li>
|
||||
|
||||
<li><button id="label-router-shutdown" target="_blank"><img alt="Shutdown:" id="label-router-shutdown" src="/images/shutdown.svg"></button>
|
||||
<br>
|
||||
<span id="router-shutdown">Gracefully shutdown router</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><button id="label-router-status" target="_blank">Status</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="label-list" id="label-status-list">
|
||||
<li><span id="label-router-status">Router Status:</span> <span id="router-status">Replace with Router Status</span></li>
|
||||
|
||||
<li><span id="label-router-uptime">Router Uptime(Ms):</span> <span id="router-uptime">Replace with Router Uptime</span></li>
|
||||
|
||||
<li><span id="label-router-version">Router Version:</span> <span id="router-version">Replace with Router Version</span></li>
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><button id="label-router-bandwidth" target="_blank">Bandwidth</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="label-list" id="label-bandwidth-list">
|
||||
<li><span id="label-router-bw-outbound-1s">Outbound bw 1s:</span> <span id="router-net-bw-outbound-1s">Replace with Router Bandwidth Outbound 1s</span></li>
|
||||
|
||||
<li><span id="label-router-bw-outbound-15s">Outbound bw 15s:</span> <span id="router-net-bw-outbound-15s">Replace with Router Bandwidth Outbound 15s</span></li>
|
||||
|
||||
<li><span id="label-router-bw-inbound-1s">Inbound bw 1s:</span> <span id="router-net-bw-inbound-1s">Replace with Router Bandwidth Inbound 1s</span></li>
|
||||
|
||||
<li><span id="label-router-bw-inbound-15s">Inbound bw 15s:</span> <span id="router-net-bw-inbound-15s">Replace with Router Bandwidth Outbound 15s</span></li>
|
||||
</ul>
|
||||
<!--<li>
|
||||
<span id="label-router-net-status">Network Status:</span>
|
||||
<span id="router-net-status">Replace with Router Network Status</span>
|
||||
</li>-->
|
||||
|
||||
<ul>
|
||||
<li><button id="label-router-peers" target="_blank">Peers</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="label-list" id="label-peers-list">
|
||||
<li><span id="label-router-net-tunnels-participating">Transit Tunnels:</span> <span id="router-net-tunnels-participating">Replace with Router Participating Tunnel Count</span></li>
|
||||
|
||||
<li><span id="label-router-activepeers">Active Peers:</span> <span id="router-netdb-activepeers">Replace with Router Active Peers</span></li>
|
||||
|
||||
<li><span id="label-router-netdb-fastpeers">Fast Peers:</span> <span id="router-netdb-fastpeers">Replace with Router Fast Peers</span></li>
|
||||
|
||||
<li><span id="label-router-netdb-highcapacitypeers">High Capacity Peers:</span> <span id="router-netdb-highcapacitypeers">Replace with High Capacity Peers</span></li>
|
||||
|
||||
<li><span id="label-router-netdb-isreseeding">Reseed status:</span> <span id="router-netdb-isreseeding">Replace with Router netDB Reseeding Status</span></li>
|
||||
|
||||
<li><span id="label-router-netdb-knownpeers">Known Peers:</span> <span id="router-netdb-knownpeers">Replace with Router Known Peers</span></li>
|
||||
</ul>
|
||||
|
||||
<br>
|
||||
<br>
|
||||
</body>
|
||||
</html>
|
BIN
toopie.png
Normal file
After Width: | Height: | Size: 68 KiB |
39
torrent.html
Normal file
@@ -0,0 +1,39 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link href="search.css" rel="stylesheet">
|
||||
<link href="home.css" rel="stylesheet">
|
||||
<!--<link href="info.css" rel="stylesheet">--><!--<link href="torrent/popup.css" rel="stylesheet">-->
|
||||
|
||||
<title>
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="browserpanel">
|
||||
<div class="panel">
|
||||
<div class="section-header panel-section panel-section-header" id="headline">
|
||||
<div class="text-section-header" id="text-section-header">
|
||||
<h1 id="text-section-header">This I2P Site has peer-to-peer resources.</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<p>
|
||||
To help distribute the site content, use the links below to join the swarm.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<div class="address-info">
|
||||
<span id="TypeLabel">Torrent Links:</span> <span id="Type"></span>
|
||||
<div id="TypeInfo">
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<script src="torrent.js"></script>
|
||||
</body>
|
||||
</html>
|
19
torrent.js
Normal file
@@ -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);
|
42
torrent/README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
Acknowledgement
|
||||
===============
|
||||
|
||||
**Many, many thanks to the [Transmitter](https://github.com/myfreeweb/transmitter)
|
||||
webextension.**
|
||||
|
||||
This part of this plugin contains code which was adapted from the Transmitter
|
||||
webextension, which is a minimal interface to the transmission-rpc interfaces of
|
||||
many torrent clients, including for our purposes snark-rpc and BiglyBT.
|
||||
|
||||
Transmitter is released under the UNLICENSE. An original copy is available at
|
||||
this URL: https://github.com/myfreeweb/transmitter/blob/master/UNLICENSE
|
||||
|
||||
A copy has also been included in this directory.
|
||||
|
||||
Configuring this extension for use with Snark-RPC!
|
||||
--------------------------------------------------
|
||||
|
||||
One of the coolest things this extension is able to do is communicate with
|
||||
a transmission-rpc enabled torrent client. Since it's an I2P focused plugin,
|
||||
the default configuration is set up for use with the I2PSnark-RPC plugin created
|
||||
by zzz. Since Snark-RPC isn't part of the main Java I2P distribution, in order
|
||||
to do this you'll have to install the plugin. You can get a copy of it from
|
||||
inside of I2P here:
|
||||
|
||||
* [stats.i2p main package](http://stats.i2p/i2p/plugins/i2psnark-rpc.su3)
|
||||
* [stats.i2p update package](http://stats.i2p/i2p/plugins/i2psnark-rpc-update.su3)
|
||||
|
||||
I also have a mirror of the package with each release of the webextension,
|
||||
reflecting the version in use in the webextension at the time of the release.
|
||||
|
||||
To install the plugin, go to [http://127.0.0.1:7657/configplugins](http://127.0.0.1:7657/configplugins)
|
||||
and scroll down to the section of the page where it says "Installation from URL"
|
||||
and paste the following URL:
|
||||
|
||||
```http://stats.i2p/i2p/plugins/i2psnark-rpc.su3```
|
||||
|
||||
Click the "Install Plugin" button and you'll be ready to go. Now, open the
|
||||
extension options menu, and just click "Save." The defaults are correct for use
|
||||
with I2PSnark-RPC, but they need to be initialized by saving the settings. If
|
||||
I2PSnark-RPC becomes part of Java I2P, these defaults will be initialized when
|
||||
the plugin is installed.
|
24
torrent/UNLICENSE
Normal file
@@ -0,0 +1,24 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org/>
|
247
torrent/background.js
Normal file
@@ -0,0 +1,247 @@
|
||||
'use strict';
|
||||
|
||||
////// Session extraction
|
||||
|
||||
function setupExtractor() {
|
||||
browser.webRequest.onHeadersReceived.removeListener(extractSession);
|
||||
browser.storage.local.get('server').then(({ server }) => {
|
||||
if (!server) {
|
||||
return;
|
||||
}
|
||||
console.log('Session extractor setup for', server.base_url);
|
||||
browser.webRequest.onBeforeSendHeaders.addListener(
|
||||
extractSession,
|
||||
{ urls: [server.base_url + '*'] },
|
||||
['requestHeaders']
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
setupExtractor();
|
||||
|
||||
function extractSession(requestDetails) {
|
||||
const hdr = requestDetails.requestHeaders.filter(
|
||||
(x) => x.name.toLowerCase() === "x-transmission-session-id"
|
||||
)[0];
|
||||
if (!hdr) {
|
||||
return;
|
||||
}
|
||||
browser.storage.local.get("server").then(({ server }) => {
|
||||
server.session = hdr.value;
|
||||
browser.storage.local.set({ server });
|
||||
});
|
||||
}
|
||||
|
||||
////// Adding
|
||||
|
||||
function blobToBase64(blob) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const rdr = new FileReader();
|
||||
rdr.onload = () => resolve(rdr.result.substr(rdr.result.indexOf(",") + 1));
|
||||
rdr.onerror = reject;
|
||||
rdr.readAsDataURL(blob);
|
||||
});
|
||||
}
|
||||
|
||||
function addUrl(torrentUrl, downloadDir) {
|
||||
let p,
|
||||
params = {};
|
||||
if (downloadDir) {
|
||||
params = { "download-dir": downloadDir };
|
||||
}
|
||||
if (torrentUrl.startsWith("magnet:")) {
|
||||
console.log("Adding magnet", torrentUrl);
|
||||
params.filename = torrentUrl;
|
||||
p = rpcCall("torrent-add", params);
|
||||
} else {
|
||||
// Download the torrent file *in the browser* to support private torrents
|
||||
console.log("Downloading torrent", torrentUrl);
|
||||
p = fetch(torrentUrl, {
|
||||
method: "GET",
|
||||
credentials: "include",
|
||||
})
|
||||
.then((resp) => {
|
||||
if (resp.ok) {
|
||||
return resp.blob();
|
||||
}
|
||||
throw new Error("Could not download torrent");
|
||||
})
|
||||
.then(blobToBase64)
|
||||
.then((b64) => {
|
||||
params.metainfo = b64;
|
||||
return rpcCall("torrent-add", params);
|
||||
});
|
||||
}
|
||||
return p.then((x) => {
|
||||
updateBadge();
|
||||
return x;
|
||||
});
|
||||
}
|
||||
|
||||
////// magnet: Handler
|
||||
|
||||
function handleUrl(requestDetails) {
|
||||
return addUrl(
|
||||
decodeURIComponent(
|
||||
requestDetails.url.replace("http://transmitter.web-extension/", "")
|
||||
)
|
||||
).then((x) => {
|
||||
return browser.storage.local.get("server").then(({ server }) => {
|
||||
return { redirectUrl: server.base_url + "web/" };
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
browser.webRequest.onBeforeRequest.addListener(
|
||||
handleUrl,
|
||||
{ urls: ["http://transmitter.web-extension/*"] },
|
||||
["blocking"]
|
||||
);
|
||||
|
||||
////// Context menu
|
||||
|
||||
function createContextMenu() {
|
||||
browser.storage.local.get("server").then(({ server }) => {
|
||||
browser.contextMenus.removeAll();
|
||||
if (!server || !server.locations || !server.locations.length) {
|
||||
browser.contextMenus.create({
|
||||
id: "transmitter-add",
|
||||
title: "Download with Transmission remote",
|
||||
contexts: ["link"],
|
||||
});
|
||||
} else {
|
||||
browser.contextMenus.create({
|
||||
id: "transmitter-add",
|
||||
title: "Download to Default location",
|
||||
contexts: ["link"],
|
||||
});
|
||||
server.locations.forEach((location) => {
|
||||
browser.contextMenus.create({
|
||||
id: "transmitter-add-loc-" + location.index,
|
||||
title: "Download to " + location.name,
|
||||
contexts: ["link"],
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
createContextMenu();
|
||||
|
||||
browser.contextMenus.onClicked.addListener((info, tab) => {
|
||||
if (info.menuItemId === "transmitter-add") {
|
||||
return addUrl(info.linkUrl);
|
||||
} else if (info.menuItemId.startsWith("transmitter-add-loc-")) {
|
||||
let index = parseInt(info.menuItemId.substr("transmitter-add-loc-".length));
|
||||
browser.storage.local.get("server").then(({ server }) => {
|
||||
let path = server.locations[index].path;
|
||||
addUrl(info.linkUrl, path);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
////// Badge
|
||||
|
||||
function updateBadge() {
|
||||
browser.storage.local.get("server").then(({ server }) => {
|
||||
if (
|
||||
server.badge !== "num" &&
|
||||
server.badge !== "dl" &&
|
||||
server.badge !== "ul" &&
|
||||
server.badge !== "auto"
|
||||
) {
|
||||
return;
|
||||
}
|
||||
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,
|
||||
});
|
||||
break;
|
||||
case "dl":
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "green" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.downloadSpeed),
|
||||
});
|
||||
break;
|
||||
case "ul":
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "blue" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.uploadSpeed),
|
||||
});
|
||||
break;
|
||||
case "auto":
|
||||
if (args.downloadSpeed > 0) {
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "green" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.downloadSpeed),
|
||||
});
|
||||
} else if (args.uploadSpeed > 0) {
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "blue" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: formatSpeed(args.uploadSpeed),
|
||||
});
|
||||
} else {
|
||||
browser.browserAction.setBadgeBackgroundColor({ color: "gray" });
|
||||
browser.browserAction.setBadgeText({
|
||||
text: "" + args.activeTorrentCount,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
browser.alarms.onAlarm.addListener((alarm) => {
|
||||
if (alarm.name === "transmitter-badge-update") {
|
||||
return updateBadge();
|
||||
}
|
||||
});
|
||||
|
||||
function setupBadge() {
|
||||
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"),
|
||||
});
|
||||
updateBadge();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
setupBadge();
|
||||
|
||||
////// Storage updates
|
||||
|
||||
browser.storage.onChanged.addListener((changes, area) => {
|
||||
if (!Object.keys(changes).includes("server")) {
|
||||
return;
|
||||
}
|
||||
const oldv = changes.server.oldValue;
|
||||
const newv = changes.server.newValue;
|
||||
if (
|
||||
!oldv ||
|
||||
oldv.base_url !== newv.base_url ||
|
||||
oldv.username !== newv.username ||
|
||||
oldv.password !== newv.password ||
|
||||
oldv.badge_interval !== newv.badge_interval ||
|
||||
oldv.badge !== newv.badge ||
|
||||
arraysEqualDeep(oldv.locations, newv.locations)
|
||||
) {
|
||||
setupExtractor();
|
||||
setupBadge();
|
||||
updateBadge();
|
||||
createContextMenu();
|
||||
}
|
||||
});
|
||||
|
||||
function arraysEqualDeep(arr1, arr2) {
|
||||
return JSON.stringify(arr1) !== JSON.stringify(arr2);
|
||||
}
|
60
torrent/common.js
Normal file
@@ -0,0 +1,60 @@
|
||||
'use strict';
|
||||
|
||||
////// RPC
|
||||
|
||||
function rpcCall(meth, args) {
|
||||
return browser.storage.local.get(function(server) {
|
||||
const myHeaders = {
|
||||
'Content-Type': 'application/json',
|
||||
'x-transmission-session-id': server.session,
|
||||
};
|
||||
//console.log("(torrent)", server.session)
|
||||
if (server.username !== '' || server.btrpcpass !== '') {
|
||||
myHeaders['Authorization'] =
|
||||
'Basic ' +
|
||||
btoa((server.username || '') + ':' + (server.btrpcpass || ''));
|
||||
}
|
||||
//console.log("(torrent) rpc", server.base_url);
|
||||
return fetch(server.base_url + 'rpc', {
|
||||
method: 'POST',
|
||||
headers: myHeaders,
|
||||
body: JSON.stringify({ method: meth, arguments: args }),
|
||||
credentials: 'include', // allows HTTPS client certs!
|
||||
})
|
||||
.then(function(response) {
|
||||
const session = response.headers.get('x-transmission-session-id');
|
||||
if (session) {
|
||||
browser.storage.local.get({}).then(function(storage) {
|
||||
storage.session = session;
|
||||
browser.storage.local.set(storage);
|
||||
});
|
||||
}
|
||||
if (response.status === 409) {
|
||||
return rpcCall(meth, args);
|
||||
}
|
||||
if (response.status >= 200 && response.status < 300) {
|
||||
return response;
|
||||
}
|
||||
const error = new Error(response.statusText);
|
||||
error.response = response;
|
||||
throw error;
|
||||
})
|
||||
.then(function(response) {
|
||||
return response.json();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
////// Util
|
||||
|
||||
function formatSpeed(s) {
|
||||
// Firefox shows 4 characters max
|
||||
if (s < 1000 * 1000) {
|
||||
return (s / 1000).toFixed() + 'K';
|
||||
}
|
||||
if (s < 1000 * 1000 * 1000) {
|
||||
return (s / 1000 / 1000).toFixed() + 'M';
|
||||
}
|
||||
// You probably don't have that download speed…
|
||||
return (s / 1000 / 1000 / 1000).toFixed() + 'T';
|
||||
}
|
52
torrent/index.html
Normal file
@@ -0,0 +1,52 @@
|
||||
<!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" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Acknowledgement</h1>
|
||||
|
||||
<p><strong>Many, many thanks to the <a href="https://github.com/myfreeweb/transmitter">Transmitter</a>
|
||||
webextension.</strong></p>
|
||||
|
||||
<p>This part of this plugin contains code which was adapted from the Transmitter
|
||||
webextension, which is a minimal interface to the transmission-rpc interfaces of
|
||||
many torrent clients, including for our purposes snark-rpc and BiglyBT.</p>
|
||||
|
||||
<p>Transmitter is released under the UNLICENSE. An original copy is available at
|
||||
this URL: https://github.com/myfreeweb/transmitter/blob/master/UNLICENSE</p>
|
||||
|
||||
<p>A copy has also been included in this directory.</p>
|
||||
|
||||
<h2>Configuring this extension for use with Snark-RPC!</h2>
|
||||
|
||||
<p>One of the coolest things this extension is able to do is communicate with
|
||||
a transmission-rpc enabled torrent client. Since it's an I2P focused plugin,
|
||||
the default configuration is set up for use with the I2PSnark-RPC plugin created
|
||||
by zzz. Since Snark-RPC isn't part of the main Java I2P distribution, in order
|
||||
to do this you'll have to install the plugin. You can get a copy of it from
|
||||
inside of I2P here:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://stats.i2p/i2p/plugins/i2psnark-rpc.su3">stats.i2p main package</a></li>
|
||||
<li><a href="http://stats.i2p/i2p/plugins/i2psnark-rpc-update.su3">stats.i2p update package</a></li>
|
||||
</ul>
|
||||
|
||||
<p>I also have a mirror of the package with each release of the webextension,
|
||||
reflecting the version in use in the webextension at the time of the release.</p>
|
||||
|
||||
<p>To install the plugin, go to <a href="http://127.0.0.1:7657/configplugins">http://127.0.0.1:7657/configplugins</a>
|
||||
and scroll down to the section of the page where it says "Installation from URL"
|
||||
and paste the following URL:</p>
|
||||
|
||||
<p><code>http://stats.i2p/i2p/plugins/i2psnark-rpc.su3</code></p>
|
||||
|
||||
<p>Click the "Install Plugin" button and you'll be ready to go. Now, open the
|
||||
extension options menu, and just click "Save." The defaults are correct for use
|
||||
with I2PSnark-RPC, but they need to be initialized by saving the settings. If
|
||||
I2PSnark-RPC becomes part of Java I2P, these defaults will be initialized when
|
||||
the plugin is installed.</p>
|
||||
</body>
|
||||
</html>
|
159
torrent/popup.js
Normal file
@@ -0,0 +1,159 @@
|
||||
'use strict';
|
||||
|
||||
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,
|
||||
};
|
||||
console.log('(torrent) session', server.session);
|
||||
if (server.username !== '' || server.btrpcpass !== '') {
|
||||
myHeaders['Authorization'] =
|
||||
'Basic ' + btoa((server.username || '') + ':' + (server.btrpcpass || ''));
|
||||
}
|
||||
console.log('(torrent) rpcurl', server.base_url + 'rpc');
|
||||
return fetch(server.base_url + 'rpc', {
|
||||
method: 'POST',
|
||||
headers: myHeaders,
|
||||
body: JSON.stringify({ method: meth, arguments: args }),
|
||||
credentials: 'include', // allows HTTPS client certs!
|
||||
});
|
||||
|
||||
/*.then(function(response) {
|
||||
console.log("(torrent) responses", response);
|
||||
|
||||
if (response.status === 409) {
|
||||
return TrpcCall(meth, args);
|
||||
}
|
||||
if (response.status >= 200 && response.status < 300) {
|
||||
return response;
|
||||
}
|
||||
const error = new Error(response.statusText);
|
||||
error.response = response;
|
||||
throw error;
|
||||
});*/
|
||||
}
|
||||
|
||||
const torrentsPane = document.getElementById('torrents-pane');
|
||||
const configPane = document.getElementById('config-pane');
|
||||
|
||||
for (const opener of document.querySelectorAll('.config-opener')) {
|
||||
opener.addEventListener('click', (e) => {
|
||||
browser.runtime.openOptionsPage();
|
||||
});
|
||||
}
|
||||
|
||||
function showConfig(server) {
|
||||
torrentsPane.hidden = true;
|
||||
configPane.hidden = false;
|
||||
}
|
||||
|
||||
const torrentsSearch = document.getElementById("torrents-search");
|
||||
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",
|
||||
],
|
||||
};
|
||||
let cachedTorrents = [];
|
||||
|
||||
function renderTorrents(newTorrents) {
|
||||
if (torrentsList.children.length < newTorrents.length) {
|
||||
const dif = newTorrents.length - torrentsList.children.length;
|
||||
for (let i = 0; i < dif; i++) {
|
||||
const node = document.importNode(torrentsTpl.content, true);
|
||||
torrentsList.appendChild(node);
|
||||
}
|
||||
} else if (torrentsList.children.length > newTorrents.length) {
|
||||
const oldLen = torrentsList.children.length;
|
||||
const dif = oldLen - newTorrents.length;
|
||||
for (let i = 1; i <= dif; i++) {
|
||||
torrentsList.removeChild(torrentsList.children[oldLen - i]);
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < newTorrents.length; i++) {
|
||||
const torr = newTorrents[i];
|
||||
const cont = torrentsList.children[i];
|
||||
const speeds =
|
||||
"↓ " +
|
||||
formatSpeed(torr.rateDownload) +
|
||||
"B/s ↑ " +
|
||||
formatSpeed(torr.rateUpload) +
|
||||
"B/s";
|
||||
cont.querySelector(".torrent-name").textContent = torr.name;
|
||||
cont.querySelector(".torrent-speeds").textContent = speeds;
|
||||
cont.querySelector(".torrent-progress").value = torr.percentDone * 100;
|
||||
}
|
||||
}
|
||||
|
||||
function searchTorrents() {
|
||||
let newTorrents = cachedTorrents;
|
||||
const val = torrentsSearch.value.toLowerCase().trim();
|
||||
if (val.length > 0) {
|
||||
newTorrents = newTorrents.filter((x) => x.name.toLowerCase().includes(val));
|
||||
}
|
||||
renderTorrents(newTorrents);
|
||||
}
|
||||
torrentsSearch.addEventListener("change", searchTorrents);
|
||||
torrentsSearch.addEventListener("keyup", searchTorrents);
|
||||
|
||||
function refreshTorrents(server) {
|
||||
console.log("(torrent) initiating", server);
|
||||
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) {
|
||||
storage.session = session;
|
||||
browser.storage.local.set(storage);
|
||||
});
|
||||
}
|
||||
let sponse = response.json();
|
||||
sponse.then(function (response) {
|
||||
console.log("(torrent) refreshing", response);
|
||||
let newTorrents = response.arguments.torrents;
|
||||
newTorrents.sort((x, y) => y.queuePosition - x.queuePosition);
|
||||
cachedTorrents = newTorrents;
|
||||
torrentsSearch.hidden = newTorrents.length <= 8;
|
||||
if (torrentsSearch.hidden) {
|
||||
torrentsSearch.value = "";
|
||||
renderTorrents(newTorrents);
|
||||
} else {
|
||||
searchTorrents();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function refreshTorrentsLogErr(server) {
|
||||
return refreshTorrents(server).catch((err) => {
|
||||
console.error(err);
|
||||
torrentsError.textContent = "Error: " + err.toString();
|
||||
});
|
||||
}
|
||||
|
||||
function showTorrents(server) {
|
||||
torrentsPane.hidden = false;
|
||||
configPane.hidden = true;
|
||||
for (const opener of document.querySelectorAll(".webui-opener")) {
|
||||
opener.href = server.base_url + "web/";
|
||||
}
|
||||
console.log("(torrent) showing torrents");
|
||||
refreshTorrents(server).catch((_) => refreshTorrentsLogErr(server));
|
||||
setInterval(() => refreshTorrentsLogErr(server), 2000);
|
||||
}
|
||||
|
||||
//let store =
|
||||
browser.storage.local.get(function (server) {
|
||||
console.log("(torrent) querying storage", server);
|
||||
if (server && server.base_url && server.base_url !== "") {
|
||||
showTorrents(server);
|
||||
} else {
|
||||
showConfig(server);
|
||||
}
|
||||
});
|
BIN
transmissionrpc.png
Normal file
After Width: | Height: | Size: 165 KiB |
192
window.html
@@ -1,53 +1,159 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="info.css"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="panel">
|
||||
<div class="panel-section panel-section-header">
|
||||
<div id="text-section-header" class="text-section-header">I2P Assistance</div>
|
||||
</div>
|
||||
|
||||
<div id="text-section-helptext">
|
||||
You are now free to browse the eepWeb!
|
||||
|
||||
Your browser is now configured to browse anonymously on the I2P network.
|
||||
As you browse, your traffic will be routed through other network nodes
|
||||
to disguise it's origin, both from the server and from the nodes
|
||||
themselves.
|
||||
|
||||
</div>
|
||||
|
||||
<div class="panel-section-separator"></div>
|
||||
<!-- This is where I'll eventually put the tunnel control panel -->
|
||||
<!-- <a href="#" id="generate-fresh-tunnel> Generate a Fresh Tunnel</a>"-->
|
||||
<!-- -->
|
||||
<strong><a href="#" id="clear-browser-data">Clear all browsing data</a></strong><br>
|
||||
<!--<strong><a href="#" id="temp-enable-webrtc">Temporarily enable WebRTC</a></strong><br>-->
|
||||
<div class="panel-section-separator"></div>
|
||||
<a href="http://i2pforum.i2p" id="window-create-forum-panel">Visit the I2P Forums</a><br>
|
||||
<a href="http://i2p-projekt.i2p/blog" id="window-create-news-panel">Get the latest I2P News</a><br>
|
||||
<div class="panel-section-separator"></div>
|
||||
<a href="#" id="check-i2p-control">Check I2P Router Health</a><div id="panel-section-i2pcontrol-check"></div>
|
||||
<div class="panel-section-separator"></div>
|
||||
|
||||
<div class="panel-section-identity">
|
||||
<div id="identity-list"></div>
|
||||
</div>
|
||||
<link href="search.css" rel="stylesheet">
|
||||
<link href="home.css" rel="stylesheet">
|
||||
<link href="info.css" rel="stylesheet"><!--<link href="torrent/popup.css" rel="stylesheet">-->
|
||||
|
||||
<title>
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="section-header panel-section panel-section-header" id="topbar">
|
||||
<!--<div class="text-section-header" id="text-section-header">-->
|
||||
<a href="#" id="browser-action"><img class="tabicon" height="32px" src="icons/browse.png" width="32px">Browse</a> <a href="#" id="torrent-action"><img class="tabicon" height="32px" src="icons/torrents.png" width="32px">Download</a> <!--</div>-->
|
||||
</div>
|
||||
|
||||
<div id="browserpanel">
|
||||
<div class="panel">
|
||||
<div class="section-header panel-section panel-section-header" id="headline">
|
||||
<div class="text-section-header">
|
||||
<h1 id="text-section-header">The Invisible Internet Browser</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="context.js"></script>
|
||||
<script src="privacy.js"></script>
|
||||
<script src="info.js"></script>
|
||||
<script src="content.js"></script>
|
||||
<script src="i2pcontrol.js"></script>
|
||||
<div class="search-info">
|
||||
<div id="i2pbrowser-version">
|
||||
</div>
|
||||
|
||||
<div class="topnav">
|
||||
<a class="applicationName window-visit-homepage" href="#" id="window-visit-homepage" target="_blank">Home Page</a>
|
||||
<form action="http://yacy.idk.i2p/yacysearch.html?" method="get">
|
||||
<input id="search-query" name="query" placeholder="Search on yacy.idk.i2p(Opens a new tab)" type="search"> <input id="search-submit" text="Submit" type="submit">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="hideIfI2PProxyOff" id="readyness">
|
||||
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png"> <span id="proxy-check">Proxy is ready.</span>
|
||||
</div>
|
||||
|
||||
<div id="i2pbrowser-description">
|
||||
<p id="description">You are now able to use I2P in this browser.</p>
|
||||
<button class="hidden" id="visit-irc">Visit IRC</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="browser-info">
|
||||
<p class="hideIfI2PConsoleOff">
|
||||
</p>
|
||||
|
||||
<h3 id="controlHeader">Controls</h3>
|
||||
|
||||
<p id="controlExplain">These controls are used to tailor your I2P Browsing Experience</p>
|
||||
|
||||
<ul>
|
||||
<!--<li class="application">
|
||||
<a href="#" id="clear-browser-data">Clear Browsing Data:</a> <span class="applicationDesc" id="clear-desc">Use this to erase your browsing data.</span>
|
||||
</li>
|
||||
|
||||
<li class="application"><input id="enable-web-rtc" name="enablewebrtc" type="checkbox" value="webrtc"> <label for="enable-web-rtc">Enable WebRTC <strong>with Proxy?</strong></label> <span class="applicationDesc" id="rtcDesc">WebRTC is disabled by default, but can be enabled by checking this box.</span></li>-->
|
||||
|
||||
<li class="application">
|
||||
<div class="panel-section-separator">
|
||||
</div>
|
||||
|
||||
<div class="panel-section-identity">
|
||||
<div id="identity-list">
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<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>
|
||||
</div>
|
||||
<!--<div class="panel-section-separator">
|
||||
</div>-->
|
||||
|
||||
<div class="application-info">
|
||||
<p class="hideIfI2PConsoleOff">
|
||||
</p>
|
||||
|
||||
<h3 id="applicationHeader">Applications</h3>
|
||||
|
||||
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
|
||||
|
||||
<ul>
|
||||
<li class="application"><button class="applicationName window-visit-homepage" href="#" id="window-visit-index" target="_blank">Help Page</button> <span class="applicationDesc" id="abouthome">For more information about this extension, go here:</span></li>
|
||||
|
||||
<li class="application"><button class="applicationName window-visit-toopie" href="#" id="window-visit-toopie" target="_blank">Toopie</button> <span class="applicationDesc" id="toopie">For information about your I2P router status, go here:</span></li>
|
||||
|
||||
<li class="application"><button class="applicationName" id="window-visit-i2ptunnel" target="_blank">Hidden Services Manager</button> <span class="applicationDesc" id="i2ptunnel">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span></li>
|
||||
|
||||
<li class="application"><button class="applicationName" id="window-visit-susimail" target="_blank">E-Mail</button> <span class="applicationDesc" id="susimail">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span></li>
|
||||
|
||||
<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>
|
||||
</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">
|
||||
<h1>Torrent Downloads</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="config-pane">
|
||||
<strong>Torrent RPC Configuration</strong>
|
||||
<br>
|
||||
The server address is not set yet.
|
||||
<br>
|
||||
<a class="config-opener" href="#">Open the settings</a> to continue.
|
||||
</div>
|
||||
|
||||
<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="#">
|
||||
<img alt="Settings" src="images/gear.svg"></a>
|
||||
<a class="info-opener" href="https://github.com/myfreeweb/transmitter" target="_blank">
|
||||
<img alt="Extension Info" src="images/info.svg"></a>-->
|
||||
</header>
|
||||
<input id="torrents-search" placeholder="Search…" type="search">
|
||||
<template id="torrents-tpl">
|
||||
<ul>
|
||||
<li>
|
||||
<div class="torrent-head">
|
||||
<div class="torrent-name">
|
||||
</div>
|
||||
|
||||
<div class="torrent-speeds">
|
||||
</div>
|
||||
</div>
|
||||
<progress class="torrent-progress" max="100"></progress>
|
||||
</li>
|
||||
</ul>
|
||||
</template>
|
||||
|
||||
<ul id="torrents-list">
|
||||
</ul>
|
||||
|
||||
<div id="torrents-error">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="context.js"></script>
|
||||
<script src="privacy.js"></script>
|
||||
<script src="i2pcontrol/i2pcontrol.js"></script>
|
||||
<script src="info.js"></script>
|
||||
<script crossorigin="anonymous" src="content.js"></script>
|
||||
<script src="torrent/popup.js"></script>
|
||||
<script src="torrent/common.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
BIN
x-i2p-torrentlocation.png
Normal file
After Width: | Height: | Size: 449 KiB |