370 Commits

Author SHA1 Message Date
idk
8bebe2a920 Extensions run requests in what is effectively their own container for our purposes, and one that's not exactly easy to determine is in use. But when we don't recognize the context and cannot jump out of context into an I2P tab, we basically it's coming from inside an extension(Or firefox-private, but that's sort of a whole other can of worms I need to tackle soon). TL:DR if it has no context, then we'll need to decide in favor of proxying requests to .i2p urls via I2P HTTP Proxy for it. The effect is that we can set the RPC remote for say, a bittorrent client, to the .b32.i2p URL of our BiglyBT xmwebwebui remote, for instance. 2020-12-23 18:17:36 -05:00
idk
fedb2d3707 update changelog 2020-12-21 18:15:41 -05:00
idk
b605ea515f Merge pull request #104 from eyedeekay/spanish
Spanish
2020-12-21 23:13:19 +00:00
idk
a38d18c049 fix #102 2020-12-21 18:11:30 -05:00
idk
a0be345f86 fix 102 2020-12-21 17:47:23 -05:00
idk
e08ce1c71e add a spanish translation. It's probably not very good, as it's the combination of Google Translate and my high school Spanish, but at least it exists and maybe could spark some interest, being a single checkin of a fairly simple nature 2020-12-21 16:07:38 -05:00
idk
f25a29052f emergency fix for proxy urls, exclusion was too broad 2020-12-14 17:19:20 -05:00
idk
13c5042006 Exclude clearnet code hosting sites from scrub checks 2020-12-14 14:47:34 -05:00
idk
01ce1a2f13 fmt 2020-12-14 14:44:46 -05:00
idk
8430e3b952 git commit -am exclude searches on clearnet code hosting services from scrub checks 2020-12-14 14:43:04 -05:00
idk
ac09b72be3 change the url for the MuWire test 2020-12-13 14:07:10 -05:00
idk
d901711c7b Merge branch 'slightly-better-popup' into 'master'
Slightly better popup

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!18
2020-12-13 04:37:06 +00:00
idk
88517a7b52 bail out when the header has already been detected and the pageaction is already set 2020-12-12 23:33:25 -05:00
idk
39eb695522 fmt 2020-12-12 00:08:27 -05:00
idk
009bac364c fmt 2020-12-11 20:49:16 -05:00
idk
9741b21def fmt 2020-12-11 20:48:35 -05:00
idk
df7bc109ed update popup css 2020-12-11 20:47:49 -05:00
idk
8cd9b53be3 update popup css 2020-12-11 20:18:58 -05:00
idk
9db61be253 Merge branch 'do-less' into 'master'
Be less Interruptive in non-essential ways

Closes #29 and #30

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!17
2020-12-12 01:16:18 +00:00
idk
78a1794568 fix sanity check on torrent proxy 2020-12-11 16:30:22 -05:00
idk
aa9805e107 Fix torrent-proxy sanity check 2020-12-11 15:42:28 -05:00
idk
a992553ffb make embedding torrents in pages faster 2020-12-10 10:15:48 -05:00
idk
3a30961cd1 fix btProxy 2020-12-09 21:58:58 -05:00
idk
a6aba7b5f7 fix btProxy 2020-12-09 20:55:57 -05:00
idk
26c4152bf6 fix btProxy 2020-12-09 20:55:04 -05:00
idk
8230fe92a7 uninstall process 2020-12-09 20:53:15 -05:00
idk
6d0cda9e67 get ready to clean up after the extension when it uninstalls 2020-12-09 20:51:08 -05:00
idk
12992c461b get ready to clean up after the extension when it uninstalls 2020-12-09 20:45:49 -05:00
idk
531963c1c0 filter the headers before we search them 2020-12-09 20:13:20 -05:00
idk
8bfb7cdd27 search the headers backward and break on the first one since the non-standard header is usually near the end 2020-12-09 18:20:48 -05:00
idk
40899889a0 correct promise resolution on scripts.js 2020-12-09 17:59:53 -05:00
idk
bc88ca80fd re-enable tab-to-tab isolation 2020-12-09 17:53:31 -05:00
idk
3b3744ffff Cheat at excluding MuWire from ! 2020-12-09 17:49:36 -05:00
idk
9cd6ce888e Try and bail out of all proxy-setting in the Wire Web App 2020-12-09 17:09:54 -05:00
idk
7b2216a12f Nix timed x-i2p-torrentlocation stuff entirely 2020-12-09 16:43:08 -05:00
idk
1946669b82 pre-filter URL's for so we don't try to run isolator checks on domains that have no chance of needing isolation 2020-12-09 14:36:59 -05:00
idk
bb14021bc0 make it so we only launch containers out of firefox-default, rather than re-checking every single request 2020-12-09 14:19:59 -05:00
idk
51510abaed Merge branch 'torrent-3' into 'master'
Torrent 3

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!16
2020-12-06 18:35:18 +00:00
idk
f837eb18d5 Make it so clicking the pageaction also triggers the torrent check as a manual approach 2020-12-06 13:32:43 -05:00
idk
bf4b160dcd fmt 2020-12-06 13:01:02 -05:00
idk
7bd08ab6e0 Check whether it's a torrent-enabled site much more often. It's still not quite right but it's much better now. Update priorities when it comes as a header instead of as a meta tag 2020-12-06 13:00:11 -05:00
idk
647c0523e8 Merge branch 'torrent-3' into 'master'
Retain much tighter control of x-i2p-torrentlocation priorities

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!15
2020-12-06 17:13:52 +00:00
idk
58b874d17f Merge branch 'fix-the-search-thing' into 'master'
Fix the search thing

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!14
2020-12-06 17:11:22 +00:00
idk
969d2769fd Merge branch 'irc-integration' into 'master'
Irc integration

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!13
2020-12-06 17:07:47 +00:00
idk
d88d6b2f61 Merge branch 'bookmarks-one-time' into 'master'
Bookmarks one time

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!12
2020-12-06 17:07:04 +00:00
idk
b420dc0a28 Merge branch 'master' into 'bookmarks-one-time'
# Conflicts:
#   bookmarks.js
#   options/options.js
#   proxy.js
2020-12-06 17:06:47 +00:00
idk
0489a2774f Merge branch 'i2pbote' into 'master'
add a bote context, and when there are no more I2P browsing tabs, delete and...

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!11
2020-12-06 17:04:33 +00:00
idk
49f394acca resolve merge conflicts in proxy.js 2020-12-06 12:01:27 -05:00
idk
dd788b15ca Merge branch 'dispatch' into 'master'
Dispatch

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!10
2020-12-06 16:45:35 +00:00
idk
84981fa801 fmt 2020-12-06 11:39:50 -05:00
idk
d328dd1ca0 use an onerror event to set the fallback http url for alt torrents 2020-12-06 11:39:14 -05:00
idk
590f2c7cd8 use an onerror event to set the fallback http url for alt torrents 2020-12-06 02:31:36 -05:00
idk
e93ad94c89 Don't preload resources if we think they could be torrents 2020-12-06 02:12:01 -05:00
idk
203decf121 fix the search thing 2020-12-05 23:53:24 -05:00
idk
5ab871b51f fix the search thing 2020-12-05 23:43:37 -05:00
idk
858d03fa2b fix the search thing 2020-12-05 22:06:15 -05:00
idk
374ce51eff fmt 2020-12-03 13:17:06 -05:00
idk
cd3dafe9c8 fmt 2020-12-03 12:20:43 -05:00
idk
8c256241cb only create bookmarks on the initial run, provide option to re-create them in preferences menu 2020-12-03 12:19:58 -05:00
idk
18cc8eb962 add a bote context, and when there are no more I2P browsing tabs, delete and recreate the context to assure privacy 2020-12-01 18:07:25 -05:00
idk
f1fd2f6fb6 Fix a bug I just created 2020-11-11 01:44:09 -05:00
idk
691dff77a0 fmt 2020-11-10 22:57:33 -05:00
idk
0910986d52 add a tab layer of granularity to isolator 2020-11-10 22:56:27 -05:00
idk
8d4e38ccdf Merge branch 'dispatch' into 'master'
disable proxy on requests to self for dispatch

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!9
2020-11-11 03:03:56 +00:00
idk
e67c266ce0 disable proxy on requests to self for dispatch 2020-11-10 22:02:17 -05:00
idk
9c12df60d2 Merge branch 'dispatch' into 'master'
Dispatch

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!8
2020-11-11 02:58:10 +00:00
idk
5fb224fdfa add a prettier target 2020-11-10 21:48:08 -05:00
idk
9a0daa480d add container tab for dispatch IRC 2020-11-10 21:42:52 -05:00
idk
b041f7f8c7 add container tab for dispatch IRC 2020-11-10 21:41:13 -05:00
idk
42cb2aae64 add container tab for dispatch IRC 2020-11-10 21:04:49 -05:00
idk
449e3dbee6 add container tab for dispatch IRC 2020-11-10 20:59:25 -05:00
idk
422bfa6c18 add container tab for dispatch IRC 2020-11-10 20:59:04 -05:00
idk
f1909ec923 update release 2020-11-07 22:23:45 -05:00
idk
a3bb8a6fe9 update pages 2020-11-07 21:44:07 -05:00
idk
3596a7e6fd Merge branch 'styles' into 'master'
Styles

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

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

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

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

Closes #1

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!1
2020-09-25 03:25:03 +00:00
idk
4012bdea45 Update and release 2020-09-24 20:21:16 -04:00
idk
6d6dce88dd Update and release 2020-09-24 20:20:26 -04:00
idk
0ba0aafa7c Update and release 2020-09-24 20:19:10 -04:00
idk
87f9df4af7 update for i2p-location 2020-09-24 20:06:33 -04:00
idk
09de46cadf update for i2p-location 2020-09-24 20:06:24 -04:00
idk
a2be795853 TODO 2020-09-22 01:53:43 -04:00
idk
cf91b77e8d one last theme tweak 2020-09-22 01:51:55 -04:00
idk
a37387fa89 use meta tags too 2020-09-22 01:43:49 -04:00
idk
658f162193 use meta tags too 2020-09-22 01:42:02 -04:00
idk
1e71e8bdce Play nicer with user-supplied themes 2020-09-22 00:59:38 -04:00
idk
53b9732cae Switch to a dark theme 2020-09-21 17:18:53 -04:00
idk
c89bfa8f1e Refresh every tab when the extension is ready to force proper contextual identity 2020-09-21 13:44:26 -04:00
idk
cf7d137d00 fix xhr redirect thing when a router console page is passed to firefox as an argument at startup 2020-09-21 00:20:59 -04:00
idk
bc1ef95a16 fix xhr redirect thing when a router console page is passed to firefox as an argument at startup 2020-09-21 00:20:44 -04:00
idk
342ead307d working implementation of *header-based* x-i2p-location header, meta tag based to follow 2020-09-15 23:32:54 -04:00
idk
2bc6e9dfc2 working implementation of *header-based* x-i2p-location header, meta tag based to follow 2020-09-15 23:31:06 -04:00
idk
7219667fdb more work on alt headers and styles 2020-09-15 20:36:19 -04:00
idk
abc1882004 more work on alt headers and styles 2020-09-15 20:34:58 -04:00
idk
0d0656bcc0 more work on alt headers and styles 2020-09-15 20:21:19 -04:00
idk
bbda71c8b5 more work on alt headers and styles 2020-09-15 20:10:34 -04:00
idk
6eb6afab81 Fix up x-i2p-location 2020-09-15 19:01:05 -04:00
idk
a677552690 Switch some stuff about themes around, correct conditional for new redirector thing 2020-09-15 18:39:34 -04:00
idk
7758822256 update toopie.html 2020-09-09 23:23:02 -04:00
idk
4296fcb132 also do the torrent thing, since it actually happens in the same place and is actually really similar 2020-08-23 00:58:30 -04:00
idk
a7746d867b add first 1/4 of i2p-location header, this is the part that uses an actual header and not a meta head tag 2020-08-23 00:22:31 -04:00
idk
ea333b3cec used a standard order for apptabs 2020-07-08 17:57:41 -04:00
idk
b9ac5a5072 used a standard order for apptabs when they get pinned 2020-07-08 17:53:21 -04:00
idk
1401726f54 Merge pull request #100 from eyedeekay/bookmarks
make the bookmarks part of a subdirectory
2020-06-23 03:21:35 +00:00
idk
11c03fb2aa switch to local web-ext-submit extension 2020-06-22 23:18:58 -04:00
idk
b4d1108e9c switch to fixjssstyle 2020-06-22 21:49:14 -04:00
idk
a6b7f29bbd deprecate webrtc control 2020-06-22 21:27:22 -04:00
idk
1eb293d754 fix changelog directory 2020-06-22 21:15:34 -04:00
idk
f3a61d2619 make the bookmarks part of a subdirectory 2020-06-22 21:13:00 -04:00
idk
0b1aa5941b Merge pull request #94 from eyedeekay/emergency
update changelog
2020-04-01 01:28:52 +00:00
idk
ad5882501d update changelog 2020-03-24 19:46:37 -04:00
idk
e014619881 Merge pull request #93 from eyedeekay/sed
Sed
2020-03-24 23:05:08 +00:00
idk
677c5c6a68 update changelog 2020-03-24 19:03:26 -04:00
idk
a3217e2bcf Merge branch 'master' of github.com:eyedeekay/I2P-in-Private-Browsing-Mode-Firefox into sed 2020-03-24 18:54:38 -04:00
idk
4ab7069015 fmt && 2020-03-24 18:53:27 -04:00
idk
3a13270479 use includes instead of contains, take the oppourtunity to fix release-time version string 2020-03-24 18:51:47 -04:00
idk
a8eb2b90a2 Merge pull request #89 from eyedeekay/dzf
Dzf
2020-03-24 04:22:27 +00:00
idk
e54754a83a update for release 2020-03-24 00:21:07 -04:00
idk
7f3b6c7359 Fix bug with i2p+ console isolation for danrobi, which also requires creating a contextual identity for MuWire which makes this a pretty good commit to write a blog post about 2020-03-23 18:02:23 -04:00
idk
50ff84111d branch for +fix 2020-03-22 16:08:21 -04:00
idk
984643e1b2 branch for +fix 2020-03-22 16:07:03 -04:00
idk
917fd00771 start cert2 2020-03-18 00:55:13 -04:00
idk
97ee549d40 Add torrent 2020-03-18 00:30:01 -04:00
idk
e0232fa3bc Merge pull request #87 from eyedeekay/settings
Settings
2020-03-18 04:16:34 +00:00
idk
8d23820c65 Also add a console bookmark 2020-03-18 00:15:46 -04:00
idk
8a6d11594f fix some settings that needed to be better 2020-03-18 00:03:35 -04:00
idk
58dadaefc7 Merge pull request #86 from eyedeekay/gh-pages
Update page
2020-03-18 03:46:19 +00:00
idk
eb92f1b275 add the torrent link 2020-03-17 23:36:17 -04:00
idk
4862b0692f add the torrent link 2020-03-17 23:25:17 -04:00
idk
377ab1d6b1 Merge pull request #85 from eyedeekay/certs
update release
2020-03-18 03:15:50 +00:00
idk
cceeb4b613 update release 2020-03-17 23:14:15 -04:00
idk
f109d66ab7 Merge pull request #84 from eyedeekay/certs
Certs
2020-03-18 02:57:36 +00:00
idk
0a447caa82 fix the torrent 2020-03-17 22:53:41 -04:00
idk
1f7be5c9c3 one apptab per app 2020-03-17 04:42:24 -04:00
idk
cd0d55d06f one last tweak to the debian thing 2020-03-06 00:34:12 -05:00
idk
8c40a01b2f start cert viewer 2020-03-05 23:25:08 -05:00
idk
8e6832cf6c add debian postinst 2020-03-05 18:30:43 -05:00
idk
311b837ef4 add debian postinst 2020-03-05 18:27:21 -05:00
idk
d751622d7c fix scripts and simplify Debian install 2020-03-05 17:35:53 -05:00
idk
6406f70824 fix scripts and simplify Debian install 2020-03-05 17:31:36 -05:00
idk
96ee234a17 Start branch for experimenting with certificate stuff 2020-03-05 14:47:12 -05:00
idk
87c52a0931 fix release 2020-03-02 17:59:16 -05:00
idk
d0136f2c6d fix release 2020-03-02 17:56:46 -05:00
idk
d0f4ff9fbb Merge pull request #82 from eyedeekay/containerizers
Containerizers
2020-03-02 22:54:00 +00:00
idk
2d1ae1fab8 Fix other containerizers 2020-03-02 17:35:49 -05:00
idk
f8d99c8fca Fix other containerizers 2020-03-02 17:34:39 -05:00
idk
aeeedc8d4c Start the pageaction branch 2020-02-26 13:03:09 -05:00
idk
e9e3ce085a pageaction 2020-02-26 13:00:51 -05:00
idk
a192d17e68 Don't exit container tab when leaving for clearnet 2020-02-26 01:57:07 -05:00
idk
62d93a64c0 add torrent basic guide 2020-02-26 00:29:56 -05:00
idk
aad47b03b1 add torrent basic guide 2020-02-25 23:21:42 -05:00
idk
bc8317bd19 add torrent basic guide 2020-02-25 23:03:47 -05:00
idk
1d209c52c8 add torrent basic guide 2020-02-25 23:00:12 -05:00
idk
28901b8e65 add torrent basic guide 2020-02-25 22:58:51 -05:00
idk
2ba386dc53 make releases a little easier 2020-02-25 22:38:55 -05:00
idk
25b1628b7c fix page 2020-02-25 21:41:43 -05:00
idk
f4d7217ce3 Merge branch 'master' of github.com:eyedeekay/I2P-in-Private-Browsing-Mode-Firefox into gh-pages 2020-02-25 21:33:06 -05:00
idk
89f64fa1be update master 2020-02-25 21:32:04 -05:00
idk
0176755b72 fix page 2020-02-25 21:24:45 -05:00
idk
759b7f930e fix page 2020-02-25 21:24:04 -05:00
idk
7a9f347a5c fix page 2020-02-25 21:23:51 -05:00
idk
7f83404453 re-generate index 2020-02-25 21:17:35 -05:00
idk
e194893227 fix screenshot 2020-02-25 21:16:37 -05:00
idk
299e6c5ba3 fix screenshot 2020-02-25 21:15:03 -05:00
idk
0b2a615048 fix debian build 2020-02-25 20:57:24 -05:00
idk
49c4b09804 fix debian build 2020-02-25 20:55:33 -05:00
idk
be7e76524d Remake index 2020-02-25 20:45:37 -05:00
idk
8be88b92a8 Merge pull request #78 from eyedeekay/bittorrent
Bittorrent
2020-02-26 01:43:39 +00:00
idk
b0014a3a1d version bump 2020-02-25 20:41:54 -05:00
idk
4e8b5ffd72 Fix progressbar width 2020-02-25 20:35:31 -05:00
idk
f87cb9808a Fix snark-rpc session config bug 2020-02-25 20:10:50 -05:00
idk
b8f2d9a2c0 Fix snark-rpc session config bug 2020-02-25 20:03:51 -05:00
idk
76048db188 Fix a bittorrent bug 2020-02-25 19:37:43 -05:00
idk
36a87d8005 re-enable serch, by my search engine instead. It's hardcoded for now. 2020-02-25 17:26:01 -05:00
idk
cab085e88b exit router console tabs when leaving the router console 2020-02-25 16:51:39 -05:00
idk
5fbd32e6eb exit router console tabs when leaving the router console 2020-02-25 15:19:15 -05:00
idk
1de2a9e1c6 inform 2020-01-25 22:25:51 -05:00
idk
a706eaa81f tweaks 2020-01-25 02:06:45 -05:00
idk
90783c8e08 Assure defaults in non-presence of essential settings 2020-01-25 01:58:23 -05:00
idk
3926cea990 Assure defaults in non-presence of essential settings 2020-01-25 01:53:53 -05:00
idk
9eb0ed05ca Assure defaults in non-presence of essential settings 2020-01-25 01:52:43 -05:00
idk
b3b1f138ee Assure defaults in non-presence of essential settings 2020-01-25 01:51:38 -05:00
idk
db7448e19c Assure defaults in non-presence of essential settings 2020-01-25 01:48:31 -05:00
idk
ce6caa0ddb Add router console link to menu 2020-01-25 01:31:42 -05:00
idk
23908bae18 Add router console link to menu 2020-01-25 01:29:54 -05:00
idk
9900d72709 Acknowledge transmitter 2020-01-25 01:06:50 -05:00
idk
0bd4c09b02 formatting improvements and cleanups 2020-01-25 00:50:46 -05:00
idk
7ae922c4bc update installers 2020-01-25 00:29:04 -05:00
idk
2526de4b97 this transmission-rpc adaptation is still a little broken, but it'll be ready soon. 2020-01-25 00:06:28 -05:00
idk
8ee34ffd6a Merge pull request #73 from eyedeekay/i2pcontrol
I2pcontrol + [WIP]Settings Fixup
2020-01-23 04:28:59 +00:00
idk
d92954b738 Merge pull request #71 from eyedeekay/indicator
Indicator
2020-01-23 04:28:36 +00:00
idk
c5dfbe617a Merge pull request #70 from eyedeekay/bookmarks
Bookmarks
2020-01-23 04:28:13 +00:00
idk
bcb7830a63 Merge pull request #69 from eyedeekay/search
Search
2020-01-23 04:27:40 +00:00
idk
47760ab1df quiet some errors where appropriate 2020-01-22 21:18:11 -05:00
idk
52da62dcd3 update the links inside the homepage. The plugin hosts it's own official homepage. How's that for distributed. 2020-01-22 20:15:56 -05:00
idk
62cf0bdb1d update the links inside the homepage. The plugin hosts it's own official homepage. How's that for distributed. 2020-01-22 20:13:55 -05:00
idk
21d44755c3 always also check localhost to see if it matches routerconsole too 2020-01-18 04:06:17 -05:00
idk
38d1170d87 make passwords configurable 2020-01-15 00:44:51 -05:00
idk
eb07a7079c make passwords configurable 2020-01-14 23:31:41 -05:00
idk
4f7a226574 add/correct defaults for all options 2020-01-14 21:40:02 -05:00
idk
e8c94b2255 fix merge conflicts so I can show off this development screenshot 2020-01-14 19:47:55 -05:00
idk
c4b320e8f4 fix the extra /div 2020-01-14 19:46:00 -05:00
idk
bd4cd77905 comment out search until a viable one emerges. 2020-01-14 19:36:05 -05:00
idk
5068856c3d fix homepage 2020-01-14 19:24:30 -05:00
idk
5485ec60a1 fix indicator margins 2020-01-14 19:18:10 -05:00
idk
cd6061def5 fix indicator margins 2020-01-14 19:04:58 -05:00
idk
0e1f5921d6 fix sidebar width 2020-01-14 18:43:55 -05:00
idk
518e04a40b make it so that onboarding slides show in one click the first time 2020-01-14 18:18:13 -05:00
idk
87edb2c448 fix inline js in onboarding menu 2020-01-14 18:11:41 -05:00
idk
c17910e501 get ready for torrent menus 2020-01-14 17:46:26 -05:00
idk
2be96865b6 make toopie.html a sidebar instead of a page 2020-01-14 17:11:23 -05:00
idk
ba8e45d878 start bittorent branch 2020-01-14 15:33:21 -05:00
idk
55c800e048 switch to closure-linter 2020-01-14 14:49:48 -05:00
idk
15a0e838b3 null-checks for extension host testing 2020-01-14 10:26:35 -05:00
idk
fdbc208bfe add snark-rpc page to torrent context 2020-01-13 20:12:09 -05:00
idk
6db47ecca0 document the colors I've used so far prep for change 2020-01-13 17:30:16 -05:00
idk
e2326bcadb ditch the unnecessary context 2020-01-13 17:17:18 -05:00
idk
d94074b0ce take way too much time to fix a couple of commas 2020-01-13 17:15:17 -05:00
idk
b412103994 take way too much time to fix a couple of commas 2020-01-13 17:14:08 -05:00
idk
b84de0b10e remove dead commented out code 2020-01-13 15:27:05 -05:00
idk
3b6c164ce5 remove dead commented out code 2020-01-13 15:22:02 -05:00
idk
2831ab9759 tested fixed-up settings 2020-01-13 15:20:32 -05:00
idk
72954ceda6 tidy up some of my settings stuff and expose configurable router console port 2020-01-13 14:48:02 -05:00
idk
923688b914 remake index 2020-01-12 21:03:35 -05:00
idk
79cdeade98 add functioning graceful shutdown/restart buttons to toopie.html 2020-01-12 20:04:39 -05:00
idk
aeda8818e2 replace divs with spans to toopie.html 2020-01-12 18:48:41 -05:00
idk
aea232e56b make it periodically update 2020-01-12 18:35:02 -05:00
idk
8d1a76922c make it accessible from the menu 2020-01-12 18:30:02 -05:00
idk
708c15308d make it accessible from the menu 2020-01-12 18:01:25 -05:00
idk
b70b112c1b upgrade toopie.html 2020-01-12 17:52:37 -05:00
idk
12b5f8e7cc upgrade toopie.html 2020-01-12 17:51:30 -05:00
idk
14fe263e24 start working on toopie.html 2020-01-12 17:10:14 -05:00
idk
e0226b4645 Fix the outputs, add in toopie.html prototype 2020-01-12 17:00:38 -05:00
idk
b1220ca11c Full i2pcontrol library in Javascript woot 2020-01-12 16:02:17 -05:00
idk
5c3c56e415 app links 2020-01-12 01:56:23 -05:00
idk
f07e6d8173 app links 2020-01-12 01:18:26 -05:00
idk
82b9670f28 Localizations are also ready, just a nit 2020-01-12 00:45:44 -05:00
idk
609cc71f32 Throw a search widget on the landing page real quick. 2020-01-12 00:43:36 -05:00
idk
965311627e Improve the proxy readiness indicator 2020-01-11 23:25:01 -05:00
idk
3b2112076b Improve the proxy readiness indicator 2020-01-11 23:14:58 -05:00
idk
5c268f8b3d Fix up the bookmarks some more 2020-01-11 22:36:14 -05:00
idk
50e198ed2c Slight adjustment to the menu 2020-01-11 22:32:25 -05:00
idk
29d4d0b3c8 Heh I'm getting kind of good at this 2020-01-11 22:01:37 -05:00
idk
01695e812a add HTML and CSS to start a search box 2020-01-11 17:14:30 -05:00
idk
d9dd454e8c add HTML and CSS to start a search box 2020-01-11 17:13:53 -05:00
idk
915a86c223 add HTML and CSS to start a search box 2020-01-11 17:12:46 -05:00
idk
a99a7067cb update page 2020-01-07 15:59:16 -05:00
idk
074ff44066 update torrents 2020-01-06 16:44:27 -05:00
idk
e54435f65d add feed to page index 2020-01-06 15:39:27 -05:00
idk
7c48260713 Merge pull request #68 from eyedeekay/gh-pages
Tidy up the rss feed
2020-01-06 17:29:51 +00:00
idk
bcbe8dfd94 Merge branch 'master' of github.com:eyedeekay/I2P-in-Private-Browsing-Mode-Firefox into gh-pages 2020-01-06 12:28:23 -05:00
idk
7a04512440 atom feed for torrents 2020-01-06 12:25:33 -05:00
idk
84d1600c35 change how the release notes are added to github 2020-01-06 12:15:22 -05:00
idk
03e45cb00d Merge pull request #67 from eyedeekay/gh-pages
Update links and torrent
2020-01-06 17:07:20 +00:00
idk
068548089d Merge branch 'master' of github.com:eyedeekay/I2P-in-Private-Browsing-Mode-Firefox into gh-pages 2020-01-06 12:04:40 -05:00
idk
07cdf98970 update torrent 2020-01-06 12:04:20 -05:00
idk
12461b7277 make a link to the amo page 2020-01-06 12:03:38 -05:00
idk
abb006addf Merge pull request #66 from eyedeekay/rssify
Rssify
2020-01-04 23:30:21 +00:00
idk
8b28bd23c1 add magnet links to the rss feeds and put the modified rss feed in the docs release 2020-01-04 18:28:00 -05:00
idk
3d2cd87b92 do a new release and write a new page 2020-01-04 17:34:50 -05:00
idk
2d91e0c009 Version bumps 2020-01-04 16:50:44 -05:00
idk
4e30e1c613 Version bumps 2020-01-04 16:46:19 -05:00
idk
907a9e7d20 Merge pull request #65 from eyedeekay/snowflake
make it leave WebRTC alone by default if it detects that the user als…
2020-01-04 20:57:16 +00:00
idk
ec7655bfa9 make it leave WebRTC alone by default if it detects that the user also has a snowflake plugin installed 2020-01-04 15:55:42 -05:00
idk
a84f29d9f1 Merge pull request #63 from eyedeekay/gh-pages
Add a magnet link
2020-01-04 18:12:58 +00:00
idk
de8eb976db Add a magnet link 2020-01-04 13:09:09 -05:00
idk
24fd8a98c3 add a magnet link 2020-01-04 13:06:32 -05:00
idk
a06b349d5f Merge pull request #62 from eyedeekay/lint2
Lint2
2020-01-04 17:31:41 +00:00
idk
855febc1b4 More tweaks and refinements 2020-01-04 11:47:25 -05:00
idk
e49f7a7daf always use Firefox proxy for firefox-default and firefox-private 2020-01-04 11:20:12 -05:00
idk
2e9ae83daa Down to the last of the linter errors, most of the remainder are false-positives 2020-01-04 10:29:41 -05:00
idk
c222b4ed0b Merge pull request #61 from eyedeekay/lint2
Lint2
2020-01-04 07:45:21 +00:00
idk
493b1e3cfb try something 2020-01-04 02:44:59 -05:00
idk
85aad86268 Merge branch 'master' of github.com:eyedeekay/i2psetproxy.js into lint2 2020-01-04 02:43:13 -05:00
idk
7946b7592f try something 2020-01-04 02:41:44 -05:00
idk
e79b6c7d22 add images to deb, plugin builds so that the homepage is also embedded in the plugin. 2020-01-04 02:35:31 -05:00
idk
461ec921b2 Merge pull request #60 from eyedeekay/languages
Languages
2020-01-03 23:31:23 +00:00
idk
7169018292 re-localizable woot! 2020-01-03 18:26:11 -05:00
idk
3dbce313a0 more language stuff 2020-01-03 18:09:16 -05:00
idk
db6c275321 Revert "localize the menu stuff"
This reverts commit e2b631fafa.
2020-01-03 17:42:46 -05:00
idk
e2b631fafa localize the menu stuff 2020-01-03 17:19:05 -05:00
idk
95ed7cb751 Merge pull request #59 from eyedeekay/gh-pages
Merge readme updates and page changes
2020-01-03 18:16:46 +00:00
idk
e20f0d8552 Merge branch 'master' of github.com:eyedeekay/i2psetproxy.js into gh-pages 2020-01-03 13:14:47 -05:00
idk
8b44325565 Remove pdf's from master and from future source 2020-01-03 13:13:56 -05:00
idk
4f8db01542 remove pdf's from repo store them in a release instead 2020-01-03 13:07:58 -05:00
idk
e245aff6bd update pages and stuff 2020-01-03 13:06:55 -05:00
idk
7501f4c1a5 merge in changes from master 2020-01-03 12:52:58 -05:00
idk
9b02651985 update how the torrents are created 2020-01-03 12:45:17 -05:00
idk
e04db247e8 make debian build more reliable 2020-01-02 23:15:59 -05:00
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
3d0b7db6dc add some explanations to the links on the page 2019-12-25 13:30:43 -05:00
idk
2e8727a309 add some explanations to the links on the page 2019-12-25 13:30:37 -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
69 changed files with 6398 additions and 2120 deletions

View File

@@ -2,15 +2,15 @@ module.exports = {
env: {
browser: true,
es6: true,
webextensions: true
webextensions: true,
},
extends: "eslint:recommended",
globals: {
Atomics: "readonly",
SharedArrayBuffer: "readonly"
SharedArrayBuffer: "readonly",
},
parserOptions: {
ecmaVersion: 2018
ecmaVersion: 2018,
},
rules: {
"accessor-pairs": "error",
@@ -24,8 +24,8 @@ module.exports = {
"error",
{
after: true,
before: true
}
before: true,
},
],
"block-scoped-var": "off",
"block-spacing": "error",
@@ -39,8 +39,8 @@ module.exports = {
"error",
{
after: true,
before: false
}
before: false,
},
],
"comma-style": ["error", "last"],
complexity: "error",
@@ -50,7 +50,7 @@ module.exports = {
curly: "error",
"default-case": "error",
"default-param-last": "error",
"dot-location": "error",
"dot-location": "off",
"dot-notation": "off",
"eol-last": "error",
eqeqeq: "off",
@@ -59,7 +59,7 @@ module.exports = {
"func-names": "off",
"func-style": "off",
"function-call-argument-newline": ["error", "consistent"],
"function-paren-newline": "error",
"function-paren-newline": "off",
"generator-star-spacing": "error",
"global-require": "error",
"guard-for-in": "error",
@@ -77,8 +77,8 @@ module.exports = {
"error",
{
after: true,
before: true
}
before: true,
},
],
"line-comment-position": "error",
"linebreak-style": ["error", "unix"],
@@ -88,7 +88,7 @@ module.exports = {
"max-classes-per-file": "error",
"max-depth": "error",
"max-len": "error",
"max-lines": "error",
"max-lines": "off",
"max-lines-per-function": "off",
"max-nested-callbacks": "error",
"max-params": "error",
@@ -96,7 +96,7 @@ module.exports = {
"max-statements-per-line": "error",
"multiline-comment-style": ["error", "bare-block"],
"multiline-ternary": "error",
"new-cap": "error",
"new-cap": "off",
"new-parens": "error",
"newline-after-var": "off",
"newline-before-return": "off",
@@ -127,7 +127,7 @@ module.exports = {
"no-implied-eval": "error",
"no-import-assign": "error",
"no-inline-comments": "error",
"no-inner-declarations": ["error", "functions"],
"no-inner-declarations": "off",
"no-invalid-this": "error",
"no-iterator": "error",
"no-label-var": "error",
@@ -182,6 +182,7 @@ module.exports = {
"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",
@@ -195,7 +196,7 @@ module.exports = {
"no-whitespace-before-property": "error",
"nonblock-statement-body-position": "error",
"object-curly-newline": "error",
"object-curly-spacing": "error",
"object-curly-spacing": "off",
"object-property-newline": "error",
"object-shorthand": "error",
"one-var": "off",
@@ -246,6 +247,6 @@ module.exports = {
"wrap-iife": "error",
"wrap-regex": "error",
"yield-star-spacing": "error",
yoda: ["error", "never"]
}
yoda: ["error", "never"],
},
};

2
.gitignore vendored
View File

@@ -1,3 +1,5 @@
README.md.asc
node_modules/
web-ext-artifacts
releases.diff
.releases.atom

3
.web-extension-id Normal file
View File

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

94
COLORS.md Normal file
View File

@@ -0,0 +1,94 @@
WIP Style guidelines
--------------------
Colors currently in use from CSS
--------------------------------
home.css:100: color: #41465f;
home.css:10: color: #3b6bbf;
home.css:113: color: #41465f;
home.css:125: color: #41465f;
home.css:139: color: #3b6bbf;
home.css:17: color: #81888f;
home.css:26: color: #495057;
home.css:35: color: #3b6bbf;
home.css:49: color: #495057;
home.css:58: background-color: #f8f8ff;
home.css:66: color: #495057;
search.css:20: background-color: #ddd
search.css:23: background-color: #2196f3;
search.css:24: color: #fff
home.css:135: background: 0 0!important;
home.css:161: background: #dee2e6;
home.css:175: background: #dee2e6;
home.css:188: background: #a48fe1;
home.css:200: background: #dee2e6;
home.css:214: background: #dee2e6;
home.css:228: background: #d9d9d6;
home.css:246: background: #ffc56d;
home.css:260: background: #f7e59a;
home.css:50: background-attachment: fixed;
home.css:51: background-size: 100% 100%;
home.css:57:.background {
home.css:58: background-color: #f8f8ff;
home.css:79: background: #f8f8ff;
home.css:91: background: #f8f8ff;
search.css:20: background-color: #ddd
search.css:23: background-color: #2196f3;
search.css:5: background: #dee2e6;
Colors currently in use from Javascript
---------------------------------------
background.js:172: colors: {
background.js-173- frame: "#FFC56D",
background.js-174- toolbar: "#FFC56D"
background.js-175- }
--
background.js:179: colors: {
background.js-180- frame: "#FFC56D",
background.js-181- toolbar: "#FFC56D"
background.js-182- }
--
background.js:189: colors: {
background.js-190- frame: "#A4C8E1",
background.js-191- toolbar: "#A4C8E1"
background.js-192- }
--
background.js:196: colors: {
background.js-197- frame: "#A4C8E1",
background.js-198- toolbar: "#A4C8E1"
background.js-199- }
--
background.js:206: colors: {
background.js-207- frame: "#D9D9D6",
background.js-208- toolbar: "#D9D9D6"
background.js-209- }
--
background.js:213: colors: {
background.js-214- frame: "#D9D9D6",
background.js-215- toolbar: "#D9D9D6"
background.js-216- }
--
background.js:223: colors: {
background.js-224- frame: "#F7E59A",
background.js-225- toolbar: "#F7E59A"
background.js-226- }
--
background.js:230: colors: {
background.js-231- frame: "#F7E59A",
background.js-232- toolbar: "#F7E59A"
background.js-233- }
--
background.js:240: colors: {
background.js-241- frame: "#A48FE1",
background.js-242- toolbar: "#A48FE1"
background.js-243- }
--
background.js:247: colors: {
background.js-248- frame: "#A48FE1",
background.js-249- toolbar: "#A48FE1"
background.js-250- }

316
Makefile
View File

@@ -1,45 +1,47 @@
PREFIX:=/usr
PREFIX?=/usr
default: zip
PWD=`pwd`
install: uninstall
mkdir -p $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
cp -r ./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}
@echo $(PWD)
cp -v ./* $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/; true
cp -vr ./i2pcontrol $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/i2pcontrol
cp -vr ./torrent $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/torrent
cp -vr ./_locales $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/_locales
cp -vr ./icons $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/icons
cp -vr ./options $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io/options
make link
link:
ln -sf $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2ppb@eyedeekay.github.io
uninstall:
rm -rf $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io \
$(PREFIX)/share/webext/i2psetproxy.js@eyedeekay.github.io \
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
$(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2ppb@eyedeekay.github.io
ls:
ls -lah $(PREFIX)/share/webext/i2ppb@eyedeekay.github.io; \
ls -lah $(PREFIX)/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
clean:
rm -fr ../i2psetproxy.js.zip ../i2p_proxy*.xpi ../i2p*.xpi #../i2psetproxy.js_*.*
clean: rc clean-artifacts
rm -fr ../i2psetproxy.js.zip ../i2p_proxy*.xpi *.torrent #../i2psetproxy.js_*.*
## EVEN RELEASES are AMO RELEASES
## ODD RELEASES are SELFHOSTED RELEASES
MOZ_VERSION=0.52
VERSION=0.53
#VERSION=$(MOZ_VERSION)
#VERSION=1.27
MOZ_VERSION=0.96
VERSION=0.95
## INCREMENT THIS EVERY TIME YOU DO A RELEASE
LAST_VERSION=0.93
YELLOW=F7E59A
ORANGE=FFC56D
@@ -60,28 +62,56 @@ amo-readme:
sed 's|</h2>|</strong>|g' | \
sed 's|<h3>|<strong>|g' | \
sed 's|</h3>|</strong>|g' | \
grep -v '<img' > index.html
grep -v '<img' > amo-index.html
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
MAGNET=`torrent2magnet i2ppb@eyedeekay.github.io.xpi.torrent`
index:
@echo "<!DOCTYPE html>" > index.html
@echo "<html>" >> index.html
@echo "<head>" >> index.html
@echo " <title>I2P in Private Browsing Mode</title>" >> index.html
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"home.css\" />" >> index.html
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"sidebar.css\" />" >> index.html
@echo "</head>" >> index.html
@echo "<body>" >> index.html
sed "s|magnetsub|[Magnet Link]($(MAGNET))|g" README.md | sed 's|README.md|index.html|g' | markdown >> index.html
@echo "</body>" >> index.html
@echo "</html>" >> index.html
torrenthelp:
@echo "<!DOCTYPE html>" > torrent/index.html
@echo "<html>" >> torrent/index.html
@echo "<head>" >> torrent/index.html
@echo " <title>I2P in Private Browsing Mode</title>" >> torrent/index.html
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"../home.css\" />" >> torrent/index.html
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"../sidebar.css\" />" >> torrent/index.html
@echo "</head>" >> torrent/index.html
@echo "<body>" >> torrent/index.html
sed "s|magnetsub|[Magnet Link]($(MAGNET))|g" torrent/README.md | markdown >> torrent/index.html
@echo "</body>" >> torrent/index.html
@echo "</html>" >> torrent/index.html
xpi: getxpi
version:
sed -i 's|7647|7657|g' *.js* */*.js*
sed -i 's|7647|7657|g' *.js* torrent/*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)\",|g' manifest.json
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)\",|g' manifest.json
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
sed -si 's|$(shell grep $(MOZ_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
moz-version:
sed -i 's|7647|7657|g' *.js* */*.js*
sed -i 's|7647|7657|g' *.js* torrent/*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(MOZ_VERSION)\",|g' manifest.json
sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
sed -si 's|$(shell grep $(VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
rhz-version:
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|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*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)1\",|g' manifest.json
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)1-rhizome\",|g' manifest.json
sed -i 's|7657|7647|g' *.js* torrent/*.js*
zip: version
zip --exclude="./i2ppb@eyedeekay.github.io.xpi" \
@@ -92,18 +122,32 @@ zip: version
--exclude="./package-lock.json" \
--exclude="./.node_modules" \
--exclude="./node_modules" \
--exclude="./.git" -r -FS ../i2psetproxy.js.zip *
--exclude="./.git" \
--exclude="*/*.xpi" \
--exclude="web-ext-artifacts" \
--exclude="./*.pdf" -r -FS ../i2psetproxy.js.zip *
release:
cat desc debian/changelog | gothub release -p -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n $(VERSION) -d -
rc:
@grep "$(VERSION)" debian/changelog
@echo "changelog is prepared"
rm -f *.xpi
rtest: rc index torrenthelp
release: rc index torrenthelp
cat desc debian/changelog | grep -B 10 "$(LAST_VERSION)" | gothub release -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n $(VERSION) -d -; true
update-release:
cat desc debian/changelog | grep -B 10 "$(LAST_VERSION)" | gothub edit -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n $(VERSION) -d -; true
delete-release:
gothub delete -u eyedeekay -r i2psetproxy.js -t $(VERSION); true
gothub delete -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION); true
recreate-release: delete-release release upload
upload: upload-xpi upload-deb
full-release: release submit upload-xpi torrent upload-torrent deb upload-deb upload-rss seed
WEB_EXT_API_KEY=AMO_KEY
WEB_EXT_API_SECRET=AMO_SECRET
@@ -114,65 +158,152 @@ WEB_EXT_API_SECRET=AMO_SECRET
tk:
echo $(WEB_EXT_API_KEY)
submit: moz-sign rhz-submit moz-submit
submit: moz-submit moz-sign
clean-artifacts:
rm web-ext-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
$(HOME)/node_modules/web-ext-submit/extender.sh --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET)
make copyss
sleep 5
copyss:
cp web-ext-artifacts/*.xpi ../i2ppb@eyedeekay.github.io.xpi; true
##EVEN NUMBERED, MOZILLA-DISTRIBUTED VERSIONS HERE!
moz-submit: moz-version
@echo "Using the 'submit' target to instantly sign an extension for Mozilla distribution"
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
mv manifest.json .manifest.json
grep -v update_url .manifest.json > manifest.json
web-ext sign --channel listed --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
sleep 5
mv .manifest.json manifest.json
rhz-submit: rhz-version
@echo "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
@echo "Rhizome releases are disabled while browser is completed."
#@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
#@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
#@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
#$HOME/node_modules/web-ext-submit/extender.sh --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET); true
#cp web-ext-artifacts/*.xpi ./i2ppb@eyedeekay.github.io.xpi
getxpi:
gothub download -t $(VERSION) -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -n i2ppb@eyedeekay.github.io.xpi
mv ./i2ppb@eyedeekay.github.io.xpi ../i2ppb-$(VERSION)@eyedeekay.github.io.xpi
cp ../i2ppb-$(VERSION)@eyedeekay.github.io.xpi ../i2ppb@eyedeekay.github.io.xpi
torrent: getxpi
rm -f "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent"
mktorrent -a http://w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa.b32.i2p/a \
-a http://zviyq72xcmjupynn5y2f5qa3u7bxyu34jnqmwt6czte2l7idxm7q.b32.i2p/announce \
-a http://s5ikrdyjwbcgxmqetxb3nyheizftms7euacuub2hic7defkh3xhq.b32.i2p/a \
-a http://uajd4nctepxpac4c4bdyrdw7qvja2a5u3x25otfhkptcjgd53ioq.b32.i2p/announce \
-a http://explodie.org:6969/announce \
-a http://tracker.opentrackr.org:1337/announce \
-a http://tracker.kamigami.org:2710/announce \
-a http://tracker.internetwarriors.net:1337/announce \
-a http://tracker.darli.net:6611/announce \
-a http://tracker.corpscorp.online:80/announce \
-a http://tracker.bz:80/announce \
-a http://tracker.bt4g.com:2095/announce \
-a http://retracker.sevstar.net:2710/announce \
-a http://h4.trakx.nibba.trade:80/announce \
-a http://www.proxmox.com:6969/announce \
-a http://www.loushao.net:8080/announce \
-a http://vps02.net.orel.ru:80/announce \
-a http://tracker4.itzmx.com:2710/announce \
-a http://tracker3.itzmx.com:6961/announce \
-a http://tracker2.itzmx.com:6961/announce \
-a http://tracker1.itzmx.com:8080/announce \
-a http://tracker01.loveapp.com:6789/announce \
-a http://tracker.zerobytes.xyz:1337/announce \
-a http://tracker.yoshi210.com:6969/announce \
-a http://tracker.torrentyorg.pl:80/announce \
-a http://tracker.nyap2p.com:8080/announce \
-a http://tracker.lelux.fi:80/announce \
-a http://tracker.gbitt.info:80/announce \
-a http://pow7.com:80/announce \
-a http://opentracker.i2p.rocks:6969/announce \
-a http://open.acgtracker.com:1096/announce \
-a http://open.acgnxtracker.com:80/announce \
-a http://mail2.zelenaya.net:80/announce \
-a http://acg.rip:6699/announce \
-n "i2ppb-$(VERSION)@eyedeekay.github.io.xpi" \
-o "i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" \
-w https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/$(VERSION)/i2ppb@eyedeekay.github.io.xpi \
../i2ppb@eyedeekay.github.io.xpi; true
cp -v "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" "./i2ppb@eyedeekay.github.io.xpi.torrent"
make index
upload-torrent:
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi.torrent" -f "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent"
upload-xpi:
gothub upload -R -u eyedeekay -r i2psetproxy.js -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "./i2ppb@eyedeekay.github.io.xpi"
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "../i2ppb@eyedeekay.github.io.xpi"
upload-deb:
gothub upload -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"
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.deb" -f "../i2psetproxy.js_$(VERSION)-1_amd64.deb"
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION).orig.tar.gz" -f "../i2psetproxy.js_$(VERSION).orig.tar.gz"
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.debian.tar.xz" -f "../i2psetproxy.js_$(VERSION)-1.debian.tar.xz"
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1.dsc" -f "../i2psetproxy.js_$(VERSION)-1.dsc"
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.changes" -f "../i2psetproxy.js_$(VERSION)-1_amd64.changes"
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psetproxy.js_$(VERSION)-1_amd64.buildinfo" -f "../i2psetproxy.js_$(VERSION)-1_amd64.buildinfo"
fmt:
upload-docs:
gothub release -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Documentation" -d "PDF's and text about the extension"; true
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Landing Page Documentation.pdf" -f ../smartlander.pdf
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Browser Design Documentation.pdf" -f ../browser.pdf
fmt: fmt-css fmt-html fmt-js
fmt-css:
cleancss -O1 all -O2 all --format beautify home.css -o .home.css && mv .home.css home.css
cleancss -O1 all -O2 all --format beautify info.css -o .info.css && mv .info.css info.css
#find . -path ./node_modules -prune -o -name '*.css' -exec cleancss -O1 --format beautify {} \;
find . -path ./node_modules -prune -o -name '*.js*' -exec prettier --write {} \;
cleancss -O1 all -O2 all --format beautify search.css -o .search.css && mv .search.css search.css
cleancss -O1 all -O2 all --format beautify sidebar.css -o .sidebar.css && mv .sidebar.css sidebar.css
cleancss -O1 all -O2 all --format beautify options/options.css -o options/.options.css && mv options/.options.css options/options.css
fmt-html:
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes index.html > .index.html; mv .index.html index.html
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes window.html > .window.html; mv .window.html window.html
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes home.html > .home.html; mv .home.html home.html
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes toopie.html > .toopie.html; mv .toopie.html toopie.html
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes security.html > .security.html; mv .security.html security.html
tidy --as-xhtml --drop-empty-elements no --input-xml --tidy-mark no -indent --indent-spaces 4 -wrap 0 --new-blocklevel-tags article,header,footer --new-inline-tags video,audio,canvas,ruby,rt,rp --break-before-br yes --sort-attributes alpha --vertical-space yes options/options.html > options/.options.html; mv options/.options.html options/options.html
fmt-js:
fixjsstyle *.js
fixjsstyle options/*.js
fixjsstyle torrent/*.js
fixjsstyle i2pcontrol/*.js
fixjsstyle manifest.json
#find . -path ./node_modules -prune -o -name '*.json' -exec fixjsstyle --write {} \;
fmt-prettier:
find . -name '*.js*' -exec $(HOME)/node_modules/.bin/prettier -w {} \;
lint:
eslint --fix *.js
deborig:
gjslint *.js; true
#eslint --color *.js
deborig: version
rm -rf ../i2psetproxy.js-$(VERSION)
cp -r . ../i2psetproxy.js-$(VERSION)
rm -rf *.xpi web-ext-artifacts
mkdir -p ../i2psetproxy.js-$(VERSION)
cp -r ./* ../i2psetproxy.js-$(VERSION)
cd ../i2psetproxy.js-$(VERSION) && \
rm -rf web-ext-artifacts .git node_modules && \
tar \
-cvz \
--exclude=.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 \
.
@@ -182,4 +313,55 @@ deb: deborig
-include mirrors.mk
dat:
wget -c -O dat.js https://bundle.run/dat-js
wget -c -O dat.js https://bundle.run/dat-js
rss: torrent
rm -f releases.diff
mv releases.atom .releases.atom
wget https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases.atom
sed -i "s|<title>$(VERSION)</title>|<title>$(VERSION)</title>\n <enclosure url=\"$(MAGNET)\" type=\"application/x-bittorrent\" />|g" releases.atom
upload-rss: rss
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "releases.atom" -f releases.atom
upload-updatemanifest:
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "updateManifest.json" -f updateManifest.json
webext:
web-ext run -u "about:devtools-toolbox?type=extension&id=i2ppb%40eyedeekay.github.io"
snark-mirror:
http_proxy=http://127.0.0.1:4444 wget -c -O ../i2psnark-rpc.su3 http://stats.i2p/i2p/plugins/i2psnark-rpc.su3
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psnark-rpc.su3" -f ../i2psnark-rpc.su3
http_proxy=http://127.0.0.1:4444 wget -c -O ../i2psnark-rpc-update.su3 http://stats.i2p/i2p/plugins/i2psnark-rpc-update.su3
gothub upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2psnark-rpc-update.su3" -f ../i2psnark-rpc-update.su3
seed:
cp -v "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" "$(HOME)/.i2p/i2psnark"
cp -v "../i2ppb-$(VERSION)@eyedeekay.github.io.xpi" "$(HOME)/.i2p/i2psnark"
wire:
cp -v "./i2ppb-$(VERSION)@eyedeekay.github.io.xpi.torrent" "$(HOME)/i2p/MuWireDownloads/"
cp -v "../i2ppb-$(VERSION)@eyedeekay.github.io.xpi" "$(HOME)/i2p/MuWireDownloads/"
ndtest:
web-ext run -u about:debugging \
-u http://127.0.0.1:7657/home \
-u http://127.0.0.1:7657/i2ptunnel \
-u http://127.0.0.1:7657/i2psnark \
-u http://127.0.0.1:7657/webmail \
-u http://127.0.0.1:7657/MuWire \
-u http://idk.i2p/video.html \
-u http://idk.i2p \
-u http://stats.i2p \
-u https://ramble.pw \
-u https://ramble.pw/f/i2p \
lht-test:
web-ext run -u about:debugging \
-u http://localhost:7657/home \
-u http://localhost:7657/i2ptunnel \
-u http://localhost:7657/i2psnark \
-u http://localhost:7657/webmail \
-u http://localhost:7657/MuWire/ \
-u http://idk.i2p

208
README.md
View File

@@ -1,50 +1,38 @@
i2psetproxy.js
==============
I2P in Private Browsing Mode(Firefox-Only)
==========================================
WebExtension that does extended configuration of a dedicated I2P browser. While
**experimental**, it's capable of enforcing the use of the I2P Proxy without
needing to touch about:config and disables several
fingerprinting/de-anonymization vectors on it's own. It is also the easiest way
to configure an I2P browser on Android without requiring the user to root their
device, although this support may be somewhat spotty in recent versions it it
beginning to improve again. It aims to be as similar to a fully-fledged I2P
Rhizome as possible and borrows some code from I2P Rhizome(Which it is also
compatible with).
This is an webextension which introduces a set of new "Private Browsing" modes
to Firefox-based browsers(Supporting webextensions) that makes it easier to
configure a browser to use I2P securely and adds features for making I2P
applications easier to use. It does this by isolating I2P-specific settings to
Contextual Identities within Firefox, then loading them automatically when the
user requests them. It also adds convenience and management features, like an
embedded I2P console and Bittorrent integration with clients using the
transmission-rpc API.
The Old Version
---------------
New versions of this extension create an I2P in Private Browsing mode instead.
Since this is a drastic change to the behavior of the old plugin, a new entry
for the new plugin has been made at a new location on addons.mozilla.org.
* 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:
Privacy Policy
--------------
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.
This browser extension does not collect any personal information. It requires
access to local storage and browsing data permissions in order to delete them
when directed to by the user. This browser extension does not transmit any
information to any third party, nor will it, ever.
### addons.mozilla.org
This browser extension cannot influence telemetry carried out by browser vendors
to determine performance in their distribution channels, nor can it mitigate any
other browser vendor telemetry.
If you would prefer to recieve automatic updates from AMO, the correct product
page for this plugin is
[I2P 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.
This browser extension is entirely Free, Open-Source software.
Debian usage:
-------------
Installation(Cross-Platform):
-----------------------------
For desktop users this addon is available from addons.mozilla.org, where you
will be able to recive automatic updates:
[I2P in Private Browsing](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/).
Debian Installation:
--------------------
Should you prefer, it is possible to install this extension system-wide by
side-loading it into Debian. You can generate your own deb file by running the
@@ -52,6 +40,44 @@ command:
make deb
and then you can install it with:
sudo apt install ../i2psetproxy.js_*.deb
Bittorrent Download:
--------------------
The self-hosted plugin is available from bittorrent both within the I2P and
Clearnet Bittorrent network(With a web seed to support it in case one goes
dead).
* magnetsub
* [Get the .torrent file](./i2ppb@eyedeekay.github.io.xpi.torrent)
Usage:
------
* Basically, it "Just Works." After you install the plugin, browsing to an I2P
domain will automatically stop the current tab and re-open the I2P site in an
I2P Browser tab.
* Besides that, four bookmarks are added to the "Bookmarks Toolbar," which
will take you to visit your Java I2P applications, or the "Simplified I2P
Landing Page" embedded in the plugin:
* ![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.
* Optionally, you can add I2PSnark-RPC and use Bittorrent-over-I2P via the
transmission-rpc interface. To do this, have a look at the torrent guide:
[Torrent guide](torrent/README.md)
### Features
* [done] **Provide** a way to launch into an I2P-Specific contextual identity
@@ -59,8 +85,10 @@ command:
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)
@@ -68,21 +96,34 @@ command:
them with the proxy enforced.
* [done] **Change** the color of the browser window to indicate that I2P is in
use
* [ready/broken/wip] **Provide** help in a variety sof languages.
* [wip] **Monitor** the health and readiness of the I2P router it is
* ![Visiting i2ptunnel](i2ptunnel.png)
* [ready] **Provide** help in a variety of languages.
* [done] **Monitor** the health and readiness of the I2P router it is
instructed to use. Currently the plugin checks whether the HTTP Proxy is
working by fetching an image from "http://proxy.i2p" and displaying a result.
A work-in-progress binding to i2pcontrol is available in ./i2pcontrol, it is
inert at this time.
* ![Visiting toopie.html](toopie.png)
* [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.
* [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 routerconsole](routerconsole.png)
* [Done] **Handle Torrents** by talking to i2psnark-rpc plugin and then
adding them directly into the Firefox downloads drop-downs, menus, etc. Enable
the use of I2PSnark as a peer-to-peer delivery mechanism for media files.
* ![Visiting i2psnark](i2psnark.png)
* ![Monitoring torrents](transmissionrpc.png)
* ![Distribute your site as a torrent.](x-i2p-torrentlocation.png)
* [Started] **Indicate** the level of authenticity provided by TLS. TLS is
optional on I2P for now, but some sites offer it anyway. TLS support is
experimental and in the works.
* [Started] **Provide** alternate, in-I2P destinations for web sites that want to
mirror their content within I2P.
* [Started] **Enhance** the I2P browsing experience by allowing site developers
distribute some or all of their resources as torrents, allowing the torrents to
be treated effectively as a CDN.
* [barely started] **Isolate** traffic by contextual identity to it's own HTTP
Proxy tunnel, each reflecting it's own pseudonymous identity within I2P. The
contextual identities. For now, the contextual identities used to manage
@@ -98,22 +139,21 @@ command:
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)
### Screenshot
### Video
![Visiting i2p-projekt.i2p](i2psetproxy.js.png)
* ![Video of the plugin in action](i2psetproxy.js.gif)
![Visiting routerconsole](routerconsole.png)
Documents
------------
![Visiting webmail](susimail.png)
![Visiting i2psnark](i2psnark.png)
![Visiting i2ptunnel](i2ptunnel.png)
![Visiting clearweb](clearweb.png)
![Video of the plugin in action](i2psetproxy.js.gif)
* **[Browser Outline](https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Browser.Design.Documentation.pdf)**: This document is an outline of each of
the browser extension's feature panels in presentation form.
* **[Smart Lander Design](https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Landing.Page.Documentation.pdf)**: This is the original outline of
the smart landing page which became the I2P home page within the browser and
the drop-down control panel.
* **[Other extensions](https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/wiki/Other-Extensions)**: and how they work with this one.
Super Extra Important Background Info:
--------------------------------------
@@ -124,16 +164,52 @@ Tor's work on hardening Firefox itself and of particular interest are the
### Links about Project Uplift
* https://wiki.mozilla.org/Security/Tor_Uplift
* https://wiki.mozilla.org/Security/FirstPartyIsolation
* https://wiki.mozilla.org/Security/Fingerprinting
* https://wiki.mozilla.org/Security/Fennec%2BTor_Project
* https://wiki.mozilla.org/Security/Tor_Uplift/Tracking
* [Tor Uplift](https://wiki.mozilla.org/Security/Tor_Uplift) is a project which
brings important features of the Tor Browser to the mainstream of Firefox
users by including patches from Tor Browser Bundle into Firefox where it is
appropriate.
* [First Party Isolation](https://wiki.mozilla.org/Security/FirstPartyIsolation)
is a feature in Firefox and other browsers which keeps information from
leaking across first-party domains.
* [Fingerprinting](https://wiki.mozilla.org/Security/Fingerprinting) is a
technique where a tracker attempts to extract unique information about a user
from a side-channel in order to create an identifier that can be used to
correlate the user across many sites.
* [Fennec](https://wiki.mozilla.org/Security/Fennec%2BTor_Project) is Firefox
for Android and this link has some analysis of the privacy consequences of the
Android platform.
* [Tracking](https://wiki.mozilla.org/Security/Tor_Uplift/Tracking) in Firefox
is surveyed here.
Project uplift seems to have largely been accomplished?
### Links about Project Fusion
* https://wiki.mozilla.org/Security/Fusion
* https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject
* https://blog.torproject.org/tor-heart-firefox
* [Project Fusion](https://wiki.mozilla.org/Security/Fusion) or Firefox using
Onions is a joint Mozilla/Tor effort to create an enhanced Private Browsing
mode for Firefox which uses Tor.
* [Notes](https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject)
from a meeting about Fusion.
* [Tor at the Heart: Firefox](https://blog.torproject.org/tor-heart-firefox) is
a blog about Tor and the relationship they have to Firefox re: TBB, Fusion.
The **Other** Version
---------------------
New versions of this extension create an I2P in Private Browsing mode instead,
using container tabs.
Since this is a drastic change to the behavior of the old plugin, and since there
is no UI a new entry
for the new plugin has been made at a new location on addons.mozilla.org.
* This is the new version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/)
* This is the old version: [[link]](https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/)
Android usage:
--------------
Use the old version, on either an old version of Firefox(pre-68) or by enabling
this custom collection: [Recommended Plugins] https://addons.mozilla.org/en-US/firefox/collections/14614396/I2P-Browser-Fork/

View File

@@ -3,10 +3,142 @@
"message": "I2P In Private Browsing",
"description": "Name of the extension."
},
"toopieName": {
"message": "toopie.html",
"description": "Name of the sidebar."
},
"toopieTLS": {
"message": "Site Properties",
"description": "Name of the security panel."
},
"extensionDescription": {
"message": "Set up a browser to use the i2p http proxy automatically",
"message": "Your browser is now set up to use I2P.",
"description": "Description of the extension."
},
"extensionVersion": {
"message": "0.77",
"description": "Version of the extension."
},
"proxyFailedStatus": {
"message": "Proxy is not ready",
"description": "Proxy failed status."
},
"proxySuccessStatus": {
"message": "Proxy is ready",
"description": "Proxy failed status."
},
"controlHeader": {
"message": "Control",
"description": "Headline for control panel."
},
"controlExplain": {
"message": "These controls are used to tailor your I2P Browsing Experience",
"description": "Introduce the control panel."
},
"clearData": {
"message": "Clear Browsing Data: ",
"description": "Clear Browsing Data menu item."
},
"clearDesc": {
"message": "Use this to erase your I2P browsing data.",
"description": "Clear browsing data action description."
},
"enableWebRTC": {
"message": "Enable WebRTC with proxy?",
"description": "WebRTC checkbox label."
},
"rtcDesc": {
"message": "WebRTC is disabled by default, but you can turn it back on and force it to honor the proxy. If you are a user of the Snowflake browser extension, this option is disabled and WebRTC is turned on by default.",
"description": "WebRTC action description"
},
"disableHistory": {
"message": "Disable History in I2P Tabs?",
"description": "History checkbox label."
},
"histDesc": {
"message": "History is automatically cleared when your I2P tabs are closed. If you want to clear history as you go, check this box.",
"description": "History action description"
},
"applicationHeader": {
"message": "Applications",
"description": "Header for applications section."
},
"applicationExplain": {
"message": "These applications work with I2P directly to provide them with security and privacy.",
"description": "Description for application section."
},
"windowVisitConsole": {
"message": "Router Console: ",
"description": "Router Console label."
},
"routerConsole": {
"message": "The entrypoint for all other I2P applications is the I2P Router Console. To visit it, click here.",
"description": "Description for the router console."
},
"windowVisitHomepage": {
"message": "Home Page: ",
"description": "Home page for the extension label."
},
"abouthome": {
"message": "For more information about this extension, visit this page.",
"description": "Description for the extension button page."
},
"windowVisitHelppage": {
"message": "Help Page: ",
"description": "Help page for the extension label."
},
"help": {
"message": "For more information about this extension, visit this page.",
"description": "Description for the extension button page."
},
"windowVisitI2ptunnel": {
"message": "Hidden Services Manager: ",
"description": "Title for i2ptunnel"
},
"i2ptunnel": {
"message": "I2P has a web-based interface for configuring .i2p services like web sites which you can set up.",
"description": "Description for i2ptunnel"
},
"windowVisitSusimail": {
"message": "E-Mail: ",
"description": "Title for e-mail"
},
"susimail": {
"message": "I2P also bundles a webmail client which can be used to access in-I2P e-mail.",
"description": "Description for e-mail"
},
"windowVisitSnark": {
"message": "Bittorrent: ",
"description": "Title for Bittorrent"
},
"snark": {
"message": "I2P is capable of anonymous Peer-to-Peer file sharing using the built-in bittorrent application.",
"description": "Description for Bittorrent"
},
"windowVisitSources": {
"message": "Extension Source Code: ",
"description": "Title for source code link"
},
"sources": {
"message": "Browse the source code here",
"description": "Description for the Source code link"
},
"windowVisitWebPage": {
"message": "Extension Home Page: ",
"description": "Visit extension homepage on Github"
},
"homepage": {
"message": "More information is available here",
"description": "Find more information"
},
"windowVisitReleases": {
"message": "Extension Releases: ",
"description": "Visit the release page"
},
"releases": {
"message": "Check for new releases here",
"description": "Description for new release page"
},
"titlePreface": {
"message": "I2P Browser",
"description": "Preface for the browser titlebar"
@@ -15,6 +147,10 @@
"message": "I2P Browser (Private)",
"description": "Preface for the browser titlebar"
},
"extensionPreface": {
"message": "I2P Management",
"description": "Preface for the browser titlebar"
},
"webPreface": {
"message": "Web Browser",
"description": "Preface for the browser titlebar"
@@ -23,6 +159,22 @@
"message": "Web Browser (Private)",
"description": "Preface for the browser titlebar"
},
"ircPreface": {
"message": "Dispatch IRC",
"description": "Preface for the browser titlebar"
},
"ircPrefacePrivate": {
"message": "Dispatch IRC (Private)",
"description": "Preface for the browser titlebar"
},
"botePreface": {
"message": "I2P-Bote Mail",
"description": "Preface for the browser titlebar"
},
"botePrefacePrivate": {
"message": "I2P-Bote Mail (Private)",
"description": "Preface for the browser titlebar"
},
"routerPreface": {
"message": "Router Console",
"description": "Preface for the browser titlebar"
@@ -55,6 +207,14 @@
"message": "Hidden Services Manager (Private)",
"description": "Preface for the browser titlebar"
},
"muwirePreface": {
"message": "MuWire",
"description": "Preface for the browser titlebar"
},
"muwirePrefacePrivate": {
"message": "MuWire (Private)",
"description": "Preface for the browser titlebar"
},
"resetMessage": {
"message": "Reset Tunnel",
"description": "Message for the Reset Tunnel button"
@@ -79,9 +239,9 @@
"message": "Visit the I2P Forum to learn more or ask for assistance",
"description": "Help Message"
},
"clearData": {
"message": "Clear all browsing data",
"description": "Help Message"
"proxyHelpText": {
"message": "Configure your I2P proxy here.",
"description": "Help for configuring the options for the Reset Tunnel button"
},
"hostText": {
"message": "Host: ",
@@ -92,7 +252,7 @@
"description": "Port for the HTTP or SOCKS5 Proxy"
},
"controlHelpText": {
"message": "These options will be inert if used with the default i2p HTTP or SOCKS proxy.",
"message": "Configure your router console here.",
"description": "Help for configuring the options for the Reset Tunnel button"
},
"controlHostText": {
@@ -111,6 +271,30 @@
"message": "7657",
"description": "Port for the Router Console"
},
"isBase32": {
"message": "I2P Base32-Formatted Address",
"description": "Message for site info panel base32"
},
"isHostName": {
"message": "I2P Jump Hostname",
"description": "Message for the site info panel hostname"
},
"siteLabel": {
"message": "Address/Site Information:",
"description": "Label for i2p site info"
},
"certLabel": {
"message": "Certificate Information:",
"description": "Label for certificate info"
},
"certAbsent": {
"message": "This site is not using HTTPS. It is still verified cryptographically by I2P.",
"description": "Content for certificate info if absent"
},
"certPresent": {
"message": "This site is using HTTPS. HTTPS over I2P is experimental and requires self-signed certificates or alternate root authorites.",
"description": "Content for certificate info if present"
},
"protocolHandlerValue": {
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent",
"description": "Value for the magnet protocol handler"

302
_locales/es/messages.json Normal file
View File

@@ -0,0 +1,302 @@
{
"extensionName": {
"message": "I2P en navegación privada",
"description": "Nombre de la extensión."
},
"toopieName": {
"message": "toopie.html",
"description": "Nombre de la barra lateral."
},
"toopieTLS": {
"message": "Propiedades del sitio",
"description": "Nombre del panel de seguridad."
},
"extensionDescription": {
"message": "Su navegador ahora está configurado para usar I2P.",
"description": "Descripción de la extensión."
},
"extensionVersion": {
"message": "0,77",
"description": "Versión de la extensión."
},
"proxyFailedStatus": {
"message": "El proxy no está listo",
"description": "Estado fallido del proxy."
},
"proxySuccessStatus": {
"message": "El proxy está listo",
"description": "Estado fallido del proxy."
},
"controlHeader": {
"message": "Control",
"description": "Título del panel de control."
},
"controlExplain": {
"message": "Estos controles se utilizan para personalizar su experiencia de navegación I2P",
"description": "Introduce el panel de control."
},
"clearData": {
"message": "Borrar datos de navegación:",
"description": "Elemento de menú Borrar datos de navegación."
},
"clearDesc": {
"message": "Use esto para borrar sus datos de navegación I2P.",
"description": "Borrar descripción de la acción de datos de navegación."
},
"enableWebRTC": {
"message": "¿Habilitar WebRTC con proxy?",
"description": "Etiqueta de casilla de verificación de WebRTC."
},
"rtcDesc": {
"message": "WebRTC está deshabilitado de forma predeterminada, pero puede volver a encenderlo y forzarlo para que respete el proxy. Si es un usuario de la extensión del navegador Snowflake, esta opción está deshabilitada y WebRTC está activado de forma predeterminada.",
"description": "Descripción de la acción de WebRTC"
},
"disableHistory": {
"message": "¿Deshabilitar el historial en las pestañas I2P?",
"description": "Etiqueta de casilla de verificación del historial."
},
"histDesc": {
"message": "El historial se borra automáticamente cuando se cierran las pestañas de I2P. Si desea borrar el historial sobre la marcha, marque esta casilla.",
"description": "Descripción de la acción del historial"
},
"applicationHeader": {
"message": "Aplicaciones",
"description": "Encabezado de la sección de aplicaciones."
},
"applicationExplain": {
"message": "Estas aplicaciones funcionan con I2P directamente para brindarles seguridad y privacidad.",
"description": "Descripción de la sección de aplicación."
},
"windowVisitConsole": {
"message": "Consola del enrutador:",
"description": "Etiqueta de la consola del enrutador."
},
"routerConsole": {
"message": "El punto de entrada para todas las demás aplicaciones I2P es la consola del enrutador I2P. Para visitarla, haga clic aquí.",
"description": "Descripción de la consola del enrutador."
},
"windowVisitHomepage": {
"message": "Página de inicio:",
"description": "Página de inicio para la etiqueta de extensión."
},
"abouthome": {
"message": "Para obtener más información sobre esta extensión, visite esta página.",
"description": "Descripción de la página del botón de extensión."
},
"windowVisitHelppage": {
"message": "Página de ayuda:",
"description": "Página de ayuda para la etiqueta de extensión."
},
"help": {
"message": "Para obtener más información sobre esta extensión, visite esta página.",
"description": "Descripción de la página del botón de extensión."
},
"windowVisitI2ptunnel": {
"message": "Administrador de servicios ocultos:",
"description": "Título para i2ptunnel"
},
"i2ptunnel": {
"message": "I2P tiene una interfaz basada en web para configurar servicios .i2p como sitios web que puede configurar.",
"description": "Descripción de i2ptunnel"
},
"windowVisitSusimail": {
"message": "Correo electrónico:",
"descripción": "Título del correo electrónico"
},
"susimail": {
"message": "I2P también incluye un cliente de correo web que se puede utilizar para acceder al correo electrónico in-I2P.",
"description": "Descripción para correo electrónico"
},
"windowVisitSnark": {
"message": "Bittorrent:",
"description": "Título para Bittorrent"
},
"snark": {
"message": "I2P es capaz de compartir archivos de igual a igual de forma anónima utilizando la aplicación bittorrent incorporada.",
"description": "Descripción de Bittorrent"
},
"windowVisitSources": {
"message": "Código fuente de extensión:",
"description": "Título del enlace del código fuente"
},
"sources": {
"message": "Examine el código fuente aquí",
"description": "Descripción del enlace del código fuente"
},
"windowVisitWebPage": {
"message": "Página de inicio de la extensión:",
"description": "Visita la página de inicio de la extensión en Github"
},
"homepage": {
"message": "Hay más información disponible aquí",
"description": "Encontrar más información"
},
"windowVisitReleases": {
"message": "Extension Releases:",
"description": "Visite la página de lanzamiento"
},
"releases": {
"message": "Compruebe si hay nuevas versiones aquí",
"description": "Descripción de la nueva página de lanzamiento"
},
"titlePreface": {
"message": "Navegador I2P",
"description": "Prefacio de la barra de título del navegador"
},
"titlePrefacePrivate": {
"message": "Navegador I2P (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"extensionPreface": {
"message": "Gestión I2P",
"description": "Prefacio de la barra de título del navegador"
},
"webPreface": {
"message": "Navegador web",
"description": "Prefacio de la barra de título del navegador"
},
"webPrefacePrivate": {
"message": "Navegador web (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"ircPreface": {
"message": "Envío de IRC",
"description": "Prefacio de la barra de título del navegador"
},
"ircPrefacePrivate": {
"message": "Despacho de IRC (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"botePreface": {
"message": "I2P-Bote Mail",
"description": "Prefacio de la barra de título del navegador"
},
"botePrefacePrivate": {
"message": "I2P-Bote Mail (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"routerPreface": {
"message": "Consola del enrutador",
"description": "Prefacio de la barra de título del navegador"
},
"routerPrefacePrivate": {
"message": "Consola del enrutador (privada)",
"description": "Prefacio de la barra de título del navegador"
},
"torrentPreface": {
"message": "Bittorrent",
"description": "Prefacio de la barra de título del navegador"
},
"torrentPrefacePrivate": {
"message": "Bittorrent (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"mailPreface": {
"message": "Correo web",
"description": "Prefacio de la barra de título del navegador"
},
"mailPrefacePrivate": {
"message": "Correo web (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"i2ptunnelPreface": {
"message": "Administrador de servicios ocultos",
"description": "Prefacio de la barra de título del navegador"
},
"i2ptunnelPrefacePrivate": {
"message": "Administrador de servicios ocultos (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"muwirePreface": {
"message": "MuWire",
"description": "Prefacio de la barra de título del navegador"
},
"muwirePrefacePrivate": {
"message": "MuWire (privado)",
"description": "Prefacio de la barra de título del navegador"
},
"resetMessage": {
"message": "Reset Tunnel",
"description": "Mensaje para el botón Reset Tunnel"
},
"infoTitle": {
"message": "Ayuda I2P",
"description": "Título del menú de ayuda"
},
"infoMessage": {
"message": "¡Ahora puede navegar libremente por eepWeb! Su navegador ahora está configurado para navegar de forma anónima en la red I2P. Mientras navega, su tráfico se enrutará a través de otros nodos de red para disfrazar su origen, tanto desde el servidor de los propios nodos. ",
"description": "Mensaje de ayuda"
},
"helpMessage": {
"message": "Obtén ayuda adicional",
"description": "Mensaje de ayuda"
},
"newsMessage": {
"message": "Visite el blog de I2P para conocer las últimas novedades sobre i2p.",
"description": "Mensaje de ayuda"
},
"forumMessage": {
"message": "Visite el Foro I2P para obtener más información o solicitar ayuda",
"description": "Mensaje de ayuda"
},
"proxyHelpText": {
"message": "Configure aquí su proxy I2P",
"description": "Ayuda para configurar las opciones del botón Reset Tunnel"
},
"hostText": {
"message": "Anfitrión:",
"description": "Host para el proxy HTTP o SOCKS5"
},
"portText": {
"message": "Puerto:",
"description": "Puerto para el proxy HTTP o SOCKS5"
},
"controlHelpText": {
"message": "Configure aquí la consola de su enrutador.",
"description": "Ayuda para configurar las opciones del botón Reset Tunnel"
},
"controlHostText": {
"message": "Host de control:",
"description": "Host para la consola del enrutador"
},
"controlPortText": {
"message": "Puerto de control:",
"description": "Puerto para la consola del enrutador"
},
"controlHostValue": {
"message": "127.0.0.1",
"description": "Host para la consola del enrutador"
},
"controlPortValue": {
"message": "7657",
"description": "Puerto para la consola del enrutador"
},
"isBase32": {
"message": "Dirección con formato I2P Base32",
"description": "Mensaje para el panel de información del sitio base32"
},
"isHostName": {
"message": "Nombre de host de salto I2P",
"description": "Mensaje para el nombre de host del panel de información del sitio"
},
"siteLabel": {
"message": "Dirección / Información del sitio:",
"description": "Etiqueta para la información del sitio i2p"
},
"certLabel": {
"message": "Información del certificado:",
"description": "Etiqueta para la información del certificado"
},
"certAbsent": {
"message": "Este sitio no está usando HTTPS. I2P aún lo verifica criptográficamente.",
"description": "Contenido de la información del certificado si no está"
},
"certPresent": {
"message": "Este sitio utiliza HTTPS. HTTPS sobre I2P es experimental y requiere certificados autofirmados o autorizaciones raíz alternativas.",
"description": "Contenido de la información del certificado si está presente"
},
"protocolHandlerValue": {
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent",
"description": "Valor para el controlador de protocolo magnético"
}
}

BIN
alternate-address.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

View File

@@ -1,89 +1,139 @@
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 titlepref = chrome.i18n.getMessage('titlePreface');
var titleprefpriv = chrome.i18n.getMessage('titlePrefacePrivate');
var webpref = chrome.i18n.getMessage('webPreface');
var webprefpriv = chrome.i18n.getMessage('webPrefacePrivate');
var routerpref = chrome.i18n.getMessage('routerPreface');
var routerprefpriv = chrome.i18n.getMessage('routerPrefacePrivate');
var mailpref = chrome.i18n.getMessage('mailPreface');
var mailprefpriv = chrome.i18n.getMessage('mailPrefacePrivate');
var torrentpref = chrome.i18n.getMessage('torrentPreface');
var torrentprefpriv = chrome.i18n.getMessage('torrentPrefacePrivate');
var tunnelpref = chrome.i18n.getMessage('i2ptunnelPreface');
var tunnelprefpriv = chrome.i18n.getMessage('i2ptunnelPrefacePrivate');
var ircpref = chrome.i18n.getMessage('ircPreface');
var ircprefpriv = chrome.i18n.getMessage('ircPrefacePrivate');
var extensionpref = chrome.i18n.getMessage('extensionPreface');
var muwirepref = chrome.i18n.getMessage('muwirePreface');
var muwireprefpriv = chrome.i18n.getMessage('muwirePrefacePrivate');
var botepref = chrome.i18n.getMessage('botePreface');
function onError(err) {
console.log('(background)', err);
}
function onContextGotLog(contexts) {
if (contexts != null) {
console.log(contexts);
}
}
function onContextsGot(contexts) {
var ids = [];
for (let context of contexts) {
console.log(`Name: ${context.name}`);
console.log(`Name : ${context.name}`);
ids.push(context.name);
}
console.log("Checking new contexts");
console.log('Checking new contexts');
if (ids.indexOf(titlepref) == -1) {
browser.contextualIdentities
.create({
name: titlepref,
color: "orange",
icon: "fingerprint"
color: 'orange',
icon: 'fingerprint',
})
.then(onCreated, onError);
.then(onCreated, onNotCreated);
}
if (ids.indexOf(webpref) == -1) {
browser.contextualIdentities
.create({
name: webpref,
color: "red",
icon: "circle"
color: 'red',
icon: 'circle',
})
.then(onCreated, onError);
.then(onCreated, onNotCreated);
}
if (ids.indexOf(routerpref) == -1) {
browser.contextualIdentities
.create({
name: routerpref,
color: "blue",
icon: "briefcase"
color: 'blue',
icon: 'briefcase',
})
.then(onCreated, onError);
.then(onCreated, onNotCreated);
}
if (ids.indexOf(tunnelpref) == -1) {
browser.contextualIdentities
.create({
name: tunnelpref,
color: "green",
icon: "tree"
color: 'green',
icon: 'tree',
})
.then(onCreated, onError);
.then(onCreated, onNotCreated);
}
if (ids.indexOf(mailpref) == -1) {
browser.contextualIdentities
.create({
name: mailpref,
color: "yellow",
icon: "briefcase"
color: 'yellow',
icon: 'briefcase',
})
.then(onCreated, onError);
.then(onCreated, onNotCreated);
}
if (ids.indexOf(torrentpref) == -1) {
browser.contextualIdentities
.create({
name: torrentpref,
color: "purple",
icon: "chill"
color: 'purple',
icon: 'chill',
})
.then(onCreated, onError);
.then(onCreated, onNotCreated);
}
if (ids.indexOf(ircpref) == -1) {
browser.contextualIdentities
.create({
name: ircpref,
color: 'red',
icon: 'vacation',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(muwirepref) == -1) {
browser.contextualIdentities
.create({
name: muwirepref,
color: 'turquoise',
icon: 'gift',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(botepref) == -1) {
browser.contextualIdentities
.create({
name: botepref,
color: 'blue',
icon: 'fence',
})
.then(onCreated, onNotCreated);
}
}
function onCreated(context) {
console.log(`New identity's ID: ${context.cookieStoreId}.`);
function onContextsError() {
console.log('Error finding contextual identities, is the API enabled?');
}
browser.contextualIdentities.query({}).then(onContextsGot, onError);
function onCreated(context) {
console.log(' ID:', context.cookieStoreId, 'created.');
}
function onNotCreated(context) {
console.log('ID:', context.cookieStoreId, 'not created.');
}
browser.contextualIdentities.query({}).then(onContextsGot, onContextsError);
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
gettingInfo.then((got) => {
if (got.os != 'android') {
browser.windows.onCreated.addListener(themeWindow);
browser.windows.onFocusChanged.addListener(themeWindow);
browser.windows.onRemoved.addListener(themeWindow);
@@ -94,289 +144,342 @@ gettingInfo.then(got => {
function themeWindowByTab(tabId) {
function tabWindow(tab) {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
getwindow = browser.tabs.get(tab.tabId);
var gettingPlatformInfo = browser.runtime.getPlatformInfo();
gettingPlatformInfo.then((got) => {
if (got.os == 'android') {
let getwindow = browser.tabs.get(tab.tabId);
getwindow.then(themeWindow);
} else {
getwindow = browser.windows.get(tab.windowId);
let getwindow = browser.windows.get(tab.windowId);
getwindow.then(themeWindow);
}
});
}
if (typeof tabId === "number") {
tab = browser.tabs.get(tabId);
if (typeof tabId === 'number') {
let tab = browser.tabs.get(tabId);
tab.then(tabWindow);
} else {
tabWindow(tabId);
}
}
function isEmpty(obj) {
if (obj === undefined || obj === null) {
return true;
}
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
return false;
}
}
return true;
}
function themeWindow(window) {
// Check if the window is in private browsing
function onThemeError() {
console.log('theme color set error');
}
function dynamicTheme() {
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#4456B7',
toolbar: '#4456B7',
},
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#4456B7',
toolbar: '#4456B7',
},
});
}
}
function browserTheme() {
console.log('Active in I2P window');
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#363A68',
toolbar: '#363A68',
},
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#363A68',
toolbar: '#363A68',
},
});
}
}
function logTabs(tabInfo) {
function onContextGotTheme(context) {
if (context.name == titlepref) {
console.log("Active in I2P window");
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: "#FFC56D",
toolbar: "#FFC56D"
}
browserTheme();
if (tabInfo[0].url.startsWith('https://')) {
browser.pageAction.setPopup({
tabId: tabInfo[0].id,
popup: 'security.html',
});
//console.log("(background) tabinfo", tabInfo[0].id)
browser.pageAction.show(tabInfo[0].id);
} else {
browser.theme.update(window.id, {
colors: {
frame: "#FFC56D",
toolbar: "#FFC56D"
}
});
//browser.pageAction.hide(tabInfo[0].id);
}
} else if (context.name == routerpref) {
console.log("Active in Router Console window");
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: "#A4C8E1",
toolbar: "#A4C8E1"
}
});
} else {
browser.theme.update(window.id, {
colors: {
frame: "#A4C8E1",
toolbar: "#A4C8E1"
}
});
}
console.log('Active in Router Console window');
dynamicTheme();
} 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"
}
});
}
console.log('Active in Hidden Services Manager window');
dynamicTheme();
} 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"
}
});
}
console.log('Active in Web Mail window');
dynamicTheme();
} 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");
browser.theme.reset(window.id);
console.log('Active in Bittorrent window');
dynamicTheme();
} else if (context.name == botepref) {
console.log('Active in Bote window');
dynamicTheme();
} else if (context.name == ircpref) {
console.log('Active in IRC window');
dynamicTheme();
} else if (context.name == muwirepref) {
console.log('Active in MuWire window');
dynamicTheme();
}
}
if (
tabInfo[0].cookieStoreId != "firefox-default" &&
tabInfo[0].cookieStoreId != "firefox-private"
tabInfo[0].cookieStoreId != 'firefox-default' &&
tabInfo[0].cookieStoreId != 'firefox-private'
) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onContextGotTheme, onError);
.then(onContextGotTheme, onThemeError);
} else {
browser.theme.reset(window.id);
console.log('Not active in I2P window');
function unSetTheme(them) {
console.log('unsetting theme', them);
if (Object.keys(them).length > 0) {
browser.theme.update(window.id, them.originalTheme);
} else {
browser.theme.update(window.id, { colors: null });
}
}
browser.storage.local.get('originalTheme').then(unSetTheme, onError);
}
}
var querying = browser.tabs.query({
currentWindow: true,
active: true
active: true,
});
querying.then(logTabs, onError);
querying.then(logTabs, onThemeError);
}
function setTitle(window) {
// Check if the window is in private browsing
function onContextError() {
console.log('Context Error');
}
function setTitle(title, privtitle) {
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: privtitle + ': ',
});
} else {
browser.windows.update(window.id, {
titlePreface: title + ': ',
});
}
}
function logTabs(tabInfo) {
console.log(tabInfo);
function 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: ""
});
} else {
browser.windows.update(window.id, {
titlePreface: ""
});
}
console.log('Active in I2P window');
setTitle(titlepref, titleprefpriv);
} else if (context.name == muwirepref) {
console.log('Active in MuWire window');
setTitle(muwirepref, muwireprefpriv);
} else if (context.name == routerpref) {
console.log("Active in Router Console window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + routerprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + routerpref + ": "
});
}
console.log('Active in Router Console window');
setTitle(routerpref, routerprefpriv);
} else if (context.name == botepref) {
console.log('Active in Bote window');
setTitle(botepref, boteprefpriv);
} else if (context.name == tunnelpref) {
console.log("Active in Hidden Services Manager window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + tunnelprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + tunnelpref + ": "
});
}
console.log('Active in Hidden Services Manager window');
setTitle(tunnelpref, tunnelprefpriv);
} else if (context.name == mailpref) {
console.log("Active in Web Mail window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + mailprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + mailpref + ": "
});
}
console.log('Active in I2P Web Mail window');
setTitle(mailpref, mailprefpriv);
} else if (context.name == torrentpref) {
console.log("Active in I2P window");
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: titleprefpriv + " - " + torrentprefpriv + ": "
});
} else {
browser.windows.update(window.id, {
titlePreface: titlepref + " - " + torrentpref + ": "
});
}
console.log('Active in I2P Torrent window');
setTitle(torrentpref, torrentprefpriv);
} else if (context.name == ircpref) {
console.log('Active in IRC window');
setTitle(ircpref, ircprefpriv);
}
}
if (
tabInfo[0].cookieStoreId != "firefox-default" &&
tabInfo[0].cookieStoreId != "firefox-private"
tabInfo[0].cookieStoreId != 'firefox-default' &&
tabInfo[0].cookieStoreId != 'firefox-private'
) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onContextGotTitle, onError);
.then(onContextGotTitle, onContextError);
} else if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: '',
});
} else {
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: ""
});
} else {
browser.windows.update(window.id, {
titlePreface: ""
});
}
browser.windows.update(window.id, {
titlePreface: '',
});
}
}
var querying = browser.tabs.query({
currentWindow: true,
active: true
active: true,
});
querying.then(logTabs, onError);
querying.then(logTabs, onContextError);
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
browser.windows.onCreated.addListener(() => {
/* var gettingStoredSettings = chrome.storage.local.get();
gettingStoredSettings.then(setupProxy, onError); */
chrome.storage.local.get(function(got) {
setupProxy();
});
});
var gettingListenerInfo = browser.runtime.getPlatformInfo();
gettingListenerInfo.then((got) => {
function onPlatformError() {
console.log('Error finding platform info');
}
});
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
if (got.os != 'android') {
browser.tabs.onCreated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true
populate: true,
});
getting.then(setTitle, onError);
getting.then(setTitle, onPlatformError);
});
}
});
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
} else {
browser.tabs.onActivated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true
populate: true,
});
getting.then(setTitle, onError);
getting.then(setTitle, onPlatformError);
});
}
});
function handleUpdated(updateInfo) {
if (updateInfo.theme.colors) {
console.log(`Theme was applied: ${updateInfo.theme}`);
} else {
console.log(`Theme was removed`);
function maybeSet(them) {
console.log("original theme found:", them, Object.keys(them).length);
try {
if (
Object.keys(them).length == 0 ||
(them.originalTheme.colors == null &&
them.originalTheme.images == null &&
them.originalTheme.properties == null)
) {
if (updateInfo.theme.colors != null) {
if (
updateInfo.theme.colors.frame != "#4456B7" &&
updateInfo.theme.colors.frame != "#363A68"
) {
function onSet() {
console.log("stored theme:", updateInfo.theme);
}
if (
updateInfo.theme.colors != null &&
updateInfo.theme.images != null &&
updateInfo.theme.properties != null
) {
console.log("storing theme:", updateInfo.theme);
browser.storage.local
.set({ originalTheme: updateInfo.theme })
.then(onSet, onError);
}
}
}
} else {
console.log("keeping stored theme:", them);
}
} catch (e) {
console.log("theme storage error", e);
}
}
browser.storage.local.get("originalTheme").then(maybeSet, onError);
}
browser.theme.onUpdated.addListener(handleUpdated);
function handleClick() {
console.log("Opening page action");
browser.pageAction.openPopup();
}
browser.pageAction.onClicked.addListener(handleClick);
async function certCheck(details) {
if (details.url.startsWith("https")) {
console.log("(cert) https site", details.url);
} else {
return;
}
if (!details.url.includes(".i2p")) {
return;
}
var tabs = await browser.tabs.query({ active: true });
if (tabs == null) {
return;
}
console.log("(cert) checking cert", tabs);
for (tab in tabs) {
if (details.url == tabs[tab].url) {
console.log("(cert) right tab", tabs[tab].id);
try {
let securityInfo = await browser.webRequest.getSecurityInfo(
details.requestId,
{ certificateChain: true }
);
console.log("(cert) state is complete", securityInfo);
console.log("(cert) certificates", securityInfo.certificates);
} catch (error) {
console.error(error);
}
}
}
}
// Listen for onHeaderReceived for the target page.
// Set "blocking" and "responseHeaders".
browser.webRequest.onHeadersReceived.addListener(
certCheck,
{ urls: ["<all_urls>"] },
["blocking", "responseHeaders"]
);
function onClosedWindowCheck() {
var getContext = browser.contextualIdentities.query({ name: titlepref });
function checkTabs(ctx) {
function conditionallyDelete(tabs) {
if (tabs.length == 0) {
browser.contextualIdentities.remove(ctx[0].cookieStoreId);
browser.contextualIdentities
.query({})
.then(onContextsGot, onContextsError);
}
}
var tabs = browser.tabs.query({ cookieStoreId: ctx[0].cookieStoreId });
tabs.then(conditionallyDelete, onError);
}
getContext.then(checkTabs, onError);
}
browser.tabs.onRemoved.addListener(onClosedWindowCheck);
browser.windows.onRemoved.addListener(onClosedWindowCheck);
browser.windows.onCreated.addListener(onClosedWindowCheck);

View File

@@ -1,172 +1,245 @@
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
function bookmarks(bookmarkToolbar) {
console.log("Setting up bookmark toolbar", bookmarkToolbar);
function bookHome(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let host = info.value.http.split(":")[0];
let port = info.value.http.split(":")[1];
if (port == "7644") {
var createBookmark = browser.bookmarks.create({
url: "about:I2p",
title: "I2P Home Page",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createBookmark = browser.bookmarks.create({
url: browser.runtime.getURL("home.html"),
title: "I2P Home Page",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
function bookmarksSetup() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os != 'android') {
function bookmarks(bookmarkToolbar) {
console.log('(bookmarks)', bookmarkToolbar);
console.log('Setting up bookmark toolbar', bookmarkToolbar);
function bookHome(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
let createRhizomeBookmark = browser.bookmarks.create({
url: 'about:I2p',
title: 'I2P Extension Home Page',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
} else {
let createBookmark = browser.bookmarks.create({
url: browser.runtime.getURL('home.html'),
title: 'I2P Extension Home Page',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
}
console.log('(bookmarks) adding home page bookmark');
}
console.log("(bookmarks) 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);
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
var gettingInfo = browser.proxy.settings.get({});
gettingInfo.then(gotProxyInfo);
}
}
function bookTorrent(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let host = info.value.http.split(":")[0];
let port = info.value.http.split(":")[1];
if (port == "7644") {
var createBookmark = browser.bookmarks.create({
url: "http://localhost:7657/i2psnark",
title: "Bittorrent",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createBookmark = browser.bookmarks.create({
url:
"http://" + control_host + ":" + control_port + "/i2psnark",
title: "Bittorrent",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
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);
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
var gettingInfo = browser.proxy.settings.get({});
gettingInfo.then(gotProxyInfo);
}
}
function bookMail(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let host = info.value.http.split(":")[0];
let port = info.value.http.split(":")[1];
if (port == "7644") {
var createBookmark = browser.bookmarks.create({
url: "http://localhost:7657/webmail",
title: "Web Mail",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createBookmark = browser.bookmarks.create({
url: "http://" + control_host + ":" + control_port + "/webmail",
title: "Web Mail",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
function bookConsole(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
let createBookmark = browser.bookmarks.create({
url: 'http://localhost:7657/home',
title: 'I2P Console',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
} else {
let createRhizomeBookmark = browser.bookmarks.create({
url: 'http://' + control_host + ':' + control_port + '/home',
title: 'I2P Console',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
}
}
console.log("(bookmarks) adding webmail bookmark");
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
let gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
var gettingInfo = browser.proxy.settings.get({});
gettingInfo.then(gotProxyInfo);
}
}
function bookI2PTunnel(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let host = info.value.http.split(":")[0];
let port = info.value.http.split(":")[1];
if (port == "7644") {
var createBookmark = browser.bookmarks.create({
url: "http://localhost:7657/i2ptunnelmgr",
title: "Hidden Services Manager",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
} else {
var createBookmark = browser.bookmarks.create({
url:
"http://" +
control_host +
":" +
control_port +
"/i2ptunnelmgr",
title: "Hidden Services Manager",
parentId: bookmarkToolbar[0].id
});
createBookmark.then(onCreated);
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) adding i2ptunnel bookmark");
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
let gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
var gettingInfo = browser.proxy.settings.get({});
gettingInfo.then(gotProxyInfo);
}
function bookI2PTunnel(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
var createBookmark = browser.bookmarks.create({
url: 'http://localhost:7657/i2ptunnel',
title: 'Hidden Services Manager',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
} else {
var createRhizomeBookmark = browser.bookmarks.create({
url:
'http://' +
control_host +
':' +
control_port +
'/i2ptunnel',
title: 'Hidden Services Manager',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
}
console.log('(bookmarks) adding i2ptunnel bookmark');
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
var gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
}
function onRejected(error) {
console.log(`An error : ${error}`);
}
function onCreated(node) {
console.log('Bookmarked', node);
}
var b0 = browser.bookmarks.search({
title: 'I2P Extension Home Page',
});
b0.then(bookHome, onRejected);
var b1 = browser.bookmarks.search({
title: 'Bittorrent',
});
b1.then(bookTorrent, onRejected);
var b2 = browser.bookmarks.search({
title: 'Hidden Services Manager',
});
b2.then(bookI2PTunnel, onRejected);
var b3 = browser.bookmarks.search({
title: 'Web Mail',
});
b3.then(bookMail, onRejected);
var b4 = browser.bookmarks.search({
title: 'I2P Console',
});
b4.then(bookConsole, onRejected);
defaultSettings['bookmarks_state'] = true;
}
var bt = browser.bookmarks.search({
query: 'Toolbar',
});
function toolDir(bookmarkToolbar) {
let defaultSettings = {};
chrome.storage.local.set(defaultSettings);
console.log('(bookmarks) created');
var ibbt = browser.bookmarks.search('I2P Toolbar');
function setupDir(ibbt) {
function onToolbarCreated(node) {
var ibt = browser.bookmarks.search('I2P Toolbar');
ibt.then(bookmarks);
}
if (ibbt[0] == null) {
let createBookmark = browser.bookmarks.create({
title: 'I2P Toolbar',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onToolbarCreated);
}
}
ibbt.then(setupDir);
}
bt.then(toolDir);
function handleCreated(id, bookmarkInfo) {
//var propValue;
for (var propName in bookmarkInfo) {
let propValue = bookmarkInfo[propName];
console.log(propName, propValue);
}
}
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);
browser.bookmarks.onCreated.addListener(handleCreated);
}
});
}
var bt = browser.bookmarks.search({
query: "Toolbar"
});
bt.then(bookmarks);
function handleCreated(id, bookmarkInfo) {
var propValue;
for (var propName in bookmarkInfo) {
propValue = bookmarkInfo[propName];
console.log(propName, propValue);
}
}
browser.bookmarks.onCreated.addListener(handleCreated);
function conditionalBookmarksSetup(obj) {
console.log('(bookmarks) state', obj.bookmarks_state);
if (obj.bookmarks_state == false) {
bookmarksSetup();
}
});
if (obj.bookmarks_state == undefined) {
bookmarksSetup();
}
}
if (browser != null) {
let gettingStorage = browser.storage.local.get('bookmarks_state');
gettingStorage.then(conditionalBookmarksSetup, bookmarksSetup);
}
const bookmarksButton = document.getElementById('bookmarksButton');
if (bookmarksButton != null) {
bookmarksButton.addEventListener('click', bookmarksSetup);
}

52
cert.js Normal file
View File

@@ -0,0 +1,52 @@
function blankContent(id) {
let infoTitle = document.getElementById(id);
if (infoTitle === null) {
console.log('content error', id);
return;
}
infoTitle.textContent = '';
}
function contentUpdateById(id, message) {
let infoTitle = document.getElementById(id);
let messageContent = chrome.i18n.getMessage(message);
if (infoTitle === null) {
console.log('content error', id, messageContent);
return;
}
infoTitle.textContent = messageContent;
}
contentUpdateById('TypeLabel', 'siteLabel');
contentUpdateById('CertLabel', 'certLabel');
function tabCheck(tabInfo) {
// Information Section
console.log('(cert) checking tab');
var host = tabInfo[0].url.split('.i2p')[0] + '.i2p';
if (host.length < 51) {
contentUpdateById('AddressInfo', 'isHostName');
} else {
if (host.endsWith('b32.i2p')) {
contentUpdateById('AddressInfo', 'isBase32');
}
}
if (host.startsWith('https')) {
contentUpdateById('AddressCertInfo', 'certPresent');
console.log('(cert) initiating request to check server cert');
fetch(host).then((response) => {
console.log('Updating cert information', response);
});
} else {
contentUpdateById("AddressCertInfo", "certAbsent");
blankContent("SignedLabel");
}
}
function tabError(error) {
console.log(`Error: ${error}`);
}
const gettingCurrent = browser.tabs.query({ active: true });
gettingCurrent.then(tabCheck, tabError);

18
config.js Normal file
View File

@@ -0,0 +1,18 @@
var proxy_scheme = 'HTTP';
var proxy_host = '127.0.0.1';
var proxy_port = '4444';
var control_host = '127.0.0.1';
var control_port = '7657';
var rpc_host = '127.0.0.1';
var rpc_port = '7657';
var rpc_path = 'jsonrpc';
var rpc_pass = 'itoopie';
var bt_rpc_host = '127.0.0.1';
var bt_rpc_port = '7657';
var bt_rpc_path = 'transmission/rpc';
var bt_rpc_pass = 'transmission';
var disable_history = false;

View File

@@ -1,35 +1,53 @@
var infoTitle = document.getElementById("text-section-header");
infoTitle.textContent = chrome.i18n.getMessage("infoTitle");
/*
var helpMessage = document.getElementById("window-create-forum-panel");
helpMessage.textContent = chrome.i18n.getMessage("forumMessage");
*/
/*
var helpMessage = document.getElementById('window-create-help-panel');
helpMessage.textContent = chrome.i18n.getMessage("helpMessage")
*/
/*
var newsMessage = document.getElementById("window-create-news-panel");
newsMessage.textContent = chrome.i18n.getMessage("newsMessage");
*/
var clearData = document.getElementById("clear-browser-data");
clearData.textContent = chrome.i18n.getMessage("clearData");
/*
document.addEventListener("click", e => {
browser.runtime.sendMessage({ url: "http://proxy.i2p" });
function contentUpdateById(id, message) {
let infoTitle = document.getElementById(id);
let messageContent = chrome.i18n.getMessage(message);
if (infoTitle === null) {
console.log('content error', id, messageContent);
return;
}
infoTitle.textContent = messageContent;
}
// Information Section
contentUpdateById('text-section-header', 'extensionName');
contentUpdateById('description', 'extensionDescription');
contentUpdateById('i2pbrowser-version', 'extensionVersion');
contentUpdateById('proxy-check', 'proxyFailedStatus');
// Control Section
contentUpdateById('controlHeader', 'controlHeader');
contentUpdateById('controlExplain', 'controlExplain');
contentUpdateById('clear-browser-data', 'clearData');
contentUpdateById('clear-desc', 'clearDesc');
contentUpdateById('enable-web-rtc', 'enableWebRTC');
contentUpdateById('rtcDesc', 'rtcDesc');
contentUpdateById('disable-history', 'disableHistory');
contentUpdateById('histDesc', 'histDesc');
// Application Section
contentUpdateById('applicationHeader', 'applicationHeader');
contentUpdateById('applicationExplain', 'applicationExplain');
contentUpdateById('window-visit-index', 'windowVisitHelppage');
contentUpdateById('help', 'help');
contentUpdateById('window-visit-router', 'windowVisitConsole');
contentUpdateById('routerConsole', 'routerConsole');
contentUpdateById('window-visit-homepage', 'windowVisitHomepage');
contentUpdateById('abouthome', 'abouthome');
contentUpdateById('window-visit-i2ptunnel', 'windowVisitI2ptunnel');
contentUpdateById('i2ptunnel', 'i2ptunnel');
contentUpdateById('window-visit-susimail', 'windowVisitSusiMail');
contentUpdateById('susimail', 'susimail');
contentUpdateById('window-visit-snark', 'windowVisitSnark');
contentUpdateById('snark', 'snark');
// Homepage Section
contentUpdateById('window-visit-webpage', 'windowVisitWebPage');
contentUpdateById('webpage', 'help');
contentUpdateById('window-visit-sources', 'windowVisitSources');
contentUpdateById('sources', 'sources');
contentUpdateById('window-visit-releases', 'windowVisitReleases');
contentUpdateById('releases', 'releases');
fetch('http://proxy.i2p').then((myJson) => {
contentUpdateById('proxy-check', 'proxySuccessStatus');
});
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)
}
*/

View File

@@ -1,32 +1,32 @@
//var windowIds = []
var titlepref = chrome.i18n.getMessage("titlePreface");
var titlepref = chrome.i18n.getMessage('titlePreface');
function onError(error) {
console.log(`Error: ${error}`);
console.log(`Error : ${error}`);
}
function eventHandler(event) {
function onCreated(windowInfo) {
console.log(`Created window: ${windowInfo.id}`);
console.log(`Created window : ${windowInfo.id}`);
browser.tabs.create({
windowId: windowInfo.id,
url: "about:blank",
cookieStoreId: event.target.dataset.identity
url: 'about:blank',
cookieStoreId: event.target.dataset.identity,
});
}
if (event.target.dataset.action == "create") {
if (event.target.dataset.action == 'create') {
var creating = browser.tabs.create({
cookieStoreId: event.target.dataset.identity
cookieStoreId: event.target.dataset.identity,
});
creating.then(onCreated, onError);
}
if (event.target.dataset.action == "close-all") {
if (event.target.dataset.action == 'close-all') {
browser.tabs
.query({
cookieStoreId: event.target.dataset.identity
cookieStoreId: event.target.dataset.identity,
})
.then(tabs => {
browser.tabs.remove(tabs.map(i => i.id));
.then((tabs) => {
browser.tabs.remove(tabs.map((rem) => rem.id));
});
}
event.preventDefault();
@@ -34,13 +34,13 @@ function eventHandler(event) {
function createOptions(node, identity) {
for (let option of ["Create", "Close All"]) {
let a = document.createElement("a");
a.href = "#";
a.innerText = option;
a.dataset.action = option.toLowerCase().replace(" ", "-");
a.dataset.identity = identity.cookieStoreId;
a.addEventListener("click", eventHandler);
node.appendChild(a);
let alink = document.createElement("a");
alink.href = "#";
alink.innerText = option;
alink.dataset.action = option.toLowerCase().replace(" ", "-");
alink.dataset.identity = identity.cookieStoreId;
alink.addEventListener("click", eventHandler);
node.appendChild(alink);
}
}
@@ -52,9 +52,9 @@ if (browser.contextualIdentities === undefined) {
} else {
browser.contextualIdentities
.query({
name: titlepref
name: titlepref,
})
.then(identities => {
.then((identities) => {
if (!identities.length) {
div.innerText = "No identities returned from the API.";
return;
@@ -62,7 +62,7 @@ if (browser.contextualIdentities === undefined) {
for (let identity of identities) {
let row = document.createElement("div");
let span = document.createElement("span");
let span = document.createElement("div");
span.className = "identity";
span.innerText = identity.name;
span.style = `color: ${identity.color}`;

160
debian/changelog vendored
View File

@@ -1,10 +1,168 @@
i2psetproxy.js (0.95-1) UNRELEASED; urgency=low
* Fix github #102 and #103
-- idk <hankhill19580@gmail.com> Sat, 21 DEC 2020 6:15:05 -0400
i2psetproxy.js (0.93-1) UNRELEASED; urgency=low
* Emergency fix of the first one
-- idk <hankhill19580@gmail.com> Sat, 14 DEC 2020 5:18:53 -0400
i2psetproxy.js (0.91-1) UNRELEASED; urgency=low
* Exclude clearnet code hosting sites from scrub checks
-- idk <hankhill19580@gmail.com> Sat, 14 DEC 2020 2:46:23 -0400
i2psetproxy.js (0.89-1) UNRELEASED; urgency=low
* Pages with lots of AJAX requests could trigger a performance degradation
* Improve performance of x-i2p-* headers and meta tags
-- idk <hankhill19580@gmail.com> Sat, 13 DEC 2020 2:22:00 -0400
i2psetproxy.js (0.87-1) UNRELEASED; urgency=low
* Disable searching for i2p sites in non-i2p search engines
* Add contexts for i2pbote and Dispatch
* Remain in tighter control of x-i2p-torrentlocation priority
-- idk <hankhill19580@gmail.com> Sat, 10 NOV 2020 1:33:50 -0400
i2psetproxy.js (0.85-1) UNRELEASED; urgency=low
* Fix a bug which was causing i2psnark to fail to isolate.
-- idk <hankhill19580@gmail.com> Sat, 10 NOV 2020 1:33:50 -0400
i2psetproxy.js (0.83-1) UNRELEASED; urgency=low
* Add a tab for I2P-Native Dispatch
-- idk <hankhill19580@gmail.com> Sat, 10 NOV 2020 22:00:01 -0400
i2psetproxy.js (0.81-1) UNRELEASED; urgency=low
* X-I2P-TorrentLocation header
* Visual tweaks
* Deprecate localhost browser container permanently
* Isolation rules improvements
-- idk <hankhill19580@gmail.com> Sat, 07 NOV 2020 21:34:25 -0400
i2psetproxy.js (0.79-1) UNRELEASED; urgency=low
* Pin application tabs to the front of the tab order
* Refine pageaction behavior
-- idk <hankhill19580@gmail.com> Mon, 24 SEP 2020 20:18:03 -0400
i2psetproxy.js (0.77-1) UNRELEASED; urgency=low
* Implement x-i2p-location header
-- idk <hankhill19580@gmail.com> Mon, 24 SEP 2020 20:18:03 -0400
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low
* Update bookmarks format
* Deprecate WebRTC State Management
-- idk <hankhill19580@gmail.com> Mon, 22 JUN 2020 11:22:37 -0400
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low
* Update bookmarks format
-- idk <hankhill19580@gmail.com> Mon, 22 JUN 2020 19:21:23 -0400
i2psetproxy.js (0.71-1) UNRELEASED; urgency=low
* Fix incomplete bugfix from 0.69
-- idk <hankhill19580@gmail.com> Tue, 24 MAR 2020 0:19:59 -0400
i2psetproxy.js (0.71-1) UNRELEASED; urgency=low
* Fix incomplete bugfix from 0.69
-- idk <hankhill19580@gmail.com> Tue, 24 MAR 2020 0:19:59 -0400
i2psetproxy.js (0.69-1) UNRELEASED; urgency=low
* Add MuWire contextual ID
* Fix bug occurring on certain modded I2P installs
-- idk <hankhill19580@gmail.com> Tue, 24 MAR 2020 0:12:02 -0400
i2psetproxy.js (0.67-1) UNRELEASED; urgency=low
* Tweak some default settings that should have gone into 65
-- idk <hankhill19580@gmail.com> Tue, 17 MAR 2020 22:58:55 -0400
i2psetproxy.js (0.65-1) UNRELEASED; urgency=low
* Initial prototype of certs implementation
* Use "pinned apptabs" to minimize the number of tabs occupied by an app
* Get ready for self-hosted updates but with bittorrent because it's cooler
-- idk <hankhill19580@gmail.com> Tue, 17 MAR 2020 22:58:55 -0400
i2psetproxy.js (0.63-1) UNRELEASED; urgency=low
* other containerizers bugfix
-- idk <hankhill19580@gmail.com> Mon, 02 MAR 2020 17:54:26 -0400
i2psetproxy.js (0.61-1) UNRELEASED; urgency=low
* other containerizers bugfix
-- idk <hankhill19580@gmail.com> Mon, 02 MAR 2020 17:46:24 -0400
i2psetproxy.js (0.59-1) UNRELEASED; urgency=low
* transmission-rpc based torrent controls
* bugfixes
-- idk <hankhill19580@gmail.com> Tue, 25 FEB 2020 20:52:19 -0400
i2psetproxy.js (0.57-1) UNRELEASED; urgency=low
* Snowflake compatibility
* Lots of small compatibility fixes
* More linter errors
* Make it multilingual again
* Distribute a torrent and a magnet link with the plugin of the plugin
-- idk <hankhill19580@gmail.com> Thu, 4 JAN 2020 16:43:58 -0400
i2psetproxy.js (0.55-1) UNRELEASED; urgency=low
* Get rid of Web Browsing context launcher
* Fix linter errors
* Tolerate themes
* Tolerate other containerizers
-- idk <hankhill19580@gmail.com> Thu, 2 JAN 2020 16:47:33 -0400
i2psetproxy.js (0.53-1) UNRELEASED; urgency=low
* Quick Fix
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 20:11:30 -0400
i2psetproxy.js (0.51-1) UNRELEASED; urgency=low
* Numerous code cleanups, compatibility fixes
* enable-disable history
* better homepage, better control panel, saner options
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 22:51:11 -0400
-- idk <hankhill19580@gmail.com> Sat, 23 NOV 2019 20:10:30 -0400
i2psetproxy.js (0.49-1) UNRELEASED; urgency=low

6
debian/postinst vendored Normal file
View File

@@ -0,0 +1,6 @@
#! /bin/sh
ln -sf /usr/share/webext/i2ppb@eyedeekay.github.io \
/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/i2ppb@eyedeekay.github.io
touch /usr/share/webext/i2ppb@eyedeekay.github.io/manifest.json

18
debian/rules vendored
View File

@@ -3,19 +3,7 @@
%:
dh $@
export PREFIX=debian/i2psetproxy.js/usr
override_dh_auto_install:
mkdir -p $$(pwd)/debian/i2psetproxy.js/usr/share/webext/i2ppb@eyedeekay.github.io \
$$(pwd)/debian/i2psetproxy.js/usr/share/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}
make install

View File

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

View File

@@ -1,45 +1,116 @@
function routerHost(url) {
// console.log("(urlcheck) HANDLER URL CHECK");
let hostname = '';
let path = '';
function pathcheck(str) {
// console.log("(urlcheck) HANDLER PATH CHECK", str);
if (str != undefined) {
let final = str.split('/')[0];
if (final === 'i2ptunnelmgr' || final === 'i2ptunnel') {
console.log('(urlcheck) Tunnel application path', final);
return 'i2ptunnelmgr';
} else if (
final === 'i2psnark' ||
final === 'torrents' ||
final.startsWith('transmission') ||
final.startsWith('tracker') ||
url.includes(':7662')
) {
console.log('(urlcheck) Torrent application path', final);
return 'i2psnark';
} else if (final === 'webmail' || final === 'susimail') {
console.log('(urlcheck) Mail application path', final);
return 'webmail';
} else if (final.startsWith('MuWire')) {
if (!url.includes('.png')) {
console.log('(urlcheck) MuWire application path', final);
return 'muwire';
}
} else if (final.startsWith('i2pbote')) {
if (!url.includes('.png')) {
console.log('(urlcheck) I2PBote application path', final);
return 'i2pbote';
}
} else if (
final === 'home' ||
final === 'console' ||
final === 'dns' ||
final === 'sitemap' ||
final.startsWith('config')
) {
console.log('(urlcheck) Console application path', final);
return 'routerconsole';
}
}
return true;
}
if (url.indexOf('://') > -1) {
hostname = url.split('/')[2];
let prefix = url.substr(0, url.indexOf('://') + 3);
path = url.replace(prefix + hostname + '/', '');
} else if (identifyProtocolHandler(url)) {
let newurl = identifyProtocolHandler(url);
return routerHost(newurl);
} else {
hostname = url.split('/')[0];
path = url.replace(hostname + '/', '');
}
if (hostname === control_host + ':' + control_port) {
//console.log("(hostcheck) router console found on configured ports");
return pathcheck(path);
}
if (hostname === 'localhost' + ':' + control_port) {
//console.log("(hostcheck) router console found on configured ports");
return pathcheck(path);
}
if (hostname === '127.0.0.1' + ':' + control_port) {
return pathcheck(path);
}
return false;
}
function identifyProtocolHandler(url) {
//console.log("looking for handler-able requests")
if (routerHost(url)) {
if (url.includes(encodeURIComponent("ext+rc:"))) {
return url.replace(encodeURIComponent("ext+rc:"), "");
} else if (url.includes("ext+rc:")) {
return url.replace("ext+rc:", "");
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:")) {
} 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];
let hostname = '';
let prefix = '';
if (url.indexOf('://') > -1) {
prefix = url.substr(0, url.indexOf('://') + 3);
hostname = url.split('/')[2];
} else {
hostname = url.split("/")[0];
hostname = url.split('/')[0];
}
let path = url.replace(prefix + hostname, "");
console.log("(handler) path", prefix + hostname, path);
let path = url.replace(prefix + hostname, '');
console.log('(handler) path', prefix + hostname, path);
return path;
}
var handlerSetup = async function(requestDetails) {
var handlerSetup = function(requestDetails) {
//console.log("checking protocol handler listener")
var rwurl = identifyProtocolHandler(requestDetails.url);
let rwurl = identifyProtocolHandler(requestDetails.url);
if (rwurl != false) {
console.log("(handler) rewrite URL requested", rwurl);
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"]
);
/*
browser.webRequest.onBeforeRequest.addListener(handlerSetup, {
urls: ['<all_urls>'],
});
*/

197
home.css
View File

@@ -1,20 +1,20 @@
* {
padding: 0;
color: #1f1a24;
margin: 0
}
html {
height: 100%
}
a,
button {
color: #3b6bbf;
color: #1f1a24;
text-decoration: none;
background: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
outline: 0;
padding: 3px;
margin: auto
}
.applicationDesc {
color: #81888f;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
@@ -42,20 +42,18 @@ body {
display: flex;
flex-direction: column;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
width: 100%;
height: 100%;
margin: 0 auto;
padding: 0;
color: #495057;
background-attachment: fixed;
background-size: 100% 100%;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.button-list {
min-height: 230px;
min-width: 230px
}
.background {
background-color: #f8f8ff;
height: 100%
}
p {
@@ -63,7 +61,6 @@ p {
font-size: 17px;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
text-decoration: none;
color: #495057;
font-weight: 700;
word-wrap: break-word;
outline: 0
@@ -72,36 +69,31 @@ p {
min-height: 3rem;
padding: 1rem;
margin: 1.5rem;
display: inline-block;
border: 1px solid #d9d9d6;
display: block;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
background: #f8f8ff;
min-width: 95%
min-width: 100%
}
#header,
.application-info,
.extended-info {
.browser-info,
.extended-info,
.search-info {
min-height: 3rem;
padding: 1rem;
margin-top: 1.5rem;
display: inline-block;
border: 1px solid #d9d9d6;
display: block;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
background: #f8f8ff;
min-width: 95%
min-width: 100%
}
h1 {
margin-right: auto;
margin: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 32px;
text-transform: uppercase;
color: #41465f;
border: 1px solid #dee2e6;
border-radius: 2px 2px 0 0;
width: 90%;
padding-left: 5%
color: #e6e6e7;
background: #1f1a24;
width: 100%;
border-radius: 2px 2px 0 0
}
h2,
h3 {
@@ -109,11 +101,10 @@ h3 {
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 25px;
text-transform: uppercase;
color: #41465f;
border: 1px solid #dee2e6;
color: #e6e6e7;
border-radius: 2px 2px 0 0;
width: 90%;
background: #1f1a24;
width: 100%;
padding-left: 5%
}
h4 {
@@ -121,21 +112,17 @@ h4 {
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 20px!important;
text-transform: uppercase;
color: #41465f;
border: 1px solid #dee2e6;
border-radius: 2px 2px 0 0;
width: 90%;
background: #1f1a24;
width: 100%;
padding-left: 5%
}
.showhider {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
text-transform: uppercase;
background: 0 0!important;
border: none;
padding: 0!important;
width: 90%;
color: #3b6bbf;
text-decoration: none;
font-weight: 700;
@@ -152,70 +139,75 @@ h4 {
margin-bottom: 80px
}
ul {
margin-left: 2rem;
list-style: none
margin: auto;
border-radius: 2px;
width: 100%;
margin: 0;
padding: 0
}
li {
min-height: 3rem;
padding: .5rem;
background: #dee2e6;
border: 1px solid #dee2e6;
width: 64%;
min-width: 64%;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc;
margin: .5rem .5rem .5rem 32%
display: block;
text-align: center;
margin: 0;
padding: 0
}
.center {
display: block;
margin-left: auto;
margin-right: auto;
width: 50%
}
#readyness {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
padding-top: 1rem;
padding-bottom: 1rem;
margin: 1rem;
width: 42%;
min-width: 42%;
background: #dee2e6;
text-align: center!important;
border: 1px solid #dee2e6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
display: block
}
#onboarding {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
margin-top: 4rem;
width: 42%;
min-width: 42%;
font-size: 2rem;
background: #a48fe1;
text-align: center!important;
border: 1px solid #a48fe1;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
border-radius: 2px
}
#i2pbrowser-description {
padding-top: 1rem;
padding-bottom: 1rem;
width: 50%;
min-width: 50%;
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
display: block
}
html body ul.label-list li {
list-style: none;
float: left
}
html body ul.label-list li:nth-child(odd) {
clear: left
}
#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
border-radius: 2px
}
#applicationExplain,
#controlExplain {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
text-align: left!important;
float: left
}
#proxyReady {
min-height: 3rem;
@@ -223,13 +215,9 @@ li {
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline;
background: #d9d9d6;
display: block;
float: right;
text-align: center!important;
border: 1px solid #d9d9d6;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
text-align: center!important
}
#proxyUnready {
min-height: 3rem;
@@ -237,13 +225,9 @@ li {
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline;
display: block;
float: right;
text-align: center!important;
border: 1px solid #ffc56d;
border-radius: 2px;
background: #ffc56d;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
text-align: center!important
}
#consoleOn {
min-height: 3rem;
@@ -251,22 +235,25 @@ li {
margin: .2rem;
width: 38%;
min-width: 38%;
display: inline;
display: block;
float: left;
text-align: center!important;
border: 1px solid #f7e59a;
border-radius: 2px;
background: #f7e59a;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
text-align: center!important
}
.tabicon {
min-width: 64px;
min-height: 64px
}
li.application {
text-align: left
}
button.applicationName {
width: auto
}
.onboardingContent {
font-size: .8rem!important;
text-align: left;
display: none
}
#proxy-check {
visibility: hidden
}
#info-content {
display: none
}
@@ -275,12 +262,20 @@ li {
visibility: visible;
opacity: 1
}
img {
max-width: 100%;
margin: 3%
}
img.readyness {
height: 100%;
width: auto
}
@media only screen and (max-width: 399px) {
.application-info {
display: none
}
input {
color: #1f1a24
}
#hidden {
display: none
}
.hidden {
display: none
}

239
home.html
View File

@@ -1,114 +1,151 @@
<!DOCTYPE html>
<html>
<head>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="home.css"/>
</head>
<link href="home.css" rel="stylesheet">
<link href="search.css" rel="stylesheet">
<link href="sidebar.css" rel="stylesheet">
<title>
</title>
</head>
<body>
<!--<div>-->
<script src="home.js" type="text/javascript"></script>
<!--<div>-->
<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">
<div class='content'>
<div class="text-section-header">
<h1 id="text-section-header">I2P Browsing</h1>
</div>
<div id="i2pbrowser-version">
</div>
<div id="i2pbrowser-description">
<p id="description">I2P in Private Browsing is a webextension to secure and enhance your I2P use in the browser.</p>
<p id="beta">This is an experimental product.</p>
</div>
<div id="readyness">
<!--<div id="consoleOn" class="hideIfI2PConsoleOff">
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png" alt="Proxy is not ready."/>
<span id="proxy-check">Proxy is ready.</span>
</div>-->
<!--<div id="proxyUnready" class="hideIfI2PProxyOn">The proxy is not ready yet.</div>-->
<div class="hideIfI2PProxyOff" id="proxyReady">
<img alt="Proxy is not ready." class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png"> <span id="proxy-check">Proxy is ready.</span>
</div>
</div>
<!--<div 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 class="hideIfI2PConsoleOff" id="onboarding">
<h3 id="onboardingTitle">New to I2P? Learn more here.</h3>
<h4 id="onboardingZero"><button class="showhider" id="onboardingButtonZero">Protect your Privacy</button>
</h4>
<p class="onboardingContent" id="onboardingContentZero">I2P Browser allows you to surf the internet using the private and secure I2P network. When using it, you are protected against tracking, surveillance, and censorship as a first-class participant in the I2P network. I2P Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser.</p>
<h4 id="onboardingOne"><button class="showhider" id="onboardingButtonOne">Configure your Experience</button>
</h4>
<p class="onboardingContent" id="onboardingContentOne">We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer. Click below to see what the different options do. Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them. With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
<h4 id="onboardingTwo"><button class="showhider" id="onboardingButtonTwo">Share Files</button>
</h4>
<p class="onboardingContent" id="onboardingContentTwo">I2P is capable of using peer-to-peer applications like BitTorrent, protecting your identity when you share files. Our anonymous bittorrent client is available in the browser.</p>
<h4 id="onboardingThree"><button class="showhider" id="onboardingButtonThree">Hidden e-mail</button>
</h4>
<p class="onboardingContent" id="onboardingContentThree">There is also an anonymous e-mail service available inside of I2P, which is accessible from our browser via the menu directly below.</p>
<h4 id="onboardingFour"><button class="showhider" id="onboardingButtonFour">Experience Tips</button>
</h4>
<p class="onboardingContent" id="onboardingContentFour">With all the security and privacy features provided by I2P, your experience while browsing the internet may be a little different. Things may be a bit slower, and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.</p>
</div>
</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>
<!--<p class="hideIfI2POn">&aboutI2p.warn_not_running; <a href="about:i2p">&aboutI2p.refresh_text;</a> &aboutI2p.reccommend_not_running;</p>-->
<div class="application-info">
<p class="hideIfI2PConsoleOff">
</p>
<h3 id="applicationHeader">Applications</h3>
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
<ul>
<!--<li class="application">
<a class="applicationName" href="http://legwork.i2p" id="window-link-toopie" target="_blank">Search:</a> <span class="applicationDesc" id="search">Legwork is an in-I2P search engine.</span>
<div class="topnav">
<form action="http://legwork.i2p/yacysearch.html?" method="get">
<input id="search-query" name="query" placeholder="Search on legwork.i2p(Opens a new tab)" type="search"> <input id="search-submit" text="Submit" type="submit">
</form>
</div>
</li>-->
<li class="application">
<a class="applicationName" href="toopie.html" id="window-visit-toopie">Toopie</a> <span class="applicationDesc" id="toopie">For information about your I2P router status, go here:</span>
</li>
<li class="application">
<a class="applicationName" href="http://127.0.0.1:7657/" id="window-visit-router">Router Console</a> <span class="applicationDesc" id="routerConsole">The entrypoint for all other I2P applications is the I2P Router Console. To visit it, click here.</span>
</li>
<li class="application">
<a class="applicationName" href="http://127.0.0.1:7657/i2ptunnel" id="window-visit-i2ptunnel">Hidden Services Manager</a> <span class="applicationDesc" id="i2ptunnel">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span>
</li>
<li class="application">
<a class="applicationName" href="http://127.0.0.1:7657/susimail" id="window-visit-susimail">E-Mail</a> <span class="applicationDesc" id="susimail">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span>
</li>
<li class="application">
<a class="applicationName" href="http://127.0.0.1:7657/i2psnark" id="window-visit-snark">BitTorrent</a> <span class="applicationDesc" id="snark">I2P is capable of anonymous Peer-to-Peer file sharing, to use the built-in bittorrent client go here:</span>
</li>
</ul>
<p>
</p>
</div>
<div class="extended-info">
<h3 id="links"><button class="showhider" id="fliplinks">Links</button>
</h3>
<div id="info-content">
<p id="linksExplain">If you want to get more information about I2P, you can visit these links.</p>
<p>
</p>
<ul>
<li class="application">
<a href="http://i2p-projekt.i2p/" id="window-visit-i2p">I2P Project Homepage:</a> <span class="applicationDesc" id="i2ppage">More information is available here.</span>
</li>
<li class="application">
<a href="/index.html" id="window-visit-homepage">Webextension Homepage:</a> <span class="applicationDesc" id="webpage">More information is available here.</span>
</li>
<li class="application">
<a href="http://git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox" id="window-visit-sources">Source Code:</a> <span class="applicationDesc" id="sources">Browse the source of this webextension or contribute here.</span>
</li>
<li class="application">
<a href="http://git.idk.i2p/idk/I2P-in-Private-Browsing-Mode-Firefox/-/releases" id="window-visit-releases">Releases:</a> <span class="applicationDesc" id="releases">Check for new releases here.</span>
</li>
</ul>
<p>
</p>
</div>
</div>
</div>
</div>
</div>
<!--</div>-->
</div>
<script src="home.js" type="text/javascript"></script>
<script src="content.js" type="text/javascript"></script> <!--</div>-->
</body>
</html>

35
home.js
View File

@@ -1,24 +1,25 @@
document.addEventListener("click", e => {
if (e.target.id === "onboardingButtonZero") {
flipVisibility("onboardingContentZero");
} else if (e.target.id === "onboardingButtonOne") {
flipVisibility("onboardingContentOne");
} else if (e.target.id === "onboardingButtonTwo") {
flipVisibility("onboardingContentTwo");
} else if (e.target.id === "onboardingButtonThree") {
flipVisibility("onboardingContentThree");
} else if (e.target.id === "onboardingButtonFour") {
flipVisibility("onboardingContentFour");
} else if (e.target.id === "fliplinks") {
flipVisibility("info-content");
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) {
var x = document.getElementById(div);
if (x.style.display === "none") {
x.style.display = "block";
console.log('(home) seeking flippable', div);
let flippable = document.getElementById(div);
if (flippable.style.display !== 'block') {
flippable.style.display = 'block';
} else {
x.style.display = "none";
flippable.style.display = 'none';
}
}

166
host.js
View File

@@ -1,27 +1,32 @@
function proxyHost(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
let hostname = '';
if (url.indexOf('://') > -1) {
hostname = url.split('/')[2];
} else {
hostname = url.split("/")[0];
hostname = url.split('/')[0];
}
if (hostname == "proxy.i2p") {
if (hostname == 'proxy.i2p') {
return true;
}
if (
hostname == 'c6lilt4cr5x7jifxridpkesf2zgfwqfchtp6laihr4pdqomq25iq.b32.i2p'
) {
return true;
}
return false;
}
function localHost(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
let hostname = '';
if (url.indexOf('://') > -1) {
hostname = url.split('/')[2];
} else {
hostname = url.split("/")[0];
hostname = url.split('/')[0];
}
hostname = hostname.split(":")[0];
if (hostname === "127.0.0.1") {
hostname = hostname.split(':')[0];
if (hostname === '127.0.0.1') {
return true;
} else if (hostname === "localhost") {
} else if (hostname === 'localhost') {
return true;
}
@@ -29,83 +34,124 @@ function localHost(url) {
}
function extensionHost(url) {
var res = url.startsWith(browser.runtime.getURL(""));
console.log("Extension URL?", res, url, browser.runtime.getURL(""));
return res;
if (url.originUrl !== undefined) {
var res = url.originUrl.startsWith(browser.runtime.getURL(''));
if (res) return res;
}
if (url.url !== undefined) {
var res = url.url.startsWith(browser.runtime.getURL(''));
if (res) return res;
}
}
function i2pHostName(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
let hostname = '';
console.log('(hosts)', url);
let u = new URL(url);
if (u.host.endsWith('.i2p')) {
hostname = u.host;
} else if (url.includes('=')) {
if (url.includes('.i2p')) {
lsit = url.split('=');
for (let item in lsit) {
var items = lsit[item].split(`\ % `); //"\%")
for (let p in items) {
if (items[p].includes('.i2p')) {
hostname = items[p].replace('3D', 1);
}
break;
}
if (hostname != '') {
break;
}
}
}
} else if (url.indexOf('://') > -1) {
hostname = url.split('/')[2];
} else {
hostname = url.split("/")[0];
hostname = url.split('/')[0];
}
console.log('(hosts) scrub', hostname);
return hostname;
}
function i2pHost(url) {
let hostname = i2pHostName(url);
return hostname.endsWith(".i2p");
return hostname.endsWith('.i2p');
}
function routerHost(url) {
let hostname = "";
let path = "";
// console.log("(urlcheck) HOST URL CHECK");
let hostname = '';
let path = '';
function pathcheck(str) {
if (str != undefined) {
let final = str.split("/")[0];
if (final === "i2ptunnelmgr" || final === "i2ptunnel") {
console.log("(urlcheck) 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";
let final = str.split('/')[0];
if (final === 'i2ptunnelmgr' || final === 'i2ptunnel') {
console.log('(urlcheck) Tunnel application path', final);
return 'i2ptunnelmgr';
} else if (
final === "home" ||
final === "console" ||
final.startsWith("config")
final === 'i2psnark' ||
final === 'torrents' ||
final.startsWith('transmission') ||
final.startsWith('tracker') ||
url.includes(':7662')
) {
console.log("(urlcheck) application path", final);
return "routerconsole";
console.log('(urlcheck) Torrent application path', final);
return 'i2psnark';
} else if (final === 'webmail' || final === 'susimail') {
console.log('(urlcheck) Mail application path', final);
return 'webmail';
} else if (final.startsWith('MuWire')) {
if (!url.includes('.png')) {
console.log('(urlcheck) MuWire application path', final);
return 'muwire';
}
} else if (final.startsWith('i2pbote')) {
if (!url.includes('.png')) {
console.log('(urlcheck) I2PBote application path', final);
return 'i2pbote';
}
} else if (
final === 'home' ||
final === 'console' ||
final === 'dns' ||
final === 'susidns' ||
final.startsWith('susidns') ||
final === 'sitemap' ||
final.startsWith('config')
) {
console.log('(urlcheck) Console application path', final);
return 'routerconsole';
}
}
return true;
}
if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
prefix = url.substr(0, url.indexOf("://") + 3);
path = url.replace(prefix + hostname + "/", "");
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)) {
url = identifyProtocolHandler(url);
return routerHost(url);
let newurl = identifyProtocolHandler(url);
return routerHost(newurl);
} else {
hostname = url.split("/")[0];
path = url.replace(hostname + "/", "");
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") {
if (hostname === control_host + ':' + control_port) {
return pathcheck(path);
}
if (hostname === "127.0.0.1:7657") {
return pathcheck(path);
} else if (hostname === "localhost:7657") {
if (hostname === 'localhost' + ':' + control_port) {
return pathcheck(path);
}
if (hostname === "127.0.0.1:7070") {
return pathcheck(path);
} else if (hostname === "localhost:7070") {
if (hostname === '127.0.0.1' + ':' + control_port) {
return pathcheck(path);
}
if (hostname === 'localhost' + ':' + 7070) {
return pathcheck(path);
}
if (hostname === '127.0.0.1' + ':' + 7070) {
return pathcheck(path);
}
return false;
}

5
i2pcontrol/README.md Normal file
View File

@@ -0,0 +1,5 @@
i2pcontrol.js
=============
This is inside of the webextension for now, but it's actually a fully-fledged,
standalone library for talking to i2pcontrol.

View File

@@ -1,47 +1,391 @@
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;
var hello = 'hello i2pcontrol';
function makeid(length) {
var result = '';
var characters =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
function 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
}
function send(
message,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc"
) {
async function postData(url = "", data = {}) {
// Default options are marked with *
let requestBody = JSON.stringify(data);
//console.log("(i2pcontrol) sending request", requestBody);
let opts = {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, *cors, same-origin
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'same-origin', // include, *same-origin, omit
headers: {
'Content-Type': 'application/json',
},
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *client
body: requestBody, // body data type must match "Content-Type" header
};
var controlMessage = document.getElementById(section);
console.log("(i2pcontrol) reply", xhr.responseText);
infoMessage.textContent = xhr.responseText;
};
const response = await fetch(url, opts);
return await response.json(); // parses JSON response into native JavaScript objects
}
//console.log("http://" + control_host + ":" + control_port + "/" + control_path)
return postData(
'http://' + control_host + ':' + control_port + '/' + control_path + '/',
message
);
}
echo("test", "test");
async function authenticate(
password = "itoopie",
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc"
) {
var json = new Object();
json['id'] = makeid(6);
json['jsonrpc'] = '2.0';
json['method'] = 'Authenticate';
json['params'] = new Object();
json['params']['API'] = 1;
json['params']['Password'] = password;
return send(json, control_host, control_port, control_path);
}
async function GetToken(
password = "itoopie",
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc"
) {
function gettoken(authtoken) {
return authtoken.result.Token;
}
let me = authenticate(password, control_host, control_port, control_path);
return await me.then(gettoken);
}
async function Echo(
message,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function echo(token) {
console.log('(i2pcontrol) testing I2PControl connection');
var json = new Object();
json['id'] = makeid(6);
json['jsonrpc'] = '2.0';
json['method'] = 'Echo';
json['params'] = new Object();
json['params']['Token'] = token;
json['params']['Echo'] = message;
return send(json, control_host, control_port, control_path);
}
let token = GetToken(password, control_host, control_port, control_path);
let done = await token.then(echo);
return done;
}
function UpdateEchoElementByID(
Query,
ID,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc"
) {
function updateelement(update) {
//console.log("(i2pcontrol)", update);
if (document.getElementById(ID) !== null)
document.getElementById(ID).innerText = update;
}
let net = Echo(Query, control_host, control_port, control_path, password);
net.then(updateleement);
}
async function GetRate(
Query,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function getrate(token) {
var json = new Object();
json['id'] = makeid(6);
json['jsonrpc'] = '2.0';
json['method'] = 'I2PControl';
json['params'] = new Object();
json['params']['Token'] = token;
json['params']['Stat'] = Query;
json['params']['Period'] = 2000;
return send(json, control_host, control_port, control_path);
}
let token = GetToken(password, control_host, control_port, control_path);
let done = await token.then(getrate);
return done;
}
function UpdateGetRateElementByID(
Query,
ID,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc"
) {
function updateelement(update) {
//console.log("(i2pcontrol)", update);
if (document.getElementById(ID) !== null)
document.getElementById(ID).innerText = update;
}
let net = GetRate(Query, control_host, control_port, control_path, password);
net.then(updateleement);
}
async function I2PControl(
Query,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function i2pcontrol(token) {
var json = new Object();
json['id'] = makeid(6);
json['jsonrpc'] = '2.0';
json['method'] = 'I2PControl';
json['params'] = new Object();
json['params']['Token'] = token;
json['params'][Query] = null;
return send(json, control_host, control_port, control_path);
}
let token = GetToken(password, control_host, control_port, control_path);
let done = await token.then(i2pcontrol);
return done;
}
function UpdateI2PControlElementByID(
Query,
ID,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc"
) {
function updateelement(update) {
//console.log("(i2pcontrol)", update);
if (document.getElementById(ID) !== null)
document.getElementById(ID).innerText = update;
}
let net = I2PControl(
Query,
control_host,
control_port,
control_path,
password
);
net.then(updateleement);
}
async function RouterInfo(
Query,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function routerinfo(token) {
var json = new Object();
json['id'] = makeid(6);
json['jsonrpc'] = '2.0';
json['method'] = 'RouterInfo';
json['params'] = new Object();
json['params']['Token'] = token;
json['params'][Query] = null;
return send(json, control_host, control_port, control_path);
}
let token = GetToken(password, control_host, control_port, control_path);
let done = await token.then(routerinfo);
return done;
}
function UpdateRouterInfoElementByID(
Query,
ID,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function updateelement(update) {
/*console.log(
"(i2pcontrol) element",
update.result[Query],
ID,
document.getElementById(ID)
);*/
if (document.getElementById(ID) !== null)
document.getElementById(ID).innerText = update.result[Query];
}
let net = RouterInfo(
Query,
control_host,
control_port,
control_path,
password
);
net.then(updateelement);
}
async function RouterManager(
Query,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function routermanager(token) {
var json = new Object();
json['id'] = makeid(6);
json['jsonrpc'] = '2.0';
json['method'] = 'RouterManager';
json['params'] = new Object();
json['params']['Token'] = token;
json['params'][Query] = null;
return send(json, control_host, control_port, control_path);
}
let token = GetToken(password, control_host, control_port, control_path);
let done = await token.then(routermanager);
return done;
}
function UpdateRouterManagerElementByID(
Query,
ID,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function updateelement(update) {
//console.log("(i2pcontrol)", update);
if (document.getElementById(ID) !== null)
document.getElementById(ID).innerText = update;
}
let net = RouterManager(
Query,
control_host,
control_port,
control_path,
password
);
net.then(updateleement);
}
async function NetworkSetting(
Query,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function networksetting(token) {
var json = new Object();
json['id'] = makeid(6);
json['jsonrpc'] = '2.0';
json['method'] = 'NetworkSetting';
json['params'] = new Object();
json['params']['Token'] = token;
json['params'][Query] = null;
return send(json, control_host, control_port, control_path);
}
let token = GetToken(password, control_host, control_port, control_path);
let done = await token.then(networksetting);
return done;
}
function UpdateNetworkSettingElementByID(
Query,
ID,
control_host = "127.0.0.1",
control_port = "7657",
control_path = "jsonrpc",
password = "itoopie"
) {
function updateelement(update) {
//console.log("(i2pcontrol)", update);
document.getElementById(ID).innerText = update;
}
let net = NetworkSetting(
Query,
control_host,
control_port,
control_path,
password
);
net.then(updateleement);
}
function UpdateContents() {
UpdateRouterInfoElementByID('i2p.router.status', 'router-status');
UpdateRouterInfoElementByID('i2p.router.uptime', 'router-uptime');
UpdateRouterInfoElementByID('i2p.router.version', 'router-version');
UpdateRouterInfoElementByID(
'i2p.router.net.bw.inbound.1s',
'router-net-bw-inbound-1s'
);
UpdateRouterInfoElementByID(
'i2p.router.net.bw.inbound.15s',
'router-net-bw-inbound-15s'
);
UpdateRouterInfoElementByID(
'i2p.router.net.bw.outbound.1s',
'router-net-bw-outbound-1s'
);
UpdateRouterInfoElementByID(
'i2p.router.net.bw.outbound.15s',
'router-net-bw-outbound-15s'
);
UpdateRouterInfoElementByID('i2p.router.net.status', 'router-net-status');
UpdateRouterInfoElementByID(
'i2p.router.net.tunnels.participating',
'router-net-tunnels-participating'
);
UpdateRouterInfoElementByID(
'i2p.router.netdb.activepeers',
'router-netdb-activepeers'
);
UpdateRouterInfoElementByID(
'i2p.router.netdb.fastpeers',
'router-netdb-fastpeers'
);
UpdateRouterInfoElementByID(
'i2p.router.netdb.highcapacitypeers',
'router-netdb-highcapacitypeers'
);
UpdateRouterInfoElementByID(
'i2p.router.netdb.isreseeding',
'router-netdb-isreseeding'
);
UpdateRouterInfoElementByID(
'i2p.router.netdb.knownpeers',
'router-netdb-knownpeers'
);
}
var done = Echo(hello);
done.then(Done);
function Done(output) {
console.log('(i2pcontrol) I2PControl connection tested,', output);
return output;
}

Binary file not shown.

Binary file not shown.

BIN
icons/browse.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
icons/i2plogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

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

Before

Width:  |  Height:  |  Size: 6.9 KiB

BIN
icons/torrents.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
images/gear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

59
images/restart.svg Normal file
View File

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

After

Width:  |  Height:  |  Size: 2.4 KiB

59
images/shutdown.svg Normal file
View File

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

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

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

View File

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

279
info.js
View File

@@ -1,173 +1,346 @@
function checkPeerConnection() {
var getting = browser.privacy.network.peerConnectionEnabled.get({});
getting.then(got => {
webrtc = got.value;
console.log("checking webrtc", webrtc);
document.getElementById("enable-web-rtc").checked = webrtc;
let getting = browser.privacy.network.peerConnectionEnabled.get({});
getting.then((got) => {
let webrtc = got.value;
console.log('checking webrtc', webrtc);
if (document.getElementById('enable-web-rtc') !== null)
document.getElementById('enable-web-rtc').checked = webrtc;
});
}
checkPeerConnection();
function checkSnowflake() {
try {
function snowflake(snowflake) {
console.log("snowflake plugin found, leaving WebRTC alone", snowflake);
AssurePeerConnection();
}
var snowflakeInfo = browser.management.get(
"{b11bea1f-a888-4332-8d8a-cec2be7d24b9}" // string
);
snowflakeInfo.then(snowflake);
} catch {
console.log("snowflake not found");
}
}
checkSnowflake();
function checkHistory() {
var getting = browser.storage.local.get("disable_history");
getting.then(got => {
disable_history = got.disable_history;
if (disable_history == undefined) disable_history = false;
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;
if (document.getElementById("disable-history") !== null)
document.getElementById("disable-history").checked = disable_history;
});
}
checkHistory();
document.addEventListener("click", e => {
if (e.target.id === "window-create-help-panel") {
document.addEventListener("click", (clickEvent) => {
if (clickEvent.target.id === "window-create-help-panel") {
let createData = {
type: "panel",
incognito: true
incognito: true,
};
let creating = browser.tabs.create(createData);
creating.then(() => {
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 = browser.tabs.create(createData);
creating.then(() => {
console.log("The news panel has been created");
});
} else if (e.target.id === "generate-fresh-tunnel") {
function RefreshIdentity() {
} else if (clickEvent.target.id === "visit-irc") {
browser.sidebarAction.setPanel({ panel: "http://127.0.0.1:7669" });
browser.sidebarAction.open();
} else if (clickEvent.target.id === "generate-fresh-tunnel") {
function refreshIdentity() {
console.log("Generating new identity");
const Http = new XMLHttpRequest();
const url = "http://" + controlHost + ":" + controlPort;
Http.open("GET", url);
Http.send();
Http.onreadystatechange = e => {
Http.onreadystatechange = (event) => {
console.log(Http.responseText);
};
}
RefreshIdentity();
} else if (e.target.id === "window-preface-title") {
} else if (e.target.id === "window-visit-homepage") {
refreshIdentity();
} else if (clickEvent.target.id === "label-router-restart") {
console.log("attempting to initiate graceful restart");
RouterManager("RestartGraceful");
} else if (clickEvent.target.id === "label-router-shutdown") {
console.log("attempting to initiate graceful shutdown");
RouterManager("ShutdownGraceful");
} else if (clickEvent.target.id === "label-router-status") {
if (document.getElementById("label-status-list").style.display !== "none") {
console.log("hiding label-status-list");
document.getElementById("label-status-list").style.display = "none";
} else {
console.log("showing label-status-list");
document.getElementById("label-status-list").style.display = "block";
}
} else if (clickEvent.target.id === "label-router-peers") {
if (document.getElementById("label-peers-list").style.display !== "none") {
console.log("hiding label-peers-list");
document.getElementById("label-peers-list").style.display = "none";
} else {
console.log("showing label-peers-list");
document.getElementById("label-peers-list").style.display = "block";
}
} else if (clickEvent.target.id === "label-router-bandwidth") {
if (
document.getElementById("label-bandwidth-list").style.display !== "none"
) {
console.log("hiding label-bandwidth-list");
document.getElementById("label-bandwidth-list").style.display = "none";
} else {
console.log("showing label-bandwidth-list");
document.getElementById("label-bandwidth-list").style.display = "block";
}
} else if (clickEvent.target.id === "search-submit") {
console.log("attempting to create search tab");
goSearch();
} else if (clickEvent.target.id === "browser-action") {
console.log("showing a browser action");
showBrowsing();
} else if (clickEvent.target.id === "torrent-action") {
console.log("showing a torrent action");
showTorrentsMenu();
} else if (clickEvent.target.id === "window-preface-title") {
console.log("attempting to create homepage tab");
goHome();
} else if (e.target.id === "window-visit-i2ptunnel") {
} else if (clickEvent.target.id === "window-visit-index") {
console.log("attempting to create index tab");
goIndex();
} else if (clickEvent.target.id === "window-visit-homepage") {
console.log("attempting to create homepage tab");
goHome();
} else if (clickEvent.target.id === "window-visit-toopie") {
console.log("attempting to create toopie tab");
goToopie();
} else if (clickEvent.target.id === "window-visit-i2ptunnel") {
console.log("attempting to create i2ptunnel tab");
goTunnel();
} else if (e.target.id === "window-visit-susimail") {
} else if (clickEvent.target.id === "window-visit-susimail") {
console.log("attempting to create susimail tab");
goMail();
} else if (e.target.id === "window-visit-snark") {
} else if (clickEvent.target.id === "window-visit-snark") {
console.log("attempting to create snark tab");
goSnark();
} else if (e.target.id === "clear-browser-data") {
} else if (clickEvent.target.id === "clear-browser-data") {
forgetBrowsingData();
} else if (e.target.id === "check-i2p-control") {
echo("I2P Router Detected", "panel-section-i2pcontrol-check");
} else if (e.target.id === "enable-web-rtc") {
if (e.target.checked) {
} else if (clickEvent.target.id === "check-i2p-control") {
//echo("I2P Router Detected", "panel-section-i2pcontrol-check");
} else if (clickEvent.target.id === "enable-web-rtc") {
if (clickEvent.target.checked) {
browser.runtime.sendMessage({ rtc: "enableWebRTC" });
} else {
browser.runtime.sendMessage({ rtc: "disableWebRTC" });
}
//checkPeerConnection()
checkPeerConnection();
return;
} else if (e.target.id === "disable-history") {
if (e.target.checked) {
} else if (clickEvent.target.id === "disable-history") {
if (clickEvent.target.checked) {
browser.runtime.sendMessage({ history: "disableHistory" });
} else {
browser.runtime.sendMessage({ history: "enableHistory" });
}
//checkHistory()
return;
}
e.preventDefault();
clickEvent.preventDefault();
});
window.onload = function (e) {
if (document.getElementById("label-peers-list") != null) {
document.getElementById("label-peers-list").style.display = "none";
}
if (document.getElementById("label-bandwidth-list") != null) {
document.getElementById("label-bandwidth-list").style.display = "none";
}
};
function proxyReadiness() {
console.log(this.responseText);
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
gettingInfo.then((got) => {
if (got.os != "android") {
browser.history.onVisited.addListener(onVisited);
}
});
function showBrowsing() {
var x = document.getElementById("browserpanel");
x.style.display = "block";
var y = document.getElementById("torrentpanel");
y.style.display = "none";
}
function showTorrentsMenu() {
var x = document.getElementById("browserpanel");
x.style.display = "none";
var y = document.getElementById("torrentpanel");
y.style.display = "block";
}
function goHome() {
function gotProxyInfo(info) {
let host = info.value.http.split(":")[0];
let port = info.value.http.split(":")[1];
if (port == "7644") {
let createData = {
url: "about:I2p"
let createRhizomeData = {
url: "about:I2p",
};
console.log("visiting homepage");
let creating = browser.tabs.create(createData);
let creating = browser.tabs.create(createRhizomeData);
creating.then(onTabCreated, onTabError);
} else {
let createData = {
url: "home.html"
url: "home.html",
};
console.log("visiting homepage");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
console.log("(bookmarks) adding home page bookmark");
}
console.log("(bookmarks) checking if we're running in an I2P Browser");
var gettingInfo = browser.proxy.settings.get({});
gettingInfo.then(gotProxyInfo);
var gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
function goIndex() {
function onTabError() {
console.log("Help tab created");
}
let createData = {
url: "index.html",
};
console.log("visiting help");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function goToopie() {
function onTabError() {
console.log("Toopie tab created");
}
console.log("visiting toopie");
let creating = browser.sidebarAction.open();
creating.then(onTabCreated, onTabError);
}
function onTabCreated() {
console.log("Tab Created");
}
function goSearch() {
function onTabError() {
console.log("Search tab created");
}
let createData = {
url:
"http://yacy.idk.i2p/yacysearch.html?" +
"query=" +
document.getElementById("search-query").value,
};
console.log("visiting legwork");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function routerAddr() {
if (!control_host) var control_host = "127.0.0.1";
if (!control_port) var control_port = "7657";
return control_host + ":" + control_port;
}
function goTunnel() {
function onTabError() {
console.log("I2PTunnel tab created");
}
let createData = {
url: "http://" + control_host + ":" + control_port + "/i2ptunnel"
url: "http://" + routerAddr() + "/i2ptunnel",
};
console.log("visiting homepage");
console.log("visiting i2ptunnel");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function goMail() {
function onTabError() {
console.log("Mail tab created");
}
let createData = {
url: "http://" + control_host + ":" + control_port + "/susimail"
url: "http://" + routerAddr() + "/susimail",
};
console.log("visiting homepage");
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"
url: "http://" + routerAddr() + "/i2psnark",
};
console.log("visiting homepage");
console.log("visiting snark");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function onVisited(historyItem) {
function onCleaned(results) {
if (!results.length) {
console.log(" was removed");
} else {
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
startTime: 0,
});
searching.then(onCleaned);
}
if (!history) {
if (i2pHost(historyItem.url))
if (i2pHost(historyItem.url)) {
var deletingUrl = browser.history.deleteUrl(historyItem.url);
}
deletingUrl.then(onRemoved);
}
}
if (UpdateContents !== undefined) UpdateContents();
const minutes = 0.2;
const interval = minutes * 60 * 1000;
setInterval(function () {
if (UpdateContents !== undefined) UpdateContents();
}, interval);
fetch("http://127.0.0.1:7669").then((myJson) => {
if (myJson.status == 200) {
let irc = document.getElementById("visit-irc");
if (irc != null) {
irc.classList.remove("hidden");
}
}
});

76
issues.csv Normal file
View File

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

BIN
lander.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

36
location.html Normal file
View File

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

19
location.js Normal file
View File

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

View File

@@ -7,12 +7,16 @@
},
"permissions": [
"theme",
"alarms",
"browsingData",
"bookmarks",
"contextMenus",
"management",
"notifications",
"proxy",
"privacy",
"storage",
"webNavigation",
"webRequest",
"webRequestBlocking",
"contextualIdentities",
@@ -23,33 +27,61 @@
],
"manifest_version": 2,
"name": "__MSG_extensionName__",
"version": "0.51",
"version_name": "0.51",
"version": "0.95",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://github.com/eyedeekay/i2psetproxy.js",
"homepage_url": "https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox",
"icons": {
"48": "icons/toopie.png"
"48": "icons/i2plogo.png"
},
"browser_action": {
"browser_style": true,
"default_icon": "icons/toopie.png",
"default_icon": "icons/i2plogo.png",
"default_title": "__MSG_extensionName__",
"default_popup": "window.html"
},
"sidebar_action": {
"browser_style": true,
"default_icon": "icons/i2plogo.png",
"default_title": "__MSG_toopieName__",
"default_panel": "toopie.html",
"open_at_install": false
},
"page_action": {
"browser_style": true,
"default_title": "__MSG_toopieTLS__",
"default_icon": "icons/toopie.png",
"show_matches": [
"http://*.i2p/*",
"https://*.i2p/*",
"http://*.b32.i2p/*",
"https://*.b32.i2p/*"
],
"pinned": true
},
"options_ui": {
"page": "options/options.html"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["script.js"]
}
],
"background": {
"persistent": true,
"scripts": [
"config.js",
"torrent/common.js",
"torrent/background.js",
"i2pcontrol/i2pcontrol.js",
"host.js",
"privacy.js",
"platform.js",
"background.js",
"host.js",
"handler.js",
"proxy.js",
"info.js",
"home.js",
"i2pcontrol/i2pcontrol.js",
"scrub.js",
"bookmarks.js"
]
@@ -60,11 +92,6 @@
"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",

BIN
menu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@@ -1,62 +1,52 @@
body {
width: 25em;
font-family: "Open Sans Light", sans-serif;
font-family: "Open Sans Light",sans-serif;
font-size: 0.9em;
font-weight: 300;
font-weight: 300
}
section.scheme-options {
padding: 0.5em 0;
margin: 1em 0;
margin: 1em 0
}
#clear-button {
margin: 0 1.3em 1em 0;
margin: 0 1.3em 1em 0
}
#clear-button,
section.scheme-options input,
section.scheme-options>select,
#clear-button {
float: right;
section.scheme-options>select {
}
label {
display: block;
padding: 0.2em 0;
margin-top: 1em
}
label:hover {
background-color: #EAEFF2;
background-color: #eaeff2
}
.title {
font-size: 1.2em;
margin-bottom: 0.5em;
width: 100%
}
html, body {
width: 350px;
body,
html {
width: 100%
}
a {
margin: 10px;
display: inline-block;
margin: 10px
}
.panel {
margin: 5px;
margin: 5px
}
span.identity {
width: 100px;
display: inline-block;
margin-left: 1em;
margin-left: 1em
}
.control-options {
display: none;
}
.identity-options {
display: none;
display: none
}
input {
}
div {
width: 100%!important
}

View File

@@ -1,51 +1,95 @@
<!DOCTYPE html>
<html>
<head>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="options.css"/>
</head>
<body>
<link href="/home.css" rel="stylesheet">
<link href="options.css" rel="stylesheet">
<title>
</title>
</head>
<body>
<section class="scheme-options">
<span class="title">Proxy Scheme:</span> <select id="proxy_scheme">
<option selected value="http">
HTTP
</option>
<option value="socks5">
SOCKS5
</option>
</select>
</section>
<section class="scheme-options">
<span class="title">Proxy Scheme:</span>
<select id="proxy_scheme">
<option value="http" selected="selected">HTTP</option>
<option value="socks5">SOCKS5</option>
</select>
<span class="title">Bookmarks Status:</span> <input id="bookmarksState" name="bookmarksstate" type="checkbox" value="bookmarksstate"> <label for="bookmarksState">Bookmarks were created at install-time. <button id="bookmarksButton" type="submit">Re-Create Bookmarks</button></label>
</section>
<section class="scheme-options proxy-options">
<div class="title" >Proxy Options</div>
<label id="portText">Host: </label>
<input type="text" data="host" id="host" value="127.0.0.1"/>
<br>
<label id="hostText">Port: </label>
<input type="text" data="port" id="port" value="4444"/>
<section class="scheme-options proxy-options" id="proxy-options">
<label for="bookmarksState"></label>
<div class="title">
<label for="bookmarksState">Proxy Options</label>
</div>
<label for="bookmarksState"></label>
<p id="proxyHelpText"><label for="bookmarksState"></label>
</p>
<label for="bookmarksState"><label id="portText">Host:</label> <input data="host" id="host" type="text" value="127.0.0.1">
<br>
<label id="hostText">Port:</label> <input data="port" id="port" type="text" value="4444"></label>
</section>
<section class="scheme-options identity-options">
<!--<section class="scheme-options identity-options">
<div class="panel">
<div id="identity-list">Identity list?</div>
</div>
</section>-->
<section class="scheme-options console-options" id="console-options">
<div>
<div class="title">
Router Console Options
</div>
<p id="controlHelpText">Configure your router console options here.</p>
<label id="controlPortText">Console Host:</label> <input data="controlhost" id="controlhost" type="text" value="127.0.0.1">
<br>
<label id="controlHostText">Console Port:</label> <input data="controlport" id="controlport" type="text" value="7657">
</div>
</section>
<section class="scheme-options control-options">
<div class="title" >Controller Options</div>
<p id="controlHelpText"> These options will be inert if used with the default i2p HTTP or SOCKS
proxy. </p>
<label id="controlPortText">Control Host: </label>
<input type="text" data="controlhost" id="controlhost" value="127.0.0.1"/>
<br>
<label id="controlHostText">Control Port: </label>
<input type="text" data="controlport" id="controlport" value="4444"/>
<section class="scheme-options control-options" id="control-options">
<div>
<div class="title">
I2PControl RPC Client Options
</div>
<p id="rpcHelpText">Configure your I2PControl options here.</p>
<label id="rpcPortText">Control Host:</label> <input data="rpchost" id="rpchost" type="text" value="127.0.0.1">
<br>
<label id="rpcHostText">Control Port:</label> <input data="rpcport" id="rpcport" type="text" value="7657">
<br>
<label id="rpcPathText">Control Path:</label> <input data="rpcpath" id="rpcpath" type="text" value="jsonrpc">
<br>
<label id="rpcPassText">Control Password:</label> <input data="rpcpass" id="rpcpass" type="text" value="itoopie">
</div>
</section>
<input type="button" value="Save preferences" id="save-button"/>
<script src="options.js"></script>
</body>
<section class="scheme-options transmission-options" id="transmission-options">
<div>
<div class="title">
Bittorrent RPC Client Options
</div>
<p id="rpcHelpText">Configure your Bittorrent options here.</p>
<label id="btRpcHostText">Torrent RPC Host:</label> <input data="btrpchost" id="btrpchost" type="text" value="127.0.0.1">
<br>
<label id="btRpcPortText">Torrent RPC Port:</label> <input data="btrpcport" id="btrpcport" type="text" value="7657">
<br>
<label id="btRpcPathText">Torrent RPC Path:</label> <input data="btrpcpath" id="btrpcpath" type="text" value="transmission/">
<br>
<label id="rpcPassText">Torrent RPC Password:</label> <input data="btrpcpass" id="btrpcpass" type="text" value="">
</div>
</section>
<input id="save-button" type="button" value="Save preferences">
<script src="options.js"></script>
<script src="/bookmarks.js"></script> <!--<script src="/torrent/browser-polyfill.min.js"></script>
<script src="/torrent/options.js"></script>-->
</body>
</html>

View File

@@ -1,217 +1,343 @@
function SetBookButton() {
// var bmid = document.getElementById("bookmark");
//bmid.textContent = chrome.i18n.getMessage("bookmarkButton");
}
function SetHostText() {
var hostid = document.getElementById("hostText");
hostid.textContent = chrome.i18n.getMessage("hostText");
var hostid = document.getElementById('hostText');
hostid.textContent = chrome.i18n.getMessage('hostText');
}
function SetPortText() {
var portid = document.getElementById("portText");
portid.textContent = chrome.i18n.getMessage("portText");
var portid = document.getElementById('portText');
portid.textContent = chrome.i18n.getMessage('portText');
}
function SetPortHelpText() {
var portid = document.getElementById('proxyHelpText');
portid.textContent = chrome.i18n.getMessage('proxyHelpText');
}
function SetControlHostText() {
var controlhostid = document.getElementById("controlHostText");
controlhostid.textContent = chrome.i18n.getMessage("controlHostText");
var controlhostid = document.getElementById('controlHostText');
controlhostid.textContent = chrome.i18n.getMessage('controlHostText');
}
function SetControlPortText() {
var controlportid = document.getElementById("controlPortText");
controlportid.textContent = chrome.i18n.getMessage("controlPortText");
var controlportid = document.getElementById('controlPortText');
controlportid.textContent = chrome.i18n.getMessage('controlPortText');
}
function SetControlHelpText() {
var portid = document.getElementById("controlHelpText");
portid.textContent = chrome.i18n.getMessage("controlHelpText");
var portid = document.getElementById('controlHelpText');
portid.textContent = chrome.i18n.getMessage('controlHelpText');
}
function getBookmarksCreated() {
bookmarks_state = document.getElementById('bookmarks');
console.log('(options)Got i2p bookmarks state:', bookmarks_state);
if (bookmarks_state == undefined) {
return false;
}
if (bookmarks_state.value == 'false') {
return false;
}
if (bookmarks_state.value == 'true') {
return true;
}
return false;
}
function getScheme() {
const proxy_scheme = document.querySelector("#proxy_scheme");
console.log("Got i2p proxy scheme:", proxy_scheme.value);
if (proxy_scheme == "HTTP") {
return "http";
const proxy_scheme = document.querySelector('#proxy_scheme');
console.log('(options)Got i2p proxy scheme:', proxy_scheme.value);
if (proxy_scheme.value == 'HTTP') {
return 'http';
}
if (proxy_scheme == "SOCKS") {
return "socks";
if (proxy_scheme.value == 'SOCKS') {
return 'socks';
}
return proxy_scheme.value;
if (proxy_scheme.value == 'http') return 'http';
if (proxy_scheme.value == 'socks') return 'socks';
else return 'http';
}
function getHost() {
proxy_host = document.getElementById("host").value;
console.log("Got i2p proxy host:", proxy_host);
proxy_host = document.getElementById('host').value;
console.log('(options)Got i2p proxy host:', proxy_host);
if (proxy_host == undefined) {
return "127.0.0.1";
return '127.0.0.1';
}
return proxy_host;
}
function getPort() {
proxy_port = document.getElementById("port").value;
console.log("Got i2p proxy port:", proxy_port);
proxy_port = document.getElementById('port').value;
console.log('(options)Got i2p proxy port:', proxy_port);
if (proxy_port == undefined) {
return "4444";
return '4444';
}
return proxy_port;
}
function getControlHost() {
control_host = document.getElementById("controlhost").value;
console.log("Got i2p control host:", control_host);
control_host = document.getElementById('controlhost').value;
console.log('(options)Got i2p control host:', control_host);
if (control_host == undefined) {
return "127.0.0.1";
return '127.0.0.1';
}
return control_host;
}
function getControlPort() {
control_port = document.getElementById("controlport").value;
console.log("Got i2p control port:", control_port);
control_port = document.getElementById('controlport').value;
console.log('(options)Got i2p control port:', control_port);
if (control_port == undefined) {
return "4444";
return '4444';
}
return control_port;
}
function getRPCHost() {
rpc_host = document.getElementById('rpchost').value;
console.log('(options)Got i2pcontrol rpc host:', rpc_host);
if (rpc_host == undefined) {
return '127.0.0.1';
}
return rpc_host;
}
function getRPCPort() {
rpc_port = document.getElementById('rpcport').value;
console.log('(options)Got i2pcontrol rpc port:', rpc_port);
if (rpc_port == undefined) {
return '7657';
}
return rpc_port;
}
function getRPCPath() {
rpc_path = document.getElementById('rpcpath').value;
console.log('(options)Got i2pcontrol rpc path:', rpc_path);
if (rpc_path == undefined) {
return 'jsonrpc';
}
return rpc_path;
}
function getRPCPass() {
rpc_pass = document.getElementById('rpcpass').value;
console.log('(options)Got i2pcontrol rpc password:');
if (rpc_pass == undefined) {
return 'itoopie';
}
return rpc_pass;
}
function getBTRPCHost() {
bt_rpc_host = document.getElementById('btrpchost').value;
console.log('(options)Got torrent rpc host:', bt_rpc_host);
if (bt_rpc_host == undefined) {
return '127.0.0.1';
}
return bt_rpc_host;
}
function getBTRPCPort() {
bt_rpc_port = document.getElementById('btrpcport').value;
console.log('(options)Got torrent rpc port:', bt_rpc_port);
if (bt_rpc_port == undefined) {
return '7657';
}
return bt_rpc_port;
}
function getBTRPCPath() {
bt_rpc_path = document.getElementById('btrpcpath').value;
console.log('(options)Got torrent rpc path:', bt_rpc_path);
if (bt_rpc_path == undefined) {
return 'transmission/rpc';
}
return bt_rpc_path;
}
function getBTRPCPass() {
bt_rpc_pass = document.getElementById('btrpcpass').value;
console.log('(options)Got torrent rpc password:');
if (bt_rpc_pass == undefined) {
return 'itoopie';
}
return bt_rpc_pass;
}
function checkStoredSettings(storedSettings) {
function gotProxyInfo(info) {
let defaultSettings = {};
let host = info.value.http.split(":")[0];
let port = info.value.http.split(":")[1];
console.log("proxy", "'" + host + "'", ":", port);
if (!storedSettings.proxy_scheme) {
defaultSettings["proxy_scheme"] = "http";
let host = info.value.http.split(':')[0];
let port = info.value.http.split(':')[1];
if (port != 7644) {
port = undefined;
}
if (!storedSettings.proxy_host) {
if (host == "") {
defaultSettings["proxy_host"] = "127.0.0.1";
} else {
defaultSettings["proxy_host"] = host;
}
} else {
if (host != "") {
defaultSettings["proxy_host"] = host;
} else {
defaultSettings["proxy_host"] = storedSettings.proxy_host;
}
}
if (!storedSettings.proxy_port) {
if (port == undefined) {
defaultSettings["proxy_port"] = 4444;
} else {
defaultSettings["proxy_port"] = port;
}
} else {
if (port != undefined) {
defaultSettings["proxy_port"] = port;
} else {
defaultSettings["proxy_port"] = storedSettings.proxy_port;
}
}
if (!storedSettings.control_host) {
if (host == "") {
defaultSettings["control_host"] = "127.0.0.1";
} else {
defaultSettings["control_host"] = host;
}
} else {
if (host != "") {
defaultSettings["control_host"] = host;
} else {
defaultSettings["control_host"] = storedSettings.control_host;
}
}
if (!storedSettings.control_port) {
if (port == undefined) {
defaultSettings["control_port"] = 4444;
} else {
defaultSettings["control_port"] = port;
}
} else {
if (port != undefined) {
defaultSettings["control_port"] = port;
} else {
defaultSettings["control_port"] = storedSettings.control_port;
}
}
console.log("(browserinfo) NATIVE PROXYSETTINGS", info.value);
console.log('(options)proxy', "'" + host + "'", ':', port);
if (!storedSettings['bookmarks_state'])
defaultSettings['bookmarks_state'] = false;
else defaultSettings['bookmarks_state'] = storedSettings['bookmarks_state'];
if (!storedSettings['proxy_scheme'])
defaultSettings['proxy_scheme'] = 'http';
else defaultSettings['proxy_scheme'] = storedSettings['proxy_scheme'];
if (!storedSettings['proxy_host']) {
if (host == '') defaultSettings['proxy_host'] = '127.0.0.1';
else defaultSettings['proxy_host'] = host;
} else defaultSettings['proxy_host'] = storedSettings['proxy_host'];
if (!storedSettings['proxy_port']) {
if (port == undefined) defaultSettings['proxy_port'] = 4444;
else if (port == 7644) defaultSettings['proxy_port'] = port;
else defaultSettings['proxy_port'] = 4444;
} else defaultSettings['proxy_port'] = storedSettings.proxy_port;
if (!storedSettings['control_host']) {
if (host == '') defaultSettings['control_host'] = '127.0.0.1';
else defaultSettings['control_host'] = host;
} else defaultSettings['control_host'] = storedSettings.control_host;
if (!storedSettings['control_port']) {
defaultSettings['control_port'] = 7657;
} else defaultSettings['control_port'] = storedSettings.control_port;
if (!storedSettings['rpc_host']) {
if (host == '') defaultSettings['rpc_host'] = '127.0.0.1';
else defaultSettings['rpc_host'] = host;
} else defaultSettings['rpc_host'] = storedSettings.rpc_host;
if (!storedSettings['rpc_port']) {
defaultSettings['rpc_port'] = 7657;
} else defaultSettings['rpc_port'] = storedSettings.rpc_port;
if (!storedSettings['rpc_path']) {
defaultSettings['rpc_path'] = 'jsonrpc';
} else defaultSettings['rpc_path'] = storedSettings.rpc_path;
if (!storedSettings['rpc_pass']) {
defaultSettings['rpc_pass'] = 'itoopie';
} else defaultSettings['rpc_pass'] = storedSettings.rpc_pass;
if (!storedSettings['bt_rpc_host']) {
if (host == '') defaultSettings['bt_rpc_host'] = '127.0.0.1';
else defaultSettings['bt_rpc_host'] = host;
} else defaultSettings['bt_rpc_host'] = storedSettings.bt_rpc_host;
if (!storedSettings['bt_rpc_port']) {
defaultSettings['bt_rpc_port'] = 7657;
} else defaultSettings['bt_rpc_port'] = storedSettings.bt_rpc_port;
if (!storedSettings['bt_rpc_path']) {
defaultSettings['bt_rpc_path'] = 'transmission/';
} else defaultSettings['bt_rpc_path'] = storedSettings.bt_rpc_path;
if (!storedSettings['bt_rpc_pass']) {
defaultSettings['bt_rpc_pass'] = 'transmission';
} else defaultSettings['bt_rpc_pass'] = storedSettings.bt_rpc_pass;
console.log('(options)(browserinfo) NATIVE PROXYSETTINGS', info.value);
defaultSettings['base_url'] =
'http://' +
defaultSettings['bt_rpc_host'] +
':' +
defaultSettings['bt_rpc_port'] +
'/' +
defaultSettings['bt_rpc_path'];
console.log(
defaultSettings["proxy_host"],
defaultSettings["proxy_port"],
defaultSettings["control_host"],
defaultSettings["control_port"]
'(options)',
defaultSettings['proxy_scheme'],
defaultSettings['proxy_host'],
defaultSettings['proxy_port'],
defaultSettings['control_host'],
defaultSettings['control_port'],
defaultSettings['base_url']
);
chrome.storage.local.set(defaultSettings);
return defaultSettings;
}
var gettingInfo = browser.proxy.settings.get({});
gettingInfo.then(gotProxyInfo);
return 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;
}
}
let host = '';
let port = '';
if (!storedSettings['bookmarks_state'])
defaultSettings['bookmarks_state'] = false;
else defaultSettings['bookmarks_state'] = storedSettings['bookmarks_state'];
if (!storedSettings['proxy_scheme']) defaultSettings['proxy_scheme'] = 'http';
else defaultSettings['proxy_scheme'] = storedSettings['proxy_scheme'];
if (!storedSettings['proxy_host']) {
if (host == '') defaultSettings['proxy_host'] = '127.0.0.1';
else defaultSettings['proxy_host'] = host;
} else defaultSettings['proxy_host'] = storedSettings['proxy_host'];
if (!storedSettings['proxy_port']) {
if (port == undefined) defaultSettings['proxy_port'] = 4444;
else if (port == 7644) defaultSettings['proxy_port'] = port;
else defaultSettings['proxy_port'] = 4444;
} else defaultSettings['proxy_port'] = storedSettings.proxy_port;
if (!storedSettings['control_host']) {
if (host == '') defaultSettings['control_host'] = '127.0.0.1';
else defaultSettings['control_host'] = host;
} else defaultSettings['control_host'] = storedSettings.control_host;
if (!storedSettings['control_port']) {
defaultSettings['control_port'] = 7657;
} else defaultSettings['control_port'] = storedSettings.control_port;
if (!storedSettings['rpc_host']) {
if (host == '') defaultSettings['rpc_host'] = '127.0.0.1';
else defaultSettings['rpc_host'] = host;
} else defaultSettings['rpc_host'] = storedSettings.rpc_host;
if (!storedSettings['rpc_port']) {
defaultSettings['rpc_port'] = 7657;
} else defaultSettings['rpc_port'] = storedSettings.rpc_port;
if (!storedSettings['rpc_path']) {
defaultSettings['rpc_path'] = 'jsonrpc';
} else defaultSettings['rpc_path'] = storedSettings.rpc_path;
if (!storedSettings['rpc_pass']) {
defaultSettings['rpc_pass'] = 'itoopie';
} else defaultSettings['rpc_pass'] = storedSettings.rpc_pass;
if (!storedSettings['bt_rpc_host']) {
if (host == '') defaultSettings['bt_rpc_host'] = '127.0.0.1';
else defaultSettings['bt_rpc_host'] = host;
} else defaultSettings['bt_rpc_host'] = storedSettings.bt_rpc_host;
if (!storedSettings['bt_rpc_port']) {
defaultSettings['bt_rpc_port'] = 7657;
} else defaultSettings['bt_rpc_port'] = storedSettings.bt_rpc_port;
if (!storedSettings['bt_rpc_path']) {
defaultSettings['bt_rpc_path'] = 'transmission/rpc';
} else defaultSettings['bt_rpc_path'] = storedSettings.bt_rpc_path;
if (!storedSettings['bt_rpc_pass']) {
defaultSettings['bt_rpc_pass'] = 'transmission';
} else defaultSettings['bt_rpc_pass'] = storedSettings.bt_rpc_pass;
console.log('(options)(browserinfo) NATIVE PROXYSETTINGS', info.value);
console.log(
defaultSettings["proxy_host"],
defaultSettings["proxy_port"],
defaultSettings["control_host"],
defaultSettings["control_port"]
'(options)',
defaultSettings['proxy_scheme'],
defaultSettings['proxy_host'],
defaultSettings['proxy_port'],
defaultSettings['control_host'],
defaultSettings['control_port']
);
chrome.storage.local.set(defaultSettings);
return defaultSettings;
}
function onError(e) {
@@ -219,48 +345,94 @@ function onError(e) {
}
function storeSettings() {
let proxy_scheme = getScheme();
let proxy_host = getHost();
let proxy_port = getPort();
let control_host = getControlHost();
let control_port = getControlPort();
chrome.storage.local.set({
proxy_scheme,
proxy_host,
proxy_port,
control_host,
control_port
});
console.log("storing proxy scheme:", proxy_scheme);
console.log("storing proxy host:", proxy_host);
console.log("storing proxy port:", proxy_port);
console.log("storing control host:", control_host);
console.log("storing control port:", control_port);
let storableSettings = {};
storableSettings['bookmarks_state'] = getBookmarksCreated();
storableSettings['proxy_scheme'] = getScheme();
storableSettings['proxy_host'] = getHost();
storableSettings['proxy_port'] = getPort();
storableSettings['control_host'] = getControlHost();
storableSettings['control_port'] = getControlPort();
storableSettings['rpc_host'] = getRPCHost();
storableSettings['rpc_port'] = getRPCPort();
storableSettings['rpc_path'] = getRPCPath();
storableSettings['rpc_pass'] = getRPCPass();
storableSettings['bt_rpc_host'] = getBTRPCHost();
storableSettings['bt_rpc_port'] = getBTRPCPort();
storableSettings['bt_rpc_path'] = getBTRPCPath();
storableSettings['bt_rpc_pass'] = getBTRPCPass();
storableSettings['base_url'] =
'http://' + bt_rpc_host + ':' + bt_rpc_port + '/' + bt_rpc_path;
console.log('storing', storableSettings);
chrome.storage.local.set(storableSettings);
}
function updateUI(restoredSettings) {
const selectList = document.querySelector("#proxy_scheme");
selectList.value = restoredSettings.proxy_scheme;
console.log("showing proxy scheme:", selectList.value);
const selectList = document.querySelector('#proxy_scheme');
if (selectList != undefined) selectList.value = restoredSettings.proxy_scheme;
//console.log("(options)showing proxy scheme:", selectList.value);
const hostitem = document.getElementById("host");
hostitem.value = restoredSettings.proxy_host;
console.log("showing proxy host:", hostitem.value);
console.log(restoredSettings);
const bms = document.getElementById('bookmarksState');
if (bms != undefined) bms.checked = restoredSettings.bookmarks_state;
const portitem = document.getElementById("port");
portitem.value = restoredSettings.proxy_port;
console.log("showing proxy port:", portitem.value);
const hostitem = document.getElementById('host');
if (hostitem != undefined) hostitem.value = restoredSettings.proxy_host;
//console.log("(options)showing proxy host:", hostitem.value);
const controlhostitem = document.getElementById("controlhost");
controlhostitem.value = restoredSettings.control_host;
console.log("showing control host:", controlhostitem.value);
const portitem = document.getElementById('port');
if (portitem != undefined) portitem.value = restoredSettings.proxy_port;
//console.log("(options)showing proxy port:", portitem.value);
const controlportitem = document.getElementById("controlport");
controlportitem.value = restoredSettings.control_port;
console.log("showing control port:", controlportitem.value);
const controlhostitem = document.getElementById('controlhost');
if (controlhostitem == undefined)
controlhostitem.value = restoredSettings.control_host;
//console.log("(options)showing control host:", controlhostitem.value);
const controlportitem = document.getElementById('controlport');
if (controlportitem == undefined)
controlportitem.value = restoredSettings.control_port;
//console.log("(options)showing control port:", controlportitem.value);
const rpchostitem = document.getElementById('rpchost');
if (rpchostitem != undefined) rpchostitem.value = restoredSettings.rpc_host;
//console.log("(options)showing rpc host:", rpchostitem.value);
const rpcportitem = document.getElementById('rpcport');
if (rpcportitem != undefined) rpcportitem.value = restoredSettings.rpc_port;
//console.log("(options)showing rpc port:", rpcportitem.value);
const rpcpathitem = document.getElementById('rpcpath');
if (rpcpathitem != undefined) rpcpathitem.value = restoredSettings.rpc_path;
//console.log("(options)showing rpc path:", rpcpathitem.value);
const rpcpassitem = document.getElementById('rpcpass');
if (rpcpassitem != undefined) rpcpassitem.value = restoredSettings.rpc_pass;
//console.log("(options)showing rpc pass:");
const btrpchostitem = document.getElementById('btrpchost');
if (btrpchostitem != undefined)
btrpchostitem.value = restoredSettings.rpc_host;
//console.log("(options)showing bt rpc host:", btrpchostitem.value);
const btrpcportitem = document.getElementById('btrpcport');
if (btrpcportitem != undefined)
btrpcportitem.value = restoredSettings.rpc_port;
//console.log("(options)showing rbt pc port:", rpcportitem.value);
const btrpcpathitem = document.getElementById('btrpcpath');
if (btrpcpathitem != undefined)
btrpcpathitem.value = restoredSettings.rpc_path;
//console.log("(options)showing bt rpc path:", btrpcpathitem.value);
const btrpcpassitem = document.getElementById('btrpcpass');
if (btrpcpassitem != undefined)
btrpcpassitem.value = restoredSettings.rpc_pass;
//console.log("(options)showing bt rpc pass:");
SetBookButton();
SetHostText();
SetPortText();
SetPortHelpText();
SetControlHostText();
SetControlPortText();
SetControlHelpText();
@@ -271,11 +443,11 @@ function onError(e) {
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
gettingInfo.then((got) => {
if (got.os != 'android') {
chrome.storage.local.get(function(got) {
checkStoredSettings(got);
updateUI(got);
let settings = checkStoredSettings(got);
settings.then(updateUI);
});
} else {
chrome.storage.local.get(function(got) {
@@ -285,7 +457,5 @@ gettingInfo.then(got => {
}
});
const saveButton = document.querySelector("#save-button");
saveButton.addEventListener("click", storeSettings);
//EXPERIMENTAL: Open in I2P Tab
const saveButton = document.querySelector('#save-button');
saveButton.addEventListener('click', storeSettings);

View File

@@ -1,30 +1,26 @@
var titlepref = chrome.i18n.getMessage("titlePreface");
var titleprefpriv = chrome.i18n.getMessage("titlePrefacePrivate");
var webpref = chrome.i18n.getMessage("webPreface");
var webprefpriv = chrome.i18n.getMessage("webPrefacePrivate");
var routerpref = chrome.i18n.getMessage("routerPreface");
var routerprefpriv = chrome.i18n.getMessage("routerPrefacePrivate");
var mailpref = chrome.i18n.getMessage("mailPreface");
var mailprefpriv = chrome.i18n.getMessage("mailPrefacePrivate");
var torrentpref = chrome.i18n.getMessage("torrentPreface");
var torrentprefpriv = chrome.i18n.getMessage("torrentPrefacePrivate");
var tunnelpref = chrome.i18n.getMessage("i2ptunnelPreface");
var tunnelprefpriv = chrome.i18n.getMessage("i2ptunnelPrefacePrivate");
var android = false;
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os == "android") {
console.log("Running in Android detected");
gettingInfo.then((got) => {
if (got.os == 'android') {
console.log('Running in Android detected');
android = true;
return true;
} else {
console.log("Running in Desktop detected");
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,19 +1,10 @@
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 titlepref = chrome.i18n.getMessage('titlePreface');
function onSet(result) {
if (result) {
console.log("->: Value was updated");
console.log('->: Value was updated');
} else {
console.log("-X: Value was not updated");
console.log('-X: Value was not updated');
}
}
@@ -21,10 +12,19 @@ function onSet(result) {
risky sites in your browser */
function disableHyperlinkAuditing() {
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
value: false
value: false,
});
console.log("Disabling hyperlink auditing/val=", {
value: false
console.log('Disabling hyperlink auditing/val=', {
value: false,
});
setting.then(onSet);
}
// UNINSTALL ONLY
function enableHyperlinkAuditing() {
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.clear();
console.log('Disabling hyperlink auditing/val=', {
value: false,
});
setting.then(onSet);
}
@@ -32,10 +32,19 @@ function disableHyperlinkAuditing() {
// This enables first-party isolation
function enableFirstPartyIsolation() {
var setting = browser.privacy.websites.firstPartyIsolate.set({
value: true
value: true,
});
console.log("Enabling first party isolation/val=", {
value: true
console.log('Enabling first party isolation/val=', {
value: true,
});
setting.then(onSet);
}
// UNINSTALL ONLY
function disableFirstPartyIsolation() {
var setting = browser.privacy.websites.firstPartyIsolate.clear();
console.log('Enabling first party isolation/val=', {
value: true,
});
setting.then(onSet);
}
@@ -45,23 +54,27 @@ function enableFirstPartyIsolation() {
interface for now */
function disableEvilCookies() {
var getting = browser.privacy.websites.cookieConfig.get({});
getting.then(got => {
getting.then((got) => {
var setting = browser.privacy.websites.cookieConfig.set({
value: {
behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies
}
behavior: 'reject_third_party',
nonPersistentCookies: got.value.nonPersistentCookies,
},
});
console.log("Setting cookie behavior/val=", {
console.log('Setting cookie behavior/val=', {
value: {
behavior: "reject_third_party",
nonPersistentCookies: got.value.nonPersistentCookies
}
behavior: 'reject_third_party',
nonPersistentCookies: got.value.nonPersistentCookies,
},
});
setting.then(onSet);
});
}
function enableEvilCookies() {
var getting = browser.privacy.websites.cookieConfig.clear();
}
// Make sure that they're gone
/*function disableBadCookies(){
var setting = browser.privacy.websites.thirdPartyCookiesAllowed.set({
@@ -76,10 +89,19 @@ function disableEvilCookies() {
// this disables the use of referrer headers
function disableReferrers() {
var setting = browser.privacy.websites.referrersEnabled.set({
value: false
value: false,
});
console.log("Disabling referrer headers/val=", {
value: false
value: false,
});
setting.then(onSet);
}
// UNINSATALL ONLY
function enableReferrers() {
var setting = browser.privacy.websites.referrersEnabled.clear();
console.log("Disabling referrer headers/val=", {
value: false,
});
setting.then(onSet);
}
@@ -87,10 +109,19 @@ function disableReferrers() {
// enable fingerprinting resistent features(letterboxing and stuff)
function enableResistFingerprinting() {
var setting = browser.privacy.websites.resistFingerprinting.set({
value: true
value: true,
});
console.log("Enabling resist fingerprinting/val=", {
value: true
value: true,
});
setting.then(onSet);
}
// UNINSTALL ONLY
function disableResistFingerprinting() {
var setting = browser.privacy.websites.resistFingerprinting.clear();
console.log("Enabling resist fingerprinting/val=", {
value: false,
});
setting.then(onSet);
}
@@ -98,10 +129,19 @@ function enableResistFingerprinting() {
// This is essentially a blocklist of clearnet web-sites known to do bad tracking
function enableTrackingProtection() {
var setting = browser.privacy.websites.trackingProtectionMode.set({
value: "always"
value: "always",
});
console.log("Enabling tracking protection/val=", {
value: "always"
value: "always",
});
setting.then(onSet);
}
// UNINSTALL ONLY
function disableTrackingProtection() {
var setting = browser.privacy.websites.trackingProtectionMode.clear();
console.log("Enabling tracking protection/val=", {
value: "always",
});
setting.then(onSet);
}
@@ -110,15 +150,15 @@ function enableTrackingProtection() {
management dependent on identifying information */
function disableDigitalRestrictionsManagement() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
gettingInfo.then((got) => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.set({
value: false
value: false,
});
console.log(
"Setting Protected Content(Digital Restrictions Management) false/val=",
{
value: false
value: false,
}
);
setting.then(onSet);
@@ -126,6 +166,45 @@ function disableDigitalRestrictionsManagement() {
});
}
// UNINSTALL ONLY
function disableDigitalRestrictionsManagement() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.clear();
console.log(
"Setting Protected Content(Digital Restrictions Management) false/val=",
{
value: true,
}
);
setting.then(onSet);
}
});
}
function unsetAllPrivacy() {
enableHyperlinkAuditing();
disableFirstPartyIsolation();
enableEvilCookies();
enableReferrers();
disableTrackingProtection();
disableResistFingerprinting();
enableDigitalRestrictionsManagement();
UnsetPeerConnection();
EnableSavePasswords();
}
browser.management.onUninstalled.addListener((info) => {
function gotSelf(selfinfo) {
if (info.name == selfinfo.name) {
unsetAllPrivacy();
}
}
var gettingSelf = browser.management.getSelf();
gettingSelf.then(gotSelf);
});
function setAllPrivacy() {
disableHyperlinkAuditing();
enableFirstPartyIsolation();
@@ -139,49 +218,53 @@ function setAllPrivacy() {
setAllPrivacy();
function ResetPeerConnection() {
var webrtc = false;
var rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(AssurePeerConnection);
}
function EnablePeerConnection() {
var webrtc = false;
var rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(SetupPeerConnection);
console.log("Enabled WebRTC");
}
function SetupPeerConnection() {
var webrtc = true;
console.log("Pre-disabled WebRTC");
rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc
});
rtc.then(AssurePeerConnection);
function reset(snowflake) {
var webrtc = true;
console.log("No snowflake plugin found, pre-disabled WebRTC");
var rtc = browser.privacy.network.peerConnectionEnabled.set({
value: webrtc,
});
rtc.then(AssurePeerConnection);
}
function snowflake(snowflake) {
console.log("snowflake plugin found, leaving WebRTC alone", snowflake);
AssurePeerConnection();
}
var snowflakeInfo = browser.management.get(
"{b11bea1f-a888-4332-8d8a-cec2be7d24b9}" // string
);
snowflakeInfo.then(snowflake, reset);
}
function AssurePeerConnection() {
function assure(webrtc) {
browser.privacy.network.peerConnectionEnabled.set({
value: webrtc.value
});
browser.privacy.network.networkPredictionEnabled.set({
value: false
value: true,
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "proxy_only"
value: "disable_non_proxied_udp",
});
}
rtc = browser.privacy.network.peerConnectionEnabled.get({});
let rtc = browser.privacy.network.peerConnectionEnabled.get({});
rtc.then(assure);
}
// UNINSTALL ONLY
function UnsetPeerConnection() {
function assure(webrtc) {
browser.privacy.network.peerConnectionEnabled.set({
value: true,
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "default",
});
}
let rtc = browser.privacy.network.peerConnectionEnabled.get({});
rtc.then(assure);
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
gettingInfo.then((got) => {
if (got.os == "android") {
browser.tabs.onCreated.addListener(ResetPeerConnection);
} else {
@@ -192,15 +275,13 @@ gettingInfo.then(got => {
function ResetDisableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
value: false
value: false,
});
console.log("Re-disabled saved passwords");
}
function EnableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
value: true
});
browser.privacy.services.passwordSavingEnabled.clear();
console.log("Enabled saved passwords");
}
@@ -208,20 +289,13 @@ function EnableSavePasswords() {
var defaultSettings = {
since: "forever",
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"]
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"],
};
var appSettings = {
since: "forever",
dataTypes: [""]
};
function onError(e) {
console.error(e);
function onError(therror) {
console.error(therror);
}
function clearCookiesContext(cookieStoreId) {}
function forgetBrowsingData(storedSettings) {
function getSince(selectedSince) {
if (selectedSince === "forever") {
@@ -231,7 +305,7 @@ function forgetBrowsingData(storedSettings) {
const times = {
hour: () => 1000 * 60 * 60,
day: () => 1000 * 60 * 60 * 24,
week: () => 1000 * 60 * 60 * 24 * 7
week: () => 1000 * 60 * 60 * 24 * 7,
};
const sinceMilliseconds = times[selectedSince].call();
@@ -255,58 +329,58 @@ function forgetBrowsingData(storedSettings) {
browser.notifications.create({
type: "basic",
title: "Removed browsing data",
message: `Removed ${dataTypesString}\n for I2P Browsing`
message: `Removed ${dataTypesString}\n for I2P Browsing`,
});
}
function deepCleanHistory(historyItems) {
console.log("Deep cleaning history");
for (item of historyItems) {
for (let item of historyItems) {
if (i2pHost(item.url)) {
browser.history.deleteUrl({
url: item.url
url: item.url,
});
browser.browsingData.removeCache({});
console.log("cleared Cache");
browser.browsingData
.removePasswords({
hostnames: [i2pHostName(item.url)],
since
since,
})
.then(onContextGotLog);
console.log("cleared Passwords");
browser.browsingData
.removeDownloads({
hostnames: [i2pHostName(item.url)],
since
since,
})
.then(onContextGotLog);
console.log("cleared Downloads");
browser.browsingData
.removeFormData({
hostnames: [i2pHostName(item.url)],
since
since,
})
.then(onContextGotLog);
console.log("cleared Form Data");
browser.browsingData
.removeLocalStorage({
hostnames: [i2pHostName(item.url)],
since
since,
})
.then(onContextGotLog);
console.log("cleared Local Storage");
contexts = browser.contextualIdentities.query({
name: titlepref
let contexts = browser.contextualIdentities.query({
name: titlepref,
});
function deepCleanCookies(cookies) {
for (cookie of cookies) {
for (let cookie of cookies) {
var removing = browser.cookies.remove({
firstPartyDomain: cookie.firstPartyDomain,
name: cookie.name,
url: item.url
url: item.url,
});
removing.then(onContextGotLog, onError);
}
@@ -314,10 +388,10 @@ function forgetBrowsingData(storedSettings) {
}
function deepCleanContext(cookieStoreIds) {
for (cookieStoreId of cookieStoreIds) {
for (let cookieStoreId of cookieStoreIds) {
var removing = browser.cookies.getAll({
firstPartyDomain: null,
storeId: cookieStoreId.cookieStoreId
storeId: cookieStoreId.cookieStoreId,
});
removing.then(deepCleanCookies, onError);
}
@@ -331,7 +405,7 @@ function forgetBrowsingData(storedSettings) {
var searching = browser.history.search({
text: "i2p",
startTime: 0
startTime: 0,
});
searching.then(deepCleanHistory);
@@ -342,24 +416,52 @@ function forgetBrowsingData(storedSettings) {
function i2pHostName(url) {
let hostname = "";
if (url.indexOf("://") > -1) {
console.log("(hosts)", url);
let u = new URL(url);
if (u.host.endsWith(".i2p")) {
hostname = u.host;
} else if (url.includes("=")) {
console.log("(hosts) scrub 1", url);
if (url.includes(".i2p")) {
lsit = url.split("=");
console.log("(hosts) scrub 2", hostname);
for (let item in lsit) {
var items = lsit[item].split(`\ % `); //"\%")
for (let p in items) {
if (items[p].includes(".i2p")) {
hostname = items[p].replace("3D", 1);
}
console.log("(hosts) scrub 3", hostname);
break;
}
if (hostname != "") {
console.log("(hosts) scrub 4", hostname);
break;
}
}
}
} else if (url.indexOf("://") > -1) {
hostname = url.split("/")[2];
console.log("(hosts) scrub 5", hostname);
} else {
hostname = url.split("/")[0];
console.log("(hosts) scrub 6", hostname);
}
console.log("(hosts) scrub 7", hostname);
return hostname;
}
function i2pHost(url) {
let hostname = i2pHostName(url);
if (hostname.endsWith(".i2p")) {
console.log("(hostname) i2p", hostname);
}
return hostname.endsWith(".i2p");
}
function onContextGotLog(contexts) {
if (contexts != null) {
for (let context of contexts) {
console.log(context);
}
console.log(contexts);
}
}
@@ -370,9 +472,9 @@ function enableHistory() {
storedSettings["disable_history"] = false;
console.log(storedSettings);
function enablehistory(settings) {
console.log("Store History:", storedSettings);
console.log("Store History:", settings);
}
var setting = browser.storage.local.set(storedSettings);
let setting = browser.storage.local.set(storedSettings);
setting.then(enablehistory);
}
const gettingStoredSettings = browser.storage.local.get();
@@ -384,7 +486,7 @@ function disableHistory() {
storedSettings["disable_history"] = true;
console.log(storedSettings);
function enablehistory(settings) {
console.log("Store History:", storedSettings);
console.log("Store History:", settings);
}
var setting = browser.storage.local.set(storedSettings);
setting.then(enablehistory);
@@ -393,19 +495,19 @@ function disableHistory() {
gettingStoredSettings.then(checkStoredSettings, onError);
}
function message(message) {
console.log(message);
if (message.rtc === "enableWebRTC") {
function message(recieved) {
console.log(recieved);
if (recieved.rtc === "enableWebRTC") {
console.log("enableWebRTC");
EnablePeerConnection();
} else if (message.rtc === "disableWebRTC") {
AssurePeerConnection();
} else if (recieved.rtc === "disableWebRTC") {
console.log("disableWebRTC");
ResetPeerConnection();
}
if (message.history === "enableHistory") {
if (recieved.history === "enableHistory") {
console.log("enableHistory");
enableHistory();
} else if (message.history === "disableHistory") {
} else if (recieved.history === "disableHistory") {
console.log("disableHistory");
disableHistory();
}

457
proxy.js
View File

@@ -1,307 +1,322 @@
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 titlepref = chrome.i18n.getMessage('titlePreface');
var webpref = chrome.i18n.getMessage('webPreface');
var ircpref = chrome.i18n.getMessage('ircPreface');
var torrentpref = chrome.i18n.getMessage('torrentPreface');
var routerpref = chrome.i18n.getMessage('routerPreface');
var routerprefpriv = chrome.i18n.getMessage('routerPrefacePrivate');
var ircpref = chrome.i18n.getMessage('ircPreface');
browser.privacy.network.peerConnectionEnabled.set({
value: false
value: true,
});
console.log("Preliminarily disabled WebRTC.");
chrome.privacy.network.networkPredictionEnabled.set({
value: false
value: false,
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp"
value: 'disable_non_proxied_udp',
});
console.log('Disabled unproxied UDP.');
function shouldProxyRequest(requestInfo) {
return requestInfo.parentFrameId != -1;
}
var handleContextProxyRequest = async function(requestDetails) {
console.log("(proxy)Searching for proxy by context");
function ircProxy() {
if (!requestDetails.url.includes('7669')) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
}
if (requestDetails.url.includes(':7669')) {
proxy = null;
return proxy;
}
}
function btProxy() {
proxy = routerProxy();
if (requestDetails.url.includes(':7662')) {
proxy = null;
return proxy;
}
console.log('(bt proxy)', proxy);
return proxy;
}
function mainProxy() {
console.log('(proxy) mainproxy 0');
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
let url = new URL(requestDetails.url);
if (
requestDetails.url.startsWith(
'http://' + getHost() + ':' + getConsolePort() + '/i2psnark/'
)
) {
//+url.host)) {
console.log('(proxy) mainproxy 2', url);
proxy = null;
}
return proxy;
}
function routerProxy() {
if (routerHost(requestDetails.url)) {
proxy = null;
return proxy;
} else if (!routerHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
}
}
try {
var handleProxyRequest = function(context) {
proxy = {
failoverTimeout: 0,
proxyDns: false
type: getScheme(),
host: getHost(),
port: getPort(),
};
if (context == "firefox-default" || context == "firefox-private") {
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,
"Using",
proxy.type,
"proxy ",
proxy.host + ":" + proxy.port
);
console.log('(proxy), context', context);
proxy = routerProxy();
if (context.name == ircpref) {
proxy = ircProxy();
return proxy;
} else if (context.name == titlepref) {
proxy = mainProxy();
return proxy;
} else if (context.name == routerpref) {
if (routerHost(requestDetails.url)) {
return proxy;
} else if (!routerHost(requestDetails.url)) {
proxy = {
type: "http",
host: "localhost",
port: "65535"
};
proxy = routerProxy();
return proxy;
} else if (context.name == torrentpref) {
proxy = btProxy();
return proxy;
}
return proxy;
} else {
if (!routerHost(requestDetails.url)) {
if (localHost(requestDetails.url)) {
if (requestDetails.url.includes(':7669')) {
proxy = null;
} else if (requestDetails.url.includes(':7662')) {
proxy = null;
} else {
console.log(
'(proxy) non-routerconsole localhost url, will not interfere',
requestDetails.url
);
}
}
}
if (i2pHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
console.log(
"(proxy)",
context.name,
"Using",
proxy.type,
"proxy ",
proxy.host + ":" + proxy.port
);
return proxy;
} else if (context.name == webpref) {
if (localHost(requestDetails.url)) {
if (!routerHost(requestDetails.url)) {
proxy = {
type: "http",
host: "localhost",
port: "65535"
};
}
}
console.log(
"(proxy)",
context.name,
"Using",
proxy.type,
"proxy ",
proxy.host + ":" + proxy.port
);
return proxy;
}
}
if (!routerHost(requestDetails.url)) {
if (localHost(requestDetails.url)) {
console.log(
"(proxy) non-routerconsole localhost url, dropping",
requestDetails.url
);
proxy = {
type: "http",
host: "localhost",
port: "65535"
port: getPort(),
};
}
} else if (i2pHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
};
if (requestDetails.url.includes('rpc')){
console.log("(proxy for rpc url)", rpc)
}
//var tab = tabGet(requestDetails.tabId);
//tab.then(handleTabRequest,)
return proxy;
}
return proxy;
};
var contextGet = async function(tabInfo) {
try {
console.log("(proxy)Tab info from Function", tabInfo);
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
return context;
} catch (error) {
return "firefox-default";
console.error(error);
return 'firefox-default';
}
};
var tabGet = async function(tabId) {
try {
console.log("(proxy)Tab ID from Request", tabId);
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
console.log("(proxy)Tab error", error);
console.log('(proxy)Tab error', error);
}
};
if (proxyHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
}
if (requestDetails.originUrl == browser.runtime.getURL('security.html')) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
}
if (
requestDetails.cookieStoreId == 'firefox-default' ||
requestDetails.cookieStoreId == 'firefox-private'
) {
return browser.proxy.settings.get({});
}
if (requestDetails.tabId > 0) {
console.log("manifest", requestDetails);
if (requestDetails.url.includes('MuWire')) {
return;
}
if (proxyHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort()
port: getPort(),
};
return proxy;
} else if (extensionHost(requestDetails.url)) {
return;
} 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);
//console.log('(proxy)Returning I2P Proxy', proxy);
return proxy;
} else {
var tab = tabGet(requestDetails.tabId);
var context = tab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
console.log("(proxy)Returning I2P Proxy", proxy);
//console.log("(proxy)Returning I2P Proxy", proxy);
return proxy;
}
proxy = {};
/*proxy = {};
console.log("(proxy)Returning unset Proxy", proxy);
return proxy;
return proxy;*/
}
} catch (error) {
console.log("(proxy)Not using I2P Proxy.", error);
console.log('(proxy)Not using I2P Proxy.', error);
}
};
var proxy_scheme = "HTTP";
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");
console.log('Initialising Settings');
function onSetupError() {
console.log('Settings initialization error');
}
//
function checkSchemeStoredSettings(storedSettings) {
if (storedSettings.proxy_scheme != undefined) {
proxy_scheme = storedSettings.proxy_scheme;
} else {
proxy_scheme = "http";
storedSettings.proxy_scheme = proxy_scheme;
}
console.log("Initialising Proxy Scheme", storedSettings.proxy_scheme);
if (storedSettings.proxy_scheme == undefined)
storedSettings.proxy_scheme = 'http';
else proxy_scheme = storedSettings.proxy_scheme;
console.log('Initialising Proxy Scheme', storedSettings.proxy_scheme);
setupProxy();
}
var gettingSchemeStoredSettings = browser.storage.local.get("proxy_scheme");
gettingSchemeStoredSettings.then(checkSchemeStoredSettings, onError);
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);
if (storedSettings.proxy_host == undefined)
storedSettings.proxy_host = '127.0.0.1';
else proxy_host = storedSettings.proxy_host;
console.log('Initialising Host', storedSettings.proxy_host);
setupProxy();
}
var gettingHostStoredSettings = browser.storage.local.get("proxy_host");
gettingHostStoredSettings.then(checkHostStoredSettings, onError);
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);
if (storedSettings.proxy_port == undefined)
storedSettings.proxy_port = '4444';
else proxy_port = storedSettings.proxy_port;
console.log('Initialising Port', storedSettings.proxy_port);
setupProxy();
}
var gettingPortStoredSettings = browser.storage.local.get("proxy_port");
gettingPortStoredSettings.then(checkPortStoredSettings, onError);
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);
if (storedSettings.control_host == undefined)
storedSettings.control_host = '127.0.0.1';
else control_host = storedSettings.control_host;
console.log('Initialising Control Host', storedSettings.control_host);
setupProxy();
}
var gettingControlHostStoredSettings = browser.storage.local.get(
"control_host"
'control_host'
);
gettingControlHostStoredSettings.then(
checkControlHostStoredSettings,
onError
onSetupError
);
//
function checkControlPortStoredSettings(storedSettings) {
if (storedSettings.control_port != undefined) {
contro_port = storedSettings.control_port;
} else {
control_port = "7657";
storedSettings.control_port = control_port;
}
console.log("Initialising Control Port", storedSettings.control_port);
if (storedSettings.control_port == undefined)
storedSettings.control_port = '7657';
else control_port = storedSettings.control_port;
console.log('Initialising Control Port', storedSettings.control_port);
setupProxy();
}
var gettingControlPortStoredSettings = browser.storage.local.get(
"control_port"
'control_port'
);
gettingControlPortStoredSettings.then(
checkControlPortStoredSettings,
onError
onSetupError
);
//
function checkHistoryStoredSettings(storedSettings) {
if (storedSettings.disable_history != undefined) {
disable_history = storedSettings.disable_history;
} else {
disable_history = false;
storedSettings.disable_history = disable_history;
}
if (storedSettings.disable_history == undefined)
storedSettings.disable_history = false;
else disable_history = storedSettings.disable_history;
console.log(
"Initialising Disabled History",
'Initialising Disabled History',
storedSettings.disable_history
);
setupProxy();
}
var gettingHistoryStoredSettings = browser.storage.local.get(
"disable_history"
'disable_history'
);
gettingHistoryStoredSettings.then(checkHistoryStoredSettings, onError);
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;
if (proxy_scheme == 'HTTP') return 'http';
if (proxy_scheme == 'SOCKS') return 'socks';
if (proxy_scheme == 'http') return 'http';
if (proxy_scheme == 'socks') return 'socks';
else return 'http';
}
function getHost() {
if (proxy_host == undefined) {
proxy_host = "127.0.0.1";
proxy_host = '127.0.0.1';
}
return proxy_host;
}
@@ -309,74 +324,62 @@ function getHost() {
function getPort() {
if (proxy_port == undefined) {
var scheme = getScheme();
if (scheme == "socks") {
proxy_port = "4446";
} else {
proxy_port = "4444";
}
if (scheme == 'socks') proxy_port = '4446';
else proxy_port = '4444';
}
return proxy_port;
}
function getControlHost() {
if (control_host == undefined) {
return "127.0.0.1";
}
return control_host;
}
function getControlPort() {
function getConsolePort() {
if (control_port == undefined) {
return "7657";
var scheme = getScheme();
if (scheme == 'socks') proxy_port = '7657';
else control_port = '7657';
}
return control_port;
}
function setupProxy() {
//var controlHost = getControlHost();
//var controlPort = getControlPort();
//var Host = getHost();
//var Port = getPort();
//var Scheme = getScheme();
/**/
console.log("Setting up Firefox WebExtension proxy");
console.log('Setting up Firefox WebExtension proxy');
browser.proxy.onRequest.addListener(handleContextProxyRequest, {
urls: ["<all_urls>"]
urls: ['<all_urls>'],
});
console.log("i2p settings created for WebExtension Proxy");
/**/
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);
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");
console.log('updating settings from storage');
chrome.storage.local.get(function() {
SetupSettings();
update();
setupProxy();
});
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then(got => {
if (got.os != "android") {
browser.windows.getAll().then(wins => wins.forEach(themeWindow));
chrome.storage.local.get(function(got) {
SetupSettings();
update();
setupProxy();
});
} else {
chrome.storage.local.get(function(got) {
SetupSettings();
update();
setupProxy();
});
gettingInfo.then((got) => {
if (got.os != 'android') {
browser.windows.getAll().then((wins) => wins.forEach(themeWindow));
}
});
}
updateFromStorage();
browser.storage.onChanged.addListener(updateFromStorage);
SetupSettings();
setupProxy();
var gettingListenerInfo = browser.runtime.getPlatformInfo();
gettingListenerInfo.then((got) => {
browser.windows.onCreated.addListener(() => {
chrome.storage.local.get(function() {
setupProxy();
});
});
});

197
releases.atom Normal file
View File

@@ -0,0 +1,197 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US">
<id>tag:github.com,2008:https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases</id>
<link type="text/html" rel="alternate" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases"/>
<link type="application/atom+xml" rel="self" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases.atom"/>
<title>Release notes from I2P-in-Private-Browsing-Mode-Firefox</title>
<updated>2020-12-21T23:13:19Z</updated>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.95</id>
<updated>2020-12-21T23:21:35Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.95"/>
<title>0.95</title>
<enclosure url="magnet:?xt=urn:btih:7ec361c3ddc3fb904e369a19cdf4259af94af624" type="application/x-bittorrent" />
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.95-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix github &lt;a class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-id=&quot;763036769&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/issues/102&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/issues/102/hovercard&quot; href=&quot;https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/issues/102&quot;&gt;#102&lt;/a&gt; and &lt;a class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-id=&quot;763043125&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/issues/103&quot; data-hovercard-type=&quot;issue&quot; data-hovercard-url=&quot;/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/issues/103/hovercard&quot; href=&quot;https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/issues/103&quot;&gt;#103&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 21 DEC 2020 6:15:05 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.93-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.93</id>
<updated>2020-12-14T22:20:08Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.93"/>
<title>0.93</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.93-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emergency fix of the first one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 14 DEC 2020 5:18:53 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.91-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.91</id>
<updated>2020-12-14T19:47:59Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.91"/>
<title>0.91</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.91-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Exclude clearnet code hosting sites from scrub checks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 14 DEC 2020 2:46:23 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.89-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.89</id>
<updated>2020-12-13T19:11:13Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.89"/>
<title>0.89</title>
<content type="html">&lt;p&gt;============================&lt;/p&gt;
&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.89-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pages with lots of AJAX requests could trigger a performance degradation&lt;/li&gt;
&lt;li&gt;Improve performance of x-i2p-* headers and meta tags&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;i2psetproxy.js (0.87-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.87</id>
<updated>2020-12-06T18:37:57Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.87"/>
<title>0.87</title>
<content type="html">&lt;p&gt;Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.87-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disable searching for i2p sites in non-i2p search engines&lt;/li&gt;
&lt;li&gt;Add contexts for i2pbote and Dispatch&lt;/li&gt;
&lt;li&gt;Remain in tighter control of x-i2p-torrentlocation priority&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 10 NOV 2020 1:33:50 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.85-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.85</id>
<updated>2020-11-11T06:44:44Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.85"/>
<title>0.85</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.85-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix a bug which was causing i2psnark to fail to isolate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 10 NOV 2020 1:33:50 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.83-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.83</id>
<updated>2020-11-11T04:00:27Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.83"/>
<title>0.83</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.83-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a tab for I2P-Native Dispatch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 10 NOV 2020 22:00:01 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.81-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.81</id>
<updated>2020-11-08T02:44:34Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.81"/>
<title>0.81</title>
<content type="html">&lt;p&gt;Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.81-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;X-I2P-TorrentLocation header&lt;/li&gt;
&lt;li&gt;Visual tweaks&lt;/li&gt;
&lt;li&gt;Deprecate localhost browser container permanently&lt;/li&gt;
&lt;li&gt;Isolation rules improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 07 NOV 2020 21:34:25 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.79-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.79</id>
<updated>2020-09-26T03:36:46Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.79"/>
<title>0.79</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.79-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pin application tabs to the front of the tab order&lt;/li&gt;
&lt;li&gt;Refine pageaction behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Mon, 24 SEP 2020 20:18:03 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.77-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.77</id>
<updated>2020-09-25T00:19:45Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.77"/>
<title>0.77</title>
<content type="html">&lt;p&gt;Merge pull request &lt;a class=&quot;issue-link js-issue-link&quot; href=&quot;https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/pull/100&quot;&gt;#100&lt;/a&gt; from eyedeekay/bookmarks&lt;/p&gt;
&lt;p&gt;make the bookmarks part of a subdirectory&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
</feed>

151
script.js Normal file
View File

@@ -0,0 +1,151 @@
browser.runtime.onMessage.addListener((request) => {
var response = 'no-alt-location';
console.log(request);
if (request.req === 'i2p-location') {
var tag = document.querySelector('meta[http-equiv="i2p-location"]');
if (tag != undefined) {
console.log(tag);
if (tag) response = tag.content;
}
var tag = document.querySelector('meta[http-equiv="x-i2p-location"]');
if (tag != undefined) {
console.log(tag);
if (tag) response = tag.content;
}
}
if (request.req === 'i2p-torrentlocation') {
var tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
if (tag != undefined) {
console.log(tag);
response = i2pTorrent(tag);
}
var tag = document.querySelector(
'meta[http-equiv="x-i2p-torrentlocation"]'
);
if (tag != undefined) {
console.log(tag);
response = i2pTorrent(tag);
}
}
return Promise.resolve({ content: response });
});
window.document.onload = function (e) {
console.log("presetting x-i2p-torrentlocation");
var tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
if (tag != undefined) {
console.log(tag);
response = i2pTorrent(tag);
}
var tag = document.querySelector('meta[http-equiv="x-i2p-torrentlocation"]');
if (tag != undefined) {
console.log(tag);
response = i2pTorrent(tag);
}
};
console.log("presetting x-i2p-torrentlocation");
var tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
if (tag != undefined) {
console.log(tag);
response = i2pTorrent(tag);
}
var tag = document.querySelector('meta[http-equiv="x-i2p-torrentlocation"]');
if (tag != undefined) {
console.log(tag);
response = i2pTorrent(tag);
}
function i2pTorrent(tag) {
let response = "no-alt-location";
if (tag) {
response = tag.content;
var imgs = document.getElementsByTagName("img");
console.log("rewriting torrent link");
for (let img of imgs) {
let tmpsrc = new URL(img.src);
if (tmpsrc.host == location.host) {
img.src =
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname;
img.onerror = function () {
img.src = tmpsrc;
};
}
}
var videos = document.getElementsByTagName("video");
for (let video of videos) {
video.setAttribute("preload", "none");
let tmpsrc = new URL(video.currentSrc);
if (tmpsrc.host == location.host) {
if (!video.innerHTML.includes("127.0.0.1")) {
innerHTML = video.innerHTML;
topInnerHTML = video.innerHTML.replace(
'src="',
'src="http://127.0.0.1:7657/i2psnark/' + location.host + "/"
);
// let url = new URL("http://127.0.0.1:7657/i2psnark/"+location.host+"/"location.path)
console.log(
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname
); //+"/"location.path)
video.src =
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname;
video.innerHTML = topInnerHTML; // + innerHTML;
video.onerror = function () {
console.log("video error");
video.innerHTML = topInnerHTML + innerHTML;
};
}
}
}
var audios = document.getElementsByTagName("audio");
for (let audio of audios) {
audio.setAttribute("preload", "none");
let tmpsrc = new URL(audio.currentSrc);
if (tmpsrc.host == location.host) {
if (!audio.innerHTML.includes("127.0.0.1")) {
innerHTML = audio.innerHTML;
topInnerHTML = audio.innerHTML.replace(
'src="',
'src="http://127.0.0.1:7657/i2psnark/' + location.host + "/"
);
//console.log("http://127.0.0.1:7657/i2psnark/" + location); //.host+"/"location.path)
console.log(
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname
); //+"/"location.path)
audio.src =
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname;
audio.innerHTML = topInnerHTML; // + innerHTML;
audio.onerror = function () {
console.log("audio error");
audio.innerHTML = topInnerHTML + innerHTML;
};
}
}
}
var links = document.getElementsByTagName("a");
for (let link of links) {
let tmpsrc = new URL(link.href);
if (tmpsrc.host == location.host) {
if (
!tmpsrc.pathname.endsWith("html") &&
!tmpsrc.pathname.endsWith("htm") &&
!tmpsrc.pathname.endsWith("php") &&
!tmpsrc.pathname.endsWith("jsp") &&
!tmpsrc.pathname.endsWith("asp") &&
!tmpsrc.pathname.endsWith("aspx") &&
!tmpsrc.pathname.endsWith("atom") &&
!tmpsrc.pathname.endsWith("rss") &&
!tmpsrc.pathname.endsWith("/") &&
tmpsrc.pathname.includes(".")
) {
link.href =
"http://127.0.0.1:7657/i2psnark/" + tmpsrc.host + tmpsrc.pathname;
link.onerror = function () {
window.location.href = tmpsrc.href;
};
}
}
}
}
return response;
}

875
scrub.js

File diff suppressed because it is too large Load Diff

42
search.css Normal file
View File

@@ -0,0 +1,42 @@
.topnav {
overflow: hidden;
min-height: 3rem;
padding: .5rem;
min-width: 64%;
border-radius: 2px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
.topnav a {
float: left;
display: block;
text-align: center;
padding: 14px 16px
}
.topnav a:hover {
background-color: #ddd
}
.topnav a.active {
background-color: #2196f3;
color: #fff
}
.topnav input[type=search] {
padding: 6px;
border: none;
margin-top: 8px;
color: #e6e6e7;
margin-right: 16px
}
.topnav input[type=submit] {
float: right;
padding: 6px;
border: none;
margin-top: 8px;
color: #e6e6e7;
margin-right: 16px
}
#search-query {
color: #1f1a24
}
#search-submit {
color: #1f1a24
}

55
security.html Normal file
View File

@@ -0,0 +1,55 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="search.css" rel="stylesheet">
<link href="home.css" rel="stylesheet"><!--<link href="info.css" rel="stylesheet">--><!--<link href="torrent/popup.css" rel="stylesheet">-->
<title>
</title>
</head>
<body>
<div id="browserpanel">
<div class="panel">
<div class="section-header panel-section panel-section-header" id="headline">
<div class="text-section-header" id="text-section-header">
<h1 id="text-section-header">I2P Site Properties</h1>
</div>
</div>
</div>
<div class="panel">
<ul>
<li>
<div class="address-info">
<div id="addresstype">
<span id="TypeLabel">Address Type:</span> <span id="Type"></span>
<div id="TypeInfo">
<span id="AddressInfo"></span>
</div>
</div>
</div>
</li>
<li>
<div class="tls-info">
<div id="sitecert">
<span id="CertLabel">Certificate Information:</span> <span id="Cert"></span>
<div id="CertInfo">
<span id="AddressCertInfo"></span>
</div>
</div>
</div>
</li>
<li>
<div id="signingcert">
<span id="SignedLabel">Signed By:</span> <span id="Signed"></span>
</div>
</li>
</ul>
</div>
</div>
<script src="cert.js"></script>
</body>
</html>

23
sidebar.css Normal file
View File

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

86
toopie.html Normal file
View File

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

BIN
toopie.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

39
torrent.html Normal file
View File

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

19
torrent.js Normal file
View File

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

42
torrent/README.md Normal file
View File

@@ -0,0 +1,42 @@
Acknowledgement
===============
**Many, many thanks to the [Transmitter](https://github.com/myfreeweb/transmitter)
webextension.**
This part of this plugin contains code which was adapted from the Transmitter
webextension, which is a minimal interface to the transmission-rpc interfaces of
many torrent clients, including for our purposes snark-rpc and BiglyBT.
Transmitter is released under the UNLICENSE. An original copy is available at
this URL: https://github.com/myfreeweb/transmitter/blob/master/UNLICENSE
A copy has also been included in this directory.
Configuring this extension for use with Snark-RPC!
--------------------------------------------------
One of the coolest things this extension is able to do is communicate with
a transmission-rpc enabled torrent client. Since it's an I2P focused plugin,
the default configuration is set up for use with the I2PSnark-RPC plugin created
by zzz. Since Snark-RPC isn't part of the main Java I2P distribution, in order
to do this you'll have to install the plugin. You can get a copy of it from
inside of I2P here:
* [stats.i2p main package](http://stats.i2p/i2p/plugins/i2psnark-rpc.su3)
* [stats.i2p update package](http://stats.i2p/i2p/plugins/i2psnark-rpc-update.su3)
I also have a mirror of the package with each release of the webextension,
reflecting the version in use in the webextension at the time of the release.
To install the plugin, go to [http://127.0.0.1:7657/configplugins](http://127.0.0.1:7657/configplugins)
and scroll down to the section of the page where it says "Installation from URL"
and paste the following URL:
```http://stats.i2p/i2p/plugins/i2psnark-rpc.su3```
Click the "Install Plugin" button and you'll be ready to go. Now, open the
extension options menu, and just click "Save." The defaults are correct for use
with I2PSnark-RPC, but they need to be initialized by saving the settings. If
I2PSnark-RPC becomes part of Java I2P, these defaults will be initialized when
the plugin is installed.

24
torrent/UNLICENSE Normal file
View File

@@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>

247
torrent/background.js Normal file
View File

@@ -0,0 +1,247 @@
'use strict';
////// Session extraction
function setupExtractor() {
browser.webRequest.onHeadersReceived.removeListener(extractSession);
browser.storage.local.get('server').then(({ server }) => {
if (!server) {
return;
}
console.log('Session extractor setup for', server.base_url);
browser.webRequest.onBeforeSendHeaders.addListener(
extractSession,
{ urls: [server.base_url + '*'] },
['requestHeaders']
);
});
}
setupExtractor();
function extractSession(requestDetails) {
const hdr = requestDetails.requestHeaders.filter(
(x) => x.name.toLowerCase() === "x-transmission-session-id"
)[0];
if (!hdr) {
return;
}
browser.storage.local.get("server").then(({ server }) => {
server.session = hdr.value;
browser.storage.local.set({ server });
});
}
////// Adding
function blobToBase64(blob) {
return new Promise((resolve, reject) => {
const rdr = new FileReader();
rdr.onload = () => resolve(rdr.result.substr(rdr.result.indexOf(",") + 1));
rdr.onerror = reject;
rdr.readAsDataURL(blob);
});
}
function addUrl(torrentUrl, downloadDir) {
let p,
params = {};
if (downloadDir) {
params = { "download-dir": downloadDir };
}
if (torrentUrl.startsWith("magnet:")) {
console.log("Adding magnet", torrentUrl);
params.filename = torrentUrl;
p = rpcCall("torrent-add", params);
} else {
// Download the torrent file *in the browser* to support private torrents
console.log("Downloading torrent", torrentUrl);
p = fetch(torrentUrl, {
method: "GET",
credentials: "include",
})
.then((resp) => {
if (resp.ok) {
return resp.blob();
}
throw new Error("Could not download torrent");
})
.then(blobToBase64)
.then((b64) => {
params.metainfo = b64;
return rpcCall("torrent-add", params);
});
}
return p.then((x) => {
updateBadge();
return x;
});
}
////// magnet: Handler
function handleUrl(requestDetails) {
return addUrl(
decodeURIComponent(
requestDetails.url.replace("http://transmitter.web-extension/", "")
)
).then((x) => {
return browser.storage.local.get("server").then(({ server }) => {
return { redirectUrl: server.base_url + "web/" };
});
});
}
browser.webRequest.onBeforeRequest.addListener(
handleUrl,
{ urls: ["http://transmitter.web-extension/*"] },
["blocking"]
);
////// Context menu
function createContextMenu() {
browser.storage.local.get("server").then(({ server }) => {
browser.contextMenus.removeAll();
if (!server || !server.locations || !server.locations.length) {
browser.contextMenus.create({
id: "transmitter-add",
title: "Download with Transmission remote",
contexts: ["link"],
});
} else {
browser.contextMenus.create({
id: "transmitter-add",
title: "Download to Default location",
contexts: ["link"],
});
server.locations.forEach((location) => {
browser.contextMenus.create({
id: "transmitter-add-loc-" + location.index,
title: "Download to " + location.name,
contexts: ["link"],
});
});
}
});
}
createContextMenu();
browser.contextMenus.onClicked.addListener((info, tab) => {
if (info.menuItemId === "transmitter-add") {
return addUrl(info.linkUrl);
} else if (info.menuItemId.startsWith("transmitter-add-loc-")) {
let index = parseInt(info.menuItemId.substr("transmitter-add-loc-".length));
browser.storage.local.get("server").then(({ server }) => {
let path = server.locations[index].path;
addUrl(info.linkUrl, path);
});
}
});
////// Badge
function updateBadge() {
browser.storage.local.get("server").then(({ server }) => {
if (
server.badge !== "num" &&
server.badge !== "dl" &&
server.badge !== "ul" &&
server.badge !== "auto"
) {
return;
}
return rpcCall("session-stats", {}).then((response) => {
const args = response.arguments; // lol the name 'arguments' means destructuring in strict mode is impossible
switch (server.badge) {
case "num":
browser.browserAction.setBadgeBackgroundColor({ color: "gray" });
browser.browserAction.setBadgeText({
text: "" + args.activeTorrentCount,
});
break;
case "dl":
browser.browserAction.setBadgeBackgroundColor({ color: "green" });
browser.browserAction.setBadgeText({
text: formatSpeed(args.downloadSpeed),
});
break;
case "ul":
browser.browserAction.setBadgeBackgroundColor({ color: "blue" });
browser.browserAction.setBadgeText({
text: formatSpeed(args.uploadSpeed),
});
break;
case "auto":
if (args.downloadSpeed > 0) {
browser.browserAction.setBadgeBackgroundColor({ color: "green" });
browser.browserAction.setBadgeText({
text: formatSpeed(args.downloadSpeed),
});
} else if (args.uploadSpeed > 0) {
browser.browserAction.setBadgeBackgroundColor({ color: "blue" });
browser.browserAction.setBadgeText({
text: formatSpeed(args.uploadSpeed),
});
} else {
browser.browserAction.setBadgeBackgroundColor({ color: "gray" });
browser.browserAction.setBadgeText({
text: "" + args.activeTorrentCount,
});
}
break;
}
});
});
}
browser.alarms.onAlarm.addListener((alarm) => {
if (alarm.name === "transmitter-badge-update") {
return updateBadge();
}
});
function setupBadge() {
browser.alarms.clear("transmitter-badge-update").then((x) => {
browser.storage.local.get("server").then(({ server }) => {
if (!server) {
return;
}
browser.alarms.create("transmitter-badge-update", {
periodInMinutes: parseInt(server.badge_interval || "1"),
});
updateBadge();
});
});
}
setupBadge();
////// Storage updates
browser.storage.onChanged.addListener((changes, area) => {
if (!Object.keys(changes).includes("server")) {
return;
}
const oldv = changes.server.oldValue;
const newv = changes.server.newValue;
if (
!oldv ||
oldv.base_url !== newv.base_url ||
oldv.username !== newv.username ||
oldv.password !== newv.password ||
oldv.badge_interval !== newv.badge_interval ||
oldv.badge !== newv.badge ||
arraysEqualDeep(oldv.locations, newv.locations)
) {
setupExtractor();
setupBadge();
updateBadge();
createContextMenu();
}
});
function arraysEqualDeep(arr1, arr2) {
return JSON.stringify(arr1) !== JSON.stringify(arr2);
}

60
torrent/common.js Normal file
View File

@@ -0,0 +1,60 @@
'use strict';
////// RPC
function rpcCall(meth, args) {
return browser.storage.local.get(function(server) {
const myHeaders = {
'Content-Type': 'application/json',
'x-transmission-session-id': server.session,
};
//console.log("(torrent)", server.session)
if (server.username !== '' || server.btrpcpass !== '') {
myHeaders['Authorization'] =
'Basic ' +
btoa((server.username || '') + ':' + (server.btrpcpass || ''));
}
//console.log("(torrent) rpc", server.base_url);
return fetch(server.base_url + 'rpc', {
method: 'POST',
headers: myHeaders,
body: JSON.stringify({ method: meth, arguments: args }),
credentials: 'include', // allows HTTPS client certs!
})
.then(function(response) {
const session = response.headers.get('x-transmission-session-id');
if (session) {
browser.storage.local.get({}).then(function(storage) {
storage.session = session;
browser.storage.local.set(storage);
});
}
if (response.status === 409) {
return rpcCall(meth, args);
}
if (response.status >= 200 && response.status < 300) {
return response;
}
const error = new Error(response.statusText);
error.response = response;
throw error;
})
.then(function(response) {
return response.json();
});
});
}
////// Util
function formatSpeed(s) {
// Firefox shows 4 characters max
if (s < 1000 * 1000) {
return (s / 1000).toFixed() + 'K';
}
if (s < 1000 * 1000 * 1000) {
return (s / 1000 / 1000).toFixed() + 'M';
}
// You probably don't have that download speed…
return (s / 1000 / 1000 / 1000).toFixed() + 'T';
}

52
torrent/index.html Normal file
View File

@@ -0,0 +1,52 @@
<!DOCTYPE html>
<html>
<head>
<title>I2P in Private Browsing Mode</title>
<link rel="stylesheet" type="text/css" href="../home.css" />
<link rel="stylesheet" type="text/css" href="../sidebar.css" />
</head>
<body>
<h1>Acknowledgement</h1>
<p><strong>Many, many thanks to the <a href="https://github.com/myfreeweb/transmitter">Transmitter</a>
webextension.</strong></p>
<p>This part of this plugin contains code which was adapted from the Transmitter
webextension, which is a minimal interface to the transmission-rpc interfaces of
many torrent clients, including for our purposes snark-rpc and BiglyBT.</p>
<p>Transmitter is released under the UNLICENSE. An original copy is available at
this URL: https://github.com/myfreeweb/transmitter/blob/master/UNLICENSE</p>
<p>A copy has also been included in this directory.</p>
<h2>Configuring this extension for use with Snark-RPC!</h2>
<p>One of the coolest things this extension is able to do is communicate with
a transmission-rpc enabled torrent client. Since it's an I2P focused plugin,
the default configuration is set up for use with the I2PSnark-RPC plugin created
by zzz. Since Snark-RPC isn't part of the main Java I2P distribution, in order
to do this you'll have to install the plugin. You can get a copy of it from
inside of I2P here:</p>
<ul>
<li><a href="http://stats.i2p/i2p/plugins/i2psnark-rpc.su3">stats.i2p main package</a></li>
<li><a href="http://stats.i2p/i2p/plugins/i2psnark-rpc-update.su3">stats.i2p update package</a></li>
</ul>
<p>I also have a mirror of the package with each release of the webextension,
reflecting the version in use in the webextension at the time of the release.</p>
<p>To install the plugin, go to <a href="http://127.0.0.1:7657/configplugins">http://127.0.0.1:7657/configplugins</a>
and scroll down to the section of the page where it says "Installation from URL"
and paste the following URL:</p>
<p><code>http://stats.i2p/i2p/plugins/i2psnark-rpc.su3</code></p>
<p>Click the "Install Plugin" button and you'll be ready to go. Now, open the
extension options menu, and just click "Save." The defaults are correct for use
with I2PSnark-RPC, but they need to be initialized by saving the settings. If
I2PSnark-RPC becomes part of Java I2P, these defaults will be initialized when
the plugin is installed.</p>
</body>
</html>

162
torrent/popup.js Normal file
View File

@@ -0,0 +1,162 @@
'use strict';
var TrpcCall = async function(meth, args) {
const server = await browser.storage.local.get(null);
const myHeaders = {
'Content-Type': 'application/json',
'x-transmission-session-id': server.session,
};
console.log('(torrent) session', server.session);
if (server.username !== '' || server.btrpcpass !== '') {
myHeaders['Authorization'] =
'Basic ' + btoa((server.username || '') + ':' + (server.btrpcpass || ''));
}
let req_url = server.bt_rpc_host
if (server.bt_rpc_port != 0) req_url += ":"+server.bt_rpc_port
console.log('(torrent) rpcurl', req_url);
return fetch(req_url + 'rpc', {
method: 'POST',
headers: myHeaders,
body: JSON.stringify({ method: meth, arguments: args }),
credentials: 'include', // allows HTTPS client certs!
});
/*.then(function(response) {
console.log("(torrent) responses", response);
if (response.status === 409) {
return TrpcCall(meth, args);
}
if (response.status >= 200 && response.status < 300) {
return response;
}
const error = new Error(response.statusText);
error.response = response;
throw error;
});*/
}
const torrentsPane = document.getElementById('torrents-pane');
const configPane = document.getElementById('config-pane');
for (const opener of document.querySelectorAll('.config-opener')) {
opener.addEventListener('click', (e) => {
browser.runtime.openOptionsPage();
});
}
function showConfig(server) {
torrentsPane.hidden = true;
configPane.hidden = false;
}
const torrentsSearch = document.getElementById("torrents-search");
const torrentsList = document.getElementById("torrents-list");
const torrentsTpl = document.getElementById("torrents-tpl");
const torrentsError = document.getElementById("torrents-error");
const getArgs = {
fields: [
"name",
"percentDone",
"rateDownload",
"rateUpload",
"queuePosition",
],
};
let cachedTorrents = [];
function renderTorrents(newTorrents) {
if (torrentsList.children.length < newTorrents.length) {
const dif = newTorrents.length - torrentsList.children.length;
for (let i = 0; i < dif; i++) {
const node = document.importNode(torrentsTpl.content, true);
torrentsList.appendChild(node);
}
} else if (torrentsList.children.length > newTorrents.length) {
const oldLen = torrentsList.children.length;
const dif = oldLen - newTorrents.length;
for (let i = 1; i <= dif; i++) {
torrentsList.removeChild(torrentsList.children[oldLen - i]);
}
}
for (let i = 0; i < newTorrents.length; i++) {
const torr = newTorrents[i];
const cont = torrentsList.children[i];
const speeds =
"↓ " +
formatSpeed(torr.rateDownload) +
"B/s ↑ " +
formatSpeed(torr.rateUpload) +
"B/s";
cont.querySelector(".torrent-name").textContent = torr.name;
cont.querySelector(".torrent-speeds").textContent = speeds;
cont.querySelector(".torrent-progress").value = torr.percentDone * 100;
}
}
function searchTorrents() {
let newTorrents = cachedTorrents;
const val = torrentsSearch.value.toLowerCase().trim();
if (val.length > 0) {
newTorrents = newTorrents.filter((x) => x.name.toLowerCase().includes(val));
}
renderTorrents(newTorrents);
}
torrentsSearch.addEventListener("change", searchTorrents);
torrentsSearch.addEventListener("keyup", searchTorrents);
function refreshTorrents(server) {
console.log("(torrent) initiating", server);
return TrpcCall("torrent-get", getArgs).then(function (response) {
const session = response.headers.get("x-transmission-session-id");
if (session) {
browser.storage.local.get({}).then(function (storage) {
storage.session = session;
browser.storage.local.set(storage);
});
}
let sponse = response.json();
sponse.then(function (response) {
console.log("(torrent) refreshing", response);
let newTorrents = response.arguments.torrents;
newTorrents.sort((x, y) => y.queuePosition - x.queuePosition);
cachedTorrents = newTorrents;
torrentsSearch.hidden = newTorrents.length <= 8;
if (torrentsSearch.hidden) {
torrentsSearch.value = "";
renderTorrents(newTorrents);
} else {
searchTorrents();
}
});
});
}
function refreshTorrentsLogErr(server) {
return refreshTorrents(server).catch((err) => {
console.error(err);
torrentsError.textContent = "Error: " + err.toString();
});
}
function showTorrents(server) {
torrentsPane.hidden = false;
configPane.hidden = true;
for (const opener of document.querySelectorAll(".webui-opener")) {
opener.href = server.base_url + "web/";
}
console.log("(torrent) showing torrents");
refreshTorrents(server).catch((_) => refreshTorrentsLogErr(server));
setInterval(() => refreshTorrentsLogErr(server), 2000);
}
//let store =
browser.storage.local.get(function (server) {
console.log("(torrent) querying storage", server);
if (server && server.base_url && server.base_url !== "") {
showTorrents(server);
} else {
showConfig(server);
}
});

BIN
transmissionrpc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

View File

@@ -1,89 +1,159 @@
<!DOCTYPE html>
<html>
<head>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="home.css"/>
<link rel="stylesheet" href="info.css"/>
</head>
<link href="search.css" rel="stylesheet">
<link href="home.css" rel="stylesheet">
<link href="info.css" rel="stylesheet"><!--<link href="torrent/popup.css" rel="stylesheet">-->
<body>
<div class="panel">
<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>
<script src="context.js"></script>
<script src="privacy.js"></script>
<script src="info.js"></script>
<script src="content.js" crossorigin="anonymous"></script>
<script src="i2pcontrol/i2pcontrol.js"></script>
<title>
</title>
</head>
<body>
<div class="section-header panel-section panel-section-header" id="topbar">
<!--<div class="text-section-header" id="text-section-header">-->
<a href="#" id="browser-action"><img class="tabicon" height="32px" src="icons/browse.png" width="32px">Browse</a> <a href="#" id="torrent-action"><img class="tabicon" height="32px" src="icons/torrents.png" width="32px">Download</a> <!--</div>-->
</div>
<div id="browserpanel">
<div class="panel">
<div class="section-header panel-section panel-section-header" id="headline">
<div class="text-section-header">
<h1 id="text-section-header">The Invisible Internet Browser</h1>
</div>
</div>
<div class="search-info">
<div id="i2pbrowser-version">
</div>
<div class="topnav">
<a class="applicationName window-visit-homepage" href="#" id="window-visit-homepage" target="_blank">Home Page</a>
<form action="http://yacy.idk.i2p/yacysearch.html?" method="get">
<input id="search-query" name="query" placeholder="Search on yacy.idk.i2p(Opens a new tab)" type="search"> <input id="search-submit" text="Submit" type="submit">
</form>
</div>
<div class="hideIfI2PProxyOff" id="readyness">
<img class="readyness" src="http://proxy.i2p/themes/console/images/local_up.png"> <span id="proxy-check">Proxy is ready.</span>
</div>
<div id="i2pbrowser-description">
<p id="description">You are now able to use I2P in this browser.</p>
<button class="hidden" id="visit-irc">Visit IRC</button>
</div>
</div>
<div class="browser-info">
<p class="hideIfI2PConsoleOff">
</p>
<h3 id="controlHeader">Controls</h3>
<p id="controlExplain">These controls are used to tailor your I2P Browsing Experience</p>
<ul>
<!--<li class="application">
<a href="#" id="clear-browser-data">Clear Browsing Data:</a> <span class="applicationDesc" id="clear-desc">Use this to erase your browsing data.</span>
</li>
<li class="application"><input id="enable-web-rtc" name="enablewebrtc" type="checkbox" value="webrtc"> <label for="enable-web-rtc">Enable WebRTC <strong>with Proxy?</strong></label> <span class="applicationDesc" id="rtcDesc">WebRTC is disabled by default, but can be enabled by checking this box.</span></li>-->
<li class="application">
<div class="panel-section-separator">
</div>
<div class="panel-section-identity">
<div id="identity-list">
</div>
</div>
</li>
<li class="application"><input id="disable-history" name="disablehistory" type="checkbox" value="history"> <label for="disable-history">Disable History in I2P Tabs</label> <span class="applicationDesc" id="histDesc">History is automatically cleared when your I2P tabs are closed. If you want to clear history as you go, check this box.</span></li>
</ul>
</div>
<!--<div class="panel-section-separator">
</div>-->
<div class="application-info">
<p class="hideIfI2PConsoleOff">
</p>
<h3 id="applicationHeader">Applications</h3>
<p id="applicationExplain">These applications use I2P to provide them with security and privacy.</p>
<ul>
<li class="application"><button class="applicationName window-visit-homepage" href="#" id="window-visit-index" target="_blank">Help Page</button> <span class="applicationDesc" id="abouthome">For more information about this extension, go here:</span></li>
<li class="application"><button class="applicationName window-visit-toopie" href="#" id="window-visit-toopie" target="_blank">Toopie</button> <span class="applicationDesc" id="toopie">For information about your I2P router status, go here:</span></li>
<li class="application"><button class="applicationName" id="window-visit-i2ptunnel" target="_blank">Hidden Services Manager</button> <span class="applicationDesc" id="i2ptunnel">I2P has a web-based interface for configuring .i2p services like web sites, to set up your own web sites, go here:</span></li>
<li class="application"><button class="applicationName" id="window-visit-susimail" target="_blank">E-Mail</button> <span class="applicationDesc" id="susimail">I2P also bundles a webmail client which can be used to access in-I2P e-mail. To use it, go here:</span></li>
<li class="application"><button class="applicationName" id="window-visit-snark" target="_blank">BitTorrent</button> <span class="applicationDesc" id="snark">I2P is capable of anonymous Peer-to-Peer file sharing, to use the built-in bittorrent client go here:</span></li>
</ul>
</div>
</div>
</div>
<br>
<div id="torrentpanel">
<div class="panel" id="torrentstatus">
<div class="section-header panel-section panel-section-header">
<div class="text-section-header" id="text-section-torrents-header">
<h1>Torrent Downloads</h1>
</div>
</div>
<div id="config-pane">
<strong>Torrent RPC Configuration</strong>
<br>
The server address is not set yet.
<br>
<a class="config-opener" href="#">Open the settings</a> to continue.
</div>
<div id="torrents-pane">
<header>
<h1>Torrent Controls</h1>
<a class="webui-opener" href="#" target="_blank"><img alt="Open Web UI" src="images/i2plogo.png"></a> <!--<a class="config-opener" href="#">
<img alt="Settings" src="images/gear.svg"></a>
<a class="info-opener" href="https://github.com/myfreeweb/transmitter" target="_blank">
<img alt="Extension Info" src="images/info.svg"></a>-->
</header>
<input id="torrents-search" placeholder="Search…" type="search">
<template id="torrents-tpl">
<ul>
<li>
<div class="torrent-head">
<div class="torrent-name">
</div>
<div class="torrent-speeds">
</div>
</div>
<progress class="torrent-progress" max="100"></progress>
</li>
</ul>
</template>
<ul id="torrents-list">
</ul>
<div id="torrents-error">
</div>
</div>
</div>
</div>
<script src="context.js"></script>
<script src="privacy.js"></script>
<script src="i2pcontrol/i2pcontrol.js"></script>
<script src="info.js"></script>
<script crossorigin="anonymous" src="content.js"></script>
<script src="torrent/popup.js"></script>
<script src="torrent/common.js"></script>
</body>
</html>

BIN
x-i2p-torrentlocation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 KiB