303 Commits
0.93 ... master

Author SHA1 Message Date
eyedeekay
02502e3263 update debian changelog 2025-02-20 14:53:29 -05:00
eyedeekay
3e11daf91f Recreate context after clearing context 2025-02-20 14:50:55 -05:00
eyedeekay
c198bd1b7d mozilla release 2025-02-09 17:47:48 -05:00
eyedeekay
db1f8a11b5 Add changelog 2025-02-07 15:08:09 -05:00
eyedeekay
32a5c79818 Call onContextsGot when windows are created 2025-02-07 14:58:03 -05:00
eyedeekay
c5c7cc649e Fix flipped conditional 2025-02-07 14:57:17 -05:00
eyedeekay
bf641a4ff8 Refactor scrub.js 2025-01-14 18:42:49 -05:00
eyedeekay
c027a3d2ca Refactor in scrub.js, reformat in the rest of the javascript 2025-01-14 18:23:17 -05:00
eyedeekay
57eeef643e Refactor and document info/display elements 2025-01-14 15:52:37 -05:00
eyedeekay
0c9f5fefda refactor bookmarks.js 2025-01-14 15:30:04 -05:00
eyedeekay
81db1dde4f Refactor the configuration system for stability and clarity 2025-01-14 15:16:25 -05:00
eyedeekay
57a9122402 delete some stuff 2024-10-04 23:06:39 -04:00
eyedeekay
2975939027 purge i2psnark-rpc components 2024-10-04 22:26:07 -04:00
eyedeekay
09513a3f28 Remove i2psnark-RPC features that nobody used to put them in their own extension as well 2024-10-04 21:50:01 -04:00
eyedeekay
18e3bb3d3d Remove i2psnark-RPC features that nobody used to put them in their own extension as well 2024-10-04 21:46:31 -04:00
eyedeekay
9b8d27df4c start isolating i2pd specific parts 2024-10-04 21:37:54 -04:00
eyedeekay
a0eae354e7 purge toopie.html from the plugin 2024-10-04 21:14:27 -04:00
eyedeekay
34d243064e purge toopie.html from the plugin 2024-10-04 21:09:53 -04:00
eyedeekay
bd595dd519 sh release 2024-10-04 17:52:01 -04:00
eyedeekay
4f31ad999f mozilla release 2024-10-04 17:45:41 -04:00
eyedeekay
73da982e9e update changelog, bump version 2024-10-04 17:40:03 -04:00
eyedeekay
cc13ba833e update changelog, bump version 2024-10-04 17:39:34 -04:00
eyedeekay
bce9faac1c Only disable referrer headers when in I2P tabs 2024-10-02 23:52:24 -04:00
eyedeekay
8057002c3e Update version, remove redundant function/logging 2024-08-18 21:23:47 -04:00
eyedeekay
bfe4be952e Drop non-local I2P domains if they accidentally make it to firefox-default or firefox-private(not likely but probably worth blocking) 2024-08-02 19:09:06 -04:00
eyedeekay
86c69bb25b More cleanup, remove inelegant workarounds for mistaken domain names 2024-08-02 19:00:03 -04:00
eyedeekay
443e1ad9e0 De-spaghettify some more things 2024-07-28 22:47:17 -04:00
eyedeekay
f091ac5a2d Adds a ROADMAP 2024-07-18 15:54:09 -04:00
eyedeekay
4d934e4d2d fix typo 2024-07-10 14:28:10 -04:00
eyedeekay
76428c4f44 Update version 2024-07-10 13:39:45 -04:00
eyedeekay
7caf54b736 rework proxy error detections 2024-04-15 20:53:05 -04:00
eyedeekay
382111febd greatly simplify all the host-checkers by using proper URL() objects 2024-04-15 20:42:40 -04:00
eyedeekay
54a5d9550c use-submission-api, version bump 2023-12-26 13:44:16 -05:00
eyedeekay
e6066fa31f rm superfluous proxy error 2023-12-26 13:34:47 -05:00
eyedeekay
94e1eb657d Fix web-ext path 2023-12-26 13:34:25 -05:00
idk
93c215ce23 bump version again 2023-06-20 15:41:05 -04:00
idk
00353f5d7a fmt 2023-06-20 15:38:33 -04:00
idk
054348bfb0 fix proxy error page 2023-06-20 15:37:01 -04:00
idk
09640dac97 many, many small QOL bugfixes 2023-06-20 15:24:37 -04:00
idk
933f12e07a more cleanup and refactoring 2023-06-20 13:19:49 -04:00
idk
5bf171f266 refactor bookmarks.js 2023-06-20 10:37:28 -04:00
idk
6e420bbb3c pass URL back from fixURL even if URL is not a moz-extension URL 2023-06-11 15:35:01 -04:00
idk
e15a312b08 only reset the theme if we're resetting from one we own 2023-06-11 14:05:40 -04:00
idk
55229021ee only reset the theme if we're resetting from one we own 2023-06-11 14:03:27 -04:00
idk
c2de99d891 fix seed target 2023-06-11 00:21:36 -04:00
idk
2e2365edb5 update version and changelog 2023-06-10 23:53:46 -04:00
idk
c5148eb0c0 fix theme issue 2023-06-10 23:50:40 -04:00
idk
7ec23bfdad apply default URLs on initial isolations 2023-06-10 23:39:06 -04:00
idk
4f6f545c02 fix isolator spam on torrent isolator 2023-06-04 01:15:12 +00:00
idk
000b165114 fix snark tab discovery 2023-06-04 00:05:55 +00:00
idk
7f497ce0ad a better resolution for #37 or whatever it is on github 2023-06-03 19:43:41 +00:00
idk
e9c9d8730f get rid of old scrub version 2023-05-25 03:49:17 +00:00
idk
00b960fbd2 refactor options.js 2023-05-25 00:19:49 +00:00
idk
7c2171b43f refactor scrub-2.js some more, refactor host.js 2023-05-24 23:24:28 +00:00
idk
3df492c195 start refactored, revised scrub file 2023-05-23 17:36:37 +00:00
idk
ae88ded5b2 fix other eslint errors in i2pcontrol.js 2023-05-21 20:50:03 +00:00
idk
9a7c0ffc77 fix all the eslint issues in toopie.html 2023-05-21 20:34:34 +00:00
idk
a57429b513 fix index 2022-11-18 01:26:46 -05:00
idk
4e352d4dda deny caching when testing the HTTP proxy readiness 2022-11-09 14:38:01 -05:00
idk
ab645401c6 fmt, update changeog 2022-10-24 21:36:56 -04:00
idk
ab95aa0243 update again 2022-10-24 21:35:57 -04:00
idk
413494bc29 fmt, update changeog 2022-10-24 20:00:17 -04:00
idk
e0cd3dd5f1 fmt, update changeog 2022-10-24 19:57:51 -04:00
idk
d1aa9937b2 add beginnings of a CSP to manifestv3 2022-10-24 18:49:57 -04:00
idk
e1ea313c21 mark background scripts non-persistent 2022-10-24 17:31:22 -04:00
idk
f48930fbe9 restore manifest.json to desktop version, android still doesn't have the required APIs 2022-10-24 16:04:35 -04:00
idk
7a5c7e0377 push self-hosted version 2022-10-24 13:28:40 -04:00
idk
0ae6ca1840 optimizations for unsetTheme function 2022-10-16 22:59:18 -04:00
idk
d1e26f8354 optimizations for unsetTheme function 2022-10-16 22:58:48 -04:00
idk
b4f096d4ae fix validation errors in messages.json files 2022-10-16 21:39:11 -04:00
idk
de9c93028d fix validation errors in messages.json files 2022-10-16 21:36:23 -04:00
idk
3cb4526509 update version 2022-10-16 21:26:27 -04:00
idk
297badfe1d update changelog 2022-10-16 21:23:36 -04:00
idk
a0693fda90 update changelog 2022-10-16 21:23:01 -04:00
idk
25540417d6 update versions 2022-10-16 21:19:49 -04:00
idk
450731f200 fix ar, es translations 2022-10-16 21:03:19 -04:00
idk
495fc4700d checkin translations ru 2022-10-16 17:59:11 -04:00
idk
547aa30dac checkin translations pt 2022-10-16 17:51:01 -04:00
idk
3c349d85df checkin translations ja 2022-10-16 17:43:36 -04:00
idk
e2fb3b92c4 checkin translations it 2022-10-16 17:34:19 -04:00
idk
5080190dcb checkin translations de 2022-10-16 17:24:21 -04:00
idk
782c2a3176 checkin translations fr 2022-10-16 17:17:36 -04:00
idk
4d2f633296 checkin translations zh 2022-10-16 17:08:15 -04:00
idk
9dea9fc565 checkin translations ar 2022-10-16 17:00:03 -04:00
idk
b4805af152 update strings 2022-10-16 16:50:28 -04:00
idk
1c343c862c fmt, fix origin check on proxy.i2p check 2022-10-16 16:08:01 -04:00
idk
0ad9db2dc6 increment version in messages.json 2022-10-16 15:42:48 -04:00
idk
d6cf736508 increment version in messages.json 2022-10-16 15:37:01 -04:00
idk
3f338565fc fmt, string changes 2022-10-16 15:00:54 -04:00
idk
b65e6a1cdc fmt, string changes 2022-10-16 14:49:32 -04:00
idk
b2dcc444f8 checkin translations es 2022-10-15 23:39:08 -04:00
idk
a50d72cd08 checkin translations ru 2022-10-15 23:26:20 -04:00
idk
63ff000982 checkin translations pt 2022-10-15 23:19:35 -04:00
idk
b0c69ac2d0 checkin translations ja 2022-10-15 23:09:26 -04:00
idk
89e5d6f437 checkin translations it 2022-10-15 23:00:03 -04:00
idk
edaf060baf checkin translations de 2022-10-15 22:52:48 -04:00
idk
e40d8584b4 checkin translations fr 2022-10-15 22:44:45 -04:00
idk
c33f1bd49c checkin translations zh 2022-10-15 22:38:28 -04:00
idk
7ac239abce checkin translations ar 2022-10-15 22:29:48 -04:00
idk
0a66a38103 update strings 2022-10-15 22:21:15 -04:00
idk
a237116478 update strings 2022-10-15 22:20:39 -04:00
idk
968efec706 fix content wrap CSS on x-i2p-location page 2022-10-15 12:30:34 -04:00
idk
2b71462b79 fix css on pageActions 2022-10-08 17:35:07 -04:00
idk
62313871da simplify onboarding section lyout 2022-10-08 17:21:55 -04:00
idk
19b6c841a1 update PLAN.html 2022-10-07 23:03:00 -04:00
idk
4c82bd352b update GOALS.html 2022-10-07 23:02:56 -04:00
idk
ed37bd4129 update COLORS.html 2022-10-07 23:02:53 -04:00
idk
66abe0ea8f update index.html 2022-10-07 23:02:49 -04:00
idk
64f2b9af97 update PLAN.html 2022-10-07 23:00:53 -04:00
idk
79611fbc68 update GOALS.html 2022-10-07 23:00:50 -04:00
idk
26d886cd5a update COLORS.html 2022-10-07 23:00:46 -04:00
idk
d3d82d9215 update index.html 2022-10-07 23:00:43 -04:00
idk
05c071d00f update PLAN.html 2022-10-07 22:59:06 -04:00
idk
58f9948a8d update GOALS.html 2022-10-07 22:59:03 -04:00
idk
ef9a81bc60 update COLORS.html 2022-10-07 22:58:59 -04:00
idk
2c699d8eb0 update index.html 2022-10-07 22:58:54 -04:00
idk
b896f63be1 update PLAN.html 2022-10-07 22:24:33 -04:00
idk
4bc3aefbc9 update GOALS.html 2022-10-07 22:24:30 -04:00
idk
ee228c23dd update COLORS.html 2022-10-07 22:24:25 -04:00
idk
37687321ca update index.html 2022-10-07 22:24:21 -04:00
idk
c67184e88e fmt 2022-10-07 19:32:52 -04:00
idk
b2e3e7fcf0 update translation generator script 2022-10-07 19:30:57 -04:00
idk
d560cf3967 also allow proxy.i2p check in undefined(firefox-owned) tabs 2022-10-07 19:13:21 -04:00
idk
67fa1d6779 also allow proxy.i2p check in undefined(firefox-owned) tabs 2022-10-07 19:08:25 -04:00
idk
fe29771efd implement new translations 2022-10-07 13:26:09 -04:00
idk
a741b17f21 add new translations to pages 2022-10-07 11:06:05 -04:00
idk
c016efb72e checkin proxyinfo.js 2022-10-07 11:01:16 -04:00
idk
9d0417eceb check in translations 2022-10-07 05:26:41 -04:00
idk
c3cdf76faf checkin translations 2022-10-07 05:00:03 -04:00
idk
3f54f0127b checkin translations 2022-10-07 04:58:52 -04:00
idk
f0e8d45287 check in translations 2022-10-07 04:56:27 -04:00
idk
90b02b7857 checkin translations 2022-10-07 04:47:17 -04:00
idk
d741590bca checkin translations 2022-10-07 04:37:33 -04:00
idk
b02486bade checkin translations 2022-10-07 04:28:51 -04:00
idk
cf35ee04a4 check in translations 2022-10-07 04:26:13 -04:00
idk
8b1ee5fa8d checkin translations 2022-10-07 04:20:06 -04:00
idk
84e463164f check in translations 2022-10-07 03:56:02 -04:00
idk
1ae19ae4ae check in translations 2022-10-07 03:52:20 -04:00
idk
0a99cb5d06 check in translations 2022-10-07 03:51:18 -04:00
idk
14af9fe9a0 Add all the missing translation tags to the English language file 2022-10-07 03:10:35 -04:00
idk
71b77246d3 fmt 2022-10-05 17:11:17 -04:00
idk
ad9374088a fix proxy error page spam 2022-10-05 17:10:53 -04:00
idk
15893f5ff1 minor CSS tweaks 2022-10-04 12:11:14 -04:00
idk
25aeaa3a10 minor CSS tweaks 2022-10-04 12:10:54 -04:00
idk
9d7c46f90f update index.html 2022-10-03 20:51:04 -04:00
idk
4bfab8fae7 update content from i2pcontrol help page 2022-10-03 20:50:33 -04:00
idk
d7561573cd fmt 2022-10-03 20:48:20 -04:00
idk
e41987d700 move IRC presence check to own file 2022-10-03 20:48:08 -04:00
idk
dbe0c17143 fmt 2022-10-03 20:45:32 -04:00
idk
cbbb256970 tweak toopie.html to better accomodate very-narrow widths 2022-10-03 20:45:03 -04:00
idk
15be4e7372 Remove onboarding stuff from the proxy error page 2022-10-03 20:34:46 -04:00
idk
b4fd9ce204 Update images 2022-10-03 20:29:30 -04:00
idk
d6402191fd Update images 2022-10-03 20:29:14 -04:00
idk
57fef4a0c9 fix css for window.html 2022-10-03 20:18:09 -04:00
idk
5cc1ac3485 run formatters 2022-10-03 20:04:31 -04:00
idk
8016c5d20f change color of back panel on the sidebarAction 2022-10-03 20:02:36 -04:00
idk
e09c9c2c33 change color of back panel on the browserAction 2022-10-03 19:58:07 -04:00
idk
b9e950d949 check in new CSS, proxy-error page rules 2022-10-03 17:59:35 -04:00
idk
02e5a63d14 update PLAN.html 2022-10-03 02:05:44 -04:00
idk
ba67babcee update GOALS.html 2022-10-03 02:05:41 -04:00
idk
d6c351db60 update COLORS.html 2022-10-03 02:05:38 -04:00
idk
f6d0b38744 update index.html 2022-10-03 02:05:34 -04:00
idk
08fe8c6b17 fix project link 2022-10-03 02:04:28 -04:00
idk
28ac1e64ea update PLAN.html 2022-10-03 01:36:26 -04:00
idk
0424b73daa update GOALS.html 2022-10-03 01:36:23 -04:00
idk
4d84eeac4b update COLORS.html 2022-10-03 01:36:20 -04:00
idk
14b5aa0f3f update index.html 2022-10-03 01:36:17 -04:00
idk
beb2939067 Everything but the page itself for #83 2022-10-03 01:33:55 -04:00
idk
77fff0c754 Everything but the page itself for #83 2022-10-03 01:31:17 -04:00
idk
2fde749ff9 update index.html 2022-10-02 21:44:59 -04:00
idk
587d8c0d45 update PLAN.html 2022-10-02 21:26:25 -04:00
idk
7035445a48 update GOALS.html 2022-10-02 21:26:22 -04:00
idk
07c49fff04 update COLORS.html 2022-10-02 21:26:19 -04:00
idk
d24bcc0f3c update index.html 2022-10-02 21:26:15 -04:00
idk
e609638816 Define something saner than browser.theme.reset, unsetTheme, which will briefly disable all themes then re-enable the user's preferred theme which more-or-less fixes #105 2022-10-02 21:24:09 -04:00
idk
cb739e7d91 Partial workaround for #105, this will allow it to restore all aspects of a theme that are not images, because I can't reference the images inside the theme from inside my extension 2022-10-02 19:46:37 -04:00
idk
7648360a00 fix link to webextension index page on webextension home page 2022-10-02 17:15:11 -04:00
idk
09f6c0721e make it so the toopie.html links open toopie.html when BRB is already open also 2022-10-02 17:10:50 -04:00
idk
d84fd0141e decouple toopie.html stuff from sidebar stuff 2022-10-02 16:47:48 -04:00
idk
40cd4a869a css and onnboarding fixes 2022-10-02 15:42:52 -04:00
idk
49713fb604 Improve appearance of proxy indicator on homepage 2022-09-30 16:51:29 -04:00
idk
2afd8ca70c Changes for #124 and #121 2022-09-30 16:16:03 -04:00
idk
66f56b4375 change color of tab control headline 2022-09-30 12:21:45 -04:00
idk
dd43916bcf change text of new window and close-all tabs 2022-09-30 12:12:17 -04:00
idk
68f2de5702 unhide the readyness graphic when the content window is ready 2022-09-30 11:52:34 -04:00
idk
936e91aca8 make link next to search box a link to legwork, use b32 for legwork, use headline as new homepage link 2022-09-27 18:39:05 -04:00
idk
0178998fb3 fix debian changelog 2022-05-23 16:30:04 -04:00
idk
36b69ab52d bump version 2022-05-23 16:19:59 -04:00
idk
ad3d22c6bc Fix localizations 2022-05-09 14:13:28 -04:00
idk
458f20def6 fmt 2022-05-08 17:52:14 -04:00
idk
66a36d3e86 Add the ability to detect I2P+ routers too I guess. 2022-05-08 17:44:40 -04:00
idk
da3b6a553b add translations for ar, zh, fr, de, it, ja, pt, ru, revise translation for es 2022-05-08 17:18:54 -04:00
idk
306426ae3c add tor manager tab preferences 2022-02-15 21:16:57 -05:00
idk
2df3ccacf2 add tor manager tab preferences 2022-02-15 21:15:47 -05:00
idk
b0e57dd91a Update the page 2022-02-11 23:09:55 -05:00
idk
ff46fa5f80 Changelog 2022-02-11 20:29:40 -05:00
idk
29d7a0f776 Changelog 2022-02-11 20:29:00 -05:00
idk
4c3520bfd3 Decision is made. We're going to offer to change the homepage and give the user an opportunity to refuse if they want. 2022-02-11 20:25:24 -05:00
idk
8f1d150bad undo a change 2021-12-28 20:53:34 -05:00
idk
4e7381ece9 undo a change 2021-12-28 20:50:25 -05:00
idk
a911fc3126 fmt 2021-12-28 20:37:16 -05:00
idk
c58cf63027 merge 2021-12-28 20:36:17 -05:00
idk
a76e7299c7 Merge branch 'tab_text' into 'master'
fix tab text color

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!27
2021-12-29 01:25:40 +00:00
idk
26b637f201 fix tab text color 2021-12-28 20:22:33 -05:00
idk
c1b55a4feb Merge branch 'innet-updates' into 'master'
Auto-proxy on sites that specify a port

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!26
2021-12-29 01:15:38 +00:00
idk
80c66ba2f7 Auto-proxy on sites that specify a port 2021-12-28 20:13:12 -05:00
idk
6415ee2996 Merge pull request #116 from eyedeekay/fix-torrent-webui-button
fix Open WebUI button on torrent menu
2021-12-03 04:15:58 +00:00
idk
83b5dcc4b4 fix Open WebUI button on torrent menu 2021-12-02 20:45:42 -05:00
idk
26e0228687 Merge pull request #115 from eyedeekay/fix-proxy-check-reversal
address erroneous text issue #113
2021-12-03 01:23:51 +00:00
idk
73f2883fbd address erroneous text issue #113 2021-12-02 19:50:33 -05:00
idk
4d317eac4c Bump and resubmit again 2021-11-03 00:22:37 -04:00
idk
4755637206 fmt and resubmit 2021-10-30 10:12:24 -04:00
idk
b84d8945aa fmt and resubmit 2021-10-30 10:08:09 -04:00
idk
7e1428310b Try and cut a release with the new information from Mozilla. Add details about min Firefox version to readme 2021-10-13 21:29:25 -04:00
idk
7cc6dbfdf0 Try and cut a release with the new information from Mozilla. Add details about min Firefox version to readme 2021-10-13 21:27:02 -04:00
idk
e95d67db4b Try and cut a release with the new information from Mozilla. Add details about min Firefox version to readme 2021-10-13 21:25:54 -04:00
idk
a261f7875a bump changelog 2021-10-13 20:48:07 -04:00
idk
78141f2839 Try and cut a release with the new information from Mozilla. Add details about min Firefox version to readme 2021-10-13 20:46:17 -04:00
idk
75d23a752c make fmt 2021-10-13 20:43:39 -04:00
idk
03cc374c54 Bump strict_min_version to 91.1.0 so that I can release again, see https://discourse.mozilla.org/t/can-anyone-release-extensions-right-now-to-me-it-looks-like-addons-mozilla-org-is-critically-broken/84830/25 for the rising action of what appears to be at least a year of absurdity 2021-10-13 20:38:23 -04:00
idk
89f8496bb8 switch to legwork and release another version. 2021-10-04 20:41:20 -04:00
idk
15489b7f10 Bump version, update changelog 2021-10-01 15:48:07 -04:00
idk
3a67d00741 Fix tab.id check in http-equiv section 2021-10-01 15:07:33 -04:00
idk
d5a0edfd68 Add workaround to makefile 2021-10-01 14:33:11 -04:00
idk
1853292b99 browser.theme.reset does not work without a window.id, contrary to the Mozilla documentation. Themes just won't work on Android I think... 2021-10-01 14:30:41 -04:00
idk
f575f95ee2 make prettier 2021-10-01 14:16:15 -04:00
idk
97146391e8 Reverse application priority of header checks and http-equiv checks 2021-10-01 14:14:56 -04:00
idk
31af292a47 Prevent creation of multiple pinned tabs for a single application 2021-10-01 12:15:28 -04:00
idk
ac548b58b0 Merge branch 'android-compat' into 'master'
Make changes to allow upstream to manage android containers as well, but do...

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!25
2021-09-30 22:03:40 +00:00
idk
aa6a9a0da8 Make changes to allow upstream to manage android containers as well, but do not change manifest.json because we need all the entries for desktop firefox. 2021-09-30 18:00:30 -04:00
idk
7bfc4f8c66 create android-trunk branch 2021-09-30 16:46:20 -04:00
idk
ffc29deb8e bump strict_min_version 85 to shut up the linter 2021-09-26 14:55:10 -04:00
idk
78a01f6cc1 Bump version and prepare to bug Mozilla. 2021-09-26 00:37:45 -04:00
idk
d09bb59a1f Bump version and prepare to bug Mozilla. 2021-09-26 00:35:40 -04:00
idk
e2f8a439b6 Merge branch 'fix-brb-blog' into 'master'
Fix checks on blog and port containers

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!24
2021-09-26 04:27:17 +00:00
idk
95a282c07f Fix checks on blog and port containers 2021-09-26 00:23:48 -04:00
idk
02f3cc871d Wait until after we confirm it's an I2P site to set pageAction 2021-07-08 22:19:22 -04:00
idk
5d260c5a3e Well I guess moz-sign has to fail at release time now because amo is 504 when I try to cut a release 2021-07-08 14:40:24 -04:00
idk
b5758839e1 bump version and release 2021-07-07 23:27:43 -04:00
idk
a473da6a8e bump version and release 2021-07-07 22:58:55 -04:00
idk
75b4ff4b60 Merge pull request #111 from eyedeekay/code-cleanup
Code cleanup
2021-07-08 02:57:13 +00:00
idk
d3cf9e8686 bump strict-min-version so the validator shuts up, nobody's as far back as Firefox 60 right now 2021-07-07 22:53:14 -04:00
idk
7bd7701aeb Remove obsolete workaround to theme reset issue 2021-07-07 22:34:01 -04:00
idk
87c3a62f25 connection interrupted mid release, retry failed validation. Bump and retry 2021-07-07 22:01:36 -04:00
idk
4bc984a72d connection interrupted mid release, retry failed validation. Bump and retry 2021-07-07 21:58:30 -04:00
idk
7b6438dce5 fix some background-theme stuff 2021-07-07 21:55:35 -04:00
idk
80d5367fed Merge pull request #110 from eyedeekay/code-cleanup
Code cleanup
2021-07-08 01:42:55 +00:00
idk
a7902632bc Un-bump version, fix some issues with internationalization on releases 2021-07-07 21:40:53 -04:00
idk
199e6577bb bump version 2021-07-07 21:30:34 -04:00
idk
00fd0aed62 fmt-prettier 2021-07-07 21:28:06 -04:00
idk
daaebe027d add missing names to proxy.js 2021-07-07 15:15:45 -04:00
idk
3d39e75ffd mind our own business re: container tab proxy settings 2021-07-07 15:12:59 -04:00
idk
e013c093d8 Upgrade the version number to build a rhizome 2021-05-31 17:19:42 -04:00
idk
5b51fc2c27 add variant extension name 2021-05-31 15:09:23 -04:00
idk
65e43abe02 Remove a whole bunch of redundant code related to forcing a contextual identity to it's own function. Only Snark(Due to X-I2P-Torrentlocation) needs it's own isolator now, everybody else can use the same one. Makes it easier to add new contexts. 2021-05-28 14:20:57 -04:00
idk
7f810f86d0 update graphics for icons with the ones provided by @shoalsteed 2021-05-26 18:32:58 -04:00
idk
899974c339 Fix quotes, update for release 2021-05-26 18:21:12 -04:00
idk
6f30aeaf06 update graphics for icons with the ones provided by @shoalsteed 2021-05-26 17:25:41 -04:00
idk
d285063b4f add help pages for i2pcontrol and torrents 2021-05-26 15:11:46 -04:00
idk
ffa282671b update transmission-rpc screenshot 2021-05-26 13:15:33 -04:00
idk
e9acc1fe35 update changelog 2021-05-26 12:57:41 -04:00
idk
04ebfedb84 fix options pages 2021-05-26 12:55:34 -04:00
idk
23d451cf92 update site 2021-05-26 12:01:26 -04:00
idk
44628a1358 update site 2021-05-26 11:58:31 -04:00
idk
04782aa099 update site 2021-05-26 11:57:43 -04:00
idk
ff4302eb2b update screeenshots, add more screenshots 2021-05-26 11:32:35 -04:00
idk
9185a4daf2 add a context and proxy rules for railroad blog 2021-05-26 11:31:16 -04:00
idk
6b6a73dbdb update screeenshots, add more screenshots 2021-05-26 11:15:47 -04:00
idk
1729656189 add a context and proxy rules for railroad blog 2021-05-25 16:59:38 -04:00
idk
08b31efbfc Check proxy before extension URL 2021-05-24 15:41:51 -04:00
idk
e124d61115 Check proxy before extension URL 2021-05-24 15:41:17 -04:00
idk
e6e914cefe Check proxy before extension URL 2021-05-24 15:40:35 -04:00
idk
4d2e68f79d fix html 2021-05-24 15:35:35 -04:00
idk
b5bb8ec694 fix broken html 2021-05-24 15:29:02 -04:00
idk
f0651edb06 Merge pull request #107 from eyedeekay/thoroughly-delete-containers
Various Bugfixes
2021-05-24 11:08:12 -07:00
idk
49ce0162d1 update changelog 2021-05-24 14:06:23 -04:00
idk
153a49e18f some style fixes, issue with noscript when visiting susimail for the first time, ready for release 2021-05-24 14:03:11 -04:00
idk
88cc54217c some style fixes, issue with noscript when visiting susimail for the first time, ready for release 2021-05-24 13:58:44 -04:00
idk
83bb92c0cb some style fixes, issue with noscript when visiting susimail for the first time, ready for release 2021-05-24 13:57:37 -04:00
idk
f337e64b81 Merge branch 'secure-marking' into 'master'
Create icon for each indicating state in the toolbar(HTTPS, Bittorrent,...

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!23
2021-04-27 14:16:30 +00:00
idk
42f90273e2 prettier 2021-04-26 17:18:41 -04:00
idk
616d8429b7 Fix HTTPS marking, re-add http+i2p marking 2021-04-26 17:18:08 -04:00
idk
3261fd1505 fix Proxy Readyness visual indicator 2021-04-25 23:22:23 -04:00
idk
4ea8fd4826 start switching back to the old CSS which I liked better all along anyway, and which will be easier to make work in the future 2021-04-25 17:03:43 -04:00
idk
c899f7b1e7 Create icon for each indicating state in the toolbar(HTTPS, Bittorrent, HTTPS+Bittorrent, X-I2P-Location) with our own lock icons for .i2p sites, https .i2p sites 2021-04-25 16:18:41 -04:00
idk
02bc927262 Create icon for each indicating state in the toolbar(HTTPS, Bittorrent, HTTPS+Bittorrent, X-I2P-Location) with our own lock icons for .i2p sites, https .i2p sites 2021-04-25 16:05:07 -04:00
idk
5393d7f26f Add new lock icons for I2P and I2P HTTPS secured sites 2021-04-19 19:07:18 -04:00
idk
fa66c26b09 Merge branch 'themes-again' into 'master'
bump

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!22
2021-02-05 18:04:33 +00:00
idk
eec31ad3db bump 2021-02-05 13:03:30 -05:00
idk
3a770cb518 Merge branch 'themes-again' into 'master'
Themes again

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!21
2021-02-05 18:00:58 +00:00
idk
7de36bc86c bump 2021-02-05 13:00:15 -05:00
idk
c0bf732253 fix merge issues 2021-02-05 12:58:35 -05:00
idk
49948a524e fmt 2021-02-05 12:41:26 -05:00
idk
ac792dbcd5 fix x-i2p-torrentlocation bug 2021-02-01 12:55:39 -05:00
idk
db8508e75b Merge branch 'themes-again' into 'master'
fix the theme issue

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!20
2021-01-31 06:13:58 +00:00
idk
95e0642126 Merge branch 'rpc-over-i2p' into 'master'
Extensions run requests in what is effectively their own container for our...

See merge request idk/I2P-in-Private-Browsing-Mode-Firefox!19
2021-01-31 06:11:51 +00:00
idk
54b5be97e2 fix the theme issue 2021-01-31 01:07:14 -05:00
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
100 changed files with 13663 additions and 5614 deletions

0
.nojekyll Normal file
View File

253
COLORS.html Normal file
View File

@@ -0,0 +1,253 @@
<html>
<head>
<title>
I2P in Private B...
</title>
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p-in-private-browsing-mode-firefox" />
<meta name="keywords" content="master" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<div id="navbar">
<a href="#shownav">
Show navigation
</a>
<div id="shownav">
<div id="hidenav">
<ul>
<li>
<a href="..">
Up one level ^
</a>
</li>
<li>
<a href="index.html">
index
</a>
</li>
<li>
<a href="COLORS.html">
COLORS
</a>
</li>
<li>
<a href="GOALS.html">
GOALS
</a>
</li>
<li>
<a href="PLAN.html">
PLAN
</a>
</li>
<li>
<a href="home.html">
home.html
</a>
</li>
<li>
<a href="index.html">
index.html
</a>
</li>
<li>
<a href="location.html">
location.html
</a>
</li>
<li>
<a href="proxyerr.html">
proxyerr.html
</a>
</li>
<li>
<a href="sectorrent.html">
sectorrent.html
</a>
</li>
<li>
<a href="security.html">
security.html
</a>
</li>
<li>
<a href="toopie.html">
toopie.html
</a>
</li>
<li>
<a href="torrent.html">
torrent.html
</a>
</li>
<li>
<a href="window.html">
window.html
</a>
</li>
</ul>
<br>
<a href="#hidenav">
Hide Navigation
</a>
</div>
</div>
</div>
<a id="returnhome" href="/">
/
</a>
<h2>
WIP Style guidelines
</h2>
<h2>
Colors currently in use from CSS
</h2>
<pre><code> 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;
</code></pre>
<h2>
Colors currently in use from Javascript
</h2>
<pre><code> background.js:172: colors: {
background.js-173- frame: &quot;#FFC56D&quot;,
background.js-174- toolbar: &quot;#FFC56D&quot;
background.js-175- }
--
background.js:179: colors: {
background.js-180- frame: &quot;#FFC56D&quot;,
background.js-181- toolbar: &quot;#FFC56D&quot;
background.js-182- }
--
background.js:189: colors: {
background.js-190- frame: &quot;#A4C8E1&quot;,
background.js-191- toolbar: &quot;#A4C8E1&quot;
background.js-192- }
--
background.js:196: colors: {
background.js-197- frame: &quot;#A4C8E1&quot;,
background.js-198- toolbar: &quot;#A4C8E1&quot;
background.js-199- }
--
background.js:206: colors: {
background.js-207- frame: &quot;#D9D9D6&quot;,
background.js-208- toolbar: &quot;#D9D9D6&quot;
background.js-209- }
--
background.js:213: colors: {
background.js-214- frame: &quot;#D9D9D6&quot;,
background.js-215- toolbar: &quot;#D9D9D6&quot;
background.js-216- }
--
background.js:223: colors: {
background.js-224- frame: &quot;#F7E59A&quot;,
background.js-225- toolbar: &quot;#F7E59A&quot;
background.js-226- }
--
background.js:230: colors: {
background.js-231- frame: &quot;#F7E59A&quot;,
background.js-232- toolbar: &quot;#F7E59A&quot;
background.js-233- }
--
background.js:240: colors: {
background.js-241- frame: &quot;#A48FE1&quot;,
background.js-242- toolbar: &quot;#A48FE1&quot;
background.js-243- }
--
background.js:247: colors: {
background.js-248- frame: &quot;#A48FE1&quot;,
background.js-249- toolbar: &quot;#A48FE1&quot;
background.js-250- }
</code></pre>
<div id="sourcecode">
<span id="sourcehead">
<strong>
Get the source code:
</strong>
</span>
<ul>
<li>
<a href="https://github.com/eyedeekay/i2p-in-private-browsing-mode-firefox">
Source Repository: (https://github.com/eyedeekay/i2p-in-private-browsing-mode-firefox)
</a>
</li>
</ul>
</div>
<div>
<a href="#show">
Show license
</a>
<div id="show">
<div id="hide">
<pre><code>MIT License
Copyright (c) 2019 idk
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</code></pre>
<a href="#hide">
Hide license
</a>
</div>
</div>
</div>
<div>
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
</div>
<div>
<a href="https://geti2p.net/">
<img src="i2plogo.png"></img>
I2P
</a>
</div>
</body>
</html>

414
GOALS.html Normal file
View File

@@ -0,0 +1,414 @@
<html>
<head>
<title>
I2P in Private B...
</title>
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p-in-private-browsing-mode-firefox" />
<meta name="keywords" content="master" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<div id="navbar">
<a href="#shownav">
Show navigation
</a>
<div id="shownav">
<div id="hidenav">
<ul>
<li>
<a href="..">
Up one level ^
</a>
</li>
<li>
<a href="index.html">
index
</a>
</li>
<li>
<a href="COLORS.html">
COLORS
</a>
</li>
<li>
<a href="GOALS.html">
GOALS
</a>
</li>
<li>
<a href="PLAN.html">
PLAN
</a>
</li>
<li>
<a href="home.html">
home.html
</a>
</li>
<li>
<a href="index.html">
index.html
</a>
</li>
<li>
<a href="location.html">
location.html
</a>
</li>
<li>
<a href="proxyerr.html">
proxyerr.html
</a>
</li>
<li>
<a href="sectorrent.html">
sectorrent.html
</a>
</li>
<li>
<a href="security.html">
security.html
</a>
</li>
<li>
<a href="toopie.html">
toopie.html
</a>
</li>
<li>
<a href="torrent.html">
torrent.html
</a>
</li>
<li>
<a href="window.html">
window.html
</a>
</li>
</ul>
<br>
<a href="#hidenav">
Hide Navigation
</a>
</div>
</div>
</div>
<a id="returnhome" href="/">
/
</a>
<h1>
These are the goals of the I2P Browser, and not really this plugin in-and-of-itself
</h1>
<p>
A
</p>
<h2>
User Interface:
</h2>
<ul>
<li>
Remove search engines
</li>
<li>
Replace bookmarks
</li>
<li>
Donate banner / UI
</li>
<li>
Patch Firefox to have relative (from the binary) profile directory
</li>
<li>
Start use the Firefox update process to update browser installations
</li>
<li>
Mark .i2p cookies as secure
</li>
<li>
Mark .i2p domains as secure connection
</li>
<li>
Add tests for .i2p secure marking
</li>
<li>
Improve the delay-the-user XUL dialogs to be more accurate in regards
of where the router is in its bootup progress
</li>
<li>
Disable the WebIDE
</li>
<li>
Disable GamePad API by default
</li>
<li>
Disable Web Speech API by default
</li>
<li>
Disable the Web Audio API by default
</li>
<li>
UI redesign bootstrapping and configuration screens (delay-the-user dialogs)
</li>
<li>
Default browser choose wining should de disabled like
browser.shell.checkDefaultBrowser, it can be default, but then
choosen by the user without any begging ahead
</li>
<li>
Extend the firefox preferences UI for I2P router configuration thought
of as &ldquo;must have&rdquo; or &ldquo;very nice to have&rdquo;
</li>
<li>
Shrink the BroadcastChannel API&rsquo;s boundaries of access or disable completely
</li>
<li>
Make a API white/grey/black -list, in super paranoia mode we should
probably disable almost all, while in most cases the user probably want
to be as close to a normal browser/web experinence that
they are used to from before
</li>
</ul>
<h2>
Leak Avoidance:
</h2>
<ul>
<li>
Stop web socket DNS leak
</li>
<li>
If doable, slim down the CA store from unnecessary CAs
</li>
<li>
Disable the microphone by default
</li>
<li>
Ensure WebRTC is disabled in compile time
</li>
<li>
Disable mDNS features
</li>
<li>
Ensure links like sftp:// and smb:// ,
as well as \samba-share is blocked/denied
</li>
<li>
Dont allow IndexedDB storage for third party domains (likability issue)
</li>
<li>
Patch the DNS service to prevent any browser or addon DNS resolution
</li>
<li>
Restrict what MIME types that are exposed to content scripts
</li>
</ul>
<h2>
General Security:
</h2>
<ul>
<li>
Backport any security patches that might appear from Mozilla
</li>
<li>
Dont allow XHR/Websockets requests towards 127.0.0.1/localhost
</li>
<li>
Always use the most sane form of preferences defaults in context
of privacy and security.
</li>
</ul>
<h2>
Unnecessary Connections:
</h2>
<ul>
<li>
Disable getpocket.com features and alike
</li>
<li>
Remove sync option from preferences
</li>
<li>
Clear state when the app exits, by default
</li>
<li>
Disable updater telemetry
</li>
<li>
Make firefox stop call home to mozilla for different reasons
</li>
<li>
Prevent non-Necko network connections
</li>
<li>
Figure out how to approach prerender, preconnect, and prefetch link tags
</li>
</ul>
<h2>
Disk Avoidance:
</h2>
<ul>
<li>
Dont allow SSL key logging
</li>
<li>
Only cache media in memory
</li>
<li>
Disable the password saving functionality to avoid such being written to disk
</li>
<li>
Disable the Auto form-fill to keep as much as possible not written to disk
</li>
</ul>
<h2>
Platforms:
</h2>
<ul>
<li>
Support for Android?
</li>
<li>
Support for iOS?
</li>
</ul>
<h2>
Anti-Fingerprinting:
</h2>
<ul>
<li>
Test for preferences which ensures a sane default and
something to tell when/if we break it
</li>
<li>
Disable support for system adding
</li>
<li>
Disable Firefox enterprise policies
</li>
<li>
Disable NTLM authentication
</li>
<li>
Disable SPNEGO authentication
</li>
<li>
Handle privacy issues regarding window.name
</li>
<li>
Test runner for I2P Browser test cases
</li>
<li>
Block loading of plugins
</li>
<li>
Disable OS spesific firefox features that can help fingerprint
the end user&rsquo;s operating system
</li>
<li>
Block html5 canvas by default
</li>
<li>
Block by default or disable WebGL completely?
</li>
<li>
Never start fullscreen, always start with fixed width/height to
avoid expose screen resolution
</li>
<li>
Report fake system uptime to content scripts
</li>
<li>
Spoof Accept-Language and Accept-Charset headers no matter browser language
</li>
<li>
Spoof timezone to always be UTC
</li>
<li>
Develop methods to reduce the accuracy of JavaScript
performance fingerprinting
</li>
<li>
Always report only one CPU core (dom.maxHardwareConcurrencys)
</li>
<li>
Avoid Keystroke fingerprinting by messing with the event resolution
</li>
<li>
Disable GeoIP-based search results
</li>
</ul>
<h2>
???
</h2>
<ul>
<li>
SVG drawing
</li>
<li>
MathML drawing
</li>
<li>
I2Pd flavor
</li>
</ul>
<div id="sourcecode">
<span id="sourcehead">
<strong>
Get the source code:
</strong>
</span>
<ul>
<li>
<a href="https://github.com/eyedeekay/i2p-in-private-browsing-mode-firefox">
Source Repository: (https://github.com/eyedeekay/i2p-in-private-browsing-mode-firefox)
</a>
</li>
</ul>
</div>
<div>
<a href="#show">
Show license
</a>
<div id="show">
<div id="hide">
<pre><code>MIT License
Copyright (c) 2019 idk
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</code></pre>
<a href="#hide">
Hide license
</a>
</div>
</div>
</div>
<div>
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
</div>
<div>
<a href="https://geti2p.net/">
<img src="i2plogo.png"></img>
I2P
</a>
</div>
</body>
</html>

151
Makefile
View File

@@ -37,11 +37,10 @@ clean: rc clean-artifacts
## EVEN RELEASES are AMO RELEASES
## ODD RELEASES are SELFHOSTED RELEASES
MOZ_VERSION=0.94
VERSION=0.93
MOZ_VERSION=2.8.2
VERSION=2.8.3
## INCREMENT THIS EVERY TIME YOU DO A RELEASE
LAST_VERSION=0.91
LAST_VERSION=$(shell grep '"version"' manifest.json | sed 's|"version"||g' | tr -d " :,'" | tr -d '"')
YELLOW=F7E59A
ORANGE=FFC56D
@@ -50,6 +49,7 @@ BLUE=A4C8E1
PURPLE=A48fE1
colors:
@echo "'$(LAST_VERSION)'"
@echo " yellow $(YELLOW) \n orange $(ORANGE) \n grey $(GREY) \n blue $(BLUE) \n purple $(PURPLE)"
amo-readme:
@@ -64,7 +64,7 @@ amo-readme:
sed 's|</h3>|</strong>|g' | \
grep -v '<img' > amo-index.html
MAGNET=`torrent2magnet i2ppb@eyedeekay.github.io.xpi.torrent`
MAGNET=`rhash --magnet i2ppb@eyedeekay.github.io.xpi.torrent`
index:
@echo "<!DOCTYPE html>" > index.html
@@ -75,7 +75,9 @@ index:
@echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"sidebar.css\" />" >> index.html
@echo "</head>" >> index.html
@echo "<body>" >> index.html
@echo "<div class=\"content\" id=\"browserpanel\">" >> index.html
sed "s|magnetsub|[Magnet Link]($(MAGNET))|g" README.md | sed 's|README.md|index.html|g' | markdown >> index.html
@echo "</div>" >> index.html
@echo "</body>" >> index.html
@echo "</html>" >> index.html
@@ -95,23 +97,14 @@ torrenthelp:
xpi: getxpi
version:
sed -i 's|7647|7657|g' *.js* torrent/*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)\",|g' manifest.json
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)\",|g' manifest.json
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
sed -si 's|$(shell grep $(MOZ_VERSION) _locales/en/messages.json)| "message": "$(VERSION)",|g' _locales/en/messages.json; true
find . -name '*.json' -exec sed -i 's|$(LAST_VERSION)|$(VERSION)|g' {} \;
find . -name '*.json' -exec sed -i 's|$(MOZ_VERSION)|$(VERSION)|g' {} \;
moz-version:
sed -i 's|7647|7657|g' *.js* torrent/*.js*
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(MOZ_VERSION)\",|g' manifest.json
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(MOZ_VERSION)\",|g' manifest.json
sed -si 's|$(shell grep $(LAST_VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
sed -si 's|$(shell grep $(VERSION) _locales/en/messages.json)| "message": "$(MOZ_VERSION)",|g' _locales/en/messages.json; true
find . -name '*.json' -exec sed -i 's|$(LAST_VERSION)|$(MOZ_VERSION)|g' {} \;
find . -name '*.json' -exec sed -i 's|$(VERSION)|$(MOZ_VERSION)|g' {} \;
rhz-version:
sed -i 's|$(shell grep "\"version\": " manifest.json)| \"version\": \"$(VERSION)1\",|g' manifest.json
# sed -i 's|$(shell grep "\"version_name\": " manifest.json)| \"version_name\": \"$(VERSION)1-rhizome\",|g' manifest.json
sed -i 's|7657|7647|g' *.js* torrent/*.js*
zip: version
zip --exclude="./i2ppb@eyedeekay.github.io.xpi" \
@@ -135,19 +128,22 @@ rc:
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
cat desc debian/changelog | grep -B 10 "$(LAST_VERSION)" | github-release 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
cat desc debian/changelog | grep -B 10 "$(LAST_VERSION)" | github-release edit -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n $(VERSION) -d -; true
delete-release:
gothub delete -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION); true
github-release 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
moz-release: release moz-submit
#upload-xpi torrent upload-torrent deb upload-deb upload-rss seed
full-sign: moz-sign upload-xpi torrent upload-torrent deb upload-deb upload-rss seed
WEB_EXT_API_KEY=AMO_KEY
WEB_EXT_API_SECRET=AMO_SECRET
@@ -168,7 +164,7 @@ moz-sign: version clean-artifacts
@echo "Using the 'sign' target to instantly sign an extension for self-distribution"
@echo "requires a JWT API Key and Secret from addons.mozilla.org to be made available"
@echo "to the Makefile under the variables WEB_EXT_API_KEY and WEB_EXT_API_SECRET."
$(HOME)/node_modules/web-ext-submit/extender.sh --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET)
$(HOME)/node_modules/.bin/web-ext sign --use-submission-api --channel unlisted --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET) --timeout 900000 #--api-url-prefix http://localhost:3000/api/v4
make copyss
sleep 5
@@ -182,7 +178,7 @@ moz-submit: moz-version
@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
$(HOME)/node_modules/.bin/web-ext sign --use-submission-api --channel listed --config-discovery false --api-key $(WEB_EXT_API_KEY) --api-secret $(WEB_EXT_API_SECRET) --timeout 900000 --verbose; true #--api-url-prefix http://localhost:3000/api/v4
sleep 5
mv .manifest.json manifest.json
@@ -191,11 +187,11 @@ 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."
#$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
#$PWD/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
github-release 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
@@ -205,36 +201,6 @@ torrent: getxpi
-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 \
@@ -243,23 +209,23 @@ torrent: getxpi
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"
github-release 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 I2P-in-Private-Browsing-Mode-Firefox -t $(VERSION) -n "i2ppb@eyedeekay.github.io.xpi" -f "../i2ppb@eyedeekay.github.io.xpi"
github-release 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 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"
github-release 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"
github-release 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"
github-release 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"
github-release 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"
github-release 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"
github-release 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"
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
github-release release -p -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Documentation" -d "PDF's and text about the extension"; true
github-release upload -R -u eyedeekay -r I2P-in-Private-Browsing-Mode-Firefox -t docs -n "Landing Page Documentation.pdf" -f ../smartlander.pdf
github-release 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
@@ -274,18 +240,22 @@ 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 torrent/*.js
#fixjsstyle i2pcontrol/*.js
fixjsstyle manifest.json
#work around fixjsstyle issue
sed -i 's|= >|=>|g' *.js */*.js
#find . -path ./node_modules -prune -o -name '*.json' -exec fixjsstyle --write {} \;
fmt-locales:
find _locales -name '*.js*' -exec $(HOME)/node_modules/.bin/prettier -w {} \;
fmt-prettier:
find . -name '*.js*' -exec $(HOME)/node_modules/.bin/prettier -w {} \;
@@ -322,46 +292,29 @@ rss: torrent
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
github-release 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
github-release 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"
mkdir -p profile
$(HOME)/node_modules/.bin/web-ext run --firefox /usr/bin/firefox --firefox-profile ./profile -u "about:devtools-toolbox?type=extension&id=i2ppb%40eyedeekay.github.io" http://idk.i2p http://localhost:7657 https://github.com/i2p/i2p.i2p https://i2pgit.org/i2p-hackers/i2p.i2p
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
github-release 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
github-release 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/"
android:
$(HOME)/node_modules/.bin/web-ext run \
--target firefox-android \
--android-device HT78N1A00453 \
--firefox-apk org.mozilla.fenix
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
run: webext

247
PLAN.html Normal file
View File

@@ -0,0 +1,247 @@
<html>
<head>
<title>
I2P in Private B...
</title>
<meta name="author" content="eyedeekay" />
<meta name="description" content="i2p-in-private-browsing-mode-firefox" />
<meta name="keywords" content="master" />
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="showhider.css" />
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<div id="navbar">
<a href="#shownav">
Show navigation
</a>
<div id="shownav">
<div id="hidenav">
<ul>
<li>
<a href="..">
Up one level ^
</a>
</li>
<li>
<a href="index.html">
index
</a>
</li>
<li>
<a href="COLORS.html">
COLORS
</a>
</li>
<li>
<a href="GOALS.html">
GOALS
</a>
</li>
<li>
<a href="PLAN.html">
PLAN
</a>
</li>
<li>
<a href="home.html">
home.html
</a>
</li>
<li>
<a href="index.html">
index.html
</a>
</li>
<li>
<a href="location.html">
location.html
</a>
</li>
<li>
<a href="proxyerr.html">
proxyerr.html
</a>
</li>
<li>
<a href="sectorrent.html">
sectorrent.html
</a>
</li>
<li>
<a href="security.html">
security.html
</a>
</li>
<li>
<a href="toopie.html">
toopie.html
</a>
</li>
<li>
<a href="torrent.html">
torrent.html
</a>
</li>
<li>
<a href="window.html">
window.html
</a>
</li>
</ul>
<br>
<a href="#hidenav">
Hide Navigation
</a>
</div>
</div>
</div>
<a id="returnhome" href="/">
/
</a>
<p>
The I2P Browser has made strides at improving users anonymity when browsing
the anonymous web inside of I2P. However, it has in many ways simply re-hashed
the existing work of Tor on the Tor Browser. This is mostly a good thing, but it
is unfortunate because in a sense we have failed to add I2P specific features
that could improve the user experience and set us apart from the Tor Browser.
</p>
<p>
I think that moving forward, we should try to extend the functionality of I2P
Browser into more I2P-specific realms and make an effort to make those things
more accessible and highlight that they are in use. I don&rsquo;t really know how to
explain what I mean without describing what I want to do, so
</p>
<h2>
Let&rsquo;s avoid
<em>
adding
</em>
features to i2pbutton
</h2>
<p>
i2pbutton contains alot of code from Tor which even they don&rsquo;t really want to
maintain. It&rsquo;s dying the same long, slow death it&rsquo;s always been dying, since
back before there was a Tor Browser and torbutton was just an easy way to
configure Tor in your Firefox browser. I don&rsquo;t relish the thought of being one
the last two groups on the planet maintaining an XUL extension, so I think that
we should always be trying to do less with i2pbutton and more with a modern
extension. Other advantages of modern extensions are better debugging tools
and easier-to-use, more understandable API&rsquo;s for doing the following other
things.
</p>
<h2>
Contexts for Security and Placing Router Applications under their own Origin
</h2>
<p>
It is possible, however unlikely, for an attack on a local service or a router
plugin to leak information about what&rsquo;s going on on the router console because
they will share the same origin. We can resolve this issue, though, by placing
applications each into their own origin under a so-called &ldquo;Container Tab,&rdquo;
completely separating eepWeb traffic and Router Console administration. The
origin of the application will be the same as the part of the application URL
<em>
after
</em>
localhost:7657, so for instance &ldquo;
<a href="http://localhost:7657/torrents&quot;">
http://localhost:7657/torrents&rdquo;
</a>
would become just &ldquo;torrents&rdquo; in the URL bar and have that origin.
</p>
<h2>
Dynamic Themes
</h2>
<p>
Since I2P Browsing and Router Console Administration are going to be separated
to their own contextual identities, we can manipulate the appearance of the
Firefox browser to accomplish 2 things: We can indicate which context we are in
both by manipulating the UI text and color, and manipulate UI elements based on
what context we&rsquo;re in or even what URL(In the router console) we&rsquo;re on. We can
use this to make router console applications appear more tightly integrated with
the functionality of the browser. It&rsquo;s kind of obliquely like how many
applications are written with user-interfaces that are actually just
browsers(Including Mattermost), but with us using the whole browser,
acknowledging it&rsquo;s presence and utility but quite literally highlighting(in
color) our unique features. So for instance, when the user is using snark it
could change color to match snark and change text to say &ldquo;Torrent Client.&rdquo;
</p>
<h2>
Application Integration - Torrents
</h2>
<p>
I2P&rsquo;s strengths are in it&rsquo;s applications, but many users never even make it to
the applications, and even if they do, the I2P applications often lack the
familiar workflows that people are used to. For instance, when one downloads
a torrent on the non-anonymous internet, you simply click a link and the browser
&ldquo;Handles&rdquo; the link, automatically launching the torrent client, adding the
torrent, and sometimes prompting the user for more actions. This isn&rsquo;t possible
yet with i2psnark and an external browser, but in I2P browser we can write a
&ldquo;Protocol Handler&rdquo; which talks to snark-rpc, replicating the ease of just
clicking a torrent link to automatically add it to a torrent client. Of course
that does require us to bundle the snark-rpc plugin. Besides that, once we&rsquo;ve
added the torrent, we can keep talking to snark-rpc to keep track of the
download progress and display information about that in the already-available
Firefox downloads menu that users are already familiar with, so that they can
keep track of the files they are downloading after navigating away from the
snark interface, or perhaps even without needing to interact with snark at all.
</p>
<div id="sourcecode">
<span id="sourcehead">
<strong>
Get the source code:
</strong>
</span>
<ul>
<li>
<a href="https://github.com/eyedeekay/i2p-in-private-browsing-mode-firefox">
Source Repository: (https://github.com/eyedeekay/i2p-in-private-browsing-mode-firefox)
</a>
</li>
</ul>
</div>
<div>
<a href="#show">
Show license
</a>
<div id="show">
<div id="hide">
<pre><code>MIT License
Copyright (c) 2019 idk
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</code></pre>
<a href="#hide">
Hide license
</a>
</div>
</div>
</div>
<div>
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
</div>
<div>
<a href="https://geti2p.net/">
<img src="i2plogo.png"></img>
I2P
</a>
</div>
</body>
</html>

View File

@@ -1,14 +1,19 @@
I2P in Private Browsing Mode(Firefox-Only)
==========================================
- **This extension requires a running I2P Router on the Host System**
- [**This extension comes pre-installed in the Easy-Install Beta for Windows**](https://geti2p.net/en/download/easyinstall)
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.
to Firefox-based browsers(Supporting webextensions, must be current ESR or
greater) 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 and via in-browser protocol handling
integrations.
Privacy Policy
--------------
@@ -20,7 +25,7 @@ information to any third party, nor will it, ever.
This browser extension cannot influence telemetry carried out by browser vendors
to determine performance in their distribution channels, nor can it mitigate any
other browser vendor telemetry.
other browser vendor telemetry.
This browser extension is entirely Free, Open-Source software.
@@ -31,6 +36,14 @@ 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/).
### Setting the Homepage
The first time you run the extension, Firefox will offer you the option of setting
your homepage and new tab page to the homepage contained *within* the extension. You
can decline this or edit it later and it will not affect your anonymity. Enabling
this feature allows the extension to set your homepage to a local document with a
number of useful I2P links.
Debian Installation:
--------------------
@@ -115,15 +128,16 @@ Usage:
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
* [Done] **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.
* ![Distribute your site as a torrent.](x-i2p-torrentlocation.png)
* [Done] **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.
* ![Use HTTPS with your I2P Site.](i2p-https.png)
* [Done] **Provide** alternate, in-I2P destinations for web sites that want to
mirror their content within I2P.
* [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

36
ROADMAP.md Normal file
View File

@@ -0,0 +1,36 @@
Roadmap:
========
2.5.8:
------
Refactor the codebase to make more use of reusable code. De-spaghettify and DRY things out.
2.6.0:
------
Refactor the codebase to make more use of reusable code. De-spaghettify and DRY things out.
2.7.0:
------
# Finished Feature Breakout:
Create 2 new extensions which include functionality which has remained entirely the same for as long as it has existed, and which is suitable for use in it's own extensions. This is to decrease the maintenance burden of this extension, which has grown significant functionality outside it's original scope, and improve UI by providing clearer and less complex user-interfaces which are limited by the constraints of the WebExtensions system.
- Remove i2psnark-rpc functionality and place it into it's own, separate extension.
1. Remove options for configuring i2psnark-rpc from options menu and place them into a separate browser extension. This step initializes a new browser extension.
2. Remove Download control menu from Browser Action panel, and place it into the new browser extension.
3. Move torrent Navbar Buttons from old extension to new extension.
4. Remove torrent-on-page discovery functionality from background scripts, and place it into the new browser extension.
5. Set up reliable, straightforward release process.
- Remove i2pcontrol-rpc functionality and place it into it's own, separate extension.
1. Remove options for configuring i2pcontrol-rpc from options menu and place them into a separate browser extension. This step initializes a new browser extension.
2. Set up `toopie.html` as a browser extension, drawing upon the options which are now controlled by the browser extension options page.
3. Set up reliable, straightforward release process.
- Create an "Extension Template" for plugins which require outgoing traffic to be proxied over I2P.
- Create options for configuring the proxy
- Create reference extension-bound proxification function and set it up for the onRequest event.
- Create example WebExtension I2P application

738
_locales/ar/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "شهادة المعلومات:",
"message": "شهادة المعلومات:"
},
"SignedLabel": {
"description": "توقيع:",
"message": "توقيع:"
},
"TorrentTypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"TypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"aboutconsole": {
"description": "للولوج إلى الصفحة الرئيسية لجهاز التحكم، يذهب هنا:",
"message": "للولوج إلى الصفحة الرئيسية لجهاز التحكم، يذهب هنا:"
},
"abouthome": {
"description": "وصف لصفحة الزر.",
"message": "وللمزيد من المعلومات عن هذا التمديد، يرجى زيارة هذه الصفحة."
},
"addresstype": {
"description": "العنوان:",
"message": "العنوان:"
},
"applicationExplain": {
"description": "Description for application section.",
"message": "The I2P router console and applications open in their own tab, providing them with the same security benefits as browsing with this extension. This adds more protection by isolating each application and preventing other tabs (ie social media, etc) from fingerprinting or scripts. جميع المشابك تستخدم ألوان تحديد لتتبع تدفق العمل الخاص بك I2P."
},
"applicationHeader": {
"description": "رئيس قسم الطلبات.",
"message": "التطبيقات"
},
"beta": {
"description": "هذا منتج تجريبي.",
"message": "هذا منتج تجريبي."
},
"blogPreface": {
"description": "وجه لقب المصفح",
"message": "Blog"
},
"blogPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "Blog (Private)"
},
"bookmarksButton": {
"description": "Re-Create Bookmarks",
"message": "Re-Create Bookmarks"
},
"botePreface": {
"description": "وجه لقب المصفح",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "I2P-Bote Mail (Private)"
},
"browser-action": {
"description": "Browse",
"message": "Browse"
},
"btRpcHostText": {
"description": "التجمع الكونغولي من أجل الديمقراطية المضيف:",
"message": "التجمع الكونغولي من أجل الديمقراطية المضيف:"
},
"btRpcPathText": {
"description": "التجمع الكونغولي من أجل الديمقراطية الطريق:",
"message": "التجمع الكونغولي من أجل الديمقراطية الطريق:"
},
"btRpcPortText": {
"description": "التجمع الكونغولي من أجل الديمقراطية بورت:",
"message": "التجمع الكونغولي من أجل الديمقراطية بورت:"
},
"certAbsent": {
"description": "مضمون المعلومات المتعلقة بالشهادة إذا لم يكن هناك",
"message": "هذا الموقع لا يستخدم جهاز تحديد المواقع ما زالَ يُتأكّدُ مِنْ المُبْكَرَةِ مِن قِبل I2P."
},
"certPresent": {
"description": "مضمون المعلومات المتعلقة بالشهادة إذا كان حاضرا",
"message": "هذا الموقعِ يَستعملُ HTTPS. HTTPS over I2P is experimental and requires self-signed certificates or alternate root authorites."
},
"clearData": {
"description": "تصفية قائمة البيانات.",
"message": "بيانات الحشد:"
},
"clearDesc": {
"description": "مسح وصف إجراءات البيانات.",
"message": "إستخدم هذا لمسح بياناتك."
},
"controlExplain": {
"description": "أدخل لوحة التحكم.",
"message": "هذه الضوابط تُستخدم لتكييف تجربتك في الحشد"
},
"controlHeader": {
"description": "عنوان لوحة التحكم.",
"message": "الرقابة"
},
"controlHelpText": {
"description": "المساعدة على تشكيل خيارات زر نفق ريست",
"message": "إعترفوا بأن مرشدكم هنا."
},
"controlHostText": {
"description": "(مضيف (روتر كونسول",
"message": "الجهة المضيفة:"
},
"controlHostValue": {
"description": "(مضيف (روتر كونسول",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Port for the Router Console",
"message": "مركز المراقبة:"
},
"controlPortValue": {
"description": "Port for the Router Console",
"message": "7657"
},
"description": {
"description": "أنت الآن قادرة على استخدام I2P في هذا بروزر.",
"message": "أنت الآن قادرة على استخدام I2P في هذا بروزر."
},
"description2": {
"description": "إذا كنت ترى هذه الصفحة، هو لأن خطأ محترف حدث. تم تقديم بعض المعلومات لمساعدتك في تشخيص المسألة.",
"message": "إذا كنت ترى هذه الصفحة، هو لأن خطأ محترف حدث. تم تقديم بعض المعلومات لمساعدتك في تشخيص المسألة."
},
"disableHistory": {
"description": "بطاقة تدقيق التاريخ.",
"message": "تاريخ معزول في تابس I2P؟?"
},
"enableWebRTC": {
"description": "(ويرتك).",
"message": "هل تستطيع أن تُخبر (ويك) بالوكالة؟?"
},
"extensionDescription": {
"description": "وصف التمديد.",
"message": "شبكة \"آي 2 بي\" سهلت."
},
"extensionName": {
"description": "اسم التمديد.",
"message": "I2P In Private Browsing"
},
"extensionNameVariant": {
"description": "اسم التمديد.",
"message": "I2P In Private Browsing - Rhizome Variant"
},
"extensionPreface": {
"description": "وجه لقب المصفح",
"message": "I2P Management"
},
"extensionVersion": {
"description": "صورة التمديد.",
"message": "1.28"
},
"fliplinks": {
"description": "تمديد ونفقات الموارد",
"message": "تمديد ونفقات الموارد"
},
"forumMessage": {
"description": "رسالة المساعدة",
"message": "زيارة منتدى شركاء التنفيذ لتعلم المزيد أو طلب المساعدة"
},
"headline": {
"description": "قاذفة الإنترنت غير المرئية",
"message": "قاذفة الإنترنت غير المرئية"
},
"help": {
"description": "وصف لصفحة الزر.",
"message": "وللمزيد من المعلومات عن هذا التمديد، يرجى زيارة هذه الصفحة."
},
"helpMessage": {
"description": "رسالة المساعدة",
"message": "الحصول على مساعدة إضافية"
},
"histDesc": {
"description": "وصف الإجراءات التاريخية",
"message": "التاريخ يُبرّر تلقائياً عندما تُغلق رسومات I2P الخاصة بك. إذا كنت تريد تصفية التاريخ كما تذهب، تحقق من هذا الصندوق."
},
"homepage": {
"description": "البحث عن المزيد من المعلومات",
"message": "هناك المزيد من المعلومات المتاحة هنا"
},
"hostText": {
"description": "المضيف لشركة HTTP أو شركة SOCKS5",
"message": "المضيف:"
},
"i2ppage": {
"description": "وهناك المزيد من المعلومات المتاحة هنا.",
"message": "وهناك المزيد من المعلومات المتاحة هنا."
},
"i2ptunnel": {
"description": "Description for i2ptunnel",
"message": "نشاهد رسائل عن وضعية المحترفين و نصادر الخدمات والأنفاق."
},
"i2ptunnelPreface": {
"description": "وجه لقب المصفح",
"message": "مدير خدمات مخفي"
},
"i2ptunnelPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "مدير خدمات مخفي )مدير("
},
"infoMessage": {
"description": "رسالة المساعدة",
"message": "أنت الآن حرّ لتَغْطّمْ فوق ويب! مصففك الآن مجهز ليتصفح بشكل مجهول على شبكة I2P كما تَتصفحُ، حركة المرور الخاصة بكَ سَتُوجّهُ من خلال عقدِ شبكةِ أخرى لإخفاء هو أصلُ، كِلاً مِنْ الخادمِ و مِنْ العقدِ نفسهِ."
},
"infoTitle": {
"description": "عنوان قائمة المساعدة",
"message": "I2P النجدة"
},
"ircPreface": {
"description": "وجه لقب المصفح",
"message": "Dispatch IRC"
},
"ircPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "الهيئة الدولية لمراقبة المخدرات"
},
"isBase32": {
"description": "رسالة إلى قاعدة معلومات الموقع 32",
"message": "I2P Base32-Formatted Address"
},
"isHostName": {
"description": "رسالة لاستضافة لوحة معلومات الموقع",
"message": "I2P القفزة المضيفة"
},
"label-router-activepeers": {
"description": "ناشطين",
"message": "ناشطين"
},
"label-router-bandwidth": {
"description": "Bandwidth",
"message": "Bandwidth"
},
"label-router-bw-inbound-15s": {
"description": "في حدود 15",
"message": "في حدود 15"
},
"label-router-bw-inbound-1s": {
"description": "مقياس الجسم 1:",
"message": "مقياس الجسم 1:"
},
"label-router-bw-outbound-15s": {
"description": "مقاس 15 بوصة:",
"message": "مقاس 15 بوصة:"
},
"label-router-bw-outbound-1s": {
"description": "الرصيف الأول",
"message": "الرصيف الأول"
},
"label-router-net-tunnels-participating": {
"description": "سلالات العبور:",
"message": "سلالات العبور:"
},
"label-router-netdb-fastpeers": {
"description": "بسرعة",
"message": "بسرعة"
},
"label-router-netdb-highcapacitypeers": {
"description": "القدرات العالية بيرز:",
"message": "القدرات العالية بيرز:"
},
"label-router-netdb-isreseeding": {
"description": "Reseed status:",
"message": "Reseed status:"
},
"label-router-netdb-knownpeers": {
"description": "المعلمة بيرز:",
"message": "المعلمة بيرز:"
},
"label-router-peers": {
"description": "Peers",
"message": "Peers"
},
"label-router-status": {
"description": "Status Router Status:",
"message": "Status Router Status:"
},
"label-router-uptime": {
"description": "وقت التخرج",
"message": "وقت التخرج"
},
"label-router-version": {
"description": "الراقصة:",
"message": "الراقصة:"
},
"links": {
"description": "تمديد ونفقات الموارد",
"message": "تمديد ونفقات الموارد"
},
"linksExplain": {
"description": "إذا كنت تريد الحصول على المزيد من المعلومات عن I2P، يمكنك زيارة هذه الروابط.",
"message": "إذا كنت تريد الحصول على المزيد من المعلومات عن I2P، يمكنك زيارة هذه الروابط."
},
"mailPreface": {
"description": "وجه لقب المصفح",
"message": "البريد الشبكي"
},
"mailPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "البريد الإلكتروني (Private)"
},
"muwirePreface": {
"description": "وجه لقب المصفح",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "مووير (بريفيت)"
},
"newsMessage": {
"description": "رسالة المساعدة",
"message": "زيارة I2P اعتذر لتعلم آخر شيء عن (اي2ب)."
},
"onboardingButtonFive": {
"description": "تحسين الخبرة",
"message": "تحسين الخبرة"
},
"onboardingButtonFour": {
"description": "Sharing Files",
"message": "تبادل الملفات"
},
"onboardingButtonOne": {
"description": "I2P Network Browsing and Non-I2P Network Browsing",
"message": "I2P Network Browsing and Non-I2P Network Browsing"
},
"onboardingButtonThree": {
"description": "البريد الإلكتروني المخفي",
"message": "البريد الإلكتروني المخفي"
},
"onboardingButtonTwo": {
"description": "شبكة الحماية",
"message": "شبكة الحماية"
},
"onboardingButtonZero": {
"description": "احمي خصوصيتك",
"message": "احمي خصوصيتك"
},
"onboardingContentFive": {
"description": "هذا التمديد يمكن أن يقترن بتمديدات أخرى التي تُحسّن أحياناً وظيفتها شركة أوبلوك أوريغين، وشركة محلية، وشركة jShelter مفيدة للتعجيل بتحميل الصفحات، وحجب الإعلانات، والحد من قوة جافرين. وبالنسبة للمستعملين الذين يرغبون في حجب كل الجافوري، يوصى بـ \" NoScript \" .",
"message": "هذا التمديد يمكن أن يقترن بتمديدات أخرى التي تُحسّن أحياناً وظيفتها شركة أوبلوك أوريغين، وشركة محلية، وشركة jShelter مفيدة للتعجيل بتحميل الصفحات، وحجب الإعلانات، والحد من قوة جافرين. وبالنسبة للمستعملين الذين يرغبون في حجب كل الجافوري، يوصى بـ \" NoScript \" ."
},
"onboardingContentFour": {
"description": "I2P is capable of using peer-to-peer applications like Bit Torrent, protecting your identity when you share files. زبوننا الصغير المجهول متوفر في المسبح.",
"message": "I2P is capable of using peer-to-peer applications like Bit Torrent, protecting your identity when you share files. زبوننا الصغير المجهول متوفر في المسبح."
},
"onboardingContentOne": {
"description": "هذا التوسيع يعمل تلقائياً عندما تنظف مواقع I2P إذا كنت ترغب في استخدام I2P كوكيل للمواقع غير I2P، استخدام زر I2P In Private Browsing in the toolbar خبرتك بينما تنظف الانترنت قد تكون مختلفة قليلا قد تكون الأمور أبطأ قليلاً، ورهناً بمستوى أمنك، قد لا تعمل بعض العناصر أو تحملها. قد يُطلب منك أيضاً أن تثبت أنك إنسان وليس إنسان آلي.",
"message": "هذا التوسيع يعمل تلقائياً عندما تنظف مواقع I2P إذا كنت ترغب في استخدام I2P كوكيل للمواقع غير I2P، استخدام زر I2P In Private Browsing in the toolbar خبرتك بينما تنظف الانترنت قد تكون مختلفة قليلا قد تكون الأمور أبطأ قليلاً، ورهناً بمستوى أمنك، قد لا تعمل بعض العناصر أو تحملها. قد يُطلب منك أيضاً أن تثبت أنك إنسان وليس إنسان آلي."
},
"onboardingContentThree": {
"description": "وهناك أيضاً خدمة بريد إلكتروني مجهولة الهوية متاحة داخل I2P، ويمكن الحصول عليها من منظفنا عن طريق القائمة مباشرة إلى اليمين.",
"message": "وهناك أيضاً خدمة بريد إلكتروني مجهولة الهوية متاحة داخل I2P، ويمكن الحصول عليها من منظفنا عن طريق القائمة مباشرة إلى اليمين."
},
"onboardingContentTwo": {
"description": "I2P is normally administered via a WebUI (The \"Router Console \"), which the user sometimes views in the same browser they use to visit remote sites. ومن الضروري منع المواقع من الحصول على المعلومات من هذا الموقع وغيره من الخدمات التي يديرها محليا. ولا تزال مواقع شبكة التطهير في حاوية الدفء - الديوكس، ولكن بمجرد أن تطلب حاوية دفوكس - قاذف الديوكس (A)-onion أو *.i2p موقعا، ستتم حاويته فورا. أداة إدارة هوية (تور بروزر) تتحكم في تابوتات الشبكه النظيفه و هم يقتربون من استخدام المعالجه الخارجيه لـ (آي 2 بي) أو (بلوجين).",
"message": "I2P is normally administered via a WebUI (The Router Console) which the user sometimes views in the same browser they use to visit remote sites. ومن الضروري منع المواقع من الحصول على المعلومات من هذا الموقع وغيره من الخدمات التي يديرها محليا. ولا تزال مواقع شبكة التطهير في حاوية الدفء - الديوكس، ولكن بمجرد أن تطلب حاوية دفوكس - قاذف الديوكس (A)-onion أو *.i2p موقعا، ستتم حاويته فورا. أداة إدارة هوية (تور بروزر) تتحكم في تابوتات الشبكه النظيفه و هم يقتربون من استخدام المعالجه الخارجيه لـ (آي 2 بي) أو (بلوجين)."
},
"onboardingContentZero": {
"description": "عندما تستخدم (إي تو بي) في (مود) الخاص، فأنت محمي من التتبع والمراقبة. الـ (إي تو بي بروزر) يعزل الكعك ويحذف تاريخك بعد دورتك هذه التعديلات تضمن أن خصوصيتك وأمنك محمية كبروزك.",
"message": "عندما تستخدم (إي تو بي) في (مود) الخاص، فأنت محمي من التتبع والمراقبة. الـ (إي تو بي بروزر) يعزل الكعك ويحذف تاريخك بعد دورتك هذه التعديلات تضمن أن خصوصيتك وأمنك محمية كبروزك."
},
"onboardingFive": {
"description": "الخبرة",
"message": "الخبرة"
},
"onboardingFour": {
"description": "تحشد الشبكة",
"message": "تحشد الشبكة"
},
"onboardingOne": {
"description": "إئتمنْك الخبرة",
"message": "إئتمنْك الخبرة"
},
"onboardingThree": {
"description": "البريد الإلكتروني المخفي",
"message": "البريد الإلكتروني المخفي"
},
"onboardingTitle": {
"description": "حول I2P In Private Browsing",
"message": "حول I2P In Private Browsing"
},
"onboardingTwo": {
"description": "Share Files",
"message": "Share Files"
},
"onboardingZero": {
"description": "احمي خصوصيتك",
"message": "احمي خصوصيتك"
},
"portText": {
"description": "Port for the HTTP or SOCKS5 Proxy",
"message": "بورت:"
},
"protocolHandlerValue": {
"description": "قيمة معالج بروتوكول المغناطيس",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%saction=Addfoo=Add+torrent"
},
"proxy-check": {
"description": "الوكيل جاهز.",
"message": "الوكيل جاهز."
},
"proxyFailedStatus": {
"description": "فشل الوكيل.",
"message": "الوكيل لَيسَ جاهزَ"
},
"proxyHelpText": {
"description": "المساعدة على تشكيل خيارات زر نفق ريست",
"message": "إعترف بوكيلك هنا."
},
"proxySuccessStatus": {
"description": "فشل الوكيل.",
"message": "الوكيل جاهز"
},
"readyness": {
"description": "الوكيل جاهز.",
"message": "الوكيل جاهز."
},
"releases": {
"description": "Description for new release page",
"message": "تحقق من الإطلاقات الجديدة هنا"
},
"resetMessage": {
"description": "رسالة لزر نفق ريست",
"message": "Reset Tunnel"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "يستعاض عن عبارة Router Bandwidth Outbound 15s",
"message": "يستعاض عن عبارة Router Bandwidth Outbound 15s"
},
"router-net-bw-inbound-1s": {
"description": "يستعاض عن عبارة Router Bandwidth Inbound 1s",
"message": "يستعاض عن عبارة Router Bandwidth Inbound 1s"
},
"router-net-bw-outbound-15s": {
"description": "يستعاض عن عبارة Router Bandwidth Outbound 15s",
"message": "يستعاض عن عبارة Router Bandwidth Outbound 15s"
},
"router-net-bw-outbound-1s": {
"description": "يستعاض عن عبارة Router Bandwidth Outbound 1s",
"message": "يستعاض عن عبارة Router Bandwidth Outbound 1s"
},
"router-net-tunnels-participating": {
"description": "يستعاض عن عبارة \" روتر \" التي تشارك في الكونت",
"message": "يستعاض عن عبارة \" روتر \" التي تشارك في الكونت"
},
"router-netdb-activepeers": {
"description": "يستعاض عن عبارة \" ناشطين \"",
"message": "يستعاض عن عبارة \" ناشطين \""
},
"router-netdb-fastpeers": {
"description": "يستعاض عن عبارة Router Fast Peers",
"message": "يستعاض عن عبارة Router Fast Peers"
},
"router-netdb-highcapacitypeers": {
"description": "يستعاض عن عبارة \" أصحاب القدرات العالية \"",
"message": "يستعاض عن عبارة \" أصحاب القدرات العالية \""
},
"router-netdb-isreseeding": {
"description": "يستعاض عن عبارة \" شبكة Router netDB Reseeding Status \"",
"message": "يستعاض عن عبارة \" شبكة Router netDB Reseeding Status \""
},
"router-netdb-knownpeers": {
"description": "يستعاض عن عبارة Router Known Peers",
"message": "يستعاض عن عبارة Router Known Peers"
},
"router-restart": {
"description": "ممر راحه",
"message": "ممر راحه"
},
"router-shutdown": {
"description": "ممر مقفل",
"message": "ممر مقفل"
},
"router-status": {
"description": "يستعاض عن عبارة \" Router Status \"",
"message": "يستعاض عن عبارة \" Router Status \""
},
"router-uptime": {
"description": "يستعاض عن عبارة \" الروت \" في وقت العمل",
"message": "يستعاض عن عبارة \" الروت \" في وقت العمل"
},
"router-version": {
"description": "يستعاض عن عبارة Router Version",
"message": "يستعاض عن عبارة Router Version"
},
"routerConsole": {
"description": "وصف لجهاز التحكم.",
"message": "إدخلوا جهاز التحكم بالجهاز الآلي الخاص بكم و مجموعة كاملة من التطبيقات والتشكيلات."
},
"routerPreface": {
"description": "وجه لقب المصفح",
"message": "Router Console"
},
"routerPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "Router Console (Private)"
},
"rpcHelpText": {
"description": "إعترف بخياراتك هنا إعترف بخياراتك هنا.",
"message": "إعترف بخياراتك هنا إعترف بخياراتك هنا."
},
"rpcHostText": {
"description": "مركز المراقبة:",
"message": "مركز المراقبة:"
},
"rpcPassText": {
"description": "كلمة سر المراقبة: رشاش من طراز RPC كلمة السر:",
"message": "كلمة سر المراقبة: رشاش من طراز RPC كلمة السر:"
},
"rpcPathText": {
"description": "مركز التحكم:",
"message": "مركز التحكم:"
},
"rpcPortText": {
"description": "الجهة المضيفة:",
"message": "الجهة المضيفة:"
},
"rtcDesc": {
"description": "وصف عمل الشبكة",
"message": "(ويرتي سي) معوقة بسبب الفشل، لكن يمكنك إعادة تشغيله وإجباره على تكريم العميل. إذا كنت مستعملاً لتمديد \"سنوفليك برووزر\" هذا الخيار معوق و \"ويب آر تي سي\" يتحول إلى عجز."
},
"signingcert": {
"description": "توقيع:",
"message": "توقيع:"
},
"siteLabel": {
"description": "Label for i2p site info",
"message": "العنوان/الموقع:"
},
"sitecert": {
"description": "شهادة المعلومات:",
"message": "شهادة المعلومات:"
},
"snark": {
"description": "Description for Bittorrent",
"message": "الوصول السريع إلى (سنارك)، وشبكة (بير - بير - بير - إي 2 بي) الخاصة بتقاسم الملفات."
},
"sourcehead": {
"description": "الحصول على رمز المصدر:",
"message": "الحصول على رمز المصدر:"
},
"sources": {
"description": "Description for the Source code link",
"message": "فجر رمز المصدر هنا"
},
"susimail": {
"description": "وصف البريد الإلكتروني",
"message": "الوصول السريع إلى موكّل البريد الإلكتروني لشبكة سوزي ماييل I2P."
},
"text-section-header": {
"description": "قاذفة الإنترنت غير المرئية",
"message": "قاذفة الإنترنت غير المرئية"
},
"text-section-proxyerr-header": {
"description": "\"المحقق (إير)\"",
"message": "\"المحقق (إير)\""
},
"text-section-torrents-header": {
"description": "الحمولات المروعة",
"message": "الحمولات المروعة"
},
"titlePreface": {
"description": "وجه لقب المصفح",
"message": "I2P Browser"
},
"titlePrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "I2P Browser (Private)"
},
"toopie": {
"description": "للحصول على معلومات عن وضعية جهاز توجيه I2P الخاص بك، انتقل هنا:",
"message": "للحصول على معلومات عن وضعية جهاز توجيه I2P الخاص بك، انتقل هنا:"
},
"toopieHtmlHeadline": {
"description": "I2P Router Information",
"message": "I2P Router Information"
},
"toopieName": {
"description": "اسم الجانب.",
"message": "أيضاً html"
},
"toopieTLS": {
"description": "اسم فريق الأمن.",
"message": "Site Properties"
},
"topbar": {
"description": "الحمولة",
"message": "الحمولة"
},
"torPreface": {
"description": "وجه لقب المصفح",
"message": "Tor Manager"
},
"torPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "Tor Manager (Private)"
},
"torrent-action": {
"description": "تحميل",
"message": "تحميل"
},
"torrentControls": {
"description": "الضوابط الرهيبة",
"message": "الضوابط الرهيبة"
},
"torrentDownloads": {
"description": "الحمولات المروعة",
"message": "الحمولات المروعة"
},
"torrentPreface": {
"description": "وجه لقب المصفح",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "Bittorrent (Private)"
},
"torrentui-opener": {
"description": "Open WebUI",
"message": "Open WebUI"
},
"visit-irc": {
"description": "Visit IRC",
"message": "Visit IRC"
},
"webPreface": {
"description": "وجه لقب المصفح",
"message": "Web Browser"
},
"webPrefacePrivate": {
"description": "وجه لقب المصفح",
"message": "بروزر (بريفيت)"
},
"webpage": {
"description": "وهناك المزيد من المعلومات المتاحة هنا.",
"message": "وهناك المزيد من المعلومات المتاحة هنا."
},
"window-visit-console": {
"description": "I2P Router Console",
"message": "I2P Router Console"
},
"window-visit-help": {
"description": "تقديم المساعدة",
"message": "تقديم المساعدة"
},
"window-visit-homepage": {
"description": "قاذفة الإنترنت غير المرئية",
"message": "قاذفة الإنترنت غير المرئية"
},
"window-visit-i2p": {
"description": "I2P Project Homepage:",
"message": "I2P Project Homepage:"
},
"window-visit-i2ptunnel": {
"description": "مدير خدمات مخفي",
"message": "مدير خدمات مخفي"
},
"window-visit-index": {
"description": "Webextension Homepage:",
"message": "Webextension Homepage:"
},
"window-visit-releases": {
"description": "الإطلاقات:",
"message": "الإطلاقات:"
},
"window-visit-router": {
"description": "Router Console",
"message": "Router Console"
},
"window-visit-settings": {
"description": "افتحي البيئات",
"message": "افتحي البيئات"
},
"window-visit-snark": {
"description": "Bit Torrent",
"message": "Bit Torrent"
},
"window-visit-sources": {
"description": "المصدر:",
"message": "المصدر:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "Toopie",
"message": "Toopie"
},
"window-visit-torrent": {
"description": "For assistance, visit the torrent help page",
"message": "For assistance, visit the torrent help page"
},
"windowVisitConsole": {
"description": "(روتر كونسول).",
"message": "Router Console:"
},
"windowVisitHelppage": {
"description": "صفحة مساعدة لعلامة التمديد.",
"message": "معلومات توسيع الشبكة:"
},
"windowVisitHomepage": {
"description": "صفحة منزل لعلامة التمديد.",
"message": "Home Page:"
},
"windowVisitI2ptunnel": {
"description": "العنوان: i2ptunnel",
"message": "مدير الخدمات المخفية:"
},
"windowVisitReleases": {
"description": "زيارة الصفحة",
"message": "إصدارات التمديد:"
},
"windowVisitSnark": {
"description": "Title for Bittorrent",
"message": "بيتيرنت:"
},
"windowVisitSources": {
"description": "Title for source code link",
"message": "قانون التمديد"
},
"windowVisitSusimail": {
"description": "عنوان البريد الإلكتروني",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "صحيفة \" غيثوب \" لتوسيع نطاق الزيارات",
"message": "Home Page:"
}
}

738
_locales/de/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "Zertifikat Information:",
"message": "Zertifikat Information:"
},
"SignedLabel": {
"description": "Unterzeichnet von:",
"message": "Unterzeichnet von:"
},
"TorrentTypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"TypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"aboutconsole": {
"description": "Um auf die Homepage der Router-Konsole zuzugreifen, gehen Sie hier:",
"message": "Um auf die Homepage der Router-Konsole zuzugreifen, gehen Sie hier:"
},
"abouthome": {
"description": "Beschreibung für die Schaltfläche Erweiterung.",
"message": "Weitere Informationen zu dieser Erweiterung finden Sie auf dieser Seite."
},
"addresstype": {
"description": "Anschrift:",
"message": "Anschrift:"
},
"applicationExplain": {
"description": "Beschreibung für Anwendungsbereich.",
"message": "Die I2P Router-Konsole und Anwendungen öffnen sich in ihrem eigenen Tab und bieten ihnen die gleichen Sicherheitsvorteile wie das Surfen mit dieser Erweiterung. Dies fügt mehr Schutz hinzu, indem jede Anwendung isoliert und andere Registerkarten (z.B. Social Media, etc.) vor Fingerabdrücken oder Skripten verhindert werden. Alle Registerkarten verwenden Farben, um Ihren I2P-Workflow zu verfolgen."
},
"applicationHeader": {
"description": "Header für Anwendungsbereiche.",
"message": "Anwendungen"
},
"beta": {
"description": "Dies ist ein experimentelles Produkt.",
"message": "Dies ist ein experimentelles Produkt."
},
"blogPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Blog"
},
"blogPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Blog (Privat)"
},
"bookmarksButton": {
"description": "Re-Create Bookmarks",
"message": "Re-Create Bookmarks"
},
"botePreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "I2P-Bote Mail (Private)"
},
"browser-action": {
"description": "Nach oben",
"message": "Nach oben"
},
"btRpcHostText": {
"description": "Torrent RPC Host:",
"message": "Torrent RPC Host:"
},
"btRpcPathText": {
"description": "Torrent RPC Pfad:",
"message": "Torrent RPC Pfad:"
},
"btRpcPortText": {
"description": "Torrent RPC Hafen:",
"message": "Torrent RPC Hafen:"
},
"certAbsent": {
"description": "Inhalt für Zertifikatsinfo, wenn abwesend",
"message": "Diese Website verwendet nicht HTTPS. Es wird noch kryptographisch von I2P überprüft."
},
"certPresent": {
"description": "Inhalt für Zertifikatsinfo, wenn vorhanden",
"message": "Diese Website verwendet HTTPS. HTTPS über I2P ist experimentell und erfordert selbstsignierte Zertifikate oder alternative Wurzelautoriten."
},
"clearData": {
"description": "Löschen Sie den Menüpunkt Browserdaten.",
"message": "Löschen von Browserdaten:"
},
"clearDesc": {
"description": "Löschen Sie die Daten Aktion Beschreibung.",
"message": "Verwenden Sie dies, um Ihre I2P-Browserdaten zu löschen."
},
"controlExplain": {
"description": "Schalttafel einführen.",
"message": "Diese Steuerungen werden verwendet, um Ihre I2P Browsing Experience zuzuschneiden"
},
"controlHeader": {
"description": "Headline für Bedienfeld.",
"message": "Steuerung"
},
"controlHelpText": {
"description": "Hilfe zur Konfiguration der Optionen für den Reset Tunnel Button",
"message": "Konfigurieren Sie hier Ihre Router-Konsole."
},
"controlHostText": {
"description": "Host für die Router-Konsole",
"message": "Kontroll Host:"
},
"controlHostValue": {
"description": "Host für die Router-Konsole",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Hafen für die Router-Konsole",
"message": "Kontrollhafen:"
},
"controlPortValue": {
"description": "Hafen für die Router-Konsole",
"message": "7657"
},
"description": {
"description": "Sie können jetzt I2P in diesem Browser verwenden.",
"message": "Sie können jetzt I2P in diesem Browser verwenden."
},
"description2": {
"description": "Wenn Sie diese Seite sehen, ist es, weil ein Proxy-Fehler aufgetreten ist. Einige Informationen wurden zur Diagnose des Problems bereitgestellt.",
"message": "Wenn Sie diese Seite sehen, ist es, weil ein Proxy-Fehler aufgetreten ist. Einige Informationen wurden zur Diagnose des Problems bereitgestellt."
},
"disableHistory": {
"description": "History Checkbox Label.",
"message": "Die Geschichte in I2P Tabs deaktivieren?"
},
"enableWebRTC": {
"description": "WebRTC-Checkbox-Label.",
"message": "WebRTC mit Proxy aktivieren?"
},
"extensionDescription": {
"description": "Beschreibung der Erweiterung.",
"message": "I2P Netzwerk-Browsing leicht gemacht."
},
"extensionName": {
"description": "Name der Erweiterung.",
"message": "I2P Im privaten Browsing"
},
"extensionNameVariant": {
"description": "Name der Erweiterung.",
"message": "I2P In Private Browsing - Rhizome Variant"
},
"extensionPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "I2P Management"
},
"extensionVersion": {
"description": "Ausführung der Erweiterung.",
"message": "1.28"
},
"fliplinks": {
"description": "Erweiterung und I2P-Ressourcen",
"message": "Erweiterung und I2P-Ressourcen"
},
"forumMessage": {
"description": "Hilfe",
"message": "Besuchen Sie das I2P Forum, um mehr zu erfahren oder um Hilfe zu bitten"
},
"headline": {
"description": "Der unsichtbare Internet-Browser",
"message": "Der unsichtbare Internet-Browser"
},
"help": {
"description": "Beschreibung für die Schaltfläche Erweiterung.",
"message": "Weitere Informationen zu dieser Erweiterung finden Sie auf dieser Seite."
},
"helpMessage": {
"description": "Hilfe",
"message": "Zusätzliche Hilfe"
},
"histDesc": {
"description": "Beschreibung der Geschichte",
"message": "Die Geschichte wird automatisch gelöscht, wenn Ihre I2P Tabs geschlossen sind. Wenn Sie die Geschichte wie Sie gehen, überprüfen Sie diese Box."
},
"homepage": {
"description": "Weitere Informationen",
"message": "Weitere Informationen finden Sie hier"
},
"hostText": {
"description": "Host für das HTTP oder SOCKS5 Proxy",
"message": "Host:"
},
"i2ppage": {
"description": "Weitere Informationen finden Sie hier.",
"message": "Weitere Informationen finden Sie hier."
},
"i2ptunnel": {
"description": "Beschreibung für i2ptunnel",
"message": "Anzeigen von Proxystatus-Nachrichten und Konfigurieren von Diensten und Tunneln."
},
"i2ptunnelPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Hidden Services Manager"
},
"i2ptunnelPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Hidden Services Manager (Private)"
},
"infoMessage": {
"description": "Hilfe",
"message": "Sie sind jetzt frei, das eepWeb zu durchsuchen! Ihr Browser ist nun dazu konfiguriert, anonym auf dem I2P-Netzwerk zu surfen. Beim Durchsuchen wird Ihr Traffic über andere Netzknoten geleitet, um seinen Ursprung zu verbergen, sowohl vom Server als auch von den Knoten selbst."
},
"infoTitle": {
"description": "Titel für das Hilfemenü",
"message": "I2P Hilfe"
},
"ircPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Versand IRC"
},
"ircPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Versand IRC (Private)"
},
"isBase32": {
"description": "Nachricht für Site Info Panel base32",
"message": "I2P Base32-Formatierte Adresse"
},
"isHostName": {
"description": "Nachricht für die Website Info Panel Hostname",
"message": "I2P Vorheriger Hostname"
},
"label-router-activepeers": {
"description": "Aktive Peers:",
"message": "Aktive Peers:"
},
"label-router-bandwidth": {
"description": "Bandbreite",
"message": "Bandbreite"
},
"label-router-bw-inbound-15s": {
"description": "Inbound bw 15s:",
"message": "Inbound bw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "Inbound bw 1s:",
"message": "Inbound bw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "Ausstoß bw 15s:",
"message": "Ausstoß bw 15s:"
},
"label-router-bw-outbound-1s": {
"description": "Ausstoß bw 1s:",
"message": "Ausstoß bw 1s:"
},
"label-router-net-tunnels-participating": {
"description": "Transit Tunnels:",
"message": "Transit Tunnels:"
},
"label-router-netdb-fastpeers": {
"description": "Fast Peers:",
"message": "Fast Peers:"
},
"label-router-netdb-highcapacitypeers": {
"description": "Hohe Kapazität Peers:",
"message": "Hohe Kapazität Peers:"
},
"label-router-netdb-isreseeding": {
"description": "Status:",
"message": "Status:"
},
"label-router-netdb-knownpeers": {
"description": "Bekannte Peers:",
"message": "Bekannte Peers:"
},
"label-router-peers": {
"description": "Pestizid",
"message": "Pestizid"
},
"label-router-status": {
"description": "Status Router Status:",
"message": "Status Router Status:"
},
"label-router-uptime": {
"description": "Router-Uptime(Ms):",
"message": "Router-Uptime(Ms):"
},
"label-router-version": {
"description": "Router Version:",
"message": "Router Version:"
},
"links": {
"description": "Erweiterung und I2P-Ressourcen",
"message": "Erweiterung und I2P-Ressourcen"
},
"linksExplain": {
"description": "Wenn Sie mehr Informationen über I2P erhalten möchten, können Sie diese Links besuchen.",
"message": "Wenn Sie mehr Informationen über I2P erhalten möchten, können Sie diese Links besuchen."
},
"mailPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Web Mail"
},
"mailPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Web Mail (Privat)"
},
"muwirePreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "MuWire (Privat)"
},
"newsMessage": {
"description": "Hilfe",
"message": "Besuchen Sie die I2P Blog, um das neueste über i2p zu erfahren."
},
"onboardingButtonFive": {
"description": "Verbesserung Ihrer Erfahrung",
"message": "Verbesserung Ihrer Erfahrung"
},
"onboardingButtonFour": {
"description": "Dateien teilen",
"message": "Dateien teilen"
},
"onboardingButtonOne": {
"description": "I2P Network Browsing und Non-I2P Network Browsing",
"message": "I2P Network Browsing und Non-I2P Network Browsing"
},
"onboardingButtonThree": {
"description": "Versteckte E-Mail",
"message": "Versteckte E-Mail"
},
"onboardingButtonTwo": {
"description": "Schutz von Netzwerk-Boundaries",
"message": "Schutz von Netzwerk-Boundaries"
},
"onboardingButtonZero": {
"description": "Schutz Ihrer Privatsphäre",
"message": "Schutz Ihrer Privatsphäre"
},
"onboardingContentFive": {
"description": "Diese Erweiterung kann mit anderen Erweiterungen kombiniert werden, die manchmal die Funktionalität verbessern. uBlock Origin, LocalCDN und jShelter sind nützlich, um das Seitenaufladen zu beschleunigen, Anzeigen zu blockieren und die Leistung von Javascript zu begrenzen. Für Benutzer, die alle Javascript blockieren möchten, wird NoScript empfohlen.",
"message": "Diese Erweiterung kann mit anderen Erweiterungen kombiniert werden, die manchmal die Funktionalität verbessern. uBlock Origin, LocalCDN und jShelter sind nützlich, um das Seitenaufladen zu beschleunigen, Anzeigen zu blockieren und die Leistung von Javascript zu begrenzen. Für Benutzer, die alle Javascript blockieren möchten, wird NoScript empfohlen."
},
"onboardingContentFour": {
"description": "I2P ist in der Lage, Peer-to-Peer-Anwendungen wie BitTorrent zu verwenden, um Ihre Identität zu schützen, wenn Sie Dateien teilen. Unser anonymer Bittorrent-Client ist im Browser verfügbar.",
"message": "I2P ist in der Lage, Peer-to-Peer-Anwendungen wie BitTorrent zu verwenden, um Ihre Identität zu schützen, wenn Sie Dateien teilen. Unser anonymer Bittorrent-Client ist im Browser verfügbar."
},
"onboardingContentOne": {
"description": "Diese Erweiterung funktioniert automatisch, wenn Sie I2P-Seiten durchsuchen. Wenn Sie I2P als Proxy für Nicht-I2P-Seiten verwenden möchten, verwenden Sie die I2P In Private Browsing Taste in der Symbolleiste und klicken Sie auf Neu I2P Browser Tab, um auf I2P Browsing in einem neuen Tab zu wechseln. Ihre Erfahrung beim Surfen im Internet kann ein wenig anders sein. Die Dinge können etwas langsamer sein, und je nach Sicherheitsniveau können einige Elemente nicht funktionieren oder laden. Sie können auch gebeten werden, zu beweisen, dass Sie ein Mensch und kein Roboter sind.",
"message": "Diese Erweiterung funktioniert automatisch, wenn Sie I2P-Seiten durchsuchen. Wenn Sie I2P als Proxy für Nicht-I2P-Seiten verwenden möchten, verwenden Sie die I2P In Private Browsing Taste in der Symbolleiste und klicken Sie auf Neu I2P Browser Tab, um auf I2P Browsing in einem neuen Tab zu wechseln. Ihre Erfahrung beim Surfen im Internet kann ein wenig anders sein. Die Dinge können etwas langsamer sein, und je nach Sicherheitsniveau können einige Elemente nicht funktionieren oder laden. Sie können auch gebeten werden, zu beweisen, dass Sie ein Mensch und kein Roboter sind."
},
"onboardingContentThree": {
"description": "Es gibt auch einen anonymen E-Mail-Service innerhalb von I2P, der von unserem Browser über das Menü direkt nach rechts zugänglich ist.",
"message": "Es gibt auch einen anonymen E-Mail-Service innerhalb von I2P, der von unserem Browser über das Menü direkt nach rechts zugänglich ist."
},
"onboardingContentTwo": {
"description": "I2P wird normalerweise über eine WebUI (The \"Router Console \") verwaltet, die der Benutzer manchmal im gleichen Browser ansieht, den sie verwenden, um Remote-Sites zu besuchen. Es ist wichtig zu verhindern, dass Websites auf Informationen von dieser WebUI und anderen lokal laufenden Dienstleistungen zugreifen können. Clearnet-Stellplätze bleiben im Firefox-Default-Container, aber sobald der Firefox-Default-Container eine *.onion oder *.i2p-Stelle anfordert, wird er sofort befüllt. Tor Browsers Identity-Management-Tooling steuert clearnet Tabs, und sie werden mit dem Standard I2P outproxy oder Outproxy Plugin proxied.",
"message": "I2P wird normalerweise über eine WebUI (The \" Router Console \") verwaltet, die der Benutzer manchmal in dem gleichen Browser ansieht, den sie verwenden, um Remote-Sites zu besuchen. Es ist wichtig zu verhindern, dass Websites auf Informationen von dieser WebUI und anderen lokal laufenden Dienstleistungen zugreifen können. Clearnet-Stellplätze bleiben im Firefox-Default-Container, aber sobald der Firefox-Default-Container eine *.onion oder *.i2p-Stelle anfordert, wird er sofort befüllt. Tor Browsers Identity-Management-Tooling steuert clearnet Tabs, und sie werden mit dem Standard I2P outproxy oder Outproxy Plugin proxied."
},
"onboardingContentZero": {
"description": "Wenn Sie I2P In Private Browsing Modus verwenden, sind Sie vor Verfolgung und Überwachung geschützt. Der I2P Browser isoliert Cookies und löscht Ihren Browserverlauf nach Ihrer Sitzung. Diese Änderungen stellen sicher, dass Ihre Privatsphäre und Sicherheit als Ihr Browser geschützt sind.",
"message": "Wenn Sie I2P In Private Browsing Modus verwenden, sind Sie vor Verfolgung und Überwachung geschützt. Der I2P Browser isoliert Cookies und löscht Ihren Browserverlauf nach Ihrer Sitzung. Diese Änderungen stellen sicher, dass Ihre Privatsphäre und Sicherheit als Ihr Browser geschützt sind."
},
"onboardingFive": {
"description": "Erfahrungen Tipps",
"message": "Erfahrungen Tipps"
},
"onboardingFour": {
"description": "Das Web durchsuchen",
"message": "Das Web durchsuchen"
},
"onboardingOne": {
"description": "Konfigurieren Sie Ihre Erfahrung",
"message": "Konfigurieren Sie Ihre Erfahrung"
},
"onboardingThree": {
"description": "Versteckte E-Mail",
"message": "Versteckte E-Mail"
},
"onboardingTitle": {
"description": "Über I2P In Private Browsing",
"message": "Über I2P In Private Browsing"
},
"onboardingTwo": {
"description": "Teilen von Dateien",
"message": "Teilen von Dateien"
},
"onboardingZero": {
"description": "Schutz Ihrer Privatsphäre",
"message": "Schutz Ihrer Privatsphäre"
},
"portText": {
"description": "Port für das HTTP oder SOCKS5 Proxy",
"message": "Hafen:"
},
"protocolHandlerValue": {
"description": "Wert für den Magnetprotokoll-Handler",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s\u0026action=Add\u0026foo=Add+torrent"
},
"proxy-check": {
"description": "Proxy ist bereit.",
"message": "Proxy ist bereit."
},
"proxyFailedStatus": {
"description": "Proxy hat den Status versagt.",
"message": "Proxy ist nicht bereit"
},
"proxyHelpText": {
"description": "Hilfe zur Konfiguration der Optionen für den Reset Tunnel Button",
"message": "Konfigurieren Sie Ihren I2P-Proxy hier."
},
"proxySuccessStatus": {
"description": "Proxy hat den Status versagt.",
"message": "Proxy ist bereit"
},
"readyness": {
"description": "Proxy ist bereit.",
"message": "Proxy ist bereit."
},
"releases": {
"description": "Beschreibung für neue Release-Seite",
"message": "Hier finden Sie neue Releases"
},
"resetMessage": {
"description": "Nachricht für den Reset Tunnel Knopf",
"message": "Zurück zur Übersicht"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "Ersetzen mit Router Bandwidth Outbound 15s",
"message": "Ersetzen mit Router Bandwidth Outbound 15s"
},
"router-net-bw-inbound-1s": {
"description": "Ersetzen mit Router Bandbreite Inbound 1s",
"message": "Ersetzen mit Router Bandbreite Inbound 1s"
},
"router-net-bw-outbound-15s": {
"description": "Ersetzen mit Router Bandwidth Outbound 15s",
"message": "Ersetzen mit Router Bandwidth Outbound 15s"
},
"router-net-bw-outbound-1s": {
"description": "Ersetzen mit Router Bandwidth Outbound 1s",
"message": "Ersetzen mit Router Bandwidth Outbound 1s"
},
"router-net-tunnels-participating": {
"description": "Ersetzen mit Router Participing Tunnel Count",
"message": "Ersetzen mit Router Participing Tunnel Count"
},
"router-netdb-activepeers": {
"description": "Ersetzen mit Router Active Peers",
"message": "Ersetzen mit Router Active Peers"
},
"router-netdb-fastpeers": {
"description": "Ersetzen mit Router Fast Peers",
"message": "Ersetzen mit Router Fast Peers"
},
"router-netdb-highcapacitypeers": {
"description": "Ersetzen mit High Capacity Peers",
"message": "Ersetzen mit High Capacity Peers"
},
"router-netdb-isreseeding": {
"description": "Ersetzen mit Router netDB Ersatzstatus",
"message": "Ersetzen mit Router netDB Ersatzstatus"
},
"router-netdb-knownpeers": {
"description": "Ersetzen mit Router bekannten Peers",
"message": "Ersetzen mit Router bekannten Peers"
},
"router-restart": {
"description": "Angenehm Router neu starten",
"message": "Angenehm Router neu starten"
},
"router-shutdown": {
"description": "Anmutig herunterfahren Router",
"message": "Anmutig herunterfahren Router"
},
"router-status": {
"description": "Ersetzen mit Router Status",
"message": "Ersetzen mit Router Status"
},
"router-uptime": {
"description": "Ersetzen mit Router-Uptime",
"message": "Ersetzen mit Router-Uptime"
},
"router-version": {
"description": "Ersetzen mit Router Version",
"message": "Ersetzen mit Router Version"
},
"routerConsole": {
"description": "Beschreibung für die Router-Konsole.",
"message": "Greifen Sie auf Ihre I2P Router-Konsole und das gesamte Spektrum an Anwendungen und Konfigurationen zu."
},
"routerPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Router Console"
},
"routerPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Router Console (Private)"
},
"rpcHelpText": {
"description": "Konfigurieren Sie hier Ihre I2PControl-Optionen. Konfigurieren Sie hier Ihre Bittorrent-Optionen.",
"message": "Konfigurieren Sie hier Ihre I2PControl-Optionen. Konfigurieren Sie hier Ihre Bittorrent-Optionen."
},
"rpcHostText": {
"description": "Kontrollhafen:",
"message": "Kontrollhafen:"
},
"rpcPassText": {
"description": "Kontroll-Passwort: Torrent RPC Passwort:",
"message": "Kontroll-Passwort: Torrent RPC Passwort:"
},
"rpcPathText": {
"description": "Kontrollpfad:",
"message": "Kontrollpfad:"
},
"rpcPortText": {
"description": "Kontroll Host:",
"message": "Kontroll Host:"
},
"rtcDesc": {
"description": "WebRTC Aktionsbeschreibung",
"message": "WebRTC ist standardmäßig deaktiviert, aber Sie können es wieder einschalten und zwingen, die Proxy zu ehren. Wenn Sie ein Benutzer der Snowflake Browser-Erweiterung sind, ist diese Option deaktiviert und WebRTC wird standardmäßig eingeschaltet."
},
"signingcert": {
"description": "Unterzeichnet von:",
"message": "Unterzeichnet von:"
},
"siteLabel": {
"description": "Label für i2p Site Info",
"message": "Anschrift/Site Information:"
},
"sitecert": {
"description": "Zertifikat Information:",
"message": "Zertifikat Information:"
},
"snark": {
"description": "Beschreibung für Bittorrent",
"message": "Schneller Zugriff auf Snark, die Peer-to-peer I2P Netzwerk-spezifische Dateifreigabe-Anwendung."
},
"sourcehead": {
"description": "Erhalten Sie den Quellcode:",
"message": "Erhalten Sie den Quellcode:"
},
"sources": {
"description": "Beschreibung des Quellcode-Links",
"message": "Hier den Quellcode durchsuchen"
},
"susimail": {
"description": "Beschreibung für E-Mail",
"message": "Schneller Zugriff auf den SusiMail I2P Netzwerk-E-Mail-Client."
},
"text-section-header": {
"description": "Der unsichtbare Internet-Browser",
"message": "Der unsichtbare Internet-Browser"
},
"text-section-proxyerr-header": {
"description": "Ein Proxy-Fehler wurde behoben",
"message": "Ein Proxy-Fehler wurde behoben"
},
"text-section-torrents-header": {
"description": "Torrent Downloads",
"message": "Torrent Downloads"
},
"titlePreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "I2P Browser"
},
"titlePrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "I2P Browser (Privat)"
},
"toopie": {
"description": "Informationen Ã14ber Ihren I2P-Routerstatus finden Sie hier:",
"message": "Informationen Ã14ber Ihren I2P-Routerstatus finden Sie hier:"
},
"toopieHtmlHeadline": {
"description": "I2P Router Informationen",
"message": "I2P Router Informationen"
},
"toopieName": {
"description": "Name der Seitenleiste.",
"message": "auch. html"
},
"toopieTLS": {
"description": "Name des Sicherheitspanels.",
"message": "Site Properties"
},
"topbar": {
"description": "Nach oben",
"message": "Nach oben"
},
"torPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Tor Manager"
},
"torPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Tor Manager (Private)"
},
"torrent-action": {
"description": "Downloads",
"message": "Downloads"
},
"torrentControls": {
"description": "Torrent Controls",
"message": "Torrent Controls"
},
"torrentDownloads": {
"description": "Torrent Downloads",
"message": "Torrent Downloads"
},
"torrentPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "In den Warenkorb"
},
"torrentPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Bittorrent (Privat)"
},
"torrentui-opener": {
"description": "Open WebUI",
"message": "Open WebUI"
},
"visit-irc": {
"description": "Besuchen Sie IRC",
"message": "Besuchen Sie IRC"
},
"webPreface": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Web Browser"
},
"webPrefacePrivate": {
"description": "Vorwort für die Browser-Titelleiste",
"message": "Web Browser (Private)"
},
"webpage": {
"description": "Weitere Informationen finden Sie hier.",
"message": "Weitere Informationen finden Sie hier."
},
"window-visit-console": {
"description": "I2P Router Konsole",
"message": "I2P Router Konsole"
},
"window-visit-help": {
"description": "Unterstützungsseite",
"message": "Unterstützungsseite"
},
"window-visit-homepage": {
"description": "Der unsichtbare Internet-Browser",
"message": "Der unsichtbare Internet-Browser"
},
"window-visit-i2p": {
"description": "I2P Projektseite:",
"message": "I2P Projektseite:"
},
"window-visit-i2ptunnel": {
"description": "Hidden Services Manager",
"message": "Hidden Services Manager"
},
"window-visit-index": {
"description": "Webextension Homepage:",
"message": "Webextension Homepage:"
},
"window-visit-releases": {
"description": "Veröffentlichungen:",
"message": "Veröffentlichungen:"
},
"window-visit-router": {
"description": "Router Console",
"message": "Router Console"
},
"window-visit-settings": {
"description": "Öffnen Sie die Einstellungen",
"message": "Öffnen Sie die Einstellungen"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "Quelle Code:",
"message": "Quelle Code:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "Toopie",
"message": "Toopie"
},
"window-visit-torrent": {
"description": "Für Hilfe, besuchen Sie die Torrent Hilfe Seite",
"message": "Für Hilfe, besuchen Sie die Torrent Hilfe Seite"
},
"windowVisitConsole": {
"description": "Router Console Label.",
"message": "Router Console:"
},
"windowVisitHelppage": {
"description": "Hilfeseite für das Erweiterungslabel.",
"message": "WebExtension Informationen:"
},
"windowVisitHomepage": {
"description": "Startseite für das Erweiterungslabel.",
"message": "Startseite:"
},
"windowVisitI2ptunnel": {
"description": "Titel für i2ptunnel",
"message": "Hidden Services Manager:"
},
"windowVisitReleases": {
"description": "Besuchen Sie die Veröffentlichungsseite",
"message": "Erweiterung:"
},
"windowVisitSnark": {
"description": "Titel für Bittorrent",
"message": "Bittorrent:"
},
"windowVisitSources": {
"description": "Titel für Quellcode-Link",
"message": "Code der Erweiterung:"
},
"windowVisitSusimail": {
"description": "Titel für E-Mail",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "Besuchen Sie die Erweiterung Homepage auf Github",
"message": "Startseite:"
}
}

View File

@@ -1,302 +1,699 @@
{
"extensionName": {
"message": "I2P In Private Browsing",
"description": "Name of the extension."
"CertLabel": {
"description": "Certificate Information:",
"message": "Certificate Information:"
},
"toopieName": {
"message": "toopie.html",
"description": "Name of the sidebar."
"SignedLabel": { "description": "Signed By:", "message": "Signed By:" },
"TorrentTypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"toopieTLS": {
"message": "Site Properties",
"description": "Name of the security panel."
},
"extensionDescription": {
"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."
"TypeLabel": { "description": "Torrent Links:", "message": "Torrent Links:" },
"aboutconsole": {
"description": "To access the homepage of the router console, go here:",
"message": "To access the homepage of the router console, go here:"
},
"abouthome": {
"message": "For more information about this extension, visit this page.",
"description": "Description for the extension button page."
"description": "Description for the extension button page.",
"message": "For more information about this extension, visit this page."
},
"windowVisitHelppage": {
"message": "Help Page: ",
"description": "Help page for the extension label."
"addresstype": { "description": "Address Type:", "message": "Address Type:" },
"applicationExplain": {
"description": "Description for application section.",
"message": "The I2P router console and applications open in their own tab, providing them with the same security benefits as browsing with this extension. This adds more protection by isolating each application and preventing other tabs ( ie social media, etc ) from fingerprinting or scripts. All tabs use identifying colours to keep track of your I2P workflow."
},
"help": {
"message": "For more information about this extension, visit this page.",
"description": "Description for the extension button page."
"applicationHeader": {
"description": "Header for applications section.",
"message": "Applications"
},
"windowVisitI2ptunnel": {
"message": "Hidden Services Manager: ",
"description": "Title for i2ptunnel"
"beta": {
"description": "This is an experimental product.",
"message": "This is an experimental product."
},
"i2ptunnel": {
"message": "I2P has a web-based interface for configuring .i2p services like web sites which you can set up.",
"description": "Description for i2ptunnel"
"blogPreface": {
"description": "Preface for the browser titlebar",
"message": "Blog"
},
"windowVisitSusimail": {
"message": "E-Mail: ",
"description": "Title for e-mail"
"blogPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Blog (Private)"
},
"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"
},
"titlePrefacePrivate": {
"message": "I2P Browser (Private)",
"description": "Preface for the browser titlebar"
},
"extensionPreface": {
"message": "I2P Management",
"description": "Preface for the browser titlebar"
},
"webPreface": {
"message": "Web Browser",
"description": "Preface for the browser titlebar"
},
"webPrefacePrivate": {
"message": "Web Browser (Private)",
"description": "Preface for the browser titlebar"
},
"ircPreface": {
"message": "Dispatch IRC",
"description": "Preface for the browser titlebar"
},
"ircPrefacePrivate": {
"message": "Dispatch IRC (Private)",
"description": "Preface for the browser titlebar"
"bookmarksButton": {
"description": "Re-Create Bookmarks",
"message": "Re-Create Bookmarks"
},
"botePreface": {
"message": "I2P-Bote Mail",
"description": "Preface for the browser titlebar"
"description": "Preface for the browser titlebar",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"message": "I2P-Bote Mail (Private)",
"description": "Preface for the browser titlebar"
"description": "Preface for the browser titlebar",
"message": "I2P-Bote Mail (Private)"
},
"routerPreface": {
"message": "Router Console",
"description": "Preface for the browser titlebar"
"browser-action": { "description": "Browse", "message": "Browse" },
"btRpcHostText": {
"description": "Torrent RPC Host:",
"message": "Torrent RPC Host:"
},
"routerPrefacePrivate": {
"message": "Router Console (Private)",
"description": "Preface for the browser titlebar"
"btRpcPathText": {
"description": "Torrent RPC Path:",
"message": "Torrent RPC Path:"
},
"torrentPreface": {
"message": "Bittorrent",
"description": "Preface for the browser titlebar"
},
"torrentPrefacePrivate": {
"message": "Bittorrent (Private)",
"description": "Preface for the browser titlebar"
},
"mailPreface": {
"message": "Web Mail",
"description": "Preface for the browser titlebar"
},
"mailPrefacePrivate": {
"message": "Web Mail (Private)",
"description": "Preface for the browser titlebar"
},
"i2ptunnelPreface": {
"message": "Hidden Services Manager",
"description": "Preface for the browser titlebar"
},
"i2ptunnelPrefacePrivate": {
"message": "Hidden Services Manager (Private)",
"description": "Preface for the browser titlebar"
},
"muwirePreface": {
"message": "MuWire",
"description": "Preface for the browser titlebar"
},
"muwirePrefacePrivate": {
"message": "MuWire (Private)",
"description": "Preface for the browser titlebar"
},
"resetMessage": {
"message": "Reset Tunnel",
"description": "Message for the Reset Tunnel button"
},
"infoTitle": {
"message": "I2P Help",
"description": "Title for the help menu"
},
"infoMessage": {
"message": "You are now free to browse the eepWeb! Your browser is now configured to browse anonymously on the I2P network. As you browse, your traffic will be routed through other network nodes to disguise it's origin, both from the server and from the nodes themselves.",
"description": "Help Message"
},
"helpMessage": {
"message": "Get additional help",
"description": "Help Message"
},
"newsMessage": {
"message": "Visit the I2P Blog to learn the latest about i2p.",
"description": "Help Message"
},
"forumMessage": {
"message": "Visit the I2P Forum to learn more or ask for assistance",
"description": "Help Message"
},
"proxyHelpText": {
"message": "Configure your I2P proxy here.",
"description": "Help for configuring the options for the Reset Tunnel button"
},
"hostText": {
"message": "Host: ",
"description": "Host for the HTTP or SOCKS5 Proxy"
},
"portText": {
"message": "Port: ",
"description": "Port for the HTTP or SOCKS5 Proxy"
},
"controlHelpText": {
"message": "Configure your router console here.",
"description": "Help for configuring the options for the Reset Tunnel button"
},
"controlHostText": {
"message": "Control Host: ",
"description": "Host for the Router Console"
},
"controlPortText": {
"message": "Control Port: ",
"description": "Port for the Router Console"
},
"controlHostValue": {
"message": "127.0.0.1",
"description": "Host for the Router Console"
},
"controlPortValue": {
"message": "7657",
"description": "Port for the Router Console"
},
"isBase32": {
"message": "I2P Base32-Formatted Address",
"description": "Message for site info panel base32"
},
"isHostName": {
"message": "I2P Jump Hostname",
"description": "Message for the site info panel hostname"
},
"siteLabel": {
"message": "Address/Site Information:",
"description": "Label for i2p site info"
},
"certLabel": {
"message": "Certificate Information:",
"description": "Label for certificate info"
"btRpcPortText": {
"description": "Torrent RPC Port:",
"message": "Torrent RPC Port:"
},
"certAbsent": {
"message": "This site is not using HTTPS. It is still verified cryptographically by I2P.",
"description": "Content for certificate info if absent"
"description": "Content for certificate info if absent",
"message": "This site is not using HTTPS. It is still verified cryptographically by I2P."
},
"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"
"description": "Content for certificate info if present",
"message": "This site is using HTTPS. HTTPS over I2P is experimental and requires self-signed certificates or alternate root authorites."
},
"clearData": {
"description": "Clear Browsing Data menu item.",
"message": "Clear Browsing Data: "
},
"clearDesc": {
"description": "Clear browsing data action description.",
"message": "Use this to erase your I2P browsing data."
},
"controlExplain": {
"description": "Introduce the control panel.",
"message": "These controls are used to tailor your I2P Browsing Experience"
},
"controlHeader": {
"description": "Headline for control panel.",
"message": "Control"
},
"controlHelpText": {
"description": "Help for configuring the options for the Reset Tunnel button",
"message": "Configure your router console here."
},
"controlHostText": {
"description": "Host for the Router Console",
"message": "Control Host: "
},
"controlHostValue": {
"description": "Host for the Router Console",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Port for the Router Console",
"message": "Control Port: "
},
"controlPortValue": {
"description": "Port for the Router Console",
"message": "7657"
},
"description": {
"description": "You are now able to use I2P in this browser.",
"message": "You are now able to use I2P in this browser."
},
"description2": {
"description": "If you're seeing this page, it is because a proxy error has occurred. Some information has been provided to help you diagnose the issue.",
"message": "If you're seeing this page, it is because a proxy error has occurred. Some information has been provided to help you diagnose the issue."
},
"disableHistory": {
"description": "History checkbox label.",
"message": "Disable History in I2P Tabs?"
},
"enableWebRTC": {
"description": "WebRTC checkbox label.",
"message": "Enable WebRTC with proxy?"
},
"extensionDescription": {
"description": "Description of the extension.",
"message": "I2P network browsing made easy."
},
"extensionName": {
"description": "Name of the extension.",
"message": "I2P In Private Browsing"
},
"extensionNameVariant": {
"description": "Name of the extension.",
"message": "I2P In Private Browsing - Rhizome Variant"
},
"extensionPreface": {
"description": "Preface for the browser titlebar",
"message": "I2P Management"
},
"extensionVersion": {
"description": "Version of the extension.",
"message": "1.28"
},
"fliplinks": {
"description": "Extension and I2P Resources",
"message": "Extension and I2P Resources"
},
"forumMessage": {
"description": "Help Message",
"message": "Visit the I2P Forum to learn more or ask for assistance"
},
"headline": {
"description": "The Invisible Internet Browser",
"message": "The Invisible Internet Browser"
},
"help": {
"description": "Description for the extension button page.",
"message": "For more information about this extension, visit this page."
},
"helpMessage": {
"description": "Help Message",
"message": "Get additional help"
},
"histDesc": {
"description": "History action description",
"message": "History is automatically cleared when your I2P tabs are closed. If you want to clear history as you go, check this box."
},
"homepage": {
"description": "Find more information",
"message": "More information is available here"
},
"hostText": {
"description": "Host for the HTTP or SOCKS5 Proxy",
"message": "Host: "
},
"i2ppage": {
"description": "More information is available here.",
"message": "More information is available here."
},
"i2ptunnel": {
"description": "Description for i2ptunnel",
"message": "View proxy status messages and configure services and tunnels."
},
"i2ptunnelPreface": {
"description": "Preface for the browser titlebar",
"message": "Hidden Services Manager"
},
"i2ptunnelPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Hidden Services Manager (Private)"
},
"infoMessage": {
"description": "Help Message",
"message": "You are now free to browse the eepWeb! Your browser is now configured to browse anonymously on the I2P network. As you browse, your traffic will be routed through other network nodes to disguise it's origin, both from the server and from the nodes themselves."
},
"infoTitle": {
"description": "Title for the help menu",
"message": "I2P Help"
},
"ircPreface": {
"description": "Preface for the browser titlebar",
"message": "Dispatch IRC"
},
"ircPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Dispatch IRC (Private)"
},
"isBase32": {
"description": "Message for site info panel base32",
"message": "I2P Base32-Formatted Address"
},
"isHostName": {
"description": "Message for the site info panel hostname",
"message": "I2P Jump Hostname"
},
"label-router-activepeers": {
"description": "Active Peers:",
"message": "Active Peers:"
},
"label-router-bandwidth": {
"description": "Bandwidth",
"message": "Bandwidth"
},
"label-router-bw-inbound-15s": {
"description": "Inbound bw 15s:",
"message": "Inbound bw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "Inbound bw 1s:",
"message": "Inbound bw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "Outbound bw 15s:",
"message": "Outbound bw 15s:"
},
"label-router-bw-outbound-1s": {
"description": "Outbound bw 1s:",
"message": "Outbound bw 1s:"
},
"label-router-net-tunnels-participating": {
"description": "Transit Tunnels:",
"message": "Transit Tunnels:"
},
"label-router-netdb-fastpeers": {
"description": "Fast Peers:",
"message": "Fast Peers:"
},
"label-router-netdb-highcapacitypeers": {
"description": "High Capacity Peers:",
"message": "High Capacity Peers:"
},
"label-router-netdb-isreseeding": {
"description": "Reseed status:",
"message": "Reseed status:"
},
"label-router-netdb-knownpeers": {
"description": "Known Peers:",
"message": "Known Peers:"
},
"label-router-peers": { "description": "Peers", "message": "Peers" },
"label-router-status": {
"description": "Status Router Status:",
"message": "Status Router Status:"
},
"label-router-uptime": {
"description": "Router Uptime(Ms):",
"message": "Router Uptime(Ms):"
},
"label-router-version": {
"description": "Router Version:",
"message": "Router Version:"
},
"links": {
"description": "Extension and I2P Resources",
"message": "Extension and I2P Resources"
},
"linksExplain": {
"description": "If you want to get more information about I2P, you can visit these links.",
"message": "If you want to get more information about I2P, you can visit these links."
},
"mailPreface": {
"description": "Preface for the browser titlebar",
"message": "Web Mail"
},
"mailPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Web Mail (Private)"
},
"muwirePreface": {
"description": "Preface for the browser titlebar",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "MuWire (Private)"
},
"newsMessage": {
"description": "Help Message",
"message": "Visit the I2P Blog to learn the latest about i2p."
},
"onboardingButtonFive": {
"description": "Improving your Experience",
"message": "Improving your Experience"
},
"onboardingButtonFour": {
"description": "Sharing Files",
"message": "Sharing files"
},
"onboardingButtonOne": {
"description": "I2P Network Browsing and Non-I2P Network Browsing",
"message": "I2P Network Browsing and Non-I2P Network Browsing"
},
"onboardingButtonThree": {
"description": "Hidden e-mail",
"message": "Hidden e-mail"
},
"onboardingButtonTwo": {
"description": "Protecting Network Boundaries",
"message": "Protecting Network Boundaries"
},
"onboardingButtonZero": {
"description": "Protect your Privacy",
"message": "Protect your Privacy"
},
"onboardingContentFive": {
"description": "This extension can be combined with other extensions which sometimes improve it's functionality. uBlock Origin, LocalCDN, and jShelter are useful for speeding up page loading, blocking ads, and limiting the power of Javascript. For users who want to block all Javascript, NoScript is recommended.",
"message": "This extension can be combined with other extensions which sometimes improve it's functionality. uBlock Origin, LocalCDN, and jShelter are useful for speeding up page loading, blocking ads, and limiting the power of Javascript. For users who want to block all Javascript, NoScript is recommended."
},
"onboardingContentFour": {
"description": "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.",
"message": "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."
},
"onboardingContentOne": {
"description": "This extension works automatically when you are browsing I2P sites. If you want to use I2P as a proxy to non-I2P sites, use the I2P In Private Browsing button in the toolbar and click New I2P Browser Tab to switch to I2P Browsing in a new tab. 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.",
"message": "This extension works automatically when you are browsing I2P sites. If you want to use I2P as a proxy to non-I2P sites, use the I2P In Private Browsing button in the toolbar and click New I2P Browser Tab to switch to I2P Browsing in a new tab. 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."
},
"onboardingContentThree": {
"description": "There is also an anonymous e-mail service available inside of I2P, which is accessible from our browser via the menu directly to the right.",
"message": "There is also an anonymous e-mail service available inside of I2P, which is accessible from our browser via the menu directly to the right."
},
"onboardingContentTwo": {
"description": "I2P is normally administered via a WebUI(The \"Router Console \"), which the user sometimes views in the same browser they use to visit remote sites. It is essential to prevent sites from being able to access information from this WebUI and other locally running services. Clearnet sites remain in the firefox-default container, but as soon as the firefox-default container requests a *.onion or *.i2p site, it will be instantly containerized. Tor Browser's identity management tooling controls clearnet tabs, and they are proxied using the default I2P outproxy or outproxy plugin.",
"message": "I2P is normally administered via a WebUI(The \" Router Console \"), which the user sometimes views in the same browser they use to visit remote sites. It is essential to prevent sites from being able to access information from this WebUI and other locally running services. Clearnet sites remain in the firefox-default container, but as soon as the firefox-default container requests a *.onion or *.i2p site, it will be instantly containerized. Tor Browser's identity management tooling controls clearnet tabs, and they are proxied using the default I2P outproxy or outproxy plugin."
},
"onboardingContentZero": {
"description": " When using I2P In Private Browsing Mode, you are protected against tracking and surveillance.The I2P Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected as your browse.",
"message": " When using I2P In Private Browsing Mode, you are protected against tracking and surveillance.The I2P Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected as your browse."
},
"onboardingFive": {
"description": "Experience Tips",
"message": "Experience Tips"
},
"onboardingFour": {
"description": "Browsing the Web",
"message": "Browsing the Web"
},
"onboardingOne": {
"description": "Configure your Experience",
"message": "Configure your Experience"
},
"onboardingThree": {
"description": "Hidden e-mail",
"message": "Hidden e-mail"
},
"onboardingTitle": {
"description": "About I2P In Private Browsing",
"message": "About I2P In Private Browsing"
},
"onboardingTwo": { "description": "Share Files", "message": "Share Files" },
"onboardingZero": {
"description": "Protect your Privacy",
"message": "Protect your Privacy"
},
"portText": {
"description": "Port for the HTTP or SOCKS5 Proxy",
"message": "Port: "
},
"protocolHandlerValue": {
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent",
"description": "Value for the magnet protocol handler"
"description": "Value for the magnet protocol handler",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s\u0026action=Add\u0026foo=Add+torrent"
},
"proxy-check": {
"description": "Proxy is ready.",
"message": "Proxy is ready."
},
"proxyFailedStatus": {
"description": "Proxy failed status.",
"message": "Proxy is not ready"
},
"consoleFailedStatus": {
"description": "Proxy failed status.",
"message": "Console is not available, I2P is not started yet. If you have not intstalled I2P yet, please get it from https://geti2p.net."
},
"proxyHelpText": {
"description": "Help for configuring the options for the Reset Tunnel button",
"message": "Configure your I2P proxy here."
},
"proxySuccessStatus": {
"description": "Proxy failed status.",
"message": "Proxy is ready"
},
"proxyConsoleSuccessStatus": {
"description": "Proxy failed status.",
"message": "I2P is running."
},
"readyness": {
"description": "Proxy is ready.",
"message": "Proxy is ready."
},
"routerness": {
"description": "Proxy is ready.",
"message": "Router is ready."
},
"releases": {
"description": "Description for new release page",
"message": "Check for new releases here"
},
"resetMessage": {
"description": "Message for the Reset Tunnel button",
"message": "Reset Tunnel"
},
"returnhome": { "description": "/", "message": "/" },
"router-net-bw-inbound-15s": {
"description": "Replace with Router Bandwidth Outbound 15s",
"message": "Replace with Router Bandwidth Outbound 15s"
},
"router-net-bw-inbound-1s": {
"description": "Replace with Router Bandwidth Inbound 1s",
"message": "Replace with Router Bandwidth Inbound 1s"
},
"router-net-bw-outbound-15s": {
"description": "Replace with Router Bandwidth Outbound 15s",
"message": "Replace with Router Bandwidth Outbound 15s"
},
"router-net-bw-outbound-1s": {
"description": "Replace with Router Bandwidth Outbound 1s",
"message": "Replace with Router Bandwidth Outbound 1s"
},
"router-net-tunnels-participating": {
"description": "Replace with Router Participating Tunnel Count",
"message": "Replace with Router Participating Tunnel Count"
},
"router-netdb-activepeers": {
"description": "Replace with Router Active Peers",
"message": "Replace with Router Active Peers"
},
"router-netdb-fastpeers": {
"description": "Replace with Router Fast Peers",
"message": "Replace with Router Fast Peers"
},
"router-netdb-highcapacitypeers": {
"description": "Replace with High Capacity Peers",
"message": "Replace with High Capacity Peers"
},
"router-netdb-isreseeding": {
"description": "Replace with Router netDB Reseeding Status",
"message": "Replace with Router netDB Reseeding Status"
},
"router-netdb-knownpeers": {
"description": "Replace with Router Known Peers",
"message": "Replace with Router Known Peers"
},
"router-restart": {
"description": "Gracefully restart router",
"message": "Gracefully restart router"
},
"router-shutdown": {
"description": "Gracefully shutdown router",
"message": "Gracefully shutdown router"
},
"router-status": {
"description": "Replace with Router Status",
"message": "Replace with Router Status"
},
"router-uptime": {
"description": "Replace with Router Uptime",
"message": "Replace with Router Uptime"
},
"router-version": {
"description": "Replace with Router Version",
"message": "Replace with Router Version"
},
"routerConsole": {
"description": "Description for the router console.",
"message": "Access your I2P router console and its full range of applications and configurations."
},
"routerPreface": {
"description": "Preface for the browser titlebar",
"message": "Router Console"
},
"routerPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Router Console (Private)"
},
"rpcHelpText": {
"description": "Configure your I2PControl options here. Configure your Bittorrent options here.",
"message": "Configure your I2PControl options here. Configure your Bittorrent options here."
},
"rpcHostText": { "description": "Control Port:", "message": "Control Port:" },
"rpcPassText": {
"description": "Control Password: Torrent RPC Password:",
"message": "Control Password: Torrent RPC Password:"
},
"rpcPathText": { "description": "Control Path:", "message": "Control Path:" },
"rpcPortText": { "description": "Control Host:", "message": "Control Host:" },
"rtcDesc": {
"description": "WebRTC action description",
"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."
},
"signingcert": { "description": "Signed By:", "message": "Signed By:" },
"siteLabel": {
"description": "Label for i2p site info",
"message": "Address/Site Information:"
},
"sitecert": {
"description": "Certificate Information:",
"message": "Certificate Information:"
},
"snark": {
"description": "Description for Bittorrent",
"message": "Quick access to Snark, the Peer-to-peer I2P network specific file sharing application."
},
"sourcehead": {
"description": "Get the source code:",
"message": "Get the source code:"
},
"sources": {
"description": "Description for the Source code link",
"message": "Browse the source code here"
},
"susimail": {
"description": "Description for e-mail",
"message": "Quick access to the SusiMail I2P network email client."
},
"text-section-header": {
"description": "The Invisible Internet Browser",
"message": "The Invisible Internet Browser"
},
"text-section-proxyerr-header": {
"description": "A Proxy Error has Occurred",
"message": "A Proxy Error has Occurred"
},
"text-section-torrents-header": {
"description": "Torrent Downloads",
"message": "Torrent Downloads"
},
"titlePreface": {
"description": "Preface for the browser titlebar",
"message": "I2P Browser"
},
"titlePrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "I2P Browser (Private)"
},
"toopie": {
"description": "For information about your I2P router status, go here:",
"message": "For information about your I2P router status, go here:"
},
"toopieHtmlHeadline": {
"description": "I2P Router Information",
"message": "I2P Router Information"
},
"toopieName": {
"description": "Name of the sidebar.",
"message": "toopie.html"
},
"toopieTLS": {
"description": "Name of the security panel.",
"message": "Site Properties"
},
"topbar": { "description": "Browse Download", "message": "Browse Download" },
"torPreface": {
"description": "Preface for the browser titlebar",
"message": "Tor Manager"
},
"torPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Tor Manager (Private)"
},
"torrent-action": { "description": "Download", "message": "Download" },
"torrentControls": {
"description": "Torrent Controls",
"message": "Torrent Controls"
},
"torrentDownloads": {
"description": "Torrent Downloads",
"message": "Torrent Downloads"
},
"torrentPreface": {
"description": "Preface for the browser titlebar",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Bittorrent (Private)"
},
"torrentui-opener": { "description": "Open WebUI", "message": "Open WebUI" },
"visit-irc": { "description": "Visit IRC", "message": "Visit IRC" },
"webPreface": {
"description": "Preface for the browser titlebar",
"message": "Web Browser"
},
"webPrefacePrivate": {
"description": "Preface for the browser titlebar",
"message": "Web Browser (Private)"
},
"webpage": {
"description": "More information is available here.",
"message": "More information is available here."
},
"window-visit-console": {
"description": "I2P Router Console",
"message": "I2P Router Console"
},
"window-visit-help": {
"description": "Extension Help Page",
"message": "Extension Help Page"
},
"window-visit-homepage": {
"description": "The Invisible Internet Browser",
"message": "The Invisible Internet Browser"
},
"window-visit-i2p": {
"description": "I2P Project Homepage:",
"message": "I2P Project Homepage:"
},
"window-visit-i2ptunnel": {
"description": "Hidden Services Manager",
"message": "Hidden Services Manager"
},
"window-visit-index": {
"description": "Webextension Homepage:",
"message": "Webextension Homepage:"
},
"window-visit-releases": {
"description": "Releases:",
"message": "Releases:"
},
"window-visit-router": {
"description": "Router Console",
"message": "Router Console"
},
"window-visit-settings": {
"description": "Open the settings",
"message": "Open the settings"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "Source Code:",
"message": "Source Code:"
},
"window-visit-susimail": { "description": "E-Mail", "message": "E-Mail" },
"window-visit-toopie": { "description": "Toopie", "message": "Toopie" },
"window-visit-torrent": {
"description": "For assistance, visit the torrent help page",
"message": "For assistance, visit the torrent help page"
},
"windowVisitConsole": {
"description": "Router Console label.",
"message": "Router Console: "
},
"windowVisitHelppage": {
"description": "Help page for the extension label.",
"message": "WebExtension Information: "
},
"windowVisitHomepage": {
"description": "Home page for the extension label.",
"message": "Home Page: "
},
"windowVisitI2ptunnel": {
"description": "Title for i2ptunnel",
"message": "Hidden Services Manager: "
},
"windowVisitReleases": {
"description": "Visit the release page",
"message": "Extension Releases: "
},
"windowVisitSnark": {
"description": "Title for Bittorrent",
"message": "Bittorrent: "
},
"windowVisitSources": {
"description": "Title for source code link",
"message": "Extension Source Code: "
},
"windowVisitSusimail": {
"description": "Title for e-mail",
"message": "E-Mail: "
},
"windowVisitWebPage": {
"description": "Visit extension homepage on Github",
"message": "Extension Home Page: "
}
}

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

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "Información del certificado:",
"message": "Información del certificado:"
},
"SignedLabel": {
"description": "Firmada por:",
"message": "Firmada por:"
},
"TorrentTypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"TypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"aboutconsole": {
"description": "Para acceder a la página principal de la consola router, vaya aquí:",
"message": "Para acceder a la página principal de la consola router, vaya aquí:"
},
"abouthome": {
"description": "Descripción para la página de botón de extensión.",
"message": "Para obtener más información sobre esta extensión, visite esta página."
},
"addresstype": {
"description": "Tipo de dirección:",
"message": "Tipo de dirección:"
},
"applicationExplain": {
"description": "Descripción para sección de aplicación.",
"message": "La consola de router I2P y las aplicaciones se abren en su propia pestaña, proporcionándoles los mismos beneficios de seguridad que navegar con esta extensión. Esto añade más protección al aislar cada aplicación y prevenir otras pestañas (es decir, redes sociales, etc) de las huellas dactilares o scripts. Todas las pestañas utilizan colores de identificación para hacer un seguimiento de su flujo de trabajo I2P."
},
"applicationHeader": {
"description": "Header for applications section.",
"message": "Aplicaciones"
},
"beta": {
"description": "Este es un producto experimental.",
"message": "Este es un producto experimental."
},
"blogPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Blog"
},
"blogPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Blog (Privada)"
},
"bookmarksButton": {
"description": "Re-Crear marcadores",
"message": "Re-Crear marcadores"
},
"botePreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "I2P-Bote Mail (Privado)"
},
"browser-action": {
"description": "Navega",
"message": "Navega"
},
"btRpcHostText": {
"description": "Torrent RPC Host:",
"message": "Torrent RPC Host:"
},
"btRpcPathText": {
"description": "Torrent RPC Sendero:",
"message": "Torrent RPC Sendero:"
},
"btRpcPortText": {
"description": "Torrent RPC Puerto:",
"message": "Torrent RPC Puerto:"
},
"certAbsent": {
"description": "Contenido para información de certificado si ausente",
"message": "Este sitio no está utilizando HTTPS. Todavía está verificada criptográficamente por I2P."
},
"certPresent": {
"description": "Contenido para información de certificados si está presente",
"message": "Este sitio está utilizando HTTPS. HTTPS sobre I2P es experimental y requiere certificados auto-firmados o autoritas de raíz alternativa."
},
"clearData": {
"description": "Borrar el menú de datos de navegación.",
"message": "Datos claros de navegación:"
},
"clearDesc": {
"description": "Descripción clara de la acción de datos de navegación.",
"message": "Utilice esto para borrar sus datos de navegación I2P."
},
"controlExplain": {
"description": "Introduce el panel de control.",
"message": "Estos controles se utilizan para adaptar su experiencia de navegación I2P"
},
"controlHeader": {
"description": "Directo para panel de control.",
"message": "Control"
},
"controlHelpText": {
"description": "Ayuda para configurar las opciones del botón Reset Tunnel",
"message": "Configure su consola de router aquí."
},
"controlHostText": {
"description": "Host for the Router Console",
"message": "Control Host:"
},
"controlHostValue": {
"description": "Host for the Router Console",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Puerto para la consola Router",
"message": "Puerto de control:"
},
"controlPortValue": {
"description": "Puerto para la consola Router",
"message": "7657"
},
"description": {
"description": "Ahora puede utilizar I2P en este navegador.",
"message": "Ahora puede utilizar I2P en este navegador."
},
"description2": {
"description": "Si estás viendo esta página, es porque se ha producido un error proxy. Se ha proporcionado información para ayudarle a diagnosticar el problema.",
"message": "Si estás viendo esta página, es porque se ha producido un error proxy. Se ha proporcionado información para ayudarle a diagnosticar el problema."
},
"disableHistory": {
"description": "Etiquetas de la caja de verificación de historia.",
"message": "Historia deshabilitación en pestañas I2P?"
},
"enableWebRTC": {
"description": "Etiquetas de la casilla de verificación WebRTC.",
"message": "¿Habilitar WebRTC con proxy?"
},
"extensionDescription": {
"description": "Descripción de la extensión.",
"message": "La navegación por red I2P se hizo fácil."
},
"extensionName": {
"description": "Nombre de la extensión.",
"message": "I2P En Cuervos Privados"
},
"extensionNameVariant": {
"description": "Nombre de la extensión.",
"message": "I2P en la navegación privada - Variante de Rhizome"
},
"extensionPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "I2P Management"
},
"extensionVersion": {
"description": "Versión de la extensión.",
"message": "1.28"
},
"fliplinks": {
"description": "Extension and I2P Resources",
"message": "Extension and I2P Resources"
},
"forumMessage": {
"description": "Mensaje de ayuda",
"message": "Visite el Foro I2P para aprender más o pedir asistencia"
},
"headline": {
"description": "El navegador de Internet invisible",
"message": "El navegador de Internet invisible"
},
"help": {
"description": "Descripción para la página de botón de extensión.",
"message": "Para obtener más información sobre esta extensión, visite esta página."
},
"helpMessage": {
"description": "Mensaje de ayuda",
"message": "Obtener ayuda adicional"
},
"histDesc": {
"description": "Descripción de la acción de la historia",
"message": "La historia se limpia automáticamente cuando las pestañas I2P están cerradas. Si quieres aclarar la historia mientras vas, compruebe esta caja."
},
"homepage": {
"description": "Encontrar más información",
"message": "Más información está disponible aquí"
},
"hostText": {
"description": "Host for the HTTP or SOCKS5 Proxy",
"message": "Host:"
},
"i2ppage": {
"description": "Aquí hay más información.",
"message": "Aquí hay más información."
},
"i2ptunnel": {
"description": "Descripción para i2ptunnel",
"message": "Ver mensajes de estado proxy y configurar servicios y túneles."
},
"i2ptunnelPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Hidden Services Manager"
},
"i2ptunnelPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Hidden Services Manager (Private)"
},
"infoMessage": {
"description": "Mensaje de ayuda",
"message": "¡Ahora eres libre de navegar por el eepWeb! Su navegador ahora está configurado para navegar de forma anónima en la red I2P. Mientras navega, su tráfico será enrutado a través de otros nodos de red para ocultar su origen, tanto desde el servidor como desde los propios nodos."
},
"infoTitle": {
"description": "Título para el menú de ayuda",
"message": "I2P Ayuda"
},
"ircPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Dispatch IRC"
},
"ircPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Dispatch IRC (Private)"
},
"isBase32": {
"description": "Mensaje para la base del panel info del sitio32",
"message": "Dirección I2P Base32-Formatted"
},
"isHostName": {
"description": "Mensaje para el nombre de host del panel info site",
"message": "I2P Jump Hostname"
},
"label-router-activepeers": {
"description": "Peers activos:",
"message": "Peers activos:"
},
"label-router-bandwidth": {
"description": "Ancho de banda",
"message": "Ancho de banda"
},
"label-router-bw-inbound-15s": {
"description": "Inbound bw 15s:",
"message": "Inbound bw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "Inbound bw 1s:",
"message": "Inbound bw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "Saliente bw 15s:",
"message": "Saliente bw 15s:"
},
"label-router-bw-outbound-1s": {
"description": "Saliente bw 1s:",
"message": "Saliente bw 1s:"
},
"label-router-net-tunnels-participating": {
"description": "Tunels de tránsito:",
"message": "Tunels de tránsito:"
},
"label-router-netdb-fastpeers": {
"description": "Peers rápidos:",
"message": "Peers rápidos:"
},
"label-router-netdb-highcapacitypeers": {
"description": "Alta capacidad Peers:",
"message": "Alta capacidad Peers:"
},
"label-router-netdb-isreseeding": {
"description": "Estado civil:",
"message": "Estado civil:"
},
"label-router-netdb-knownpeers": {
"description": "Peers conocidos:",
"message": "Peers conocidos:"
},
"label-router-peers": {
"description": "Peers",
"message": "Peers"
},
"label-router-status": {
"description": "Status Router Status:",
"message": "Status Router Status:"
},
"label-router-uptime": {
"description": "Router Uptime(Ms):",
"message": "Router Uptime(Ms):"
},
"label-router-version": {
"description": "Versión del router:",
"message": "Versión del router:"
},
"links": {
"description": "Extension and I2P Resources",
"message": "Extension and I2P Resources"
},
"linksExplain": {
"description": "Si desea obtener más información sobre I2P, puede visitar estos enlaces.",
"message": "Si desea obtener más información sobre I2P, puede visitar estos enlaces."
},
"mailPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Web Mail"
},
"mailPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Web Mail (Privada)"
},
"muwirePreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "MuWire (Privada)"
},
"newsMessage": {
"description": "Mensaje de ayuda",
"message": "Visita el I2P Blog para aprender lo último sobre i2p."
},
"onboardingButtonFive": {
"description": "Mejora tu Experiencia",
"message": "Mejora tu Experiencia"
},
"onboardingButtonFour": {
"description": "Compartir archivos",
"message": "Compartir archivos"
},
"onboardingButtonOne": {
"description": "Browsing de red I2P y Browsing de red no I2P",
"message": "Browsing de red I2P y Browsing de red no I2P"
},
"onboardingButtonThree": {
"description": "Correo electrónico oculto",
"message": "Correo electrónico oculto"
},
"onboardingButtonTwo": {
"description": "Red de protección de límites",
"message": "Red de protección de límites"
},
"onboardingButtonZero": {
"description": "Protege tu privacidad",
"message": "Protege tu privacidad"
},
"onboardingContentFive": {
"description": "Esta extensión se puede combinar con otras extensiones que a veces mejoran su funcionalidad. uBlock Origin, LocalCDN y jShelter son útiles para acelerar la carga de página, bloquear anuncios y limitar el poder de Javascript. Para los usuarios que quieren bloquear todo Javascript, NoScript es recomendado.",
"message": "Esta extensión se puede combinar con otras extensiones que a veces mejoran su funcionalidad. uBlock Origin, LocalCDN y jShelter son útiles para acelerar la carga de página, bloquear anuncios y limitar el poder de Javascript. Para los usuarios que quieren bloquear todo Javascript, NoScript es recomendado."
},
"onboardingContentFour": {
"description": "I2P es capaz de usar aplicaciones entre pares como BitTorrent, protegiendo su identidad cuando comparte archivos. Nuestro cliente de bittorrent anónimo está disponible en el navegador.",
"message": "I2P es capaz de usar aplicaciones entre pares como BitTorrent, protegiendo su identidad cuando comparte archivos. Nuestro cliente de bittorrent anónimo está disponible en el navegador."
},
"onboardingContentOne": {
"description": "Esta extensión funciona automáticamente cuando está navegando por sitios I2P. Si desea utilizar I2P como un proxy a sitios no I2P, utilice el botón I2P En el Browsing privado en la barra de herramientas y haga clic en Nueva pestaña de navegador I2P para cambiar a I2P Browsing en una nueva pestaña. Su experiencia mientras navega por Internet puede ser un poco diferente. Las cosas pueden ser un poco más lentas, y dependiendo de su nivel de seguridad, algunos elementos pueden no funcionar o cargar. También se le puede pedir que demuestre que usted es un humano y no un robot.",
"message": "Esta extensión funciona automáticamente cuando está navegando por sitios I2P. Si desea utilizar I2P como un proxy a sitios no I2P, utilice el botón I2P En el Browsing privado en la barra de herramientas y haga clic en Nueva pestaña de navegador I2P para cambiar a I2P Browsing en una nueva pestaña. Su experiencia mientras navega por Internet puede ser un poco diferente. Las cosas pueden ser un poco más lentas, y dependiendo de su nivel de seguridad, algunos elementos pueden no funcionar o cargar. También se le puede pedir que demuestre que usted es un humano y no un robot."
},
"onboardingContentThree": {
"description": "También hay un servicio de correo electrónico anónimo disponible dentro de I2P, que es accesible desde nuestro navegador a través del menú directamente a la derecha.",
"message": "También hay un servicio de correo electrónico anónimo disponible dentro de I2P, que es accesible desde nuestro navegador a través del menú directamente a la derecha."
},
"onboardingContentTwo": {
"description": "I2P se administra normalmente a través de un WebUI (La \"Consola de red\", que el usuario a veces ve en el mismo navegador que utilizan para visitar sitios remotos. Es esencial evitar que los sitios puedan acceder a la información de este WebUI y otros servicios de gestión local. Los sitios de Clearnet permanecen en el contenedor predeterminado Firefox, pero tan pronto como el contenedor predeterminado Firefox solicite un sitio *.onion o *.i2p, será inmediatamente containerizzato. La herramienta de gestión de la identidad de Tor Browser controla las pestañas de las redes claras, y son proxidas utilizando el plugin predeterminado I2P outproxy o outproxy.",
"message": "I2P se administra normalmente a través de un WebUI (La \"Consola de Router\", que el usuario a veces ve en el mismo navegador que utilizan para visitar sitios remotos. Es esencial evitar que los sitios puedan acceder a la información de este WebUI y otros servicios de gestión local. Los sitios de Clearnet permanecen en el contenedor predeterminado Firefox, pero tan pronto como el contenedor predeterminado Firefox solicite un sitio *.onion o *.i2p, será inmediatamente containerizzato. La herramienta de gestión de la identidad de Tor Browser controla las pestañas de las redes claras, y son proxidas utilizando el plugin predeterminado I2P outproxy o outproxy."
},
"onboardingContentZero": {
"description": "Al utilizar I2P In Private Browsing Mode, usted está protegido contra el seguimiento y la vigilancia. El navegador I2P aísla las cookies y elimina la historia de su navegador después de su sesión. Estas modificaciones aseguran que su privacidad y seguridad estén protegidos como su navegación.",
"message": "Al utilizar I2P In Private Browsing Mode, usted está protegido contra el seguimiento y la vigilancia. El navegador I2P aísla las cookies y elimina la historia de su navegador después de su sesión. Estas modificaciones aseguran que su privacidad y seguridad estén protegidos como su navegación."
},
"onboardingFive": {
"description": "Consejos de experiencia",
"message": "Consejos de experiencia"
},
"onboardingFour": {
"description": "Browsing the Web",
"message": "Browsing the Web"
},
"onboardingOne": {
"description": "Configure su Experiencia",
"message": "Configure su Experiencia"
},
"onboardingThree": {
"description": "Correo electrónico oculto",
"message": "Correo electrónico oculto"
},
"onboardingTitle": {
"description": "Acerca de I2P en la navegación privada",
"message": "Acerca de I2P en la navegación privada"
},
"onboardingTwo": {
"description": "Compartir archivos",
"message": "Compartir archivos"
},
"onboardingZero": {
"description": "Protege tu privacidad",
"message": "Protege tu privacidad"
},
"portText": {
"description": "Puerto para HTTP o SOCKS5 Proxy",
"message": "Puerto:"
},
"protocolHandlerValue": {
"description": "Valor para el controlador de protocolo magnético",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s implicaaction=Add coinfoo=Add+torrent"
},
"proxy-check": {
"description": "Proxy está listo.",
"message": "Proxy está listo."
},
"proxyFailedStatus": {
"description": "Estado fallido.",
"message": "Proxy no está listo"
},
"proxyHelpText": {
"description": "Ayuda para configurar las opciones del botón Reset Tunnel",
"message": "Configure su proxy I2P aquí."
},
"proxySuccessStatus": {
"description": "Estado fallido.",
"message": "Proxy está listo"
},
"readyness": {
"description": "Proxy está listo.",
"message": "Proxy está listo."
},
"releases": {
"description": "Descripción para nueva página de lanzamiento",
"message": "Comprueba nuevos lanzamientos aquí"
},
"resetMessage": {
"description": "Mensaje para el botón Reset",
"message": "Reiniciar el túnel"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "Reemplazar con Router ancho de banda 15",
"message": "Reemplazar con Router ancho de banda 15"
},
"router-net-bw-inbound-1s": {
"description": "Reemplazar con el ancho de banda de router 1s",
"message": "Reemplazar con el ancho de banda de router 1s"
},
"router-net-bw-outbound-15s": {
"description": "Reemplazar con Router ancho de banda 15",
"message": "Reemplazar con Router ancho de banda 15"
},
"router-net-bw-outbound-1s": {
"description": "Reemplazar con Router ancho de banda 1",
"message": "Reemplazar con Router ancho de banda 1"
},
"router-net-tunnels-participating": {
"description": "Reemplazar con el Conde de túnel participante de Router",
"message": "Reemplazar con el Conde de túnel participante de Router"
},
"router-netdb-activepeers": {
"description": "Reemplazar con los Peers Activos Router",
"message": "Reemplazar con los Peers Activos Router"
},
"router-netdb-fastpeers": {
"description": "Reemplazar con los Peers Rápidas Router",
"message": "Reemplazar con los Peers Rápidas Router"
},
"router-netdb-highcapacitypeers": {
"description": "Sustitúyase por los trabajadores de alta capacidad",
"message": "Sustitúyase por los trabajadores de alta capacidad"
},
"router-netdb-isreseeding": {
"description": "Sustitúyase por Router netDB Estado de repaso",
"message": "Sustitúyase por Router netDB Estado de repaso"
},
"router-netdb-knownpeers": {
"description": "Reemplazar con los Peers Conocidos Router",
"message": "Reemplazar con los Peers Conocidos Router"
},
"router-restart": {
"description": "Router de reiniciar",
"message": "Router de reiniciar"
},
"router-shutdown": {
"description": "Router de apagado elegante",
"message": "Router de apagado elegante"
},
"router-status": {
"description": "Sustitúyase por Router Status",
"message": "Sustitúyase por Router Status"
},
"router-uptime": {
"description": "Reemplazar con Router Uptime",
"message": "Reemplazar con Router Uptime"
},
"router-version": {
"description": "Reemplazar con la versión Router",
"message": "Reemplazar con la versión Router"
},
"routerConsole": {
"description": "Descripción para la consola del router.",
"message": "Acceda a su consola de router I2P y a su gama completa de aplicaciones y configuraciones."
},
"routerPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Router Console"
},
"routerPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Router Console (Privada)"
},
"rpcHelpText": {
"description": "Configura tus opciones de I2PControl aquí. Configure sus opciones Bittorrent aquí.",
"message": "Configura tus opciones de I2PControl aquí. Configure sus opciones Bittorrent aquí."
},
"rpcHostText": {
"description": "Puerto de control:",
"message": "Puerto de control:"
},
"rpcPassText": {
"description": "Contraseña de control: Torrent RPC Contraseña:",
"message": "Contraseña de control: Torrent RPC Contraseña:"
},
"rpcPathText": {
"description": "Sendero de control:",
"message": "Sendero de control:"
},
"rpcPortText": {
"description": "Control Host:",
"message": "Control Host:"
},
"rtcDesc": {
"description": "Descripción de la acción WebRTC",
"message": "WebRTC está deshabilitado por defecto, pero puede activarlo y forzarlo a honrar al proxy. Si usted es un usuario de la extensión del navegador Snowflake, esta opción está deshabilitada y WebRTC se activa por defecto."
},
"signingcert": {
"description": "Firmada por:",
"message": "Firmada por:"
},
"siteLabel": {
"description": "Etiquetas para el sitio i2p info",
"message": "Address/Site Information:"
},
"sitecert": {
"description": "Información del certificado:",
"message": "Información del certificado:"
},
"snark": {
"description": "Descripción para Bittorrent",
"message": "Quick access to Snark, the Peer-to-peer I2P network specific file sharing application."
},
"sourcehead": {
"description": "Obtener el código fuente:",
"message": "Obtener el código fuente:"
},
"sources": {
"description": "Descripción para el enlace de código fuente",
"message": "Examine el código fuente aquí"
},
"susimail": {
"description": "Descripción para e-mail",
"message": "Acceso rápido al cliente de correo electrónico de red SusiMail I2P."
},
"text-section-header": {
"description": "El navegador de Internet invisible",
"message": "El navegador de Internet invisible"
},
"text-section-proxyerr-header": {
"description": "Un error proxy ha corrido",
"message": "Un error proxy ha corrido"
},
"text-section-torrents-header": {
"description": "Descarga Torrent",
"message": "Descarga Torrent"
},
"titlePreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Navegador I2P"
},
"titlePrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Navegador I2P (Privado)"
},
"toopie": {
"description": "Para obtener información sobre su estado de router I2P, vaya aquí:",
"message": "Para obtener información sobre su estado de router I2P, vaya aquí:"
},
"toopieHtmlHeadline": {
"description": "I2P Router Information",
"message": "I2P Router Information"
},
"toopieName": {
"description": "Nombre de la barra lateral.",
"message": "también. html"
},
"toopieTLS": {
"description": "Nombre del panel de seguridad.",
"message": "Propiedades del sitio"
},
"topbar": {
"description": "Descargar",
"message": "Descargar"
},
"torPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Tor Manager"
},
"torPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Tor Manager (Private)"
},
"torrent-action": {
"description": "Descargar",
"message": "Descargar"
},
"torrentControls": {
"description": "Controles Torrent",
"message": "Controles Torrent"
},
"torrentDownloads": {
"description": "Descarga Torrent",
"message": "Descarga Torrent"
},
"torrentPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Bittorrent (Private)"
},
"torrentui-opener": {
"description": "Open WebUI",
"message": "Open WebUI"
},
"visit-irc": {
"description": "Visit IRC",
"message": "Visit IRC"
},
"webPreface": {
"description": "Prefacio para la barra de título del navegador",
"message": "Web Browser"
},
"webPrefacePrivate": {
"description": "Prefacio para la barra de título del navegador",
"message": "Web Browser (Privada)"
},
"webpage": {
"description": "Aquí hay más información.",
"message": "Aquí hay más información."
},
"window-visit-console": {
"description": "I2P Router Console",
"message": "I2P Router Console"
},
"window-visit-help": {
"description": "Extension Help Page",
"message": "Extension Help Page"
},
"window-visit-homepage": {
"description": "El navegador de Internet invisible",
"message": "El navegador de Internet invisible"
},
"window-visit-i2p": {
"description": "I2P Project Homepage:",
"message": "I2P Project Homepage:"
},
"window-visit-i2ptunnel": {
"description": "Hidden Services Manager",
"message": "Hidden Services Manager"
},
"window-visit-index": {
"description": "Webextension Homepage:",
"message": "Webextension Homepage:"
},
"window-visit-releases": {
"description": "Comunicados:",
"message": "Comunicados:"
},
"window-visit-router": {
"description": "Router Console",
"message": "Router Console"
},
"window-visit-settings": {
"description": "Abra la configuración",
"message": "Abra la configuración"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "Código fuente:",
"message": "Código fuente:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "Toopie",
"message": "Toopie"
},
"window-visit-torrent": {
"description": "Para asistencia, visite la página de ayuda torrent",
"message": "Para asistencia, visite la página de ayuda torrent"
},
"windowVisitConsole": {
"description": "Consola Router.",
"message": "Consola Router:"
},
"windowVisitHelppage": {
"description": "Ayuda página para la etiqueta de extensión.",
"message": "WebExtension Information:"
},
"windowVisitHomepage": {
"description": "Página principal para la etiqueta de extensión.",
"message": "Página principal:"
},
"windowVisitI2ptunnel": {
"description": "Título para i2ptunnel",
"message": "Administrador de servicios ocultos:"
},
"windowVisitReleases": {
"description": "Visita la página de lanzamiento",
"message": "Extension Releases:"
},
"windowVisitSnark": {
"description": "Título para Bittorrent",
"message": "Bittorrent:"
},
"windowVisitSources": {
"description": "Título del enlace de código fuente",
"message": "Código fuente de extensión:"
},
"windowVisitSusimail": {
"description": "Título del correo electrónico",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "Visita la página principal de extensión en Github",
"message": "Extension Home Page:"
}
}

738
_locales/fr/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "Renseignements sur le certificat:",
"message": "Renseignements sur le certificat:"
},
"SignedLabel": {
"description": "Signé par:",
"message": "Signé par:"
},
"TorrentTypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"TypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"aboutconsole": {
"description": "Pour accéder à la page d'accueil de la console routeur, allez ici:",
"message": "Pour accéder à la page d'accueil de la console routeur, allez ici:"
},
"abouthome": {
"description": "Description pour la page du bouton d'extension.",
"message": "Pour plus d'informations sur cette extension, visitez cette page."
},
"addresstype": {
"description": "Type d ' adresse:",
"message": "Type d ' adresse:"
},
"applicationExplain": {
"description": "Description pour la section de demande.",
"message": "La console de routeur I2P et les applications s'ouvrent dans leur propre onglet, leur fournissant les mêmes avantages de sécurité que la navigation avec cette extension. Cela ajoute plus de protection en isolant chaque application et en empêchant d'autres onglets (c'est-à-dire les médias sociaux, etc ) de l'empreinte ou des scripts. Tous les onglets utilisent des couleurs d'identification pour suivre votre flux de travail I2P."
},
"applicationHeader": {
"description": "Header for applications section.",
"message": "Applications"
},
"beta": {
"description": "C'est un produit expérimental.",
"message": "C'est un produit expérimental."
},
"blogPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Blog"
},
"blogPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Blog (Private)"
},
"bookmarksButton": {
"description": "Re-Create Signets",
"message": "Re-Create Signets"
},
"botePreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "I2P-Bote Mail (Private)"
},
"browser-action": {
"description": "Parcourir",
"message": "Parcourir"
},
"btRpcHostText": {
"description": "Torrent RPC Hébergement :",
"message": "Torrent RPC Hébergement :"
},
"btRpcPathText": {
"description": "Torrent RPC Sentier :",
"message": "Torrent RPC Sentier :"
},
"btRpcPortText": {
"description": "Torrent RPC Port:",
"message": "Torrent RPC Port:"
},
"certAbsent": {
"description": "Contenu de l'information de certificat si absent",
"message": "Ce site n'utilise pas HTTPS. Il est encore vérifié cryptographiquement par I2P."
},
"certPresent": {
"description": "Contenu pour les informations de certificat si présent",
"message": "Ce site utilise HTTPS. HTTPS sur I2P est expérimental et nécessite des certificats autosignés ou des auteurs root alternatifs."
},
"clearData": {
"description": "Clear Browsing Data menu item.",
"message": "Données de croissance claire:"
},
"clearDesc": {
"description": "Effacer la description des données de navigation.",
"message": "Utilisez ceci pour effacer vos données de navigation I2P."
},
"controlExplain": {
"description": "Introduisez le panneau de commande.",
"message": "Ces contrôles sont utilisés pour adapter votre expérience de croissance I2P"
},
"controlHeader": {
"description": "Headline pour panneau de commande.",
"message": "Contrôle"
},
"controlHelpText": {
"description": "Aide pour configurer les options pour le bouton Reset Tunnel",
"message": "Configurez votre routeur."
},
"controlHostText": {
"description": "Host for the Router Console",
"message": "Hostie de contrôle:"
},
"controlHostValue": {
"description": "Host for the Router Console",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Port pour la Console Routeur",
"message": "Port de contrôle:"
},
"controlPortValue": {
"description": "Port pour la Console Routeur",
"message": "7657"
},
"description": {
"description": "Vous pouvez maintenant utiliser I2P dans ce navigateur.",
"message": "Vous pouvez maintenant utiliser I2P dans ce navigateur."
},
"description2": {
"description": "Si vous voyez cette page, c'est parce qu'une erreur de procuration s'est produite. Certaines informations ont été fournies pour vous aider à diagnostiquer le problème.",
"message": "Si vous voyez cette page, c'est parce qu'une erreur de procuration s'est produite. Certaines informations ont été fournies pour vous aider à diagnostiquer le problème."
},
"disableHistory": {
"description": "L'étiquette de la case à cocher.",
"message": "Histoire désactive dans I2P Tabs?"
},
"enableWebRTC": {
"description": "WebRTC checkbox label.",
"message": "Activer WebRTC avec proxy?"
},
"extensionDescription": {
"description": "Description de l'extension.",
"message": "La navigation du réseau I2P est facile."
},
"extensionName": {
"description": "Nom de l'extension.",
"message": "I2P Dans la foule privée"
},
"extensionNameVariant": {
"description": "Nom de l'extension.",
"message": "I2P In Private Browsing - Variante Rhizome"
},
"extensionPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "I2P Management"
},
"extensionVersion": {
"description": "Version de l'extension.",
"message": "1.28"
},
"fliplinks": {
"description": "Extension et ressources I2P",
"message": "Extension et ressources I2P"
},
"forumMessage": {
"description": "Message d'aide",
"message": "Visitez le Forum I2P pour en savoir plus ou demandez de l'aide"
},
"headline": {
"description": "Le navigateur Internet invisible",
"message": "Le navigateur Internet invisible"
},
"help": {
"description": "Description pour la page du bouton d'extension.",
"message": "Pour plus d'informations sur cette extension, visitez cette page."
},
"helpMessage": {
"description": "Message d'aide",
"message": "Obtenez de l'aide supplémentaire"
},
"histDesc": {
"description": "Historique",
"message": "L'histoire est automatiquement effacée lorsque vos onglets I2P sont fermés. Si vous voulez effacer l'histoire comme vous allez, cochez cette case."
},
"homepage": {
"description": "Trouver plus d'informations",
"message": "Plus d'informations sont disponibles ici"
},
"hostText": {
"description": "Host for the HTTP or SOCKS5 Proxy",
"message": "Hébergement :"
},
"i2ppage": {
"description": "Plus d'informations sont disponibles ici.",
"message": "Plus d'informations sont disponibles ici."
},
"i2ptunnel": {
"description": "Description pour i2ptunnel",
"message": "Voir les messages de statut proxy et configurer les services et les tunnels."
},
"i2ptunnelPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Hidden Services Manager"
},
"i2ptunnelPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Hidden Services Manager (Private)"
},
"infoMessage": {
"description": "Message d'aide",
"message": "Vous êtes maintenant libre de parcourir l'eepWeb! Votre navigateur est maintenant configuré pour naviguer anonymement sur le réseau I2P. Lorsque vous naviguez, votre trafic sera acheminé par d'autres nœuds réseau pour déguiser son origine, à la fois du serveur et des nœuds eux-mêmes."
},
"infoTitle": {
"description": "Titre du menu Aide",
"message": "I2P Aide"
},
"ircPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Dispatch IRC"
},
"ircPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Dispatch IRC (Private)"
},
"isBase32": {
"description": "Message pour le site info panel base32",
"message": "I2P Base32-Formatted Address"
},
"isHostName": {
"description": "Message pour le site info panel hostname",
"message": "I2P Jump Hostname"
},
"label-router-activepeers": {
"description": "Peers actifs:",
"message": "Peers actifs:"
},
"label-router-bandwidth": {
"description": "Bandwidth",
"message": "Bandwidth"
},
"label-router-bw-inbound-15s": {
"description": "Inbound bw 15s:",
"message": "Inbound bw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "Inbound bw 1s:",
"message": "Inbound bw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "Outbound bw 15s:",
"message": "Outbound bw 15s:"
},
"label-router-bw-outbound-1s": {
"description": "Bw 1s :",
"message": "Bw 1s :"
},
"label-router-net-tunnels-participating": {
"description": "Tunnels de transit:",
"message": "Tunnels de transit:"
},
"label-router-netdb-fastpeers": {
"description": "Fast Peers:",
"message": "Fast Peers:"
},
"label-router-netdb-highcapacitypeers": {
"description": "Capacité élevée Peers:",
"message": "Capacité élevée Peers:"
},
"label-router-netdb-isreseeding": {
"description": "Statut :",
"message": "Statut :"
},
"label-router-netdb-knownpeers": {
"description": "Known Peers:",
"message": "Known Peers:"
},
"label-router-peers": {
"description": "Peers",
"message": "Peers"
},
"label-router-status": {
"description": "Statut Routeur:",
"message": "Statut Routeur:"
},
"label-router-uptime": {
"description": "Temps d ' acheminement (Ms):",
"message": "Temps d ' acheminement (Ms):"
},
"label-router-version": {
"description": "Version du routeur:",
"message": "Version du routeur:"
},
"links": {
"description": "Extension et ressources I2P",
"message": "Extension et ressources I2P"
},
"linksExplain": {
"description": "Si vous voulez obtenir plus d'informations sur I2P, vous pouvez visiter ces liens.",
"message": "Si vous voulez obtenir plus d'informations sur I2P, vous pouvez visiter ces liens."
},
"mailPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Web Mail"
},
"mailPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Web Mail (Private)"
},
"muwirePreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "MuWire (Private)"
},
"newsMessage": {
"description": "Message d'aide",
"message": "Visitez le I2P Blog pour en savoir plus sur i2p."
},
"onboardingButtonFive": {
"description": "Améliorer votre Expérience",
"message": "Améliorer votre Expérience"
},
"onboardingButtonFour": {
"description": "Partage des fichiers",
"message": "Partage de fichiers"
},
"onboardingButtonOne": {
"description": "I2P Network Browsing and Non-I2P Network Browsing",
"message": "I2P Network Browsing and Non-I2P Network Browsing"
},
"onboardingButtonThree": {
"description": "E-mail caché",
"message": "E-mail caché"
},
"onboardingButtonTwo": {
"description": "Protéger les limites du réseau",
"message": "Protéger les limites du réseau"
},
"onboardingButtonZero": {
"description": "Protégez votre confidentialité",
"message": "Protégez votre confidentialité"
},
"onboardingContentFive": {
"description": "Cette extension peut être combinée avec d'autres extensions qui améliorent parfois sa fonctionnalité. uBlock Origin, LocalCDN et jShelter sont utiles pour accélérer le chargement de page, bloquer les annonces et limiter la puissance de Javascript. Pour les utilisateurs qui veulent bloquer tout Javascript, NoScript est recommandé.",
"message": "Cette extension peut être combinée avec d'autres extensions qui améliorent parfois sa fonctionnalité. uBlock Origin, LocalCDN et jShelter sont utiles pour accélérer le chargement de page, bloquer les annonces et limiter la puissance de Javascript. Pour les utilisateurs qui veulent bloquer tout Javascript, NoScript est recommandé."
},
"onboardingContentFour": {
"description": "I2P est capable d'utiliser des applications de pairs comme BitTorrent, en protégeant votre identité lorsque vous partagez des fichiers. Notre client Bitcoin anonyme est disponible dans le navigateur.",
"message": "I2P est capable d'utiliser des applications de pairs comme BitTorrent, en protégeant votre identité lorsque vous partagez des fichiers. Notre client Bitcoin anonyme est disponible dans le navigateur."
},
"onboardingContentOne": {
"description": "Cette extension fonctionne automatiquement lorsque vous naviguez sur les sites I2P. Si vous voulez utiliser I2P comme proxy aux sites non-I2P, utilisez le bouton I2P dans la barre d'outils et cliquez sur Nouvel onglet navigateur I2P pour passer à I2P Browsing dans un nouvel onglet. Votre expérience tout en naviguant sur Internet peut être un peu différente. Les choses peuvent être un peu plus lentes, et selon votre niveau de sécurité, certains éléments peuvent ne pas fonctionner ou charger. On peut aussi vous demander de prouver que vous êtes un humain et non un robot.",
"message": "Cette extension fonctionne automatiquement lorsque vous naviguez sur les sites I2P. Si vous voulez utiliser I2P comme proxy aux sites non-I2P, utilisez le bouton I2P dans la barre d'outils et cliquez sur Nouvel onglet navigateur I2P pour passer à I2P Browsing dans un nouvel onglet. Votre expérience tout en naviguant sur Internet peut être un peu différente. Les choses peuvent être un peu plus lentes, et selon votre niveau de sécurité, certains éléments peuvent ne pas fonctionner ou charger. On peut aussi vous demander de prouver que vous êtes un humain et non un robot."
},
"onboardingContentThree": {
"description": "Il y a aussi un service d'e-mail anonyme disponible à l'intérieur de I2P, qui est accessible depuis notre navigateur via le menu directement à droite.",
"message": "Il y a aussi un service d'e-mail anonyme disponible à l'intérieur de I2P, qui est accessible depuis notre navigateur via le menu directement à droite."
},
"onboardingContentTwo": {
"description": "I2P est normalement administré via un WebUI(The \"Router Console\"), que l'utilisateur voit parfois dans le même navigateur qu'il utilise pour visiter des sites distants. Il est essentiel d'empêcher les sites d'accéder à l'information de cette interface Web et d'autres services locaux. Les sites Clearnet restent dans le conteneur par défaut firefox, mais dès que le conteneur par défaut firefox demande un site *.onion ou *.i2p, il sera instantanément containerizzato. Tor Browser's identity management tooling controls clearnet tabs, and they are proxied using the default I2P outproxy or outproxy plugin.",
"message": "I2P est normalement administré via un WebUI(The \" Router Console \"), que l'utilisateur voit parfois dans le même navigateur qu'il utilise pour visiter des sites distants. Il est essentiel d'empêcher les sites d'accéder à l'information de cette interface Web et d'autres services locaux. Les sites Clearnet restent dans le conteneur par défaut firefox, mais dès que le conteneur par défaut firefox demande un site *.onion ou *.i2p, il sera instantanément containerizzato. Tor Browser's identity management tooling controls clearnet tabs, and they are proxied using the default I2P outproxy or outproxy plugin."
},
"onboardingContentZero": {
"description": "Lorsque vous utilisez I2P En mode de navigation privée, vous êtes protégé contre le suivi et la surveillance. Le navigateur I2P isole les cookies et supprime l'historique de votre navigateur après votre session. Ces modifications assurent la protection de votre vie privée et de votre sécurité.",
"message": "Lorsque vous utilisez I2P En mode de navigation privée, vous êtes protégé contre le suivi et la surveillance. Le navigateur I2P isole les cookies et supprime l'historique de votre navigateur après votre session. Ces modifications assurent la protection de votre vie privée et de votre sécurité."
},
"onboardingFive": {
"description": "Conseils d'expérience",
"message": "Conseils d'expérience"
},
"onboardingFour": {
"description": "Browsing the Web",
"message": "Browsing the Web"
},
"onboardingOne": {
"description": "Configurez votre Expérience",
"message": "Configurez votre Expérience"
},
"onboardingThree": {
"description": "E-mail caché",
"message": "E-mail caché"
},
"onboardingTitle": {
"description": "À propos d'I2P dans la foule privée",
"message": "À propos d'I2P dans la foule privée"
},
"onboardingTwo": {
"description": "Partager Fichiers",
"message": "Partager Fichiers"
},
"onboardingZero": {
"description": "Protégez votre confidentialité",
"message": "Protégez votre confidentialité"
},
"portText": {
"description": "Port pour la proxy HTTP ou SOCKS5",
"message": "Port:"
},
"protocolHandlerValue": {
"description": "Valeur pour le gestionnaire du protocole magnétique",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s d ' action=Add);foo=Add+torrent"
},
"proxy-check": {
"description": "Proxy est prêt.",
"message": "Proxy est prêt."
},
"proxyFailedStatus": {
"description": "Proxy a échoué.",
"message": "Proxy n'est pas prêt"
},
"proxyHelpText": {
"description": "Aide pour configurer les options pour le bouton Reset Tunnel",
"message": "Configurez votre proxy I2P ici."
},
"proxySuccessStatus": {
"description": "Proxy a échoué.",
"message": "Proxy est prêt"
},
"readyness": {
"description": "Proxy est prêt.",
"message": "Proxy est prêt."
},
"releases": {
"description": "Description pour la nouvelle page de sortie",
"message": "Consultez les nouvelles versions ici"
},
"resetMessage": {
"description": "Message pour le bouton Reset Tunnel",
"message": "Réinitialiser le tunnel"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "Remplacer par Router Bandwidth Outbound 15s",
"message": "Remplacer par Router Bandwidth Outbound 15s"
},
"router-net-bw-inbound-1s": {
"description": "Remplacer par Router Bandwidth Inbound 1s",
"message": "Remplacer par Router Bandwidth Inbound 1s"
},
"router-net-bw-outbound-15s": {
"description": "Remplacer par Router Bandwidth Outbound 15s",
"message": "Remplacer par Router Bandwidth Outbound 15s"
},
"router-net-bw-outbound-1s": {
"description": "Remplacer par Router Bandwidth Outbound 1s",
"message": "Remplacer par Router Bandwidth Outbound 1s"
},
"router-net-tunnels-participating": {
"description": "Remplacer par le nombre de tunnels participants du routeur",
"message": "Remplacer par le nombre de tunnels participants du routeur"
},
"router-netdb-activepeers": {
"description": "Remplacer par Router Active Peers",
"message": "Remplacer par Router Active Peers"
},
"router-netdb-fastpeers": {
"description": "Remplacer par Router Fast Peers",
"message": "Remplacer par Router Fast Peers"
},
"router-netdb-highcapacitypeers": {
"description": "Remplacer par des Peers de haute capacité",
"message": "Remplacer par des Peers de haute capacité"
},
"router-netdb-isreseeding": {
"description": "Remplacer par Router netDB Reseeding Status",
"message": "Remplacer par Router netDB Reseeding Status"
},
"router-netdb-knownpeers": {
"description": "Remplacer par Router Known Peers",
"message": "Remplacer par Router Known Peers"
},
"router-restart": {
"description": "Bien redémarrer routeur",
"message": "Bien redémarrer routeur"
},
"router-shutdown": {
"description": "Routeur d'arrêt Gracely",
"message": "Routeur d'arrêt Gracely"
},
"router-status": {
"description": "Remplacer par le statut Routeur",
"message": "Remplacer par le statut Routeur"
},
"router-uptime": {
"description": "Remplacer par Router Uptime",
"message": "Remplacer par Router Uptime"
},
"router-version": {
"description": "Remplacer par la version Router",
"message": "Remplacer par la version Router"
},
"routerConsole": {
"description": "Description pour la console routeur.",
"message": "Accédez à votre console de routeur I2P et à toute sa gamme d'applications et de configurations."
},
"routerPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Router Console"
},
"routerPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Console Routeur (Private)"
},
"rpcHelpText": {
"description": "Configurez vos options I2PControl ici. Configurez vos options Bittorrent ici.",
"message": "Configurez vos options I2PControl ici. Configurez vos options Bittorrent ici."
},
"rpcHostText": {
"description": "Port de contrôle:",
"message": "Port de contrôle:"
},
"rpcPassText": {
"description": "Mot de passe de contrôle: Torrent RPC Mot de passe :",
"message": "Mot de passe de contrôle: Torrent RPC Mot de passe :"
},
"rpcPathText": {
"description": "Voie de contrôle:",
"message": "Voie de contrôle:"
},
"rpcPortText": {
"description": "Hostie de contrôle:",
"message": "Hostie de contrôle:"
},
"rtcDesc": {
"description": "WebRTC action description",
"message": "WebRTC est désactivé par défaut, mais vous pouvez le retourner et le forcer à honorer le proxy. Si vous êtes un utilisateur de l'extension de navigateur Snowflake, cette option est désactivée et WebRTC est activé par défaut."
},
"signingcert": {
"description": "Signé par:",
"message": "Signé par:"
},
"siteLabel": {
"description": "Étiquette pour info site i2p",
"message": "Adresse/Site Information:"
},
"sitecert": {
"description": "Renseignements sur le certificat:",
"message": "Renseignements sur le certificat:"
},
"snark": {
"description": "Description pour Bittorrent",
"message": "Accès rapide à Snark, l'application de partage de fichiers I2P par réseau Peer-to-peer."
},
"sourcehead": {
"description": "Obtenez le code source:",
"message": "Obtenez le code source:"
},
"sources": {
"description": "Description du lien de code source",
"message": "Parcourez le code source ici"
},
"susimail": {
"description": "Description pour e-mail",
"message": "Accès rapide au client de messagerie réseau SusiMail I2P."
},
"text-section-header": {
"description": "Le navigateur Internet invisible",
"message": "Le navigateur Internet invisible"
},
"text-section-proxyerr-header": {
"description": "A Proxy Error has Occurred",
"message": "A Proxy Error has Occurred"
},
"text-section-torrents-header": {
"description": "Téléchargements de Torrent",
"message": "Téléchargements de Torrent"
},
"titlePreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "I2P Browser"
},
"titlePrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "I2P Browser (Private)"
},
"toopie": {
"description": "Pour des informations sur votre statut de routeur I2P, allez ici:",
"message": "Pour des informations sur votre statut de routeur I2P, allez ici:"
},
"toopieHtmlHeadline": {
"description": "I2P Router Information",
"message": "I2P Router Information"
},
"toopieName": {
"description": "Nom de la barre latérale.",
"message": "aussi. html"
},
"toopieTLS": {
"description": "Nom du panneau de sécurité.",
"message": "Propriétés du site"
},
"topbar": {
"description": "Parcourir",
"message": "Parcourir"
},
"torPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Tor Manager"
},
"torPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Tor Manager (Private)"
},
"torrent-action": {
"description": "Télécharger",
"message": "Télécharger"
},
"torrentControls": {
"description": "Torrent Controls",
"message": "Torrent Controls"
},
"torrentDownloads": {
"description": "Téléchargements de Torrent",
"message": "Téléchargements de Torrent"
},
"torrentPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Bittorrent (Private)"
},
"torrentui-opener": {
"description": "Open WebUI",
"message": "Open WebUI"
},
"visit-irc": {
"description": "Visiter IRC",
"message": "Visiter IRC"
},
"webPreface": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Navigateur Web"
},
"webPrefacePrivate": {
"description": "Préface pour la barre de titre du navigateur",
"message": "Navigateur Web (Private)"
},
"webpage": {
"description": "Plus d'informations sont disponibles ici.",
"message": "Plus d'informations sont disponibles ici."
},
"window-visit-console": {
"description": "Console Routeur I2P",
"message": "Console Routeur I2P"
},
"window-visit-help": {
"description": "Extension Page",
"message": "Extension Page"
},
"window-visit-homepage": {
"description": "Le navigateur Internet invisible",
"message": "Le navigateur Internet invisible"
},
"window-visit-i2p": {
"description": "I2P Page d'accueil du projet :",
"message": "I2P Page d'accueil du projet :"
},
"window-visit-i2ptunnel": {
"description": "Hidden Services Manager",
"message": "Hidden Services Manager"
},
"window-visit-index": {
"description": "Webextension Homepage:",
"message": "Webextension Homepage:"
},
"window-visit-releases": {
"description": "Sorties:",
"message": "Sorties:"
},
"window-visit-router": {
"description": "Router Console",
"message": "Router Console"
},
"window-visit-settings": {
"description": "Ouvrez les paramètres",
"message": "Ouvrez les paramètres"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "Code source:",
"message": "Code source:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "Toopie",
"message": "Toopie"
},
"window-visit-torrent": {
"description": "Pour l'assistance, visitez la page d'aide du torrent",
"message": "Pour l'assistance, visitez la page d'aide du torrent"
},
"windowVisitConsole": {
"description": "Router Console label.",
"message": "Router Console:"
},
"windowVisitHelppage": {
"description": "Page d'aide pour l'étiquette d'extension.",
"message": "WebExtension Information:"
},
"windowVisitHomepage": {
"description": "Page d'accueil pour l'étiquette d'extension.",
"message": "Page d'accueil :"
},
"windowVisitI2ptunnel": {
"description": "Titre de i2ptunnel",
"message": "Hidden Services Manager:"
},
"windowVisitReleases": {
"description": "Visitez la page de sortie",
"message": "Extension Releases:"
},
"windowVisitSnark": {
"description": "Titre de Bittorrent",
"message": "Bittorrent:"
},
"windowVisitSources": {
"description": "Titre du lien de code source",
"message": "Code d ' extension:"
},
"windowVisitSusimail": {
"description": "Titre de l ' e-mail",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "Page d'accueil de visite sur Github",
"message": "Extension Home Page:"
}
}

738
_locales/it/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "Informazioni sul certificato:",
"message": "Informazioni sul certificato:"
},
"SignedLabel": {
"description": "Firmato da:",
"message": "Firmato da:"
},
"TorrentTypeLabel": {
"description": "Collegamenti Torrent:",
"message": "Collegamenti Torrent:"
},
"TypeLabel": {
"description": "Collegamenti Torrent:",
"message": "Collegamenti Torrent:"
},
"aboutconsole": {
"description": "Per accedere alla homepage della console router, vai qui:",
"message": "Per accedere alla homepage della console router, vai qui:"
},
"abouthome": {
"description": "Descrizione per la pagina del pulsante estensione.",
"message": "Per maggiori informazioni su questa estensione, visita questa pagina."
},
"addresstype": {
"description": "Indirizzo Tipo:",
"message": "Indirizzo Tipo:"
},
"applicationExplain": {
"description": "Descrizione per sezione applicazione.",
"message": "La console router I2P e le applicazioni si aprono nella propria scheda, fornendo loro gli stessi vantaggi di sicurezza come la navigazione con questa estensione. Questo aggiunge più protezione isolando ogni applicazione e impedendo altre schede (cioè i social media, ecc ) da impronta digitale o script. Tutte le schede utilizzano l'identificazione dei colori per tenere traccia del flusso di lavoro I2P."
},
"applicationHeader": {
"description": "Intestazione per la sezione applicazioni.",
"message": "Applicazioni"
},
"beta": {
"description": "Questo è un prodotto sperimentale.",
"message": "Questo è un prodotto sperimentale."
},
"blogPreface": {
"description": "Prefazione per la barra del browser",
"message": "Blog"
},
"blogPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Blog (Private)"
},
"bookmarksButton": {
"description": "Segnalibri di recupero",
"message": "Segnalibri di recupero"
},
"botePreface": {
"description": "Prefazione per la barra del browser",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "I2P-Bote Mail (Private)"
},
"browser-action": {
"description": "Sfoglia",
"message": "Sfoglia"
},
"btRpcHostText": {
"description": "Torrent RPC Host:",
"message": "Torrent RPC Host:"
},
"btRpcPathText": {
"description": "Torrent RPC Percorso:",
"message": "Torrent RPC Percorso:"
},
"btRpcPortText": {
"description": "Torrent RPC Porto:",
"message": "Torrent RPC Porto:"
},
"certAbsent": {
"description": "Contenuto per informazioni sul certificato se assente",
"message": "Questo sito non utilizza HTTPS. È ancora verificata crittograficamente da I2P."
},
"certPresent": {
"description": "Contenuto per informazioni sul certificato se presente",
"message": "Questo sito utilizza HTTPS. HTTPS su I2P è sperimentale e richiede certificati auto-firmati o autoriti radice alternativi."
},
"clearData": {
"description": "Cancella voce del menu di navigazione dati.",
"message": "Dati di navigazione trasparenti:"
},
"clearDesc": {
"description": "Cancella la descrizione dell'azione dei dati di navigazione.",
"message": "Utilizzare questo per cancellare i dati di navigazione I2P."
},
"controlExplain": {
"description": "Introdurre il pannello di controllo.",
"message": "Questi controlli vengono utilizzati per personalizzare la tua I2P Browsing Experience"
},
"controlHeader": {
"description": "Headline per pannello di controllo.",
"message": "Controllo"
},
"controlHelpText": {
"description": "Aiuto per configurare le opzioni per il pulsante Reset Tunnel",
"message": "Configura la console router qui."
},
"controlHostText": {
"description": "Host per la console Router",
"message": "Host di controllo:"
},
"controlHostValue": {
"description": "Host per la console Router",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Porto per la console Router",
"message": "Porto di controllo:"
},
"controlPortValue": {
"description": "Porto per la console Router",
"message": "7657"
},
"description": {
"description": "Ora è possibile utilizzare I2P in questo browser.",
"message": "Ora è possibile utilizzare I2P in questo browser."
},
"description2": {
"description": "Se stai vedendo questa pagina, è perché si è verificato un errore proxy. Alcune informazioni sono state fornite per aiutarvi a diagnosticare il problema.",
"message": "Se stai vedendo questa pagina, è perché si è verificato un errore proxy. Alcune informazioni sono state fornite per aiutarvi a diagnosticare il problema."
},
"disableHistory": {
"description": "Etichetta della casella di controllo di storia.",
"message": "Disattivare la storia nelle schede I2P?"
},
"enableWebRTC": {
"description": "Etichetta della casella di controllo WebRTC.",
"message": "Attiva WebRTC con proxy?"
},
"extensionDescription": {
"description": "Descrizione dell'estensione.",
"message": "La navigazione della rete I2P è stata facile."
},
"extensionName": {
"description": "Nome dell'estensione.",
"message": "I2P In navigazione privata"
},
"extensionNameVariant": {
"description": "Nome dell'estensione.",
"message": "I2P In navigazione privata - Variante Rhizome"
},
"extensionPreface": {
"description": "Prefazione per la barra del browser",
"message": "Gestione I2P"
},
"extensionVersion": {
"description": "Versione dell'estensione.",
"message": "1.2"
},
"fliplinks": {
"description": "Estensione e risorse I2P",
"message": "Estensione e risorse I2P"
},
"forumMessage": {
"description": "Messaggio di aiuto",
"message": "Visita il Forum I2P per saperne di più o chiedere assistenza"
},
"headline": {
"description": "Il browser Internet invisibile",
"message": "Il browser Internet invisibile"
},
"help": {
"description": "Descrizione per la pagina del pulsante estensione.",
"message": "Per maggiori informazioni su questa estensione, visita questa pagina."
},
"helpMessage": {
"description": "Messaggio di aiuto",
"message": "Ottieni ulteriore aiuto"
},
"histDesc": {
"description": "Descrizione dell'azione",
"message": "La storia viene automaticamente cancellata quando le schede I2P sono chiuse. Se vuoi cancellare la storia mentre vai, controlla questa scatola."
},
"homepage": {
"description": "Trova maggiori informazioni",
"message": "Ulteriori informazioni sono disponibili qui"
},
"hostText": {
"description": "Host per il proxy HTTP o SOCKS5",
"message": "Host:"
},
"i2ppage": {
"description": "Ulteriori informazioni sono disponibili qui.",
"message": "Ulteriori informazioni sono disponibili qui."
},
"i2ptunnel": {
"description": "Descrizione per i2ptunnel",
"message": "Visualizza i messaggi di stato del proxy e configura i servizi e i tunnel."
},
"i2ptunnelPreface": {
"description": "Prefazione per la barra del browser",
"message": "Gestione dei servizi nascosti"
},
"i2ptunnelPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Gestione Servizi Nascosti (Private)"
},
"infoMessage": {
"description": "Messaggio di aiuto",
"message": "Ora siete liberi di navigare in eepWeb! Il browser è ora configurato per navigare in modo anonimo sulla rete I2P. Mentre si naviga, il traffico sarà indirizzato attraverso altri nodi di rete per mascherare l'origine, sia dal server che dai nodi stessi."
},
"infoTitle": {
"description": "Titolo per il menu di aiuto",
"message": "I2P Aiuto"
},
"ircPreface": {
"description": "Prefazione per la barra del browser",
"message": "IRC di distribuzione"
},
"ircPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Dispatch IRC (Private)"
},
"isBase32": {
"description": "Messaggio per il sito info panel base32",
"message": "I2P Base32-Formatted Indirizzo"
},
"isHostName": {
"description": "Messaggio per il sito info pannello hostname",
"message": "I2P Jump Hostname"
},
"label-router-activepeers": {
"description": "Pari attivi:",
"message": "Pari attivi:"
},
"label-router-bandwidth": {
"description": "Larghezza di banda",
"message": "Larghezza di banda"
},
"label-router-bw-inbound-15s": {
"description": "Inbound bw 15s:",
"message": "Inbound bw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "Inbound bw 1s:",
"message": "Inbound bw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "In uscita bw 15s:",
"message": "In uscita bw 15s:"
},
"label-router-bw-outbound-1s": {
"description": "In uscita bw 1s:",
"message": "In uscita bw 1s:"
},
"label-router-net-tunnels-participating": {
"description": "Tunnel di transito:",
"message": "Tunnel di transito:"
},
"label-router-netdb-fastpeers": {
"description": "Fast Peers:",
"message": "Fast Peers:"
},
"label-router-netdb-highcapacitypeers": {
"description": "Alta capacità Pari:",
"message": "Alta capacità Pari:"
},
"label-router-netdb-isreseeding": {
"description": "Stato di recupero:",
"message": "Stato di recupero:"
},
"label-router-netdb-knownpeers": {
"description": "Pari conosciuti:",
"message": "Pari conosciuti:"
},
"label-router-peers": {
"description": "Pari",
"message": "Pari"
},
"label-router-status": {
"description": "Status Router Status:",
"message": "Status Router Status:"
},
"label-router-uptime": {
"description": "Router Uptime(Ms):",
"message": "Router Uptime(Ms):"
},
"label-router-version": {
"description": "Versione Router:",
"message": "Versione Router:"
},
"links": {
"description": "Estensione e risorse I2P",
"message": "Estensione e risorse I2P"
},
"linksExplain": {
"description": "Se si desidera ottenere maggiori informazioni su I2P, è possibile visitare questi link.",
"message": "Se si desidera ottenere maggiori informazioni su I2P, è possibile visitare questi link."
},
"mailPreface": {
"description": "Prefazione per la barra del browser",
"message": "Web Mail"
},
"mailPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Web Mail (Private)"
},
"muwirePreface": {
"description": "Prefazione per la barra del browser",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "MuWire (Privato)"
},
"newsMessage": {
"description": "Messaggio di aiuto",
"message": "Visita l'I2P Blog per conoscere le ultime informazioni su i2p."
},
"onboardingButtonFive": {
"description": "Migliorare il tuo Esperienza",
"message": "Migliorare il tuo Esperienza"
},
"onboardingButtonFour": {
"description": "Condivisione dei file",
"message": "Condivisione dei file"
},
"onboardingButtonOne": {
"description": "Navigazione di rete I2P e navigazione di rete non I2P",
"message": "Navigazione di rete I2P e navigazione di rete non I2P"
},
"onboardingButtonThree": {
"description": "E-mail nascosta",
"message": "E-mail nascosta"
},
"onboardingButtonTwo": {
"description": "Protezione dei rimbalzi di rete",
"message": "Protezione dei rimbalzi di rete"
},
"onboardingButtonZero": {
"description": "Proteggi la tua privacy",
"message": "Proteggi la tua privacy"
},
"onboardingContentFive": {
"description": "Questa estensione può essere combinata con altre estensioni che a volte migliorano la sua funzionalità. uBlock Origin, LocalCDN e jShelter sono utili per accelerare il caricamento della pagina, bloccare gli annunci e limitare la potenza di Javascript. Per gli utenti che vogliono bloccare tutti i Javascript, NoScript è raccomandato.",
"message": "Questa estensione può essere combinata con altre estensioni che a volte migliorano la sua funzionalità. uBlock Origin, LocalCDN e jShelter sono utili per accelerare il caricamento della pagina, bloccare gli annunci e limitare la potenza di Javascript. Per gli utenti che vogliono bloccare tutti i Javascript, NoScript è raccomandato."
},
"onboardingContentFour": {
"description": "I2P è in grado di utilizzare applicazioni peer-to-peer come BitTorrent, proteggendo la tua identità quando condividi i file. Il nostro client bittorrent anonimo è disponibile nel browser.",
"message": "I2P è in grado di utilizzare applicazioni peer-to-peer come BitTorrent, proteggendo la tua identità quando condividi i file. Il nostro client bittorrent anonimo è disponibile nel browser."
},
"onboardingContentOne": {
"description": "Questa estensione funziona automaticamente durante la navigazione nei siti I2P. Se si desidera utilizzare I2P come proxy per i siti non I2P, utilizzare il pulsante I2P In Private Browsing nella barra degli strumenti e fare clic su Nuova scheda Browser I2P per passare alla navigazione I2P in una nuova scheda. La tua esperienza durante la navigazione in internet può essere un po 'diverso. Le cose possono essere un po 'più lente, e a seconda del livello di sicurezza, alcuni elementi potrebbero non funzionare o caricare. Si può anche essere chiesto di dimostrare di essere un umano e non un robot.",
"message": "Questa estensione funziona automaticamente durante la navigazione nei siti I2P. Se si desidera utilizzare I2P come proxy per i siti non I2P, utilizzare il pulsante I2P In Private Browsing nella barra degli strumenti e fare clic su Nuova scheda Browser I2P per passare alla navigazione I2P in una nuova scheda. La tua esperienza durante la navigazione in internet può essere un po 'diverso. Le cose possono essere un po 'più lente, e a seconda del livello di sicurezza, alcuni elementi potrebbero non funzionare o caricare. Si può anche essere chiesto di dimostrare di essere un umano e non un robot."
},
"onboardingContentThree": {
"description": "C'è anche un servizio di posta elettronica anonimo disponibile all'interno di I2P, che è accessibile dal nostro browser tramite il menu direttamente a destra.",
"message": "C'è anche un servizio di posta elettronica anonimo disponibile all'interno di I2P, che è accessibile dal nostro browser tramite il menu direttamente a destra."
},
"onboardingContentTwo": {
"description": "I2P viene normalmente somministrato tramite un WebUI (The \"Router Console \"), che l'utente a volte vede nello stesso browser utilizzato per visitare siti remoti. E 'essenziale per impedire ai siti di essere in grado di accedere alle informazioni da questo WebUI e altri servizi localmente in esecuzione. I siti Clearnet rimangono nel contenitore firefox-default, ma non appena il contenitore firefox-default richiede un sito *.onion o *.i2p, sarà immediatamente containerizzato. La gestione dell'identità di Tor Browser controlla le schede Clearnet, e sono proxied utilizzando il plugin predefinito I2P outproxy o outproxy.",
"message": "I2P viene normalmente somministrato tramite un WebUI (The \" Router Console \"), che l'utente a volte vede nello stesso browser utilizzato per visitare siti remoti. E 'essenziale per impedire ai siti di essere in grado di accedere alle informazioni da questo WebUI e altri servizi localmente in esecuzione. I siti Clearnet rimangono nel contenitore firefox-default, ma non appena il contenitore firefox-default richiede un sito *.onion o *.i2p, sarà immediatamente containerizzato. La gestione dell'identità di Tor Browser controlla le schede Clearnet, e sono proxied utilizzando il plugin predefinito I2P outproxy o outproxy."
},
"onboardingContentZero": {
"description": "Quando si utilizza I2P In modalità navigazione privata, si è protetti contro il monitoraggio e la sorveglianza. Il browser I2P isola i cookie e cancella la cronologia del browser dopo la sessione. Queste modifiche assicurano che la vostra privacy e sicurezza siano protette come vostra navigazione.",
"message": "Quando si utilizza I2P In modalità navigazione privata, si è protetti contro il monitoraggio e la sorveglianza. Il browser I2P isola i cookie e cancella la cronologia del browser dopo la sessione. Queste modifiche assicurano che la vostra privacy e sicurezza siano protette come vostra navigazione."
},
"onboardingFive": {
"description": "Consigli sull'esperienza",
"message": "Consigli sull'esperienza"
},
"onboardingFour": {
"description": "Navigare sul Web",
"message": "Navigare sul Web"
},
"onboardingOne": {
"description": "Configurare il Esperienza",
"message": "Configurare il Esperienza"
},
"onboardingThree": {
"description": "E-mail nascosta",
"message": "E-mail nascosta"
},
"onboardingTitle": {
"description": "Informazioni su I2P In Private Browsing",
"message": "Informazioni su I2P In Private Browsing"
},
"onboardingTwo": {
"description": "Condividi i file",
"message": "Condividi i file"
},
"onboardingZero": {
"description": "Proteggi la tua privacy",
"message": "Proteggi la tua privacy"
},
"portText": {
"description": "Porta per il proxy HTTP o SOCKS5",
"message": "Porto:"
},
"protocolHandlerValue": {
"description": "Valore per il gestore del protocollo magnete",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s\u0026action=Add\u0026foo=Add+torrent"
},
"proxy-check": {
"description": "Il proxy è pronto.",
"message": "Il proxy è pronto."
},
"proxyFailedStatus": {
"description": "Lo stato del fallimento del proxy.",
"message": "Il proxy non è pronto"
},
"proxyHelpText": {
"description": "Aiuto per configurare le opzioni per il pulsante Reset Tunnel",
"message": "Configura il proxy I2P qui."
},
"proxySuccessStatus": {
"description": "Lo stato del fallimento del proxy.",
"message": "Il proxy è pronto"
},
"readyness": {
"description": "Il proxy è pronto.",
"message": "Il proxy è pronto."
},
"releases": {
"description": "Descrizione per la nuova pagina di rilascio",
"message": "Controlla le nuove versioni qui"
},
"resetMessage": {
"description": "Messaggio per il pulsante Reset Tunnel",
"message": "Tunnel di reset"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "Sostituire con Router Bandwidth Outbound 15s",
"message": "Sostituire con Router Bandwidth Outbound 15s"
},
"router-net-bw-inbound-1s": {
"description": "Sostituire con Router Bandwidth Inbound 1s",
"message": "Sostituire con Router Bandwidth Inbound 1s"
},
"router-net-bw-outbound-15s": {
"description": "Sostituire con Router Bandwidth Outbound 15s",
"message": "Sostituire con Router Bandwidth Outbound 15s"
},
"router-net-bw-outbound-1s": {
"description": "Sostituire con Router Bandwidth Outbound 1s",
"message": "Sostituire con Router Bandwidth Outbound 1s"
},
"router-net-tunnels-participating": {
"description": "Sostituire con il conteggio Tunnel partecipante Router",
"message": "Sostituire con il conteggio Tunnel partecipante Router"
},
"router-netdb-activepeers": {
"description": "Sostituisci con Router Active Peers",
"message": "Sostituisci con Router Active Peers"
},
"router-netdb-fastpeers": {
"description": "Sostituire con Router Fast Peers",
"message": "Sostituire con Router Fast Peers"
},
"router-netdb-highcapacitypeers": {
"description": "Sostituire con i pari ad alta capacità",
"message": "Sostituire con i pari ad alta capacità"
},
"router-netdb-isreseeding": {
"description": "Sostituisci con Router netDB Reseeding Status",
"message": "Sostituisci con Router netDB Reseeding Status"
},
"router-netdb-knownpeers": {
"description": "Sostituisci con Router Known Peers",
"message": "Sostituisci con Router Known Peers"
},
"router-restart": {
"description": "Riavviare Gracely router",
"message": "Riavviare Gracely router"
},
"router-shutdown": {
"description": "Router di arresto Gracefully",
"message": "Router di arresto Gracefully"
},
"router-status": {
"description": "Sostituisci con lo stato Router",
"message": "Sostituisci con lo stato Router"
},
"router-uptime": {
"description": "Sostituire con Router Uptime",
"message": "Sostituire con Router Uptime"
},
"router-version": {
"description": "Sostituisci con la versione Router",
"message": "Sostituisci con la versione Router"
},
"routerConsole": {
"description": "Descrizione per la console router.",
"message": "Accedere alla console router I2P e alla sua gamma completa di applicazioni e configurazioni."
},
"routerPreface": {
"description": "Prefazione per la barra del browser",
"message": "Router Console"
},
"routerPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Router Console (Private)"
},
"rpcHelpText": {
"description": "Configura le opzioni I2PControl qui. Configura le opzioni Bittorrent qui.",
"message": "Configura le opzioni I2PControl qui. Configura le opzioni Bittorrent qui."
},
"rpcHostText": {
"description": "Porto di controllo:",
"message": "Porto di controllo:"
},
"rpcPassText": {
"description": "Password di controllo: Torrent RPC Password:",
"message": "Password di controllo: Torrent RPC Password:"
},
"rpcPathText": {
"description": "Percorso di controllo:",
"message": "Percorso di controllo:"
},
"rpcPortText": {
"description": "Host di controllo:",
"message": "Host di controllo:"
},
"rtcDesc": {
"description": "Descrizione dell'azione WebRTC",
"message": "WebRTC è disabilitato per impostazione predefinita, ma è possibile accenderlo e forzarlo per onorare il proxy. Se sei un utente dell'estensione del browser Snowflake, questa opzione è disabilitata e WebRTC è attivata per impostazione predefinita."
},
"signingcert": {
"description": "Firmato da:",
"message": "Firmato da:"
},
"siteLabel": {
"description": "Etichetta per i2p sito info",
"message": "Indirizzo/Sito Informazioni:"
},
"sitecert": {
"description": "Informazioni sul certificato:",
"message": "Informazioni sul certificato:"
},
"snark": {
"description": "Descrizione per Bittorrent",
"message": "Accesso rapido a Snark, l'applicazione di condivisione di file di rete I2P Peer-to-peer."
},
"sourcehead": {
"description": "Ottieni il codice sorgente:",
"message": "Ottieni il codice sorgente:"
},
"sources": {
"description": "Descrizione per il collegamento codice sorgente",
"message": "Sfoglia il codice sorgente qui"
},
"susimail": {
"description": "Descrizione per e-mail",
"message": "Accesso rapido al client di posta elettronica di rete SusiMail I2P."
},
"text-section-header": {
"description": "Il browser Internet invisibile",
"message": "Il browser Internet invisibile"
},
"text-section-proxyerr-header": {
"description": "Un errore di proxy ha superato",
"message": "Un errore di proxy ha superato"
},
"text-section-torrents-header": {
"description": "Scarica Torrent",
"message": "Scarica Torrent"
},
"titlePreface": {
"description": "Prefazione per la barra del browser",
"message": "I2P Browser"
},
"titlePrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "I2P Browser (Privato)"
},
"toopie": {
"description": "Per informazioni sullo stato del router I2P, vai qui:",
"message": "Per informazioni sullo stato del router I2P, vai qui:"
},
"toopieHtmlHeadline": {
"description": "Informazioni sul router I2P",
"message": "Informazioni sul router I2P"
},
"toopieName": {
"description": "Nome della barra laterale.",
"message": "anch'io. html"
},
"toopieTLS": {
"description": "Nome del pannello di sicurezza.",
"message": "Proprietà del sito"
},
"topbar": {
"description": "Sfoglia Download",
"message": "Sfoglia Download"
},
"torPreface": {
"description": "Prefazione per la barra del browser",
"message": "Tor Manager"
},
"torPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Tor Manager (Private)"
},
"torrent-action": {
"description": "Scarica",
"message": "Scarica"
},
"torrentControls": {
"description": "Controllo Torrent",
"message": "Controllo Torrent"
},
"torrentDownloads": {
"description": "Scarica Torrent",
"message": "Scarica Torrent"
},
"torrentPreface": {
"description": "Prefazione per la barra del browser",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Bittorrent (Private)"
},
"torrentui-opener": {
"description": "Aprire WebUI",
"message": "Aprire WebUI"
},
"visit-irc": {
"description": "Visita IRC",
"message": "Visita IRC"
},
"webPreface": {
"description": "Prefazione per la barra del browser",
"message": "Browser Web"
},
"webPrefacePrivate": {
"description": "Prefazione per la barra del browser",
"message": "Web Browser (Privato)"
},
"webpage": {
"description": "Ulteriori informazioni sono disponibili qui.",
"message": "Ulteriori informazioni sono disponibili qui."
},
"window-visit-console": {
"description": "Console Router I2P",
"message": "Console Router I2P"
},
"window-visit-help": {
"description": "Pagina di aiuto di estensione",
"message": "Pagina di aiuto di estensione"
},
"window-visit-homepage": {
"description": "Il browser Internet invisibile",
"message": "Il browser Internet invisibile"
},
"window-visit-i2p": {
"description": "I2P Pagina principale del progetto:",
"message": "I2P Pagina principale del progetto:"
},
"window-visit-i2ptunnel": {
"description": "Gestione dei servizi nascosti",
"message": "Gestione dei servizi nascosti"
},
"window-visit-index": {
"description": "Webextension Homepage:",
"message": "Webextension Homepage:"
},
"window-visit-releases": {
"description": "Comunicati:",
"message": "Comunicati:"
},
"window-visit-router": {
"description": "Router Console",
"message": "Router Console"
},
"window-visit-settings": {
"description": "Aprire le impostazioni",
"message": "Aprire le impostazioni"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "Codice sorgente:",
"message": "Codice sorgente:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "Toopie",
"message": "Toopie"
},
"window-visit-torrent": {
"description": "Per assistenza, visita la pagina di aiuto torrent",
"message": "Per assistenza, visita la pagina di aiuto torrent"
},
"windowVisitConsole": {
"description": "Etichetta Router Console.",
"message": "Router Console:"
},
"windowVisitHelppage": {
"description": "Pagina di aiuto per l'etichetta di estensione.",
"message": "Informazioni sul WebExtension:"
},
"windowVisitHomepage": {
"description": "Pagina iniziale per l'etichetta di estensione.",
"message": "Pagina iniziale:"
},
"windowVisitI2ptunnel": {
"description": "Titolo per i2ptunnel",
"message": "Hidden Services Manager:"
},
"windowVisitReleases": {
"description": "Visita la pagina di rilascio",
"message": "Rilasci di estensione:"
},
"windowVisitSnark": {
"description": "Titolo per Bittorrent",
"message": "Bittorrent:"
},
"windowVisitSources": {
"description": "Titolo per codice sorgente link",
"message": "Codice sorgente di estensione:"
},
"windowVisitSusimail": {
"description": "Titolo per e-mail",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "Visita l'estensione homepage su Github",
"message": "Pagina iniziale di estensione:"
}
}

738
_locales/ja/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "証明書情報:",
"message": "証明書情報:"
},
"SignedLabel": {
"description": "署名:",
"message": "署名:"
},
"TorrentTypeLabel": {
"description": "トレントリンク:",
"message": "トレントリンク:"
},
"TypeLabel": {
"description": "トレントリンク:",
"message": "トレントリンク:"
},
"aboutconsole": {
"description": "ルーターコンソールのホームページにアクセスするには、以下を参照してください。",
"message": "ルーターコンソールのホームページにアクセスするには、以下を参照してください。"
},
"abouthome": {
"description": "延長ボタンページの説明。.",
"message": "この拡張機能の詳細については、このページをご覧ください。."
},
"addresstype": {
"description": "アドレス タイプ:",
"message": "アドレス タイプ:"
},
"applicationExplain": {
"description": "アプリケーションセクションの説明。.",
"message": "I2P ルータコンソールとアプリケーションは、独自のタブで開き、この拡張機能をブラウジングするのと同じセキュリティの利点を提供します。 これにより、各アプリケーションを分離し、指紋やスクリプトから他のタブ(ソーシャルメディアなど)を防ぐことで、より保護が向上します。 すべてのタブでは、I2P ワークフローを追跡するために色を特定する機能を使用します。."
},
"applicationHeader": {
"description": "アプリケーションセクションのヘッダー。.",
"message": "アプリケーション"
},
"beta": {
"description": "実験製品です。.",
"message": "実験製品です。."
},
"blogPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ニュース"
},
"blogPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ブログ(プライベート)"
},
"bookmarksButton": {
"description": "ブックマークを再作成する",
"message": "ブックマークを再作成する"
},
"botePreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "I2P-Bote メール"
},
"botePrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "I2P-Bote メール(プライベート)"
},
"browser-action": {
"description": "サイトマップ",
"message": "サイトマップ"
},
"btRpcHostText": {
"description": "トレント RPC ホスト:",
"message": "トレント RPC ホスト:"
},
"btRpcPathText": {
"description": "トレント RPC パス:",
"message": "トレント RPC パス:"
},
"btRpcPortText": {
"description": "トレント RPC 港:",
"message": "トレント RPC 港:"
},
"certAbsent": {
"description": "不在の場合の証明書情報のためのコンテンツ",
"message": "このサイトはHTTPSを利用していません。 I2Pによって暗号化されても検証されています。."
},
"certPresent": {
"description": "証明書情報の内容 提示すれば",
"message": "このサイトは HTTPS を使用しています。 I2P上のHTTPSは実験的であり、自己署名された証明書または代替ルートの作者を必要とします。."
},
"clearData": {
"description": "データのメニュー項目を消去します。.",
"message": "データの閲覧をクリア:"
},
"clearDesc": {
"description": "閲覧データアクションの説明をクリアします。.",
"message": "これにより、I2Pの閲覧データを消去できます。."
},
"controlExplain": {
"description": "コントロールパネルを導入.",
"message": "これらのコントロールは、I2P ブラウジングエクスペリエンスを調整するために使用されます。"
},
"controlHeader": {
"description": "制御のパネルのための見出し。.",
"message": "コントロール"
},
"controlHelpText": {
"description": "リセットトンネルボタンのオプションを設定するのに役立ちます",
"message": "ルーターのコンソールをここに構成します。."
},
"controlHostText": {
"description": "ルーターコンソールのホスト",
"message": "制御ホスト:"
},
"controlHostValue": {
"description": "ルーターコンソールのホスト",
"message": "127.0.0.1の"
},
"controlPortText": {
"description": "ルーターコンソール用のポート",
"message": "制御港:"
},
"controlPortValue": {
"description": "ルーターコンソール用のポート",
"message": "ディストリクト7657"
},
"description": {
"description": "このブラウザでI2Pを使うことができます。.",
"message": "このブラウザでI2Pを使うことができます。."
},
"description2": {
"description": "このページを見ていると、プロキシエラーが発生したためです。 問題の診断に役立つ情報をいくつか提供しました。.",
"message": "このページを見ていると、プロキシエラーが発生したためです。 問題の診断に役立つ情報をいくつか提供しました。."
},
"disableHistory": {
"description": "履歴チェックボックスラベル。.",
"message": "I2Pタブで履歴を無効にできますか?"
},
"enableWebRTC": {
"description": "WebRTC チェックボックスラベル。.",
"message": "プロキシでWebRTCを有効にする?"
},
"extensionDescription": {
"description": "拡張子の説明。.",
"message": "I2Pネットワークの閲覧が容易になりました。."
},
"extensionName": {
"description": "拡張子の名前。.",
"message": "I2Pについて プライベートブラウジング"
},
"extensionNameVariant": {
"description": "拡張子の名前。.",
"message": "I2P で プライベートブラウジング - Rhizome Variant"
},
"extensionPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "I2P管理"
},
"extensionVersion": {
"description": "拡張子のバージョン。.",
"message": "1.28の"
},
"fliplinks": {
"description": "エクステンションとI2Pリソース",
"message": "エクステンションとI2Pリソース"
},
"forumMessage": {
"description": "サポートメッセージ",
"message": "I2Pフォーラムにアクセスして、より多くのことを学ぶか、援助を求める"
},
"headline": {
"description": "目に見えないインターネットブラウザ",
"message": "目に見えないインターネットブラウザ"
},
"help": {
"description": "延長ボタンページの説明。.",
"message": "この拡張機能の詳細については、このページをご覧ください。."
},
"helpMessage": {
"description": "サポートメッセージ",
"message": "追加ヘルプを入手"
},
"histDesc": {
"description": "履歴アクションの説明",
"message": "I2Pタブが閉じられたときに履歴は自動的に消去されます。 あなたが行くように歴史をクリアしたい場合は、このボックスをチェックしてください。."
},
"homepage": {
"description": "詳細情報",
"message": "詳しくはこちらをご覧ください。"
},
"hostText": {
"description": "HTTP または SOCKS 5 プロキシのホスト",
"message": "ホスト:"
},
"i2ppage": {
"description": "詳しくはこちらをご覧ください。.",
"message": "詳しくはこちらをご覧ください。."
},
"i2ptunnel": {
"description": "I2ptunnelの説明",
"message": "プロキシステータスメッセージを表示し、サービスやトンネルの設定を行います。."
},
"i2ptunnelPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "隠されたサービスマネージャ"
},
"i2ptunnelPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "隠しサービスマネージャ(プライベート)"
},
"infoMessage": {
"description": "サポートメッセージ",
"message": "EepWeb を閲覧できるようになりました。 お使いのブラウザは、I2Pネットワーク上で匿名で閲覧するように設定されています。 ご覧のとおり、トラフィックは他のネットワークノードを介してルーティングされ、サーバーとノード自身の両方の起源を偽装します。."
},
"infoTitle": {
"description": "ヘルプメニューのタイトル",
"message": "I2Pについて お問い合わせ"
},
"ircPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ディスパッチIRC"
},
"ircPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ディスパッチIRC(プライベート)"
},
"isBase32": {
"description": "サイト情報パネルベース32のメッセージ",
"message": "I2P Base32-Formatted アドレス"
},
"isHostName": {
"description": "サイト情報パネルのホスト名のためのメッセージ",
"message": "I2Pについて ジャンプのホスト名"
},
"label-router-activepeers": {
"description": "活動的なピア:",
"message": "活動的なピア:"
},
"label-router-bandwidth": {
"description": "バンド幅",
"message": "バンド幅"
},
"label-router-bw-inbound-15s": {
"description": "インバウンドbw 15s:",
"message": "インバウンドbw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "インバウンドbw 1s:",
"message": "インバウンドbw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "アウトバウンドbw 15s:",
"message": "アウトバウンドbw 15s:"
},
"label-router-bw-outbound-1s": {
"description": "アウトバウンドbw 1s:",
"message": "アウトバウンドbw 1s:"
},
"label-router-net-tunnels-participating": {
"description": "トランジットトンネル:",
"message": "トランジットトンネル:"
},
"label-router-netdb-fastpeers": {
"description": "速い皮:",
"message": "速い皮:"
},
"label-router-netdb-highcapacitypeers": {
"description": "高容量 ピーラー:",
"message": "高容量 ピーラー:"
},
"label-router-netdb-isreseeding": {
"description": "残された状態:",
"message": "残された状態:"
},
"label-router-netdb-knownpeers": {
"description": "既知のピアーズ:",
"message": "既知のピアーズ:"
},
"label-router-peers": {
"description": "ピーラー",
"message": "ピーラー"
},
"label-router-status": {
"description": "状態のルーターの状態:",
"message": "状態のルーターの状態:"
},
"label-router-uptime": {
"description": "ルーターの稼働時間(Ms):",
"message": "ルーターの稼働時間(Ms):"
},
"label-router-version": {
"description": "ルーター版:",
"message": "ルーター版:"
},
"links": {
"description": "エクステンションとI2Pリソース",
"message": "エクステンションとI2Pリソース"
},
"linksExplain": {
"description": "I2Pについて詳しく知りたい方は、こちらのリンクをご覧ください。.",
"message": "I2Pについて詳しく知りたい方は、こちらのリンクをご覧ください。."
},
"mailPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "Webメール"
},
"mailPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "Webメール(プライベート)"
},
"muwirePreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "メニュー"
},
"muwirePrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "MuWire(プライベート)"
},
"newsMessage": {
"description": "サポートメッセージ",
"message": "I2Pにアクセス i2pの最新情報を知るブログです。."
},
"onboardingButtonFive": {
"description": "あなたの改善 体験プラン",
"message": "あなたの改善 体験プラン"
},
"onboardingButtonFour": {
"description": "ファイル共有",
"message": "ファイル共有"
},
"onboardingButtonOne": {
"description": "I2Pネットワークブラウジングと非I2Pネットワークブラウジング",
"message": "I2Pネットワークブラウジングと非I2Pネットワークブラウジング"
},
"onboardingButtonThree": {
"description": "隠しメール",
"message": "隠しメール"
},
"onboardingButtonTwo": {
"description": "ネットワーク境界の保護",
"message": "ネットワーク境界の保護"
},
"onboardingButtonZero": {
"description": "プライバシーを守る",
"message": "プライバシーを守る"
},
"onboardingContentFive": {
"description": "このエクステンションは他のエクステンションと組み合わせて機能を改善することができます。 uBlock の起源、ローカル CDN および jShelter は、ページの読み込みを高速化し、広告をブロックし、Javascript の電力を制限するのに便利です。 すべてのJavascriptをブロックしたい方は、NoScriptをお勧めします。.",
"message": "このエクステンションは他のエクステンションと組み合わせて機能を改善することができます。 uBlock の起源、ローカル CDN および jShelter は、ページの読み込みを高速化し、広告をブロックし、Javascript の電力を制限するのに便利です。 すべてのJavascriptをブロックしたい方は、NoScriptをお勧めします。."
},
"onboardingContentFour": {
"description": "I2Pは、BitTorrentのようなピアツーピアアプリケーションを使用して、ファイルを共有するときにあなたのアイデンティティを保護することができます。 当社の匿名bittorrentクライアントは、ブラウザでご利用いただけます。.",
"message": "I2Pは、BitTorrentのようなピアツーピアアプリケーションを使用して、ファイルを共有するときにあなたのアイデンティティを保護することができます。 当社の匿名bittorrentクライアントは、ブラウザでご利用いただけます。."
},
"onboardingContentOne": {
"description": "I2Pサイトを閲覧する際に自動的に機能します。 I2Pをプロキシとして非I2Pサイトに使用したい場合は、ツールバーのI2P In Private Browsingボタンを使用して、新しいI2Pブラウザタブをクリックして、新しいタブでI2Pブラウジングを切り替えます。 インターネットを閲覧する際の体験は若干異なります。 物事は少し遅くなり、セキュリティレベルに応じて、一部の要素は動作しません。 また、ロボットではなく、人間であることを証明するように求められます。.",
"message": "I2Pサイトを閲覧する際に自動的に機能します。 I2Pをプロキシとして非I2Pサイトに使用したい場合は、ツールバーのI2P In Private Browsingボタンを使用して、新しいI2Pブラウザタブをクリックして、新しいタブでI2Pブラウジングを切り替えます。 インターネットを閲覧する際の体験は若干異なります。 物事は少し遅くなり、セキュリティレベルに応じて、一部の要素は動作しません。 また、ロボットではなく、人間であることを証明するように求められます。."
},
"onboardingContentThree": {
"description": "また、I2Pの内側に匿名のメールサービスもあります。ブラウザから直接メニューからアクセス可能です。.",
"message": "また、I2Pの内側に匿名のメールサービスもあります。ブラウザから直接メニューからアクセス可能です。."
},
"onboardingContentTwo": {
"description": "I2Pは通常、WebUI(「Router Console」)を介して管理されます。これにより、ユーザーはリモートサイトにアクセスするために使用している同じブラウザで閲覧できます。 このWebUIや他のローカルランニングサービスから情報にアクセスできるサイトを防ぐことは不可欠です。 Clearnet サイトは firefox デフォルトコンテナに残っていますが、 firefox デフォルトコンテナが *.onion または *.i2p サイトをリクエストするとすぐにコンテナ化されます。 Tor Browser の ID 管理ツールは clearnet タブを制御し、デフォルト I2P outproxy または outproxy プラグインを使用してプロキシされます。.",
"message": "I2Pは、通常、WebUI(「ルーターコンソール」)を介して管理されます。これにより、ユーザーはリモートサイトにアクセスするために使用している同じブラウザで閲覧できます。 このWebUIや他のローカルランニングサービスから情報にアクセスできるサイトを防ぐことは不可欠です。 Clearnet サイトは firefox デフォルトコンテナに残っていますが、 firefox デフォルトコンテナが *.onion または *.i2p サイトをリクエストするとすぐにコンテナ化されます。 Tor Browser の ID 管理ツールは clearnet タブを制御し、デフォルト I2P outproxy または outproxy プラグインを使用してプロキシされます。."
},
"onboardingContentZero": {
"description": "I2Pをプライベートブラウジングモードで使用する場合、追跡と監視から保護されています。 I2Pブラウザはクッキーを分離し、セッション後にブラウザの履歴を削除します。 これらの変更により、プライバシーとセキュリティが保護されます。.",
"message": "I2Pをプライベートブラウジングモードで使用する場合、追跡と監視から保護されています。 I2Pブラウザはクッキーを分離し、セッション後にブラウザの履歴を削除します。 これらの変更により、プライバシーとセキュリティが保護されます。."
},
"onboardingFive": {
"description": "体験のヒント",
"message": "体験のヒント"
},
"onboardingFour": {
"description": "ウェブ閲覧",
"message": "ウェブ閲覧"
},
"onboardingOne": {
"description": "設定する 体験プラン",
"message": "設定する 体験プラン"
},
"onboardingThree": {
"description": "隠しメール",
"message": "隠しメール"
},
"onboardingTitle": {
"description": "I2Pについて プライベートブラウジング",
"message": "I2Pについて プライベートブラウジング"
},
"onboardingTwo": {
"description": "ファイル共有",
"message": "ファイル共有"
},
"onboardingZero": {
"description": "プライバシーを守る",
"message": "プライバシーを守る"
},
"portText": {
"description": "HTTP または SOCKS 5 プロキシのポート",
"message": "港:"
},
"protocolHandlerValue": {
"description": "マグネットプロトコルハンドラの値",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s\u0026action=Add\u0026foo=Add+torrent"
},
"proxy-check": {
"description": "プロキシは準備が整います。.",
"message": "プロキシは準備が整います。."
},
"proxyFailedStatus": {
"description": "プロキシが失敗したステータス。.",
"message": "プロキシは準備が整っていない"
},
"proxyHelpText": {
"description": "リセットトンネルボタンのオプションを設定するのに役立ちます",
"message": "ここでは、I2P プロキシを設定します。."
},
"proxySuccessStatus": {
"description": "プロキシが失敗したステータス。.",
"message": "プロキシは準備ができています"
},
"readyness": {
"description": "プロキシは準備が整います。.",
"message": "プロキシは準備が整います。."
},
"releases": {
"description": "新しいリリースページの説明",
"message": "新規リリースはこちら"
},
"resetMessage": {
"description": "リセットトンネルボタンのメッセージ",
"message": "リセットトンネル"
},
"returnhome": {
"description": "・",
"message": "・"
},
"router-net-bw-inbound-15s": {
"description": "ルーターの帯域幅Outbound 15sと取り替えて下さい",
"message": "ルーターの帯域幅Outbound 15sと取り替えて下さい"
},
"router-net-bw-inbound-1s": {
"description": "ルーターの帯域幅のインバウンド1sと取り替えて下さい",
"message": "ルーターの帯域幅のインバウンド1sと取り替えて下さい"
},
"router-net-bw-outbound-15s": {
"description": "ルーターの帯域幅Outbound 15sと取り替えて下さい",
"message": "ルーターの帯域幅Outbound 15sと取り替えて下さい"
},
"router-net-bw-outbound-1s": {
"description": "ルーターの帯域幅Outbound 1sと取り替えて下さい",
"message": "ルーターの帯域幅Outbound 1sと取り替えて下さい"
},
"router-net-tunnels-participating": {
"description": "ルーターのParticipatingのトンネルの計算と取り替えて下さい",
"message": "ルーターのParticipatingのトンネルの計算と取り替えて下さい"
},
"router-netdb-activepeers": {
"description": "ルーターのアクティブ ピアーズと取り替えて下さい",
"message": "ルーターのアクティブ ピアーズと取り替えて下さい"
},
"router-netdb-fastpeers": {
"description": "ルーターの速いピアーズと取り替えて下さい",
"message": "ルーターの速いピアーズと取り替えて下さい"
},
"router-netdb-highcapacitypeers": {
"description": "高容量のピアーズと取り替えて下さい",
"message": "高容量のピアーズと取り替えて下さい"
},
"router-netdb-isreseeding": {
"description": "ルーターのnetDBの参照の状態と取り替えて下さい",
"message": "ルーターのnetDBの参照の状態と取り替えて下さい"
},
"router-netdb-knownpeers": {
"description": "ルーターの既知のピアーズと取り替えて下さい",
"message": "ルーターの既知のピアーズと取り替えて下さい"
},
"router-restart": {
"description": "うまくルーターを再起動",
"message": "うまくルーターを再起動"
},
"router-shutdown": {
"description": "グレースフルシャットダウンルータ",
"message": "グレースフルシャットダウンルータ"
},
"router-status": {
"description": "ルーターの状態に置換",
"message": "ルーターの状態に置換"
},
"router-uptime": {
"description": "ルーターの稼働時間と取り替えて下さい",
"message": "ルーターの稼働時間と取り替えて下さい"
},
"router-version": {
"description": "ルーター版と取り替えて下さい",
"message": "ルーター版と取り替えて下さい"
},
"routerConsole": {
"description": "ルーターコンソールの説明。.",
"message": "I2P ルータコンソールとアプリケーションと構成のフルレンジにアクセスします。."
},
"routerPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ルーターコンソール"
},
"routerPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ルーターコンソール(プライベート)"
},
"rpcHelpText": {
"description": "ここでは、I2PControl オプションを設定します。 Bittorrentオプションをここに設定します。.",
"message": "ここでは、I2PControl オプションを設定します。 Bittorrentオプションをここに設定します。."
},
"rpcHostText": {
"description": "制御港:",
"message": "制御港:"
},
"rpcPassText": {
"description": "制御パスワード:トレントRPC パスワード:",
"message": "制御パスワード:トレントRPC パスワード:"
},
"rpcPathText": {
"description": "制御パス:",
"message": "制御パス:"
},
"rpcPortText": {
"description": "制御ホスト:",
"message": "制御ホスト:"
},
"rtcDesc": {
"description": "WebRTC アクションの説明",
"message": "WebRTC はデフォルトで無効になっていますが、それをオンにしてプロキシを称えるように強制することができます。 Snowflakeブラウザの拡張機能をご利用の場合、このオプションは無効になっており、デフォルトではWebRTCがオンになっています。."
},
"signingcert": {
"description": "署名:",
"message": "署名:"
},
"siteLabel": {
"description": "I2pサイトのラベル",
"message": "アドレス/サイト情報:"
},
"sitecert": {
"description": "証明書情報:",
"message": "証明書情報:"
},
"snark": {
"description": "Bittorrentの記述",
"message": "Snark、Peer-to-peer I2Pネットワーク固有のファイル共有アプリケーションへの迅速なアクセス。."
},
"sourcehead": {
"description": "ソースコードを取得する:",
"message": "ソースコードを取得する:"
},
"sources": {
"description": "ソースコードリンクの記述",
"message": "ソースコードを参照"
},
"susimail": {
"description": "電子メールの記述",
"message": "SusiMail I2Pネットワークメールクライアントへの迅速なアクセス."
},
"text-section-header": {
"description": "目に見えないインターネットブラウザ",
"message": "目に見えないインターネットブラウザ"
},
"text-section-proxyerr-header": {
"description": "プロキシエラーが発生した",
"message": "プロキシエラーが発生した"
},
"text-section-torrents-header": {
"description": "トレントダウンロード",
"message": "トレントダウンロード"
},
"titlePreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "I2Pブラウザ"
},
"titlePrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "I2Pブラウザ(プライベート)"
},
"toopie": {
"description": "I2P ルーターのステータスに関する情報は、以下を参照してください。",
"message": "I2P ルーターのステータスに関する情報は、以下を参照してください。"
},
"toopieHtmlHeadline": {
"description": "I2P ルーター情報",
"message": "I2P ルーター情報"
},
"toopieName": {
"description": "サイドバーの名前。.",
"message": "お問い合わせ ツイート"
},
"toopieTLS": {
"description": "セキュリティパネルの名前。.",
"message": "サイトのプロパティ"
},
"topbar": {
"description": "ダウンロード",
"message": "ダウンロード"
},
"torPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "トー・マネージャー"
},
"torPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "トー・マネージャー(プライベート)"
},
"torrent-action": {
"description": "ダウンロード",
"message": "ダウンロード"
},
"torrentControls": {
"description": "トレントコントロール",
"message": "トレントコントロール"
},
"torrentDownloads": {
"description": "トレントダウンロード",
"message": "トレントダウンロード"
},
"torrentPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ビットトレント"
},
"torrentPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "Bittorrent(プライベート)"
},
"torrentui-opener": {
"description": "WebUIを開く",
"message": "WebUIを開く"
},
"visit-irc": {
"description": "IRCにアクセス",
"message": "IRCにアクセス"
},
"webPreface": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ウェブブラウザ"
},
"webPrefacePrivate": {
"description": "ブラウザのタイトルバーのPreface",
"message": "ウェブブラウザ(プライベート)"
},
"webpage": {
"description": "詳しくはこちらをご覧ください。.",
"message": "詳しくはこちらをご覧ください。."
},
"window-visit-console": {
"description": "I2P ルーターコンソール",
"message": "I2P ルーターコンソール"
},
"window-visit-help": {
"description": "拡張ヘルプページ",
"message": "拡張ヘルプページ"
},
"window-visit-homepage": {
"description": "目に見えないインターネットブラウザ",
"message": "目に見えないインターネットブラウザ"
},
"window-visit-i2p": {
"description": "I2Pについて プロジェクトのホームページ:",
"message": "I2Pについて プロジェクトのホームページ:"
},
"window-visit-i2ptunnel": {
"description": "隠されたサービスマネージャ",
"message": "隠されたサービスマネージャ"
},
"window-visit-index": {
"description": "Webex のホームページ:",
"message": "Webex のホームページ:"
},
"window-visit-releases": {
"description": "リリース:",
"message": "リリース:"
},
"window-visit-router": {
"description": "ルーターコンソール",
"message": "ルーターコンソール"
},
"window-visit-settings": {
"description": "設定を開く",
"message": "設定を開く"
},
"window-visit-snark": {
"description": "ビットトレント",
"message": "ビットトレント"
},
"window-visit-sources": {
"description": "ソースコード:",
"message": "ソースコード:"
},
"window-visit-susimail": {
"description": "Eメール",
"message": "Eメール"
},
"window-visit-toopie": {
"description": "トッピー",
"message": "トッピー"
},
"window-visit-torrent": {
"description": "援助のために、トレントヘルプページをご覧ください",
"message": "援助のために、トレントヘルプページをご覧ください"
},
"windowVisitConsole": {
"description": "ルーターコンソールラベル。.",
"message": "ルーターコンソール:"
},
"windowVisitHelppage": {
"description": "拡張ラベルのヘルプページ。.",
"message": "Web拡張情報:"
},
"windowVisitHomepage": {
"description": "エクステンションラベルのトップページです。.",
"message": "ホームページ:"
},
"windowVisitI2ptunnel": {
"description": "I2ptunnelのタイトル",
"message": "隠されたサービスマネージャ:"
},
"windowVisitReleases": {
"description": "リリースページへ",
"message": "延長リリース:"
},
"windowVisitSnark": {
"description": "Bittorrentのタイトル",
"message": "Bittorrent:"
},
"windowVisitSources": {
"description": "ソースコードリンクのタイトル",
"message": "延長ソースコード:"
},
"windowVisitSusimail": {
"description": "メールのタイトル",
"message": "メール:"
},
"windowVisitWebPage": {
"description": "Githubの拡張ホームページにアクセス",
"message": "延長ホームページ:"
}
}

738
_locales/pt/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "Informação do Certificado:",
"message": "Informação do Certificado:"
},
"SignedLabel": {
"description": "Assinado por:",
"message": "Assinado por:"
},
"TorrentTypeLabel": {
"description": "Ligações Torrent:",
"message": "Ligações Torrent:"
},
"TypeLabel": {
"description": "Ligações Torrent:",
"message": "Ligações Torrent:"
},
"aboutconsole": {
"description": "Para acessar a página inicial do console do roteador, vá aqui:",
"message": "Para acessar a página inicial do console do roteador, vá aqui:"
},
"abouthome": {
"description": "Descrição para a página do botão de extensão.",
"message": "Para mais informações sobre esta extensão, visite esta página."
},
"addresstype": {
"description": "Tipo de endereço:",
"message": "Tipo de endereço:"
},
"applicationExplain": {
"description": "Descrição para seção de aplicação.",
"message": "O console de roteador I2P e aplicações abrem em sua própria aba, fornecendo-lhes os mesmos benefícios de segurança que navegar com esta extensão. Isso adiciona mais proteção isolando cada aplicativo e impedindo outras abas (ou seja, mídia social, etc) de impressões digitais ou scripts. Todas as abas usam cores de identificação para acompanhar seu fluxo de trabalho I2P."
},
"applicationHeader": {
"description": "Cabeçalho para seção de aplicações.",
"message": "Aplicações"
},
"beta": {
"description": "Este é um produto experimental.",
"message": "Este é um produto experimental."
},
"blogPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Blog"
},
"blogPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Blog (Privado)"
},
"bookmarksButton": {
"description": "Marcas de referência",
"message": "Marcas de referência"
},
"botePreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "I2P-Bote Mail (Privado)"
},
"browser-action": {
"description": "Navegar",
"message": "Navegar"
},
"btRpcHostText": {
"description": "Torrent RPC Anfitrião:",
"message": "Torrent RPC Anfitrião:"
},
"btRpcPathText": {
"description": "Torrent RPC Caminho:",
"message": "Torrent RPC Caminho:"
},
"btRpcPortText": {
"description": "Torrent RPC Porto:",
"message": "Torrent RPC Porto:"
},
"certAbsent": {
"description": "Conteúdo para informações do certificado se ausente",
"message": "Este site não está usando HTTPS. Ainda é verificado criptograficamente pelo I2P."
},
"certPresent": {
"description": "Conteúdo para informações do certificado se presente",
"message": "Este site está usando HTTPS. HTTPS sobre I2P é experimental e requer certificados auto-assinados ou autorites de raiz alternativos."
},
"clearData": {
"description": "Item de menu de dados de navegação clara.",
"message": "Limpar dados de navegação:"
},
"clearDesc": {
"description": "Descrição de ação de dados de navegação clara.",
"message": "Use isso para apagar seus dados de navegação I2P."
},
"controlExplain": {
"description": "Introduza o painel de controlo.",
"message": "Estes controles são usados para adaptar sua experiência de navegação I2P"
},
"controlHeader": {
"description": "Headline para painel de controle.",
"message": "Controlo"
},
"controlHelpText": {
"description": "Ajuda para configurar as opções para o botão Reset Tunnel",
"message": "Configure o console do roteador aqui."
},
"controlHostText": {
"description": "Anfitrião para o console do roteador",
"message": "Anfitrião de controle:"
},
"controlHostValue": {
"description": "Anfitrião para o console do roteador",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Porta para o console do roteador",
"message": "Porta de controle:"
},
"controlPortValue": {
"description": "Porta para o console do roteador",
"message": "7657"
},
"description": {
"description": "Agora você pode usar o I2P neste navegador.",
"message": "Agora você pode usar o I2P neste navegador."
},
"description2": {
"description": "Se você está vendo esta página, é porque um erro proxy ocorreu. Algumas informações foram fornecidas para ajudá-lo a diagnosticar o problema.",
"message": "Se você está vendo esta página, é porque um erro proxy ocorreu. Algumas informações foram fornecidas para ajudá-lo a diagnosticar o problema."
},
"disableHistory": {
"description": "Marca da caixa de seleção de história.",
"message": "Disable History in I2P Tabs?"
},
"enableWebRTC": {
"description": "Etiqueta da caixa de seleção WebRTC.",
"message": "Ativar WebRTC com proxy?"
},
"extensionDescription": {
"description": "Descrição da extensão.",
"message": "I2P navegação de rede facilitada."
},
"extensionName": {
"description": "Nome da extensão.",
"message": "I2P Em Navegação Privada"
},
"extensionNameVariant": {
"description": "Nome da extensão.",
"message": "I2P Em Navegação Privada - Variante de Rhizome"
},
"extensionPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Gestão de I2P"
},
"extensionVersion": {
"description": "Versão da extensão.",
"message": "1.28"
},
"fliplinks": {
"description": "Recursos de extensão e I2P",
"message": "Recursos de extensão e I2P"
},
"forumMessage": {
"description": "Mensagem de Ajuda",
"message": "Visite o Fórum I2P para saber mais ou pedir ajuda"
},
"headline": {
"description": "O Navegador de Internet Invisível",
"message": "O Navegador de Internet Invisível"
},
"help": {
"description": "Descrição para a página do botão de extensão.",
"message": "Para mais informações sobre esta extensão, visite esta página."
},
"helpMessage": {
"description": "Mensagem de Ajuda",
"message": "Obtenha ajuda adicional"
},
"histDesc": {
"description": "Descrição da ação",
"message": "A história é automaticamente limpa quando suas abas I2P estão fechadas. Se você quiser limpar a história como você vai, verifique esta caixa."
},
"homepage": {
"description": "Encontre mais informações",
"message": "Mais informações estão disponíveis aqui"
},
"hostText": {
"description": "Anfitrião para o Proxy HTTP ou SOCKS5",
"message": "Anfitrião:"
},
"i2ppage": {
"description": "Mais informações estão disponíveis aqui.",
"message": "Mais informações estão disponíveis aqui."
},
"i2ptunnel": {
"description": "Descrição para i2ptunnel",
"message": "Ver mensagens de status proxy e configurar serviços e túneis."
},
"i2ptunnelPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Gerente de Serviços Escondidos"
},
"i2ptunnelPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Gestor de Serviços Escondidos (Privado)"
},
"infoMessage": {
"description": "Mensagem de Ajuda",
"message": "Agora você está livre para navegar no eepWeb! Seu navegador agora está configurado para navegar anonimamente na rede I2P. Como você navega, seu tráfego será encaminhado através de outros nós de rede para disfarçar sua origem, tanto do servidor quanto dos próprios nós."
},
"infoTitle": {
"description": "Título para o menu de ajuda",
"message": "I2P Ajuda"
},
"ircPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Despacho IRC"
},
"ircPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "IRC (Privado)"
},
"isBase32": {
"description": "Mensagem para o site info painel base32",
"message": "Endereço I2P Base32-Formatted"
},
"isHostName": {
"description": "Mensagem para o site info painel hostname",
"message": "I2P Jump Hostname"
},
"label-router-activepeers": {
"description": "Active Peers:",
"message": "Active Peers:"
},
"label-router-bandwidth": {
"description": "Largura de banda",
"message": "Largura de banda"
},
"label-router-bw-inbound-15s": {
"description": "Inbound bw 15s:",
"message": "Inbound bw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "Inbound bw 1s:",
"message": "Inbound bw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "15s",
"message": "15s"
},
"label-router-bw-outbound-1s": {
"description": "Fora da frente 1s:",
"message": "Fora da frente 1s:"
},
"label-router-net-tunnels-participating": {
"description": "Túnels de trânsito:",
"message": "Túnels de trânsito:"
},
"label-router-netdb-fastpeers": {
"description": "Peers rápidos:",
"message": "Peers rápidos:"
},
"label-router-netdb-highcapacitypeers": {
"description": "Alta capacidade Peers:",
"message": "Alta capacidade Peers:"
},
"label-router-netdb-isreseeding": {
"description": "Reseed status:",
"message": "Reseed status:"
},
"label-router-netdb-knownpeers": {
"description": "Known Peers:",
"message": "Known Peers:"
},
"label-router-peers": {
"description": "Peers",
"message": "Peers"
},
"label-router-status": {
"description": "Status do roteador:",
"message": "Status do roteador:"
},
"label-router-uptime": {
"description": "Tempo de funcionamento do roteador (Ms):",
"message": "Tempo de funcionamento do roteador (Ms):"
},
"label-router-version": {
"description": "Versão do roteador:",
"message": "Versão do roteador:"
},
"links": {
"description": "Recursos de extensão e I2P",
"message": "Recursos de extensão e I2P"
},
"linksExplain": {
"description": "Se você quiser obter mais informações sobre I2P, você pode visitar esses links.",
"message": "Se você quiser obter mais informações sobre I2P, você pode visitar esses links."
},
"mailPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Web Mail"
},
"mailPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Web Mail (Privado)"
},
"muwirePreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "MuWire (Privado)"
},
"newsMessage": {
"description": "Mensagem de Ajuda",
"message": "Visite o I2P Blog para aprender o mais recente sobre i2p."
},
"onboardingButtonFive": {
"description": "Melhorar a sua Experiência",
"message": "Melhorar a sua Experiência"
},
"onboardingButtonFour": {
"description": "Arquivos de compartilhamento",
"message": "Compartilhando arquivos"
},
"onboardingButtonOne": {
"description": "Navegação de Rede I2P e Navegação de Rede Não-I2P",
"message": "Navegação de Rede I2P e Navegação de Rede Não-I2P"
},
"onboardingButtonThree": {
"description": "E-mail oculto",
"message": "E-mail oculto"
},
"onboardingButtonTwo": {
"description": "Proteção de Boundaries de rede",
"message": "Proteção de Boundaries de rede"
},
"onboardingButtonZero": {
"description": "Proteja sua privacidade",
"message": "Proteja sua privacidade"
},
"onboardingContentFive": {
"description": "Esta extensão pode ser combinada com outras extensões que às vezes melhoram sua funcionalidade. uBlock Origin, LocalCDN e jShelter são úteis para acelerar o carregamento da página, bloquear anúncios e limitar o poder do Javascript. Para usuários que querem bloquear todo o Javascript, NoScript é recomendado.",
"message": "Esta extensão pode ser combinada com outras extensões que às vezes melhoram sua funcionalidade. uBlock Origin, LocalCDN e jShelter são úteis para acelerar o carregamento da página, bloquear anúncios e limitar o poder do Javascript. Para usuários que querem bloquear todo o Javascript, NoScript é recomendado."
},
"onboardingContentFour": {
"description": "I2P é capaz de usar aplicativos peer-to-peer como BitTorrent, protegendo sua identidade quando você compartilha arquivos. Nosso cliente bittorrent anônimo está disponível no navegador.",
"message": "I2P é capaz de usar aplicativos peer-to-peer como BitTorrent, protegendo sua identidade quando você compartilha arquivos. Nosso cliente bittorrent anônimo está disponível no navegador."
},
"onboardingContentOne": {
"description": "Esta extensão funciona automaticamente quando você está navegando sites I2P. Se você quiser usar o I2P como um proxy para sites não-I2P, use o botão I2P In Private Browsing na barra de ferramentas e clique em New I2P Browser Tab para mudar para I2P Browsing em uma nova guia. Sua experiência enquanto navega na internet pode ser um pouco diferente. As coisas podem ser um pouco mais lentas, e dependendo do seu nível de segurança, alguns elementos podem não funcionar ou carregar. Você também pode ser solicitado a provar que você é um humano e não um robô.",
"message": "Esta extensão funciona automaticamente quando você está navegando sites I2P. Se você quiser usar o I2P como um proxy para sites não-I2P, use o botão I2P In Private Browsing na barra de ferramentas e clique em New I2P Browser Tab para mudar para I2P Browsing em uma nova guia. Sua experiência enquanto navega na internet pode ser um pouco diferente. As coisas podem ser um pouco mais lentas, e dependendo do seu nível de segurança, alguns elementos podem não funcionar ou carregar. Você também pode ser solicitado a provar que você é um humano e não um robô."
},
"onboardingContentThree": {
"description": "Há também um serviço de e-mail anônimo disponível dentro do I2P, que é acessível a partir do nosso navegador através do menu diretamente à direita.",
"message": "Há também um serviço de e-mail anônimo disponível dentro do I2P, que é acessível a partir do nosso navegador através do menu diretamente à direita."
},
"onboardingContentTwo": {
"description": "O I2P é normalmente administrado por meio de um WebUI (O \"Consola de Usuário \"), que o usuário às vezes visualiza no mesmo navegador que eles usam para visitar sites remotos. É essencial evitar que os sites possam acessar informações deste WebUI e outros serviços em execução local. Os sites da Clearnet permanecem no recipiente firefox-default, mas assim que o recipiente firefox-default solicitar um *.onion ou *.i2p, ele será instantaneamente contêiner. A ferramenta de gerenciamento de identidade do navegador do Tor controla as abas de clearnet, e eles são proxied usando o padrão I2P outproxy ou outproxy plugin.",
"message": "O I2P é normalmente administrado através de um WebUI (The \" Router Console \"), que o usuário às vezes visualiza no mesmo navegador que eles usam para visitar sites remotos. É essencial evitar que os sites possam acessar informações deste WebUI e outros serviços em execução local. Os sites da Clearnet permanecem no recipiente firefox-default, mas assim que o recipiente firefox-default solicitar um *.onion ou *.i2p, ele será instantaneamente contêiner. A ferramenta de gerenciamento de identidade do navegador do Tor controla as abas de clearnet, e eles são proxied usando o padrão I2P outproxy ou outproxy plugin."
},
"onboardingContentZero": {
"description": "Ao usar o I2P In Private Browsing Mode, você está protegido contra rastreamento e vigilância. O navegador I2P isola cookies e exclui o histórico do navegador após sua sessão. Essas modificações garantem que sua privacidade e segurança sejam protegidas como seu navegador.",
"message": "Ao usar o I2P In Private Browsing Mode, você está protegido contra rastreamento e vigilância. O navegador I2P isola cookies e exclui o histórico do navegador após sua sessão. Essas modificações garantem que sua privacidade e segurança sejam protegidas como seu navegador."
},
"onboardingFive": {
"description": "Dicas de experiência",
"message": "Dicas de experiência"
},
"onboardingFour": {
"description": "Navegação da Web",
"message": "Navegação da Web"
},
"onboardingOne": {
"description": "Configurar o seu Experiência",
"message": "Configurar o seu Experiência"
},
"onboardingThree": {
"description": "E-mail oculto",
"message": "E-mail oculto"
},
"onboardingTitle": {
"description": "Sobre I2P Em Navegação Privada",
"message": "Sobre I2P Em Navegação Privada"
},
"onboardingTwo": {
"description": "Compartilhe arquivos",
"message": "Compartilhe arquivos"
},
"onboardingZero": {
"description": "Proteja sua privacidade",
"message": "Proteja sua privacidade"
},
"portText": {
"description": "Porta para o Proxy HTTP ou SOCKS5",
"message": "Porto:"
},
"protocolHandlerValue": {
"description": "Valor para o manipulador de protocolo de ímã",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s\u0026action=Add\u0026foo=Add+torrent"
},
"proxy-check": {
"description": "A Proxy está pronta.",
"message": "A Proxy está pronta."
},
"proxyFailedStatus": {
"description": "O estado falhado da Proxy.",
"message": "Proxy não está pronto"
},
"proxyHelpText": {
"description": "Ajuda para configurar as opções para o botão Reset Tunnel",
"message": "Configure o seu proxy I2P aqui."
},
"proxySuccessStatus": {
"description": "O estado falhado da Proxy.",
"message": "Proxy está pronto"
},
"readyness": {
"description": "A Proxy está pronta.",
"message": "A Proxy está pronta."
},
"releases": {
"description": "Descrição para nova página de lançamento",
"message": "Confira novas versões aqui"
},
"resetMessage": {
"description": "Mensagem para o botão Reset Tunnel",
"message": "Repor túnel"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "Substitua com largura de banda Router Outbound 15s",
"message": "Substitua com largura de banda Router Outbound 15s"
},
"router-net-bw-inbound-1s": {
"description": "Substitua com largura de banda Router Inbound 1s",
"message": "Substitua com largura de banda Router Inbound 1s"
},
"router-net-bw-outbound-15s": {
"description": "Substitua com largura de banda Router Outbound 15s",
"message": "Substitua com largura de banda Router Outbound 15s"
},
"router-net-bw-outbound-1s": {
"description": "Substitua com largura de banda Router Outbound 1s",
"message": "Substitua com largura de banda Router Outbound 1s"
},
"router-net-tunnels-participating": {
"description": "Substitua com Contagem de Túnel Participante de Roteador",
"message": "Substitua com Contagem de Túnel Participante de Roteador"
},
"router-netdb-activepeers": {
"description": "Substituir com Router Active Peers",
"message": "Substituir com Router Active Peers"
},
"router-netdb-fastpeers": {
"description": "Substituir com Router Fast Peers",
"message": "Substituir com Router Fast Peers"
},
"router-netdb-highcapacitypeers": {
"description": "Substituir com Peers de alta capacidade",
"message": "Substituir com Peers de alta capacidade"
},
"router-netdb-isreseeding": {
"description": "Substituir com Router netDB Reseeding Status",
"message": "Substituir com Router netDB Reseeding Status"
},
"router-netdb-knownpeers": {
"description": "Substitua com Router Known Peers",
"message": "Substitua com Router Known Peers"
},
"router-restart": {
"description": "Roteador de reinício graciosamente",
"message": "Roteador de reinício graciosamente"
},
"router-shutdown": {
"description": "Roteador de desligamento graciosamente",
"message": "Roteador de desligamento graciosamente"
},
"router-status": {
"description": "Substituir com status de roteador",
"message": "Substituir com status de roteador"
},
"router-uptime": {
"description": "Substitua com Router Uptime",
"message": "Substitua com Router Uptime"
},
"router-version": {
"description": "Substituir com Router Versão",
"message": "Substituir com Router Versão"
},
"routerConsole": {
"description": "Descrição para o console do roteador.",
"message": "Acesse seu console de roteador I2P e sua gama completa de aplicações e configurações."
},
"routerPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Console de roteador"
},
"routerPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Console de roteador (Privado)"
},
"rpcHelpText": {
"description": "Configure as opções do I2PControl aqui. Configure suas opções Bittorrent aqui.",
"message": "Configure as opções do I2PControl aqui. Configure suas opções Bittorrent aqui."
},
"rpcHostText": {
"description": "Porta de controle:",
"message": "Porta de controle:"
},
"rpcPassText": {
"description": "Senha de controle: Torrent RPC Senha:",
"message": "Senha de controle: Torrent RPC Senha:"
},
"rpcPathText": {
"description": "Caminho de controle:",
"message": "Caminho de controle:"
},
"rpcPortText": {
"description": "Anfitrião de controle:",
"message": "Anfitrião de controle:"
},
"rtcDesc": {
"description": "Descrição da ação WebRTC",
"message": "WebRTC é desativado por padrão, mas você pode ligá-lo e forçá-lo a honrar o proxy. Se você é um usuário da extensão do navegador Snowflake, esta opção é desativada e WebRTC é ativada por padrão."
},
"signingcert": {
"description": "Assinado por:",
"message": "Assinado por:"
},
"siteLabel": {
"description": "Label for i2p site info",
"message": "Endereço/Site Informações:"
},
"sitecert": {
"description": "Informação do Certificado:",
"message": "Informação do Certificado:"
},
"snark": {
"description": "Descrição para Bittorrent",
"message": "Acesso rápido ao Snark, o aplicativo de compartilhamento de arquivos específico da rede Peer-to-peer I2P."
},
"sourcehead": {
"description": "Obter o código fonte:",
"message": "Obter o código fonte:"
},
"sources": {
"description": "Descrição para o link de código fonte",
"message": "Procurar o código fonte aqui"
},
"susimail": {
"description": "Descrição para e-mail",
"message": "Acesso rápido ao cliente de e-mail da rede SusiMail I2P."
},
"text-section-header": {
"description": "O Navegador de Internet Invisível",
"message": "O Navegador de Internet Invisível"
},
"text-section-proxyerr-header": {
"description": "Um erro Proxy tem Occurred",
"message": "Um erro Proxy tem Occurred"
},
"text-section-torrents-header": {
"description": "Baixar Torrent",
"message": "Baixar Torrent"
},
"titlePreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Navegador I2P"
},
"titlePrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Navegador I2P (Privado)"
},
"toopie": {
"description": "Para obter informações sobre o seu status de roteador I2P, vá aqui:",
"message": "Para obter informações sobre o seu status de roteador I2P, vá aqui:"
},
"toopieHtmlHeadline": {
"description": "I2P Router Informações",
"message": "I2P Router Informações"
},
"toopieName": {
"description": "Nome da barra lateral.",
"message": "também. html"
},
"toopieTLS": {
"description": "Nome do painel de segurança.",
"message": "Propriedades do Site"
},
"topbar": {
"description": "Browse Download",
"message": "Browse Download"
},
"torPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Gerente de Torno"
},
"torPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Tor Manager (Privado)"
},
"torrent-action": {
"description": "Baixar",
"message": "Baixar"
},
"torrentControls": {
"description": "Controles Torrent",
"message": "Controles Torrent"
},
"torrentDownloads": {
"description": "Baixar Torrent",
"message": "Baixar Torrent"
},
"torrentPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Bittorrent (Privado)"
},
"torrentui-opener": {
"description": "Abrir WebUI",
"message": "Abrir WebUI"
},
"visit-irc": {
"description": "Visite IRC",
"message": "Visite IRC"
},
"webPreface": {
"description": "Prefácio para a barra de título do navegador",
"message": "Navegador de Web"
},
"webPrefacePrivate": {
"description": "Prefácio para a barra de título do navegador",
"message": "Navegador Web (Privado)"
},
"webpage": {
"description": "Mais informações estão disponíveis aqui.",
"message": "Mais informações estão disponíveis aqui."
},
"window-visit-console": {
"description": "Console de roteador I2P",
"message": "Console de roteador I2P"
},
"window-visit-help": {
"description": "Página de Ajuda de Extensão",
"message": "Página de Ajuda de Extensão"
},
"window-visit-homepage": {
"description": "O Navegador de Internet Invisível",
"message": "O Navegador de Internet Invisível"
},
"window-visit-i2p": {
"description": "I2P Página inicial do projeto:",
"message": "I2P Página inicial do projeto:"
},
"window-visit-i2ptunnel": {
"description": "Gerente de Serviços Escondidos",
"message": "Gerente de Serviços Escondidos"
},
"window-visit-index": {
"description": "Página inicial da Webextension:",
"message": "Página inicial da Webextension:"
},
"window-visit-releases": {
"description": "Lançamentos:",
"message": "Lançamentos:"
},
"window-visit-router": {
"description": "Console de roteador",
"message": "Console de roteador"
},
"window-visit-settings": {
"description": "Abra as configurações",
"message": "Abra as configurações"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "Código de origem:",
"message": "Código de origem:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "Toopie",
"message": "Toopie"
},
"window-visit-torrent": {
"description": "Para assistência, visite a página de ajuda torrent",
"message": "Para assistência, visite a página de ajuda torrent"
},
"windowVisitConsole": {
"description": "Roteador Console rótulo.",
"message": "Console do roteador:"
},
"windowVisitHelppage": {
"description": "Página de ajuda para o rótulo de extensão.",
"message": "InformaçÃμes da WebExtension:"
},
"windowVisitHomepage": {
"description": "Página inicial para o rótulo de extensão.",
"message": "Página inicial:"
},
"windowVisitI2ptunnel": {
"description": "Título para i2ptunnel",
"message": "Gestor de Serviços Escondidos:"
},
"windowVisitReleases": {
"description": "Visite a página de lançamento",
"message": "Lançamentos de extensão:"
},
"windowVisitSnark": {
"description": "Título para Bittorrent",
"message": "Bittorrent:"
},
"windowVisitSources": {
"description": "Título para link de código fonte",
"message": "Código de fonte de extensão:"
},
"windowVisitSusimail": {
"description": "Título para e-mail",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "Visite a página inicial da extensão no Github",
"message": "Página inicial da extensão:"
}
}

738
_locales/ru/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "Информация о сертификатах:",
"message": "Информация о сертификатах:"
},
"SignedLabel": {
"description": "Подписано:",
"message": "Подписано:"
},
"TorrentTypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"TypeLabel": {
"description": "Torrent Links:",
"message": "Torrent Links:"
},
"aboutconsole": {
"description": "Чтобы получить доступ к домашней странице консоли маршрутизатора, идите сюда:",
"message": "Чтобы получить доступ к домашней странице консоли маршрутизатора, идите сюда:"
},
"abouthome": {
"description": "Описание страницы кнопки распространения.",
"message": "Для получения дополнительной информации об этом продлении посетите эту страницу."
},
"addresstype": {
"description": "Тип адреса:",
"message": "Тип адреса:"
},
"applicationExplain": {
"description": "Описание раздела приложения.",
"message": "Консоль маршрутизатора I2P и приложения открываются на своей вкладке, предоставляя им те же преимущества безопасности, что и просмотр с этим расширением. Это добавляет большую защиту, изолируя каждое приложение и предотвращая другие вкладки (т.е. социальные сети и т.д.) от отпечатков пальцев или сценариев. Все вкладки используют идентификационные цвета для отслеживания вашего рабочего процесса I2P."
},
"applicationHeader": {
"description": "Заголовок для секции приложений.",
"message": "Приложения"
},
"beta": {
"description": "Это экспериментальный продукт.",
"message": "Это экспериментальный продукт."
},
"blogPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Блог"
},
"blogPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Блог (Private)"
},
"bookmarksButton": {
"description": "Re-Create Закладки",
"message": "Re-Create Закладки"
},
"botePreface": {
"description": "Предисловие для заголовка браузера",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "I2P-Bote Mail (Private)"
},
"browser-action": {
"description": "Просмотреть",
"message": "Просмотреть"
},
"btRpcHostText": {
"description": "Torrent RPC Хосте:",
"message": "Torrent RPC Хосте:"
},
"btRpcPathText": {
"description": "Torrent RPC Путь:",
"message": "Torrent RPC Путь:"
},
"btRpcPortText": {
"description": "Torrent RPC Порт:",
"message": "Torrent RPC Порт:"
},
"certAbsent": {
"description": "Содержание для справки, если отсутствует",
"message": "Этот сайт не использует HTTPS. Это все еще проверяется криптографически I2P."
},
"certPresent": {
"description": "Содержание для справки, если присутствует",
"message": "Этот сайт использует HTTPS. HTTPS над I2P является экспериментальным и требует самоподписанных сертификатов или альтернативных корневых авторитов."
},
"clearData": {
"description": "Чистый пункт меню Browsing Data.",
"message": "Четкие данные по хранению:"
},
"clearDesc": {
"description": "Очистить описание действий просмотра данных.",
"message": "Используйте это, чтобы стереть данные просмотра I2P."
},
"controlExplain": {
"description": "Введите панель управления.",
"message": "Эти управления используются для адаптации вашего I2P Browsing Experience"
},
"controlHeader": {
"description": "Заголовок для панели управления.",
"message": "Контроль"
},
"controlHelpText": {
"description": "Помощь в настройке опций для кнопки Reset Tunnel",
"message": "Настройте консоль маршрутизатора здесь."
},
"controlHostText": {
"description": "Host for the Router Console",
"message": "Управляющий хост:"
},
"controlHostValue": {
"description": "Host for the Router Console",
"message": "127.0.0.1"
},
"controlPortText": {
"description": "Port for the Router Console",
"message": "Порт управления:"
},
"controlPortValue": {
"description": "Port for the Router Console",
"message": "7657"
},
"description": {
"description": "Теперь вы можете использовать I2P в этом браузере.",
"message": "Теперь вы можете использовать I2P в этом браузере."
},
"description2": {
"description": "Если вы видите эту страницу, это потому, что произошла ошибка прокси. Была предоставлена определенная информация, которая поможет вам диагностировать проблему.",
"message": "Если вы видите эту страницу, это потому, что произошла ошибка прокси. Была предоставлена определенная информация, которая поможет вам диагностировать проблему."
},
"disableHistory": {
"description": "Историческая этикетка.",
"message": "Disable History in I2P Tabs?"
},
"enableWebRTC": {
"description": "WebRTC флажок.",
"message": "Включить WebRTC с прокси?"
},
"extensionDescription": {
"description": "Описание расширения.",
"message": "Поиск сети I2P был легким."
},
"extensionName": {
"description": "Название расширения.",
"message": "I2P В частном рысе"
},
"extensionNameVariant": {
"description": "Название расширения.",
"message": "I2P в частном браузере - Rhizome Variant"
},
"extensionPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Управление I2P"
},
"extensionVersion": {
"description": "Версия расширения.",
"message": "1.28"
},
"fliplinks": {
"description": "Расширение и I2P",
"message": "Расширение и I2P"
},
"forumMessage": {
"description": "Сообщение",
"message": "Посетите форум I2P, чтобы узнать больше или попросить помощи"
},
"headline": {
"description": "Невидимый интернет-браузер",
"message": "Невидимый интернет-браузер"
},
"help": {
"description": "Описание страницы кнопки распространения.",
"message": "Для получения дополнительной информации об этом продлении посетите эту страницу."
},
"helpMessage": {
"description": "Сообщение",
"message": "Получить дополнительную помощь"
},
"histDesc": {
"description": "Описание действия истории",
"message": "История автоматически очищается, когда ваши вкладки I2P закрыты. Если вы хотите очистить историю, когда вы идете, проверьте эту коробку."
},
"homepage": {
"description": "Найти больше информации",
"message": "Больше информации здесь"
},
"hostText": {
"description": "Хост для HTTP или SOCKS5 Proxy",
"message": "Хосте:"
},
"i2ppage": {
"description": "Больше информации доступно здесь.",
"message": "Больше информации доступно здесь."
},
"i2ptunnel": {
"description": "Описание i2ptunnel",
"message": "Просмотр сообщений о состоянии прокси и настройка служб и туннелей."
},
"i2ptunnelPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Hidden Services Manager"
},
"i2ptunnelPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Hidden Services Manager (Private)"
},
"infoMessage": {
"description": "Сообщение",
"message": "Теперь вы можете просмотреть eepWeb! Теперь ваш браузер настроен для анонимного просмотра в сети I2P. По мере просмотра ваш трафик будет маршрутизирован через другие сетевые узлы, чтобы замаскировать его происхождение, как с сервера, так и с самих узлов."
},
"infoTitle": {
"description": "Название для меню справки",
"message": "I2P Помощь"
},
"ircPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Dispatch IRC"
},
"ircPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Dispatch IRC (Private)"
},
"isBase32": {
"description": "Сообщение для информационной панели сайта32",
"message": "I2P Base32-Formatted Address"
},
"isHostName": {
"description": "Сообщение для хостинга информационной панели сайта",
"message": "I2P Имя хоста"
},
"label-router-activepeers": {
"description": "Активные пивки:",
"message": "Активные пивки:"
},
"label-router-bandwidth": {
"description": "Bandwidth",
"message": "Bandwidth"
},
"label-router-bw-inbound-15s": {
"description": "Inbound bw 15s:",
"message": "Inbound bw 15s:"
},
"label-router-bw-inbound-1s": {
"description": "Inbound bw 1s:",
"message": "Inbound bw 1s:"
},
"label-router-bw-outbound-15s": {
"description": "15-е:",
"message": "15-е:"
},
"label-router-bw-outbound-1s": {
"description": "1s:",
"message": "1s:"
},
"label-router-net-tunnels-participating": {
"description": "Транзитные туннели:",
"message": "Транзитные туннели:"
},
"label-router-netdb-fastpeers": {
"description": "Быстрое пиво:",
"message": "Быстрое пиво:"
},
"label-router-netdb-highcapacitypeers": {
"description": "Высокая мощность Пьеса:",
"message": "Высокая мощность Пьеса:"
},
"label-router-netdb-isreseeding": {
"description": "Статус ресисел:",
"message": "Статус ресисел:"
},
"label-router-netdb-knownpeers": {
"description": "Известные пэры:",
"message": "Известные пэры:"
},
"label-router-peers": {
"description": "Пи",
"message": "Пи"
},
"label-router-status": {
"description": "Статус Маршрутизатора состояния:",
"message": "Статус Маршрутизатора состояния:"
},
"label-router-uptime": {
"description": "Маршрутизатор Uptime(Ms):",
"message": "Маршрутизатор Uptime(Ms):"
},
"label-router-version": {
"description": "Версия маршрутизатора:",
"message": "Версия маршрутизатора:"
},
"links": {
"description": "Расширение и I2P",
"message": "Расширение и I2P"
},
"linksExplain": {
"description": "Если вы хотите получить больше информации о I2P, вы можете посетить эти ссылки.",
"message": "Если вы хотите получить больше информации о I2P, вы можете посетить эти ссылки."
},
"mailPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Веб-почта"
},
"mailPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Web Mail (Private)"
},
"muwirePreface": {
"description": "Предисловие для заголовка браузера",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "MuWire (Private)"
},
"newsMessage": {
"description": "Сообщение",
"message": "Посетите I2P Blog to learn the latest about i2p."
},
"onboardingButtonFive": {
"description": "Совершенствование Опыт",
"message": "Совершенствование Опыт"
},
"onboardingButtonFour": {
"description": "Обмен файлами",
"message": "Обмен файлами"
},
"onboardingButtonOne": {
"description": "I2P Network Browsing and Non-I2P Network Browsing",
"message": "I2P Network Browsing and Non-I2P Network Browsing"
},
"onboardingButtonThree": {
"description": "Скрытая электронная почта",
"message": "Скрытая электронная почта"
},
"onboardingButtonTwo": {
"description": "Защита сетевых границ",
"message": "Защита сетевых границ"
},
"onboardingButtonZero": {
"description": "Защита вашей конфиденциальности",
"message": "Защита вашей конфиденциальности"
},
"onboardingContentFive": {
"description": "Это расширение может быть объединено с другими расширениями, которые иногда улучшают его функциональность. uBlock Origin, LocalCDN и jShelter полезны для ускорения загрузки страницы, блокировки рекламы и ограничения мощности Javascript. Для пользователей, которые хотят заблокировать все Javascript, рекомендуется NoScript.",
"message": "Это расширение может быть объединено с другими расширениями, которые иногда улучшают его функциональность. uBlock Origin, LocalCDN и jShelter полезны для ускорения загрузки страницы, блокировки рекламы и ограничения мощности Javascript. Для пользователей, которые хотят заблокировать все Javascript, рекомендуется NoScript."
},
"onboardingContentFour": {
"description": "I2P способен использовать одноранговые приложения, такие как BitTorrent, защищая вашу личность, когда вы делитесь файлами. Наш анонимный битторрент-клиент доступен в браузере.",
"message": "I2P способен использовать одноранговые приложения, такие как BitTorrent, защищая вашу личность, когда вы делитесь файлами. Наш анонимный битторрент-клиент доступен в браузере."
},
"onboardingContentOne": {
"description": "Это расширение работает автоматически при просмотре сайтов I2P. Если вы хотите использовать I2P в качестве прокси-сервера для не-I2P-сайтов, используйте кнопку I2P In Private Browsing в панели инструментов и нажмите на вкладку New I2P Browser для перехода на I2P Browsing в новой вкладке. Ваш опыт во время просмотра Интернета может быть немного другим. Вещи могут быть немного медленнее, и в зависимости от уровня безопасности некоторые элементы могут не работать или не загружаться. Вас также могут попросить доказать, что вы человек, а не робот.",
"message": "Это расширение работает автоматически при просмотре сайтов I2P. Если вы хотите использовать I2P в качестве прокси-сервера для не-I2P-сайтов, используйте кнопку I2P In Private Browsing в панели инструментов и нажмите на вкладку New I2P Browser для перехода на I2P Browsing в новой вкладке. Ваш опыт во время просмотра Интернета может быть немного другим. Вещи могут быть немного медленнее, и в зависимости от уровня безопасности некоторые элементы могут не работать или не загружаться. Вас также могут попросить доказать, что вы человек, а не робот."
},
"onboardingContentThree": {
"description": "Существует также анонимный сервис электронной почты, доступный внутри I2P, который доступен из нашего браузера через меню непосредственно справа.",
"message": "Существует также анонимный сервис электронной почты, доступный внутри I2P, который доступен из нашего браузера через меню непосредственно справа."
},
"onboardingContentTwo": {
"description": "I2P обычно вводится через веб-UI (The «Router Console»), который пользователь иногда рассматривает в том же браузере, который он использует для посещения удаленных сайтов. Важно не допустить, чтобы сайты могли получать доступ к информации из этого веб-UI и других местных сервисов. Сайты Clearnet остаются в контейнере Firefox-default, но как только контейнер Firefox-default запрашивает *.onion или *.i2p сайт, он будет мгновенно контейнеризирован. Инструменты управления идентификацией Tor Browser контролируют вкладки Clearnet, и они проксиируются с помощью плагина I2P outproxy или outproxy.",
"message": "I2P обычно вводится через веб-UI (The «Консоль маршрутизатора»), который пользователь иногда рассматривает в том же браузере, который он использует для посещения удаленных сайтов. Важно не допустить, чтобы сайты могли получать доступ к информации из этого веб-UI и других местных сервисов. Сайты Clearnet остаются в контейнере Firefox-default, но как только контейнер Firefox-default запрашивает *.onion или *.i2p сайт, он будет мгновенно контейнеризирован. Инструменты управления идентификацией Tor Browser контролируют вкладки Clearnet, и они проксиируются с помощью плагина I2P outproxy или outproxy."
},
"onboardingContentZero": {
"description": "При использовании I2P в режиме частного просмотра вы защищены от отслеживания и наблюдения. I2P Browser изолирует печенье и удаляет историю браузера после сеанса. Эти изменения гарантируют, что ваша конфиденциальность и безопасность защищены как ваш просмотр.",
"message": "При использовании I2P в режиме частного просмотра вы защищены от отслеживания и наблюдения. I2P Browser изолирует печенье и удаляет историю браузера после сеанса. Эти изменения гарантируют, что ваша конфиденциальность и безопасность защищены как ваш просмотр."
},
"onboardingFive": {
"description": "Опыт Советы",
"message": "Опыт Советы"
},
"onboardingFour": {
"description": "Просмотр Интернета",
"message": "Просмотр Интернета"
},
"onboardingOne": {
"description": "Настроить Опыт",
"message": "Настроить Опыт"
},
"onboardingThree": {
"description": "Скрытая электронная почта",
"message": "Скрытая электронная почта"
},
"onboardingTitle": {
"description": "О I2P в частном брови",
"message": "О I2P в частном брови"
},
"onboardingTwo": {
"description": "Общие файлы",
"message": "Общие файлы"
},
"onboardingZero": {
"description": "Защита вашей конфиденциальности",
"message": "Защита вашей конфиденциальности"
},
"portText": {
"description": "Порт для HTTP или SOCKS5 Proxy",
"message": "Порт:"
},
"protocolHandlerValue": {
"description": "Значение для обработчика протокола магнита",
"message": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s\u0026action=Add\u0026foo=Add+torrent"
},
"proxy-check": {
"description": "Прокси готов.",
"message": "Прокси готов."
},
"proxyFailedStatus": {
"description": "Прокси потерпел неудачу.",
"message": "Прокси не готов"
},
"proxyHelpText": {
"description": "Помощь в настройке опций для кнопки Reset Tunnel",
"message": "Настройте прокси I2P здесь."
},
"proxySuccessStatus": {
"description": "Прокси потерпел неудачу.",
"message": "Прокси готов"
},
"readyness": {
"description": "Прокси готов.",
"message": "Прокси готов."
},
"releases": {
"description": "Описание новой страницы",
"message": "Проверьте новые релизы здесь"
},
"resetMessage": {
"description": "Сообщение для кнопки \"Загрузить туннель\"",
"message": "Сброс тоннеля"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "Заменить на Router Bandwidth Outbound 15s",
"message": "Заменить на Router Bandwidth Outbound 15s"
},
"router-net-bw-inbound-1s": {
"description": "Заменить на Router Bandwidth Inbound 1s",
"message": "Заменить на Router Bandwidth Inbound 1s"
},
"router-net-bw-outbound-15s": {
"description": "Заменить на Router Bandwidth Outbound 15s",
"message": "Заменить на Router Bandwidth Outbound 15s"
},
"router-net-bw-outbound-1s": {
"description": "Заменить на Router Bandwidth Outbound 1s",
"message": "Заменить на Router Bandwidth Outbound 1s"
},
"router-net-tunnels-participating": {
"description": "Заменить \"маршрутизатор\"",
"message": "Заменить \"маршрутизатор\""
},
"router-netdb-activepeers": {
"description": "Заменить \"маршрутизатор\"",
"message": "Заменить \"маршрутизатор\""
},
"router-netdb-fastpeers": {
"description": "Заменить \"маршрутизатор\"",
"message": "Заменить \"маршрутизатор\""
},
"router-netdb-highcapacitypeers": {
"description": "Заменить на пьесы высокой емкости",
"message": "Заменить на пьесы высокой емкости"
},
"router-netdb-isreseeding": {
"description": "Заменить \"маршрутизатор\"",
"message": "Заменить \"маршрутизатор\""
},
"router-netdb-knownpeers": {
"description": "Заменить \"маршрутизатором\"",
"message": "Заменить \"маршрутизатором\""
},
"router-restart": {
"description": "Изящный перезапуск маршрутизатора",
"message": "Изящный перезапуск маршрутизатора"
},
"router-shutdown": {
"description": "Изящный роутер",
"message": "Изящный роутер"
},
"router-status": {
"description": "Заменить статус маршрутизатора",
"message": "Заменить статус маршрутизатора"
},
"router-uptime": {
"description": "Заменить на Маршрутизатор",
"message": "Заменить на Маршрутизатор"
},
"router-version": {
"description": "Заменить на Маршрутизатор",
"message": "Заменить на Маршрутизатор"
},
"routerConsole": {
"description": "Описание консоли маршрутизатора.",
"message": "Доступ к консоли маршрутизатора I2P и его полному спектру приложений и конфигураций."
},
"routerPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Консоль"
},
"routerPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Консоль маршрутизатора (Private)"
},
"rpcHelpText": {
"description": "Настройте параметры I2PControl здесь. Настройте параметры Bittorrent здесь.",
"message": "Настройте параметры I2PControl здесь. Настройте параметры Bittorrent здесь."
},
"rpcHostText": {
"description": "Порт управления:",
"message": "Порт управления:"
},
"rpcPassText": {
"description": "Control Password: Torrent RPC Пароль:",
"message": "Control Password: Torrent RPC Пароль:"
},
"rpcPathText": {
"description": "Путь управления:",
"message": "Путь управления:"
},
"rpcPortText": {
"description": "Управляющий хост:",
"message": "Управляющий хост:"
},
"rtcDesc": {
"description": "Описание действия WebRTC",
"message": "WebRTC отключен по умолчанию, но вы можете включить его обратно и заставить его почтить прокси. Если вы являетесь пользователем расширения браузера Snowflake, эта опция отключена, и WebRTC включен по умолчанию."
},
"signingcert": {
"description": "Подписано:",
"message": "Подписано:"
},
"siteLabel": {
"description": "Маркировка на сайте i2p",
"message": "Адрес / Сайт Информация:"
},
"sitecert": {
"description": "Информация о сертификатах:",
"message": "Информация о сертификатах:"
},
"snark": {
"description": "Описание Bittorrent",
"message": "Quick access to Snark, the Peer-to-peer I2P network specific file sharing application."
},
"sourcehead": {
"description": "Получить исходный код:",
"message": "Получить исходный код:"
},
"sources": {
"description": "Описание ссылки Исходного кода",
"message": "Просмотр исходного кода здесь"
},
"susimail": {
"description": "Описание электронной почты",
"message": "Быстрый доступ к сетевому почтовому клиенту SusiMail I2P."
},
"text-section-header": {
"description": "Невидимый интернет-браузер",
"message": "Невидимый интернет-браузер"
},
"text-section-proxyerr-header": {
"description": "Ошибка прокси",
"message": "Ошибка прокси"
},
"text-section-torrents-header": {
"description": "Скачать Torrent",
"message": "Скачать Torrent"
},
"titlePreface": {
"description": "Предисловие для заголовка браузера",
"message": "I2P браузер"
},
"titlePrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "I2P Browser (Private)"
},
"toopie": {
"description": "Для информации о вашем статусе маршрутизатора I2P, идите сюда:",
"message": "Для информации о вашем статусе маршрутизатора I2P, идите сюда:"
},
"toopieHtmlHeadline": {
"description": "Информация о маршруте I2P",
"message": "Информация о маршруте I2P"
},
"toopieName": {
"description": "Имя боковой панели.",
"message": "тоже. html"
},
"toopieTLS": {
"description": "Название группы безопасности.",
"message": "Свойства сайта"
},
"topbar": {
"description": "Скачать",
"message": "Скачать"
},
"torPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Tor Manager"
},
"torPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Tor Manager (Private)"
},
"torrent-action": {
"description": "Скачать",
"message": "Скачать"
},
"torrentControls": {
"description": "Торрент-контроль",
"message": "Торрент-контроль"
},
"torrentDownloads": {
"description": "Скачать Torrent",
"message": "Скачать Torrent"
},
"torrentPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Bittorrent (Private)"
},
"torrentui-opener": {
"description": "Open WebUI",
"message": "Open WebUI"
},
"visit-irc": {
"description": "Посетите IRC",
"message": "Посетите IRC"
},
"webPreface": {
"description": "Предисловие для заголовка браузера",
"message": "Веб-браузер"
},
"webPrefacePrivate": {
"description": "Предисловие для заголовка браузера",
"message": "Web Browser (Private)"
},
"webpage": {
"description": "Больше информации доступно здесь.",
"message": "Больше информации доступно здесь."
},
"window-visit-console": {
"description": "Консоль маршрутизатора I2P",
"message": "Консоль маршрутизатора I2P"
},
"window-visit-help": {
"description": "Страница справки",
"message": "Страница справки"
},
"window-visit-homepage": {
"description": "Невидимый интернет-браузер",
"message": "Невидимый интернет-браузер"
},
"window-visit-i2p": {
"description": "I2P Главная страница проекта:",
"message": "I2P Главная страница проекта:"
},
"window-visit-i2ptunnel": {
"description": "Hidden Services Manager",
"message": "Hidden Services Manager"
},
"window-visit-index": {
"description": "Веб-сайт:",
"message": "Веб-сайт:"
},
"window-visit-releases": {
"description": "Выпущено:",
"message": "Выпущено:"
},
"window-visit-router": {
"description": "Консоль",
"message": "Консоль"
},
"window-visit-settings": {
"description": "Откройте настройки",
"message": "Откройте настройки"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "Код источника:",
"message": "Код источника:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "Toopie",
"message": "Toopie"
},
"window-visit-torrent": {
"description": "Для помощи посетите страницу помощи торренту",
"message": "Для помощи посетите страницу помощи торренту"
},
"windowVisitConsole": {
"description": "Маркировка Router Console.",
"message": "Консоль маршрутизатора:"
},
"windowVisitHelppage": {
"description": "Страница справки для ярлыка расширения.",
"message": "Информация о расширении сети:"
},
"windowVisitHomepage": {
"description": "Главная страница для ярлыка расширения.",
"message": "Главная страница:"
},
"windowVisitI2ptunnel": {
"description": "Название i2ptunnel",
"message": "Hidden Services Manager:"
},
"windowVisitReleases": {
"description": "Посетите страницу релиза",
"message": "Расширение:"
},
"windowVisitSnark": {
"description": "Название для Bittorrent",
"message": "Bittorrent:"
},
"windowVisitSources": {
"description": "Название для ссылки исходного кода",
"message": "Код источника распространения:"
},
"windowVisitSusimail": {
"description": "Название для электронной почты",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "Продление посещения на сайте Github",
"message": "Главная страница:"
}
}

738
_locales/zh/messages.json Normal file
View File

@@ -0,0 +1,738 @@
{
"CertLabel": {
"description": "证明信息:",
"message": "证明信息:"
},
"SignedLabel": {
"description": "常驻代表",
"message": "常驻代表"
},
"TorrentTypeLabel": {
"description": "引证联系:",
"message": "引证联系:"
},
"TypeLabel": {
"description": "引证联系:",
"message": "引证联系:"
},
"aboutconsole": {
"description": "进入路线者的主页。",
"message": "进入路线者的主页。"
},
"abouthome": {
"description": "展期页。.",
"message": "关于这一扩展的更多信息,本页访问。."
},
"addresstype": {
"description": "处理类型:",
"message": "处理类型:"
},
"applicationExplain": {
"description": "申请款的说明。.",
"message": "I2P路线r console and application in their自己的tab,为他们提供与延长这一期限相同的安全利益。 这增加了保护力度,将每项申请分开,并防止其他表格(社会媒体等)不指纹或文字。 所有表格都用来确定颜色,以跟踪你的I2P工作流。."
},
"applicationHeader": {
"description": "申请科长。.",
"message": "申请"
},
"beta": {
"description": "这是试验产品。.",
"message": "这是试验产品。."
},
"blogPreface": {
"description": "代页标题的序言",
"message": "评 注"
},
"blogPrefacePrivate": {
"description": "代页标题的序言",
"message": "Blog (Private)"
},
"bookmarksButton": {
"description": "Re-Create Books",
"message": "Re-Create Books"
},
"botePreface": {
"description": "代页标题的序言",
"message": "I2P-Bote Mail"
},
"botePrefacePrivate": {
"description": "代页标题的序言",
"message": "I2P-Bote Mail(Private)"
},
"browser-action": {
"description": "Browse",
"message": "Browse"
},
"btRpcHostText": {
"description": "D. 捕获方案 东道国:",
"message": "D. 捕获方案 东道国:"
},
"btRpcPathText": {
"description": "D. 捕获方案 Path:",
"message": "D. 捕获方案 Path:"
},
"btRpcPortText": {
"description": "D. 捕获方案 港口:",
"message": "D. 捕获方案 港口:"
},
"certAbsent": {
"description": "无证件的处理",
"message": "该网站没有使用HTTPS。 仍然由I2P核实。."
},
"certPresent": {
"description": "证明的内容",
"message": "该网站使用HTTPS。 在I2P的技转设备是试验性的,需要自发证书或副根基。."
},
"clearData": {
"description": "清点数据男性u项目。.",
"message": "数据交换:"
},
"clearDesc": {
"description": "数据行动说明。.",
"message": "利用这一手段使你的I2Prows数据消失。."
},
"controlExplain": {
"description": "介绍控制小组。.",
"message": "这些管制用来适应你的I2Prows的经历"
},
"controlHeader": {
"description": "控制小组负责人。.",
"message": "控制"
},
"controlHelpText": {
"description": "B. 帮助精简重新启动的Tunnel但顿办法",
"message": "调整你的路线。."
},
"controlHostText": {
"description": "B. 勒索的旅舍",
"message": "控制旅舍:"
},
"controlHostValue": {
"description": "B. 勒索的旅舍",
"message": "1270.0.1"
},
"controlPortText": {
"description": "Router Console港",
"message": "管制港:"
},
"controlPortValue": {
"description": "Router Console港",
"message": "7657"
},
"description": {
"description": "你现在能够在本代行使用I2P。.",
"message": "你现在能够在本代行使用I2P。."
},
"description2": {
"description": "如果你看到这一页,就是因为出现了一种错误。 已经提供了一些资料,以帮助你查明该问题。.",
"message": "如果你看到这一页,就是因为出现了一种错误。 已经提供了一些资料,以帮助你查明该问题。."
},
"disableHistory": {
"description": "历史检查箱标签。.",
"message": "I2P Tabs可观的历史?"
},
"enableWebRTC": {
"description": "RTC检查箱标签。.",
"message": "传真:?"
},
"extensionDescription": {
"description": "说明延期。.",
"message": "I2P网络的增速。."
},
"extensionName": {
"description": "延期名称。.",
"message": "I2P 私人成长"
},
"extensionNameVariant": {
"description": "延期名称。.",
"message": "I2P in Private Brows - Rhizome Variant"
},
"extensionPreface": {
"description": "代页标题的序言",
"message": "I2 管理"
},
"extensionVersion": {
"description": "延长。.",
"message": "1.28"
},
"fliplinks": {
"description": "A. 推广和增加资源",
"message": "A. 推广和增加资源"
},
"forumMessage": {
"description": "求助者",
"message": "访问伊加特论坛学习更多或要求援助"
},
"headline": {
"description": "易读的因特网Browser",
"message": "易读的因特网Browser"
},
"help": {
"description": "展期页。.",
"message": "关于这一扩展的更多信息,本页访问。."
},
"helpMessage": {
"description": "求助者",
"message": "增加帮助"
},
"histDesc": {
"description": "历史行动说明",
"message": "当你的I2Ptab被关闭时,历史就自动明确。 如果你想像你那样明确历史,检查这个箱。."
},
"homepage": {
"description": "更多信息",
"message": "这方面的更多资料"
},
"hostText": {
"description": "HTTP或SOCKS5 Proxy",
"message": "东道国:"
},
"i2ppage": {
"description": "这里有更多资料。.",
"message": "这里有更多资料。."
},
"i2ptunnel": {
"description": "说明",
"message": "很少有电报和配置服务及隧道。."
},
"i2ptunnelPreface": {
"description": "代页标题的序言",
"message": "Hidden服务主管"
},
"i2ptunnelPrefacePrivate": {
"description": "代页标题的序言",
"message": "Hidden Services经理(Private)"
},
"infoMessage": {
"description": "求助者",
"message": "你们现在可以自由地打下“我们”! 你的代行现在被安排在I2P网络上匿名。 正如你所想象的那样,你的交通将通过其他网络连接起来,使他们的起源,无论是从服务器还是从自己出发。."
},
"infoTitle": {
"description": "帮助男性的标题",
"message": "I2P 帮助"
},
"ircPreface": {
"description": "代页标题的序言",
"message": "副渔民协会"
},
"ircPrefacePrivate": {
"description": "代页标题的序言",
"message": "IRC(Private)"
},
"isBase32": {
"description": "F. 集群小组基地网站的邮件32",
"message": "I2P基地32-Format地址"
},
"isHostName": {
"description": "集群小组所在地的传单",
"message": "I2P Jump人质"
},
"label-router-activepeers": {
"description": "精算师:",
"message": "精算师:"
},
"label-router-bandwidth": {
"description": "Bandwith",
"message": "Bandwith"
},
"label-router-bw-inbound-15s": {
"description": "有15人:",
"message": "有15人:"
},
"label-router-bw-inbound-1s": {
"description": "有1人:",
"message": "有1人:"
},
"label-router-bw-outbound-15s": {
"description": "第15条:",
"message": "第15条:"
},
"label-router-bw-outbound-1s": {
"description": "无限的桶1:",
"message": "无限的桶1:"
},
"label-router-net-tunnels-participating": {
"description": "过境渠道:",
"message": "过境渠道:"
},
"label-router-netdb-fastpeers": {
"description": "Fast Peers:",
"message": "Fast Peers:"
},
"label-router-netdb-highcapacitypeers": {
"description": "高能力 作者:",
"message": "高能力 作者:"
},
"label-router-netdb-isreseeding": {
"description": "重新定性:",
"message": "重新定性:"
},
"label-router-netdb-knownpeers": {
"description": "Known Peers:",
"message": "Known Peers:"
},
"label-router-peers": {
"description": "导 言",
"message": "导 言"
},
"label-router-status": {
"description": "现状:",
"message": "现状:"
},
"label-router-uptime": {
"description": "时间:",
"message": "时间:"
},
"label-router-version": {
"description": "Router Version:",
"message": "Router Version:"
},
"links": {
"description": "A. 推广和增加资源",
"message": "A. 推广和增加资源"
},
"linksExplain": {
"description": "如果你想获得更多关于I2P的资料,你可以访问这些联系。.",
"message": "如果你想获得更多关于I2P的资料,你可以访问这些联系。."
},
"mailPreface": {
"description": "代页标题的序言",
"message": "网站"
},
"mailPrefacePrivate": {
"description": "代页标题的序言",
"message": "网址:Mail(Private)"
},
"muwirePreface": {
"description": "代页标题的序言",
"message": "MuWire"
},
"muwirePrefacePrivate": {
"description": "代页标题的序言",
"message": "MuWire(Private)"
},
"newsMessage": {
"description": "求助者",
"message": "访问I2P 学习最新一倍。."
},
"onboardingButtonFive": {
"description": "改进 经验",
"message": "改进 经验"
},
"onboardingButtonFour": {
"description": "分享电影",
"message": "分享档案"
},
"onboardingButtonOne": {
"description": "I2P网络",
"message": "I2P网络"
},
"onboardingButtonThree": {
"description": "Hidden email",
"message": "Hidden email"
},
"onboardingButtonTwo": {
"description": "B. 保护网络 Bounds",
"message": "B. 保护网络 Bounds"
},
"onboardingButtonZero": {
"description": "保护你的隐私",
"message": "保护你的隐私"
},
"onboardingContentFive": {
"description": "这种扩展可以与其他延期结合起来,有时会改善其功能。 地方非传染性疾病和珠宝是加速装页、堵塞器和限制瓦斯文字的权力的有用。 对于想要阻止所有贾瓦文的用户,建议不附加说明。.",
"message": "这种扩展可以与其他延期结合起来,有时会改善其功能。 地方非传染性疾病和珠宝是加速装页、堵塞器和限制瓦斯文字的权力的有用。 对于想要阻止所有贾瓦文的用户,建议不附加说明。."
},
"onboardingContentFour": {
"description": "I2P在你分享档案时能够使用像BitTorrent这样的同侪对用户的应用,保护你的身份。 我们一个匿名的客户可在代管处获得。.",
"message": "I2P在你分享档案时能够使用像BitTorrent这样的同侪对用户的应用,保护你的身份。 我们一个匿名的客户可在代管处获得。."
},
"onboardingContentOne": {
"description": "这一扩展工作自然,因为你正在掠夺I2P地点。 如果你想把I2P用作非I2P地点的辅助性,则使用I2P的私人Browsing button在工具bar和点击新I2PBrowser Tab转向新的表格。 你在浏览互联网方面的经验可能很小。 口号可能是缓慢的,取决于你的安全水平,有些要素可能不会工作或装载。 也请你证明你是人类,而不是一种抢劫。.",
"message": "这一扩展工作自然,因为你正在掠夺I2P地点。 如果你想把I2P用作非I2P地点的辅助性,则使用I2P的私人Browsing button在工具bar和点击新I2PBrowser Tab转向新的表格。 你在浏览互联网方面的经验可能很小。 口号可能是缓慢的,取决于你的安全水平,有些要素可能不会工作或装载。 也请你证明你是人类,而不是一种抢劫。."
},
"onboardingContentThree": {
"description": "在I2P内也可提供匿名电子邮件服务,这直接通过男性获得。.",
"message": "在I2P内也可提供匿名电子邮件服务,这直接通过男性获得。."
},
"onboardingContentTwo": {
"description": "I2P通常通过UI(“Router Console”(“Router Console”)进行管理,用户有时在使用同一浏览地点访问边远地点时会发表意见。 必须防止网站能够从这个万维网和其他当地经营服务获得信息。 直截网地点仍然在消防器上,但一旦防火药集装箱请求 *.onion或*.i2p地点,便将安装集装箱。 Tor Browser的身份证管理工具控制了明确的网上表格,并且使用了“I2P”号信,或“Inprio plugin”。.",
"message": "I2P通常通过UI(“Router Console”(“Router Console”)进行管理,用户有时在使用同一浏览地点访问边远地点时会发表意见。 必须防止网站能够从这个万维网和其他当地经营服务获得信息。 直截网地点仍然在消防器上,但一旦防火药集装箱请求 *.onion或*.i2p地点,便将安装集装箱。 Tor Browser的身份证管理工具控制了明确的网上表格,并且使用了“I2P”号信,或“Inprio plugin”。."
},
"onboardingContentZero": {
"description": "在使用I2P的私人Browsing Mode时,你受到保护,不受跟踪和监测。 I2PBrowser是厨房,在你届会之后删除了你的代行历史。 这些修改确保你的隐私权和安全受到保护,因为你的代言。.",
"message": "在使用I2P的私人Browsing Mode时,你受到保护,不受跟踪和监测。 I2PBrowser是厨房,在你届会之后删除了你的代行历史。 这些修改确保你的隐私权和安全受到保护,因为你的代言。."
},
"onboardingFive": {
"description": "经验",
"message": "经验"
},
"onboardingFour": {
"description": "B. 网站的浏览",
"message": "B. 网站的浏览"
},
"onboardingOne": {
"description": "你们 经验",
"message": "你们 经验"
},
"onboardingThree": {
"description": "Hidden email",
"message": "Hidden email"
},
"onboardingTitle": {
"description": "约I2P 私人旅舍",
"message": "约I2P 私人旅舍"
},
"onboardingTwo": {
"description": "Share Files",
"message": "Share Files"
},
"onboardingZero": {
"description": "保护你的隐私",
"message": "保护你的隐私"
},
"portText": {
"description": "HTTP或SOCKS5 Proxy港",
"message": "港口:"
},
"protocolHandlerValue": {
"description": "对磁带议定书手的价值",
"message": "http://127.0.0.1:7657/i2psnark/吗?nofilter_newURL=%s\u0026action=Add\u0026foo=Add+torrentrenttorrent"
},
"proxy-check": {
"description": "准备好。.",
"message": "准备好。."
},
"proxyFailedStatus": {
"description": "失败状况。.",
"message": "没有准备好的。"
},
"proxyHelpText": {
"description": "B. 帮助精简重新启动的Tunnel但顿办法",
"message": "调整你的I2P proxy。."
},
"proxySuccessStatus": {
"description": "失败状况。.",
"message": "准备好"
},
"readyness": {
"description": "准备好。.",
"message": "准备好。."
},
"releases": {
"description": "新发行页的说明",
"message": "这里新排放的检查"
},
"resetMessage": {
"description": "Reset Tunnel但顿先生",
"message": "B. 重新定位"
},
"returnhome": {
"description": "/",
"message": "/"
},
"router-net-bw-inbound-15s": {
"description": "将Router Bandwidth外语改为15",
"message": "将Router Bandwidth外语改为15"
},
"router-net-bw-inbound-1s": {
"description": "第1条",
"message": "第1条"
},
"router-net-bw-outbound-15s": {
"description": "将Router Bandwidth外语改为15",
"message": "将Router Bandwidth外语改为15"
},
"router-net-bw-outbound-1s": {
"description": "改为Router Bandwidth外1",
"message": "改为Router Bandwidth外1"
},
"router-net-tunnels-participating": {
"description": "改为:",
"message": "改为:"
},
"router-netdb-activepeers": {
"description": "改为:",
"message": "改为:"
},
"router-netdb-fastpeers": {
"description": "将Router Fast Peers改为",
"message": "将Router Fast Peers改为"
},
"router-netdb-highcapacitypeers": {
"description": "高容量器的更换",
"message": "高容量器的更换"
},
"router-netdb-isreseeding": {
"description": "改为:",
"message": "改为:"
},
"router-netdb-knownpeers": {
"description": "将Router Known Peers改为",
"message": "将Router Known Peers改为"
},
"router-restart": {
"description": "宽恕",
"message": "宽恕"
},
"router-shutdown": {
"description": "穿梭关闭路线",
"message": "穿梭关闭路线"
},
"router-status": {
"description": "改为:",
"message": "改为:"
},
"router-uptime": {
"description": "改为:",
"message": "改为:"
},
"router-version": {
"description": "将Router Version改为",
"message": "将Router Version改为"
},
"routerConsole": {
"description": "标示路线。.",
"message": "你的I2P路线r console及其各种应用和配置。."
},
"routerPreface": {
"description": "代页标题的序言",
"message": "Router Console"
},
"routerPrefacePrivate": {
"description": "代页标题的序言",
"message": "Router Console(Private)"
},
"rpcHelpText": {
"description": "调整你的I2PControl备选办法。 调整你在这方面的可支配性选择。.",
"message": "调整你的I2PControl备选办法。 调整你在这方面的可支配性选择。."
},
"rpcHostText": {
"description": "管制港:",
"message": "管制港:"
},
"rpcPassText": {
"description": "管制护照前言:逮捕证 护照:",
"message": "管制护照前言:逮捕证 护照:"
},
"rpcPathText": {
"description": "控制包:",
"message": "控制包:"
},
"rpcPortText": {
"description": "控制旅舍:",
"message": "控制旅舍:"
},
"rtcDesc": {
"description": "海报业务说明",
"message": "RTC网站因违约而残疾,但你可以回到它身上并迫使它名誉。 如果你是Snowflake browser展的用户,这一选择是残疾的,而网络检查中心则以违约方式提出。."
},
"signingcert": {
"description": "常驻代表",
"message": "常驻代表"
},
"siteLabel": {
"description": "Label for i2psite info",
"message": "地址/新闻:"
},
"sitecert": {
"description": "证明信息:",
"message": "证明信息:"
},
"snark": {
"description": "对Bittor的通知",
"message": "快速进入Snark, Peer-to-peer I2P网络的具体档案分享申请。."
},
"sourcehead": {
"description": "来源守则:",
"message": "来源守则:"
},
"sources": {
"description": "源代码联系的说明",
"message": "加入本源代码"
},
"susimail": {
"description": "电子邮件说明",
"message": "快速进入苏西马·伊2P网络电子邮件用户。."
},
"text-section-header": {
"description": "易读的因特网Browser",
"message": "易读的因特网Browser"
},
"text-section-proxyerr-header": {
"description": "A Proxy Error公司",
"message": "A Proxy Error公司"
},
"text-section-torrents-header": {
"description": "卸货",
"message": "卸货"
},
"titlePreface": {
"description": "代页标题的序言",
"message": "I2PBrowser"
},
"titlePrefacePrivate": {
"description": "代页标题的序言",
"message": "I2P Browser(Private)"
},
"toopie": {
"description": "关于你的I2P路线地位的资料,见下文:",
"message": "关于你的I2P路线地位的资料,见下文:"
},
"toopieHtmlHeadline": {
"description": "I2P Router Information",
"message": "I2P Router Information"
},
"toopieName": {
"description": "一方的名字。.",
"message": "也是这样。 评 注"
},
"toopieTLS": {
"description": "安全小组名称。.",
"message": "特 费"
},
"topbar": {
"description": "Browse Down",
"message": "Browse Down"
},
"torPreface": {
"description": "代页标题的序言",
"message": "管理人员"
},
"torPrefacePrivate": {
"description": "代页标题的序言",
"message": "导 言"
},
"torrent-action": {
"description": "D. 所有权",
"message": "D. 所有权"
},
"torrentControls": {
"description": "前体管制",
"message": "前体管制"
},
"torrentDownloads": {
"description": "卸货",
"message": "卸货"
},
"torrentPreface": {
"description": "代页标题的序言",
"message": "Bittorrent"
},
"torrentPrefacePrivate": {
"description": "代页标题的序言",
"message": "Bittorrent (Private)"
},
"torrentui-opener": {
"description": "开放网站",
"message": "开放网站"
},
"visit-irc": {
"description": "B. 访问索马里",
"message": "B. 访问索马里"
},
"webPreface": {
"description": "代页标题的序言",
"message": "Browser"
},
"webPrefacePrivate": {
"description": "代页标题的序言",
"message": "网站Browser(Private)"
},
"webpage": {
"description": "这里有更多资料。.",
"message": "这里有更多资料。."
},
"window-visit-console": {
"description": "I2P Router Console",
"message": "I2P Router Console"
},
"window-visit-help": {
"description": "推广助产",
"message": "推广助产"
},
"window-visit-homepage": {
"description": "易读的因特网Browser",
"message": "易读的因特网Browser"
},
"window-visit-i2p": {
"description": "I2P 项目家页:",
"message": "I2P 项目家页:"
},
"window-visit-i2ptunnel": {
"description": "Hidden服务主管",
"message": "Hidden服务主管"
},
"window-visit-index": {
"description": "网页:",
"message": "网页:"
},
"window-visit-releases": {
"description": "产出:",
"message": "产出:"
},
"window-visit-router": {
"description": "Router Console",
"message": "Router Console"
},
"window-visit-settings": {
"description": "开放环境",
"message": "开放环境"
},
"window-visit-snark": {
"description": "BitTorrent",
"message": "BitTorrent"
},
"window-visit-sources": {
"description": "资料来源法典:",
"message": "资料来源法典:"
},
"window-visit-susimail": {
"description": "E-Mail",
"message": "E-Mail"
},
"window-visit-toopie": {
"description": "通 力",
"message": "通 力"
},
"window-visit-torrent": {
"description": "关于援助,访问亲临帮助页",
"message": "关于援助,访问亲临帮助页"
},
"windowVisitConsole": {
"description": "Router Console标签。.",
"message": "Router Console:"
},
"windowVisitHelppage": {
"description": "推广标签的助页。.",
"message": "网址:"
},
"windowVisitHomepage": {
"description": "推广标签的主页。.",
"message": "家庭页:"
},
"windowVisitI2ptunnel": {
"description": "标题一二",
"message": "Hidden服务经理:"
},
"windowVisitReleases": {
"description": "访问释放页",
"message": "推广:"
},
"windowVisitSnark": {
"description": "Bittorrent勋爵",
"message": "Bitt:"
},
"windowVisitSources": {
"description": "源码联系的标题",
"message": "推广源法典:"
},
"windowVisitSusimail": {
"description": "电子邮件的标题",
"message": "E-Mail:"
},
"windowVisitWebPage": {
"description": "B. 访问吉隆布的主页",
"message": "推广家庭页:"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 309 KiB

View File

@@ -1,275 +1,172 @@
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');
/* eslint-disable no-continue */
/* eslint-disable no-await-in-loop */
/* eslint-disable max-len */
/* eslint-disable no-ternary */
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");
var blogpref = chrome.i18n.getMessage("blogPreface");
var blogprefpriv = chrome.i18n.getMessage("blogPrefacePrivate");
var torpref = chrome.i18n.getMessage("torPreface");
var torprefpriv = chrome.i18n.getMessage("torPrefacePrivate");
function onError(err) {
console.log('(background)', err);
console.log("(background)", err);
}
function onContextGotLog(contexts) {
if (contexts != null) {
function logContexts(contexts) {
if (contexts) {
console.log(contexts);
}
}
function onContextsGot(contexts) {
var ids = [];
for (let context of contexts) {
console.log(`Name : ${context.name}`);
ids.push(context.name);
}
console.log('Checking new contexts');
if (ids.indexOf(titlepref) == -1) {
browser.contextualIdentities
.create({
name: titlepref,
color: 'orange',
icon: 'fingerprint',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(webpref) == -1) {
browser.contextualIdentities
.create({
name: webpref,
color: 'red',
icon: 'circle',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(routerpref) == -1) {
browser.contextualIdentities
.create({
name: routerpref,
color: 'blue',
icon: 'briefcase',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(tunnelpref) == -1) {
browser.contextualIdentities
.create({
name: tunnelpref,
color: 'green',
icon: 'tree',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(mailpref) == -1) {
browser.contextualIdentities
.create({
name: mailpref,
color: 'yellow',
icon: 'briefcase',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(torrentpref) == -1) {
browser.contextualIdentities
.create({
name: torrentpref,
color: 'purple',
icon: 'chill',
})
.then(onCreated, onNotCreated);
}
if (ids.indexOf(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);
}
const prefList = [
{ name: titlepref, color: "orange", icon: "fingerprint" },
{ name: blogpref, color: "pink", icon: "pet" },
{ name: webpref, color: "red", icon: "circle" },
{ name: routerpref, color: "blue", icon: "briefcase" },
{ name: tunnelpref, color: "green", icon: "tree" },
{ name: mailpref, color: "yellow", icon: "briefcase" },
{ name: torrentpref, color: "purple", icon: "chill" },
{ name: ircpref, color: "red", icon: "vacation" },
{ name: torpref, color: "purple", icon: "circle" },
{ name: muwirepref, color: "turquoise", icon: "gift" },
{ name: botepref, color: "blue", icon: "fence" },
];
const ids = contexts.map((context) => context.name);
console.log("Checking new contexts");
prefList.forEach((pref) => {
if (ids.indexOf(pref.name) === -1) {
browser.contextualIdentities.create(pref).then(onCreated, onNotCreated);
}
});
}
browser.windows.onCreated.addListener(onContextsGot);
// every time a window opens, call onContextsGot
browser.tabs.onCreated.addListener(onContextsGot);
function onContextsError() {
console.log('Error finding contextual identities, is the API enabled?');
console.log("Error finding contextual identities, is the API enabled?");
}
function onCreated(context) {
console.log(' ID:', context.cookieStoreId, 'created.');
console.log(" ID:", context.cookieStoreId, "created.");
}
function onNotCreated(context) {
console.log('ID:', context.cookieStoreId, 'not created.');
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') {
if (got.os != "android") {
browser.windows.onCreated.addListener(themeWindow);
browser.windows.onFocusChanged.addListener(themeWindow);
browser.windows.onRemoved.addListener(themeWindow);
browser.tabs.onUpdated.addListener(themeWindowByTab);
browser.tabs.onActivated.addListener(themeWindowByTab);
browser.tabs.onUpdated.addListener(themeWindow);
browser.tabs.onActivated.addListener(themeWindow);
}
});
function themeWindowByTab(tabId) {
function tabWindow(tab) {
var gettingPlatformInfo = browser.runtime.getPlatformInfo();
gettingPlatformInfo.then((got) => {
if (got.os == 'android') {
let getwindow = browser.tabs.get(tab.tabId);
getwindow.then(themeWindow);
} else {
let getwindow = browser.windows.get(tab.windowId);
getwindow.then(themeWindow);
}
});
}
if (typeof tabId === 'number') {
let tab = browser.tabs.get(tabId);
tab.then(tabWindow);
} else {
tabWindow(tabId);
}
}
function isEmpty(obj) {
if (obj === undefined || obj === null) {
return true;
}
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
return false;
}
}
return true;
}
function themeWindow(window) {
// Check if the window is in private browsing
function onThemeError() {
console.log('theme color set error');
}
function dynamicTheme() {
if (window.incognito) {
browser.theme.update(window.id, {
colors: {
frame: '#4456B7',
toolbar: '#4456B7',
},
});
} else {
browser.theme.update(window.id, {
colors: {
frame: '#4456B7',
toolbar: '#4456B7',
},
});
console.log("(theme)Active in I2P App window");
let ctheme = browser.theme.getCurrent();
ctheme.then(setDynamicTheme);
function setDynamicTheme(oldtheme) {
if (window.incognito) {
browser.theme.update(window.id, dtheme);
} else {
browser.theme.update(window.id, dtheme);
}
}
}
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',
},
});
console.log("(theme)Active in I2P window");
let ctheme = browser.theme.getCurrent();
ctheme.then(setBrowserTheme);
function setBrowserTheme(oldtheme) {
btheme.images = oldtheme.images;
if (window.incognito) {
browser.theme.update(window.id, btheme);
} else {
browser.theme.update(window.id, btheme);
}
}
}
function logTabs(tabInfo) {
for (const tab of tabInfo) {
console.debug("(theme) logging tab", tab);
}
function onContextGotTheme(context) {
console.debug("(theme) deciding theme for context", context);
if (context.name == titlepref) {
browserTheme();
if (tabInfo[0].url.startsWith('https://')) {
browser.pageAction.setPopup({
tabId: tabInfo[0].id,
popup: 'security.html',
});
//console.log("(background) tabinfo", tabInfo[0].id)
browser.pageAction.show(tabInfo[0].id);
} else {
//browser.pageAction.hide(tabInfo[0].id);
}
browser.pageAction.show(tabInfo[0].id);
} else if (context.name == routerpref) {
console.log('Active in Router Console window');
console.log("(theme) Active in Router Console window");
dynamicTheme();
} else if (context.name == tunnelpref) {
console.log('Active in Hidden Services Manager window');
console.log("(theme) Active in Hidden Services Manager window");
dynamicTheme();
} else if (context.name == mailpref) {
console.log('Active in Web Mail window');
console.log("(theme) Active in Web Mail window");
dynamicTheme();
} else if (context.name == torrentpref) {
console.log('Active in Bittorrent window');
console.log("(theme) Active in Bittorrent window");
dynamicTheme();
} else if (context.name == botepref) {
console.log('Active in Bote window');
console.log("(theme) Active in Bote window");
dynamicTheme();
} else if (context.name == ircpref) {
console.log('Active in IRC window');
console.log("(theme) Active in IRC window");
dynamicTheme();
} else if (context.name == torpref) {
console.log("(theme) Active in Tor Manager window");
dynamicTheme();
} else if (context.name == blogpref) {
console.log("(theme) (theme) Active in Blog window");
dynamicTheme();
} else if (context.name == muwirepref) {
console.log('Active in MuWire window');
console.log("(theme) Active in MuWire window");
dynamicTheme();
} else {
console.log("(theme) Not active in I2P Window");
unsetTheme();
}
}
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, onThemeError);
} else {
console.log('Not active in I2P window');
function unSetTheme(them) {
console.log('unsetting theme', them);
if (Object.keys(them).length > 0) {
browser.theme.update(window.id, them.originalTheme);
} else {
browser.theme.update(window.id, { colors: null });
}
}
browser.storage.local.get('originalTheme').then(unSetTheme, onError);
console.log("(theme) default context identified");
unsetTheme();
}
}
@@ -280,206 +177,302 @@ function themeWindow(window) {
querying.then(logTabs, onThemeError);
}
function setTitle(window) {
function queryTitle(window) {
// Check if the window is in private browsing
function onContextError() {
console.log('Context Error');
console.log("(theme) Error finding context");
}
function setTitle(title, privtitle) {
if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: privtitle + ': ',
});
} else {
browser.windows.update(window.id, {
titlePreface: title + ': ',
});
}
function setTitle(title, privTitle) {
const titlePreface = window.incognito ? privTitle : title;
browser.windows.update(window.id, { titlePreface });
}
function onContextGotTitle(context) {
const titleMap = {
titlepref: "Active in I2P window",
muwirepref: "Active in MuWire window",
routerpref: "Active in Router Console window",
botepref: "Active in Bote window",
tunnelpref: "Active in Hidden Services Manager window",
mailpref: "Active in I2P Web Mail window",
blogpref: "Active in I2P Blog window",
torrentpref: "Active in I2P Torrent window",
ircpref: "Active in IRC window",
torpref: "Active in Tor Manager window",
};
const { name } = context;
console.log(titleMap[name]);
setTitle(name, `${name}priv`);
}
function logTabs(tabInfo) {
function onContextGotTitle(context) {
if (context.name == titlepref) {
console.log('Active in I2P window');
setTitle(titlepref, titleprefpriv);
} else if (context.name == muwirepref) {
console.log('Active in MuWire window');
setTitle(muwirepref, muwireprefpriv);
} else if (context.name == routerpref) {
console.log('Active in Router Console window');
setTitle(routerpref, routerprefpriv);
} else if (context.name == botepref) {
console.log('Active in Bote window');
setTitle(botepref, boteprefpriv);
} else if (context.name == tunnelpref) {
console.log('Active in Hidden Services Manager window');
setTitle(tunnelpref, tunnelprefpriv);
} else if (context.name == mailpref) {
console.log('Active in I2P Web Mail window');
setTitle(mailpref, mailprefpriv);
} else if (context.name == torrentpref) {
console.log('Active in I2P Torrent window');
setTitle(torrentpref, torrentprefpriv);
} else if (context.name == ircpref) {
console.log('Active in IRC window');
setTitle(ircpref, ircprefpriv);
}
}
const { cookieStoreId } = tabInfo[0];
if (
tabInfo[0].cookieStoreId != 'firefox-default' &&
tabInfo[0].cookieStoreId != 'firefox-private'
cookieStoreId === "firefox-default" ||
cookieStoreId === "firefox-private"
) {
browser.contextualIdentities
.get(tabInfo[0].cookieStoreId)
.then(onContextGotTitle, onContextError);
} else if (window.incognito) {
browser.windows.update(window.id, {
titlePreface: '',
});
setTitle("", "");
} else {
browser.windows.update(window.id, {
titlePreface: '',
});
browser.contextualIdentities
.get(cookieStoreId)
.then(onContextGotTitle, onContextError);
}
}
var querying = browser.tabs.query({
currentWindow: true,
active: true,
});
const querying = browser.tabs.query({ currentWindow: true, active: true });
querying.then(logTabs, onContextError);
}
var gettingListenerInfo = browser.runtime.getPlatformInfo();
gettingListenerInfo.then((got) => {
function onPlatformError() {
console.log('Error finding platform info');
console.log("Error finding platform info");
}
if (got.os != 'android') {
if (got.os != "android") {
browser.tabs.onCreated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true,
});
getting.then(setTitle, onPlatformError);
getting.then(queryTitle, onPlatformError);
});
browser.tabs.onActivated.addListener(() => {
var getting = browser.windows.getCurrent({
populate: true,
});
getting.then(setTitle, onPlatformError);
getting.then(queryTitle, onPlatformError);
});
}
});
function handleUpdated(updateInfo) {
function maybeSet(them) {
console.log("original theme found:", them, Object.keys(them).length);
try {
if (
Object.keys(them).length == 0 ||
(them.originalTheme.colors == null &&
them.originalTheme.images == null &&
them.originalTheme.properties == null)
) {
if (updateInfo.theme.colors != null) {
if (
updateInfo.theme.colors.frame != "#4456B7" &&
updateInfo.theme.colors.frame != "#363A68"
) {
function onSet() {
console.log("stored theme:", updateInfo.theme);
}
if (
updateInfo.theme.colors != null &&
updateInfo.theme.images != null &&
updateInfo.theme.properties != null
) {
console.log("storing theme:", updateInfo.theme);
browser.storage.local
.set({ originalTheme: updateInfo.theme })
.then(onSet, onError);
}
}
}
} else {
console.log("keeping stored theme:", them);
}
} catch (e) {
console.log("theme storage error", e);
}
}
browser.storage.local.get("originalTheme").then(maybeSet, onError);
}
browser.theme.onUpdated.addListener(handleUpdated);
function handleClick() {
console.log("Opening page action");
browser.pageAction.openPopup();
}
browser.pageAction.onClicked.addListener(handleClick);
async function certCheck(details) {
if (details.url.startsWith("https")) {
console.log("(cert) https site", details.url);
} else {
async function checkCertificate(details) {
if (!details.url.startsWith("https") || !details.url.includes(".i2p")) {
return;
}
if (!details.url.includes(".i2p")) {
const activeTabs = await browser.tabs.query({ active: true });
if (!activeTabs) {
return;
}
var tabs = await browser.tabs.query({ active: true });
for (const tab of activeTabs) {
if (details.url !== tab.url) {
continue;
}
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);
}
try {
const 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".
/* Listen for onHeaderReceived for the target page.
Set "blocking" and "responseHeaders". */
browser.webRequest.onHeadersReceived.addListener(
certCheck,
checkCertificate,
{ 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);
const contextQuery = browser.contextualIdentities.query({
name: "titlepref",
});
function checkTabs(context) {
for (let ctx of context) {
function deleteIfEmpty(tabs) {
if (tabs.length === 0) {
browser.contextualIdentities.remove(ctx.cookieStoreId);
}
}
const tabs = browser.tabs.query({ cookieStoreId: ctx.cookieStoreId });
tabs.then(deleteIfEmpty, onError);
}
var tabs = browser.tabs.query({ cookieStoreId: ctx[0].cookieStoreId });
tabs.then(conditionallyDelete, onError);
}
getContext.then(checkTabs, onError);
contextQuery.then(checkTabs, onError);
}
async function onOpenedWindowCheck() {
const contexts = await browser.contextualIdentities.query({
name: titlepref,
});
function deleteContextIfNoTabs(tabs, context) {
if (tabs.length == 0 && context != 0) {
browser.contextualIdentities.remove(context.cookieStoreId);
}
// once we're done, re-create all the contexts
browser.contextualIdentities.query({}).then(onContextsGot, onContextsError);
}
async function checkTabs(context) {
const tabs = await browser.tabs.query({
cookieStoreId: context.cookieStoreId,
});
await deleteContextIfNoTabs(tabs, context);
}
for (const context of contexts) {
await checkTabs(context);
}
}
onOpenedWindowCheck();
onContextsGot();
browser.tabs.onRemoved.addListener(onClosedWindowCheck);
browser.windows.onRemoved.addListener(onClosedWindowCheck);
browser.windows.onCreated.addListener(onClosedWindowCheck);
if (browser.windows === undefined) {
console.log("windows unavailable on android", browser.runtime.PlatformOs);
browser.windows.onRemoved.addListener(onClosedWindowCheck);
browser.windows.onCreated.addListener(onOpenedWindowCheck);
}
function putCurrentThemeInLocalStorage() {
let mine = isMyTheme();
mine.then(processTheme, themeStoreError);
function processTheme(mineval) {
console.debug("(theme) validating the current theme:", !mineval);
if (mineval) {
return;
}
// get the current theme:
const currentTheme = browser.theme.getCurrent();
currentTheme.then(storeTheme, themeStoreError);
function storeTheme(theme) {
console.debug("(theme) stored the current theme:", theme);
browser.storage.local.set({ name: "theme", theme });
}
}
function themeStoreError(err) {
console.warn("(theme) theme storage error", err);
}
}
function putLatestThemeIDInLocalStorage(extensionInfo) {
let mine = isMyTheme();
mine.then(processTheme, themeStoreError);
function processTheme(mineval) {
console.debug("(theme) validating the current constant theme:", !mineval);
if (mineval) {
return;
}
console.debug("(theme) storing theme by ID", extensionInfo.id);
if (extensionInfo.type === "theme") {
let themeID = extensionInfo.id;
browser.storage.local.set({ themeID });
}
}
function themeStoreError(err) {
console.warn("(theme) theme ID storage error", err);
}
}
function restoreLatestThemeIDInLocalStorage() {
const storedTheme = browser.storage.local.get("themeID");
storedTheme.then(restoreTheme, restoreThemeError);
function restoreTheme(theme) {
if (theme.themeID) {
let dis = browser.management.setEnabled(theme.themeID, false);
dis.then(function () {
console.debug("(theme) theme restored by ID", theme.themeID);
browser.management.setEnabled(theme.themeID, true);
});
}
}
function restoreThemeError(err) {
console.warn("(theme) theme restore error", err);
}
}
browser.management.onEnabled.addListener(putLatestThemeIDInLocalStorage);
function onThemeError(err) {
console.warn("(theme) theme error", err);
}
browser.theme.onUpdated.addListener(putCurrentThemeInLocalStorage);
browser.windows.onCreated.addListener(putCurrentThemeInLocalStorage);
browser.tabs.onCreated.addListener(putCurrentThemeInLocalStorage);
function unsetTheme() {
const storedTheme = browser.storage.local.get("theme");
storedTheme.then(restoreTheme, restoreThemeError);
async function restoreTheme(theme) {
let mt = await isMyTheme();
if (mt) {
if (theme.theme) {
console.debug("(theme) analyzing theme", theme.theme);
if (theme.theme.colors) {
theme.theme.images = {};
console.warn(
"(theme) There's not a way to restore theme images yet."
);
browser.theme.update(theme.theme);
console.log("(theme) restored the stored theme", theme);
} else {
browser.theme.reset();
}
}
restoreLatestThemeIDInLocalStorage();
}
}
function restoreThemeError(err) {
console.debug("(theme) theme restore error", err);
}
}
let btheme = {
colors: {
frame: "#363A68",
toolbar: "#363A68",
tab_text: "#ECF3FF",
},
};
let dtheme = {
colors: {
frame: "#4456B7",
toolbar: "#4456B7",
tab_text: "#ECF3FF",
},
};
async function isMyTheme() {
function hasMatchingColors(theme, targetColors) {
console.debug("(theme) comparison", theme.colors, targetColors.colors);
if (theme.colors === null || targetColors.colors === null) {
return false;
}
return (
theme.colors.frame == targetColors.colors.frame &&
theme.colors.toolbar == targetColors.colors.toolbar &&
theme.colors.tab_text == targetColors.colors.tab_text
);
}
const currentTheme = await browser.theme.getCurrent();
const isLightTheme = hasMatchingColors(currentTheme, dtheme);
const isDarkTheme = hasMatchingColors(currentTheme, btheme);
console.debug(`Is current theme a dynamic theme? ${isLightTheme}`);
console.debug(`Is current theme a browser theme? ${isDarkTheme}`);
return isLightTheme || isDarkTheme;
}

View File

@@ -1,245 +1,210 @@
function bookmarksSetup() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os != 'android') {
function bookmarks(bookmarkToolbar) {
console.log('(bookmarks)', bookmarkToolbar);
console.log('Setting up bookmark toolbar', bookmarkToolbar);
function bookHome(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
let createRhizomeBookmark = browser.bookmarks.create({
url: 'about:I2p',
title: 'I2P Extension Home Page',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
} else {
let createBookmark = browser.bookmarks.create({
url: browser.runtime.getURL('home.html'),
title: 'I2P Extension Home Page',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
}
console.log('(bookmarks) adding home page bookmark');
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
let gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
}
function bookTorrent(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
let createBookmark = browser.bookmarks.create({
url: 'http://localhost:7657/i2psnark',
title: 'Bittorrent',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
} else {
let createRhizomeBookmark = browser.bookmarks.create({
url:
'http://' + control_host + ':' + control_port + '/i2psnark',
title: 'Bittorrent',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
}
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
let gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
}
function bookConsole(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
let createBookmark = browser.bookmarks.create({
url: 'http://localhost:7657/home',
title: 'I2P Console',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
} else {
let createRhizomeBookmark = browser.bookmarks.create({
url: 'http://' + control_host + ':' + control_port + '/home',
title: 'I2P Console',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
}
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
let gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
}
function bookMail(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
let createBookmark = browser.bookmarks.create({
url: 'http://localhost:7657/webmail',
title: 'Web Mail',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
} else {
let createRhizomeBookmark = browser.bookmarks.create({
url:
'http://' + control_host + ':' + control_port + '/webmail',
title: 'Web Mail',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
}
console.log('(bookmarks) adding webmail bookmark');
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
let gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
}
function bookI2PTunnel(bookmarkItems) {
if (!bookmarkItems.length) {
function gotProxyInfo(info) {
let port = info.value.http.split(':')[1];
if (port == '7644') {
var createBookmark = browser.bookmarks.create({
url: 'http://localhost:7657/i2ptunnel',
title: 'Hidden Services Manager',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onCreated);
} else {
var createRhizomeBookmark = browser.bookmarks.create({
url:
'http://' +
control_host +
':' +
control_port +
'/i2ptunnel',
title: 'Hidden Services Manager',
parentId: bookmarkToolbar[0].id,
});
createRhizomeBookmark.then(onCreated);
}
console.log('(bookmarks) adding i2ptunnel bookmark');
}
console.log(
"(bookmarks) checking if we're running in an I2P Browser"
);
var gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
}
/**
* @fileoverview I2P Bookmark Manager
* Handles bookmark creation and management for I2P extension toolbar
*/
function onRejected(error) {
console.log(`An error : ${error}`);
}
function onCreated(node) {
console.log('Bookmarked', node);
}
// Constants for bookmark configuration
const BOOKMARK_CONFIG = {
TOOLBAR_NAME: "I2P Toolbar",
DEFAULT_BOOKMARKS: [
{
title: "I2P Extension Home Page",
getUrl: () => browser.runtime.getURL("home.html"),
},
{
title: "Bittorrent",
getUrl: (host, port) => `http://${host}:${port}/i2psnark`,
},
{
title: "Hidden Services Manager",
getUrl: (host, port) => `http://${host}:${port}/i2ptunnel`,
},
{
title: "Web Mail",
getUrl: (host, port) => `http://${host}:${port}/webmail`,
},
{
title: "I2P Console",
getUrl: (host, port) => `http://${host}:${port}/home`,
},
],
};
var b0 = browser.bookmarks.search({
title: 'I2P Extension Home Page',
});
b0.then(bookHome, onRejected);
/**
* Bookmark Manager class for handling I2P bookmarks
*/
class I2PBookmarkManager {
constructor() {
this.controlHost = control_host();
this.controlPort = control_port();
}
var b1 = browser.bookmarks.search({
title: 'Bittorrent',
});
b1.then(bookTorrent, onRejected);
/**
* Creates a bookmark with error handling
* @param {Object} params Bookmark parameters
* @return {Promise<browser.bookmarks.BookmarkTreeNode>}
*/
async createBookmark({ url, title, parentId }) {
try {
const bookmark = await browser.bookmarks.create({ url, title, parentId });
console.info("Created bookmark:", title);
return bookmark;
} catch (error) {
console.error(`Failed to create bookmark ${title} :`, error);
throw error;
}
}
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;
/**
* Creates the I2P toolbar folder
* @param {browser.bookmarks.BookmarkTreeNode} toolbar Parent toolbar node
* @return {Promise<browser.bookmarks.BookmarkTreeNode>}
*/
async createToolbarFolder(toolbar) {
try {
const existing = await browser.bookmarks.search(
BOOKMARK_CONFIG.TOOLBAR_NAME
);
if (existing.length) {
return existing[0];
}
var bt = browser.bookmarks.search({
query: 'Toolbar',
const folder = await this.createBookmark({
title: BOOKMARK_CONFIG.TOOLBAR_NAME,
parentId: toolbar.id,
});
function toolDir(bookmarkToolbar) {
let defaultSettings = {};
chrome.storage.local.set(defaultSettings);
console.log('(bookmarks) created');
var ibbt = browser.bookmarks.search('I2P Toolbar');
function setupDir(ibbt) {
function onToolbarCreated(node) {
var ibt = browser.bookmarks.search('I2P Toolbar');
ibt.then(bookmarks);
}
if (ibbt[0] == null) {
let createBookmark = browser.bookmarks.create({
title: 'I2P Toolbar',
parentId: bookmarkToolbar[0].id,
});
createBookmark.then(onToolbarCreated);
}
}
ibbt.then(setupDir);
}
bt.then(toolDir);
function handleCreated(id, bookmarkInfo) {
//var propValue;
for (var propName in bookmarkInfo) {
let propValue = bookmarkInfo[propName];
console.log(propName, propValue);
}
}
browser.bookmarks.onCreated.addListener(handleCreated);
await this.populateToolbar(folder);
return folder;
} catch (error) {
console.error("Failed to create toolbar folder:", error);
throw error;
}
});
}
function conditionalBookmarksSetup(obj) {
console.log('(bookmarks) state', obj.bookmarks_state);
if (obj.bookmarks_state == false) {
bookmarksSetup();
}
if (obj.bookmarks_state == undefined) {
bookmarksSetup();
/**
* Creates a single default bookmark if it doesn't exist
* @param {Object} bookmark Bookmark configuration
* @param {string} parentId Parent folder ID
*/
async createDefaultBookmark(bookmark, parentId) {
try {
const existing = await browser.bookmarks.search({
title: bookmark.title,
});
if (!existing.length) {
await this.createBookmark({
url: bookmark.getUrl(this.controlHost, this.controlPort),
title: bookmark.title,
parentId,
});
}
} catch (error) {
console.error(
`Failed to create default bookmark ${bookmark.title}:`,
error
);
}
}
/**
* Populates toolbar with default bookmarks
* @param {browser.bookmarks.BookmarkTreeNode} toolbar Toolbar folder node
*/
async populateToolbar(toolbar) {
try {
await Promise.all(
BOOKMARK_CONFIG.DEFAULT_BOOKMARKS.map((bookmark) =>
this.createDefaultBookmark(bookmark, toolbar.id)
)
);
await this.updateBookmarkState(true);
} catch (error) {
console.error("Failed to populate toolbar:", error);
}
}
/**
* Updates bookmark state in storage
* @param {boolean} state New bookmark state
*/
async updateBookmarkState(state) {
try {
await browser.storage.local.set({ bookmarks_state: state });
if (typeof defaultSettings !== "undefined") {
defaultSettings.bookmarks_state = state;
}
} catch (error) {
console.error("Failed to update bookmark state:", error);
}
}
/**
* Initializes bookmark setup
* @returns {Promise<void>}
*/
async initialize() {
try {
const platform = await browser.runtime.getPlatformInfo();
if (platform.os === "android") {
console.info("Skipping bookmark setup on Android");
return;
}
const toolbars = await browser.bookmarks.search({ query: "Toolbar" });
if (!toolbars.length) {
throw new Error("Browser toolbar not found");
}
await this.createToolbarFolder(toolbars[0]);
} catch (error) {
console.error("Bookmark initialization failed:", error);
}
}
/**
* Checks if bookmarks need to be initialized
* @param {Object} state Current bookmark state
*/
async checkInitialization(state = {}) {
if (!state.bookmarks_state) {
await this.initialize();
}
}
}
if (browser != null) {
let gettingStorage = browser.storage.local.get('bookmarks_state');
gettingStorage.then(conditionalBookmarksSetup, bookmarksSetup);
// Singleton instance
const bookmarkManager = new I2PBookmarkManager();
/**
* Initialize bookmarks system
*/
async function initializeBookmarks() {
if (!browser?.windows) {
console.warn("Browser windows API not available");
return;
}
try {
const state = await browser.storage.local.get("bookmarks_state");
await bookmarkManager.checkInitialization(state);
} catch (error) {
console.error("Failed to initialize bookmarks:", error);
await bookmarkManager.initialize();
}
}
const bookmarksButton = document.getElementById('bookmarksButton');
if (bookmarksButton != null) {
bookmarksButton.addEventListener('click', bookmarksSetup);
// Setup event listeners
document.addEventListener("DOMContentLoaded", () => {
const bookmarksButton = document.getElementById("bookmarksButton");
if (bookmarksButton) {
bookmarksButton.addEventListener("click", () =>
bookmarkManager.initialize()
);
}
});
// Initialize if browser API is available
if (browser) {
initializeBookmarks();
}

170
cert.js
View File

@@ -1,52 +1,150 @@
function blankContent(id) {
let infoTitle = document.getElementById(id);
if (infoTitle === null) {
console.log('content error', id);
/**
* @fileoverview Certificate and Host Verification Module
* Handles I2P certificate verification and host information display
*/
// Constants
const I2P_SUFFIX = ".i2p";
const B32_SUFFIX = "b32.i2p";
const HTTPS_PREFIX = "https";
const HOST_LENGTH_THRESHOLD = 51;
/**
* Message keys for i18n
* @enum {string}
*/
const MessageKeys = {
SITE_LABEL: "siteLabel",
CERT_LABEL: "CertLabel",
IS_HOSTNAME: "isHostName",
IS_BASE32: "isBase32",
CERT_PRESENT: "certPresent",
CERT_ABSENT: "certAbsent",
};
/**
* DOM element IDs
* @enum {string}
*/
const ElementIds = {
TYPE_LABEL: "TypeLabel",
CERT_LABEL: "CertLabel",
ADDRESS_INFO: "AddressInfo",
ADDRESS_CERT_INFO: "AddressCertInfo",
SIGNED_LABEL: "SignedLabel",
};
/**
* Updates element content with i18n message
* @param {string} elementId - Target DOM element ID
* @param {string} messageKey - i18n message key
* @return {void}
*/
function updateContent(elementId, messageKey) {
const element = document.getElementById(elementId);
if (!element) {
console.warn(`Element not found : ${elementId}`);
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);
const message = chrome.i18n.getMessage(messageKey);
if (!message) {
console.warn(`Translation missing for: ${messageKey}`);
return;
}
infoTitle.textContent = messageContent;
element.textContent = message;
}
contentUpdateById('TypeLabel', 'siteLabel');
/**
* Clears content of specified element
* @param {string} elementId - Target DOM element ID
* @return {void}
*/
function clearContent(elementId) {
const element = document.getElementById(elementId);
if (!element) {
console.warn(`Element not found : ${elementId}`);
return;
}
element.textContent = "";
}
contentUpdateById('CertLabel', 'certLabel');
/**
* Extracts I2P host from URL
* @param {string} url - Full URL
* @return {string} I2P host
*/
function extractI2PHost(url) {
const baseHost = url.split(I2P_SUFFIX)[0] + I2P_SUFFIX;
return baseHost;
}
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');
/**
* Determines host type and updates UI
* @param {string} host - I2P host
* @return {void}
*/
function updateHostTypeInfo(host) {
if (host.length < HOST_LENGTH_THRESHOLD) {
updateContent(ElementIds.ADDRESS_INFO, MessageKeys.IS_HOSTNAME);
} else if (host.endsWith(B32_SUFFIX)) {
updateContent(ElementIds.ADDRESS_INFO, MessageKeys.IS_BASE32);
}
}
/**
* Handles certificate verification and UI updates
* @param {string} url - Page URL
* @param {string} host - I2P host
* @return {Promise<void>}
*/
async function handleCertificateVerification(url, host) {
if (url.startsWith(HTTPS_PREFIX)) {
updateContent(ElementIds.ADDRESS_CERT_INFO, MessageKeys.CERT_PRESENT);
try {
const response = await fetch(host);
console.info("Certificate verification completed:", response);
} catch (error) {
console.error("Certificate verification failed:", error);
}
}
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");
updateContent(ElementIds.ADDRESS_CERT_INFO, MessageKeys.CERT_ABSENT);
clearContent(ElementIds.SIGNED_LABEL);
}
}
function tabError(error) {
console.log(`Error: ${error}`);
/**
* Processes active tab information
* @param {browser.tabs.Tab[]} tabs - Active tab information
* @return {Promise<void>}
*/
async function processActiveTab(tabs) {
if (!tabs || !tabs[0] || !tabs[0].url) {
console.error("Invalid tab information");
return;
}
const url = tabs[0].url;
const host = extractI2PHost(url);
updateHostTypeInfo(host);
await handleCertificateVerification(url, host);
}
const gettingCurrent = browser.tabs.query({ active: true });
gettingCurrent.then(tabCheck, tabError);
/**
* Initializes the certificate verification UI
* @return {void}
*/
function initializeCertUI() {
updateContent(ElementIds.TYPE_LABEL, MessageKeys.SITE_LABEL);
updateContent(ElementIds.CERT_LABEL, MessageKeys.CERT_LABEL);
browser.tabs
.query({ active: true })
.then(processActiveTab)
.catch((error) => console.error("Tab processing failed:", error));
}
// Initialize certificate verification
initializeCertUI();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 215 KiB

View File

@@ -1,18 +1,62 @@
var proxy_scheme = 'HTTP';
var proxy_host = '127.0.0.1';
var proxy_port = '4444';
function proxy_scheme() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageProxyScheme();
}
function proxy_host() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageHost();
}
function proxy_port() {
console.info("(config)Got i2p:", getFuncName());
return getFromStoragePort();
}
var control_host = '127.0.0.1';
var control_port = '7657';
function control_host() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageControlHost();
}
var rpc_host = '127.0.0.1';
var rpc_port = '7657';
var rpc_path = 'jsonrpc';
var rpc_pass = 'itoopie';
function control_port() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageControlPort();
}
var bt_rpc_host = '127.0.0.1';
var bt_rpc_port = '7657';
var bt_rpc_path = 'transmission/rpc';
var bt_rpc_pass = 'transmission';
function rpc_host() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageRPCHost();
}
function rpc_port() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageRPCPort();
}
function rpc_path() {
console.info("(config)Got i2p:", getFuncName());
getFromStorageRPCPath();
}
function rpc_pass() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageRPCPass();
}
function bt_rpc_host() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageBTRPCHost();
}
function bt_rpc_port() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageBTRPCPort();
}
function bt_rpc_path() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageBTRPCPath();
}
function bt_rpc_pass() {
console.info("(config)Got i2p:", getFuncName());
return getFromStorageBTRPCPass();
}
function getFuncName() {
return getFuncName.caller.name;
}
var disable_history = false;

193
consoleinfo.js Normal file
View File

@@ -0,0 +1,193 @@
/**
* @fileoverview I2P Router Console Status Manager
* Handles router console connectivity checking and UI updates
*/
// Constants
const CONSOLE_CONFIG = {
ROUTER_URL: "http://127.0.0.1:7657",
WELCOME_PATH: "/welcome",
FETCH_OPTIONS: {
method: "GET",
cache: "no-store",
redirect: "follow",
},
};
const UI_ELEMENTS = {
ROUTER_STATUS: "router-check",
ROUTER_CLASS: ".routerness",
HIDDEN_CLASS: "hidden",
};
const MESSAGE_KEYS = {
SUCCESS: "consoleSuccessStatus",
FAILURE: "consoleFailedStatus",
};
/**
* UI Manager for handling element visibility
*/
class UIManager {
/**
* Toggle element visibility
* @param {Element|NodeList} elements - Elements to modify
* @param {boolean} show - Whether to show or hide
*/
static toggleVisibility(elements, show) {
try {
if (!elements) {
throw new Error("Elements parameter is null or undefined");
}
const elementArray =
elements instanceof NodeList ? Array.from(elements) : [elements];
elementArray.forEach((element) => {
if (element && element.style !== undefined && element.style !== null) {
const action = show ? "remove" : "add";
element.classList[action](UI_ELEMENTS.HIDDEN_CLASS);
console.debug(`(consoleinfo) ${show ? "showing" : "hiding"} element`);
} else {
console.warn(
"(consoleinfo) Invalid element encountered during visibility toggle"
);
}
});
} catch (error) {
console.error("Visibility toggle failed:", error);
throw error;
}
}
/**
* Update element content by ID
* @param {string} elementId - Target element ID
* @param {string} messageKey - i18n message key
*/
static updateContent(elementId, messageKey) {
try {
const element = document.getElementById(elementId);
if (!element) {
throw new Error(`Element not found : ${elementId}`);
}
element.textContent = chrome.i18n.getMessage(messageKey);
} catch (error) {
console.error("Content update failed:", error);
}
}
/**
* Get elements by selector
* @param {string} selector - CSS selector
* @return {?NodeList}
*/
static getElements(selector) {
try {
return document.querySelectorAll(selector);
} catch (error) {
console.error("Element selection failed:", error);
return null;
}
}
}
/**
* Router Console Manager
*/
class RouterConsoleManager {
/**
* Check router console connectivity
* @return {Promise<void>}
*/
static async checkConsoleStatus() {
console.info("(consoleinfo) Checking router console status");
try {
const response = await fetch(
`${CONSOLE_CONFIG.ROUTER_URL}${CONSOLE_CONFIG.WELCOME_PATH}`,
CONSOLE_CONFIG.FETCH_OPTIONS
);
if (!response.ok) {
throw new Error(`Console response not OK : ${response.status}`);
}
await this.handleConsoleSuccess(response);
} catch (error) {
await this.handleConsoleError(error);
}
}
/**
* Handle successful console connection
* @param {Response} response - Fetch response
*/
static async handleConsoleSuccess(response) {
console.info("(consoleinfo) Router console check successful");
try {
UIManager.updateContent(UI_ELEMENTS.ROUTER_STATUS, MESSAGE_KEYS.SUCCESS);
const routerElements = UIManager.getElements(UI_ELEMENTS.ROUTER_CLASS);
if (routerElements) {
UIManager.toggleVisibility(routerElements, true);
}
} catch (error) {
console.error("Console success handling failed:", error);
}
}
/**
* Handle console connection failure
* @param {Error} error - Connection error
*/
static async handleConsoleError(error) {
console.error("(consoleinfo) Router console check failed:", error);
try {
UIManager.updateContent(UI_ELEMENTS.ROUTER_STATUS, MESSAGE_KEYS.FAILURE);
const routerElements = UIManager.getElements(UI_ELEMENTS.ROUTER_CLASS);
if (routerElements) {
UIManager.toggleVisibility(routerElements, false);
}
} catch (additionalError) {
console.error("Console error handling failed:", additionalError);
}
}
/**
* Initialize console monitoring
*/
static initialize() {
try {
this.checkConsoleStatus();
console.info("(consoleinfo) Router console monitoring initialized");
} catch (error) {
console.error("Console initialization failed:", error);
}
}
}
// Event Listeners
document.addEventListener(
"DOMContentLoaded",
() => {
RouterConsoleManager.initialize();
},
{
passive: true,
capture: false,
}
);
// Export for testing
if (typeof module !== "undefined" && module.exports) {
module.exports = {
RouterConsoleManager,
UIManager,
CONSOLE_CONFIG,
UI_ELEMENTS,
MESSAGE_KEYS,
};
}

View File

@@ -2,52 +2,70 @@ function contentUpdateById(id, message) {
let infoTitle = document.getElementById(id);
let messageContent = chrome.i18n.getMessage(message);
if (infoTitle === null) {
console.log('content error', id, messageContent);
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');
contentUpdateById("text-section-header", "extensionName");
contentUpdateById("description", "extensionDescription");
contentUpdateById("i2pbrowser-version", browser.runtime.getManifest().version);
// 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');
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("disable-referers", "disableReferers");
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');
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", "extensionName");
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');
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 hide(elements) {
const elems = Array.isArray(elements) ? elements : [elements];
for (let i = 0; i < elems.length; i++) {
const el = elems[i];
if (el.style) {
console.log("(content) hiding");
el.classList.add("hidden");
}
}
}
function unhide(elements) {
const elems = Array.isArray(elements) ? elements : [elements];
elems.forEach((el) => {
if (el.style) {
//el.style.display = "inline-block";
console.log("(content) unhiding");
el.classList.remove("hidden");
}
});
}

View File

@@ -1,75 +1,161 @@
//var windowIds = []
var titlepref = chrome.i18n.getMessage('titlePreface');
/**
* @fileoverview I2P Container Context Manager
* Handles container tab creation and management for I2P browsing contexts
*/
function onError(error) {
console.log(`Error : ${error}`);
// Constants
const UI_STRINGS = {
TITLE_PREFACE: chrome.i18n.getMessage("titlePreface"),
API_ERROR_MESSAGE:
"browser.contextualIdentities not available. Check that the privacy.userContext.enabled pref is set to true, and reload the add-on.",
NO_IDENTITIES_MESSAGE: "No identities returned from the API.",
};
const TAB_ACTIONS = {
NEW_TAB: "new-i2p browser tab",
CLOSE_ALL: "close-all i2p browser tabs",
};
const TAB_OPTIONS = [
{
text: "New I2P Browser Tab",
action: TAB_ACTIONS.NEW_TAB,
},
{
text: "Close All I2P Browser Tabs",
action: TAB_ACTIONS.CLOSE_ALL,
},
];
/**
* Handles browser operation errors
* @param {Error} error - Browser operation error
*/
function handleError(error) {
console.error("Container operation failed:", error);
}
function eventHandler(event) {
function onCreated(windowInfo) {
console.log(`Created window : ${windowInfo.id}`);
browser.tabs.create({
/**
* Creates a new tab in specified container window
* @param {Object} windowInfo - Window information
* @param {string} cookieStoreId - Container identity
*/
async function createContainerTab(windowInfo, cookieStoreId) {
try {
await browser.tabs.create({
windowId: windowInfo.id,
url: 'about:blank',
cookieStoreId: event.target.dataset.identity,
url: "about:blank",
cookieStoreId: cookieStoreId,
});
console.info(`Created container tab in window : ${windowInfo.id}`);
} catch (error) {
handleError(error);
}
if (event.target.dataset.action == 'create') {
var creating = browser.tabs.create({
cookieStoreId: event.target.dataset.identity,
});
creating.then(onCreated, onError);
}
if (event.target.dataset.action == 'close-all') {
browser.tabs
.query({
cookieStoreId: event.target.dataset.identity,
})
.then((tabs) => {
browser.tabs.remove(tabs.map((rem) => rem.id));
});
}
}
/**
* Handles container tab operations
* @param {Event} event - UI event
*/
async function handleContainerAction(event) {
event.preventDefault();
}
const { action, identity } = event.target.dataset;
function createOptions(node, identity) {
for (let option of ["Create", "Close All"]) {
let alink = document.createElement("a");
alink.href = "#";
alink.innerText = option;
alink.dataset.action = option.toLowerCase().replace(" ", "-");
alink.dataset.identity = identity.cookieStoreId;
alink.addEventListener("click", eventHandler);
node.appendChild(alink);
try {
switch (action) {
case TAB_ACTIONS.NEW_TAB:
const window = await browser.windows.create();
await createContainerTab(window, identity);
break;
case TAB_ACTIONS.CLOSE_ALL:
const tabs = await browser.tabs.query({ cookieStoreId: identity });
await browser.tabs.remove(tabs.map((tab) => tab.id));
break;
default:
console.warn("Unknown container action:", action);
}
} catch (error) {
handleError(error);
}
}
var div = document.getElementById("identity-list");
if (browser.contextualIdentities === undefined) {
div.innerText =
"browser.contextualIdentities not available. Check that the privacy.userContext.enabled pref is set to true, and reload the add-on.";
} else {
browser.contextualIdentities
.query({
name: titlepref,
})
.then((identities) => {
if (!identities.length) {
div.innerText = "No identities returned from the API.";
return;
}
for (let identity of identities) {
let row = document.createElement("div");
let span = document.createElement("div");
span.className = "identity";
span.innerText = identity.name;
span.style = `color: ${identity.color}`;
console.log(identity);
row.appendChild(span);
createOptions(row, identity);
div.appendChild(row);
}
/**
* Creates UI elements for container options
* @param {HTMLElement} parentNode - Container for options
* @param {Object} identity - Container identity
*/
function createContainerOptions(parentNode, identity) {
TAB_OPTIONS.forEach((option) => {
const link = document.createElement("a");
Object.assign(link, {
href: "#",
innerText: option.text,
dataset: {
action: option.action,
identity: identity.cookieStoreId,
},
});
link.addEventListener("click", handleContainerAction);
parentNode.appendChild(link);
});
}
/**
* Creates UI element for container identity
* @param {Object} identity - Container identity
* @returns {HTMLElement}
*/
function createIdentityElement(identity) {
const row = document.createElement("div");
const span = document.createElement("div");
span.className = "identity";
span.innerText = identity.name;
row.appendChild(span);
createContainerOptions(row, identity);
return row;
}
/**
* Initializes container UI
* @param {HTMLElement} containerList - Container list element
*/
async function initializeContainerUI(containerList) {
if (!browser.contextualIdentities) {
containerList.innerText = UI_STRINGS.API_ERROR_MESSAGE;
return;
}
try {
const identities = await browser.contextualIdentities.query({
name: UI_STRINGS.TITLE_PREFACE,
});
if (!identities.length) {
containerList.innerText = UI_STRINGS.NO_IDENTITIES_MESSAGE;
return;
}
identities.forEach((identity) => {
const element = createIdentityElement(identity);
containerList.appendChild(element);
console.debug("Added container identity:", identity.name);
});
} catch (error) {
handleError(error);
containerList.innerText = error.message;
}
}
// Initialize container management
const identityList = document.getElementById("identity-list");
if (identityList) {
initializeContainerUI(identityList);
} else {
console.error("Identity list container not found");
}

197
debian/changelog vendored
View File

@@ -1,3 +1,200 @@
i2psetproxy.js (2.8.3-1) UNRELEASED; urgency=low
* Fix context recreation bug
-- idk <hankhill19580@gmail.com> Fri, 20 Feb 2025 12:00:00 -0000
i2psetproxy.js (2.8.1-1) UNRELEASED; urgency=low
* 2.8.0/1 release
-- idk <hankhill19580@gmail.com> Fri, 07 Feb 2025 12:00:00 -0000
i2psetproxy.js (2.7.1-1) UNRELEASED; urgency=low
* Make `Referer:` header handling more fine-grained
-- idk <hankhill19580@gmail.com> Fri, 04 Sep 2024 17:38:04 -0400
i2psetproxy.js (2.6.1-1) UNRELEASED; urgency=low
* Fix bug where all local services were routed to the routerconsole container
-- idk <hankhill19580@gmail.com> Sun, 18 Aug 2024 21:20:04 -0400
i2psetproxy.js (2.5.9-1) UNRELEASED; urgency=low
* Minor refactoring, simplifications
-- idk <hankhill19580@gmail.com> Thu, 10 Jul 2024 13:40:40 -0400
i2psetproxy.js (1.49-1) UNRELEASED; urgency=low
* Fix proxy error page load.
* lots of cleanup
-- idk <hankhill19580@gmail.com> Tue, 20 Jun 2023 15:40:40 -0400
i2psetproxy.js (1.47-1) UNRELEASED; urgency=low
* only reset the theme if we're resetting from one we own
-- idk <hankhill19580@gmail.com> Sun, 11 Jun 2023 14:05:08 -0400
i2psetproxy.js (1.45-1) UNRELEASED; urgency=low
* Refactor scrub-and-capture code
* Fix issue where user themes were overwritten
-- idk <hankhill19580@gmail.com> Sat, 10 Jun 2023 23:51:21 -0400
i2psetproxy.js (1.43-1) UNRELEASED; urgency=low
* Fix wrong color pageAction icon
* Add router status to proxy error page
-- idk <hankhill19580@gmail.com> Sun, 24 Oct 2022 09:35:20 -0400
i2psetproxy.js (1.41-1) UNRELEASED; urgency=low
* Fix wrong color pageAction icon
* Add router status to proxy error page
-- idk <hankhill19580@gmail.com> Sun, 24 Oct 2022 09:21:20 -0400
i2psetproxy.js (0.135-1) UNRELEASED; urgency=low
* Style update
* Fix compatibility with third-party themes
* Update text
* Improve translation coverage
* Descriptive proxy error page
-- idk <hankhill19580@gmail.com> Sun, 16 Oct 2022 09:21:20 -0400
i2psetproxy.js (0.133-1) UNRELEASED; urgency=low
* Add machine translations for several languages
-- idk <hankhill19580@gmail.com> Mon, 31 May 2022 16:28:06 -0400
i2psetproxy.js (0.131-1) UNRELEASED; urgency=low
* Add several new contextual identities for plugin apps
* Add option to set the homepage and new tab page on the first run
-- idk <hankhill19580@gmail.com> Fri, 11 Feb 2022 20:28:16 -0400
i2psetproxy.js (0.125-1) UNRELEASED; urgency=low
* Bump and resubmit to mozilla.
-- idk <hankhill19580@gmail.com> Wed, 3 Nov 2021 00:20:33 -0400
i2psetproxy.js (0.123-1) UNRELEASED; urgency=low
* Bump and resubmit to mozilla.
* I am not going to optionally keep cookies.
* That would be introducing a pointless security issue.
-- idk <hankhill19580@gmail.com> Wed, 30 Oct 2021 10:11:51 -0400
i2psetproxy.js (0.121-1) UNRELEASED; urgency=low
* switch to browser_specific_settings manifest key
-- idk <hankhill19580@gmail.com> Wed, 13 Oct 2021 21:28:28 -0400
i2psetproxy.js (0.119-1) UNRELEASED; urgency=low
* Fixes to ease releasing via AMO
-- idk <hankhill19580@gmail.com> Wed, 13 Oct 2021 20:37:30 -0400
i2psetproxy.js (0.117-1) UNRELEASED; urgency=low
* Switch to legwork for search provider.
* admin isn't answering, but the service is up unlike yacy.idk.i2p.
-- idk <hankhill19580@gmail.com> Mon, 4 Oct 2021 20:38:59 -0400
i2psetproxy.js (0.115-1) UNRELEASED; urgency=low
* Improve functionality of X-I2P-Location and X-I2P-Torrentlocation
* Fix usage of browser.theme.reset()
* Add checks to disable features that are broken on Android
-- idk <hankhill19580@gmail.com> Fri, 1 Oct 2021 15:29:22 -0400
i2psetproxy.js (0.113-1) UNRELEASED; urgency=low
* Fix checks on BRB, railroad containers
-- idk <hankhill19580@gmail.com> Sun, 26 Sep 2021 00:37:22 -0400
i2psetproxy.js (0.111-1) UNRELEASED; urgency=low
* simplify background theme issue fix
-- idk <hankhill19580@gmail.com> Wed, 07 Jul 2021 23:27:27 -0400
i2psetproxy.js (0.109-1) UNRELEASED; urgency=low
* connection interrupted mid release, retry failed validation. Bump and retry
-- idk <hankhill19580@gmail.com> Wed, 07 Jul 2021 22:00:25 -0400
connection interrupted mid release, retry failed validation. Bump and retry
i2psetproxy.js (0.107-1) UNRELEASED; urgency=low
* Small code fixes
* Fix for interference with non-I2P containers
-- idk <hankhill19580@gmail.com> Wed, 07 Jul 2021 22:00:25 -0400
i2psetproxy.js (0.105-1) UNRELEASED; urgency=low
* Add help page for configuring i2pcontrol
* Add help page for configuring i2psnark-rpc
* Update the icons
-- idk <hankhill19580@gmail.com> Wed, 26 May 2021 12:56:56 -0400
i2psetproxy.js (0.103-1) UNRELEASED; urgency=low
* Fix for double-test issue on /home.html page in the extension
* Fix for broken options menu
-- idk <hankhill19580@gmail.com> Wed, 26 May 2021 12:56:56 -0400
i2psetproxy.js (0.101-1) UNRELEASED; urgency=low
* Sweeping changes to styles
* fix for issue when using noscript and visiting susimail
-- idk <hankhill19580@gmail.com> Mon, 24 May 2021 3:41:35 -0400
i2psetproxy.js (0.99-1) UNRELEASED; urgency=low
* Sweeping changes to styles
* fix for issue when using noscript and visiting susimail
-- idk <hankhill19580@gmail.com> Mon, 24 May 2021 2:05:21 -0400
i2psetproxy.js (0.97-1) UNRELEASED; urgency=low
* Fix theme issue, add x-i2p-torrentlocation HEADER support
-- idk <hankhill19580@gmail.com> FRI, 5 FEB 2021 1:02:55 -0400
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

BIN
drag-sidebar-after.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

BIN
drag-sidebar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

View File

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

View File

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

View File

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

321
home.css
View File

@@ -1,29 +1,118 @@
* {
padding: 0;
color: #1f1a24;
margin: 0
}
html {
margin: 0 4%;
padding: 0 20px;
min-height: 100%;
background: #9ab;
background: #fff;
scrollbar-color: #bcd #789
}
body {
margin: 0;
padding: 20px 40px;
font-family: Open Sans,Noto Sans,Segoe UI,sans-serif;
font-size: 12pt;
color: #fff;
text-decoration: none;
word-wrap: break-word;
background: #f2f2f2
}
h1,
h2,
h3,
h4 {
display: block;
font-weight: 700
}
h1 {
text-transform: uppercase;
font-weight: 900;
font-size: 200%
}
h2 {
font-size: 140%
}
h3 {
font-size: 120%
}
h4 {
margin-bottom: 5px;
text-align: right;
text-transform: none;
font-size: 90%;
font-weight: 600;
font-style: italic
}
p {
margin-bottom: 15px;
width: 100%;
line-height: 1.4;
word-wrap: break-word;
text-align: justify;
text-decoration: none
}
ul {
margin: 10px 20px;
list-style: none
}
li {
margin-left: 0;
padding: 12px 15px 20px;
width: calc(100% - 40px);
text-align: justify;
border: 1px solid #363a68;
border-radius: 25px;
box-shadow: inset 0 0 0 1px #363a68;
background: #4456b7
}
li li {
padding-bottom: 0;
width: calc(100% - 40px);
text-align: left;
border: none;
border-top: 1px solid #9ab;
box-shadow: none
}
li li:first-of-type {
margin-top: 15px;
border-top: none
}
li a:first-of-type {
display: block;
width: 100%
}
#applicationExplain {
float: unset
}
li+li {
margin-top: 15px
}
h3+ul,
ul+h2,
ul+h3 {
margin-top: 20px
}
a,
button {
color: #1f1a24;
text-decoration: none;
background: none;
font-weight: 700;
word-wrap: break-word;
outline: 0;
padding: 3px;
margin: auto
}
.applicationDesc {
color: #f9f7dc;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.applicationDesc {
color: #fff;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.applicationDesc:hover,
a:hover,
button:hover {
color: #495057;
color: #ff9e7a;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
@@ -32,98 +121,49 @@ button:hover {
button {
border: none;
cursor: pointer;
color: #3b6bbf;
color: #fff;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
body {
display: flex;
flex-direction: column;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
margin: 0 auto;
padding: 0;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.button-list {
min-height: 230px;
min-width: 230px
outline: 0;
background: unset
}
.background {
height: 100%
}
p {
line-height: 32px;
font-size: 17px;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
outline: 0
}
.content {
min-height: 3rem;
padding: 1rem;
margin: 1.5rem;
display: block;
border-radius: 2px;
min-width: 100%
padding: 1rem;
min-height: 3rem;
min-width: 95%;
display: inline-block;
border: 1px solid #363a68;
border-radius: 25px;
background: #363a68
}
#header,
.application-info,
.browser-info,
.extended-info,
.search-info {
min-height: 3rem;
padding: 1rem;
margin-top: 1.5rem;
display: block;
border-radius: 2px;
min-width: 100%
}
h1 {
margin: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 32px;
color: #e6e6e7;
background: #1f1a24;
width: 100%;
border-radius: 2px 2px 0 0
}
h2,
h3 {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 25px;
color: #e6e6e7;
border-radius: 2px 2px 0 0;
background: #1f1a24;
width: 100%;
padding-left: 5%
}
h4 {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
font-weight: 600;
font-size: 20px!important;
color: #41465f;
border-radius: 2px 2px 0 0;
background: #1f1a24;
width: 100%;
padding-left: 5%
padding: 1rem;
min-height: 3rem;
min-width: 95%;
display: inline-block;
border: 1px solid #787ff6;
border-radius: 25px;
box-shadow: inset 0 0 0 1px #787ff6,0 0 1px #ccc;
background: #363a68
}
.showhider {
margin-right: auto;
font-family: "Droid Sans","Noto Sans",Ubuntu,"Segoe UI","Lucida Grande",Verdana,Helvetica,sans-serif;
border: none;
padding: 0!important;
color: #3b6bbf;
text-transform: uppercase;
background: none!important;
border: none;
width: 90%;
color: #fff;
text-decoration: none;
font-weight: 700;
word-wrap: break-word;
@@ -138,34 +178,13 @@ h4 {
flex-direction: row;
margin-bottom: 80px
}
ul {
margin: auto;
border-radius: 2px;
width: 100%;
margin: 0;
padding: 0
}
li {
display: block;
text-align: center;
margin: 0;
padding: 0
}
.center {
display: block;
margin-left: auto;
margin-right: auto;
width: 50%
}
#readyness {
#readyness,
#routerness {
padding-top: 1rem;
padding-bottom: 1rem;
margin: 1rem;
width: 42%;
min-width: 42%;
text-align: center!important;
border-radius: 2px;
display: block
min-width: 42%
}
#onboarding {
min-height: 5rem;
@@ -175,39 +194,34 @@ li {
width: 42%;
min-width: 42%;
font-size: 2rem;
background: #4456b7;
text-align: center!important;
border-radius: 2px
border: 2px solid #787ff6;
border-radius: 25px;
float: left;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#i2pbrowser-description {
padding-top: 1rem;
padding-bottom: 1rem;
width: 50%;
min-width: 50%;
display: block
}
html body ul.label-list li {
list-style: none;
float: left
}
html body ul.label-list li:nth-child(odd) {
clear: left
display: inline-block
}
#linksExplain {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
width: 30%;
min-width: 30%;
text-align: center!important;
border-radius: 2px
width: 100%;
min-width: 100%
}
#applicationExplain,
#controlExplain {
min-height: 5rem;
padding: .5rem;
margin: .5rem;
text-align: left!important;
float: left
width: 98%;
min-width: 98%
}
#proxyReady {
min-height: 3rem;
@@ -215,9 +229,13 @@ html body ul.label-list li:nth-child(odd) {
margin: .2rem;
width: 38%;
min-width: 38%;
display: block;
display: inline-block;
background: #363a68;
float: right;
text-align: center!important
text-align: center!important;
border: 2px solid #787ff6;
border-radius: 25px;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
#proxyUnready {
min-height: 3rem;
@@ -225,9 +243,12 @@ html body ul.label-list li:nth-child(odd) {
margin: .2rem;
width: 38%;
min-width: 38%;
display: block;
display: inline-block;
background: #363a68;
float: right;
text-align: center!important
text-align: center!important;
border: 2px solid #787ff6;
border-radius: 25px
}
#consoleOn {
min-height: 3rem;
@@ -235,19 +256,13 @@ html body ul.label-list li:nth-child(odd) {
margin: .2rem;
width: 38%;
min-width: 38%;
display: block;
display: inline-block;
float: left;
text-align: center!important
}
.tabicon {
min-width: 64px;
min-height: 64px
}
li.application {
text-align: left
}
button.applicationName {
width: auto
text-align: center!important;
border: 1px solid #f7e59a;
border-radius: 2px;
background: #f7e59a;
box-shadow: inset 0 0 0 1px #fff,0 0 1px #ccc
}
.onboardingContent {
font-size: .8rem!important;
@@ -263,19 +278,31 @@ button.applicationName {
opacity: 1
}
img {
max-width: 100%;
margin: 3%
max-width: 100%
}
img.readyness {
height: 100%;
width: auto
}
input {
color: #1f1a24
@media only screen and (max-width: 399px) {
.application-info {
display: none
}
}
#hidden {
display: none
@media screen and (max-width: 1200px) {
body {
font-size: 10.5pt
}
}
video {
width: 100%
}
.hidden {
visibility: none;
display: none
}
.application-info {
min-width: 45%;
max-width: 45%;
float: right
}

View File

@@ -14,6 +14,7 @@
<div class='background'>
<div class='content'>
<div class="text-section-header">
<img height="30px" src="icons/i2plogo.png" width="30px">
<h1 id="text-section-header">I2P Browsing</h1>
</div>
@@ -21,50 +22,35 @@
</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>
<p id="description">I2P network browsing made easy.</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="readyness">
<img class="readyness" src="icons/local_up.png"> <span id="proxy-check">Proxy is ready.</span>
</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 class="hideIfI2PProxyOff" id="visit-url">
<form action="" method="get">
<input id="url-query" name="query" placeholder="Open a URL in an I2P tab:" type="search"> <input id="url-submit" text="Submit" type="submit">
</form>
</div>
</div>
<div class="hideIfI2PConsoleOff" id="onboarding">
<h3 id="onboardingTitle">New to I2P? Learn more here.</h3>
<h4 id="onboardingZero"><button class="showhider" id="onboardingButtonZero">Protect your Privacy</button>
</h4>
<button class="showhider" id="onboardingButtonZero">Protect your Privacy</button>
<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>
<button class="showhider" id="onboardingButtonOne">Configure your Experience</button>
<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>
<button class="showhider" id="onboardingButtonTwo">Share Files</button>
<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>
<button class="showhider" id="onboardingButtonThree">Hidden e-mail</button>
<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>
<button class="showhider" id="onboardingButtonFour">Browsing the Web</button>
<p class="onboardingContent" id="onboardingContentFour">This extension works automatically when you are browsing I2P sites. If you want to use I2P as a proxy to non-I2P sites, use the I2P In Private Browsing button in the toolbar and click New I2P Browser Tab to switch to I2P Browsing in a new tab.</p>
<button class="showhider" id="onboardingButtonFive">Experience Tips</button>
<p class="onboardingContent" id="onboardingContentFive">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>-->
@@ -77,19 +63,6 @@
<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>
@@ -112,9 +85,7 @@
</div>
<div class="extended-info">
<h3 id="links"><button class="showhider" id="fliplinks">Links</button>
</h3>
<button class="showhider" id="fliplinks">Extension and I2P Resources</button>
<div id="info-content">
<p id="linksExplain">If you want to get more information about I2P, you can visit these links.</p>
@@ -123,11 +94,7 @@
<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>
<a href="/index.html" id="window-visit-index">Webextension Homepage:</a> <span class="applicationDesc" id="webpage">More information is available here.</span>
</li>
<li class="application">
@@ -137,6 +104,10 @@
<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>
<li class="application">
<a href="http://i2p-projekt.i2p/" id="window-visit-i2p" target="_blank">I2P Project Homepage:</a> <span class="applicationDesc" id="i2ppage">More information is available here.</span>
</li>
</ul>
<p>
@@ -146,6 +117,10 @@
</div>
</div>
<script src="home.js" type="text/javascript"></script>
<script src="content.js" type="text/javascript"></script> <!--</div>-->
<script src="info.js" type="text/javascript"></script>
<script src="messages.js" type="text/javascript"></script>
<script src="content.js" type="text/javascript"></script>
<script src="i2pd.js"></script>
<script src="proxyinfo.js" type="text/javascript"></script>
</body>
</html>

36
home.js
View File

@@ -1,25 +1,27 @@
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');
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 === "onboardingButtonFive") {
flipVisibility("onboardingContentFive");
} else if (clickEvent.target.id === "fliplinks") {
flipVisibility("info-content");
}
});
function flipVisibility(div) {
console.log('(home) seeking flippable', div);
console.log("(home) seeking flippable", div);
let flippable = document.getElementById(div);
if (flippable.style.display !== 'block') {
flippable.style.display = 'block';
if (flippable.style.display !== "block") {
flippable.style.display = "block";
} else {
flippable.style.display = 'none';
flippable.style.display = "none";
}
}

362
host.js
View File

@@ -1,151 +1,249 @@
function proxyHost(url) {
let hostname = '';
if (url.indexOf('://') > -1) {
hostname = url.split('/')[2];
} else {
hostname = url.split('/')[0];
}
if (hostname == 'proxy.i2p') {
return true;
}
if (
hostname == 'c6lilt4cr5x7jifxridpkesf2zgfwqfchtp6laihr4pdqomq25iq.b32.i2p'
) {
return true;
}
return false;
}
/**
* @fileoverview I2P Host Management Module
* Handles host verification, routing, and application paths for I2P browser extension
*/
function localHost(url) {
let hostname = '';
if (url.indexOf('://') > -1) {
hostname = url.split('/')[2];
} else {
hostname = url.split('/')[0];
}
hostname = hostname.split(':')[0];
if (hostname === '127.0.0.1') {
return true;
} else if (hostname === 'localhost') {
return true;
}
// Constants for URL patterns and ports
const URL_PATTERNS = {
I2P_SUFFIX: ".i2p",
PROXY_HOST: "proxy.i2p",
LOCALHOST: ["localhost", "127.0.0.1"],
PROTOCOL_PREFIX: "ext+rc:",
};
return false;
}
const PORT_APPLICATIONS = {
TOR: "7695",
BLOG: "8084",
IRC: "7669",
};
function extensionHost(url) {
if (url.originUrl !== undefined) {
var res = url.originUrl.startsWith(browser.runtime.getURL(''));
if (res) return res;
}
if (url.url !== undefined) {
var res = url.url.startsWith(browser.runtime.getURL(''));
if (res) return res;
const ROUTER_PATHS = {
TUNNEL_MGR: ["i2ptunnelmgr", "i2ptunnel"],
TORRENT: ["i2psnark", "torrents", "transmission", "tracker"],
MAIL: ["webmail", "susimail"],
MUWIRE: ["MuWire"],
BOTE: ["i2pbote"],
CONSOLE: ["home", "console", "dns", "susidns", "config", "sitemap", ""],
};
/**
* Validates and processes URLs for host checking
* @param {string|URL|Object} urlInput - URL to process
* @return {URL} Processed URL object
* @throws {Error} If URL is invalid
*/
function processURL(urlInput) {
try {
if (typeof urlInput === "string") {
if (!urlInput.startsWith("http")) {
urlInput = "http://" + urlInput;
}
return new URL(urlInput);
}
if (urlInput instanceof URL) {
return urlInput;
}
return new URL(urlInput.url);
} catch (error) {
console.error("Invalid URL processing:", error);
throw new Error("Invalid URL format");
}
}
/**
* Checks if request is for proxy host
* @param {Object} requestDetails - Request details object
* @return {boolean}
*/
function isProxyHost(requestDetails) {
try {
const requestUrl = processURL(requestDetails);
const isProxy = requestUrl.hostname === URL_PATTERNS.PROXY_HOST;
console.debug("(proxy) proxyinfo check:", requestUrl.hostname, isProxy);
return isProxy;
} catch (error) {
console.error("Proxy host check failed:", error);
return false;
}
}
/**
* Validates if URL points to localhost
* @param {string|URL} url
* @return {string|false} Host:port if local, false otherwise
*/
function isLocalHost(url) {
try {
const requestUrl = processURL(url);
if (URL_PATTERNS.LOCALHOST.includes(requestUrl.hostname)) {
return `${requestUrl.hostname}:${requestUrl.port}`;
}
return false;
} catch (error) {
console.error("Local host check failed:", error);
return false;
}
}
/**
* Standardizes localhost representation
* @param {string|URL} url
* @return {string}
*/
function tidyLocalHost(url) {
const hostPort = isLocalHost(url);
if (hostPort) {
return hostPort.replace("127.0.0.1", "localhost");
}
const processedUrl = processURL(url);
return `${processedUrl.hostname}:${processedUrl.port}`;
}
/**
* Service-specific host checks
* @param {string|URL} url
* @param {string} port
* @param {string} service
* @return {string|false}
*/
function checkServiceHost(url, port, service) {
const host = isLocalHost(url);
if (!host) {
return false;
}
return host.includes(` : ${port}`) ? service : false;
}
const isTorHost = (url) => checkServiceHost(url, PORT_APPLICATIONS.TOR, "tor");
const isBlogHost = (url) =>
checkServiceHost(url, PORT_APPLICATIONS.BLOG, "blog");
const isIRCHost = (url) => checkServiceHost(url, PORT_APPLICATIONS.IRC, "irc");
/**
* Verifies if request comes from extension
* @param {Object} url - Request URL object
* @return {boolean}
*/
function isExtensionHost(url) {
const extensionPrefix = browser.runtime
.getURL("")
.replace("moz-extension://", "")
.replace("/", "");
const checkUrl = (sourceUrl) => {
if (!sourceUrl) return false;
return sourceUrl
.replace("moz-extension://", "")
.replace("/", "")
.startsWith(extensionPrefix);
};
return checkUrl(url.originUrl) || checkUrl(url.documentUrl);
}
/**
* Extracts I2P hostname from URL
* @param {string|URL} url
* @returns {string|false}
*/
function i2pHostName(url) {
let hostname = '';
console.log('(hosts)', url);
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];
try {
const requestUrl = processURL(url);
return requestUrl.host.endsWith(URL_PATTERNS.I2P_SUFFIX)
? requestUrl.host
: false;
} catch (error) {
console.error("I2P hostname extraction failed:", error);
return false;
}
return hostname;
}
/**
* Validates I2P host
* @param {Object} url
* @returns {boolean}
*/
function i2pHost(url) {
let hostname = i2pHostName(url);
return hostname.endsWith('.i2p');
if (isProxyHost(url)) {
console.warn("(host) proxy.i2p detected");
return false;
}
const requestUrl = processURL(url.url);
return requestUrl.hostname.endsWith(URL_PATTERNS.I2P_SUFFIX);
}
function routerHost(url) {
// console.log("(urlcheck) HOST URL CHECK");
let hostname = '';
let path = '';
function pathcheck(str) {
if (str != undefined) {
let final = str.split('/')[0];
if (final === 'i2ptunnelmgr' || final === 'i2ptunnel') {
console.log('(urlcheck) Tunnel application path', final);
return 'i2ptunnelmgr';
} else if (
final === 'i2psnark' ||
final === 'torrents' ||
final.startsWith('transmission') ||
final.startsWith('tracker') ||
url.includes(':7662')
) {
console.log('(urlcheck) Torrent application path', final);
return 'i2psnark';
} else if (final === 'webmail' || final === 'susimail') {
console.log('(urlcheck) Mail application path', final);
return 'webmail';
} else if (final.startsWith('MuWire')) {
if (!url.includes('.png')) {
console.log('(urlcheck) MuWire application path', final);
return 'muwire';
}
} else if (final.startsWith('i2pbote')) {
if (!url.includes('.png')) {
console.log('(urlcheck) I2PBote application path', final);
return 'i2pbote';
}
} else if (
final === 'home' ||
final === 'console' ||
final === 'dns' ||
final === 'sitemap' ||
final.startsWith('config')
) {
console.log('(urlcheck) Console application path', final);
return 'routerconsole';
}
/**
* Gets first path element from URL
* @param {string|URL} url
* @returns {string}
*/
function getFirstPathElement(url) {
const requestUrl = processURL(url);
const path = requestUrl.pathname.replace(/^\/+/, "");
return path.split("/")[0];
}
/**
* Identifies application from path
* @param {string|URL} url
* @returns {string|boolean}
*/
function getPathApplication(url) {
const path = getFirstPathElement(url);
if (ROUTER_PATHS.TUNNEL_MGR.includes(path)) return "i2ptunnelmgr";
if (ROUTER_PATHS.TORRENT.includes(path)) return "i2psnark";
if (ROUTER_PATHS.MAIL.includes(path)) return "webmail";
if (path.startsWith("MuWire")) return "muwire";
if (path.startsWith("i2pbote")) return "i2pbote";
if (ROUTER_PATHS.CONSOLE.includes(path)) return "routerconsole";
console.warn("(host) unknown path:", path);
return true;
}
/**
* Verifies router host status
* @param {string|URL} url
* @returns {string|boolean}
*/
function isRouterHost(url) {
try {
const protocolUrl = identifyProtocolHandler(url);
if (protocolUrl) {
return isRouterHost(protocolUrl);
}
return true;
const requestUrl = processURL(url);
const { hostname, port } = requestUrl;
const controlHost = control_host();
const controlPort = control_port();
if (
tidyLocalHost(`${hostname}:${port}`) ===
tidyLocalHost(`${controlHost}:${controlPort}`)
) {
return getPathApplication(url);
}
return false;
} catch (error) {
console.error("Router host check failed:", error);
return false;
}
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 + '/', '');
}
/**
* Identifies protocol handler in URL
* @param {string} url
* @returns {string|false}
*/
function identifyProtocolHandler(url) {
const encoded = encodeURIComponent(URL_PATTERNS.PROTOCOL_PREFIX);
if (url.includes(encoded)) {
return url.replace(encoded, "");
}
if (hostname === control_host + ':' + control_port) {
return pathcheck(path);
}
if (hostname === 'localhost' + ':' + control_port) {
return pathcheck(path);
}
if (hostname === '127.0.0.1' + ':' + control_port) {
return pathcheck(path);
}
if (hostname === 'localhost' + ':' + 7070) {
return pathcheck(path);
}
if (hostname === '127.0.0.1' + ':' + 7070) {
return pathcheck(path);
if (url.includes(URL_PATTERNS.PROTOCOL_PREFIX)) {
return url.replace(URL_PATTERNS.PROTOCOL_PREFIX, "");
}
return false;
}

BIN
i2p-https.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

View File

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

12
i2pd.js Normal file
View File

@@ -0,0 +1,12 @@
// stuff required specifically to be compatible with i2pd
//TODO: Don't hard-code this.
fetch("http://127.0.0.1:7657/themes/console/light/images/i2plogo.png")
.then((myJson) => {
var consoleLinks = document.querySelectorAll(".application-info");
unhide(consoleLinks);
})
.catch((error) => {
var consoleLinks = document.querySelectorAll(".application-info");
hide(consoleLinks);
});

BIN
i2plogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 327 KiB

BIN
i2psnark-integrate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 197 KiB

BIN
icons/InfoToopie.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
icons/InfoToopieHTTPS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

0
icons/README.md Normal file
View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 27 KiB

BIN
icons/local_up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -6,217 +6,233 @@
<link href="sidebar.css" rel="stylesheet" type="text/css">
</head>
<body>
<h1>I2P in Private Browsing Mode(Firefox-Only)</h1>
<div class="content" id="browserpanel">
<h1>I2P in Private Browsing Mode(Firefox-Only)</h1>
<p>This is an webextension which introduces a set of new "Private Browsing" modes to Firefox-based browsers(Supporting webextensions) that makes it easier to configure a browser to use I2P securely and adds features for making I2P applications easier to use. It does this by isolating I2P-specific settings to Contextual Identities within Firefox, then loading them automatically when the user requests them. It also adds convenience and management features, like an embedded I2P console and Bittorrent integration with clients using the transmission-rpc API.</p>
<ul>
<li>
<p><strong>This extension requires a running I2P Router on the Host System</strong>
</p>
</li>
<h2>Privacy Policy</h2>
<li>
<p><a href="https://geti2p.net/en/download/easyinstall"><strong>This extension comes pre-installed in the Easy-Install Beta for Windows</strong></a>
</p>
</li>
</ul>
<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 is an webextension which introduces a set of new "Private Browsing" modes to Firefox-based browsers(Supporting webextensions, must be current ESR or greater) 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 and via in-browser protocol handling integrations.</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>
<h2>Privacy Policy</h2>
<p>This browser extension is entirely Free, Open-Source software.</p>
<p>This browser extension does not collect any personal information. It requires access to local storage and browsing data permissions in order to delete them when directed to by the user. This browser extension does not transmit any information to any third party, nor will it, ever.</p>
<h2>Installation(Cross-Platform):</h2>
<p>This browser extension cannot influence telemetry carried out by browser vendors to determine performance in their distribution channels, nor can it mitigate any other browser vendor telemetry.</p>
<p>For desktop users this addon is available from addons.mozilla.org, where you will be able to recive automatic updates: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">I2P in Private Browsing</a>.</p>
<p>This browser extension is entirely Free, Open-Source software.</p>
<h2>Debian Installation:</h2>
<h2>Installation(Cross-Platform):</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>
<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>
<pre><code> make deb
<h3>Setting the Homepage</h3>
<p>The first time you run the extension, Firefox will offer you the option of setting your homepage and new tab page to the homepage contained <em>within</em> the extension. You can decline this or edit it later and it will not affect your anonymity. Enabling this feature allows the extension to set your homepage to a local document with a number of useful I2P links.</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>
<p>and then you can install it with:</p>
<pre><code> sudo apt install ../i2psetproxy.js_*.deb
<pre><code> sudo apt install ../i2psetproxy.js_*.deb
</code></pre>
<h2>Bittorrent Download:</h2>
<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>
<p>The self-hosted plugin is available from bittorrent both within the I2P and Clearnet Bittorrent network(With a web seed to support it in case one goes dead).</p>
<ul>
<li>
<a href="magnet:?xt=urn:btih:991cc1181d816c20629caef454ebabf14785fbf7">Magnet Link</a>
</li>
<ul>
<li>
<a href="magnet:?xl=1246magnetsubdn=i2ppb%40eyedeekay.github.io.xpi.torrentmagnetsubxt=urn:tree:tiger:eyme2fkldmntehx4m7ujho6fgxklugx2bfsnztimagnetsubxt=urn:ed2k:1bd6f65a3dc2027c9ac265da2c61e6d6magnetsubxt=urn:aich:t7hfnrsgwjjeh5nctj5qe7kwaclnahbc">Magnet Link</a>
</li>
<li>
<a href="./i2ppb@eyedeekay.github.io.xpi.torrent">Get the .torrent file</a>
</li>
</ul>
<li>
<a href="./i2ppb@eyedeekay.github.io.xpi.torrent">Get the .torrent file</a>
</li>
</ul>
<h2>Usage:</h2>
<h2>Usage:</h2>
<ul>
<li>Basically, it "Just Works." After you install the plugin, browsing to an I2P domain will automatically stop the current tab and re-open the I2P site in an I2P Browser tab.</li>
<ul>
<li>Basically, it "Just Works." After you install the plugin, browsing to an I2P domain will automatically stop the current tab and re-open the I2P site in an I2P Browser tab.</li>
<li>Besides that, four bookmarks are added to the "Bookmarks Toolbar," which will take you to visit your Java I2P applications, or the "Simplified I2P Landing Page" embedded in the plugin:</li>
<li>Besides that, four bookmarks are added to the "Bookmarks Toolbar," which will take you to visit your Java I2P applications, or the "Simplified I2P Landing Page" embedded in the plugin:</li>
<li><img alt="Landing page" src="lander.png" title="">
</li>
<li><img alt="Landing page" src="lander.png" title="">
</li>
<li>Also, there's a menu for accessing I2P functionality while you're browsing. It lets you control a few settings in a granular way.</li>
<li>Also, there's a menu for accessing I2P functionality while you're browsing. It lets you control a few settings in a granular way.</li>
<li><img alt="Menu" src="menu.png" title="">
</li>
<li><img alt="Menu" src="menu.png" title="">
</li>
<li>You can re-enable WebRTC but force it to always use the proxy that is enforced by the tab.</li>
<li>You can 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>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>That's all there is to it! Your browser is configured to safely use and administer I2P.</li>
<li>Optionally, you can add I2PSnark-RPC and use Bittorrent-over-I2P via the transmission-rpc interface. To do this, have a look at the torrent guide: <a href="torrent/index.html">Torrent guide</a>
</li>
</ul>
<li>Optionally, you can add I2PSnark-RPC and use Bittorrent-over-I2P via the transmission-rpc interface. To do this, have a look at the torrent guide: <a href="torrent/index.html">Torrent guide</a>
</li>
</ul>
<h3>Features</h3>
<h3>Features</h3>
<ul>
<li>[done] <strong>Provide</strong> a way to launch into an I2P-Specific contextual identity (container). Intercept requests to .i2p domains and automatically route them to the I2P container. Isolate the router console from other local applications by automatically intercepting requests to the router console to another container.</li>
<ul>
<li>[done] <strong>Provide</strong> a way to launch into an I2P-Specific contextual identity (container). Intercept requests to .i2p domains and automatically route them to the I2P container. Isolate the router console from other local applications by automatically intercepting requests to the router console to another container.</li>
<li><img alt="Visiting i2p-projekt.i2p" src="i2psetproxy.js.png" title="">
</li>
<li><img alt="Visiting i2p-projekt.i2p" src="i2psetproxy.js.png" title="">
</li>
<li>[done] <strong>Indicate</strong> the I2P browser is in use visually. Find an acceptable way to indicate it on Android.</li>
<li>[done] <strong>Indicate</strong> the I2P browser is in use visually. Find an acceptable way to indicate it on Android.</li>
<li><img alt="Visiting webmail" src="susimail.png" title="">
</li>
<li><img alt="Visiting webmail" src="susimail.png" title="">
</li>
<li>[done] <strong>Set</strong> the http proxy to use the local I2P proxy automatically. Provide specific configuration for other types of I2P proxies(SOCKS, isolating HTTP)</li>
<li>[done] <strong>Set</strong> the http proxy to use the local I2P proxy automatically. Provide specific configuration for other types of I2P proxies(SOCKS, isolating HTTP)</li>
<li>[done] <strong>Disable</strong> risky webRTC features/offer the option to re-enable them with the proxy enforced.</li>
<li>[done] <strong>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] <strong>Change</strong> the color of the browser window to indicate that I2P is in use</li>
<li><img alt="Visiting i2ptunnel" src="i2ptunnel.png" title="">
</li>
<li><img alt="Visiting i2ptunnel" src="i2ptunnel.png" title="">
</li>
<li>[ready] <strong>Provide</strong> help in a variety of languages.</li>
<li>[ready] <strong>Provide</strong> help in a variety of languages.</li>
<li>[done] <strong>Monitor</strong> the health and readiness of the I2P router it is instructed to use. Currently the plugin checks whether the HTTP Proxy is working by fetching an image from "http://proxy.i2p" and displaying a result. A work-in-progress binding to i2pcontrol is available in ./i2pcontrol, it is inert at this time.</li>
<li>[Done] <strong>Handle</strong> router console applications under their own origins and within their own contextual identity. (1) The router console is automatically confined to it's own container tab. (2) Use a custom protocol handler to place each i2p application/plugin under it's own origin, shortening router console URL's and placing applications under their own origin.</li>
<li><img alt="Visiting toopie.html" src="toopie.png" title="">
</li>
<li><img alt="Visiting routerconsole" src="routerconsole.png" title="">
</li>
<li>[Done] <strong>Handle</strong> router console applications under their own origins and within their own contextual identity. (1) The router console is automatically confined to it's own container tab. (2) Use a custom protocol handler to place each i2p application/plugin under it's own origin, shortening router console URL's and placing applications under their own origin.</li>
<li>[Done] <strong>Handle Torrents</strong> by talking to i2psnark-rpc plugin and then adding them directly into the Firefox downloads drop-downs, menus, etc. Enable the use of I2PSnark as a peer-to-peer delivery mechanism for media files.</li>
<li><img alt="Visiting routerconsole" src="routerconsole.png" title="">
</li>
<li><img alt="Visiting i2psnark" src="i2psnark.png" title="">
</li>
<li>[Done] <strong>Handle Torrents</strong> by talking to i2psnark-rpc plugin and then adding them directly into the Firefox downloads drop-downs, menus, etc. Enable the use of I2PSnark as a peer-to-peer delivery mechanism for media files.</li>
<li><img alt="Monitoring torrents" src="transmissionrpc.png" title="">
</li>
<li><img alt="Visiting i2psnark" src="i2psnark.png" title="">
</li>
<li>[Done] <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><img alt="Monitoring torrents" src="transmissionrpc.png" title="">
</li>
<li><img alt="Distribute your site as a torrent." src="x-i2p-torrentlocation.png" title="">
</li>
<li><img alt="Distribute your site as a torrent." src="x-i2p-torrentlocation.png" title="">
</li>
<li>[Done] <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>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><img alt="Use HTTPS with your I2P Site." src="i2p-https.png" title="">
</li>
<li>[Started] <strong>Provide</strong> alternate, in-I2P destinations for web sites that want to mirror their content within I2P.</li>
<li>[Done] <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>[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 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>I2P Blogging: Use this for posting content to the web interface of your blog or to other similar websites that you create content on.</li>
</ul>
</li>
<li><img alt="Visiting clearweb" src="clearweb.png" title="">
</li>
</ul>
<li><img alt="Visiting clearweb" src="clearweb.png" title="">
</li>
</ul>
<h3>Video</h3>
<h3>Video</h3>
<ul>
<li><img alt="Video of the plugin in action" src="i2psetproxy.js.gif" title="">
</li>
</ul>
<ul>
<li><img alt="Video of the plugin in action" src="i2psetproxy.js.gif" title="">
</li>
</ul>
<h2>Documents</h2>
<h2>Documents</h2>
<ul>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/download/docs/Browser.Design.Documentation.pdf">Browser Outline</a></strong>: This document is an outline of each of the browser extension's feature panels in presentation form.</li>
<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/releases/download/docs/Landing.Page.Documentation.pdf">Smart Lander Design</a></strong>: This is the original outline of the smart landing page which became the I2P home page within the browser and the drop-down control panel.</li>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/wiki/Other-Extensions">Other extensions</a></strong>: and how they work with this one.</li>
</ul>
<li><strong><a href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/wiki/Other-Extensions">Other extensions</a></strong>: and how they work with this one.</li>
</ul>
<h2>Super Extra Important Background Info:</h2>
<h2>Super Extra Important Background Info:</h2>
<p>This plugin's viability is directly related to the viability of Mozilla and Tor's work on hardening Firefox itself and of particular interest are the "Uplift" and "Fusion(Firefox Using Onions)" projects.</p>
<p>This plugin's viability is directly related to the viability of Mozilla and Tor's work on hardening Firefox itself and of particular interest are the "Uplift" and "Fusion(Firefox Using Onions)" projects.</p>
<h3>Links about Project Uplift</h3>
<h3>Links about Project Uplift</h3>
<ul>
<li>
<a href="https://wiki.mozilla.org/Security/Tor_Uplift">Tor Uplift</a> is a project which brings important features of the Tor Browser to the mainstream of Firefox users by including patches from Tor Browser Bundle into Firefox where it is appropriate.
</li>
<ul>
<li>
<a href="https://wiki.mozilla.org/Security/Tor_Uplift">Tor Uplift</a> is a project which brings important features of the Tor Browser to the mainstream of Firefox users by including patches from Tor Browser Bundle into Firefox where it is appropriate.
</li>
<li>
<a href="https://wiki.mozilla.org/Security/FirstPartyIsolation">First Party Isolation</a> is a feature in Firefox and other browsers which keeps information from leaking across first-party domains.
</li>
<li>
<a href="https://wiki.mozilla.org/Security/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/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/Fennec%2BTor_Project">Fennec</a> is Firefox for Android and this link has some analysis of the privacy consequences of the Android platform.
</li>
<li>
<a href="https://wiki.mozilla.org/Security/Tor_Uplift/Tracking">Tracking</a> in Firefox is surveyed here.
</li>
</ul>
<li>
<a href="https://wiki.mozilla.org/Security/Tor_Uplift/Tracking">Tracking</a> in Firefox is surveyed here.
</li>
</ul>
<p>Project uplift seems to have largely been accomplished?</p>
<p>Project uplift seems to have largely been accomplished?</p>
<h3>Links about Project Fusion</h3>
<h3>Links about Project Fusion</h3>
<ul>
<li>
<a href="https://wiki.mozilla.org/Security/Fusion">Project Fusion</a> or Firefox using Onions is a joint Mozilla/Tor effort to create an enhanced Private Browsing mode for Firefox which uses Tor.
</li>
<ul>
<li>
<a href="https://wiki.mozilla.org/Security/Fusion">Project Fusion</a> or Firefox using Onions is a joint Mozilla/Tor effort to create an enhanced Private Browsing mode for Firefox which uses Tor.
</li>
<li>
<a href="https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject">Notes</a> from a meeting about Fusion.
</li>
<li>
<a href="https://trac.torproject.org/projects/tor/wiki/org/meetings/2018Rome/Notes/FusionProject">Notes</a> from a meeting about Fusion.
</li>
<li>
<a href="https://blog.torproject.org/tor-heart-firefox">Tor at the Heart: Firefox</a> is a blog about Tor and the relationship they have to Firefox re: TBB, Fusion.
</li>
</ul>
<li>
<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>
<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>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>
<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>
<ul>
<li>
<p>This is the new version: <a href="https://addons.mozilla.org/en-US/firefox/addon/i2p-in-private-browsing/">[link]</a></p>
</li>
<li>
<p>This is the old version: <a href="https://addons.mozilla.org/en-US/firefox/addon/I2P-Proxy/">[link]</a></p>
</li>
</ul>
<li>
<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>
<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>
<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>
</div>
</body>
</html>

View File

@@ -1,25 +1,24 @@
body,
html {
width: 450px
width: 600px
}
.panel {
margin: 5px;
width: 450px;
height: 450px
width: 500px
}
.panel-section-header {
width: 450px
width: 500px
}
#text-section-torrents-header {
width: 450px
width: 500px
}
span.identity {
width: 450px;
display: block;
width: 500px;
display: inline-block;
margin-left: 1em
}
figcaption {
display: block
display: inline-block
}
.section-header {
margin-bottom: 8px
@@ -63,4 +62,9 @@ img.readyness {
}
.tabicon {
width: 32px
}
.application-info {
min-width: unset;
max-width: unset;
float: right
}

647
info.js
View File

@@ -1,346 +1,333 @@
function checkPeerConnection() {
let getting = browser.privacy.network.peerConnectionEnabled.get({});
getting.then((got) => {
let webrtc = got.value;
console.log('checking webrtc', webrtc);
if (document.getElementById('enable-web-rtc') !== null)
document.getElementById('enable-web-rtc').checked = webrtc;
});
}
/**
* @fileoverview I2P Browser Information Manager
* Handles browser settings, privacy features, and navigation for I2P extension
*/
checkPeerConnection();
function checkSnowflake() {
try {
function snowflake(snowflake) {
console.log("snowflake plugin found, leaving WebRTC alone", snowflake);
AssurePeerConnection();
}
var snowflakeInfo = browser.management.get(
"{b11bea1f-a888-4332-8d8a-cec2be7d24b9}" // string
);
snowflakeInfo.then(snowflake);
} catch {
console.log("snowflake not found");
}
}
checkSnowflake();
function checkHistory() {
let getting = browser.storage.local.get("disable_history");
getting.then((got) => {
let disable_history = got.disable_history;
if (disable_history == undefined) {
disable_history = false;
}
console.log("checking history", disable_history);
if (document.getElementById("disable-history") !== null)
document.getElementById("disable-history").checked = disable_history;
});
}
checkHistory();
document.addEventListener("click", (clickEvent) => {
if (clickEvent.target.id === "window-create-help-panel") {
let createData = {
type: "panel",
incognito: true,
};
let creating = browser.tabs.create(createData);
creating.then(() => {
console.log("The help panel has been created");
});
} else if (clickEvent.target.id === "window-create-news-panel") {
let createData = {
type: "panel",
incognito: true,
};
let creating = browser.tabs.create(createData);
creating.then(() => {
console.log("The news panel has been created");
});
} 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 = (event) => {
console.log(Http.responseText);
};
}
refreshIdentity();
} else if (clickEvent.target.id === "label-router-restart") {
console.log("attempting to initiate graceful restart");
RouterManager("RestartGraceful");
} else if (clickEvent.target.id === "label-router-shutdown") {
console.log("attempting to initiate graceful shutdown");
RouterManager("ShutdownGraceful");
} else if (clickEvent.target.id === "label-router-status") {
if (document.getElementById("label-status-list").style.display !== "none") {
console.log("hiding label-status-list");
document.getElementById("label-status-list").style.display = "none";
} else {
console.log("showing label-status-list");
document.getElementById("label-status-list").style.display = "block";
}
} else if (clickEvent.target.id === "label-router-peers") {
if (document.getElementById("label-peers-list").style.display !== "none") {
console.log("hiding label-peers-list");
document.getElementById("label-peers-list").style.display = "none";
} else {
console.log("showing label-peers-list");
document.getElementById("label-peers-list").style.display = "block";
}
} else if (clickEvent.target.id === "label-router-bandwidth") {
if (
document.getElementById("label-bandwidth-list").style.display !== "none"
) {
console.log("hiding label-bandwidth-list");
document.getElementById("label-bandwidth-list").style.display = "none";
} else {
console.log("showing label-bandwidth-list");
document.getElementById("label-bandwidth-list").style.display = "block";
}
} else if (clickEvent.target.id === "search-submit") {
console.log("attempting to create search tab");
goSearch();
} else if (clickEvent.target.id === "browser-action") {
console.log("showing a browser action");
showBrowsing();
} else if (clickEvent.target.id === "torrent-action") {
console.log("showing a torrent action");
showTorrentsMenu();
} else if (clickEvent.target.id === "window-preface-title") {
console.log("attempting to create homepage tab");
goHome();
} else if (clickEvent.target.id === "window-visit-index") {
console.log("attempting to create index tab");
goIndex();
} else if (clickEvent.target.id === "window-visit-homepage") {
console.log("attempting to create homepage tab");
goHome();
} else if (clickEvent.target.id === "window-visit-toopie") {
console.log("attempting to create toopie tab");
goToopie();
} else if (clickEvent.target.id === "window-visit-i2ptunnel") {
console.log("attempting to create i2ptunnel tab");
goTunnel();
} else if (clickEvent.target.id === "window-visit-susimail") {
console.log("attempting to create susimail tab");
goMail();
} else if (clickEvent.target.id === "window-visit-snark") {
console.log("attempting to create snark tab");
goSnark();
} else if (clickEvent.target.id === "clear-browser-data") {
forgetBrowsingData();
} else if (clickEvent.target.id === "check-i2p-control") {
//echo("I2P Router Detected", "panel-section-i2pcontrol-check");
} else if (clickEvent.target.id === "enable-web-rtc") {
if (clickEvent.target.checked) {
browser.runtime.sendMessage({ rtc: "enableWebRTC" });
} else {
browser.runtime.sendMessage({ rtc: "disableWebRTC" });
}
checkPeerConnection();
return;
} else if (clickEvent.target.id === "disable-history") {
if (clickEvent.target.checked) {
browser.runtime.sendMessage({ history: "disableHistory" });
} else {
browser.runtime.sendMessage({ history: "enableHistory" });
}
return;
}
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";
}
// Constants
const CONFIG = {
TITLE_PREFACE: chrome.i18n.getMessage("titlePreface"),
ROUTER: {
DEFAULT_HOST: "127.0.0.1",
DEFAULT_PORT: "7657",
},
SNOWFLAKE_ID: "{b11bea1f-a888-4332-8d8a-cec2be7d24b9}",
UPDATE_INTERVAL: 0.2 * 60 * 1000,
IRC_URL: "http://127.0.0.1:7669",
};
function proxyReadiness() {
console.log(this.responseText);
}
const UI_ELEMENTS = {
PANELS: {
BROWSER: "browserpanel",
TORRENT: "torrentpanel",
},
LISTS: {
PEERS: "label-peers-list",
BANDWIDTH: "label-bandwidth-list",
},
};
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os != "android") {
browser.history.onVisited.addListener(onVisited);
}
});
function showBrowsing() {
var x = document.getElementById("browserpanel");
x.style.display = "block";
var y = document.getElementById("torrentpanel");
y.style.display = "none";
}
function showTorrentsMenu() {
var x = document.getElementById("browserpanel");
x.style.display = "none";
var y = document.getElementById("torrentpanel");
y.style.display = "block";
}
function goHome() {
function gotProxyInfo(info) {
let port = info.value.http.split(":")[1];
if (port == "7644") {
let createRhizomeData = {
url: "about:I2p",
};
console.log("visiting homepage");
let creating = browser.tabs.create(createRhizomeData);
creating.then(onTabCreated, onTabError);
} else {
let createData = {
url: "home.html",
};
console.log("visiting homepage");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
console.log("(bookmarks) adding home page bookmark");
}
console.log("(bookmarks) checking if we're running in an I2P Browser");
var gettingProxyInfo = browser.proxy.settings.get({});
gettingProxyInfo.then(gotProxyInfo);
}
function goIndex() {
function onTabError() {
console.log("Help tab created");
}
let createData = {
url: "index.html",
};
console.log("visiting help");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function goToopie() {
function onTabError() {
console.log("Toopie tab created");
}
console.log("visiting toopie");
let creating = browser.sidebarAction.open();
creating.then(onTabCreated, onTabError);
}
function onTabCreated() {
console.log("Tab Created");
}
function goSearch() {
function onTabError() {
console.log("Search tab created");
}
let createData = {
url:
"http://yacy.idk.i2p/yacysearch.html?" +
"query=" +
document.getElementById("search-query").value,
};
console.log("visiting legwork");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function routerAddr() {
if (!control_host) var control_host = "127.0.0.1";
if (!control_port) var control_port = "7657";
return control_host + ":" + control_port;
}
function goTunnel() {
function onTabError() {
console.log("I2PTunnel tab created");
}
let createData = {
url: "http://" + routerAddr() + "/i2ptunnel",
};
console.log("visiting i2ptunnel");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function goMail() {
function onTabError() {
console.log("Mail tab created");
}
let createData = {
url: "http://" + routerAddr() + "/susimail",
};
console.log("visiting mail");
let creating = browser.tabs.create(createData);
creating(onTabCreated, onTabError);
}
function goSnark() {
function onTabError() {
console.log("Snark tab created");
}
let createData = {
url: "http://" + routerAddr() + "/i2psnark",
};
console.log("visiting snark");
let creating = browser.tabs.create(createData);
creating.then(onTabCreated, onTabError);
}
function onVisited(historyItem) {
function onCleaned(results) {
if (results.length) {
console.log(" was not removed");
} else {
console.log(" was removed");
/**
* Privacy Manager for handling browser privacy settings
*/
class PrivacyManagerInfo {
/**
* Check WebRTC peer connection status
*/
static async checkPeerConnection() {
try {
const { value: webrtc } =
await browser.privacy.network.peerConnectionEnabled.get({});
const webrtcToggle = document.getElementById("enable-web-rtc");
if (webrtcToggle) {
webrtcToggle.checked = webrtc;
}
console.info("(info) WebRTC status:", webrtc);
} catch (error) {
console.error("WebRTC check failed:", error);
}
}
function onRemoved() {
var searching = browser.history.search({
text: historyItem.url,
startTime: 0,
/**
* Check Snowflake plugin status
*/
static async checkSnowflake() {
try {
const snowflake = await browser.management.get(CONFIG.SNOWFLAKE_ID);
console.info("(info) Snowflake plugin found:", snowflake);
await this.assurePeerConnection();
} catch (error) {
console.info("(info) Snowflake not found:", error);
}
}
/**
* Check history settings
*/
static async checkHistory() {
try {
const { disable_history = false } = await browser.storage.local.get(
"disable_history"
);
const historyToggle = document.getElementById("disable-history");
if (historyToggle) {
historyToggle.checked = disable_history;
}
console.info("(info) History disabled:", disable_history);
} catch (error) {
console.error("History check failed:", error);
}
}
/**
* Check referer settings
*/
static async checkReferer() {
try {
const { disable_referer = false } = await browser.storage.local.get(
"disable_referer"
);
const refererToggle = document.getElementById("disable-referer");
if (refererToggle) {
refererToggle.checked = disable_referer;
}
console.info("(info) Referer disabled:", disable_referer);
} catch (error) {
console.error("Referer check failed:", error);
}
}
}
/**
* Tab Manager for handling browser navigation
*/
class TabManager {
/**
* Create a new browser tab
* @param {Object} options Tab creation options
* @return {Promise<browser.tabs.Tab>}
*/
static async createTab(options) {
try {
const tab = await browser.tabs.create(options);
console.info("(info) Tab created:", options.url);
return tab;
} catch (error) {
console.error("Tab creation failed:", error);
throw error;
}
}
/**
* Create a tab in I2P container
* @param {string} url Destination URL
*/
static async createContainerTab(url) {
try {
const contexts = await browser.contextualIdentities.query({
name: CONFIG.TITLE_PREFACE,
});
if (!contexts.length) {
throw new Error("No I2P container found");
}
return this.createTab({
url,
cookieStoreId: contexts[0].cookieStoreId,
});
} catch (error) {
console.error("Container tab creation failed:", error);
throw error;
}
}
/**
* Navigate to local I2P service
* @param {string} path Service path
*/
static async goToService(path) {
try {
const routerAddress = await RouterManager.getRouterAddress();
await this.createTab({
url: `http://${routerAddress}${path}`,
});
} catch (error) {
console.error(`Service navigation failed : ${path}`, error);
}
}
}
/**
* Router Manager for I2P router operations
*/
class RouterManager {
/**
* Get router address
* @return {string}
*/
static getRouterAddress() {
try {
return `${control_host()}:${control_port()}`;
} catch {
return `${CONFIG.ROUTER.DEFAULT_HOST}:${CONFIG.ROUTER.DEFAULT_PORT}`;
}
}
/**
* Generate new identity
*/
static async generateNewIdentity() {
try {
const routerAddress = this.getRouterAddress();
const response = await fetch(`http ://${routerAddress}`);
console.info("(info) New identity generated");
return response;
} catch (error) {
console.error("Identity generation failed:", error);
throw error;
}
}
}
/**
* UI Manager for handling interface elements
*/
class UIManager {
/**
* Toggle panel visibility
* @param {string} showPanel Panel to show
* @param {string} hidePanel Panel to hide
*/
static togglePanels(showPanel, hidePanel) {
try {
const show = document.getElementById(showPanel);
const hide = document.getElementById(hidePanel);
if (show && hide) {
show.style.display = "block";
hide.style.display = "none";
}
} catch (error) {
console.error("Panel toggle failed:", error);
}
}
/**
* Initialize UI elements
*/
static initializeUI() {
Object.values(UI_ELEMENTS.LISTS).forEach((listId) => {
const list = document.getElementById(listId);
if (list) {
list.style.display = "none";
}
});
searching.then(onCleaned);
}
if (!history) {
if (i2pHost(historyItem.url)) {
var deletingUrl = browser.history.deleteUrl(historyItem.url);
}
deletingUrl.then(onRemoved);
}
}
if (UpdateContents !== undefined) UpdateContents();
/**
* Click Handler for UI interactions
*/
class ClickHandler {
/**
* Handle click events
* @param {MouseEvent} event Click event
*/
static async handleClick(event) {
event.preventDefault();
const { id: targetId } = event.target;
const minutes = 0.2;
const interval = minutes * 60 * 1000;
try {
// Panel creation
if (targetId.startsWith("window-create-")) {
await TabManager.createTab({
type: "panel",
incognito: true,
});
}
setInterval(function () {
if (UpdateContents !== undefined) UpdateContents();
}, interval);
// Service navigation
else if (targetId.startsWith("window-visit-")) {
const service = targetId.split("-")[2];
await this.handleServiceNavigation(service);
}
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");
// Settings toggles
else if (targetId === "enable-web-rtc") {
await this.handleWebRTCToggle(event.target.checked);
}
// Other actions
else if (targetId === "generate-fresh-tunnel") {
await RouterManager.generateNewIdentity();
}
} catch (error) {
console.error("Click handling failed:", error);
}
}
});
/**
* Handle service navigation
* @param {string} service Service identifier
*/
static async handleServiceNavigation(service) {
const serviceMap = {
console: "/home",
i2ptunnel: "/i2ptunnel",
susimail: "/susimail",
snark: "/i2psnark",
};
if (serviceMap[service]) {
await TabManager.goToService(serviceMap[service]);
}
}
}
/**
* Initialize the information manager
*/
async function initialize() {
try {
// Initialize privacy settings
await Promise.all([
PrivacyManagerInfo.checkPeerConnection(),
PrivacyManagerInfo.checkSnowflake(),
PrivacyManagerInfo.checkHistory(),
PrivacyManagerInfo.checkReferer(),
]);
// Initialize UI
UIManager.initializeUI();
document.addEventListener(
"click",
ClickHandler.handleClick.bind(ClickHandler)
);
// Set up content updates
if (typeof UpdateContents !== "undefined") {
setInterval(UpdateContents, CONFIG.UPDATE_INTERVAL);
}
console.info("(info) Information manager initialized");
} catch (error) {
console.error("Initialization failed:", error);
}
}
// Initialize if browser API is available
if (browser?.windows) {
initialize();
}
// Export for testing
if (typeof module !== "undefined" && module.exports) {
module.exports = {
PrivacyManager: PrivacyManagerInfo,
TabManager,
RouterManager,
UIManager,
ClickHandler,
CONFIG,
};
}

8
irc.js Normal file
View File

@@ -0,0 +1,8 @@
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");
}
}
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

After

Width:  |  Height:  |  Size: 97 KiB

View File

@@ -10,7 +10,7 @@
</title>
</head>
<body>
<div id="browserpanel">
<div id="browserpanel" class="content">
<div class="panel">
<div class="section-header panel-section panel-section-header" id="headline">
<div class="text-section-header" id="text-section-header">

View File

@@ -1,8 +1,8 @@
function gotCurrent(tab) {
function gotTitle(title) {
let addr = title;
document.getElementById('TypeInfo').innerHTML =
'<div class="AddressInfo"><a href="' + addr + '">' + addr + '</a></div>';
document.getElementById("TypeInfo").innerHTML =
'<div class="AddressInfo"><a href="' + addr + '">' + addr + "</a></div>";
}
console.log(tab);
var gettingTitle = browser.pageAction.getTitle({

View File

@@ -1,8 +1,8 @@
{
"applications": {
"browser_specific_settings": {
"gecko": {
"id": "i2ppb@eyedeekay.github.io",
"strict_min_version": "60.0"
"strict_min_version": "91.1.0"
}
},
"permissions": [
@@ -27,7 +27,7 @@
],
"manifest_version": 2,
"name": "__MSG_extensionName__",
"version": "0.91",
"version": "2.8.0",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox",
"icons": {
@@ -37,19 +37,13 @@
"browser_style": true,
"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
"default_popup": "window.html",
"default_area": "navbar"
},
"page_action": {
"browser_style": true,
"default_title": "__MSG_toopieTLS__",
"default_icon": "icons/toopie.png",
"default_icon": "icons/i2plogo.png",
"show_matches": [
"http://*.i2p/*",
"https://*.i2p/*",
@@ -68,12 +62,10 @@
}
],
"background": {
"persistent": true,
"persistent": false,
"scripts": [
"options/options.js",
"config.js",
"torrent/common.js",
"torrent/background.js",
"i2pcontrol/i2pcontrol.js",
"host.js",
"privacy.js",
"platform.js",
@@ -98,5 +90,11 @@
"uriTemplate": "http://127.0.0.1:7657/i2psnark/?nofilter_newURL=%s&action=Add&foo=Add+torrent"
}
],
"default_locale": "en"
"default_locale": "en",
"chrome_settings_overrides": {
"homepage": "home.html"
},
"chrome_url_overrides": {
"newtab": "home.html"
}
}

BIN
menu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 300 KiB

152
messages.js Normal file
View File

@@ -0,0 +1,152 @@
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("CertLabel", "CertLabel");
contentUpdateById("SignedLabel", "SignedLabel");
contentUpdateById("TorrentTypeLabel", "TorrentTypeLabel");
contentUpdateById("TypeLabel", "TypeLabel");
contentUpdateById("aboutconsole", "aboutconsole");
contentUpdateById("abouthome", "abouthome");
contentUpdateById("addresstype", "addresstype");
contentUpdateById("applicationExplain", "applicationExplain");
contentUpdateById("applicationHeader", "applicationHeader");
contentUpdateById("beta", "beta");
contentUpdateById("bookmarksButton", "bookmarksButton");
contentUpdateById("btRpcHostText", "btRpcHostText");
contentUpdateById("btRpcPathText", "btRpcPathText");
contentUpdateById("btRpcPortText", "btRpcPortText");
contentUpdateById("controlExplain", "controlExplain");
contentUpdateById("controlHeader", "controlHeader");
contentUpdateById("controlHelpText", "controlHelpText");
contentUpdateById("controlHostText", "controlHostText");
contentUpdateById("controlPortText", "controlPortText");
contentUpdateById("description", "description");
contentUpdateById("description2", "description2");
contentUpdateById("fliplinks", "fliplinks");
contentUpdateById("headline", "headline");
contentUpdateById("histDesc", "histDesc");
contentUpdateById("hostText", "hostText");
contentUpdateById("i2ppage", "i2ppage");
contentUpdateById("i2ptunnel", "i2ptunnel");
contentUpdateById("label-router-activepeers", "label-router-activepeers");
contentUpdateById("label-router-bandwidth", "label-router-bandwidth");
contentUpdateById("label-router-bw-inbound-15s", "label-router-bw-inbound-15s");
contentUpdateById("label-router-bw-inbound-1s", "label-router-bw-inbound-1s");
contentUpdateById(
"label-router-bw-outbound-15s",
"label-router-bw-outbound-15s"
);
contentUpdateById("label-router-bw-outbound-1s", "label-router-bw-outbound-1s");
contentUpdateById(
"label-router-net-tunnels-participating",
"label-router-net-tunnels-participating"
);
contentUpdateById(
"label-router-netdb-fastpeers",
"label-router-netdb-fastpeers"
);
contentUpdateById(
"label-router-netdb-highcapacitypeers",
"label-router-netdb-highcapacitypeers"
);
contentUpdateById(
"label-router-netdb-isreseeding",
"label-router-netdb-isreseeding"
);
contentUpdateById(
"label-router-netdb-knownpeers",
"label-router-netdb-knownpeers"
);
contentUpdateById("label-router-peers", "label-router-peers");
contentUpdateById("label-router-status", "label-router-status");
contentUpdateById("label-router-uptime", "label-router-uptime");
contentUpdateById("label-router-version", "label-router-version");
contentUpdateById("links", "links");
contentUpdateById("linksExplain", "linksExplain");
contentUpdateById("onboardingButtonFive", "onboardingButtonFive");
contentUpdateById("onboardingButtonFour", "onboardingButtonFour");
contentUpdateById("onboardingButtonOne", "onboardingButtonOne");
contentUpdateById("onboardingButtonThree", "onboardingButtonThree");
contentUpdateById("onboardingButtonTwo", "onboardingButtonTwo");
contentUpdateById("onboardingButtonZero", "onboardingButtonZero");
contentUpdateById("onboardingContentFive", "onboardingContentFive");
contentUpdateById("onboardingContentFour", "onboardingContentFour");
contentUpdateById("onboardingContentOne", "onboardingContentOne");
contentUpdateById("onboardingContentThree", "onboardingContentThree");
contentUpdateById("onboardingContentTwo", "onboardingContentTwo");
contentUpdateById("onboardingContentZero", "onboardingContentZero");
contentUpdateById("onboardingFive", "onboardingFive");
contentUpdateById("onboardingFour", "onboardingFour");
contentUpdateById("onboardingOne", "onboardingOne");
contentUpdateById("onboardingThree", "onboardingThree");
contentUpdateById("onboardingTitle", "onboardingTitle");
contentUpdateById("onboardingTwo", "onboardingTwo");
contentUpdateById("onboardingZero", "onboardingZero");
contentUpdateById("portText", "portText");
contentUpdateById("proxy-check", "proxy-check");
contentUpdateById("releases", "releases");
contentUpdateById("returnhome", "returnhome");
contentUpdateById("router-net-bw-inbound-15s", "router-net-bw-inbound-15s");
contentUpdateById("router-net-bw-inbound-1s", "router-net-bw-inbound-1s");
contentUpdateById("router-net-bw-outbound-15s", "router-net-bw-outbound-15s");
contentUpdateById("router-net-bw-outbound-1s", "router-net-bw-outbound-1s");
contentUpdateById(
"router-net-tunnels-participating",
"router-net-tunnels-participating"
);
contentUpdateById("router-netdb-activepeers", "router-netdb-activepeers");
contentUpdateById("router-netdb-fastpeers", "router-netdb-fastpeers");
contentUpdateById(
"router-netdb-highcapacitypeers",
"router-netdb-highcapacitypeers"
);
contentUpdateById("router-netdb-isreseeding", "router-netdb-isreseeding");
contentUpdateById("router-netdb-knownpeers", "router-netdb-knownpeers");
contentUpdateById("router-restart", "router-restart");
contentUpdateById("router-shutdown", "router-shutdown");
contentUpdateById("router-status", "router-status");
contentUpdateById("router-uptime", "router-uptime");
contentUpdateById("router-version", "router-version");
contentUpdateById("routerConsole", "routerConsole");
contentUpdateById("rpcHelpText", "rpcHelpText");
contentUpdateById("rpcHostText", "rpcHostText");
contentUpdateById("rpcPassText", "rpcPassText");
contentUpdateById("rpcPathText", "rpcPathText");
contentUpdateById("rpcPortText", "rpcPortText");
contentUpdateById("signingcert", "signingcert");
contentUpdateById("sitecert", "sitecert");
contentUpdateById("snark", "snark");
contentUpdateById("sourcehead", "sourcehead");
contentUpdateById("sources", "sources");
contentUpdateById("susimail", "susimail");
contentUpdateById("text-section-header", "text-section-header");
contentUpdateById(
"text-section-proxyerr-header",
"text-section-proxyerr-header"
);
contentUpdateById(
"text-section-torrents-header",
"text-section-torrents-header"
);
contentUpdateById("toopie", "toopie");
contentUpdateById("torrentui-opener", "torrentui-opener");
contentUpdateById("visit-irc", "visit-irc");
contentUpdateById("webpage", "webpage");
contentUpdateById("window-visit-console", "window-visit-console");
contentUpdateById("window-visit-help", "window-visit-help");
contentUpdateById("window-visit-homepage", "window-visit-homepage");
contentUpdateById("window-visit-i2p", "window-visit-i2p");
contentUpdateById("window-visit-i2ptunnel", "window-visit-i2ptunnel");
contentUpdateById("window-visit-index", "window-visit-index");
contentUpdateById("window-visit-releases", "window-visit-releases");
contentUpdateById("window-visit-router", "window-visit-router");
contentUpdateById("window-visit-snark", "window-visit-snark");
contentUpdateById("window-visit-sources", "window-visit-sources");
contentUpdateById("window-visit-susimail", "window-visit-susimail");
contentUpdateById("window-visit-torrent", "window-visit-torrent");

View File

@@ -53,40 +53,6 @@
<label id="controlHostText">Console Port:</label> <input data="controlport" id="controlport" type="text" value="7657">
</div>
</section>
<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>
<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>

View File

@@ -1,461 +1,311 @@
function SetBookButton() {
// var bmid = document.getElementById("bookmark");
//bmid.textContent = chrome.i18n.getMessage("bookmarkButton");
}
/**
* @fileoverview I2P Browser Extension Options Management
* Handles proxy configuration and UI settings for I2P container contexts
*/
function SetHostText() {
var hostid = document.getElementById('hostText');
hostid.textContent = chrome.i18n.getMessage('hostText');
}
// Constants and Types
const DEFAULT_SETTINGS = {
proxy_scheme: 'http',
proxy_host: '127.0.0.1',
proxy_port: 4444,
control_host: '127.0.0.1',
control_port: 7657,
bookmarks_state: false,
};
function SetPortText() {
var portid = document.getElementById('portText');
portid.textContent = chrome.i18n.getMessage('portText');
}
function SetPortHelpText() {
var portid = document.getElementById('proxyHelpText');
portid.textContent = chrome.i18n.getMessage('proxyHelpText');
}
function SetControlHostText() {
var controlhostid = document.getElementById('controlHostText');
controlhostid.textContent = chrome.i18n.getMessage('controlHostText');
}
function SetControlPortText() {
var controlportid = document.getElementById('controlPortText');
controlportid.textContent = chrome.i18n.getMessage('controlPortText');
}
function SetControlHelpText() {
var portid = document.getElementById('controlHelpText');
portid.textContent = chrome.i18n.getMessage('controlHelpText');
}
function getBookmarksCreated() {
bookmarks_state = document.getElementById('bookmarks').value;
console.log('(options)Got i2p bookmarks state:', bookmarks_state);
if (bookmarks_state == undefined) {
return false;
}
if (bookmarks_state == 'false') {
return false;
}
if (bookmarks_state == 'true') {
return true;
}
return false;
}
function getScheme() {
/**
* Gets proxy scheme from HTML select element
* @return {string}
*/
function getFromHTMLValueScheme() {
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) return 'http';
switch (proxy_scheme.value.toLowerCase()) {
case 'http':
case 'socks':
return proxy_scheme.value.toLowerCase();
default:
return 'http';
}
if (proxy_scheme.value == 'SOCKS') {
return 'socks';
}
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('(options)Got i2p proxy host:', proxy_host);
if (proxy_host == undefined) {
return '127.0.0.1';
}
return proxy_host;
}
/**
* Checks stored settings and applies defaults if necessary
* @param {Object} storedSettings
* @return {Promise<Object>}
*/
async function checkStoredSettings(storedSettings) {
try {
const proxyInfo = await browser.proxy.settings.get({});
const { http } = proxyInfo.value;
function getPort() {
proxy_port = document.getElementById('port').value;
console.log('(options)Got i2p proxy port:', proxy_port);
if (proxy_port == undefined) {
return '4444';
}
return proxy_port;
}
function getControlHost() {
control_host = document.getElementById('controlhost').value;
console.log('(options)Got i2p control host:', control_host);
if (control_host == undefined) {
return '127.0.0.1';
}
return control_host;
}
function getControlPort() {
control_port = document.getElementById('controlport').value;
console.log('(options)Got i2p control port:', control_port);
if (control_port == undefined) {
return '4444';
}
return control_port;
}
function getRPCHost() {
rpc_host = document.getElementById('rpchost').value;
console.log('(options)Got i2pcontrol rpc host:', rpc_host);
if (rpc_host == undefined) {
return '127.0.0.1';
}
return rpc_host;
}
function getRPCPort() {
rpc_port = document.getElementById('rpcport').value;
console.log('(options)Got i2pcontrol rpc port:', rpc_port);
if (rpc_port == undefined) {
return '7657';
}
return rpc_port;
}
function getRPCPath() {
rpc_path = document.getElementById('rpcpath').value;
console.log('(options)Got i2pcontrol rpc path:', rpc_path);
if (rpc_path == undefined) {
return 'jsonrpc';
}
return rpc_path;
}
function getRPCPass() {
rpc_pass = document.getElementById('rpcpass').value;
console.log('(options)Got i2pcontrol rpc password:');
if (rpc_pass == undefined) {
return 'itoopie';
}
return rpc_pass;
}
function getBTRPCHost() {
bt_rpc_host = document.getElementById('btrpchost').value;
console.log('(options)Got torrent rpc host:', bt_rpc_host);
if (bt_rpc_host == undefined) {
return '127.0.0.1';
}
return bt_rpc_host;
}
function getBTRPCPort() {
bt_rpc_port = document.getElementById('btrpcport').value;
console.log('(options)Got torrent rpc port:', bt_rpc_port);
if (bt_rpc_port == undefined) {
return '7657';
}
return bt_rpc_port;
}
function getBTRPCPath() {
bt_rpc_path = document.getElementById('btrpcpath').value;
console.log('(options)Got torrent rpc path:', bt_rpc_path);
if (bt_rpc_path == undefined) {
return 'transmission/rpc';
}
return bt_rpc_path;
}
function getBTRPCPass() {
bt_rpc_pass = document.getElementById('btrpcpass').value;
console.log('(options)Got torrent rpc password:');
if (bt_rpc_pass == undefined) {
return 'itoopie';
}
return bt_rpc_pass;
}
function checkStoredSettings(storedSettings) {
function gotProxyInfo(info) {
let defaultSettings = {};
let host = info.value.http.split(':')[0];
let port = info.value.http.split(':')[1];
if (port != 7644) {
port = undefined;
if (!http) {
return DEFAULT_SETTINGS;
}
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;
const[host, portStr] = http.split(":");
const port = parseInt(portStr);
if (!storedSettings['control_host']) {
if (host == '') defaultSettings['control_host'] = '127.0.0.1';
else defaultSettings['control_host'] = host;
} else defaultSettings['control_host'] = storedSettings.control_host;
if (!storedSettings['control_port']) {
defaultSettings['control_port'] = 7657;
} else defaultSettings['control_port'] = storedSettings.control_port;
if (!storedSettings['rpc_host']) {
if (host == '') defaultSettings['rpc_host'] = '127.0.0.1';
else defaultSettings['rpc_host'] = host;
} else defaultSettings['rpc_host'] = storedSettings.rpc_host;
if (!storedSettings['rpc_port']) {
defaultSettings['rpc_port'] = 7657;
} else defaultSettings['rpc_port'] = storedSettings.rpc_port;
if (!storedSettings['rpc_path']) {
defaultSettings['rpc_path'] = 'jsonrpc';
} else defaultSettings['rpc_path'] = storedSettings.rpc_path;
if (!storedSettings['rpc_pass']) {
defaultSettings['rpc_pass'] = 'itoopie';
} else defaultSettings['rpc_pass'] = storedSettings.rpc_pass;
if (!storedSettings['bt_rpc_host']) {
if (host == '') defaultSettings['bt_rpc_host'] = '127.0.0.1';
else defaultSettings['bt_rpc_host'] = host;
} else defaultSettings['bt_rpc_host'] = storedSettings.bt_rpc_host;
if (!storedSettings['bt_rpc_port']) {
defaultSettings['bt_rpc_port'] = 7657;
} else defaultSettings['bt_rpc_port'] = storedSettings.bt_rpc_port;
if (!storedSettings['bt_rpc_path']) {
defaultSettings['bt_rpc_path'] = 'transmission/';
} else defaultSettings['bt_rpc_path'] = storedSettings.bt_rpc_path;
if (!storedSettings['bt_rpc_pass']) {
defaultSettings['bt_rpc_pass'] = 'transmission';
} else defaultSettings['bt_rpc_pass'] = storedSettings.bt_rpc_pass;
console.log('(options)(browserinfo) NATIVE PROXYSETTINGS', info.value);
defaultSettings['base_url'] =
'http://' +
defaultSettings['bt_rpc_host'] +
':' +
defaultSettings['bt_rpc_port'] +
'/' +
defaultSettings['bt_rpc_path'];
console.log(
'(options)',
defaultSettings['proxy_scheme'],
defaultSettings['proxy_host'],
defaultSettings['proxy_port'],
defaultSettings['control_host'],
defaultSettings['control_port'],
defaultSettings['base_url']
);
chrome.storage.local.set(defaultSettings);
return defaultSettings;
return {
bookmarks_state: storedSettings.bookmarks_state || false,
proxy_scheme: storedSettings.proxy_scheme || "http",
proxy_host: storedSettings.proxy_host || host || "127.0.0.1",
proxy_port: storedSettings.proxy_port || (port === 7644 ? port : 4444),
control_host: storedSettings.control_host || host || "127.0.0.1",
control_port: storedSettings.control_port || 7657,
};
} catch (error) {
console.error("Error in checkStoredSettings:", error);
return DEFAULT_SETTINGS;
}
var gettingInfo = browser.proxy.settings.get({});
return gettingInfo.then(gotProxyInfo);
}
function checkAndroidStoredSettings(storedSettings) {
let defaultSettings = {};
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'];
/**
* Checks and applies Android-specific stored settings
* @param {Object} settings
* @returns {Object}
*/
function checkAndroidStoredSettings(settings) {
const mergedSettings = {
...DEFAULT_SETTINGS,
...settings,
};
if (!storedSettings['proxy_port']) {
if (port == undefined) defaultSettings['proxy_port'] = 4444;
else if (port == 7644) defaultSettings['proxy_port'] = port;
else defaultSettings['proxy_port'] = 4444;
} else defaultSettings['proxy_port'] = storedSettings.proxy_port;
if (!storedSettings['control_host']) {
if (host == '') defaultSettings['control_host'] = '127.0.0.1';
else defaultSettings['control_host'] = host;
} else defaultSettings['control_host'] = storedSettings.control_host;
if (!storedSettings['control_port']) {
defaultSettings['control_port'] = 7657;
} else defaultSettings['control_port'] = storedSettings.control_port;
if (!storedSettings['rpc_host']) {
if (host == '') defaultSettings['rpc_host'] = '127.0.0.1';
else defaultSettings['rpc_host'] = host;
} else defaultSettings['rpc_host'] = storedSettings.rpc_host;
if (!storedSettings['rpc_port']) {
defaultSettings['rpc_port'] = 7657;
} else defaultSettings['rpc_port'] = storedSettings.rpc_port;
if (!storedSettings['rpc_path']) {
defaultSettings['rpc_path'] = 'jsonrpc';
} else defaultSettings['rpc_path'] = storedSettings.rpc_path;
if (!storedSettings['rpc_pass']) {
defaultSettings['rpc_pass'] = 'itoopie';
} else defaultSettings['rpc_pass'] = storedSettings.rpc_pass;
if (!storedSettings['bt_rpc_host']) {
if (host == '') defaultSettings['bt_rpc_host'] = '127.0.0.1';
else defaultSettings['bt_rpc_host'] = host;
} else defaultSettings['bt_rpc_host'] = storedSettings.bt_rpc_host;
if (!storedSettings['bt_rpc_port']) {
defaultSettings['bt_rpc_port'] = 7657;
} else defaultSettings['bt_rpc_port'] = storedSettings.bt_rpc_port;
if (!storedSettings['bt_rpc_path']) {
defaultSettings['bt_rpc_path'] = 'transmission/rpc';
} else defaultSettings['bt_rpc_path'] = storedSettings.bt_rpc_path;
if (!storedSettings['bt_rpc_pass']) {
defaultSettings['bt_rpc_pass'] = 'transmission';
} else defaultSettings['bt_rpc_pass'] = storedSettings.bt_rpc_pass;
console.log('(options)(browserinfo) NATIVE PROXYSETTINGS', info.value);
console.log(
'(options)',
defaultSettings['proxy_scheme'],
defaultSettings['proxy_host'],
defaultSettings['proxy_port'],
defaultSettings['control_host'],
defaultSettings['control_port']
);
chrome.storage.local.set(defaultSettings);
return defaultSettings;
}
function onError(e) {
console.error(e);
}
function storeSettings() {
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');
if (selectList != undefined) selectList.value = restoredSettings.proxy_scheme;
//console.log("(options)showing proxy scheme:", selectList.value);
console.log(restoredSettings);
const bms = document.getElementById('bookmarksState');
if (bms != undefined) bms.checked = restoredSettings.bookmarks_state;
const hostitem = document.getElementById('host');
if (hostitem != undefined) hostitem.value = restoredSettings.proxy_host;
//console.log("(options)showing proxy host:", hostitem.value);
const portitem = document.getElementById('port');
if (portitem != undefined) portitem.value = restoredSettings.proxy_port;
//console.log("(options)showing proxy port:", portitem.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();
}
function onError(e) {
console.error(e);
}
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os != 'android') {
chrome.storage.local.get(function(got) {
let settings = checkStoredSettings(got);
settings.then(updateUI);
});
} else {
chrome.storage.local.get(function(got) {
checkAndroidStoredSettings(got);
updateUI(got);
});
// Determine correct proxy port with clear logic
function determineProxyPort(port) {
if (!port) {
return 4444;
}
if (port === 7644) {
return 7644;
}
return 4444;
}
});
const saveButton = document.querySelector('#save-button');
saveButton.addEventListener('click', storeSettings);
mergedSettings.proxy_port = determineProxyPort(mergedSettings.proxy_port);
console.info("Android settings merged:", mergedSettings);
chrome.storage.local.set(mergedSettings);
return mergedSettings;
}
/**
* Updates UI text elements with localized messages
*/
function initializeUI() {
const textElements = [
{ id: "hostText", msgKey: "hostText" },
{ id: "portText", msgKey: "portText" },
{ id: "proxyHelpText", msgKey: "proxyHelpText" },
{ id: "controlHostText", msgKey: "controlHostText" },
{ id: "controlPortText", msgKey: "controlPortText" },
{ id: "controlHelpText", msgKey: "controlHelpText" },
];
textElements.forEach(({ id, msgKey }) => {
const element = document.getElementById(id);
if (element) {
element.textContent = chrome.i18n.getMessage(msgKey);
}
});
}
/**
* Updates UI elements with stored settings
* @param {Object} settings
*/
function updateUI(settings) {
const elements = {
proxy_scheme: document.querySelector("#proxy_scheme"),
bookmarks_state: document.getElementById("bookmarksState"),
host: document.getElementById("host"),
port: document.getElementById("port"),
controlhost: document.getElementById("controlhost"),
controlport: document.getElementById("controlport"),
};
Object.entries(elements).forEach(([key, element]) => {
if (element === null || element === undefined) {
return;
}
if (element.type === "checkbox") {
element.checked = settings[key];
} else {
element.value = settings[key];
}
});
initializeUI();
}
/**
* Gets value from element with fallback to default
* @param {HTMLElement|null} element
* @param {string|number} defaultValue
* @returns {string|number}
*/
function getElementValueWithDefault(element, defaultValue) {
if (!element) {
return defaultValue;
}
return element.value || defaultValue;
}
/**
* Gets numeric value from element with fallback to default
* @param {HTMLElement|null} element
* @param {number} defaultValue
* @returns {number}
*/
function getNumericValueWithDefault(element, defaultValue) {
if (!element || !element.value) {
return defaultValue;
}
return parseInt(element.value) || defaultValue;
}
/**
* Stores current settings to browser storage
* @returns {Promise<void>}
*/
async function storeSettings() {
const elements = {
host: document.getElementById("host"),
port: document.getElementById("port"),
controlhost: document.getElementById("controlhost"),
controlport: document.getElementById("controlport"),
bookmarks: document.getElementById("bookmarksState"),
};
const settings = {
proxy_scheme: getFromHTMLValueScheme(),
proxy_host: getElementValueWithDefault(
elements.host,
DEFAULT_SETTINGS.proxy_host
),
proxy_port: getNumericValueWithDefault(
elements.port,
DEFAULT_SETTINGS.proxy_port
),
control_host: getElementValueWithDefault(
elements.controlhost,
DEFAULT_SETTINGS.control_host
),
control_port: getNumericValueWithDefault(
elements.controlport,
DEFAULT_SETTINGS.control_port
),
bookmarks_state: elements.bookmarks ? elements.bookmarks.checked : false,
};
try {
await browser.storage.local.set(settings);
console.info("Settings stored successfully:", settings);
} catch (error) {
console.error("Failed to store settings:", error);
throw error;
}
}
/**
* Error handler for async operations
* @param {Error} error
*/
function onError(error) {
console.error("Operation failed:", error);
}
/**
* Initializes settings based on platform
*/
async function initializeSettings() {
try {
const platform = await browser.runtime.getPlatformInfo();
if (platform.os === "android") {
chrome.storage.local.get(function (gotSettings) {
const settings = checkAndroidStoredSettings(gotSettings);
updateUI(settings);
});
} else {
chrome.storage.local.get(function (gotSettings) {
checkStoredSettings(gotSettings).then(updateUI).catch(onError);
});
}
} catch (error) {
console.error("Platform detection failed:", error);
onError(error);
}
}
/**
* Retrieves a setting from local storage
* @param {string} key - The key to retrieve
* @param {any} defaultValue - Default value if key doesn't exist
* @returns {any} The stored value or default value
*/
function getSetting(key, defaultValue) {
try {
const value = localStorage.getItem(key);
if (value === null || value === undefined) {
return defaultValue;
}
return value;
} catch (error) {
console.error(`Failed to get setting: ${key}`, error);
return defaultValue;
}
}
function getFromStorageProxyScheme() {
return getSetting("proxy_scheme", DEFAULT_SETTINGS.proxy_scheme);
}
function getFromStorageHost() {
return getSetting("proxy_host", DEFAULT_SETTINGS.proxy_host);
}
function getFromStoragePort() {
return getSetting("proxy_port", DEFAULT_SETTINGS.proxy_port);
}
function getFromStorageControlHost() {
return getSetting("control_host", DEFAULT_SETTINGS.control_host);
}
function getFromStorageControlPort() {
return getSetting("control_port", DEFAULT_SETTINGS.control_port);
}
function getFromStorageRPCHost() {
return getSetting("rpc_host", DEFAULT_SETTINGS.rpc_host);
}
function getFromStorageRPCPort() {
return getSetting("rpc_port", DEFAULT_SETTINGS.rpc_port);
}
function getFromStorageRPCPath() {
return getSetting("rpc_path", DEFAULT_SETTINGS.rpc_path);
}
function getFromStorageRPCPass() {
return getSetting("rpc_pass", DEFAULT_SETTINGS.rpc_pass);
}
function getFromStorageBTRPCHost() {
return getSetting("bt_rpc_host", DEFAULT_SETTINGS.bt_rpc_host);
}
function getFromStorageBTRPCPort() {
return getSetting("bt_rpc_port", DEFAULT_SETTINGS.bt_rpc_port);
}
function getFromStorageBTRPCPath() {
return getSetting("bt_rpc_path", DEFAULT_SETTINGS.bt_rpc_path);
}
function getFromStorageBTRPCPass() {
return getSetting("bt_rpc_pass", DEFAULT_SETTINGS.bt_rpc_pass);
}
function getFromStorageBookmarksState() {
return getSetting("bookmarks_state", DEFAULT_SETTINGS.bookmarks_state);
}
// Event Listeners
const saveButton = document.querySelector("#save-button");
if (saveButton) {
saveButton.addEventListener("click", storeSettings);
}
document.addEventListener("DOMContentLoaded", initializeSettings);

View File

@@ -1,26 +1,132 @@
var android = false;
/**
* @fileoverview I2P Platform Detection Manager
* Handles platform detection and feature support for Firefox WebExtensions
*/
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == 'android') {
console.log('Running in Android detected');
android = true;
return true;
} else {
console.log('Running in Desktop detected');
android = false;
return false;
}
});
// Platform configuration constants
const PLATFORM_CONFIG = {
PLATFORMS: {
ANDROID: "android",
DESKTOP: "desktop",
},
FEATURES: {
CLOSABLE: "closable",
CONTAINER_TABS: "containerTabs",
SIDEBAR: "sidebar",
},
};
function isDroid() {
console.log('android?', android);
if (android == undefined) {
return false;
/**
* Platform Manager for handling platform-specific functionality
*/
class PlatformManager {
constructor() {
// Platform state
this.platformState = {
isAndroid: false,
isInitialized: false,
};
// Initialize platform detection
this.initialize();
}
/**
* Initialize platform detection
* @private
* @return {Promise<void>}
*/
async initialize() {
try {
const platformInfo = await browser.runtime.getPlatformInfo();
this.platformState.isAndroid =
platformInfo.os === PLATFORM_CONFIG.PLATFORMS.ANDROID;
this.platformState.isInitialized = true;
console.info(
`(platform) Running in ${
this.platformState.isAndroid ? "Android" : "Desktop"
} detected`
);
} catch (error) {
console.error("Platform detection failed:", error);
this.platformState.isAndroid = false;
this.platformState.isInitialized = true;
}
}
/**
* Check if running on Android
* @return {boolean}
*/
isAndroid() {
if (!this.platformState.isInitialized) {
console.warn("Platform detection not yet initialized");
return false;
}
return this.platformState.isAndroid;
}
/**
* Check if running on Desktop
* @return {boolean}
*/
isDesktop() {
return !this.isAndroid();
}
/**
* Check if windows are closable
* @return {boolean}
*/
isClosable() {
return this.isDesktop();
}
/**
* Get current platform state
* @return {Object}
*/
getPlatformState() {
return { ...this.platformState };
}
return android;
}
function notClosable() {
return false;
// Create singleton instance
const platformManager = new PlatformManager();
/**
* Legacy API compatibility layer
*/
const PlatformAPI = {
/**
* Check if running on Android (legacy support)
* @return {boolean}
*/
isDroid() {
const isAndroid = platformManager.isAndroid();
console.log("(platform) android?", isAndroid);
return isAndroid;
},
/**
* Check if windows are not closable (legacy support)
* @return {boolean}
*/
notClosable() {
return !platformManager.isClosable();
},
};
// Export legacy API functions to window
window.isDroid = PlatformAPI.isDroid;
window.notClosable = PlatformAPI.notClosable;
// Export for testing
if (typeof module !== "undefined" && module.exports) {
module.exports = {
platformManager,
PLATFORM_CONFIG,
PlatformAPI,
};
}

View File

@@ -1,504 +1,364 @@
var titlepref = chrome.i18n.getMessage('titlePreface');
/**
* @fileoverview I2P Privacy Manager
* Handles Firefox privacy settings and data cleanup for I2P container tabs
*/
function onSet(result) {
if (result) {
console.log('->: Value was updated');
} else {
console.log('-X: Value was not updated');
}
}
/* This disables queries to centralized databases of bad URLs to screen for
risky sites in your browser */
function disableHyperlinkAuditing() {
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.set({
value: false,
});
console.log('Disabling hyperlink auditing/val=', {
value: false,
});
setting.then(onSet);
}
// UNINSTALL ONLY
function enableHyperlinkAuditing() {
var setting = browser.privacy.websites.hyperlinkAuditingEnabled.clear();
console.log('Disabling hyperlink auditing/val=', {
value: false,
});
setting.then(onSet);
}
// This enables first-party isolation
function enableFirstPartyIsolation() {
var setting = browser.privacy.websites.firstPartyIsolate.set({
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);
}
/* This rejects tracking cookies and third-party cookies but it
LEAVES "Persistent" Cookies unmodified in favor of an option in the content
interface for now */
function disableEvilCookies() {
var getting = browser.privacy.websites.cookieConfig.get({});
getting.then((got) => {
var setting = browser.privacy.websites.cookieConfig.set({
value: {
behavior: 'reject_third_party',
nonPersistentCookies: got.value.nonPersistentCookies,
},
});
console.log('Setting cookie behavior/val=', {
value: {
behavior: 'reject_third_party',
nonPersistentCookies: got.value.nonPersistentCookies,
},
});
setting.then(onSet);
});
}
function enableEvilCookies() {
var getting = browser.privacy.websites.cookieConfig.clear();
}
// Make sure that they're gone
/*function disableBadCookies(){
var setting = browser.privacy.websites.thirdPartyCookiesAllowed.set({
value: false
});
console.log("Disabling third party cookies/val=", {
value: false
})
setting.then(onSet);
}*/
// this disables the use of referrer headers
function disableReferrers() {
var setting = browser.privacy.websites.referrersEnabled.set({
value: false,
});
console.log("Disabling referrer headers/val=", {
value: false,
});
setting.then(onSet);
}
// UNINSATALL ONLY
function enableReferrers() {
var setting = browser.privacy.websites.referrersEnabled.clear();
console.log("Disabling referrer headers/val=", {
value: false,
});
setting.then(onSet);
}
// enable fingerprinting resistent features(letterboxing and stuff)
function enableResistFingerprinting() {
var setting = browser.privacy.websites.resistFingerprinting.set({
value: true,
});
console.log("Enabling resist fingerprinting/val=", {
value: true,
});
setting.then(onSet);
}
// UNINSTALL ONLY
function disableResistFingerprinting() {
var setting = browser.privacy.websites.resistFingerprinting.clear();
console.log("Enabling resist fingerprinting/val=", {
value: false,
});
setting.then(onSet);
}
// This is essentially a blocklist of clearnet web-sites known to do bad tracking
function enableTrackingProtection() {
var setting = browser.privacy.websites.trackingProtectionMode.set({
value: "always",
});
console.log("Enabling tracking protection/val=", {
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);
}
/* This disables protected content, which is a form of digital restrictions
management dependent on identifying information */
function disableDigitalRestrictionsManagement() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.set({
value: false,
});
console.log(
"Setting Protected Content(Digital Restrictions Management) false/val=",
{
value: false,
}
);
setting.then(onSet);
}
});
}
// UNINSTALL ONLY
function disableDigitalRestrictionsManagement() {
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os == "win") {
var setting = browser.privacy.websites.protectedContentEnabled.clear();
console.log(
"Setting Protected Content(Digital Restrictions Management) false/val=",
{
value: true,
}
);
setting.then(onSet);
}
});
}
function unsetAllPrivacy() {
enableHyperlinkAuditing();
disableFirstPartyIsolation();
enableEvilCookies();
enableReferrers();
disableTrackingProtection();
disableResistFingerprinting();
enableDigitalRestrictionsManagement();
UnsetPeerConnection();
EnableSavePasswords();
}
browser.management.onUninstalled.addListener((info) => {
function gotSelf(selfinfo) {
if (info.name == selfinfo.name) {
unsetAllPrivacy();
}
}
var gettingSelf = browser.management.getSelf();
gettingSelf.then(gotSelf);
});
function setAllPrivacy() {
disableHyperlinkAuditing();
enableFirstPartyIsolation();
disableEvilCookies();
disableReferrers();
enableTrackingProtection();
enableResistFingerprinting();
disableDigitalRestrictionsManagement();
}
setAllPrivacy();
function ResetPeerConnection() {
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: true,
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp",
});
}
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) => {
if (got.os == "android") {
browser.tabs.onCreated.addListener(ResetPeerConnection);
} else {
browser.windows.onCreated.addListener(ResetPeerConnection);
}
});
//AssurePeerConnection();
function ResetDisableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.set({
value: false,
});
console.log("Re-disabled saved passwords");
}
function EnableSavePasswords() {
browser.privacy.services.passwordSavingEnabled.clear();
console.log("Enabled saved passwords");
}
//ResetDisableSavePasswords()
var defaultSettings = {
since: "forever",
dataTypes: ["downloads", "passwords", "formData", "localStorage", "history"],
const PRIVACY_CONFIG = {
TITLE_PREFACE: chrome.i18n.getMessage("titlePreface"),
SNOWFLAKE_ID: "{b11bea1f-a888-4332-8d8a-cec2be7d24b9}",
WINDOWS: {
OS: "win",
},
BROWSING_DATA: {
SINCE: "forever",
TYPES: ["downloads", "passwords", "formData", "localStorage", "history"],
},
};
function onError(therror) {
console.error(therror);
/**
* Privacy Manager for handling browser privacy settings
*/
class PrivacyManager {
/**
* Set browser privacy settings
* @param {Object} settings Privacy setting configuration
* @return {Promise<boolean>}
*/
static async setSetting(setting, value) {
try {
const result = await setting.set({ value });
console.info(`Privacy setting updated : ${value}`);
return true;
} catch (error) {
console.error("Privacy setting failed:", error);
return false;
}
}
/**
* Configure hyperlink auditing
* @param {boolean} enabled Whether to enable auditing
*/
static async configureHyperlinkAuditing(enabled = false) {
await this.setSetting(
browser.privacy.websites.hyperlinkAuditingEnabled,
enabled
);
}
/**
* Configure first party isolation
* @param {boolean} enabled Whether to enable isolation
*/
static async configureFirstPartyIsolation(enabled = true) {
await this.setSetting(browser.privacy.websites.firstPartyIsolate, enabled);
}
/**
* Configure cookie behavior
* @param {boolean} allowThirdParty Whether to allow third party cookies
*/
static async configureCookies(allowThirdParty = false) {
try {
const cookieConfig = await browser.privacy.websites.cookieConfig.get({});
await browser.privacy.websites.cookieConfig.set({
value: {
behavior: allowThirdParty ? "allow_all" : "reject_third_party",
nonPersistentCookies: cookieConfig.value.nonPersistentCookies,
},
});
} catch (error) {
console.error("Cookie configuration failed:", error);
}
}
/**
* Configure referrer policy
* @param {boolean} enabled Whether to enable referrers
*/
static async configureReferrers(enabled = false) {
await this.setSetting(browser.privacy.websites.referrersEnabled, enabled);
}
/**
* Configure fingerprinting resistance
* @param {boolean} enabled Whether to enable resistance
*/
static async configureFingerprinting(enabled = true) {
await this.setSetting(
browser.privacy.websites.resistFingerprinting,
enabled
);
}
/**
* Configure tracking protection
* @param {boolean} enabled Whether to enable protection
*/
static async configureTrackingProtection(enabled = true) {
await this.setSetting(
browser.privacy.websites.trackingProtectionMode,
enabled ? "always" : "never"
);
}
/**
* Configure DRM content
* @param {boolean} enabled Whether to enable DRM
*/
static async configureDRM(enabled = false) {
const platformInfo = await browser.runtime.getPlatformInfo();
if (platformInfo.os === PRIVACY_CONFIG.WINDOWS.OS) {
await this.setSetting(
browser.privacy.websites.protectedContentEnabled,
enabled
);
}
}
/**
* Configure WebRTC
* @param {boolean} enabled Whether to enable WebRTC
*/
static async configureWebRTC(enabled = false) {
try {
const snowflake = await browser.management.get(
PRIVACY_CONFIG.SNOWFLAKE_ID
);
console.info("Snowflake detected, preserving WebRTC");
return;
} catch {
await this.setSetting(
browser.privacy.network.peerConnectionEnabled,
enabled
);
await this.setSetting(
chrome.privacy.network.webRTCIPHandlingPolicy,
enabled ? "disable_non_proxied_udp" : "default"
);
}
}
/**
* Configure password saving
* @param {boolean} enabled Whether to enable password saving
*/
static async configurePasswordSaving(enabled = false) {
await this.setSetting(
browser.privacy.services.passwordSavingEnabled,
enabled
);
}
/**
* Apply recommended privacy settings
*/
static async applyRecommendedSettings() {
await Promise.all([
this.configureHyperlinkAuditing(false),
this.configureFirstPartyIsolation(true),
this.configureCookies(false),
this.configureFingerprinting(true),
this.configureTrackingProtection(true),
this.configureDRM(false),
this.configureWebRTC(false),
this.configurePasswordSaving(false),
]);
}
/**
* Reset all privacy settings to defaults
*/
static async resetAllSettings() {
await Promise.all([
browser.privacy.websites.hyperlinkAuditingEnabled.clear(),
browser.privacy.websites.firstPartyIsolate.clear(),
browser.privacy.websites.cookieConfig.clear(),
browser.privacy.websites.referrersEnabled.clear(),
browser.privacy.websites.resistFingerprinting.clear(),
browser.privacy.websites.trackingProtectionMode.clear(),
browser.privacy.websites.protectedContentEnabled.clear(),
browser.privacy.network.peerConnectionEnabled.clear(),
browser.privacy.services.passwordSavingEnabled.clear(),
]);
}
}
function forgetBrowsingData(storedSettings) {
function getSince(selectedSince) {
if (selectedSince === "forever") {
return 0;
}
/**
* Data Cleanup Manager for handling browsing data
*/
class DataCleanupManager {
/**
* Clean browsing data for I2P domains
* @param {Object} options Cleanup options
*/
static async cleanBrowsingData(options = {}) {
const since = this.calculateCleanupTime(
options.since || PRIVACY_CONFIG.BROWSING_DATA.SINCE
);
try {
const i2pHistory = await browser.history.search({
text: "i2p",
startTime: 0,
});
for (const item of i2pHistory) {
if (this.isI2PUrl(item.url)) {
await this.cleanupForDomain(item.url, since);
}
}
await this.notifyCleanup();
} catch (error) {
console.error("Data cleanup failed:", error);
}
}
/**
* Calculate cleanup timestamp
* @param {string} timeframe Cleanup timeframe
* @returns {number} Timestamp
*/
static calculateCleanupTime(timeframe) {
const times = {
hour: () => 1000 * 60 * 60,
day: () => 1000 * 60 * 60 * 24,
week: () => 1000 * 60 * 60 * 24 * 7,
forever: () => 0,
};
const sinceMilliseconds = times[selectedSince].call();
return Date.now() - sinceMilliseconds;
return timeframe === "forever"
? 0
: Date.now() - (times[timeframe] || times.forever)();
}
function getTypes(selectedTypes) {
let dataTypes = {};
for (let item of selectedTypes) {
dataTypes[item] = true;
/**
* Clean up data for specific domain
* @param {string} url Domain URL
* @param {number} since Timestamp
*/
static async cleanupForDomain(url, since) {
const hostname = this.extractI2PHostname(url);
await Promise.all([
browser.history.deleteUrl({ url }),
browser.browsingData.removeCache({}),
browser.browsingData.removePasswords({ hostnames: [hostname], since }),
browser.browsingData.removeDownloads({ hostnames: [hostname], since }),
browser.browsingData.removeFormData({ hostnames: [hostname], since }),
browser.browsingData.removeLocalStorage({ hostnames: [hostname], since }),
]);
await this.cleanupContainerCookies(url);
}
/**
* Clean up container cookies
* @param {string} url Domain URL
*/
static async cleanupContainerCookies(url) {
const containers = await browser.contextualIdentities.query({
name: PRIVACY_CONFIG.TITLE_PREFACE,
});
for (const container of containers) {
const cookies = await browser.cookies.getAll({
firstPartyDomain: null,
storeId: container.cookieStoreId,
});
for (const cookie of cookies) {
await browser.cookies.remove({
firstPartyDomain: cookie.firstPartyDomain,
name: cookie.name,
url: url,
});
}
}
return dataTypes;
}
const since = getSince(defaultSettings.since);
const dataTypes = getTypes(defaultSettings.dataTypes);
/**
* Extract I2P hostname from URL
* @param {string} url URL to parse
* @returns {string} I2P hostname
*/
static extractI2PHostname(url) {
try {
const urlObj = new URL(url);
if (urlObj.host.endsWith(".i2p")) {
return urlObj.host;
}
function notify() {
let dataTypesString = Object.keys(dataTypes).join(", ");
let sinceString = new Date(since).toLocaleString();
browser.notifications.create({
if (url.includes(".i2p")) {
const parts = url.split("=");
for (const part of parts) {
const items = part.split("%");
for (const item of items) {
if (item.includes(".i2p")) {
return item.replace("3D", "");
}
}
}
}
return url.split("/")[2] || url.split("/")[0];
} catch (error) {
console.error("Hostname extraction failed:", error);
return "";
}
}
/**
* Check if URL is I2P
* @param {string} url URL to check
* @returns {boolean}
*/
static isI2PUrl(url) {
const hostname = this.extractI2PHostname(url);
return hostname.split(":")[0].endsWith(".i2p");
}
/**
* Send cleanup notification
*/
static async notifyCleanup() {
await browser.notifications.create({
type: "basic",
title: "Removed browsing data",
message: `Removed ${dataTypesString}\n for I2P Browsing`,
message: "Cleaned I2P browsing data and history",
});
}
function deepCleanHistory(historyItems) {
console.log("Deep cleaning history");
for (let item of historyItems) {
if (i2pHost(item.url)) {
browser.history.deleteUrl({
url: item.url,
});
browser.browsingData.removeCache({});
console.log("cleared Cache");
browser.browsingData
.removePasswords({
hostnames: [i2pHostName(item.url)],
since,
})
.then(onContextGotLog);
console.log("cleared Passwords");
browser.browsingData
.removeDownloads({
hostnames: [i2pHostName(item.url)],
since,
})
.then(onContextGotLog);
console.log("cleared Downloads");
browser.browsingData
.removeFormData({
hostnames: [i2pHostName(item.url)],
since,
})
.then(onContextGotLog);
console.log("cleared Form Data");
browser.browsingData
.removeLocalStorage({
hostnames: [i2pHostName(item.url)],
since,
})
.then(onContextGotLog);
console.log("cleared Local Storage");
let contexts = browser.contextualIdentities.query({
name: titlepref,
});
function deepCleanCookies(cookies) {
for (let cookie of cookies) {
var removing = browser.cookies.remove({
firstPartyDomain: cookie.firstPartyDomain,
name: cookie.name,
url: item.url,
});
removing.then(onContextGotLog, onError);
}
console.log("Cleared cookies");
}
function deepCleanContext(cookieStoreIds) {
for (let cookieStoreId of cookieStoreIds) {
var removing = browser.cookies.getAll({
firstPartyDomain: null,
storeId: cookieStoreId.cookieStoreId,
});
removing.then(deepCleanCookies, onError);
}
}
contexts.then(deepCleanContext, onError);
}
}
notify();
}
var searching = browser.history.search({
text: "i2p",
startTime: 0,
});
searching.then(deepCleanHistory);
setAllPrivacy();
ResetPeerConnection();
}
function i2pHostName(url) {
let hostname = "";
console.log("(hosts)", url);
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];
}
return hostname;
}
// Initialize privacy settings
PrivacyManager.applyRecommendedSettings();
function i2pHost(url) {
let hostname = i2pHostName(url);
if (hostname.endsWith(".i2p")) {
console.log("(hostname) i2p", hostname);
// Listen for uninstall
browser.management.onUninstalled.addListener(async (info) => {
const selfInfo = await browser.management.getSelf();
if (info.name === selfInfo.name) {
await PrivacyManager.resetAllSettings();
}
return hostname.endsWith(".i2p");
}
});
function onContextGotLog(contexts) {
if (contexts != null) {
console.log(contexts);
// Listen for messages
browser.runtime.onMessage.addListener(async (message) => {
switch (message.type) {
case "cleanupData":
await DataCleanupManager.cleanBrowsingData(message.options);
break;
case "updatePrivacy":
await PrivacyManager.applyRecommendedSettings();
break;
}
}
});
browser.runtime.onMessage.addListener(message);
function enableHistory() {
function checkStoredSettings(storedSettings) {
storedSettings["disable_history"] = false;
console.log(storedSettings);
function enablehistory(settings) {
console.log("Store History:", settings);
}
let setting = browser.storage.local.set(storedSettings);
setting.then(enablehistory);
}
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(checkStoredSettings, onError);
}
function disableHistory() {
function checkStoredSettings(storedSettings) {
storedSettings["disable_history"] = true;
console.log(storedSettings);
function enablehistory(settings) {
console.log("Store History:", settings);
}
var setting = browser.storage.local.set(storedSettings);
setting.then(enablehistory);
}
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(checkStoredSettings, onError);
}
function message(recieved) {
console.log(recieved);
if (recieved.rtc === "enableWebRTC") {
console.log("enableWebRTC");
AssurePeerConnection();
} else if (recieved.rtc === "disableWebRTC") {
console.log("disableWebRTC");
ResetPeerConnection();
}
if (recieved.history === "enableHistory") {
console.log("enableHistory");
enableHistory();
} else if (recieved.history === "disableHistory") {
console.log("disableHistory");
disableHistory();
}
// Export for testing
if (typeof module !== "undefined" && module.exports) {
module.exports = {
PrivacyManager,
DataCleanupManager,
PRIVACY_CONFIG,
};
}

736
proxy.js
View File

@@ -1,381 +1,405 @@
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');
/**
* @fileoverview I2P Proxy Manager
* Handles proxy configuration and routing for I2P container tabs
*/
browser.privacy.network.peerConnectionEnabled.set({
value: true,
});
// Configuration constants
const PROXY_CONFIG = {
MESSAGES: {
TITLE: chrome.i18n.getMessage("titlePreface"),
WEB: chrome.i18n.getMessage("webPreface"),
ROUTER: chrome.i18n.getMessage("routerPreface"),
MAIL: chrome.i18n.getMessage("mailPreface"),
TORRENT: chrome.i18n.getMessage("torrentPreface"),
TUNNEL: chrome.i18n.getMessage("i2ptunnelPreface"),
IRC: chrome.i18n.getMessage("ircPreface"),
EXTENSION: chrome.i18n.getMessage("extensionPreface"),
MUWIRE: chrome.i18n.getMessage("muwirePreface"),
BOTE: chrome.i18n.getMessage("botePreface"),
BLOG: chrome.i18n.getMessage("blogPreface"),
BLOG_PRIVATE: chrome.i18n.getMessage("blogPrefacePrivate"),
TOR: chrome.i18n.getMessage("torPreface"),
},
PORTS: {
IRC: "7669",
TOR: "7695",
BLOG: "8084",
TORRENT: "7662",
},
};
chrome.privacy.network.networkPredictionEnabled.set({
value: false,
});
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: 'disable_non_proxied_udp',
});
console.log('Disabled unproxied UDP.');
function shouldProxyRequest(requestInfo) {
return requestInfo.parentFrameId != -1;
/**
* Network Manager for handling WebRTC and network prediction
*/
class NetworkManager {
/**
* Initialize network settings
*/
static async initialize() {
try {
await Promise.all([
browser.privacy.network.peerConnectionEnabled.set({ value: true }),
chrome.privacy.network.networkPredictionEnabled.set({ value: false }),
chrome.privacy.network.webRTCIPHandlingPolicy.set({
value: "disable_non_proxied_udp",
}),
]);
console.info("Network settings initialized");
} catch (error) {
console.error("Network initialization failed:", error);
}
}
}
var handleContextProxyRequest = async function(requestDetails) {
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(),
/**
* Proxy Manager for handling proxy configuration
*/
class ProxyManager {
constructor() {
this.proxyConfig = {
type: proxy_scheme(),
host: proxy_host(),
port: proxy_port(),
};
let url = new URL(requestDetails.url);
this.initialize();
}
/**
* Initialize proxy settings
*/
async initialize() {
try {
await this.setupProxyListener();
await this.setupStorageListener();
await this.setupWindowListener();
console.info("Proxy manager initialized");
} catch (error) {
console.error("Proxy initialization failed:", error);
}
}
/**
* Setup proxy request listener
*/
async setupProxyListener() {
browser.proxy.onRequest.addListener(this.handleProxyRequest.bind(this), {
urls: ["<all_urls>"],
});
browser.proxy.onError.addListener(this.handleProxyError.bind(this));
}
/**
* Setup storage change listener
*/
async setupStorageListener() {
browser.storage.onChanged.addListener(this.handleStorageChange.bind(this));
}
/**
* Setup window creation listener
*/
async setupWindowListener() {
const platformInfo = await browser.runtime.getPlatformInfo();
if (browser.windows) {
browser.windows.onCreated.addListener(
this.handleWindowCreation.bind(this)
);
}
}
/**
* Handle proxy requests
* @param {Object} requestDetails Request details
* @return {Object} Proxy configuration
*/
async handleProxyRequest(requestDetails) {
try {
// Handle proxy host requests
if (isProxyHost(requestDetails)) {
return this.proxyConfig;
}
// Handle extension requests
if (this.isExtensionRequest(requestDetails)) {
return this.proxyConfig;
}
// Handle container requests
if (requestDetails.tabId > 0) {
return await this.handleContainerRequest(requestDetails);
}
// Handle direct requests
return await this.handleDirectRequest(requestDetails);
} catch (error) {
console.error("Proxy request handling failed:", error);
return { type: "direct" };
}
}
/**
* Handle container-specific proxy requests
* @param {Object} requestDetails Request details
* @return {Object} Proxy configuration
*/
async handleContainerRequest(requestDetails) {
try {
const tab = await browser.tabs.get(requestDetails.tabId);
const context = await this.getContextIdentity(tab);
if (!context) {
return this.getDefaultProxy();
}
return await this.getContainerProxy(context, requestDetails);
} catch (error) {
console.error("Container request handling failed:", error);
return this.getDefaultProxy();
}
}
/**
* Handle direct (non-container) proxy requests
* @param {Object} requestDetails Request details
* @return {Object} Proxy configuration
*/
async handleDirectRequest(requestDetails) {
try {
// Check for local service ports first
if (isLocalHost(requestDetails.url)) {
const localProxyConfig = this.handleLocalServiceRequest(requestDetails);
if (localProxyConfig !== undefined) {
return localProxyConfig;
}
}
// Handle I2P and proxy hosts
if (i2pHost(requestDetails)) {
console.debug("(proxy) Direct I2P host request:", requestDetails.url);
return this.proxyConfig;
}
if (isProxyHost(requestDetails)) {
console.debug("(proxy) Direct proxy host request:", requestDetails.url);
return this.proxyConfig;
}
// Handle router console requests
if (isRouterHost(requestDetails.url)) {
console.debug(
"(proxy) Direct router console request:",
requestDetails.url
);
return null;
}
// RPC request handling
if (requestDetails.url.includes("rpc")) {
console.debug("(proxy) Direct RPC request:", requestDetails.url);
return this.proxyConfig;
}
// Default to direct connection for non-I2P traffic
console.debug("(proxy) Direct clearnet request:", requestDetails.url);
return { type: "direct" };
} catch (error) {
console.error("Direct request handling failed:", error);
return { type: "direct" };
}
}
/**
* Handle local service port requests
* @private
* @param {Object} requestDetails Request details
* @return {Object|undefined} Proxy configuration or undefined
*/
handleLocalServiceRequest(requestDetails) {
// Local service port mapping
const LOCAL_SERVICES = {
[PROXY_CONFIG.PORTS.IRC]: true, // IRC Console
[PROXY_CONFIG.PORTS.TOR]: true, // Tor Console
[PROXY_CONFIG.PORTS.BLOG]: true, // Blog Console
[PROXY_CONFIG.PORTS.TORRENT]: true, // Torrent Console
};
// Extract port from URL
const url = new URL(requestDetails.url);
const port = url.port;
// Return null proxy for local service ports
if (LOCAL_SERVICES[port]) {
console.debug(
`(proxy) Local service request on port ${port} :`,
requestDetails.url
);
return null;
}
// Let the main proxy logic handle other local requests
return undefined;
}
/**
* Get container identity
* @param {Object} tab Browser tab
* @return {Object} Container context
*/
async getContextIdentity(tab) {
try {
if (
tab.cookieStoreId === "firefox-default" ||
tab.cookieStoreId === "firefox-private"
) {
return null;
}
return await browser.contextualIdentities.get(tab.cookieStoreId);
} catch (error) {
console.error("Context identity lookup failed:", error);
return null;
}
}
/**
* Get container-specific proxy configuration
* @param {Object} context Container context
* @param {Object} requestDetails Request details
* @return {Object} Proxy configuration
*/
async getContainerProxy(context, requestDetails) {
const proxyMap = {
[PROXY_CONFIG.MESSAGES.IRC]: () => this.getIRCProxy(requestDetails),
[PROXY_CONFIG.MESSAGES.TOR]: () => this.getTorProxy(requestDetails),
[PROXY_CONFIG.MESSAGES.BLOG]: () => this.getBlogProxy(requestDetails),
[PROXY_CONFIG.MESSAGES.TITLE]: () => this.getMainProxy(requestDetails),
[PROXY_CONFIG.MESSAGES.ROUTER]: () => this.getRouterProxy(requestDetails),
[PROXY_CONFIG.MESSAGES.TORRENT]: () =>
this.getTorrentProxy(requestDetails),
};
const handler = proxyMap[context.name];
return handler ? await handler() : this.getDefaultProxy();
}
/**
* Get service-specific proxy configurations
*/
getIRCProxy(requestDetails) {
return !requestDetails.url.includes(PROXY_CONFIG.PORTS.IRC)
? this.proxyConfig
: null;
}
getTorProxy(requestDetails) {
return !requestDetails.url.includes(PROXY_CONFIG.PORTS.TOR)
? this.proxyConfig
: null;
}
getBlogProxy(requestDetails) {
return !requestDetails.url.includes(PROXY_CONFIG.PORTS.BLOG)
? this.proxyConfig
: null;
}
getMainProxy(requestDetails) {
if (
requestDetails.url.startsWith(
'http://' + getHost() + ':' + getConsolePort() + '/i2psnark/'
`http ://${proxy_host()}:${control_port()}/i2psnark/`
)
) {
//+url.host)) {
console.log('(proxy) mainproxy 2', url);
proxy = null;
return null;
}
return proxy;
return this.proxyConfig;
}
function routerProxy() {
if (routerHost(requestDetails.url)) {
proxy = null;
return proxy;
} else if (!routerHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
getRouterProxy(requestDetails) {
return isRouterHost(requestDetails.url) ? null : this.proxyConfig;
}
getTorrentProxy(requestDetails) {
return requestDetails.url.includes(PROXY_CONFIG.PORTS.TORRENT)
? null
: this.getRouterProxy(requestDetails);
}
/**
* Get default proxy configuration
* @return {Object} Default proxy
*/
getDefaultProxy() {
return { type: "direct" };
}
/**
* Handle proxy errors
* @param {Error} error Proxy error
*/
handleProxyError(error) {
if (error.includes("Invalid proxy server type")) {
console.warn("Invalid proxy configuration:", error);
} else {
console.error("Proxy error:", error);
}
}
try {
var handleProxyRequest = function(context) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
if (context == 'firefox-default' || context == 'firefox-private') {
proxy = null;
return proxy;
}
if (context != undefined) {
console.log('(proxy), context', context);
proxy = routerProxy();
if (context.name == ircpref) {
proxy = ircProxy();
return proxy;
} else if (context.name == titlepref) {
proxy = mainProxy();
return proxy;
} else if (context.name == routerpref) {
proxy = routerProxy();
return proxy;
} else if (context.name == torrentpref) {
proxy = btProxy();
return proxy;
}
return proxy;
} else {
if (!routerHost(requestDetails.url)) {
if (localHost(requestDetails.url)) {
if (requestDetails.url.includes(':7669')) {
proxy = null;
} else if (requestDetails.url.includes(':7662')) {
proxy = null;
} else {
console.log(
'(proxy) non-routerconsole localhost url, will not interfere',
requestDetails.url
);
}
}
} else if (i2pHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
}
//var tab = tabGet(requestDetails.tabId);
//tab.then(handleTabRequest,)
return proxy;
}
};
var contextGet = async function(tabInfo) {
try {
context = await browser.contextualIdentities.get(tabInfo.cookieStoreId);
return context;
} catch (error) {
console.error(error);
return 'firefox-default';
}
};
var tabGet = async function(tabId) {
try {
let tabInfo = await browser.tabs.get(tabId);
return tabInfo;
} catch (error) {
console.log('(proxy)Tab error', error);
}
};
if (proxyHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
/**
* Handle storage changes
*/
async handleStorageChange() {
try {
await this.updateConfig();
await this.setupProxyListener();
} catch (error) {
console.error("Storage update failed:", error);
}
if (requestDetails.originUrl == browser.runtime.getURL('security.html')) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
}
/**
* Handle window creation
*/
async handleWindowCreation() {
try {
await this.updateConfig();
await this.setupProxyListener();
} catch (error) {
console.error("Window creation handling failed:", error);
}
if (
requestDetails.cookieStoreId == 'firefox-default' ||
requestDetails.cookieStoreId == 'firefox-private'
) {
return browser.proxy.settings.get({});
}
if (requestDetails.tabId > 0) {
if (requestDetails.url.includes('MuWire')) {
return;
}
if (proxyHost(requestDetails.url)) {
proxy = {
type: getScheme(),
host: getHost(),
port: getPort(),
};
return proxy;
} else if (extensionHost(requestDetails.url)) {
return;
} else if (i2pHost(requestDetails.url)) {
var tab = tabGet(requestDetails.tabId);
requestDetails.tabId = tab;
var context = tab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
//console.log('(proxy)Returning I2P Proxy', proxy);
return proxy;
} else {
var tab = tabGet(requestDetails.tabId);
var context = tab.then(contextGet);
var proxy = await context.then(handleProxyRequest);
//console.log("(proxy)Returning I2P Proxy", proxy);
return proxy;
}
/*proxy = {};
console.log("(proxy)Returning unset Proxy", proxy);
return proxy;*/
}
} catch (error) {
console.log('(proxy)Not using I2P Proxy.', error);
}
}
function SetupSettings() {
console.log('Initialising Settings');
function onSetupError() {
console.log('Settings initialization error');
}
//
function checkSchemeStoredSettings(storedSettings) {
if (storedSettings.proxy_scheme == undefined)
storedSettings.proxy_scheme = 'http';
else proxy_scheme = storedSettings.proxy_scheme;
console.log('Initialising Proxy Scheme', storedSettings.proxy_scheme);
setupProxy();
}
var gettingSchemeStoredSettings = browser.storage.local.get('proxy_scheme');
gettingSchemeStoredSettings.then(checkSchemeStoredSettings, onSetupError);
//
function checkHostStoredSettings(storedSettings) {
if (storedSettings.proxy_host == undefined)
storedSettings.proxy_host = '127.0.0.1';
else proxy_host = storedSettings.proxy_host;
console.log('Initialising Host', storedSettings.proxy_host);
setupProxy();
}
var gettingHostStoredSettings = browser.storage.local.get('proxy_host');
gettingHostStoredSettings.then(checkHostStoredSettings, onSetupError);
//
function checkPortStoredSettings(storedSettings) {
if (storedSettings.proxy_port == undefined)
storedSettings.proxy_port = '4444';
else proxy_port = storedSettings.proxy_port;
console.log('Initialising Port', storedSettings.proxy_port);
setupProxy();
}
var gettingPortStoredSettings = browser.storage.local.get('proxy_port');
gettingPortStoredSettings.then(checkPortStoredSettings, onSetupError);
//
function checkControlHostStoredSettings(storedSettings) {
if (storedSettings.control_host == undefined)
storedSettings.control_host = '127.0.0.1';
else control_host = storedSettings.control_host;
console.log('Initialising Control Host', storedSettings.control_host);
setupProxy();
}
var gettingControlHostStoredSettings = browser.storage.local.get(
'control_host'
);
gettingControlHostStoredSettings.then(
checkControlHostStoredSettings,
onSetupError
);
//
function checkControlPortStoredSettings(storedSettings) {
if (storedSettings.control_port == undefined)
storedSettings.control_port = '7657';
else control_port = storedSettings.control_port;
console.log('Initialising Control Port', storedSettings.control_port);
setupProxy();
}
var gettingControlPortStoredSettings = browser.storage.local.get(
'control_port'
);
gettingControlPortStoredSettings.then(
checkControlPortStoredSettings,
onSetupError
);
//
function checkHistoryStoredSettings(storedSettings) {
if (storedSettings.disable_history == undefined)
storedSettings.disable_history = false;
else disable_history = storedSettings.disable_history;
console.log(
'Initialising Disabled History',
storedSettings.disable_history
/**
* Update proxy configuration
*/
async updateConfig() {
console.info(
"Updating proxy configuration:",
`Scheme : ${proxy_scheme()},`,
`Host : ${proxy_host()},`,
`Port : ${proxy_port()},`,
`Control : ${control_host()} :${control_port()}`
);
setupProxy();
}
var gettingHistoryStoredSettings = browser.storage.local.get(
'disable_history'
);
gettingHistoryStoredSettings.then(checkHistoryStoredSettings, onSetupError);
}
function getScheme() {
if (proxy_scheme == 'HTTP') return 'http';
if (proxy_scheme == 'SOCKS') return 'socks';
if (proxy_scheme == 'http') return 'http';
if (proxy_scheme == 'socks') return 'socks';
else return 'http';
}
function getHost() {
if (proxy_host == undefined) {
proxy_host = '127.0.0.1';
/**
* Check if request is from extension
* @param {Object} requestDetails Request details
* @return {boolean}
*/
isExtensionRequest(requestDetails) {
return requestDetails.originUrl === browser.runtime.getURL("security.html");
}
return proxy_host;
}
function getPort() {
if (proxy_port == undefined) {
var scheme = getScheme();
if (scheme == 'socks') proxy_port = '4446';
else proxy_port = '4444';
}
return proxy_port;
// Initialize managers
NetworkManager.initialize();
const proxyManager = new ProxyManager();
// Export for testing
if (typeof module !== "undefined" && module.exports) {
module.exports = {
NetworkManager,
ProxyManager,
PROXY_CONFIG,
};
}
function getConsolePort() {
if (control_port == undefined) {
var scheme = getScheme();
if (scheme == 'socks') proxy_port = '7657';
else control_port = '7657';
}
return control_port;
}
function setupProxy() {
console.log('Setting up Firefox WebExtension proxy');
browser.proxy.onRequest.addListener(handleContextProxyRequest, {
urls: ['<all_urls>'],
});
console.log('i2p settings created for WebExtension Proxy');
}
function update() {
console.log('restoring proxy scheme:', proxy_scheme);
console.log('restoring proxy host:', proxy_host);
console.log('restoring proxy port:', proxy_port);
console.log('restoring control host:', control_host);
console.log('restoring control port:', control_port);
}
function updateFromStorage() {
console.log('updating settings from storage');
chrome.storage.local.get(function() {
SetupSettings();
update();
setupProxy();
});
var gettingInfo = browser.runtime.getPlatformInfo();
gettingInfo.then((got) => {
if (got.os != 'android') {
browser.windows.getAll().then((wins) => wins.forEach(themeWindow));
}
});
}
updateFromStorage();
browser.storage.onChanged.addListener(updateFromStorage);
SetupSettings();
setupProxy();
var gettingListenerInfo = browser.runtime.getPlatformInfo();
gettingListenerInfo.then((got) => {
browser.windows.onCreated.addListener(() => {
chrome.storage.local.get(function() {
setupProxy();
});
});
});

46
proxyerr.html Normal file
View File

@@ -0,0 +1,46 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="home.css" rel="stylesheet">
<link href="search.css" rel="stylesheet">
<link href="sidebar.css" rel="stylesheet">
<title>
</title>
</head>
<body>
<div class='background'>
<div class='content'>
<div class="text-section-proxyerr-header">
<h1 id="text-section-proxyerr-header">A Proxy Error has Occurred</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>
<p id="description2">
If you're seeing this page, it is because a proxy error has occurred. Some information has been provided to help you diagnose the issue.
</p>
</div>
<div id="routerness">
<div class="hideIfI2PRouterOff" id="routerness">
<span id="router-check">Router is ready. Check the proxy diagnostic.</span>
</div>
</div>
<div id="readyness">
<div class="hideIfI2PProxyOff" id="readyness">
<img class="readyness" src="icons/local_up.png"> <span id="proxy-check">Proxy is ready. Something has changed since you were redirected to this page, possibly your proxy connected. Please try your request again.</span>
</div>
</div>
</div>
</div>
<script src="home.js" type="text/javascript"></script>
<script src="messages.js" type="text/javascript"></script>
<script src="content.js" type="text/javascript"></script>
<script src="proxyinfo.js" type="text/javascript"></script>
<script src="consoleinfo.js" type="text/javascript"></script>
</body>
</html>

215
proxyinfo.js Normal file
View File

@@ -0,0 +1,215 @@
/**
* @fileoverview I2P Proxy Status Manager
* Handles proxy connectivity checking and UI updates for I2P extension
*/
// Constants
const PROXY_CONFIG = {
PROXY_URL: "http://proxy.i2p",
CONSOLE_URL: "http://127.0.0.1:7657",
LOGO_PATH: "/themes/console/light/images/i2plogo.png",
FETCH_OPTIONS: { cache: "no-store" },
};
const UI_ELEMENTS = {
PROXY_STATUS: "proxy-check",
READINESS_CLASS: ".readyness",
CONSOLE_LINKS: ".application-info",
HIDDEN_CLASS: "hidden",
};
const MESSAGE_KEYS = {
SUCCESS: "proxySuccessStatus",
FAILURE: "proxyFailedStatus",
};
/**
* UI Manager for handling element visibility
*/
class ProxyUIManager {
/**
* Toggle element visibility
* @param {Element|NodeList} elements - Elements to modify
* @param {boolean} show - Whether to show or hide
*/
/**
* Toggle element visibility with strict null checking
* @param {Element|NodeList} elements - Elements to modify
* @param {boolean} show - Whether to show or hide
*/
static toggleVisibility(elements, show) {
try {
// Validate input
if (!elements) {
throw new Error("Elements parameter is null or undefined");
}
// Convert to array if NodeList
const elementArray =
elements instanceof NodeList ? Array.from(elements) : [elements];
elementArray.forEach((element) => {
// Explicit null check for element and style property
if (element && element.style !== undefined && element.style !== null) {
const action = show ? "remove" : "add";
element.classList[action](UI_ELEMENTS.HIDDEN_CLASS);
console.debug(`(proxyinfo) ${show ? "showing" : "hiding"} element`);
} else {
console.warn(
"(proxyinfo) Invalid element encountered during visibility toggle"
);
}
});
} catch (error) {
console.error("Visibility toggle failed:", error);
throw error; // Re-throw for error boundary handling
}
}
/**
* Update element content by ID
* @param {string} elementId - Target element ID
* @param {string} messageKey - i18n message key
*/
static updateContent(elementId, messageKey) {
try {
const element = document.getElementById(elementId);
if (!element) {
throw new Error(`Element not found : ${elementId}`);
}
element.textContent = chrome.i18n.getMessage(messageKey);
} catch (error) {
console.error("Content update failed:", error);
}
}
/**
* Get elements by selector
* @param {string} selector - CSS selector
* @return {?NodeList}
*/
static getElements(selector) {
try {
return document.querySelectorAll(selector);
} catch (error) {
console.error("Element selection failed:", error);
return null;
}
}
}
/**
* Proxy Status Manager
*/
class ProxyStatusManager {
/**
* Check proxy connectivity
* @return {Promise<void>}
*/
static async checkProxyStatus() {
console.info("(proxyinfo) Checking proxy status");
try {
const response = await fetch(
PROXY_CONFIG.PROXY_URL,
PROXY_CONFIG.FETCH_OPTIONS
);
await this.handleProxySuccess(response);
} catch (error) {
await this.handleProxyError(error);
}
}
/**
* Handle successful proxy connection
* @param {Response} response - Fetch response
*/
static async handleProxySuccess(response) {
console.info("(proxyinfo) Proxy check successful");
ProxyUIManager.updateContent(
UI_ELEMENTS.PROXY_STATUS,
MESSAGE_KEYS.SUCCESS
);
const readinessElements = ProxyUIManager.getElements(
UI_ELEMENTS.READINESS_CLASS
);
if (readinessElements) {
ProxyUIManager.toggleVisibility(readinessElements, true);
}
}
/**
* Handle proxy connection failure
* @param {Error} error - Connection error
*/
static async handleProxyError(error) {
console.error("(proxyinfo) Proxy check failed:", error);
ProxyUIManager.updateContent(
UI_ELEMENTS.PROXY_STATUS,
MESSAGE_KEYS.FAILURE
);
const readinessElements = ProxyUIManager.getElements(
UI_ELEMENTS.READINESS_CLASS
);
if (readinessElements) {
ProxyUIManager.toggleVisibility(readinessElements, false);
}
}
/**
* Check console connectivity
* @return {Promise<void>}
*/
static async checkConsoleStatus() {
const logoUrl = `${PROXY_CONFIG.CONSOLE_URL}${PROXY_CONFIG.LOGO_PATH}`;
console.info("(proxyinfo) Checking console status");
try {
await fetch(logoUrl);
const consoleLinks = ProxyUIManager.getElements(
UI_ELEMENTS.CONSOLE_LINKS
);
if (consoleLinks) {
ProxyUIManager.toggleVisibility(consoleLinks, true);
}
console.info("(proxyinfo) Console check successful");
} catch (error) {
const consoleLinks = ProxyUIManager.getElements(
UI_ELEMENTS.CONSOLE_LINKS
);
if (consoleLinks) {
ProxyUIManager.toggleVisibility(consoleLinks, false);
}
console.error("(proxyinfo) Console check failed:", error);
}
}
}
/**
* Initialize proxy status checking
*/
function initializeProxyChecks() {
try {
ProxyStatusManager.checkProxyStatus();
ProxyStatusManager.checkConsoleStatus();
} catch (error) {
console.error("Proxy initialization failed:", error);
}
}
// Event Listeners
document.addEventListener("DOMContentLoaded", initializeProxyChecks, {
passive: true,
capture: false,
});
// Export for testing
if (typeof module !== "undefined" && module.exports) {
module.exports = {
ProxyStatusManager,
UIManager: ProxyUIManager,
PROXY_CONFIG,
UI_ELEMENTS,
};
}

View File

@@ -4,195 +4,161 @@
<link type="text/html" rel="alternate" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases"/>
<link type="application/atom+xml" rel="self" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases.atom"/>
<title>Release notes from I2P-in-Private-Browsing-Mode-Firefox</title>
<updated>2020-12-14T19:47:34Z</updated>
<updated>2024-10-04T21:40:03Z</updated>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.91</id>
<updated>2020-12-14T19:47:59Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.91"/>
<title>0.91</title>
<enclosure url="magnet:?xt=urn:btih:991cc1181d816c20629caef454ebabf14785fbf7" type="application/x-bittorrent" />
<content type="html">&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>
<id>tag:github.com,2008:Repository/169256012/2.7.1</id>
<updated>2024-10-04T21:51:55Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/2.7.1"/>
<title>2.7.1</title>
<enclosure url="magnet:?xl=1246<title>2.7.1</title>dn=i2ppb%40eyedeekay.github.io.xpi.torrent<title>2.7.1</title>xt=urn:tree:tiger:eyme2fkldmntehx4m7ujho6fgxklugx2bfsnzti<title>2.7.1</title>xt=urn:ed2k:1bd6f65a3dc2027c9ac265da2c61e6d6<title>2.7.1</title>xt=urn:aich:t7hfnrsgwjjeh5nctj5qe7kwaclnahbc" type="application/x-bittorrent" />
<content>No content.</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
<media:thumbnail height="30" width="30" url="https://avatars.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;
<id>tag:github.com,2008:Repository/169256012/2.6.1</id>
<updated>2024-08-20T13:31:21Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/2.6.1"/>
<title>2.6.1</title>
<content>No content.</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/2.5.9</id>
<updated>2024-07-10T18:33:56Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/2.5.9"/>
<title>2.5.9</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 (2.5.9-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minor refactoring, simplifications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Thu, 10 July 2024 13:40:40 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (1.49-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/1.49</id>
<updated>2023-12-26T18:39:31Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/1.49"/>
<title>1.49</title>
<content type="html">&lt;h1&gt;I2P in Private Browsing Mode&lt;/h1&gt;
&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.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>
i2psetproxy.js (1.49-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"/>
<media:thumbnail height="30" width="30" url="https://avatars.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>
<id>tag:github.com,2008:Repository/169256012/1.47</id>
<updated>2023-06-11T18:11:50Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/1.47"/>
<title>1.47</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 (1.47-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;only reset the theme if we&#39;re resetting from one we own&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; Sun, 11 Jun 2023 14:05:08 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (1.45-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/1.45</id>
<updated>2023-06-11T04:18:50Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/1.45"/>
<title>1.45</title>
<content type="html">&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sat, 10 Jun 2023 23:51:21 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (1.43-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix wrong color pageAction icon&lt;/li&gt;
&lt;li&gt;Add router status to proxy error page&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; Sun, 24 Oct 2022 09:35:20 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (1.41-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/1.43</id>
<updated>2022-10-25T01:46:43Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/1.43"/>
<title>1.43</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;
i2psetproxy.js (1.43-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;li&gt;Fix wrong color pageAction icon&lt;/li&gt;
&lt;li&gt;Add router status to proxy error page&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>
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Sun, 24 Oct 2022 09:35:20 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (1.41-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"/>
<media:thumbnail height="30" width="30" url="https://avatars.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;
<id>tag:github.com,2008:Repository/169256012/1.41</id>
<updated>2022-10-25T00:06:24Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/1.41"/>
<title>1.41</title>
<content type="html">&lt;p&gt;restore manifest.json to desktop version, android still doesn&#39;t have …&lt;/p&gt;
&lt;p&gt;make the bookmarks part of a subdirectory&lt;/p&gt;</content>
&lt;p&gt;…the required APIs&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"/>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.75</id>
<updated>2020-06-23T03:22:59Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.75"/>
<title>0.75</title>
<id>tag:github.com,2008:Repository/169256012/0.133</id>
<updated>2022-05-23T20:31:26Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.133"/>
<title>0.133</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.75-1) UNRELEASED; urgency=low&lt;/p&gt;
i2psetproxy.js (0.133-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update bookmarks format&lt;/li&gt;
&lt;li&gt;Deprecate WebRTC State Management&lt;/li&gt;
&lt;li&gt;Add machine translations for several languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Mon, 22 JUN 2020 11:22:37 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.73-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Mon, 32 May 2022 16:28:06 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.131-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"/>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
<entry>
<id>tag:github.com,2008:Repository/169256012/0.73</id>
<updated>2020-03-24T23:49:45Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.73"/>
<title>0.73</title>
<content type="html">&lt;p&gt;A simple plugin for configuring a Firefox based web browser to isolate I2P&lt;br&gt;
Browsing to a single contextual identity, thus creating an I2P in Private&lt;br&gt;
Browsing mode. It requires the use of a pre-installed I2P Router.&lt;br&gt;
i2psetproxy.js (0.73-1) UNRELEASED; urgency=low&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix incomplete bugfix from 0.69 again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- idk &lt;a href=&quot;mailto:hankhill19580@gmail.com&quot;&gt;hankhill19580@gmail.com&lt;/a&gt; Tue, 24 MAR 2020 19:48:14 -0400&lt;/p&gt;
&lt;p&gt;i2psetproxy.js (0.71-1) UNRELEASED; urgency=low&lt;/p&gt;</content>
<id>tag:github.com,2008:Repository/169256012/0.131</id>
<updated>2022-02-12T01:38:22Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/eyedeekay/I2P-in-Private-Browsing-Mode-Firefox/releases/tag/0.131"/>
<title>0.131</title>
<content>No content.</content>
<author>
<name>eyedeekay</name>
</author>
<media:thumbnail height="30" width="30" url="https://avatars3.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/8733713?s=60&amp;v=4"/>
</entry>
</feed>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

After

Width:  |  Height:  |  Size: 198 KiB

View File

@@ -1,34 +1,49 @@
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"]');
function hasI2PLocation(request) {
let response = false;
if (request.req === "i2p-location") {
let tag = document.querySelector('meta[http-equiv="i2p-location"]');
if (tag != undefined) {
console.log(tag);
console.debug("(script) i2p site discovered", tag);
if (tag) response = tag.content;
}
var tag = document.querySelector('meta[http-equiv="x-i2p-location"]');
tag = document.querySelector('meta[http-equiv="x-i2p-location"]');
if (tag != undefined) {
console.log(tag);
console.debug("(script) i2p site discovered", tag);
if (tag) response = tag.content;
}
}
if (request.req === 'i2p-torrentlocation') {
var tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
return response;
}
function hasTorrentResource(request) {
let response = false;
if (!i2pHost(request.URL)) return response;
if (request.req === "i2p-torrentlocation") {
let tag = document.querySelector('meta[http-equiv="i2p-torrentlocation"]');
if (tag != undefined) {
console.log(tag);
console.debug("(script) torrent resource", tag);
response = i2pTorrent(tag);
}
var tag = document.querySelector(
'meta[http-equiv="x-i2p-torrentlocation"]'
);
tag = document.querySelector('meta[http-equiv="x-i2p-torrentlocation"]');
if (tag != undefined) {
console.log(tag);
console.debug("(script) torrent resource", tag);
response = i2pTorrent(tag);
}
}
return response;
}
function hasExtraLocation(request) {
var response = false;
console.info("(script) page" + request);
torrentLocation = hasTorrentResource(request);
if (torrentLocation) return torrentLocation;
i2pLocation = hasI2PLocation(request);
if (i2pLocation) return i2pLocation;
return Promise.resolve({ content: response });
});
}
browser.runtime.onMessage.addListener(hasExtraLocation);
window.document.onload = function (e) {
console.log("presetting x-i2p-torrentlocation");

1899
scrub.js

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
}
.topnav a {
float: left;
display: block;
display: inline-block;
text-align: center;
padding: 14px 16px
}
@@ -23,8 +23,7 @@
padding: 6px;
border: none;
margin-top: 8px;
color: #e6e6e7;
margin-right: 16px
color: #e6e6e7
}
.topnav input[type=submit] {
float: right;

71
sectorrent.html Normal file
View File

@@ -0,0 +1,71 @@
<!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">
<title>
</title>
</head>
<body>
<div id="browserpanel" class="content">
<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 | This I2P Site has peer-to-peer resources.</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 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="TorrentTypeLabel">Torrent Links:</span> <span id="Type"></span>
<div id="TorrentTypeInfo">
</div>
</div>
</li>
</ul>
</div>
</div>
<script src="cert.js"></script>
<script src="torrent.js"></script>
</body>
</html>

View File

@@ -3,13 +3,13 @@
<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">-->
<link href="home.css" rel="stylesheet">
<link href="info.css" rel="stylesheet">
<title>
</title>
</head>
<body>
<div id="browserpanel">
<div class="content" 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">

15
showhider.css Normal file
View File

@@ -0,0 +1,15 @@
/* edgar showhider CSS file */
#show {display:none; }
#hide {display:block; }
#show:target {display: block; }
#hide:target {display: none; }
#shownav {display:none; }
#hidenav {display:block; }
#shownav:target {display: block; }
#hidenav:target {display: none; }
#donate {display:none; }
#hidedonate {display:block; }
#donate:target {display: block; }
#hidedonate:target {display: none; }

View File

@@ -6,7 +6,7 @@ ul {
width: 100%
}
button {
width: 50%;
width: 45%;
text-align: center
}
#applicationExplain {

165
style.css Normal file
View File

@@ -0,0 +1,165 @@
/* edgar default CSS file */
body {
font-family: "Roboto";
font-family: monospace;
text-align: justify;
background-color: #373636;
color: whitesmoke;
font-size: 1.15em;
}
ul {
width: 55%;
display: block;
}
ol {
width: 55%;
display: block;
}
li {
margin-top: 1%;
}
p {
max-width: 90%;
margin-top: 1%;
margin-left: 3%;
margin-right: 3%;
}
img {
float: left;
top: 5%;
left: 5%;
max-width: 60%;
display: inline;
padding-right: 2%;
}
.inline {
display: inline;
}
.link-button:focus {
outline: none;
}
.link-button:active {
color: red;
}
code {
font-family: monospace;
border-radius: 5%;
padding: 1%;
border-color: darkgray;
font-size: .9em;
}
a {
color: #C6D9FE;
padding: 1%;
}
ul li {
color: #C6D9FE;
}
iframe {
background: aliceblue;
border-radius: 15%;
margin: 2%;
}
.container {
width: 36vw;
height: 64vh;
display: inline-block;
margin: 0;
padding: 0;
}
.editor-toolbar a {
display: inline-block;
text-align: center;
text-decoration: none !important;
color: whitesmoke !important;
}
#feed {
width: 60vw;
height: unset !important;
margin: 0;
padding: 0;
float: right;
background-color: #373636;
color: whitesmoke;
border: #C6D9FE solid 1px;
}
.thread-post,
.thread {
color: whitesmoke !important;
background-color: #373636;
border: 1px solid darkgray;
font-size: inherit;
padding-top: 1%;
padding-bottom: 1%;
}
.thread-post {
margin-left: 4%;
}
input {
text-align: center;
color: whitesmoke !important;
background-color: #373636;
border: 1px solid darkgray;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
padding-top: 1%;
padding-bottom: 1%;
}
.thread-hash {
text-align: right;
color: whitesmoke !important;
background-color: #373636;
border: 1px solid darkgray;
font-size: inherit;
padding-top: 1%;
padding-bottom: 1%;
}
.post-body {
text-align: left;
color: whitesmoke !important;
font-size: inherit;
padding-top: 1%;
padding-bottom: 1%;
}
#show {display:none; }
#hide {display:block; }
#show:target {display: block; }
#hide:target {display: none; }
#shownav {display:none; }
#hidenav {display:block; }
#shownav:target {display: block; }
#hidenav:target {display: none; }
#navbar {
float: right;
width: 15%;
}
#returnhome {
font-size: xxx-large;
display: inline;
}
h1 {
display: inline;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

@@ -1,86 +0,0 @@
<!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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -4,13 +4,13 @@
<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">-->
<link href="info.css" rel="stylesheet">
<title>
</title>
</head>
<body>
<div id="browserpanel">
<div id="browserpanel" class="content">
<div class="panel">
<div class="section-header panel-section panel-section-header" id="headline">
<div class="text-section-header" id="text-section-header">

View File

@@ -1,8 +1,8 @@
function gotCurrent(tab) {
function gotTitle(title) {
let addr = title;
document.getElementById('TypeInfo').innerHTML =
'<div class="AddressInfo"><a href="' + addr + '">' + addr + '</a></div>';
document.getElementById("TypeInfo").innerHTML =
'<div class="AddressInfo"><a href="' + addr + '">' + addr + "</a></div>";
}
console.log(tab);
var gettingTitle = browser.pageAction.getTitle({

View File

@@ -1,42 +0,0 @@
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.

View File

@@ -1,24 +0,0 @@
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/>

View File

@@ -1,247 +0,0 @@
'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);
}

View File

@@ -1,60 +0,0 @@
'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';
}

View File

@@ -1,52 +0,0 @@
<!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>

View File

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

18
translate.sh Executable file
View File

@@ -0,0 +1,18 @@
#! /usr/bin/env sh
webext-translator -lang="ar"
git commit -am "checkin translations ar" && git push --all
webext-translator -lang="zh"
git commit -am "checkin translations zh" && git push --all
webext-translator -lang="fr"
git commit -am "checkin translations fr" && git push --all
webext-translator -lang="de"
git commit -am "checkin translations de" && git push --all
webext-translator -lang="it"
git commit -am "checkin translations it" && git push --all
webext-translator -lang="ja"
git commit -am "checkin translations ja" && git push --all
webext-translator -lang="pt"
git commit -am "checkin translations pt" && git push --all
webext-translator -lang="ru"
git commit -am "checkin translations ru" && git push --all
webext-translator -lang="es"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 80 KiB

View File

@@ -4,22 +4,17 @@
<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">-->
<link href="info.css" rel="stylesheet">
<title>
</title>
</head>
<body>
<div class="section-header panel-section panel-section-header" id="topbar">
<!--<div class="text-section-header" id="text-section-header">-->
<a href="#" id="browser-action"><img class="tabicon" height="32px" src="icons/browse.png" width="32px">Browse</a> <a href="#" id="torrent-action"><img class="tabicon" height="32px" src="icons/torrents.png" width="32px">Download</a> <!--</div>-->
</div>
<div id="browserpanel">
<div class="panel">
<div class="panel content">
<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>
<a class="applicationName window-visit-homepage" href="#" id="window-visit-homepage" target="_blank">
<h1 id="text-section-header">The Invisible Internet Browser</h1></a>
</div>
</div>
@@ -28,14 +23,14 @@
</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">
<a class="applicationName" href="http://cuss2sgthm5wfipnnztrjdvtaczb22hnmr2ohnaqqqz3jf6ubf3a.b32.i2p/">Legwork Search Engine</a>
<form action="http://cuss2sgthm5wfipnnztrjdvtaczb22hnmr2ohnaqqqz3jf6ubf3a.b32.i2p/yacysearch.html?" method="get">
<input id="search-query" name="query" placeholder="Search on cuss2sgthm5wfipnnztrjdvtaczb22hnmr2ohnaqqqz3jf6ubf3a.b32.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>
<img class="readyness" src="icons/local_up.png"> <span id="proxy-check">Proxy is ready.</span>
</div>
<div id="i2pbrowser-description">
@@ -84,9 +79,9 @@
<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-help" href="#" id="window-visit-help" target="_blank">Extension 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 window-visit-console" href="#" id="window-visit-console" target="_blank">I2P Router Console</button> <span class="applicationDesc" id="aboutconsole">To access the homepage of the router console, 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>
@@ -99,61 +94,13 @@
</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 src="irc.js"></script>
<script src="messages.js" type="text/javascript"></script>
<script crossorigin="anonymous" src="content.js"></script>
<script src="torrent/popup.js"></script>
<script src="torrent/common.js"></script>
<script crossorigin="anonymous" src="i2pd.js"></script>
<script src="proxyinfo.js" type="text/javascript"></script>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 KiB

After

Width:  |  Height:  |  Size: 237 KiB