229 Commits
1.25 ... 0.55

Author SHA1 Message Date
idk
4e30e1077b update changelog 2020-01-02 16:50:46 -05:00
idk
040b57781e trim down results of eslint, some of these are false 2020-01-02 16:44:19 -05:00
idk
07ca54a885 Merge pull request #57 from eyedeekay/lint
First round of lint errors
2020-01-02 20:48:34 +00:00
idk
e125b77d11 Fix a whole bunch of linter errors, about half of them 2020-01-02 15:43:24 -05:00
idk
851e3854a7 deal with some lint stuff in background.js 2020-01-02 13:59:21 -05:00
idk
0d414130a7 Merge pull request #55 from eyedeekay/android
Fixes encountered on the way to understanding Android
2020-01-02 18:00:48 +00:00
idk
25a7b523f9 Add localhost tab for non-i2p stuff, remove default container for web browsing 2020-01-02 11:28:10 -05:00
idk
01fbf32acd figure out why it isn't launching into containers like on desktop 2019-12-25 00:42:16 -05:00
idk
e2642553b5 figure out why it isn't launching into containers like on desktop 2019-12-24 23:52:58 -05:00
idk
d04709e3a5 figure out why it isn't launching into containers like on desktop 2019-12-24 23:43:40 -05:00
idk
10dd0af335 figure out why it isn't launching into containers like on desktop 2019-12-24 23:25:35 -05:00
idk
b33a7b623b figure out why it isn't launching into containers like on desktop 2019-12-24 23:20:33 -05:00
idk
55841f8421 figure out why it isn't launching into containers like on desktop 2019-12-24 23:14:01 -05:00
idk
303bd90d84 figure out why it isn't launching into containers like on desktop 2019-12-24 23:08:35 -05:00
idk
274eb1a98b figure out why it isn't launching into containers like on desktop 2019-12-24 23:06:58 -05:00
idk
4e544dd9e4 figure out why it isn't launching into containers like on desktop 2019-12-24 23:01:25 -05:00
idk
6fe1bc3fb5 figure out why it isn't launching into containers like on desktop 2019-12-24 22:52:56 -05:00
idk
4897ceff7f figure out why it isn't launching into containers like on desktop 2019-12-24 22:50:09 -05:00
idk
8551a13494 figure out why it isn't launching into containers like on desktop 2019-12-24 22:43:27 -05:00
idk
064ec504b5 figure out why it isn't launching into containers like on desktop 2019-12-24 22:37:49 -05:00
idk
16c9fbb19f figure out why it isn't launching into containers like on desktop 2019-12-24 22:21:04 -05:00
idk
ca58d2e307 figure out why it isn't launching into containers like on desktop 2019-12-24 21:53:31 -05:00
idk
fc89fe9ada figure out why it isn't launching into containers like on desktop 2019-12-24 21:23:37 -05:00
idk
d6ece55d71 figure out why it isn't launching into containers like on desktop 2019-12-24 21:18:28 -05:00
idk
ff9a1484b0 figure out why it isn't launching into containers like on desktop 2019-12-24 21:14:40 -05:00
idk
70e3bee4da figure out why it isn't launching into containers like on desktop 2019-12-24 21:09:57 -05:00
idk
cd25d95fdf fmt 2019-12-24 21:03:37 -05:00
idk
65c914a9d0 fmt 2019-12-24 20:58:53 -05:00
idk
c0bb7e234d try and figure out this android thing 2019-12-24 20:57:56 -05:00
idk
3fefc88a38 Merge pull request #42 from eyedeekay/unobtrusive
Co-existence enhancements
2019-12-25 00:04:34 +00:00
idk
5a5cc51536 only close old tabs if the ID differs from the new tab 2019-12-24 18:44:58 -05:00
idk
25ec2d58c1 only close old tabs if the ID differs from the new tab 2019-12-24 18:41:42 -05:00
idk
f896f6ef92 add a mode for semi-safe localhost browsing 2019-12-24 18:31:44 -05:00
idk
e10d96905b Merge pull request #41 from eyedeekay/gh-pages
Readme Updates
2019-12-24 21:53:29 +00:00
idk
9e015c51ef update usage section 2019-12-24 16:51:38 -05:00
idk
ff9ba99476 update usage section 2019-12-24 16:50:47 -05:00
idk
ce4ec0cdfc update usage section 2019-12-24 16:46:51 -05:00
idk
5b9c706cc9 update readme, pages 2019-12-24 15:28:14 -05:00
idk
2aba15f280 update readme, pages 2019-12-24 15:25:16 -05:00
idk
fd5364ab8e update readme, pages 2019-12-24 14:03:01 -05:00
idk
08639cbf43 update readme, pages 2019-12-24 13:46:09 -05:00
idk
52ba8fa837 update readme, pages 2019-12-24 13:44:44 -05:00
idk
2b69ff05cf update readme, pages 2019-12-24 13:42:02 -05:00
idk
6a8a9039c9 update readme, pages 2019-12-24 13:36:18 -05:00
idk
3a52c4e2a6 update readme, pages 2019-12-24 13:33:15 -05:00
idk
2fb1d71ae9 update page 2019-12-24 13:32:57 -05:00
idk
185467937c update page 2019-12-24 13:28:25 -05:00
idk
64c5c05b82 update page 2019-12-24 13:26:21 -05:00
idk
4615513bb2 readme update 2019-12-24 13:25:19 -05:00
idk
3b63ba945d try something different for the readme 2019-12-24 12:11:06 -05:00
idk
1911641cd0 readme update, pdfs 2019-12-24 11:21:07 -05:00
idk
e18eeaf934 hotfix 2019-11-28 19:24:53 -05:00
idk
ea92d4a5b8 Merge pull request #36 from eyedeekay/rhizome
Rhizome
2019-11-29 00:07:31 +00:00
idk
51cc8c96e1 rhizome variant 2019-11-28 18:45:34 -05:00
idk
12fff599f0 rhizome variant 2019-11-28 18:44:05 -05:00
idk
30231ab974 rhizome variant 2019-11-28 18:43:32 -05:00
idk
1362ca32d9 cleanup manifest 2019-11-28 17:55:19 -05:00
idk
0c64c301c9 cleanup manifest 2019-11-28 17:54:20 -05:00
idk
38147d45e1 cleanup manifest 2019-11-28 17:54:02 -05:00
idk
093db8443c cleanup manifest 2019-11-28 17:52:35 -05:00
idk
56a220136b OK this one might work 2019-11-27 00:58:53 -05:00
idk
e903349e4c OK this one might work 2019-11-27 00:45:25 -05:00
idk
175683a8ed OK this one might work 2019-11-27 00:38:21 -05:00
idk
d7449a5e8a OK this one might work 2019-11-27 00:34:48 -05:00
idk
3bcbfc1e58 OK this one might work 2019-11-27 00:31:10 -05:00
idk
13210031e6 another hack to deal with slightly different tag behavior 2019-11-27 00:03:44 -05:00
idk
5a2acc1c1c another hack to deal with slightly different tag behavior 2019-11-26 23:26:33 -05:00
idk
4aed7e0db4 another hack to deal with slightly different tag behavior 2019-11-26 23:22:24 -05:00
idk
f4d2334900 another hack to deal with slightly different tag behavior 2019-11-26 23:15:57 -05:00
idk
7902aded0a another hack to deal with slightly different tag behavior 2019-11-26 23:06:24 -05:00
idk
256a990ebc another hack to deal with slightly different tag behavior 2019-11-26 22:45:49 -05:00
idk
ff883a2a9a Merge pull request #35 from eyedeekay/droid-compat
Bugfixes, Code Cleanup, Android Fixes
2019-11-26 15:00:07 +00:00
idk
d1943b4262 In android extension menus have tab ids, try this way of identifying them 2019-11-26 01:07:48 -05:00
idk
c96ec6c3b7 force disconnect of webrtc sessions when webrtc with proxy enabled 2019-11-25 20:42:46 -05:00
idk
6467ea6f63 enable-disable history, don't try to kill undefined tabs 2019-11-25 20:20:53 -05:00
idk
352d71af26 enable-disable history, don't try to kill undefined tabs 2019-11-25 20:20:27 -05:00
idk
ab7774ea29 enable-disable history, don't try to kill undefined tabs 2019-11-25 20:19:44 -05:00
idk
4e00c72d5f remove tabfind. Never create a window, ever. 2019-11-24 23:44:33 -05:00
idk
acd7adc9c1 remove tabfind. Never create a window, ever. 2019-11-24 23:29:06 -05:00
idk
94f0124f0f no but closer 2019-11-24 23:16:48 -05:00
idk
89523390de no but closer 2019-11-24 23:14:01 -05:00
idk
77f57d7f1e no but closer 2019-11-24 23:04:49 -05:00
idk
a33afc52d3 no but closer 2019-11-24 22:59:50 -05:00
idk
b06facacb0 no but closer 2019-11-24 22:50:43 -05:00
idk
bd4c9c0658 no but closer 2019-11-24 22:43:50 -05:00
idk
b23b90baa1 no but closer 2019-11-24 22:32:12 -05:00
idk
5b6224f9ce no but closer 2019-11-24 22:23:13 -05:00
idk
232ada5ed3 no but closer 2019-11-24 22:18:27 -05:00
idk
2fab8e042f pretty sure that'll fix it 2019-11-24 20:57:41 -05:00
idk
749ff30b5b Bring some sanity to the settings section 2019-11-24 20:43:17 -05:00
idk
f0b4a0a849 try and figure out why it works on Desktop but not Android still 2019-11-24 19:49:47 -05:00
idk
870eaa6e3e try and figure out why it works on Desktop but not Android still 2019-11-24 19:47:33 -05:00
idk
c7af1a0d72 try and figure out why it works on Desktop but not Android still 2019-11-24 18:15:38 -05:00
idk
4c10cd2855 try and figure out why it works on Desktop but not Android still 2019-11-24 18:13:34 -05:00
idk
6f45363692 reuse less function names 2019-11-24 18:04:58 -05:00
idk
8d14c945f3 reuse less function names 2019-11-24 17:43:43 -05:00
idk
070955225d reuse less function names 2019-11-24 17:28:58 -05:00
idk
9987325f1a reuse less function names 2019-11-24 17:24:34 -05:00
idk
2bbeed8385 reuse less function names 2019-11-24 17:14:43 -05:00
idk
875fe8b86d fix android maybe 2019-11-24 05:50:06 -05:00
idk
b2184119f7 fix android maybe 2019-11-24 05:41:45 -05:00
idk
cb5fa75616 fix android maybe 2019-11-24 05:29:19 -05:00
idk
5c7a80997f fix android maybe 2019-11-24 05:21:56 -05:00
idk
32035348c1 Try some android stuff 2019-11-24 04:55:39 -05:00
idk
049b79753e Try some android stuff 2019-11-24 04:54:28 -05:00
idk
25c24757d4 Try some android stuff 2019-11-24 04:32:35 -05:00
idk
2d17f4fb0f Try some android stuff 2019-11-24 04:28:14 -05:00
idk
916ee81668 Try some android stuff 2019-11-24 04:25:06 -05:00
idk
1dd48e4344 Try some android stuff 2019-11-24 04:13:12 -05:00
idk
c93e16875f Merge pull request #34 from eyedeekay/droid-compat
fix tabs
2019-11-23 22:22:55 -05:00
idk
fbaf1dca30 fix tabs 2019-11-23 22:17:20 -05:00
idk
527e91b6cf Merge pull request #33 from eyedeekay/droid-compat
Droid compat
2019-11-23 18:56:19 -05:00
idk
ee0ca69195 remove chromium polyfill 2019-11-23 18:54:48 -05:00
idk
709854c1d1 remove chromium polyfill 2019-11-23 18:47:23 -05:00
idk
9ebdcc94c5 move host checkers to own file 2019-11-23 18:41:18 -05:00
idk
9e07c3e554 add protocol handler and hide stuff that doesn't exist on Android 2019-11-23 18:37:17 -05:00
idk
399365b2b7 use tabs instead of windows to launch I2P contexts at all times. 2019-11-23 14:24:56 -05:00
idk
52381453fb Merge pull request #32 from eyedeekay/smart-home
Smart home
2019-11-22 17:57:55 -05:00
idk
317034cb5a fmt 2019-11-22 17:55:58 -05:00
idk
e9b5060203 use buttons to make the new menu work 2019-11-22 17:49:27 -05:00
idk
2ea3bc169b exclude mirrors for now 2019-11-22 17:02:54 -05:00
idk
f4c45c4834 exclude mirroring script for now 2019-11-22 17:01:03 -05:00
idk
80bcf6e7ea fix ci 2019-11-22 16:39:28 -05:00
idk
b7a887c578 fix ci 2019-11-22 16:38:36 -05:00
idk
731a929a88 mark i2p cookies secure, don't set the home page. 2019-11-22 13:24:19 -05:00
idk
8eb75be6ec improvements to release stuff 2019-11-20 19:55:41 -05:00
idk
30ce917afa use images as readiness indicators for now 2019-11-20 19:50:12 -05:00
idk
0d5fb3c1bd backport the smart homepage from the I2P Browser 2019-11-20 17:44:01 -05:00
idk
6d5f56922b update mirrorlist 2019-11-19 09:38:34 -05:00
idk
8b0bea4e7d add mirrorlist 2019-11-19 09:37:42 -05:00
idk
92057d459d add mirrorlist 2019-11-19 09:35:43 -05:00
idk
0c30b2e921 Merge pull request #29 from eyedeekay/titles
add i2ptunnel screenshot
2019-11-12 13:13:43 -05:00
idk
df1d971a4d add i2ptunnel screenshot 2019-11-12 13:11:25 -05:00
idk
9bd7485d4a Merge pull request #28 from eyedeekay/titles
update screenshots
2019-11-12 00:22:09 -05:00
idk
c98f0399d2 update screenshots 2019-11-12 00:21:35 -05:00
idk
15a20cc25f Merge pull request #27 from eyedeekay/titles
update screenshots
2019-11-12 00:14:58 -05:00
idk
b342039e8f update screenshots 2019-11-12 00:14:11 -05:00
idk
343cec93e2 Merge pull request #26 from eyedeekay/titles
Titles
2019-11-12 00:13:09 -05:00
idk
b05ee528fd update screenshots 2019-11-12 00:11:52 -05:00
idk
d7c4340b4c use per-tab title prefixes, multilingual titles, multilingual menus 2019-11-11 23:31:37 -05:00
idk
e819532f29 Merge pull request #25 from eyedeekay/update-debian
update debian and packaging info
2019-11-11 21:56:08 -05:00
idk
a1a9c8221e update debian and packaging info 2019-11-11 21:54:26 -05:00
idk
1ebf80b644 Merge pull request #24 from eyedeekay/bookmarks
Bookmarks
2019-11-11 21:53:49 -05:00
idk
3727987dd3 Merge pull request #23 from eyedeekay/more-isolation
More isolation
2019-11-11 21:53:27 -05:00
idk
34e1251292 fix bookmark 2019-11-11 21:39:35 -05:00
idk
fdf777640d fix bookmark 2019-11-11 21:38:38 -05:00
idk
4cde00c7de fix bookmark 2019-11-11 21:02:38 -05:00
idk
92ce8431a2 fix bookmark 2019-11-11 21:01:52 -05:00
idk
f233972323 Merge pull request #22 from eyedeekay/more-isolation
additional isolation by contextual id
2019-11-11 16:46:24 -05:00
idk
f27a59c193 additional isolation by contextual id 2019-11-11 16:44:58 -05:00
idk
b9200a4313 Merge pull request #21 from eyedeekay/more-isolation
This forces a contextual identity for router applications, separate from the router console identity.
2019-11-11 16:37:56 -05:00
idk
b7ebbd5b79 additional isolation by contextual id 2019-11-11 16:34:41 -05:00
idk
e631c82363 fallback to about:config proxy in contextual tabs we don't own 2019-11-11 02:38:11 -05:00
idk
43e6818324 jsfmt, tidy 2019-11-11 01:48:37 -05:00
idk
fc019c58bb better settings guarantees and about:config proxy config compatibility so also i2pbrowser compatibility 2019-11-11 01:12:57 -05:00
idk
2e8a61de2e isolate by default, don't ever use firefox-default, replace with our own 2019-11-11 00:03:24 -05:00
idk
d770abcce8 jsfmt 2019-11-10 22:36:32 -05:00
idk
ecda2d7102 update the readme a bit 2019-11-10 22:28:16 -05:00
idk
f670bef983 introduce a proxy health check 2019-11-10 22:24:10 -05:00
idk
aa71f917a6 Merge pull request #20 from eyedeekay/blackhole
Blackhole non-routerconsole requests
2019-11-10 20:31:13 -05:00
idk
33cfbc324a update color schemes, blackhole non-routerconsole URL's on the localhost 2019-11-10 20:28:31 -05:00
idk
38d5dcb929 start messing with bookmarks and stuff 2019-11-05 22:11:00 -05:00
idk
994b021a95 start messing with bookmarks and stuff 2019-11-05 22:09:41 -05:00
idk
c2f321b26b Merge pull request #19 from eyedeekay/readme
Readme, Makefile, Release System Fiddlibits
2019-11-01 09:28:58 -04:00
idk
04d58b33be add screenshots 2019-10-31 14:50:33 -04:00
idk
a7562fd66e update makefile 2019-10-31 12:45:55 -04:00
idk
595f02c01b update makefile 2019-10-31 12:38:21 -04:00
idk
3d4a49827f Merge pull request #18 from eyedeekay/annoying-windows
plan document, don't open a new window automatically, just a tab
2019-10-31 12:24:25 -04:00
idk
fa579b8586 plan document, don't open a new window automatically, just a tab 2019-10-31 12:22:19 -04:00
idk
58b91e1a80 Merge pull request #17 from eyedeekay/webrtc
Webrtc
2019-10-28 01:17:26 -04:00
idk
997689806b add webrtc enable disable option, purge chrome, reformat 2019-10-28 01:12:40 -04:00
idk
df4d9e93a6 add option to re-enable WebRTC 2019-10-28 01:11:16 -04:00
idk
6cd37b51c0 Start working on the i2pcontrol messaging feature 2019-10-17 18:54:39 -04:00
idk
924dd29323 new AMO release 2019-10-17 00:00:55 -04:00
idk
c92c0caa0f Merge pull request #13 from eyedeekay/roadmap
Roadmap
2019-10-17 00:00:13 -04:00
idk
b278450aea New AMO Release 2019-10-16 23:59:12 -04:00
idk
1f014dd37e new roadmap 2019-10-16 19:45:16 -04:00
idk
a87722b6fc Merge pull request #12 from eyedeekay/video
add screencap
2019-10-16 19:11:33 -04:00
idk
c0ea4df7ec add screencap 2019-10-16 19:10:24 -04:00
idk
3a2fca2f26 Merge pull request #11 from eyedeekay/contextual-ids
Contextual ids
2019-10-16 17:31:57 -04:00
idk
ec1f547f09 remove the hazardous logging 2019-10-16 17:29:21 -04:00
idk
d1643e8c71 be more precise about cleaning history and stuff 2019-10-16 17:24:02 -04:00
idk
52f695691c be more precise about cleaning history and stuff 2019-10-16 15:48:06 -04:00
idk
1619181fc9 be more precise about cleaning history and stuff 2019-10-16 15:47:26 -04:00
idk
fa3c94b736 be more precise about cleaning history and stuff 2019-10-16 15:31:30 -04:00
idk
c61aa13ffc Merge pull request #8 from eyedeekay/contextual-ids
WIP: "I2P In Private Browsing Mode"
2019-10-09 19:53:50 -04:00
idk
ab0282bde9 bump 2019-10-09 17:56:29 -04:00
idk
86913e18d3 releasey goodness 2019-10-09 17:48:38 -04:00
idk
c4a2fa6ec0 releasey goodness 2019-10-08 19:10:13 -04:00
idk
14b246fc00 fix the deb 2019-10-07 23:48:15 -04:00
idk
577c10aee7 Change color on non-i2p tabs 2019-10-07 22:51:53 -04:00
idk
a51fd5ffa7 force .i2p domains into i2p browsing context 2019-10-07 21:26:52 -04:00
idk
08eeb054c3 force .i2p domains into i2p browsing context 2019-10-07 20:52:03 -04:00
idk
af08c3d800 force .i2p domains into i2p browsing context 2019-10-07 18:45:52 -04:00
idk
e6f1fbbe8b undo wrong change 2019-10-06 22:11:23 -04:00
idk
73943f9d43 fmt 2019-10-06 15:18:10 -04:00
idk
1edd41900f work on format 2019-10-06 15:14:53 -04:00
idk
b9d6171c8d Scrub user-agent in contextual identity 2019-10-06 13:58:26 -04:00
idk
00dd8fe597 Scrub user-agent in contextual identity 2019-10-06 13:56:50 -04:00
idk
556e797945 I2P in Private Browsing Mode has Liftoff! 2019-10-06 13:38:11 -04:00
idk
32997bdf68 Also going to do safe router console access in this branch. 2019-09-28 22:30:45 -04:00
idk
2ae30167ab merge master? 2019-09-28 21:59:44 -04:00
idk
3febeb5214 merge branch master 2019-09-25 01:50:03 -04:00
idk
5b554df40a Merge pull request #7 from eyedeekay/debian
Debian
2019-09-25 01:32:10 -04:00
idk
48068f24fa use the better base image 2019-09-25 00:52:16 -04:00
idk
7dd7a43686 use the better base image 2019-09-25 00:21:16 -04:00
idk
9716fd793d fix some basic lintian stuff, leave some other stuff because later is probably better on these ones 2019-09-24 22:47:10 -04:00
idk
ae6a543df5 fix some basic lintian stuff, leave some other stuff because later is probably better on these ones 2019-09-24 22:44:56 -04:00
idk
608b344c45 build it as a debian package and then test circleci 2019-09-24 22:33:30 -04:00
idk
3bda43a77d Try and get a debian-style package started 2019-08-01 00:39:03 -04:00
idk
222e3b442b save for now 2019-07-21 14:00:07 -04:00
idk
6d5b2217cb it almost knows how to change I2P identity based on contextual identity 2019-07-13 22:07:24 -04:00
idk
a6860e50be a little closer to tab-driven private browsing with i2p, re-write user agents globally 2019-07-12 02:21:14 -04:00
idk
918bb09226 Fix theming 2019-07-10 02:29:38 -04:00
idk
3b6fbd6ef1 start a contextual identity aware branch 2019-07-10 01:25:02 -04:00
idk
b42ec59d41 start a contextual identity aware branch 2019-07-10 00:47:30 -04:00
idk
6a09985b26 more chromium stuff 2019-06-29 01:47:13 -04:00
idk
769f592973 more chromium stuff 2019-06-29 01:43:16 -04:00
idk
24bde39e49 chromium compatibility 2019-06-29 00:49:59 -04:00
idk
27ba4aee8b chromium compatibility 2019-06-29 00:44:15 -04:00
idk
1b7c8fc520 set up chromium polyfill 2019-06-29 00:32:03 -04:00
idk
8a5883ba65 release prep 2019-06-28 22:50:54 -04:00
idk
c271760715 improve fomatting, add better socks defaults and enforce them 2019-06-27 15:40:43 -04:00
idk
3922f992e7 Socks defaults sanity 2019-06-24 19:20:54 -04:00
idk
d4070b345f add experiments folder 2019-06-19 10:44:17 -04:00
idk
f209af2897 update readme 2019-06-19 10:44:03 -04:00
idk
90be862c74 fix android issue 2019-06-17 19:17:11 -04:00
idk
7a3304c5f0 fix version ordering, 1.26 2019-05-03 18:58:03 -04:00
idk
bc47a48492 self-distributed version 2019-05-03 18:46:07 -04:00
61 changed files with 4453 additions and 889 deletions

12
.circleci/config.yml Normal file
View File

@@ -0,0 +1,12 @@
version: 2
jobs:
build:
docker:
- image: eyedeekay/builders
steps:
- checkout
- run:
name: Build
command: make zip

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

3
.gitignore vendored
View File

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

114
GOALS.md Normal file
View File

@@ -0,0 +1,114 @@
These are the goals of the I2P Browser, and not really this plugin in-and-of-itself
===================================================================================
A
User Interface:
---------------
* Remove search engines
* Replace bookmarks
* Donate banner / UI
* Patch Firefox to have relative (from the binary) profile directory
* Start use the Firefox update process to update browser installations
* Mark .i2p cookies as secure
* Mark .i2p domains as secure connection
* Add tests for .i2p secure marking
* Improve the delay-the-user XUL dialogs to be more accurate in regards
of where the router is in its bootup progress
* Disable the WebIDE
* Disable GamePad API by default
* Disable Web Speech API by default
* Disable the Web Audio API by default
* UI redesign bootstrapping and configuration screens (delay-the-user dialogs)
* Default browser choose wining should de disabled like
browser.shell.checkDefaultBrowser, it can be default, but then
choosen by the user without any begging ahead
* Extend the firefox preferences UI for I2P router configuration thought
of as "must have" or "very nice to have"
* Shrink the BroadcastChannel API's boundaries of access or disable completely
* Make a API white/grey/black -list, in super paranoia mode we should
probably disable almost all, while in most cases the user probably want
to be as close to a normal browser/web experinence that
they are used to from before
Leak Avoidance:
---------------
* Stop web socket DNS leak
* If doable, slim down the CA store from unnecessary CAs
* Disable the microphone by default
* Ensure WebRTC is disabled in compile time
* Disable mDNS features
* Ensure links like sftp:// and smb:// ,
as well as \\samba-share is blocked/denied
* Dont allow IndexedDB storage for third party domains (likability issue)
* Patch the DNS service to prevent any browser or addon DNS resolution
* Restrict what MIME types that are exposed to content scripts
General Security:
-----------------
* Backport any security patches that might appear from Mozilla
* Dont allow XHR/Websockets requests towards 127.0.0.1/localhost
* Always use the most sane form of preferences defaults in context
of privacy and security.
Unnecessary Connections:
------------------------
* Disable getpocket.com features and alike
* Remove sync option from preferences
* Clear state when the app exits, by default
* Disable updater telemetry
* Make firefox stop call home to mozilla for different reasons
* Prevent non-Necko network connections
* Figure out how to approach prerender, preconnect, and prefetch link tags
Disk Avoidance:
---------------
* Dont allow SSL key logging
* Only cache media in memory
* Disable the password saving functionality to avoid such being written to disk
* Disable the Auto form-fill to keep as much as possible not written to disk
Platforms:
----------
* Support for Android?
* Support for iOS?
Anti-Fingerprinting:
--------------------
* Test for preferences which ensures a sane default and
something to tell when/if we break it
* Disable support for system adding
* Disable Firefox enterprise policies
* Disable NTLM authentication
* Disable SPNEGO authentication
* Handle privacy issues regarding window.name
* Test runner for I2P Browser test cases
* Block loading of plugins
* Disable OS spesific firefox features that can help fingerprint
the end user's operating system
* Block html5 canvas by default
* Block by default or disable WebGL completely?
* Never start fullscreen, always start with fixed width/height to
avoid expose screen resolution
* Report fake system uptime to content scripts
* Spoof Accept-Language and Accept-Charset headers no matter browser language
* Spoof timezone to always be UTC
* Develop methods to reduce the accuracy of JavaScript
performance fingerprinting
* Always report only one CPU core (dom.maxHardwareConcurrencys)
* Avoid Keystroke fingerprinting by messing with the event resolution
* Disable GeoIP-based search results
???
---
* SVG drawing
* MathML drawing
* I2Pd flavor

230
Makefile
View File

@@ -1,56 +1,208 @@
PREFIX:=/usr
default: zip
install: uninstall
mkdir -p /usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/
cp -rv options /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/options
cp -rv icons /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/icons
cp -rv _locales /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/_locales
cp background.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp proxy.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp info.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp content.js /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp info.css /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp window.html /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp manifest.json /usr/share/webext/i2psetproxy.js@eyedeekay.github.io/
cp README.md /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
cp LICENSE /usr/share/webext/i2psetproxy.js@eyedeekay.github.io
ln -sf /usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2psetproxy.js@eyedeekay.github.io
mkdir -p $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
cp -r ./icons/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./_locales/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./options/ $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.js $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./i2pcontrol/i2pcontrol.js $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol/i2pcontrol.js
cp ./*.html $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.css $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.md $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.xpi $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./manifest.json $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
cp ./LICENSE $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/
ln -s $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
uninstall:
rm -rf /usr/share/webext/i2psetproxy.js@eyedeekay.github.io \
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2psetproxy.js@eyedeekay.github.io
rm -rf $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
clobber:
rm -f ../i2psetproxy.js.zip ../i2p_proxy*.xpi
VERSION=1.24
ls:
ls -lah $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io; \
ls -lah $(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
clean:
rm -fr ../i2psetproxy.js.zip ../i2p_proxy*.xpi ../i2p*.xpi #../i2psetproxy.js_*.*
## EVEN RELEASES are AMO RELEASES
## ODD RELEASES are SELFHOSTED RELEASES
MOZ_VERSION=0.54
VERSION=0.55
#VERSION=$(MOZ_VERSION)
#VERSION=1.27
YELLOW=F7E59A
ORANGE=FFC56D
GREY=D9D9D6
BLUE=A4C8E1
PURPLE=A48fE1
colors:
@echo " yellow $(YELLOW) \n orange $(ORANGE) \n grey $(GREY) \n blue $(BLUE) \n purple $(PURPLE)"
amo-readme:
markdown README.md | \
sed 's|<p>||g' | \
sed 's|</p>||g' | \
sed 's|<h1>|<strong>|g' | \
sed 's|</h1>|</strong>|g' | \
sed 's|<h2>|<strong>|g' | \
sed 's|</h2>|</strong>|g' | \
sed 's|<h3>|<strong>|g' | \
sed 's|</h3>|</strong>|g' | \
grep -v '<img' > amo-index.html
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 "</head>" >> index.html
markdown README.md >> index.html
@echo "</html>" >> index.html
xpi:
mv ~/Downloads/i2p_proxy-$(VERSION)-an+fx.xpi ../i2psetproxy.js@eyedeekay.github.io.xpi
cp:
cp ../i2psetproxy.js@eyedeekay.github.io.xpi ./i2psetproxy.js@eyedeekay.github.io.xpi
#wget -O ../i2ppb@eyedeekay.github.io.xpi \
#https://addons.mozilla.org/firefox/downloads/file/3419789/i2psetproxyjs-$(MOZ_VERSION)-an+fx.xpi
#cp ../i2ppb@eyedeekay.github.io.xpi ./i2ppb@eyedeekay.github.io.xpi
cp ~/Downloads/i2p_in_private_browsing-$(VERSION)-an+fx.xpi ./i2ppb@eyedeekay.github.io.xpi
version:
sed -i 's|7647|7657|g' *.js* */*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)\",|g' manifest.json
moz-version:
sed -i 's|7647|7657|g' *.js* */*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(MOZ_VERSION)\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
rhz-version:
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)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* */*.js*
zip: version
zip --exclude="./i2psetproxy.js@eyedeekay.github.io.xpi" \
--exclude="i2psetproxy.js.png" -r -FS ../i2psetproxy.js.zip *
profile-install:
cp ./i2psetproxy.js@eyedeekay.github.io.xpi $(HOME)/.mozilla/firefox/firefox.profile.i2p/firefox.profile.i2p/extensions
cp ./i2psetproxy.js@eyedeekay.github.io.xpi $(HOME)/.mozilla/firefox/.firefox.profile.i2p.default/extensions
sudo cp ./i2psetproxy.js@eyedeekay.github.io.xpi /usr/local/lib/firefox.profile.i2p/firefox.profile.i2p/extensions/
pi: profile-install
DESC="A simple plugin for configuring an i2p browser."
zip --exclude="./i2ppb@eyedeekay.github.io.xpi" \
--exclude="./i2psetproxy.js@eyedeekay.github.io.xpi" \
--exclude="./i2psetproxy.js.png" \
--exclude="./i2psetproxy.js.gif" \
--exclude="./package.json" \
--exclude="./package-lock.json" \
--exclude="./.node_modules" \
--exclude="./node_modules" \
--exclude="./.git" \
--exclude="*/*.xpi" \
--exclude="web-ext-artifacts" \
--exclude="./*.pdf" -r -FS ../i2psetproxy.js.zip *
release:
gothub release -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d $(DESC)
cat desc debian/changelog | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -; true
upload:
gothub upload -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js@eyedeekay.github.io.xpi" -f "../i2psetproxy.js@eyedeekay.github.io.xpi"
delete-release:
gothub delete -u eyedeekay -r i2psetproxy.js -t $(VERSION); true
recreate-release: delete-release release upload
upload: upload-xpi upload-deb
full-release: release submit deb upload
WEB_EXT_API_KEY=AMO_KEY
WEB_EXT_API_SECRET=AMO_SECRET
-include ../api_keys_moz.mk
tk:
echo $(WEB_EXT_API_KEY)
submit: moz-sign rhz-submit moz-submit
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."
web-ext-submit --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi; true
##EVEN NUMBERED, MOZILLA-DISTRIBUTED VERSIONS HERE!
moz-submit: moz-version
@echo "Using the 'submit' target to instantly sign an extension for Mozilla distribution"
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
web-ext sign --channel listed --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
rhz-submit: rhz-version
@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
web-ext-submit --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
#cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi
gettorrent:
wget "http://127.0.0.1:7657/i2psnark/i2ppb@eyedeekay.github.io.xpi.torrent"
upload-torrent:
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi.torrent" -f "./i2ppb@eyedeekay.github.io.xpi.torrent"
upload-xpi:
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
upload-deb:
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION).orig.tar.gz" -f "../i2psetproxy.js_$(VERSION).orig.tar.gz"
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.debian.tar.xz" -f "../i2psetproxy.js_$(VERSION)-1.debian.tar.xz"
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.dsc" -f "../i2psetproxy.js_$(VERSION)-1.dsc"
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.changes" -f "../i2psetproxy.js_$(VERSION)-1_amd64.changes"
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.buildinfo" -f "../i2psetproxy.js_$(VERSION)-1_amd64.buildinfo"
fmt:
cleancss -O1 all -O2 all --format beautify home.css -o .home.css && mv .home.css home.css
cleancss -O1 all -O2 all --format beautify info.css -o .info.css && mv .info.css info.css
find . -path ./node_modules -prune -o -name '*.js' -exec prettier --write {} \;
find . -path ./node_modules -prune -o -name '*.json' -exec prettier --write {} \;
lint:
eslint --color *.js
deborig: fmt version
rm -rf ../i2psetproxy.js-$(VERSION)
cp -r . ../i2psetproxy.js-$(VERSION)
cd ../i2psetproxy.js-$(VERSION)
rm -rf *.xpi web-ext-artifacts
tar \
-cvz \
--exclude=.git \
--exclude=i2psetproxy.js.gif \
--exclude=node_modules \
--exclude=web-ext-artifacts \
--exclude=*.xpi \
--exclude=*/*.xpi \
--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

70
PLAN.md Normal file
View 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.

193
README.md
View File

@@ -1,68 +1,173 @@
i2psetproxy.js
==============
WebExtension that does extended configuration of a dedicated i2p browser. It's
still not good enough to use on it's own, and should be combined with the Tor
Browser or the I2P Firefox Profile for now.
This is an **Experimental** 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 specific to I2P like protocol handlers and native messaging
systems.
Features
--------
Installation(Cross-Platform):
-----------------------------
* [done] **Indicate** the i2p browser is in use visually
* [done] **Set** the http proxy to use the local i2p proxy
* [done] **Disable** risky webRTC features
* [done] **Change** the color of the browser window to indicate that i2p is in use
* [done-ish] **Reset** the HTTP Proxy tunnel to generate a new destination on-demand
* it does this by working in conjunction with this [standalone HTTP proxy](https://github.com/eyedeekay/httptunnel), currently disabled*
* [ready] **Provide** help in a variety of languages.
For desktop users this addon is available from addons.mozilla.org, where you
will be able to recive automatic updates:
https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/.
Usage with standalone HTTP Proxy
--------------------------------
Debian Installation:
--------------------
This functionality is currently disabled.
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:
I developed a simple HTTP proxy that can be used with this extension to enable the
user to initiate a re-start of the HTTP proxy tunnel, with a new set of keys and a
new destination. This, combined with re-setting the browser settings back to the
original defaults(which is also done by the HTTP Proxy when re-initiated), amounts
to a "Fresh Identity" feature for the I2P browser.
make deb
Before you begin, get the [Standalone HTTP proxy from here](http://github.com/eyedeekay/httptunnel)
and run it like so:
and then you can install it with:
httpproxy -littleboss=start
sudo apt install ../i2psetproxy.js_*.deb
You can also use 'go get'
Usage:
------
go get -u github.com/eyedeekay/httptunnel/httpproxy
* 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:
* ![Landing page](lander.png)
* Also, there's a menu for accessing I2P functionality while you're browsing.
It lets you control a few settings in a granular way.
* ![Menu](menu.png)
* 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
If you change the default host and port, you will need to alter the following guide.
### Features
In order to use it with the custom HTTP proxy, open the "Add-On's" menu and select
the options for the i2psetproxy.js plugin. Change the "Proxy" configuration from
* [done] **Provide** a way to launch into an I2P-Specific contextual identity
(container). Intercept requests to .i2p domains and automatically route them
to the I2P container. Isolate the router console from other local
applications by automatically intercepting requests to the router console to
another container.
* ![Visiting i2p-projekt.i2p](i2psetproxy.js.png)
* [done] **Indicate** the I2P browser is in use visually. Find an
acceptable way to indicate it on Android.
* ![Visiting webmail](susimail.png)
* [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] **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
* ![Visiting i2ptunnel](i2ptunnel.png)
* [ready/broken/wip] **Provide** help in a variety of languages.
* [wip] **Monitor** the health and readiness of the I2P router it is
instructed to use. Currently the plugin checks whether the HTTP Proxy is
working by fetching an image from "http://proxy.i2p" and displaying a result.
A work-in-progress binding to i2pcontrol is available in ./i2pcontrol, it is
inert at this time.
* [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.
* ![Visiting routerconsole](routerconsole.png)
* [wip] **Handle Torrents** by talking to i2psnark-rpc plugin and then
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
can. Right now instead of talking to snark-rpc, it uses a web-based protocl
handler that simply auto-fills the torrent into i2psnark.
* ![Visiting i2psnark](i2psnark.png)
* [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.
* ![Visiting clearweb](clearweb.png)
Host: 127.0.0.1
Port: 4444
### Video
to
* ![Video of the plugin in action](i2psetproxy.js.gif)
Host: 127.0.0.1
Port: 7950
Documents
------------
and change the "Control" configuration from:
* **[Browser Outline](browser.pdf)**: This document is an outline of each of
the browser extension's feature panels in presentation form.
* **[Smart Lander Design](smartlander.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.
Host: 127.0.0.1
Port: 4444
Super Extra Important Background Info:
--------------------------------------
to
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.
Host: 127.0.0.1
Port: 7951
### Links about Project Uplift
Now, when you press the Toopie button in the toolbar, you will see in the output
of the HTTP proxy that it has been re-started.
* 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
Screenshot
----------
Project uplift seems to have largely been accomplished?
![Visiting i2p-projekt.i2p](i2psetproxy.js.png)
### 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
The Old Version
---------------
New versions of this extension create an I2P in Private Browsing mode instead.
Since this is a drastic change to the behavior of the old plugin, a new entry
for the new plugin has been made at a new location on addons.mozilla.org.
* This is the new version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/)
* This is the old version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/)
Android usage:
--------------
Open the following link
[Github Releases Version](https://github.com/eyedeekay/i2psetproxy.js/releases/)
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.
### Android addons.mozilla.org(Temporarily Disabled)
If you would prefer to recieve automatic updates from AMO, the correct product
page for this plugin is
[I2P In Private Browsing](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/).
This absolutely requires a working outproxy. If you want to avoid the use of AMO
for updates, you can download the identical plugin from this repository's
releases page. The latest AMO Plugin will always be identical to the latest
github release, except for the version number, which must be incremented for
submission to AMO.

View File

@@ -1,6 +1,6 @@
{
"extensionName": {
"message": "i2psetproxy.js",
"message": "I2P In Private Browsing",
"description": "Name of the extension."
},
"extensionDescription": {
@@ -8,11 +8,59 @@
"description": "Description of the extension."
},
"titlePreface": {
"message": "I2P Browser - ",
"message": "I2P Browser",
"description": "Preface for the browser titlebar"
},
"titlePrefacePrivate": {
"message": "I2P Browser (Private) - ",
"message": "I2P Browser (Private)",
"description": "Preface for the browser titlebar"
},
"webPreface": {
"message": "Web Browser",
"description": "Preface for the browser titlebar"
},
"webPrefacePrivate": {
"message": "Web Browser (Private)",
"description": "Preface for the browser titlebar"
},
"localPreface": {
"message": "Localhost Browser",
"description": "Preface for the browser titlebar"
},
"localPrefacePrivate": {
"message": "Localhost Browser (Private)",
"description": "Preface for the browser titlebar"
},
"routerPreface": {
"message": "Router Console",
"description": "Preface for the browser titlebar"
},
"routerPrefacePrivate": {
"message": "Router Console (Private)",
"description": "Preface for the browser titlebar"
},
"torrentPreface": {
"message": "Bittorrent",
"description": "Preface for the browser titlebar"
},
"torrentPrefacePrivate": {
"message": "Bittorrent (Private)",
"description": "Preface for the browser titlebar"
},
"mailPreface": {
"message": "Web Mail",
"description": "Preface for the browser titlebar"
},
"mailPrefacePrivate": {
"message": "Web Mail (Private)",
"description": "Preface for the browser titlebar"
},
"i2ptunnelPreface": {
"message": "Hidden Services Manager",
"description": "Preface for the browser titlebar"
},
"i2ptunnelPrefacePrivate": {
"message": "Hidden Services Manager (Private)",
"description": "Preface for the browser titlebar"
},
"resetMessage": {
@@ -57,10 +105,22 @@
},
"controlHostText": {
"message": "Control Host: ",
"description": "Host for the Reset Tunnel button"
"description": "Host for the Router Console"
},
"controlPortText": {
"message": "Control Port: ",
"description": "Port for the Reset Tunnel button"
"description": "Port for the Router Console"
},
"controlHostValue": {
"message": "127.0.0.1",
"description": "Host for the Router Console"
},
"controlPortValue": {
"message": "7657",
"description": "Port for the Router Console"
},
"protocolHandlerValue": {
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent",
"description": "Value for the magnet protocol handler"
}
}

View File

@@ -1,180 +0,0 @@
/*******************************************************
** Proxy Auto Configure Script with I2P Host Detection.
**
** Author: Cervantes
** License: Public Domain
** Date: 11 May 2004
**
** Revised: 07 Sep 2004
** Changes:
** Proxy recursion disabled by default (strict)
** Password Authentication for session commands
** Support for http://path?i2paddresshelper=BASE64
** Support for http://i2p/BASE64/path syntax
** Revised: 17 May 2004
** Changes:
** Ability for the user to control the proxy
** status on a per browser-session basis.
********************************************************/
/* C O N F I G U R A T I O N
*/
/* Replace normal with "PROXY yourproxy:port" if you run
** behind a Proxy Server by default.
*/
var normal = "DIRECT";
/* Specify the I2P proxy connection details here.
*/
var i2pProxy = "PROXY 127.0.0.1:7950";
/* Set the default status of proxy detection here:
**
**
** [1] "auto" => Proxy will be used automatically if
** '-> an ".i2p" url is detected.
** '-> You will only be anonymous for ".i2p" domains.
**
** [2] "on" => Proxy is enabled all the time. (safest)
** '-> NB. Normal web available only via
** '-> i2p outproxies.
** '-> You can be fairly confident of anonymity.
**
** [3] "off" => Completely Bypass the proxy and therefore i2p.
** '-> no i2p sites will be accessible...
** '-> ...your browsing habits can potentially
** '-> be traced back to you!
**
*/
var proxyStatus = "on";
/* By setting statusKeyword to "all" you can set these options at runtime
** for the duration of the browser session by entering special commands
** into your browser address bar.
**
** Due to limitations in the way proxy scripting works, a malicious site
** could change your status mode by linking to command keywords...
** eg. <img src="i2p.off" ...
** This is why the default setting for statusKeyword is "limited", which only
** allows you to set the proxy status to "on". See also keywordAuthPassword.
**
** [1] "all" => All proxy status urls are available.
** '-> i2p.on, i2p.off, i2p.auto (respective to proxyStatus settings)
** '-> WARNING: Setting "all" is a big risk to your anonymity!
** '-> In this mode it is highly recommended you set an AuthPassword too!
**
** [2] "limited" => Only i2p.on is available..
** '-> This setting lasts for the duration of the browser setting.
** '-> You have to close your browser in order to revert to
** '-> your default proxyStatus configuration.
**
** [3] "off" => No command urls available.
** '-> The status mode can only be altered by editing the above
** '-> proxyStatus setting. (safest)
**
*/
var statusKeyword = "on";
/*
** By default if proxyStatus is set to "auto" the config script
** will fall back to your normal connection settings if the
** i2p proxy is offline. This is handy for browsing your locally
** hosted eepsites when your router is not running (for instance).
** However this can mean that requests to external eepsites could
** be forwarded to the outweb and potentially compromise some of
** your rights to anonymity.
** Setting "true" here enables strict mode where all requests to ".i2p"
** sites will be rejected if the i2p proxy is offline. (safest)
*/
var strict = true;
/*
** By setting an authentication password, all activated session keywords
** will require the addition of a password to prevent malicious sites from
** hijacking your proxy settings. ie. <img src="i2p.off" ...
** Users should append whatever they set here to any command keywords
** they use.
** eg. i2p.on.passw0rd
** If left blank, authentication is ignored - it is recommended that
** you use "limited" statusKeyword mode if you choose not to require a password.
** If you do require this feature then you should replace the default "passw0rd" with
** one of your own (recommend at least 8 letters with a case-sensitive alpha-numeric
** mix of characters).
**
*/
var keywordAuthPassword = "passw0rd";
/* E N D C O N F I G U R A T I O N
*/
/* Allows the proxy to fallback on "normal" settings
** '-> if the i2p router is offline.
*/
if (strict == false) {
i2pProxy = i2pProxy + "; " + normal;
}
/*Check for User Authentication Password.
*/
if (keywordAuthPassword != "") {
keywordAuthPassword = "." + keywordAuthPassword;
}
/* This function gets called every time a url is submitted
*/
function FindProxyForURL(url, host) {
/* checks for a special command url that
** '-> changes the status of the proxy script.
*/
if (statusKeyword != "off") {
if (host == "i2p.off" + keywordAuthPassword && statusKeyword == "all") {
/*Proxy is bypassed - outweb available only
*/
proxyStatus = "off";
} else if (host == "i2p.auto" + keywordAuthPassword && statusKeyword == "all") {
/* Proxy is used only for .i2p hosts otherwise
** '-> browse as normal.
*/
proxyStatus = "auto";
} else if (host == "i2p.on" + keywordAuthPassword && (statusKeyword == "limited" ||
statusKeyword == "all" )) {
/* Only I2P traffic is accepted.
*/
proxyStatus = "on";
}
}
if (proxyStatus == "off") {
/* Proxy is completely bypassed.
*/
return normal;
} else if (proxyStatus == "on") {
/* All requests are forward to the proxy.
*/
return i2pProxy;
}
host = host.toLowerCase();
/* check tld for "i2p" or oOo's new "i2paddresshelper" syntax - if found then redirect
** '-> request to the i2p proxy
*/
if (url.match(/^http:\/\/i2p\/[a-zA-Z0-9\-\~]{516}|i2paddresshelper=/i) ||
shExpMatch(host, "*.i2p")) { // seems more reliable than:
return i2pProxy; // dnsDomainIs(host, ".i2p") ||
} else { // i2pRegex.test(host)
return normal;
}
}

View File

@@ -1,180 +0,0 @@
/*******************************************************
** Proxy Auto Configure Script with I2P Host Detection.
**
** Author: Cervantes
** License: Public Domain
** Date: 11 May 2004
**
** Revised: 07 Sep 2004
** Changes:
** Proxy recursion disabled by default (strict)
** Password Authentication for session commands
** Support for http://path?i2paddresshelper=BASE64
** Support for http://i2p/BASE64/path syntax
** Revised: 17 May 2004
** Changes:
** Ability for the user to control the proxy
** status on a per browser-session basis.
********************************************************/
/* C O N F I G U R A T I O N
*/
/* Replace normal with "PROXY yourproxy:port" if you run
** behind a Proxy Server by default.
*/
var normal = "DIRECT";
/* Specify the I2P proxy connection details here.
*/
var i2pProxy = "PROXY 127.0.0.1:4444";
/* Set the default status of proxy detection here:
**
**
** [1] "auto" => Proxy will be used automatically if
** '-> an ".i2p" url is detected.
** '-> You will only be anonymous for ".i2p" domains.
**
** [2] "on" => Proxy is enabled all the time. (safest)
** '-> NB. Normal web available only via
** '-> i2p outproxies.
** '-> You can be fairly confident of anonymity.
**
** [3] "off" => Completely Bypass the proxy and therefore i2p.
** '-> no i2p sites will be accessible...
** '-> ...your browsing habits can potentially
** '-> be traced back to you!
**
*/
var proxyStatus = "on";
/* By setting statusKeyword to "all" you can set these options at runtime
** for the duration of the browser session by entering special commands
** into your browser address bar.
**
** Due to limitations in the way proxy scripting works, a malicious site
** could change your status mode by linking to command keywords...
** eg. <img src="i2p.off" ...
** This is why the default setting for statusKeyword is "limited", which only
** allows you to set the proxy status to "on". See also keywordAuthPassword.
**
** [1] "all" => All proxy status urls are available.
** '-> i2p.on, i2p.off, i2p.auto (respective to proxyStatus settings)
** '-> WARNING: Setting "all" is a big risk to your anonymity!
** '-> In this mode it is highly recommended you set an AuthPassword too!
**
** [2] "limited" => Only i2p.on is available..
** '-> This setting lasts for the duration of the browser setting.
** '-> You have to close your browser in order to revert to
** '-> your default proxyStatus configuration.
**
** [3] "off" => No command urls available.
** '-> The status mode can only be altered by editing the above
** '-> proxyStatus setting. (safest)
**
*/
var statusKeyword = "off";
/*
** By default if proxyStatus is set to "auto" the config script
** will fall back to your normal connection settings if the
** i2p proxy is offline. This is handy for browsing your locally
** hosted eepsites when your router is not running (for instance).
** However this can mean that requests to external eepsites could
** be forwarded to the outweb and potentially compromise some of
** your rights to anonymity.
** Setting "true" here enables strict mode where all requests to ".i2p"
** sites will be rejected if the i2p proxy is offline. (safest)
*/
var strict = true;
/*
** By setting an authentication password, all activated session keywords
** will require the addition of a password to prevent malicious sites from
** hijacking your proxy settings. ie. <img src="i2p.off" ...
** Users should append whatever they set here to any command keywords
** they use.
** eg. i2p.on.passw0rd
** If left blank, authentication is ignored - it is recommended that
** you use "limited" statusKeyword mode if you choose not to require a password.
** If you do require this feature then you should replace the default "passw0rd" with
** one of your own (recommend at least 8 letters with a case-sensitive alpha-numeric
** mix of characters).
**
*/
var keywordAuthPassword = "passw0rd";
/* E N D C O N F I G U R A T I O N
*/
/* Allows the proxy to fallback on "normal" settings
** '-> if the i2p router is offline.
*/
if (strict == false) {
i2pProxy = i2pProxy + "; " + normal;
}
/*Check for User Authentication Password.
*/
if (keywordAuthPassword != "") {
keywordAuthPassword = "." + keywordAuthPassword;
}
/* This function gets called every time a url is submitted
*/
function FindProxyForURL(url, host) {
/* checks for a special command url that
** '-> changes the status of the proxy script.
*/
if (statusKeyword != "off") {
if (host == "i2p.off" + keywordAuthPassword && statusKeyword == "all") {
/*Proxy is bypassed - outweb available only
*/
proxyStatus = "off";
} else if (host == "i2p.auto" + keywordAuthPassword && statusKeyword == "all") {
/* Proxy is used only for .i2p hosts otherwise
** '-> browse as normal.
*/
proxyStatus = "auto";
} else if (host == "i2p.on" + keywordAuthPassword && (statusKeyword == "limited" ||
statusKeyword == "all" )) {
/* Only I2P traffic is accepted.
*/
proxyStatus = "on";
}
}
if (proxyStatus == "off") {
/* Proxy is completely bypassed.
*/
return normal;
} else if (proxyStatus == "on") {
/* All requests are forward to the proxy.
*/
return i2pProxy;
}
host = host.toLowerCase();
/* check tld for "i2p" or oOo's new "i2paddresshelper" syntax - if found then redirect
** '-> request to the i2p proxy
*/
if (url.match(/^http:\/\/i2p\/[a-zA-Z0-9\-\~]{516}|i2paddresshelper=/i) ||
shExpMatch(host, "*.i2p")) { // seems more reliable than:
return i2pProxy; // dnsDomainIs(host, ".i2p") ||
} else { // i2pRegex.test(host)
return normal;
}
}

View File

@@ -1,57 +1,458 @@
chrome.windows.onCreated.addListener(themeWindow);
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 localpref = chrome.i18n.getMessage("localPreface");
var localprefpriv = chrome.i18n.getMessage("localPrefacePrivate");
function onContextsGot(contexts) {
var ids = [];
for (let context of contexts) {
console.log(`Name: ${context.name}`);
ids.push(context.name);
}
console.log("Checking new contexts");
if (ids.indexOf(titlepref) == -1) {
browser.contextualIdentities
.create({
name: titlepref,
color: "orange",
icon: "fingerprint"
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(webpref) == -1) {
browser.contextualIdentities
.create({
name: webpref,
color: "red",
icon: "circle"
})
.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(localpref) == -1) {
browser.contextualIdentities
.create({
name: localpref,
color: "red",
icon: "fence"
})
.then(onCreated, onNotCreated);
}
}
function onContextsError() {
console.log("Error finding contextual identities, is the API enabled?");
}
function onCreated(context) {
console.log(`New identity's ID: ${context.cookieStoreId}.`);
}
function onNotCreated(context) {
console.log(`identity ID: ${context.cookieStoreId} not created`);
}
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;
}
var oldtheme = null;
var getOldTheme = async function getOldTheme() {
let foundtheme = await browser.theme.getCurrent();
if (!isEmpty(foundtheme)) {
oldtheme = foundtheme;
console.log("Found old theme", oldtheme);
}
return oldtheme;
};
getOldTheme();
function themeWindow(window) {
// Check if the window is in private browsing
if (window.incognito) {
chrome.theme.update(window.id, {
// Check if the window is in private browsing
function onThemeError() {
console.log("got theme", oldtheme);
browser.theme.update(oldtheme);
}
function logTabs(tabInfo) {
function onContextGotTheme(context) {
if (context.name == titlepref) {
console.log("Active in I2P window");
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: "#A0A0DE",
toolbar: "#A0A0DE",
frame: "#FFC56D",
toolbar: "#FFC56D"
}
});
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
});
}
else {
chrome.theme.update(window.id, {
});
} else {
browser.theme.update(window.id, {
colors: {
frame: "#BFA0DE",
toolbar: "#BFA0DE",
frame: "#FFC56D",
toolbar: "#FFC56D"
}
});
chrome.windows.update(window.id, {
titlePreface: titlepref
});
});
}
} else if (context.name == routerpref) {
console.log("Active in Router Console window");
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: "#A4C8E1",
toolbar: "#A4C8E1"
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: "#A4C8E1",
toolbar: "#A4C8E1"
}
});
}
} else if (context.name == tunnelpref) {
console.log("Active in Hidden Services Manager window");
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: "#D9D9D6",
toolbar: "#D9D9D6"
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: "#D9D9D6",
toolbar: "#D9D9D6"
}
});
}
} else if (context.name == mailpref) {
console.log("Active in Web Mail window");
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: "#F7E59A",
toolbar: "#F7E59A"
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: "#F7E59A",
toolbar: "#F7E59A"
}
});
}
} else if (context.name == torrentpref) {
console.log("Active in Bittorrent window");
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: "#A48FE1",
toolbar: "#A48FE1"
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: "#A48FE1",
toolbar: "#A48FE1"
}
});
}
} else {
console.log("Not active in I2P window");
if (isEmpty(oldtheme)) {
browser.theme.reset();
} else {
browser.theme.update(window.id, oldtheme);
}
}
}
if (
tabInfo[0].cookieStoreId != "firefox-default" &&
tabInfo[0].cookieStoreId != "firefox-private"
) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onContextGotTheme, onThemeError);
} else {
if (isEmpty(oldtheme)) {
browser.theme.reset();
} else {
browser.theme.update(window.id, oldtheme);
}
}
}
var querying = browser.tabs.query({
currentWindow: true,
active: true
});
querying.then(logTabs, onThemeError);
}
function setTitle(window){
if (window.incognito) {
chrome.windows.update(window.id, {
titlePreface: titleprefpriv
});
function setTitle(window) {
// Check if the window is in private browsing
function onContextError() {
console.log("Context Error");
}
function logTabs(tabInfo) {
function onContextGotTitle(context) {
if (context.name == titlepref) {
console.log("Active in I2P window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + ": "
});
}
} else if (context.name == webpref) {
console.log("Active in Web window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: webprefpriv + " - "
});
} else {
browser.windows.update(window.id, {
titlePreface: webpref + " - "
});
}
} else if (context.name == routerpref) {
console.log("Active in Router Console window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + routerprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + routerpref + ": "
});
}
} else if (context.name == tunnelpref) {
console.log("Active in Hidden Services Manager window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + tunnelprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + tunnelpref + ": "
});
}
} else if (context.name == mailpref) {
console.log("Active in I2P Web Mail window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + mailprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + mailpref + ": "
});
}
} else if (context.name == torrentpref) {
console.log("Active in I2P Torrent window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + torrentprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + torrentpref + ": "
});
}
} else if (context.name == localpref) {
console.log("Active in Localhost window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: localprefpriv + " - " + localprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: localpref + " - " + localpref + ": "
});
}
}
}
else {
chrome.windows.update(window.id, {
titlePreface: titlepref
});
if (
tabInfo[0].cookieStoreId != "firefox-default" &&
tabInfo[0].cookieStoreId != "firefox-private"
) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onContextGotTitle, onContextError);
} else if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: ""
});
} else {
browser.windows.update(window.id, {
titlePreface: ""
});
}
}
var querying = browser.tabs.query({
currentWindow: true,
active: true
});
querying.then(logTabs, onContextError);
}
function setTitleError(window){
alert("plugin error setting title on", window.id)
}
chrome.windows.onCreated.addListener(() => {
const gettingStoredSettings = chrome.storage.local.get();
gettingStoredSettings.then(setupProxy, onError);
var gettingListenerInfo = browser.runtime.getPlatformInfo();
gettingListenerInfo.then(got => {
function onPlatformError() {
console.log("Error finding platform info");
}
if (got.os != "android") {
browser.windows.onCreated.addListener(() => {
chrome.storage.local.get(function() {
setupProxy();
});
});
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(() => {
const getting = browser.windows.getCurrent({populate: true});
getting.then(setTitle, setTitleError);
/*
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
browser.tabs.onCreated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true
});
getting.then(setTitle, onError);
});
}
});
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
browser.tabs.onActivated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true
});
getting.then(setTitle, onError);
});
}
});
*/
function handleUpdated(updateInfo) {
if (updateInfo.theme) {
console.log(`Theme was applied: ${updateInfo.theme}`);
} else {
console.log("Theme was removed");
}
}
browser.theme.onUpdated.addListener(handleUpdated);

168
bookmarks.js Normal file
View File

@@ -0,0 +1,168 @@
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
function bookmarks(bookmarkToolbar) {
console.log("Setting up bookmark toolbar", bookmarkToolbar);
function bookHome(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(":")[1];
if (port == "7644") {
let createRhizomeBookmark = browser.bookmarks.create({
url: "about:I2p",
title: "I2P Home Page",
parentId: bookmarkToolbar[0].id
});
createRhizomeBookmark.then(onCreated);
} else {
let createBookmark = browser.bookmarks.create({
url: browser.runtime.getURL("home.html"),
title: "I2P Home Page",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
}
console.log("(bookmarks) adding home page bookmark");
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
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 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/i2ptunnelmgr",
title: "Hidden Services Manager",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createRhizomeBookmark = browser.bookmarks.create({
url:
"http://" +
control_host +
":" +
control_port +
"/i2ptunnelmgr",
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 Home Page"
});
b0.then(bookHome, onRejected);
var b1 = browser.bookmarks.search({
title: "Bittorrent"
});
b1.then(bookTorrent, onRejected);
var b2 = browser.bookmarks.search({
title: "Hidden Services Manager"
});
b2.then(bookI2PTunnel, onRejected);
var b3 = browser.bookmarks.search({
title: "Web Mail"
});
b3.then(bookMail, onRejected);
}
var bt = browser.bookmarks.search({
query: "Toolbar"
});
bt.then(bookmarks);
function handleCreated(id, bookmarkInfo) {
//var propValue;
for (var propName in bookmarkInfo) {
let propValue = bookmarkInfo[propName];
console.log(propName, propValue);
}
}
browser.bookmarks.onCreated.addListener(handleCreated);
}
});

BIN
browser.pdf Normal file

Binary file not shown.

BIN
clearweb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

View File

@@ -1,17 +1,35 @@
var infoTitle = document.getElementById('text-section-header');
var infoTitle = document.getElementById("text-section-header");
infoTitle.textContent = chrome.i18n.getMessage("infoTitle");
var infoMessage = document.getElementById('text-section-helptext');
infoMessage.textContent = chrome.i18n.getMessage("infoMessage");
var helpMessage = document.getElementById('window-create-forum-panel');
/*
var helpMessage = document.getElementById("window-create-forum-panel");
helpMessage.textContent = chrome.i18n.getMessage("forumMessage");
*/
/*
var helpMessage = document.getElementById('window-create-help-panel');
helpMessage.textContent = chrome.i18n.getMessage("helpMessage")
*/
var newsMessage = document.getElementById('window-create-news-panel');
/*
var newsMessage = document.getElementById("window-create-news-panel");
newsMessage.textContent = chrome.i18n.getMessage("newsMessage");
*/
var clearData = document.getElementById("clear-browser-data");
clearData.textContent = chrome.i18n.getMessage("clearData");
/*
document.addEventListener("click", e => {
browser.runtime.sendMessage({ url: "http://proxy.i2p" });
});
var clearData = documents.getElementByID("clear-browser-data")
cleardata.textContent = chrome.i18n.getMessage("clearData");
function proxyContent(message) {
var proxyData = document.getElementById("proxy-health");
proxyData.textContent = message;
console.log("Event occurred", message);
}
browser.runtime.onMessage.addListener(proxyContent);
*/
/*
function signalWebRTC(val){
console.log("signal", val)
}
*/

75
context.js Normal file
View File

@@ -0,0 +1,75 @@
//var windowIds = []
var titlepref = chrome.i18n.getMessage("titlePreface");
function onError(error) {
console.log(`Error: ${error}`);
}
function eventHandler(event) {
function onCreated(windowInfo) {
console.log(`Created window: ${windowInfo.id}`);
browser.tabs.create({
windowId: windowInfo.id,
url: "about:blank",
cookieStoreId: event.target.dataset.identity
});
}
if (event.target.dataset.action == "create") {
var creating = browser.tabs.create({
cookieStoreId: event.target.dataset.identity
});
creating.then(onCreated, onError);
}
if (event.target.dataset.action == "close-all") {
browser.tabs
.query({
cookieStoreId: event.target.dataset.identity
})
.then(tabs => {
browser.tabs.remove(tabs.map(rem => rem.id));
});
}
event.preventDefault();
}
function createOptions(node, identity) {
for (let option of ["Create", "Close All"]) {
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);
}
}
var div = document.getElementById("identity-list");
if (browser.contextualIdentities === undefined) {
div.innerText =
"browser.contextualIdentities not available. Check that the privacy.userContext.enabled pref is set to true, and reload the add-on.";
} else {
browser.contextualIdentities
.query({
name: titlepref
})
.then(identities => {
if (!identities.length) {
div.innerText = "No identities returned from the API.";
return;
}
for (let identity of identities) {
let row = document.createElement("div");
let span = document.createElement("span");
span.className = "identity";
span.innerText = identity.name;
span.style = `color: ${identity.color}`;
console.log(identity);
row.appendChild(span);
createOptions(row, identity);
div.appendChild(row);
}
});
}

8
debian/README.Debian vendored Normal file
View File

@@ -0,0 +1,8 @@
i2psetproxy.js for Debian
Please edit this to provide information specific to
this i2psetproxy.js Debian package.
(Automatically generated by debmake Version 4.3.1)
-- idk <hankhill19580@gmail.com> Thu, 01 Aug 2019 00:32:39 -0400

74
debian/changelog vendored Normal file
View File

@@ -0,0 +1,74 @@
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 2019 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
<nnnn is the bug number of your ITP>
-- idk <hankhill19580@gmail.com> Thu, 01 Aug 2019 00:32:39 -0400

1
debian/compat vendored Normal file
View File

@@ -0,0 +1 @@
11

17
debian/control vendored Normal file
View File

@@ -0,0 +1,17 @@
Source: i2psetproxy.js
Section: unknown
Priority: optional
Maintainer: idk <hankhill19580@gmail.com>
Build-Depends: debhelper (>=11~)
Standards-Version: 4.1.4
Homepage: https://github.com/eyedeekay/i2psetproxy.js
Package: i2psetproxy.js
Architecture: any
Multi-Arch: foreign
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: Plugin for configuring i2p in Firefox and Chromium
This is a webextension which safely configures a Browser on the
Debian operating system to use I2P. i2psetproxy.js users form
their own anonymity set, like TAILS users or Brave users do on
the Tor network.

59
debian/copyright vendored Normal file
View File

@@ -0,0 +1,59 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: i2psetproxy.js
Source: https://github.com/eyedeekay/i2psetproxy.js
Files: .gitignore
Makefile
README.md
_locales/en/messages.json
background.js
content.js
context.js
.circleci/config.yml
experiments/i2ptab.md
experiments/tunblink.md
i2psetproxy.js.png
i2psetproxy.js@eyedeekay.github.io.xpi
icons/toopie.png
info.css
info.js
manifest.json
options/options.css
options/options.js
options/options.html
package-lock.json
platform.js
privacy.js
proxy.js
scrub.js
window.html
debian/*
*
Copyright: MIT
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
.
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 OR COPYRIGHT HOLDERS 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.
Files: chromium/browser-polyfill.js
Copyright: MPL in: chromium/LICENSE
License: MPL-2.0
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
.

1
debian/patches/series vendored Normal file
View File

@@ -0,0 +1 @@
# You must remove unused comment lines for the released package.

21
debian/rules vendored Executable file
View File

@@ -0,0 +1,21 @@
#!/usr/bin/make -f
%:
dh $@
override_dh_auto_install:
mkdir -p $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
$$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol \
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
cp -r ./icons/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./options/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp -r ./_locales/ $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./i2pcontrol/i2pcontrol.js $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol/
cp ./*.html $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.css $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./*.md $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./manifest.json $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
cp ./LICENSE $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io/
ln -sf $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
$$(pwd)/debian/i2psetproxy.js/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}

1
debian/source/format vendored Normal file
View File

@@ -0,0 +1 @@
3.0 (quilt)

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

@@ -0,0 +1,6 @@
i2psetproxy.js.gif
i2psetproxy.js@eyedeekay.github.io.xpi
i2ppb@eyedeekay.github.io.xpi
web-ext-artifacts/i2p_in_private_browsing-0.51-an+fx.xpi
smartlander.pdf
browser.pdf

2
debian/source/local-options vendored Normal file
View File

@@ -0,0 +1,2 @@
#abort-on-upstream-changes
#unapply-patches

1
debian/watch vendored Normal file
View File

@@ -0,0 +1 @@
version=3

6
desc Normal file
View File

@@ -0,0 +1,6 @@
I2P in Private Browsing Mode
============================
A simple plugin for configuring a Firefox based web browser to isolate I2P
Browsing to a single contextual identity, thus creating an I2P in Private
Browsing mode. It requires the use of a pre-installed I2P Router.

3
experiments/i2ptab.md Normal file
View File

@@ -0,0 +1,3 @@
Private Browsing with I2P Tab
=============================

45
experiments/tunblink.md Normal file
View File

@@ -0,0 +1,45 @@
Usage with standalone HTTP Proxy
--------------------------------
This functionality is currently disabled.
I developed a simple HTTP proxy that can be used with this extension to enable the
user to initiate a re-start of the HTTP proxy tunnel, with a new set of keys and a
new destination. This, combined with re-setting the browser settings back to the
original defaults(which is also done by the HTTP Proxy when re-initiated), amounts
to a "Fresh Identity" feature for the I2P browser.
Before you begin, get the [Standalone HTTP proxy from here](http://github.com/eyedeekay/httptunnel)
and run it like so:
httpproxy -littleboss=start
You can also use 'go get'
go get -u github.com/eyedeekay/httptunnel/httpproxy
If you change the default host and port, you will need to alter the following guide.
In order to use it with the custom HTTP proxy, open the "Add-On's" menu and select
the options for the i2psetproxy.js plugin. Change the "Proxy" configuration from
Host: 127.0.0.1
Port: 4444
to
Host: 127.0.0.1
Port: 7950
and change the "Control" configuration from:
Host: 127.0.0.1
Port: 4444
to
Host: 127.0.0.1
Port: 7951
Now, when you press the Toopie button in the toolbar, you will see in the output
of the HTTP proxy that it has been re-started.

1
geti2p.url Normal file
View File

@@ -0,0 +1 @@
0.9.43

45
handler.js Normal file
View File

@@ -0,0 +1,45 @@
function identifyProtocolHandler(url) {
//console.log("looking for handler-able requests")
if (routerHost(url)) {
if (url.includes(encodeURIComponent("ext+rc:"))) {
return url.replace(encodeURIComponent("ext+rc:"), "");
} else if (url.includes("ext+rc:")) {
return url.replace("ext+rc:", "");
}
} else if (url.includes("ext+rc:")) {
return url;
}
return false;
}
function trimHost(url) {
let hostname = "";
let prefix = "";
if (url.indexOf("://") > -1) {
prefix = url.substr(0, url.indexOf("://") + 3);
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
let path = url.replace(prefix + hostname, "");
console.log("(handler) path", prefix + hostname, path);
return path;
}
var handlerSetup = 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>"] },
["blocking"]
);

289
home.css Normal file
View File

@@ -0,0 +1,289 @@
* {
padding: 0;
margin: 0
}
html {
height: 100%
}
a,
button {
color: #3b6bbf;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.applicationDesc {
color: #81888f;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.applicationDesc:hover,
a:hover,
button:hover {
color: #495057;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
button {
border: none;
cursor: pointer;
color: #3b6bbf;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
body {
display: flex;
flex-direction: column;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
width: 100%;
height: 100%;
margin: 0 auto;
padding: 0;
color: #495057;
background-attachment: fixed;
background-size: 100% 100%;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.background {
background-color: #f8f8ff;
height: 100%
}
p {
line-height: 32px;
font-size: 17px;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
text-decoration: none;
color: #495057;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.content {
min-height: 3rem;
padding: 1rem;
margin: 1.5rem;
display: inline-block;
border: 1px solid #d9d9d6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
background: #f8f8ff;
min-width: 95%
}
.application-info,
.extended-info {
min-height: 3rem;
padding: 1rem;
margin-top: 1.5rem;
display: inline-block;
border: 1px solid #d9d9d6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
background: #f8f8ff;
min-width: 95%
}
h1 {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 32px;
text-transform: uppercase;
color: #41465f;
border: 1px solid #dee2e6;
border-radius: 2px 2px 0 0;
width: 90%;
padding-left: 5%
}
h2,
h3 {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 25px;
text-transform: uppercase;
color: #41465f;
border: 1px solid #dee2e6;
border-radius: 2px 2px 0 0;
width: 90%;
padding-left: 5%
}
h4 {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 20px!important;
text-transform: uppercase;
color: #41465f;
border: 1px solid #dee2e6;
border-radius: 2px 2px 0 0;
width: 90%;
padding-left: 5%
}
.showhider {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
text-transform: uppercase;
background: 0 0!important;
border: none;
padding: 0!important;
width: 90%;
color: #3b6bbf;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0;
text-align: left
}
#links .showhider {
font-size: 25px
}
.section-header {
display: flex;
flex-direction: row;
margin-bottom: 80px
}
ul {
margin-left: 2rem;
list-style: none
}
li {
min-height: 3rem;
padding: .5rem;
background: #dee2e6;
border: 1px solid #dee2e6;
width: 64%;
min-width: 64%;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
margin: .5rem .5rem .5rem 32%
}
#readyness {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
width: 42%;
min-width: 42%;
background: #dee2e6;
text-align: center!important;
border: 1px solid #dee2e6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#onboarding {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
width: 42%;
min-width: 42%;
font-size: 2rem;
background: #a48fe1;
text-align: center!important;
border: 1px solid #a48fe1;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#i2pbrowser-description {
width: 50%;
min-width: 50%;
min-height: 5rem;
padding: .5rem;
display: inline;
background: #dee2e6;
float: right;
border: 1px solid #dee2e6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#applicationExplain,
#linksExplain {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
width: 30%;
min-width: 30%;
background: #dee2e6;
float: left;
text-align: center!important;
border: 1px solid #dee2e6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#proxyReady {
min-height: 3rem;
padding: .5rem;
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline;
background: #d9d9d6;
float: right;
text-align: center!important;
border: 1px solid #d9d9d6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#proxyUnready {
min-height: 3rem;
padding: .5rem;
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline;
float: right;
text-align: center!important;
border: 1px solid #ffc56d;
border-radius: 2px;
background: #ffc56d;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#consoleOn {
min-height: 3rem;
padding: .5rem;
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline;
float: left;
text-align: center!important;
border: 1px solid #f7e59a;
border-radius: 2px;
background: #f7e59a;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
.onboardingContent {
font-size: .8rem!important;
text-align: left;
display: none
}
#proxy-check {
visibility: hidden
}
#info-content {
display: none
}
.consoleOn:hover #proxy-check,
.proxyReady:hover #proxy-check {
visibility: visible;
opacity: 1
}
img {
max-width: 100%
}
img.readyness {
height: 100%;
width: auto
}
@media only screen and (max-width: 399px) {
.application-info {
display: none
}
}

114
home.html Normal file
View File

@@ -0,0 +1,114 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="home.css"/>
</head>
<body>
<!--<div>-->
<script src="home.js" type="text/javascript"></script>
<div class='background'>
<div class='content'>
<div class='section-header'>
<h1>I2P In Private Browsing</h1>
</div>
<div id="i2pbrowser-version"></div>
<div id="i2pbrowser-description">
<p id="description">I2P in Private Browsing is a webextension to secure and enhance your I2P use in the browser.</p>
<p class="beta">This is an experimental product.</p>
</div>
<div id="readyness">
<div id="consoleOn" class="hideIfI2PConsoleOff">
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
<span id="proxy-check">Proxy is ready.</span>
</div>
<!--<div id="proxyUnready" class="hideIfI2PProxyOn">The proxy is not ready yet.</div>-->
<div id="proxyReady" class="hideIfI2PProxyOff">
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
<span id="proxy-check">Proxy is ready.</span>
</div>
</div>
<div id="onboarding" class="hideIfI2PConsoleOff">
<h3 id="onboardingTitle">New to I2P? Learn more here.</h3>
<h4 id="onboardingZero"><button id="onboardingButtonZero" class="showhider" onclick="flipVisibility('onboardingContentZero')">Protect your Privacy</button></h4>
<p id="onboardingContentZero" class="onboardingContent">I2P Browser allows you to surf the internet using the private and secure I2P network. When using it, you are protected against tracking, surveillance, and censorship as a first-class participant in the I2P network. I2P Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser.</p>
<h4 id="onboardingOne"><button id="onboardingButtonOne" class="showhider" onclick="flipVisibility('onboardingContentOne')">Configure your Experience</button></h4>
<p id="onboardingContentOne" class="onboardingContent">We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do. Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them. With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
<h4 id="onboardingTwo"><button id="onboardingButtonTwo" class="showhider" onclick="flipVisibility('onboardingContentTwo')">Share Files</button></h4>
<p id="onboardingContentTwo" class="onboardingContent">I2P is capable of using peer-to-peer applications like BitTorrent, protecting your identity when you share files. Our anonymous bittorrent client is available in the browser.</p>
<h4 id="onboardingThree"><button id="onboardingButtonThree" class="showhider" onclick="flipVisibility('onboardingContentThree')">Hidden e-mail</button></h4>
<p id="onboardingContentThree" class="onboardingContent">There is also an anonymous e-mail service available inside of I2P, which is accessible from our browser via the menu directly below.</p>
<h4 id="onboardingFour"><button id="onboardingButtonFour" class="showhider" onclick="flipVisibility('onboardingContentFour')">Experience Tips</button></h4>
<p id="onboardingContentFour" class="onboardingContent">With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
</div>
<!--<p class="hideIfI2POn">&aboutI2p.warn_not_running; <a href="about:i2p">&aboutI2p.refresh_text;</a> &aboutI2p.reccommend_not_running;</p>-->
<div class="application-info">
<p class="hideIfI2PConsoleOff">
<h3>Applications</h3>
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
<ul>
<a class="applicationName" target="_blank" href="http://127.0.0.1:7657/i2ptunnel">
<li class="application">
Hidden Services Manager <span class="applicationDesc">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span>
</li>
</a>
<a class="applicationName" target="_blank" href="http://127.0.0.1:7657/susimail">
<li class="application">
E-Mail <span class="applicationDesc">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span>
</li>
</a>
<a class="applicationName" target="_blank" href="http://127.0.0.1:7657/i2psnark">
<li class="application">
BitTorrent <span class="applicationDesc">I2P is capable of anonymous Peer-to-Peer file sharing, to use the built-in bittorrent client go here:</span>
</li>
</a>
</ul>
</p>
</div>
<div class="extended-info">
<h3 id="links"><button id="fliplinks" class="showhider">Links</button></h3>
<div id="info-content">
<p id="linksExplain">If you want to get more information about I2P, you can visit these links.</p>
<p>
<ul>
<a href="https://github.com/i2p/i2p-browser">
<li>
I2P Browser Source Code: <span class="applicationDesc">Go here to browse the source code of our Firefox fork.</span>
</li>
</a>
<a href="https://github.com/i2p/i2pbutton">
<li>
I2P Button Source Code: <span class="applicationDesc">Much of the functionality of the I2P Browser is implemented in the I2PButton plugin.</span>
</li>
</a>
<a href="https://github.com/mikalv/i2p-browser-build-scripts">
<li>
I2P Browser Build Scripts: <span class="applicationDesc">These scripts are used to build the browser.</span>
</li>
</a>
<a href="https://github.com/mikalv/i2p-browser-design-docs">
<li>
I2P Browser Design Document: <span class="applicationDesc">This is the I2P Browser Design Document.</span>
</li>
</a>
<a href="http://trac.i2p2.i2p/">
<li>
Trac Wiki: <span class="applicationDesc">To report a bug, visit the Trac Wiki.</span>
</li>
</a>
<a href="http://i2p-projekt.i2p/get-involved/donate">
<li>
<em>Support Us: </em> <span class="applicationDesc">I2P is funded by donations. In order to make a donation visit the project web site.</span>
</li>
</a>
</ul>
</p>
</div>
</div>
</div>
</div>
<!--</div>-->
</body>
</html>

24
home.js Normal file
View File

@@ -0,0 +1,24 @@
document.addEventListener("click", 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) {
let flippable = document.getElementById(div);
if (flippable.style.display === "none") {
flippable.style.display = "block";
} else {
flippable.style.display = "none";
}
}

111
host.js Normal file
View File

@@ -0,0 +1,111 @@
function proxyHost(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
if (hostname == "proxy.i2p") {
return true;
}
return false;
}
function localHost(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
hostname = hostname.split(":")[0];
if (hostname === "127.0.0.1") {
return true;
} else if (hostname === "localhost") {
return true;
}
return false;
}
function extensionHost(url) {
var res = url.startsWith(browser.runtime.getURL(""));
console.log("Extension URL?", res, url, browser.runtime.getURL(""));
return res;
}
function i2pHostName(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
return hostname;
}
function i2pHost(url) {
let hostname = i2pHostName(url);
return hostname.endsWith(".i2p");
}
function routerHost(url) {
let hostname = "";
let path = "";
function pathcheck(str) {
if (str != undefined) {
let final = str.split("/")[0];
if (final === "i2ptunnelmgr" || final === "i2ptunnel") {
console.log("(urlcheck) application path", final);
return "i2ptunnelmgr";
} else if (final === "i2psnark" || final === "torrents") {
console.log("(urlcheck) application path", final);
return "i2psnark";
} else if (final === "webmail" || final === "susimail") {
console.log("(urlcheck) application path", final);
return "webmail";
} else if (
final === "home" ||
final === "console" ||
final.startsWith("config")
) {
console.log("(urlcheck) application path", final);
return "routerconsole";
}
}
return true;
}
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
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);
} else if (hostname === "127.0.0.1:7657") {
return pathcheck(path);
} else if (hostname === "localhost:7657") {
return pathcheck(path);
}
if (hostname === "127.0.0.1:7657") {
return pathcheck(path);
} else if (hostname === "localhost:7657") {
return pathcheck(path);
}
if (hostname === "127.0.0.1:7070") {
return pathcheck(path);
} else if (hostname === "localhost:7070") {
return pathcheck(path);
}
return false;
}

47
i2pcontrol/i2pcontrol.js Normal file
View File

@@ -0,0 +1,47 @@
function send(json) {
const Http = new XMLHttpRequest();
Http.withCredentials = false;
const url = "http://" + "127.0.0.1" + ":" + "7650";
Http.open("POST", url);
Http.send(json);
//console.log(Http);
return Http;
}
function authenticate(user, password) {
var json = {
jsonrpc: "2.0",
id: user,
method: "Authenticate",
params: {
API: 1,
Password: password
}
};
return send(json);
}
var username = "";
var password = "";
function echo(string, section) {
var xhr = authenticate(username, password);
console.log("(i2pcontrol) echo", xhr);
xhr.onload = function() {
resp = JSON.Parse(xhr.responseText);
json = {
jsonrpc: "2.0",
id: username,
method: "Echo",
params: {
Token: resp.Token,
Echo: string
}
};
var controlMessage = document.getElementById(section);
console.log("(i2pcontrol) reply", xhr.responseText);
infoMessage.textContent = xhr.responseText;
};
}
echo("test", "test");

BIN
i2psetproxy.js.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

After

Width:  |  Height:  |  Size: 213 KiB

BIN
i2psnark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
i2ptunnel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

119
icons/i2plogo.svg Normal file
View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="109.95727mm"
height="27.706699mm"
viewBox="0 0 109.95727 27.706699"
version="1.1"
id="svg4773"
inkscape:version="0.92.1 r"
sodipodi:docname="horizontal_color.svg">
<defs
id="defs4767" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="125.25987"
inkscape:cy="51.24018"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1366"
inkscape:window-height="740"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata4770">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-55.768389,-115.63486)">
<g
id="g5355">
<path
inkscape:connector-curvature="0"
id="path4516"
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 55.768389,116.32817 h 5.625388 v 26.53071 h -5.625388 z" />
<path
inkscape:connector-curvature="0"
id="path4528"
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="M 83.567492,142.85915 H 64.806129 v -3.94692 l 6.737086,-6.81049 c 1.994831,-2.04361 3.297929,-3.46052 3.910222,-4.24981 0.611829,-0.78977 1.052235,-1.52051 1.321681,-2.19367 0.268981,-0.67315 0.403705,-1.37046 0.403705,-2.09285 0,-1.07686 -0.296392,-1.8787 -0.890103,-2.40504 -0.593711,-0.52589 -1.38579,-0.78929 -2.377165,-0.78929 -1.040621,0 -2.050116,0.23877 -3.028948,0.71589 -0.979764,0.47756 -2.001336,1.15675 -3.066113,2.03756 l -3.083766,-3.65285 c 1.321681,-1.1261 2.416654,-1.92143 3.285851,-2.38646 0.868731,-0.46502 1.817367,-0.8232 2.845444,-1.07406 1.028078,-0.25087 2.178334,-0.3763 3.451235,-0.3763 1.676607,0 3.157633,0.30615 4.442612,0.91798 1.284979,0.61229 2.282403,1.46848 2.992248,2.56995 0.709385,1.10148 1.064782,2.36231 1.064782,3.78154 0,1.23667 -0.217415,2.39575 -0.651785,3.47912 -0.434369,1.08288 -1.107514,2.19365 -2.01946,3.33183 -0.911472,1.13818 -2.517923,2.75997 -4.818901,4.86443 l -3.451235,3.24962 v 0.2569 h 11.693973 z" />
<path
inkscape:connector-curvature="0"
id="path4532"
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 92.213601,128.81343 h 1.850822 c 1.730025,0 3.024298,-0.34145 3.88374,-1.02529 0.858507,-0.68337 1.288228,-1.67846 1.288228,-2.98528 0,-1.31843 -0.360032,-2.29215 -1.079636,-2.92164 -0.720078,-0.62854 -1.848504,-0.94352 -3.384343,-0.94352 h -2.558811 z m 12.703009,-4.21033 c 0,2.85566 -0.89243,5.03911 -2.67682,6.55126 -1.78485,1.51261 -4.322284,2.26845 -7.612787,2.26845 h -2.413402 v 9.43621 h -5.625393 v -26.53071 h 8.474561 c 3.218022,0 5.664411,0.69266 7.340551,2.078 1.6752,1.38532 2.51329,3.45076 2.51329,6.19679" />
<path
inkscape:connector-curvature="0"
id="path4536"
style="fill:#ffc434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 121.18308,137.09597 c 0,-3.44937 -2.79621,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44939 2.7962,6.24559 6.24557,6.24559 3.44938,0 6.24559,-2.7962 6.24559,-6.24559" />
<path
inkscape:connector-curvature="0"
id="path4540"
style="fill:#60ab60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 121.18308,122.24846 c 0,-3.44937 -2.79621,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44938 2.7962,6.24559 6.24557,6.24559 3.44938,0 6.24559,-2.79621 6.24559,-6.24559" />
<path
inkscape:connector-curvature="0"
id="path4544"
style="fill:#e15647;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 136.03063,137.09597 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44939,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44939 2.7962,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.7962 6.24557,-6.24559" />
<path
inkscape:connector-curvature="0"
id="path4548"
style="fill:#ffc434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 136.03063,122.24846 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44939,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44938 2.7962,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.79621 6.24557,-6.24559" />
<path
inkscape:connector-curvature="0"
id="path4552"
style="fill:#ffc434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 150.87814,137.09597 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44938,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44939 2.79621,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.7962 6.24557,-6.24559" />
<path
inkscape:connector-curvature="0"
id="path4556"
style="fill:#60ab60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 150.87814,122.24846 c 0,-3.44937 -2.7962,-6.24557 -6.24557,-6.24557 -3.44938,0 -6.24559,2.7962 -6.24559,6.24557 0,3.44938 2.79621,6.24559 6.24559,6.24559 3.44937,0 6.24557,-2.79621 6.24557,-6.24559" />
<path
inkscape:connector-curvature="0"
id="path4560"
style="fill:#60ab60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 165.72566,137.09597 c 0,-3.44937 -2.7962,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44939 2.7962,6.24559 6.24557,6.24559 3.44939,0 6.24559,-2.7962 6.24559,-6.24559" />
<path
inkscape:connector-curvature="0"
id="path4564"
style="fill:#e15647;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.46456254"
d="m 165.72566,122.24846 c 0,-3.44937 -2.7962,-6.24557 -6.24559,-6.24557 -3.44937,0 -6.24557,2.7962 -6.24557,6.24557 0,3.44938 2.7962,6.24559 6.24557,6.24559 3.44939,0 6.24559,-2.79621 6.24559,-6.24559" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 18 KiB

189
index.html Normal file
View File

@@ -0,0 +1,189 @@
<!DOCTYPE html>
<html>
<head>
<title>I2P in Private Browsing Mode</title>
<link rel="stylesheet" type="text/css" href ="home.css" />
</head>
<h1>i2psetproxy.js</h1>
<p>This is an <strong>Experimental</strong> 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 specific to I2P like protocol handlers and native messaging
systems.</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:
https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/.</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>Usage:</h2>
<ul>
<li>Basically, it "Just Works." After you install the plugin, browsing to an I2P
domain will automatically stop the current tab and re-open the I2P site in an
I2P Browser tab.</li>
<li>Besides that, four bookmarks are added to the "Bookmarks Toolbar," which
will take you to visit your Java I2P applications, or the "Simplified I2P
Landing Page" embedded in the plugin:</li>
<li><img src="lander.png" alt="Landing page" title="" /></li>
<li>Also, there's a menu for accessing I2P functionality while you're browsing.
It lets you control a few settings in a granular way.</li>
<li><img src="menu.png" alt="Menu" title="" /></li>
<li>You can re-enable WebRTC but force it to always use the proxy that is
enforced by the tab.</li>
<li>You can either force the browser to delete all history for I2P sites
immediately, or you can close all your I2P Browser tabs at once and delete
the history for I2P browsing when you're done.</li>
<li>That's all there is to it! Your browser is configured to safely use and
administer I2P</li>
</ul>
<h3>Features</h3>
<ul>
<li>[done] <strong>Provide</strong> a way to launch into an I2P-Specific contextual identity
(container). Intercept requests to .i2p domains and automatically route them
to the I2P container. Isolate the router console from other local
applications by automatically intercepting requests to the router console to
another container.</li>
<li><img src="i2psetproxy.js.png" alt="Visiting i2p-projekt.i2p" title="" /></li>
<li>[done] <strong>Indicate</strong> the I2P browser is in use visually. Find an
acceptable way to indicate it on Android.</li>
<li><img src="susimail.png" alt="Visiting webmail" title="" /></li>
<li>[done] <strong>Set</strong> the http proxy to use the local I2P proxy automatically.
Provide specific configuration for other types of I2P proxies(SOCKS,
isolating HTTP)</li>
<li>[done] <strong>Disable</strong> risky webRTC features/offer the option to re-enable
them with the proxy enforced.</li>
<li>[done] <strong>Change</strong> the color of the browser window to indicate that I2P is in
use</li>
<li><img src="i2ptunnel.png" alt="Visiting i2ptunnel" title="" /></li>
<li>[ready/broken/wip] <strong>Provide</strong> help in a variety of languages.</li>
<li>[wip] <strong>Monitor</strong> the health and readiness of the I2P router it is
instructed to use. 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>[Done] <strong>Handle</strong> router console applications under their own origins and
within their own contextual identity. (1) The router console is automatically
confined to it's own container tab. (2) Use a custom protocol handler to
place each i2p application/plugin under it's own origin, shortening router
console URL's and placing applications under their own origin.</li>
<li><img src="routerconsole.png" alt="Visiting routerconsole" title="" /></li>
<li>[wip] <strong>Handle Torrents</strong> by talking to i2psnark-rpc plugin and then
adding them directly into the Firefox downloads drop-downs, menus, etc. If I
can. Right now instead of talking to snark-rpc, it uses a web-based protocl
handler that simply auto-fills the torrent into i2psnark.</li>
<li><img src="i2psnark.png" alt="Visiting i2psnark" title="" /></li>
<li>[barely started] <strong>Isolate</strong> traffic by contextual identity to it's own HTTP
Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The
contextual identities. For now, the contextual identities used to manage
browsing are "I2P Browsing" and "Web Browsing" where I2P Browsing is capable
of using an outproxy but in the case of traffic destined for the clearnet
does not do header rewriting, and Web Browsing falls back to the Proxy
configured in Firefox. The I2P Browsing will be expanded to
<ul>
<li>I2P Amnesiac Browsing: Use for General Browsing, stores no history and
uses an HTTP Proxy with a very short tunnel-close timeout and no key-reuse.</li>
<li>I2P Social Networking: Use this for logging into social network accounts,
forums, and other interactive asynchronous public communication platforms
where your identity is behaviorally linkable. This has a very long
tunnel-close timeout and key-reuse until specifically invoked.</li>
<li>I2P Blogging: Use this for posting content to the web interface of your
blog or to other similar websites that you create content on.</li>
</ul></li>
<li><img src="clearweb.png" alt="Visiting clearweb" title="" /></li>
</ul>
<h3>Video</h3>
<ul>
<li><img src="i2psetproxy.js.gif" alt="Video of the plugin in action" title="" /></li>
</ul>
<h2>Documents</h2>
<ul>
<li><strong><a href="browser.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="smartlander.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>
</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>https://wiki.mozilla.org/Security/Tor_Uplift</li>
<li>https://wiki.mozilla.org/Security/FirstPartyIsolation</li>
<li>https://wiki.mozilla.org/Security/Fingerprinting</li>
<li>https://wiki.mozilla.org/Security/Fennec%2BTor_Project</li>
<li>https://wiki.mozilla.org/Security/Tor_Uplift/Tracking</li>
</ul>
<p>Project uplift seems to have largely been accomplished?</p>
<h3>Links about Project Fusion</h3>
<ul>
<li>https://wiki.mozilla.org/Security/Fusion</li>
<li>https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject</li>
<li>https://blog.torproject.org/tor-heart-firefox</li>
</ul>
<h2>The Old Version</h2>
<p>New versions of this extension create an I2P in Private Browsing mode instead.
Since this is a drastic change to the behavior of the old plugin, a new entry
for the new plugin has been made at a new location on addons.mozilla.org.</p>
<ul>
<li><p>This is the new version: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">[link]</a></p></li>
<li><p>This is the old version: <a href="https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/">[link]</a></p></li>
</ul>
<h2>Android usage:</h2>
<p>Open the following link
<a href="https://github.com/eyedeekay/i2psetproxy.js/releases/">Github Releases Version</a>
in the browser you want to use for I2P. Firefox will warn you that it is about
to install an extension and indicate the permissions required. Read them over
and when you're ready, accept them. That's all it should take, your browser is
now configured to use I2P.</p>
<h3>Android addons.mozilla.org(Temporarily Disabled)</h3>
<p>If you would prefer to recieve automatic updates from AMO, the correct product
page for this plugin is
<a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">I2P In Private Browsing</a>.
This absolutely requires a working outproxy. If you want to avoid the use of AMO
for updates, you can download the identical plugin from this repository's
releases page. The latest AMO Plugin will always be identical to the latest
github release, except for the version number, which must be incremented for
submission to AMO.</p>
</html>

View File

@@ -1,12 +1,54 @@
html, body {
width: 350px;
body,
html {
width: 50rem
}
a {
margin: 10px;
display: inline-block;
margin: 10px
}
.panel {
margin: 5px;
margin: 5px
}
span.identity {
width: 100px;
display: inline-block;
margin-left: 1em
}
figcaption {
display: inline
}
.section-header {
display: flex;
flex-direction: row;
margin-bottom: 8px
}
p {
font-size: 12px
}
h1 {
font-size: 25px
}
h2,
h3 {
font-size: 18px
}
h4 {
font-size: 13px!important
}
#links .showhider {
font-size: 18px
}
#onboarding {
font-size: 2rem
}
img.readyness {
height: 2rem
}
#proxyUnready {
min-height: 2rem
}
#proxyReady {
min-height: 2rem
}
#consoleOn {
min-height: 2rem
}

204
info.js
View File

@@ -1,49 +1,189 @@
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);
document.getElementById("enable-web-rtc").checked = webrtc;
});
}
if (e.target.id === "window-create-help-panel") {
checkPeerConnection();
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);
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(){
console.log("Generating new identity")
const Http = new XMLHttpRequest();
const url='http://' + controlHost + ":" + controlPort
Http.open("GET", url);
Http.send();
Http.onreadystatechange=(e)=>{
console.log(Http.responseText)
}
} 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 = 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") {
forgetBrowsingData()
refreshIdentity();
} else if (clickEvent.target.id === "window-preface-title") {
} else if (clickEvent.target.id === "window-visit-homepage") {
console.log("attempting to create homepage tab");
goHome();
} 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 (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" });
}
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();
});
function proxyReadiness() {
console.log(this.responseText);
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
browser.history.onVisited.addListener(onVisited);
}
});
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);
} else {
let createData = {
url: "home.html"
};
console.log("visiting homepage");
let creating = browser.tabs.create(createData);
}
console.log("(bookmarks) adding home page bookmark");
}
console.log("(bookmarks) checking if we're running in an I2P Browser");
var gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
function onTabCreated() {
console.log("Tab Created");
}
function goTunnel() {
function onTabError() {
console.log("I2PTunnel tab created");
}
let createData = {
url: "http://" + control_host + ":" + control_port + "/i2ptunnel"
};
console.log("visiting i2ptunnel");
let creating = browser.tabs.create(createData);
creating(onTabCreated, onTabError);
}
function goMail() {
function onTabError() {
console.log("Mail tab created");
}
let createData = {
url: "http://" + control_host + ":" + control_port + "/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://" + control_host + ":" + control_port + "/i2psnark"
};
console.log("visiting snark");
let creating = browser.tabs.create(createData);
creating(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);
}
}

BIN
lander.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -1,14 +1,30 @@
{
"applications": {
"gecko": {
"id": "i2psetproxy.js@eyedeekay.github.io",
"id": "i2ppb@eyedeekay.github.io",
"strict_min_version": "60.0"
}
},
"permissions": ["theme", "browsingData", "notifications", "proxy", "privacy", "storage"],
"permissions": [
"theme",
"browsingData",
"bookmarks",
"notifications",
"proxy",
"privacy",
"storage",
"webRequest",
"webRequestBlocking",
"contextualIdentities",
"cookies",
"history",
"tabs",
"<all_urls>"
],
"manifest_version": 2,
"name": "__MSG_extensionName__",
"version": "1.24",
"version": "0.55",
"version_name": "0.55",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://github.com/eyedeekay/i2psetproxy.js",
"icons": {
@@ -24,8 +40,36 @@
"page": "options/options.html"
},
"background": {
"scripts": ["background.js", "proxy.js", "info.js", "privacy.js" ]
"scripts": [
"privacy.js",
"platform.js",
"background.js",
"host.js",
"handler.js",
"proxy.js",
"info.js",
"home.js",
"i2pcontrol/i2pcontrol.js",
"scrub.js",
"bookmarks.js"
]
},
"protocol_handlers": [
{
"protocol": "ext+rc",
"name": "RouterConsole",
"uriTemplate": "http://127.0.0.1:7657/%s"
},
{
"protocol": "ext+dati2p",
"name": "Dat over I2P",
"uriTemplate": "/dat.html#!/%s"
},
{
"protocol": "magnet",
"name": "I2PTorrent",
"uriTemplate": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent"
}
],
"default_locale": "en"
}

BIN
menu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -33,3 +33,30 @@ label:hover {
font-size: 1.2em;
margin-bottom: 0.5em;
}
html, body {
width: 350px;
}
a {
margin: 10px;
display: inline-block;
}
.panel {
margin: 5px;
}
span.identity {
width: 100px;
display: inline-block;
margin-left: 1em;
}
.control-options {
display: none;
}
.identity-options {
display: none;
}

View File

@@ -25,7 +25,12 @@
<input type="text" data="port" id="port" value="4444"/>
</section>
<!--
<section class="scheme-options identity-options">
<div class="panel">
<div id="identity-list">Identity list?</div>
</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
@@ -37,7 +42,7 @@
<input type="text" data="controlport" id="controlport" value="4444"/>
</section>
-->
<input type="button" value="Save preferences" id="save-button"/>
<script src="options.js"></script>

View File

@@ -1,205 +1,291 @@
function isDroid() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "android") {
return true
}
});
function SetHostText() {
var hostid = document.getElementById("hostText");
hostid.textContent = chrome.i18n.getMessage("hostText");
}
function SetHostText(){
var hostid = document.getElementById('hostText');
hostid.textContent = chrome.i18n.getMessage("hostText");
function SetPortText() {
var portid = document.getElementById("portText");
portid.textContent = chrome.i18n.getMessage("portText");
}
function SetPortText(){
var portid = document.getElementById('portText');
portid.textContent = chrome.i18n.getMessage("portText");
function SetControlHostText() {
var controlhostid = document.getElementById("controlHostText");
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
}
function SetControlHostText(){
var controlhostid = document.getElementById('controlHostText');
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
function SetControlPortText() {
var controlportid = document.getElementById("controlPortText");
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
}
function SetControlPortText(){
var controlportid = document.getElementById('controlPortText');
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
}
function SetControlHelpText(){
var portid = document.getElementById('controlHelpText');
portid.textContent = chrome.i18n.getMessage("controlHelpText");
function SetControlHelpText() {
var portid = document.getElementById("controlHelpText");
portid.textContent = chrome.i18n.getMessage("controlHelpText");
}
function getScheme() {
const proxy_scheme = document.querySelector("#proxy_scheme");
console.log("Got i2p proxy scheme:", proxy_scheme.value);
return proxy_scheme.value;
const proxy_scheme = document.querySelector("#proxy_scheme");
console.log("Got i2p proxy scheme:", proxy_scheme.value);
if (proxy_scheme == "HTTP") {
return "http";
}
if (proxy_scheme == "SOCKS") {
return "socks";
}
return proxy_scheme.value;
}
function getHost() {
proxy_host = document.getElementById("host").value
console.log("Got i2p proxy host:", proxy_host);
if (proxy_host == undefined){
return "127.0.0.1"
}
return proxy_host;
proxy_host = document.getElementById("host").value;
console.log("Got i2p proxy host:", proxy_host);
if (proxy_host == undefined) {
return "127.0.0.1";
}
return proxy_host;
}
function getPort() {
proxy_port = document.getElementById("port").value
console.log("Got i2p proxy port:", proxy_port);
if (proxy_port == undefined){
return 4444
}
return proxy_port;
proxy_port = document.getElementById("port").value;
console.log("Got i2p proxy port:", proxy_port);
if (proxy_port == undefined) {
return "4444";
}
return proxy_port;
}
function getControlHost() {
control_host = document.getElementById("controlhost").value
console.log("Got i2p control host:", control_host);
if (control_host == undefined){
return "127.0.0.1"
}
return control_host;
control_host = document.getElementById("controlhost").value;
console.log("Got i2p control host:", control_host);
if (control_host == undefined) {
return "127.0.0.1";
}
return control_host;
}
function getControlPort() {
control_port = document.getElementById("controlport").value
console.log("Got i2p control port:", control_port);
if (control_port == undefined){
return 4444
}
return control_port;
}
function isFirefox() {
testPlain = navigator.userAgent.indexOf('Firefox') !== -1;
if (testPlain) {
return testPlain
}
testTorBrowser = navigator.userAgent.indexOf('Tor') !== -1;
if (testTorBrowser) {
return testTorBrowser
}
return false
control_port = document.getElementById("controlport").value;
console.log("Got i2p control port:", control_port);
if (control_port == undefined) {
return "4444";
}
return control_port;
}
function checkStoredSettings(storedSettings) {
function gotProxyInfo(info) {
let defaultSettings = {};
if (!storedSettings.proxy_scheme){
defaultSettings["proxy_scheme"] = "http"
let host = info.value.http.split(":")[0];
let port = info.value.http.split(":")[1];
console.log("proxy", "'" + host + "'", ":", port);
if (!storedSettings.proxy_scheme) {
defaultSettings["proxy_scheme"] = "http";
}
if (!storedSettings.proxy_host) {
defaultSettings["proxy_host"] = "127.0.0.1"
if (host == "") {
defaultSettings["proxy_host"] = "127.0.0.1";
} else {
defaultSettings["proxy_host"] = host;
}
} else {
if (host != "") {
defaultSettings["proxy_host"] = host;
} else {
defaultSettings["proxy_host"] = storedSettings.proxy_host;
}
}
if (!storedSettings.proxy_port) {
defaultSettings["proxy_port"] = 4444
if (port == undefined) {
defaultSettings["proxy_port"] = 4444;
} else {
defaultSettings["proxy_port"] = port;
}
} else {
if (port != undefined) {
defaultSettings["proxy_port"] = port;
} else {
defaultSettings["proxy_port"] = storedSettings.proxy_port;
}
}
if (!storedSettings.control_host) {
defaultSettings["control_host"] = "127.0.0.1"
if (host == "") {
defaultSettings["control_host"] = "127.0.0.1";
} else {
defaultSettings["control_host"] = host;
}
} else {
if (host != "") {
defaultSettings["control_host"] = host;
} else {
defaultSettings["control_host"] = storedSettings.control_host;
}
}
if (!storedSettings.control_port) {
defaultSettings["control_port"] = 4444
if (port == undefined) {
defaultSettings["control_port"] = 4444;
} else {
defaultSettings["control_port"] = port;
}
} else {
if (port != undefined) {
defaultSettings["control_port"] = port;
} else {
defaultSettings["control_port"] = storedSettings.control_port;
}
}
console.log("(browserinfo) NATIVE PROXYSETTINGS", info.value);
console.log(
defaultSettings["proxy_host"],
defaultSettings["proxy_port"],
defaultSettings["control_host"],
defaultSettings["control_port"]
);
chrome.storage.local.set(defaultSettings);
}
var gettingInfo = browser.proxy.settings.get({});
gettingInfo.then(gotProxyInfo);
}
function checkAndroidStoredSettings(storedSettings) {
let defaultSettings = {};
let host = "";
let port = "";
console.log("proxy", "'" + host + "'", ":", port);
if (!storedSettings.proxy_scheme) {
defaultSettings["proxy_scheme"] = "http";
}
if (!storedSettings.proxy_host) {
if (host == "") {
defaultSettings["proxy_host"] = "127.0.0.1";
} else {
defaultSettings["proxy_host"] = host;
}
} else {
if (host != "") {
defaultSettings["proxy_host"] = host;
} else {
defaultSettings["proxy_host"] = storedSettings.proxy_host;
}
}
if (!storedSettings.proxy_port) {
if (port == undefined) {
defaultSettings["proxy_port"] = 4444;
} else {
defaultSettings["proxy_port"] = port;
}
} else {
if (port != undefined) {
defaultSettings["proxy_port"] = port;
} else {
defaultSettings["proxy_port"] = storedSettings.proxy_port;
}
}
if (!storedSettings.control_host) {
if (host == "") {
defaultSettings["control_host"] = "127.0.0.1";
} else {
defaultSettings["control_host"] = host;
}
} else {
if (host != "") {
defaultSettings["control_host"] = host;
} else {
defaultSettings["control_host"] = storedSettings.control_host;
}
}
if (!storedSettings.control_port) {
if (port == undefined) {
defaultSettings["control_port"] = 4444;
} else {
defaultSettings["control_port"] = port;
}
} else {
if (port != undefined) {
defaultSettings["control_port"] = port;
} else {
defaultSettings["control_port"] = storedSettings.control_port;
}
}
console.log(
defaultSettings["proxy_host"],
defaultSettings["proxy_port"],
defaultSettings["control_host"],
defaultSettings["control_port"]
);
chrome.storage.local.set(defaultSettings);
}
function onError(e) {
console.error(e);
}
//var controlHost = "127.0.0.1" //getControlHost()
//var controlPort = "7951" //getControlPort();
function setupProxy() {
//var controlHost = getControlHost()
//var controlPort = getControlPort()
var Host = getHost()
var Port = getPort()
if (isDroid()) {
console.log("Setting up Firefox Android proxy")
function handleProxyRequest(requestInfo) {
if (shouldProxyRequest(requestInfo)) {
console.log(`Proxying: ${requestInfo.url}`);
return {type: "http", host: Host, port: Port};
}
return {type: "http", host: Host, port: Port};
}
browser.proxy.onRequest.addListener(handleProxyRequest, {urls: ["<all_urls>"]});
console.log("i2p settings created for Firefox Android")
}else{
console.log("Setting up Firefox Desktop proxy")
var proxySettings = {
proxyType: "manual",
http: Host+":"+Port,
passthrough: "",
httpProxyAll: true
};
browser.proxy.settings.set({value:proxySettings});
console.log("i2p settings created for Firefox Desktop")
}
console.error(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 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);
}
function updateUI(restoredSettings) {
const selectList = document.querySelector("#proxy_scheme");
selectList.value = restoredSettings.proxy_scheme;
console.log("showing proxy scheme:", selectList.value);
const selectList = document.querySelector("#proxy_scheme")
selectList.value = restoredSettings.proxy_scheme
console.log("showing proxy scheme:", selectList.value)
const hostitem = document.getElementById("host");
hostitem.value = restoredSettings.proxy_host;
console.log("showing proxy host:", hostitem.value);
const hostitem = document.getElementById("host")
hostitem.value = restoredSettings.proxy_host
console.log("showing proxy host:", hostitem.value)
const portitem = document.getElementById("port");
portitem.value = restoredSettings.proxy_port;
console.log("showing proxy port:", portitem.value);
const portitem = document.getElementById("port")
portitem.value = restoredSettings.proxy_port
console.log("showing proxy port:", portitem.value)
const controlhostitem = document.getElementById("controlhost");
controlhostitem.value = restoredSettings.control_host;
console.log("showing control host:", controlhostitem.value);
/*const controlhostitem = document.getElementById("controlhost")
controlhostitem.value = restoredSettings.control_host
console.log("showing control host:", controlhostitem.value)
const controlportitem = document.getElementById("controlport");
controlportitem.value = restoredSettings.control_port;
console.log("showing control port:", controlportitem.value);
const controlportitem = document.getElementById("controlport")
controlportitem.value = restoredSettings.control_port
console.log("showing control port:", controlportitem.value)*/
SetHostText()
SetPortText()
/*SetControlHostText()
SetControlPortText()
SetControlHelpText()*/
setupProxy()
SetHostText();
SetPortText();
SetControlHostText();
SetControlPortText();
SetControlHelpText();
}
function onError(e) {
console.error(e);
console.error(e);
}
chrome.storage.local.get(function(got){
checkStoredSettings(got)
updateUI(got)
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
chrome.storage.local.get(function(got) {
checkStoredSettings(got);
updateUI(got);
});
} else {
chrome.storage.local.get(function(got) {
checkAndroidStoredSettings(got);
updateUI(got);
});
}
});
const saveButton = document.querySelector("#save-button");
saveButton.addEventListener("click", storeSettings);
//EXPERIMENTAL: Open in I2P Tab

26
platform.js Normal file
View File

@@ -0,0 +1,26 @@
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;
}
});
function isDroid() {
console.log("android?", android);
if (android == undefined) {
return false;
}
return android;
}
function notClosable() {
return false;
}

View File

@@ -1,3 +1,4 @@
var titlepref = chrome.i18n.getMessage("titlePreface");
function onSet(result) {
if (result) {
@@ -7,43 +8,49 @@ function onSet(result) {
}
}
// This disables queries to centralized databases of bad URLs to screen for
// risky sites in your browser
/* This disables queries to centralized databases of bad URLs to screen for
risky sites in your browser */
function disableHyperlinkAuditing() {
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
value: false
});
console.log("Disabling hyperlink auditing/val=", {
value: false
})
setting.then(onSet);
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
value: false
});
console.log("Disabling hyperlink auditing/val=", {
value: false
});
setting.then(onSet);
}
// This enables first-party isolation
function enableFirstPartyIsolation() {
var setting = browser.privacy.websites.firstPartyIsolate.set({
value: true
});
console.log("Enabling first party isolation/val=", {
value: true
})
setting.then(onSet);
var setting = browser.privacy.websites.firstPartyIsolate.set({
value: true
});
console.log("Enabling first party isolation/val=", {
value: true
});
setting.then(onSet);
}
// This rejects tracking cookies and third-party cookies but it
// LEAVES "Persistent" Cookies unmodified in favor of an option in the content
// interface for now
/* This rejects tracking cookies and third-party cookies but it
LEAVES "Persistent" Cookies unmodified in favor of an option in the content
interface for now */
function disableEvilCookies() {
var getting = browser.privacy.websites.cookieConfig.get({});
getting.then((got) => {
var setting = browser.privacy.websites.cookieConfig.set(
{value: {behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies}}
);
console.log("Setting cookie behavior/val=", {value: {behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies}})
setting.then(onSet);
var getting = browser.privacy.websites.cookieConfig.get({});
getting.then(got => {
var setting = browser.privacy.websites.cookieConfig.set({
value: {
behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies
}
});
console.log("Setting cookie behavior/val=", {
value: {
behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies
}
});
setting.then(onSet);
});
}
// Make sure that they're gone
@@ -59,128 +66,157 @@ function disableEvilCookies() {
// this disables the use of referrer headers
function disableReferrers() {
var setting = browser.privacy.websites.referrersEnabled.set({
value: false
});
console.log("Disabling referrer headers/val=", {
value: false
})
setting.then(onSet);
var setting = browser.privacy.websites.referrersEnabled.set({
value: false
});
console.log("Disabling referrer headers/val=", {
value: false
});
setting.then(onSet);
}
// enable fingerprinting resistent features(letterboxing and stuff)
function enableResistFingerprinting() {
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);
}
// This is essentially a blocklist of clearnet web-sites known to do bad tracking
function enableTrackingProtection() {
var setting = browser.privacy.websites.trackingProtectionMode.set({
value: "always"
});
console.log("Enabling tracking protection/val=", {
value: "always"
})
setting.then(onSet);
var setting = browser.privacy.websites.trackingProtectionMode.set({
value: "always"
});
console.log("Enabling tracking protection/val=", {
value: "always"
});
setting.then(onSet);
}
// This disables protected content, which is a form of digital restrictions
// management dependent on identifying information
/* This disables protected content, which is a form of digital restrictions
management dependent on identifying information */
function disableDigitalRestrictionsManagement() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.set({
value: false
});
console.log("Setting Protected Content(Digital Restrictions Management) false/val=", {
value: false
})
setting.then(onSet);
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.set({
value: false
});
console.log(
"Setting Protected Content(Digital Restrictions Management) false/val=",
{
value: false
}
});
);
setting.then(onSet);
}
});
}
function setAllPrivacy() {
disableHyperlinkAuditing()
enableFirstPartyIsolation()
disableEvilCookies()
disableReferrers()
enableTrackingProtection()
enableResistFingerprinting()
disableDigitalRestrictionsManagement()
disableHyperlinkAuditing();
enableFirstPartyIsolation();
disableEvilCookies();
disableReferrers();
enableTrackingProtection();
enableResistFingerprinting();
disableDigitalRestrictionsManagement();
}
setAllPrivacy()
setAllPrivacy();
function ResetPeerConnection(){
browser.privacy.network.peerConnectionEnabled.set({value: false});
browser.privacy.network.networkPredictionEnabled.set({value: false});
browser.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
console.log("Re-disabled WebRTC")
function ResetPeerConnection() {
var webrtc = false;
var rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(AssurePeerConnection);
}
function EnablePeerConnection(){
browser.privacy.network.peerConnectionEnabled.set({value: true});
browser.privacy.network.networkPredictionEnabled.set({value: false});
browser.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
console.log("Enabled WebRTC")
function EnablePeerConnection() {
var webrtc = false;
var rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(SetupPeerConnection);
console.log("Enabled WebRTC");
}
ResetPeerConnection()
function ResetDisableSavePasswords(){
browser.privacy.services.passwordSavingEnabled.set({value: false});
console.log("Re-disabled saved passwords")
function SetupPeerConnection() {
var webrtc = true;
console.log("Pre-disabled WebRTC");
let rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(AssurePeerConnection);
}
function EnableSavePasswords(){
browser.privacy.services.passwordSavingEnabled.set({value: true});
console.log("Enabled saved passwords")
function AssurePeerConnection() {
function assure(webrtc) {
browser.privacy.network.peerConnectionEnabled.set({
value: webrtc.value
});
browser.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "proxy_only"
});
}
rtc = browser.privacy.network.peerConnectionEnabled.get({});
rtc.then(assure);
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
browser.tabs.onCreated.addListener(ResetPeerConnection);
} else {
browser.windows.onCreated.addListener(ResetPeerConnection);
}
});
//AssurePeerConnection();
function ResetDisableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
value: false
});
console.log("Re-disabled saved passwords");
}
function EnableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
value: true
});
console.log("Enabled saved passwords");
}
//ResetDisableSavePasswords()
var defaultSettings = {
since: "forever",
dataTypes: ["history", "downloads", "cache", "cookies", "passwords", "pluginData", "formData", "serviceWorkers"]
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"]
};
var appSettings = {
since: "forever",
dataTypes: [""]
};
function onError(e) {
console.error(e);
function onError(therror) {
console.error(therror);
}
function checkStoredSettings(storedSettings) {
browser.storage.local.set(appSettings);
}
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(checkStoredSettings, onError);
function forgetBrowsingData(storedSettings) {
function getSince(selectedSince) {
if (selectedSince === "forever") {
return 0;
}
const times = {
hour: () => { return 1000 * 60 * 60 },
day: () => { return 1000 * 60 * 60 * 24 },
week: () => { return 1000 * 60 * 60 * 24 * 7}
}
hour: () => 1000 * 60 * 60,
day: () => 1000 * 60 * 60 * 24,
week: () => 1000 * 60 * 60 * 24 * 7
};
const sinceMilliseconds = times[selectedSince].call();
return Date.now() - sinceMilliseconds;
@@ -201,14 +237,160 @@ function forgetBrowsingData(storedSettings) {
let dataTypesString = Object.keys(dataTypes).join(", ");
let sinceString = new Date(since).toLocaleString();
browser.notifications.create({
"type": "basic",
"title": "Removed browsing data",
"message": `Removed ${dataTypesString}\nsince ${sinceString}`
type: "basic",
title: "Removed browsing data",
message: `Removed ${dataTypesString}\n for I2P Browsing`
});
}
browser.browsingData.remove({since}, dataTypes).then(notify);
function deepCleanHistory(historyItems) {
console.log("Deep cleaning history");
for (let item of historyItems) {
if (i2pHost(item.url)) {
browser.history.deleteUrl({
url: item.url
});
browser.browsingData.removeCache({});
console.log("cleared Cache");
browser.browsingData
.removePasswords({
hostnames: [i2pHostName(item.url)],
since
})
.then(onContextGotLog);
console.log("cleared Passwords");
browser.browsingData
.removeDownloads({
hostnames: [i2pHostName(item.url)],
since
})
.then(onContextGotLog);
console.log("cleared Downloads");
browser.browsingData
.removeFormData({
hostnames: [i2pHostName(item.url)],
since
})
.then(onContextGotLog);
console.log("cleared Form Data");
browser.browsingData
.removeLocalStorage({
hostnames: [i2pHostName(item.url)],
since
})
.then(onContextGotLog);
console.log("cleared Local Storage");
setAllPrivacy()
ResetPeerConnection()
let contexts = browser.contextualIdentities.query({
name: titlepref
});
function deepCleanCookies(cookies) {
for (let cookie of cookies) {
var removing = browser.cookies.remove({
firstPartyDomain: cookie.firstPartyDomain,
name: cookie.name,
url: item.url
});
removing.then(onContextGotLog, onError);
}
console.log("Cleared cookies");
}
function deepCleanContext(cookieStoreIds) {
for (let cookieStoreId of cookieStoreIds) {
var removing = browser.cookies.getAll({
firstPartyDomain: null,
storeId: cookieStoreId.cookieStoreId
});
removing.then(deepCleanCookies, onError);
}
}
contexts.then(deepCleanContext, onError);
}
}
notify();
}
var searching = browser.history.search({
text: "i2p",
startTime: 0
});
searching.then(deepCleanHistory);
setAllPrivacy();
ResetPeerConnection();
}
function i2pHostName(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
} else {
hostname = url.split("/")[0];
}
return hostname;
}
function i2pHost(url) {
let hostname = i2pHostName(url);
return hostname.endsWith(".i2p");
}
function onContextGotLog(contexts) {
if (contexts !== null) {
for (let context of contexts) {
console.log(context);
}
}
}
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);
}
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");
EnablePeerConnection();
} 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();
}
}

404
proxy.js
View File

@@ -1,67 +1,357 @@
function isFirefox() {
testPlain = navigator.userAgent.indexOf('Firefox') !== -1;
if (testPlain) {
console.log("firefox")
return testPlain
}
return false
}
var titlepref = chrome.i18n.getMessage("titlePreface");
var webpref = chrome.i18n.getMessage("webPreface");
var routerpref = chrome.i18n.getMessage("routerPreface");
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
function isDroid() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "android") {
return true
}
});
}
browser.privacy.network.peerConnectionEnabled.set({
value: false
});
console.log("Preliminarily disabled WebRTC.");
if (isFirefox()) {
browser.privacy.network.peerConnectionEnabled.set({value: false});
}
chrome.privacy.network.networkPredictionEnabled.set({value: false});
chrome.privacy.network.webRTCIPHandlingPolicy.set({value: "disable_non_proxied_udp"});
console.log("Preliminarily disabled WebRTC.")
chrome.privacy.network.networkPredictionEnabled.set({
value: false
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp"
});
function shouldProxyRequest(requestInfo) {
return true; //requestInfo.parentFrameId != -1;
return requestInfo.parentFrameId != -1;
}
var handleContextProxyRequest = async function(requestDetails) {
console.log("(proxy)Searching for proxy by context");
try {
var handleProxyRequest = function(context) {
proxy = {
failoverTimeout: 0,
proxyDns: false
};
if (context == "firefox-default" || context == "firefox-private") {
proxy = null;
return proxy;
}
if (context != undefined) {
if (context.name == titlepref) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
console.log("(proxy)", context.name);
console.log("Using", proxy.type);
console.log("proxy ", proxy.host + ":" + proxy.port);
return proxy;
} else if (context.name == routerpref) {
if (routerHost(requestDetails.url)) {
return proxy;
} else if (!routerHost(requestDetails.url)) {
proxy = {
type: "http",
host: "localhost",
port: "65535"
};
}
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
console.log("(proxy)", context.name);
console.log("Using", proxy.type);
console.log("proxy ", proxy.host + ":" + proxy.port);
return proxy;
} else if (context.name == webpref) {
if (localHost(requestDetails.url)) {
if (!routerHost(requestDetails.url)) {
proxy = {
type: "http",
host: "localhost",
port: "65535"
};
}
}
console.log("(proxy)", context.name);
console.log("Using", proxy.type);
console.log("proxy ", proxy.host + ":" + proxy.port);
return proxy;
}
}
if (!routerHost(requestDetails.url)) {
if (localHost(requestDetails.url)) {
console.log(
"(proxy) non-routerconsole localhost url, will not interfere",
requestDetails.url
);
/*proxy = {
type: "http",
host: "localhost",
port: "65535"
};*/
}
} else if (i2pHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
}
return proxy;
};
var contextGet = async function(tabInfo) {
try {
console.log("(proxy)Tab info from Function", tabInfo);
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
return context;
} catch (error) {
console.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);
}
};
if (requestDetails.tabId > 0) {
console.log("manifest", requestDetails);
if (proxyHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
return proxy;
} else if (i2pHost(requestDetails.url)) {
console.log("(Proxy)I2P URL detected, ");
var tab = tabGet(requestDetails.tabId);
requestDetails.tabId = tab;
var context = tab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
console.log("(proxy)Returning I2P Proxy", proxy);
return proxy;
} else {
var tab = tabGet(requestDetails.tabId);
var context = tab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
console.log("(proxy)Returning I2P Proxy", proxy);
return proxy;
}
/*proxy = {};
console.log("(proxy)Returning unset Proxy", proxy);
return proxy;*/
}
} catch (error) {
console.log("(proxy)Not using I2P Proxy.", error);
}
};
var proxy_scheme = "HTTP";
var proxy_host = "127.0.0.1";
var proxy_port = "4444";
var control_host = "127.0.0.1";
var control_port = "4444";
var disable_history = false;
function SetupSettings() {
console.log("Initialising Settings");
function onSetupError() {
console.log("Settings initialization error");
}
//
function checkSchemeStoredSettings(storedSettings) {
if (storedSettings.proxy_scheme === undefined) {
proxy_scheme = "http";
storedSettings.proxy_scheme = proxy_scheme;
} 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) {
proxy_host = storedSettings.proxy_host;
} else {
proxy_host = "127.0.0.1";
storedSettings.proxy_host = proxy_host;
}
console.log("Initialising Host", storedSettings.proxy_host);
setupProxy();
}
var gettingHostStoredSettings = browser.storage.local.get("proxy_host");
gettingHostStoredSettings.then(checkHostStoredSettings, onSetupError);
//
function checkPortStoredSettings(storedSettings) {
if (storedSettings.proxy_port != undefined) {
proxy_port = storedSettings.proxy_port;
} else {
proxy_port = "4444";
storedSettings.proxy_port = proxy_port;
}
console.log("Initialising Port", storedSettings.proxy_port);
setupProxy();
}
var gettingPortStoredSettings = browser.storage.local.get("proxy_port");
gettingPortStoredSettings.then(checkPortStoredSettings, onSetupError);
//
function checkControlHostStoredSettings(storedSettings) {
if (storedSettings.control_host != undefined) {
control_host = storedSettings.control_host;
} else {
control_host = "127.0.0.1";
storedSettings.control_host = control_host;
}
console.log("Initialising Control Host", storedSettings.control_host);
setupProxy();
}
var gettingControlHostStoredSettings = browser.storage.local.get(
"control_host"
);
gettingControlHostStoredSettings.then(
checkControlHostStoredSettings,
onSetupError
);
//
function checkControlPortStoredSettings(storedSettings) {
if (storedSettings.control_port != undefined) {
let control_port = storedSettings.control_port;
} else {
let new_control_port = "7657";
storedSettings.control_port = new_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) {
disable_history = storedSettings.disable_history;
} else {
disable_history = false;
storedSettings.disable_history = disable_history;
}
console.log(
"Initialising Disabled History",
storedSettings.disable_history
);
setupProxy();
}
var gettingHistoryStoredSettings = browser.storage.local.get(
"disable_history"
);
gettingHistoryStoredSettings.then(checkHistoryStoredSettings, onSetupError);
}
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;
}
function getHost() {
if (proxy_host == undefined) {
proxy_host = "127.0.0.1";
}
return proxy_host;
}
function getPort() {
if (proxy_port == undefined) {
var scheme = getScheme();
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() {
if (control_port == undefined) {
return "7657";
}
return control_port;
}
function setupProxy() {
var controlHost = "127.0.0.1" //getControlHost()
var controlPort = "7951" //getControlPort();
var Host = "127.0.0.1" //getHost()
var Port = "4444" //getPort()
if (isDroid()) {
console.log("Setting up Firefox Android proxy")
function handleProxyRequest(requestInfo) {
if (shouldProxyRequest(requestInfo)) {
console.log(`Proxying: ${requestInfo.url}`);
return {type: "http", host: Host, port: Port};
}
return {type: "http", host: Host, port: Port};
}
browser.proxy.onRequest.addListener(handleProxyRequest, {urls: ["<all_urls>"]});
console.log("i2p settings created for Firefox Android")
}else{
console.log("Setting up Firefox Desktop proxy")
var proxySettings = {
proxyType: "manual",
http: Host+":"+Port,
passthrough: "",
httpProxyAll: true
};
browser.proxy.settings.set({value:proxySettings});
console.log("i2p settings created for Firefox Desktop")
/**/
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");
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
chrome.storage.local.get(function() {
SetupSettings();
update();
setupProxy();
});
} else {
chrome.storage.local.get(function() {
SetupSettings();
update();
setupProxy();
});
}
});
}
if (isFirefox()){
// Theme all currently open windows
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
}
if (isFirefox()) {
setupProxy()
}
browser.storage.onChanged.addListener(updateFromStorage);
SetupSettings();
setupProxy();

BIN
routerconsole.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

425
scrub.js Normal file
View File

@@ -0,0 +1,425 @@
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 localpref = chrome.i18n.getMessage("localPreface");
var contextScrub = async function(requestDetails) {
function onHeaderError() {
console.log("Header scrub error");
}
console.log("(scrub)Scrubbing info from contextualized request");
try {
var headerScrub = function(context) {
var ua = "MYOB/6.66 (AN/ON)";
if (!context) {
console.log("Context not found", context);
} else if (context.name == titlepref) {
if (i2pHost(requestDetails.url)) {
for (var header of requestDetails.requestHeaders) {
if (header.name.toLowerCase() === "user-agent") {
header.value = ua;
console.log("(scrub)User-Agent header modified", header.value);
}
}
}
return {
requestHeaders: requestDetails.requestHeaders
};
} else if (context.name == routerpref) {
if (i2pHost(requestDetails.url)) {
for (var header of requestDetails.requestHeaders) {
if (header.name.toLowerCase() === "user-agent") {
header.value = ua;
console.log("(scrub)User-Agent header modified", header.value);
}
}
}
return {
requestHeaders: requestDetails.requestHeaders
};
}
};
var contextGet = async function(tabInfo) {
try {
console.log("(scrub)Tab info from Function", tabInfo);
let context = await browser.contextualIdentities.get(
tabInfo.cookieStoreId
);
return context;
} catch (error) {
return undefined;
}
};
var tabGet = async function(tabId) {
try {
console.log("(scrub)Tab ID from Request", tabId);
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
return undefined;
}
};
if (requestDetails.tabId > 0) {
var tab = {};
var context = {};
var req = {};
if (i2pHost(requestDetails.url)) {
console.log("(scrub)I2P URL detected, ");
tab = tabGet(requestDetails.tabId);
context = tab.then(contextGet, onHeaderError);
req = await context.then(headerScrub, onHeaderError);
console.log("(scrub)Scrubbing I2P Request", req);
return req;
} else if (routerHost(requestDetails.url)) {
tab = tabGet(requestDetails.tabId);
context = tab.then(contextGet, onHeaderError);
req = await context.then(headerScrub, onHeaderError);
console.log("(scrub)Scrubbing non-I2P Request", req);
return req;
}
return req;
}
} catch (error) {
console.log("(scrub)Not scrubbing non-I2P request.", error);
}
};
var contextSetup = async function(requestDetails) {
function onContextError() {
console.log("Context launcher error");
}
console.log("(isolate)Forcing I2P requests into context");
try {
var i2pTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: titlepref
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log("(isolate) I2P context", context[0].cookieStoreId);
console.log("tab context", tabId.cookieStoreId);
function Create() {
function onCreated(tab) {
function closeOldTab() {
if (tabId.id != tab.id) {
console.log("(isolate) Closing un-isolated tab", tabId.id);
console.log("in favor of", tab.id);
console.log("with context", tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
}
closeOldTab(tab);
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var routerTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: routerpref
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log("(isolate) I2P context", context[0].cookieStoreId);
console.log("tab context", tabId.cookieStoreId);
function Create() {
function onCreated(tab) {
function closeOldTab() {
if (tabId.id != tab.id) {
console.log("(isolate) Closing un-isolated tab", tabId.id);
console.log("in favor of", tab.id);
console.log("with context", tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
}
closeOldTab(tab);
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var i2ptunnelTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: tunnelpref
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log("(isolate) I2P context", context[0].cookieStoreId);
console.log("tab context", tabId.cookieStoreId);
function Create() {
function onCreated(tab) {
function closeOldTab() {
if (tabId.id != tab.id) {
console.log("(isolate) Closing un-isolated tab", tabId.id);
console.log("in favor of", tab.id);
console.log("with context", tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
}
closeOldTab(tab);
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var snarkTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: torrentpref
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log("(isolate) I2P context", context[0].cookieStoreId);
console.log("tab context", tabId.cookieStoreId);
function Create() {
function onCreated(tab) {
function closeOldTab() {
if (tabId.id != tab.id) {
console.log("(isolate) Closing un-isolated tab", tabId.id);
console.log("in favor of", tab.id);
console.log("with context", tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
}
closeOldTab(tab);
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var mailTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: mailpref
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log("(isolate) I2P context", context[0].cookieStoreId);
console.log("tab context", tabId.cookieStoreId);
function Create() {
function onCreated(tab) {
function closeOldTab() {
if (tabId.id != tab.id) {
console.log("(isolate) Closing un-isolated tab", tabId.id);
console.log("in favor of", tab.id);
console.log("with context", tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
}
closeOldTab(tab);
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var localTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: localpref
});
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log("(isolate) I2P context", context[0].cookieStoreId);
console.log("tab context", tabId.cookieStoreId);
function Create() {
function onCreated(tab) {
function closeOldTab() {
if (tabId.id != tab.id) {
console.log("(isolate) Closing un-isolated tab", tabId.id);
console.log("in favor of", tab.id);
console.log("with context", tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
}
closeOldTab(tab);
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var anyTabFind = async function(tabId) {
try {
var context = await browser.contextualIdentities.query({
name: webpref
});
console.log("(ISOLATE)", tabId.cookieStoreId);
if (
tabId.cookieStoreId == "firefox-default" ||
tabId.cookieStoreId == "firefox-private"
) {
if (tabId.cookieStoreId != context[0].cookieStoreId) {
console.log("(isolate) I2P context", context[0].cookieStoreId);
console.log("tab context", tabId.cookieStoreId);
function Create() {
function onCreated(tab) {
function closeOldTab() {
if (tabId.id != tab.id) {
console.log("(isolate) Closing un-isolated tab", tabId.id);
console.log("in favor of", tab.id);
console.log("with context", tab.cookieStoreId);
browser.tabs.remove(tabId.id);
}
}
closeOldTab(tab);
}
var created = browser.tabs.create({
active: true,
cookieStoreId: context[0].cookieStoreId,
url: requestDetails.url
});
created.then(onCreated, onContextError);
}
var gettab = browser.tabs.get(tabId.id);
gettab.then(Create, onContextError);
return tabId;
}
}
} catch (error) {
console.log("(isolate)Context Error", error);
}
};
var tabGet = async function(tabId) {
try {
console.log("(isolate)Tab ID from Request", tabId);
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
console.log("(isolate)Tab error", error);
}
};
if (requestDetails == undefined) {
return requestDetails;
}
if (requestDetails.tabId > 0) {
if (proxyHost(requestDetails.url)) {
setcookie = browser.cookies.set({
firstPartyDomain: i2pHostName(requestDetails.url),
url: requestDetails.url,
secure: true
});
setcookie.then(onContextGotLog, onContextError);
return requestDetails;
}
console.log("(isolate)Request Details", requestDetails);
var tab = tabGet(requestDetails.tabId);
if (extensionHost(requestDetails.url)) {
return requestDetails;
}
if (i2pHost(requestDetails.url)) {
var setcookie = browser.cookies.set({
firstPartyDomain: i2pHostName(requestDetails.url),
url: requestDetails.url,
secure: true
});
setcookie.then(onContextGotLog, onContextError);
var i2ptab = tab.then(i2pTabFind, onContextError);
return requestDetails;
}
let localhost = localHost(requestDetails.url);
let routerhost = routerHost(requestDetails.url);
if (!routerhost) {
if (localhost) {
var localtab = tab.then(localTabFind, onContextError);
return requestDetails;
}
}
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 === "routerconsole") {
var routertab = tab.then(routerTabFind, onContextError);
return requestDetails;
}
} else {
return requestDetails;
}
}
} catch (error) {
console.log("(isolate)Not an I2P request, blackholing", error);
}
};
browser.webRequest.onBeforeRequest.addListener(
contextSetup,
{ urls: ["<all_urls>"] },
["blocking"]
);
browser.webRequest.onBeforeSendHeaders.addListener(
contextScrub,
{ urls: ["<all_urls>"] },
["blocking", "requestHeaders"]
);

BIN
smartlander.pdf Normal file

Binary file not shown.

BIN
susimail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@@ -3,41 +3,86 @@
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="home.css"/>
<link rel="stylesheet" href="info.css"/>
</head>
<body>
<div class="panel">
<div class="panel-section panel-section-header">
<div id="text-section-header" class="text-section-header">I2P Assistance</div>
<div class="section-header panel-section panel-section-header">
<div id="text-section-header" class="text-section-header"><h1>The Invisible Internet Browser</h1></div>
</div>
<div class="panel-section-separator"></div>
<div id="i2pbrowser-version"></div>
<div id="i2pbrowser-description">
<p id="description">You are now able to use I2P in this browser.</p>
<p class="beta">It is experimental.</p>
</div>
<div id="readyness">
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
<span id="proxy-check">Proxy is ready.</span>
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
<span id="proxy-check">Proxy is ready.</span>
</div>
</div>
<div class="panel-section-separator"></div>
<div class="browser-info">
<p class="hideIfI2PConsoleOff">
<h3>Controls</h3>
<p id="applicationExplain">These controls are used to tailor your I2P Browsing Experience</p>
<ul>
<a id="clear-browser-data" href="#">
<li class="application">
Clear Browsing Data: <span class="applicationDesc">Use this to erase your browsing data.</span>
</li>
</a>
<li class="application">
<input type="checkbox" id="enable-web-rtc" name="enablewebrtc" value="webrtc">
<label for="enable-web-rtc">Enable WebRTC <strong>with Proxy?</strong></label>
<span class="applicationDesc">WebRTC is disabled by default, but can be enabled by checking this box.</span>
</li>
<li class="application">
<div class="panel-section-separator"></div>
<div class="panel-section-identity">
<div id="identity-list"></div>
</li>
<li class="application">
<input type="checkbox" id="disable-history" name="disablehistory" value="history">
<label for="disable-history">Disable History in I2P Tabs</label>
<span class="applicationDesc">History is automatically cleared when your I2P tabs are closed. If you want to clear history as you go, check this box.</span>
</li>
</ul>
</p>
</p>
</div>
<div class="panel-section-separator"></div>
<div class="application-info">
<p class="hideIfI2PConsoleOff">
<h3>Applications</h3>
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
<ul>
<li class="application"><button id="window-visit-homepage" target="_blank" class="applicationName window-visit-homepage" href="#">
Home Page <span class="applicationDesc">For more information about this extension, go here:</span>
</button></li>
<li class="application"><button id="window-visit-i2ptunnel" target="_blank" class="applicationName">
Hidden Services Manager <span class="applicationDesc">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span>
</button></li>
<li class="application"><button id="window-visit-susimail" target="_blank" class="applicationName">
E-Mail <span class="applicationDesc">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span>
</button></li>
<li class="application"><button id="window-visit-snark" target="_blank" class="applicationName">
BitTorrent <span class="applicationDesc">I2P is capable of anonymous Peer-to-Peer file sharing, to use the built-in bittorrent client go here:</span>
</button></li>
</ul>
</p>
</p>
</div>
</div>
<div id="text-section-helptext">
You are now free to browse the eepWeb!
Your browser is now configured to browse anonymously on the I2P network.
As you browse, your traffic will be routed through other network nodes
to disguise it's origin, both from the server and from the nodes
themselves.
</div>
<div class="panel-section-separator"></div>
<!-- This is where I'll eventually put the tunnel control panel -->
<!-- <a href="#" id="generate-fresh-tunnel> Generate a Fresh Tunnel</a>"-->
<!-- -->
<strong><a href="#" id="clear-browser-data">Clear all browsing data</a></strong><br>
<!--<strong><a href="#" id="temp-enable-webrtc">Temporarily enable WebRTC</a></strong><br>-->
<div class="panel-section-separator"></div>
<a href="http://i2pforum.i2p" id="window-create-forum-panel">Visit the I2P Forums</a><br>
<a href="http://i2p-projekt.i2p/blog" id="window-create-news-panel">Get the latest I2P News</a><br>
<div class="panel-section-separator"></div>
</div>
<script src="context.js"></script>
<script src="privacy.js"></script>
<script src="info.js"></script>
<script src="content.js"></script>
<script src="content.js" crossorigin="anonymous"></script>
<script src="i2pcontrol/i2pcontrol.js"></script>
</body>