forked from I2P_Developers/i2p.i2p
Compare commits
473 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 90a70eb245 | |||
| 0898b8ee66 | |||
| ab4de7b392 | |||
| f39e201067 | |||
|
|
c884cfe6f6 | ||
|
|
02219f7376 | ||
| 834054958c | |||
|
|
66ba367530 | ||
|
|
7652c19699 | ||
|
|
39b741fae1 | ||
|
|
9493bedb0a | ||
|
|
1647da0abd | ||
|
|
921591e61f | ||
|
|
dec5af96b4 | ||
| 39ba081384 | |||
|
|
c270e147c1 | ||
|
|
98bfadb763 | ||
|
|
bae011da1d | ||
|
|
6d621d5eb9 | ||
| fa1c18ce2d | |||
|
|
f779993008 | ||
| 73c195eb63 | |||
| 7748147630 | |||
| e193d8964f | |||
| de71286f3c | |||
| 0f094da348 | |||
| 0c3f84c2da | |||
| 2332ac2a69 | |||
| a670100ba3 | |||
| 979825b07f | |||
|
|
648ea64b21 | ||
|
|
4fdb9084a6 | ||
|
|
9fbc7aef25 | ||
|
|
3dd79269bc | ||
|
|
d3999991d0 | ||
|
|
00b9864dbf | ||
|
|
c76b098fbb | ||
|
|
863fb08fa1 | ||
|
|
f1ae06ab40 | ||
| 14c305a494 | |||
| 4c9023f7cb | |||
|
|
4244b048f8 | ||
|
|
6a15d8c790 | ||
| 7afa63ce10 | |||
| 66391da1f7 | |||
|
|
a8746e4780 | ||
| af81681beb | |||
|
|
2926b1734c | ||
|
|
5d43282188 | ||
|
|
b96ee4efa2 | ||
|
|
6b0fe83989 | ||
|
|
1c5a9ed042 | ||
| efaafea78e | |||
| 273e940fa1 | |||
| 7bac7aaaf3 | |||
| 9f430bf117 | |||
| c7f5178b9c | |||
|
|
cb3a8b6eac | ||
|
|
0406b52c9b | ||
|
|
b62b668d1a | ||
|
|
40d3aa9d4c | ||
|
|
b0ce258925 | ||
|
|
57b30df4eb | ||
|
|
78a8952f55 | ||
|
|
c1558b206f | ||
|
|
f9b9877491 | ||
| bbd34be212 | |||
| cc7a8028d1 | |||
| ce5acb490a | |||
| 4822e47156 | |||
| a2c867c224 | |||
| fd1c8c45a8 | |||
|
|
05a92cd8e6 | ||
|
|
1fe8dbb00e | ||
|
|
24fdc4d75e | ||
|
|
17b19c9724 | ||
|
|
6e236f753d | ||
|
|
a45c3336a3 | ||
|
|
57523f11c1 | ||
|
|
597fc5504d | ||
| 3df7ef0366 | |||
| 6e5c9a3a8e | |||
| 3d91fac2fd | |||
| aec3976896 | |||
| 8a78de2b8c | |||
| a139d915bd | |||
|
|
450a5e14ab | ||
| e6d44a6199 | |||
| 6630c29071 | |||
|
|
8ee6503e54 | ||
| f186076fb0 | |||
| 49eeed6ac8 | |||
| 35e89b76ca | |||
| 23e262b0b9 | |||
| 47d2b80aa5 | |||
|
|
8aaf9a1c5e | ||
|
|
6760d2a5f4 | ||
|
|
d71b71f2b1 | ||
|
|
04785e25b9 | ||
|
|
2e1692cf09 | ||
|
|
e92c23c949 | ||
|
|
f2fe5140e1 | ||
|
|
2261039a76 | ||
|
|
2461b9525c | ||
|
|
7f6c4faeb5 | ||
|
|
a48ed65b36 | ||
|
|
03c24ef14e | ||
|
|
93d3710f51 | ||
|
|
c7385e5e6a | ||
|
|
b1d7df8a8c | ||
|
|
ff601f9ccc | ||
|
|
2fc0160c40 | ||
|
|
398d264319 | ||
|
|
7ce82617dc | ||
|
|
4e52b9c8d7 | ||
| dc04414e9a | |||
| a7f8560acf | |||
| 217cb1f66d | |||
| 1d17981325 | |||
| ba9754ac59 | |||
| 9a45ba1873 | |||
| 46481fb733 | |||
| 87439e19ca | |||
| bd06a44706 | |||
| c54dd79b3a | |||
| e249b22312 | |||
|
|
667b6b69b6 | ||
|
|
2fa63f8b30 | ||
|
|
22cb45ac40 | ||
|
|
8ddc34da45 | ||
|
|
667e4345a0 | ||
|
|
98c44f1bbd | ||
|
|
b0718f6b55 | ||
|
|
57afc4cd5d | ||
|
|
3a8a8c4256 | ||
|
|
3fe50e1d47 | ||
|
|
c8395df513 | ||
|
|
2307fed62c | ||
|
|
fd2c83f052 | ||
| 0018ac040a | |||
| 61831b11dc | |||
| 540172117f | |||
| 16640722d6 | |||
| e0c8eb7640 | |||
|
|
435bc826d3 | ||
|
|
d084d18cfa | ||
|
|
690f62b3ba | ||
| 3aa7f19530 | |||
| 0a83510690 | |||
| f3521228e9 | |||
| ab38e35bcd | |||
| b64eff9bbb | |||
| 4b989eb092 | |||
| 8dc1c4fcf4 | |||
| 8233c4f9e4 | |||
| e71d2012ca | |||
|
|
b062d3b3dd | ||
|
|
4062782015 | ||
|
|
0cc490d286 | ||
|
|
72abe9da13 | ||
| 1e5fe1f60b | |||
| 29ef11619a | |||
| 640782ae00 | |||
| 3882e49231 | |||
| b64cb14456 | |||
| d3950bdcf1 | |||
| 73901f6e2e | |||
| 70d9415ba2 | |||
| d9b37ac6f0 | |||
|
|
dc2198d3f6 | ||
| fdc3af97aa | |||
| 5030a86311 | |||
| 3d5beece87 | |||
|
|
19905e99be | ||
|
|
f79138b356 | ||
|
|
a40a2df971 | ||
|
|
ebf0128185 | ||
| 7a135b9fa4 | |||
|
|
331fb2781b | ||
|
|
0c319aa184 | ||
| 2c502c5e27 | |||
| 63958df99b | |||
| 42fc22eec9 | |||
| b39ba06d92 | |||
|
|
baa92b4ed5 | ||
|
|
070d3ee653 | ||
| 6364f142ff | |||
| 7b974e7e0b | |||
|
|
454c7f14a0 | ||
| 3d3352438b | |||
| b2263efaf0 | |||
|
|
5f7983ca17 | ||
| f4e64d9df7 | |||
| 30702e9b23 | |||
| 1bd71abf66 | |||
| d7a4e0357a | |||
| cdb6313c33 | |||
| b3711e31ad | |||
| aff250ff13 | |||
| a69267dc87 | |||
|
|
c9687649a4 | ||
|
|
9e6f993af5 | ||
| b328b47bf4 | |||
| bd7e655788 | |||
| a928f5ef1f | |||
| d73eb16aeb | |||
| a6728a33da | |||
| 20855c9c44 | |||
| 92ffea2237 | |||
| 81240a5240 | |||
| f8df357134 | |||
| 5b11418209 | |||
| 8b05b16c8a | |||
| d4bf3403e1 | |||
| 0c661b373e | |||
| c8a9d8ef35 | |||
| e768b35848 | |||
| 5e507c0294 | |||
| 948de5462f | |||
|
|
035829f33d | ||
|
|
115f3e1fb0 | ||
|
|
6a73dffdab | ||
| 100f6dac3d | |||
|
|
c671148025 | ||
|
|
c243f21bff | ||
|
|
4892764832 | ||
|
|
b9dc7ec12e | ||
|
|
ab58875b13 | ||
| c67404e74e | |||
| 5f6efbf6d0 | |||
|
|
f674b78edb | ||
| bb5f3a92b0 | |||
| 546b668502 | |||
| f6d2ac7fb2 | |||
| f22865acb1 | |||
| f99f9e41e5 | |||
| 3849a96ed2 | |||
| 69701ab506 | |||
|
|
2654ada226 | ||
|
|
e728532958 | ||
|
|
2aee4376cb | ||
| 010399d865 | |||
|
|
73aade4fb3 | ||
| 20c77e1529 | |||
| 5fd7997661 | |||
| 363a3e57ff | |||
|
|
5283b8d127 | ||
|
|
13545fdd70 | ||
| 4c988f0767 | |||
|
|
dc3f540a64 | ||
| 6d064270fc | |||
| d20ac3994d | |||
|
|
c90ac9ee6c | ||
|
|
67d608a1fb | ||
| ed7fd9783e | |||
| 994aa72d71 | |||
|
|
28ed69e575 | ||
| b874ff7e87 | |||
|
|
9c0c73358d | ||
|
|
2159862d1a | ||
| c5e74fefe5 | |||
| 26c744ca45 | |||
| 10f3337906 | |||
| de094433da | |||
|
|
0dee248f8a | ||
|
|
674c202e88 | ||
|
|
c7b567891c | ||
|
|
2f5020e29c | ||
|
|
3f979b159d | ||
|
|
a9f943154c | ||
|
|
b3cfe65325 | ||
|
|
77e1bf61ca | ||
|
|
746d440ce0 | ||
| aeccbc975f | |||
| 1bf651b88b | |||
|
|
b25a16f171 | ||
| 421559c26e | |||
| 336e50e94a | |||
| f7c31950b3 | |||
| dc02f9cd88 | |||
|
|
095f018fbb | ||
|
|
9c7533bb5d | ||
|
|
a29fd1e90c | ||
|
|
7343e0ff00 | ||
|
|
915755b349 | ||
|
|
255ccdcbc1 | ||
|
|
2973b4097d | ||
|
|
9abf7d6aef | ||
|
|
2e6912ed43 | ||
|
|
93d41be5ef | ||
|
|
f428a372cc | ||
|
|
d3861b9917 | ||
|
|
2fc09679ab | ||
|
|
2679aefb4e | ||
|
|
453b8a962d | ||
|
|
ecd629f97d | ||
| ee82a6196d | |||
| 43afe7b1a8 | |||
| 29ce3c7c8b | |||
| 1bf86aff0b | |||
|
|
c502c21798 | ||
|
|
3a70a5a627 | ||
|
|
3eafe4c765 | ||
|
|
9d3acf98ff | ||
|
|
18ee23960c | ||
|
|
3d64df57a1 | ||
| 71804173fc | |||
| dcc1861399 | |||
| e7f449472c | |||
| b37813257a | |||
| 59e1fbd0d1 | |||
| 0d212f6478 | |||
| 3a1cd51bc7 | |||
|
|
18db940d59 | ||
|
|
543e0b0d65 | ||
| 38281ba61f | |||
| a98d521006 | |||
| b0c2012327 | |||
| 1061e86fad | |||
| 164b0e5463 | |||
| 02bc228d6f | |||
| a61f113cd1 | |||
| afb6436109 | |||
| 22dd5b8adc | |||
|
|
fc353ee0bd | ||
| 734444e183 | |||
| 89d32e3bef | |||
| ec061eb3e0 | |||
| 702da0a929 | |||
| 49bba109ac | |||
| ddec4f88fb | |||
| 3466dc1099 | |||
|
|
bf8f1508cd | ||
|
|
0235c5ef40 | ||
|
|
661325af5a | ||
|
|
c716071e9c | ||
|
|
370be48226 | ||
| 395173613f | |||
| 046175d866 | |||
|
|
a731c890c2 | ||
| 66b19326d5 | |||
|
|
23c30a99cb | ||
|
|
f4ce899810 | ||
| 164f6603fd | |||
|
|
88b86333f4 | ||
|
|
2669ae0995 | ||
|
|
7c4f088b3e | ||
|
|
a67adba710 | ||
|
|
73f9b72d63 | ||
|
|
6e98cf4fe0 | ||
|
|
085ca76bcc | ||
|
|
150270b14f | ||
|
|
9a6888d7f9 | ||
|
|
6c182ba4bb | ||
|
|
42cffea077 | ||
| 3834403c79 | |||
| d397eaaa08 | |||
| 56d8b72b07 | |||
| c78719bfe4 | |||
| 91f2206a4f | |||
| 6d6799b99e | |||
| 3f8df84a4a | |||
| 127aebeadc | |||
|
|
dbaa659912 | ||
| 8034dc3ca7 | |||
| 0a8abad72e | |||
| a8378d0411 | |||
| 7fbb3b12d1 | |||
| 1ced604354 | |||
| 8a9882c906 | |||
| f87e3b52e3 | |||
| c826f7fb48 | |||
| 59424a899f | |||
| a4ec6a5369 | |||
| 7ba6f5a755 | |||
| 7fa874f625 | |||
| 55bfd6aa2d | |||
|
|
41021e1abb | ||
| 65656b333a | |||
| 0bf0715adc | |||
| 857f0a0448 | |||
| 79ac955b33 | |||
| 252f1047e5 | |||
| 9f433b2e6b | |||
| dfbf01dad5 | |||
| 688634695d | |||
| 3380ecfa28 | |||
|
|
48896568ce | ||
|
|
4ad2cf91d7 | ||
|
|
15f7981dd2 | ||
|
|
30a0ddc3fb | ||
|
|
526c42b246 | ||
| 0ca035dc44 | |||
| 3455d3f943 | |||
| 42acdc314a | |||
| 4fd1800944 | |||
| dccdb99632 | |||
| 94af227b70 | |||
| fdd0d6ceb1 | |||
| 5402bd0dc2 | |||
| 9d2816f4a7 | |||
|
|
2eab528af0 | ||
| b41c58341f | |||
| 90b8aa7811 | |||
| 56650ebfb4 | |||
| 44f4e551b7 | |||
| 9d4cc26890 | |||
| f173e88787 | |||
| ef40282081 | |||
| 32d9204e4a | |||
| dd4906258d | |||
|
|
c4b355124a | ||
| 15165aa9af | |||
| c7fcef2096 | |||
| 2b4f8ed55c | |||
|
|
681890780c | ||
| 49b39008c5 | |||
| 98b14158e6 | |||
| 476caf3f59 | |||
| 4f3c15eb04 | |||
| c839799023 | |||
| b7ff4fe87a | |||
| 435683c5d1 | |||
| 1f3f17c8e6 | |||
| d4b28058a7 | |||
| 43044586d1 | |||
| 6074a02cf5 | |||
| 57d196edd6 | |||
| bf832a407e | |||
| 5ae41521a0 | |||
| d537379798 | |||
| 4f5e3401f7 | |||
| 81beb63916 | |||
| 3a2e9ad5d3 | |||
| 01b4b227ae | |||
| f854ac031d | |||
|
|
14e7a8eb12 | ||
|
|
1339049886 | ||
| 73bd8c8515 | |||
|
|
e2c7315759 | ||
|
|
7a9b1297ca | ||
|
|
7c255d6cb1 | ||
|
|
ae428394a9 | ||
| 81dd267e29 | |||
| 1fdeba0745 | |||
| 3f39cea89e | |||
| bda6d7819c | |||
| 229f0d1cfd | |||
| e468633408 | |||
| 94e5aafa19 | |||
| 0fa5fa40e1 | |||
| 4caf48bd86 | |||
| 66aec13ed6 | |||
| 67825a7668 | |||
| facbb8c950 | |||
| 95c88881d9 | |||
| 9ad8f35bca | |||
| df793193aa | |||
| eeb03766b6 | |||
| f8ab2c144e | |||
| 32793ac12b | |||
| 83ee57adc7 | |||
| 4cff55daca | |||
| cb72bb0427 | |||
| 518fdd8c03 | |||
| 20ad7a44a7 | |||
| c655d23815 | |||
| 3c88c854bf | |||
| 21b76f1ca1 | |||
| d50cf13085 | |||
| 620ec536c2 | |||
| d4ca9ca36d | |||
|
|
0ae798d840 |
@@ -22,3 +22,5 @@ _jsp\.java$
|
||||
~$
|
||||
/build/
|
||||
/classes/
|
||||
^debian/copyright
|
||||
override.properties
|
||||
|
||||
22
.tx/config
22
.tx/config
@@ -2,9 +2,11 @@
|
||||
source_file = apps/i2ptunnel/locale/messages_en.po
|
||||
source_lang = en
|
||||
trans.ar = apps/i2ptunnel/locale/messages_ar.po
|
||||
trans.da = apps/i2ptunnel/locale/messages_da.po
|
||||
trans.de = apps/i2ptunnel/locale/messages_de.po
|
||||
trans.es = apps/i2ptunnel/locale/messages_es.po
|
||||
trans.fr = apps/i2ptunnel/locale/messages_fr.po
|
||||
trans.it = apps/i2ptunnel/locale/messages_it.po
|
||||
trans.nl = apps/i2ptunnel/locale/messages_nl.po
|
||||
trans.ru = apps/i2ptunnel/locale/messages_ru.po
|
||||
trans.sv_SE = apps/i2ptunnel/locale/messages_sv.po
|
||||
@@ -15,6 +17,7 @@ trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po
|
||||
source_file = apps/routerconsole/locale/messages_en.po
|
||||
source_lang = en
|
||||
trans.ar = apps/routerconsole/locale/messages_ar.po
|
||||
trans.da = apps/routerconsole/locale/messages_da.po
|
||||
trans.de = apps/routerconsole/locale/messages_de.po
|
||||
trans.es = apps/routerconsole/locale/messages_es.po
|
||||
trans.fi = apps/routerconsole/locale/messages_fi.po
|
||||
@@ -24,6 +27,7 @@ trans.nl = apps/routerconsole/locale/messages_nl.po
|
||||
trans.pl = apps/routerconsole/locale/messages_pl.po
|
||||
trans.ru = apps/routerconsole/locale/messages_ru.po
|
||||
trans.sv_SE = apps/routerconsole/locale/messages_sv.po
|
||||
trans.uk_UA = apps/routerconsole/locale/messages_uk.po
|
||||
trans.vi = apps/routerconsole/locale/messages_vi.po
|
||||
trans.zh_CN = apps/routerconsole/locale/messages_zh.po
|
||||
|
||||
@@ -47,28 +51,33 @@ trans.zh_CN = apps/i2psnark/locale/messages_zh.po
|
||||
source_file = apps/susidns/locale/messages_en.po
|
||||
source_lang = en
|
||||
trans.ar = apps/susidns/locale/messages_ar.po
|
||||
trans.da = apps/susidns/locale/messages_da.po
|
||||
trans.de = apps/susidns/locale/messages_de.po
|
||||
trans.es = apps/susidns/locale/messages_es.po
|
||||
trans.fr = apps/susidns/locale/messages_fr.po
|
||||
trans.it = apps/susidns/locale/messages_it.po
|
||||
trans.nl = apps/susidns/locale/messages_nl.po
|
||||
trans.pl = apps/susidns/locale/messages_pl.po
|
||||
trans.ru = apps/susidns/locale/messages_ru.po
|
||||
trans.sv_SE = apps/susidns/locale/messages_sv.po
|
||||
trans.uk_UA = apps/susidns/locale/messages_uk.po
|
||||
trans.vi = apps/susidns/locale/messages_vi.po
|
||||
trans.zh_CN = apps/susidns/locale/messages_zh.po
|
||||
|
||||
[I2P.desktopgui]
|
||||
source_file = apps/desktopgui/locale/messages_en.po
|
||||
source_lang = en
|
||||
trans.ar = apps/desktopgui/locale/messages_ar.po
|
||||
trans.da = apps/desktopgui/locale/messages_da.po
|
||||
trans.de = apps/desktopgui/locale/messages_de.po
|
||||
trans.es = apps/desktopgui/locale/messages_es.po
|
||||
trans.fi = apps/desktopgui/locale/messages_fi.po
|
||||
trans.fr = apps/desktopgui/locale/messages_fr.po
|
||||
trans.it = apps/desktopgui/locale/messages_it.po
|
||||
trans.nl = apps/desktopgui/locale/messages_nl.po
|
||||
trans.pl = apps/desktopgui/locale/messages_pl.po
|
||||
trans.ru = apps/desktopgui/locale/messages_ru.po
|
||||
trans.sv_SE = apps/desktopgui/locale/messages_sv.po
|
||||
trans.uk_UA = apps/desktopgui/locale/messages_uk.po
|
||||
trans.vi = apps/desktopgui/locale/messages_vi.po
|
||||
trans.zh_CN = apps/desktopgui/locale/messages_zh.po
|
||||
|
||||
@@ -78,12 +87,23 @@ source_lang = en
|
||||
trans.de = apps/susimail/locale/messages_de.po
|
||||
trans.es = apps/susimail/locale/messages_es.po
|
||||
trans.fr = apps/susimail/locale/messages_fr.po
|
||||
trans.it = apps/susimail/locale/messages_it.po
|
||||
trans.nl = apps/susimail/locale/messages_nl.po
|
||||
trans.ru = apps/susimail/locale/messages_ru.po
|
||||
trans.sv_SE = apps/susimail/locale/messages_sv.po
|
||||
trans.pl = apps/susimail/locale/messages_pl.po
|
||||
trans.vi = apps/susimail/locale/messages_vi.po
|
||||
trans.zh_CN = apps/susimail/locale/messages_zh.po
|
||||
|
||||
[I2P.debconf]
|
||||
source_file = debian/po/templates.pot
|
||||
source_lang = en
|
||||
trans.de = debian/po/de.po
|
||||
trans.es = debian/po/es.po
|
||||
trans.pl = debian/po/pl.po
|
||||
trans.ru = debian/po/ru.po
|
||||
trans.uk_UA = debian/po/uk.po
|
||||
|
||||
[main]
|
||||
host = http://www.transifex.net
|
||||
|
||||
|
||||
10
INSTALL.txt
10
INSTALL.txt
@@ -28,9 +28,17 @@ Or move the i2pupdate.zip file into an existing installation directory and resta
|
||||
|
||||
To start I2P:
|
||||
(*nix): sh i2prouter start
|
||||
(win*): I2P.exe
|
||||
(win*): I2P.exe or i2prouter.bat
|
||||
(non-x86 platforms PPC, ARM, etc): sh runplain.sh
|
||||
|
||||
To install I2P as a system service:
|
||||
(*nix) sh i2prouter install
|
||||
(win*) install_i2p_service_winnt.bat
|
||||
|
||||
To uninstall I2P as a system service:
|
||||
(*nix) sh i2prouter remove
|
||||
(win*) uninstall_i2p-service_winnt.bat
|
||||
|
||||
To stop I2P (gracefully):
|
||||
lynx http://localhost:7657/summaryframe (click "Shutdown")
|
||||
|
||||
|
||||
16
LICENSE.txt
16
LICENSE.txt
@@ -41,8 +41,8 @@ Public domain except as listed below:
|
||||
See licenses/LICENSE-SHA256.txt
|
||||
|
||||
AES code:
|
||||
Under the Cryptix (MIT) license, written by the Cryptix team
|
||||
(That's what our website says but all our AES code looks like it is public domain)
|
||||
Copyright (c) 1995-2005 The Cryptix Foundation Limited.
|
||||
See licenses/LICENSE-Cryptix.txt
|
||||
|
||||
Crypto filters:
|
||||
From the xlattice app - http://xlattice.sourceforge.net/
|
||||
@@ -83,7 +83,7 @@ Public domain except as listed below:
|
||||
Copyright (C) 2003-2006 Satoshi Konno
|
||||
See licenses/LICENSE-UPnP.txt
|
||||
|
||||
GeoIP data free to use, courtesy http://ip-to-country.webhosting.info/
|
||||
GeoIP data free to use, courtesy http://www.maxmind.com/
|
||||
|
||||
|
||||
Installer:
|
||||
@@ -194,11 +194,14 @@ Applications:
|
||||
|
||||
Router console:
|
||||
Public domain.
|
||||
Flag icons: public domain, courtesy mjames@gmail.com http://www.famfamfam.com/
|
||||
Flag icons:
|
||||
- Jersey and EU flag icons: public domain, courtesy Xrmap flag
|
||||
collection http://www.arvernes.com/wiki/index.php/Xrmap
|
||||
- All other flag icons: public domain, courtesy mjames@gmail.com http://www.famfamfam.com/
|
||||
Silk icons: See licenses/LICENSE-SilkIcons.txt
|
||||
|
||||
GeoIP Data:
|
||||
Copyright (c) 2003 Direct Information Pvt. Ltd. All Rights Reserved.
|
||||
Copyright (c) 2008 MaxMind, Inc. All Rights Reserved.
|
||||
See licenses/LICENSE-GeoIP.txt
|
||||
|
||||
Router Console and I2PSnark themes:
|
||||
@@ -237,9 +240,6 @@ distributions. See the source package for the additional license information.
|
||||
Admin Manager:
|
||||
Public domain
|
||||
|
||||
Atalk:
|
||||
Public domain
|
||||
|
||||
BOB Demos:
|
||||
Copyright (C) sponge
|
||||
DWTFYWTPL
|
||||
|
||||
@@ -201,7 +201,7 @@ public class Daemon {
|
||||
}
|
||||
} catch (DataFormatException dfe) {
|
||||
if (log != null)
|
||||
log.append("Invalid b64 for" + key + " From: " + sub.getLocation());
|
||||
log.append("Invalid b64 for " + key + " From: " + sub.getLocation());
|
||||
invalid++;
|
||||
}
|
||||
total++;
|
||||
|
||||
@@ -32,7 +32,7 @@ import net.i2p.client.naming.NamingServiceUpdater;
|
||||
* @author Ragnarok
|
||||
*
|
||||
*/
|
||||
class DaemonThread extends Thread implements NamingServiceUpdater {
|
||||
public class DaemonThread extends Thread implements NamingServiceUpdater {
|
||||
|
||||
private String[] args;
|
||||
|
||||
|
||||
@@ -1,381 +0,0 @@
|
||||
package net.i2p.client;
|
||||
|
||||
/*
|
||||
* free (adj.): unencumbered; not under the control of others
|
||||
* Written by jrandom in 2003 and released into the public domain
|
||||
* with no warranty of any kind, either expressed or implied.
|
||||
* It probably won't make your computer catch on fire, or eat
|
||||
* your children, but it might. Use at your own risk.
|
||||
*
|
||||
*/
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Properties;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.Clock;
|
||||
import net.i2p.util.I2PThread;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* ATalk - anonymous talk, demonstrating a trivial I2P usage scenario.
|
||||
* Run this class with no arguments for a manual.
|
||||
*
|
||||
* @author jrandom
|
||||
*/
|
||||
public class ATalk implements I2PSessionListener, Runnable {
|
||||
/** logging hook - status messages are piped to this */
|
||||
private final static Log _log = new Log(ATalk.class);
|
||||
|
||||
/** platform independent newline */
|
||||
private final static String NL = System.getProperty("line.separator");
|
||||
|
||||
/** the current session */
|
||||
private I2PSession _session;
|
||||
|
||||
/** who am i */
|
||||
private Destination _myDestination;
|
||||
|
||||
/** who are you? */
|
||||
private Destination _peerDestination;
|
||||
|
||||
/** location of my secret key file */
|
||||
private String _myKeyFile;
|
||||
|
||||
/** location of their public key */
|
||||
private String _theirDestinationFile;
|
||||
|
||||
/** where the application reads input from. currently set to standard input */
|
||||
private BufferedReader _in;
|
||||
|
||||
/** where the application sends output to. currently set to standard output */
|
||||
private BufferedWriter _out;
|
||||
|
||||
/** string that messages must begin with to be treated as files */
|
||||
private final static String FILE_COMMAND = ".file: ";
|
||||
|
||||
/** the, erm, manual */
|
||||
private final static String MANUAL = "ATalk: Anonymous Talk, a demo program for the Invisible Internet Project SDK"
|
||||
+ NL
|
||||
+ "To generate a new destination:"
|
||||
+ NL
|
||||
+ "\tATalk [fileToSavePrivateKeyIn] [fileToSavePublicKeyIn]"
|
||||
+ NL
|
||||
+ "To talk to another destination:"
|
||||
+ NL
|
||||
+ "\tATalk [myPrivateKeyFile] [peerPublicKey] [shouldLogToScreen]"
|
||||
+ NL
|
||||
+ "shouldLogToScreen is 'true' or 'false', depending on whether you want log info on the screen"
|
||||
+ NL
|
||||
+ "When talking to another destination, messages are sent after you hit return"
|
||||
+ NL
|
||||
+ "To send a file, send a message saying:"
|
||||
+ NL
|
||||
+ "\t"
|
||||
+ FILE_COMMAND
|
||||
+ "[filenameToSend]"
|
||||
+ NL
|
||||
+ "The peer will then recieve the file and be notified of where it has been saved"
|
||||
+ NL
|
||||
+ "To end the talk session, enter a period on a line by itself and hit return"
|
||||
+ NL;
|
||||
|
||||
public final static String PROP_CONFIG_LOCATION = "configFile";
|
||||
|
||||
private static final SimpleDateFormat _fmt = new SimpleDateFormat("hh:mm:ss.SSS");
|
||||
|
||||
/** Construct the talk engine, but don't connect yet */
|
||||
public ATalk(String myKeyFile, String theirDestFile) {
|
||||
_myKeyFile = myKeyFile;
|
||||
_theirDestinationFile = theirDestFile;
|
||||
}
|
||||
|
||||
/** Actually start up the connection to the I2P network.
|
||||
* Successful connect does not mean the peer is online or reachable.
|
||||
*
|
||||
* @throws IOException if there is a problem reading in the keys from the files specified
|
||||
* @throws DataFormatException if the key files are not in the valid format
|
||||
* @throws I2PSessionException if there is a problem contacting the I2P router
|
||||
*/
|
||||
public void connect() throws IOException, I2PSessionException, DataFormatException {
|
||||
I2PClient client = I2PClientFactory.createClient();
|
||||
File myFile = new File(_myKeyFile);
|
||||
Properties props = new Properties();
|
||||
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "atalk.config");
|
||||
try {
|
||||
props.load(new FileInputStream(configLocation));
|
||||
} catch (FileNotFoundException fnfe) {
|
||||
_log.warn("Unable to load up the ATalk config file " + configLocation);
|
||||
}
|
||||
// Provide any router or client API configuration here.
|
||||
if (!props.containsKey(I2PClient.PROP_TCP_HOST))
|
||||
props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
|
||||
if (!props.containsKey(I2PClient.PROP_TCP_PORT))
|
||||
props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
|
||||
if (!props.containsKey(I2PClient.PROP_RELIABILITY))
|
||||
props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
|
||||
_session = client.createSession(new FileInputStream(myFile), props);
|
||||
_session.setSessionListener(this);
|
||||
_session.connect();
|
||||
|
||||
File peerDestFile = new File(_theirDestinationFile);
|
||||
_peerDestination = new Destination();
|
||||
_peerDestination.readBytes(new FileInputStream(peerDestFile));
|
||||
return;
|
||||
}
|
||||
|
||||
/** Actual bulk processing of the application, reading in user input,
|
||||
* sending messages, and displaying results. When this function exits, the
|
||||
* application is complete.
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
try {
|
||||
connect();
|
||||
_in = new BufferedReader(new InputStreamReader(System.in));
|
||||
_out = new BufferedWriter(new OutputStreamWriter(System.out));
|
||||
|
||||
_out.write("Starting up anonymous talk session" + NL);
|
||||
|
||||
while (true) {
|
||||
String line = _in.readLine();
|
||||
if ((line == null) || (line.trim().length() <= 0)) continue;
|
||||
if (".".equals(line)) {
|
||||
boolean ok = _session.sendMessage(_peerDestination, ("Peer disconnected at " + now()).getBytes());
|
||||
// ignore ok, we're closing
|
||||
break;
|
||||
}
|
||||
if (line.startsWith(FILE_COMMAND) && (line.trim().length() > FILE_COMMAND.length())) {
|
||||
try {
|
||||
String file = line.substring(FILE_COMMAND.length());
|
||||
boolean sent = sendFile(file);
|
||||
if (!sent) {
|
||||
_out.write("Failed sending the file: " + file + NL);
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
_out.write("Error sending the file: " + ioe.getMessage() + NL);
|
||||
_log.error("Error sending the file", ioe);
|
||||
}
|
||||
} else {
|
||||
boolean ok = _session.sendMessage(_peerDestination, ("[" + now() + "] " + line).getBytes());
|
||||
if (!ok) {
|
||||
_out.write("Failed sending message. Peer disconnected?" + NL);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error running", ioe);
|
||||
} catch (I2PSessionException ise) {
|
||||
_log.error("Error communicating", ise);
|
||||
} catch (DataFormatException dfe) {
|
||||
_log.error("Peer destination file is not valid", dfe);
|
||||
} finally {
|
||||
try {
|
||||
_log.debug("Exiting anonymous talk session");
|
||||
if (_out != null) _out.write("Exiting anonymous talk session");
|
||||
} catch (IOException ioe) {
|
||||
// ignored
|
||||
}
|
||||
if (_session != null) {
|
||||
try {
|
||||
_session.destroySession();
|
||||
} catch (I2PSessionException ise) {
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException ie) { // nop!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String now() {
|
||||
Date now = new Date(Clock.getInstance().now());
|
||||
return _fmt.format(now);
|
||||
}
|
||||
|
||||
/** Send the given file to the current peer. This works by sending a message
|
||||
* saying ".file: filename\nbodyOfFile", where filename is the name of the file
|
||||
* (which the recipient will be shown), and the bodyOfFile is the set of raw
|
||||
* bytes in the file.
|
||||
*
|
||||
* @throws IOException if the file could not be found or read
|
||||
* @return false if the file could not be sent to the peer
|
||||
*/
|
||||
private boolean sendFile(String filename) throws IOException, I2PSessionException {
|
||||
_log.debug("Sending file [" + filename + "]");
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
|
||||
baos.write((FILE_COMMAND + filename + "\n").getBytes());
|
||||
FileInputStream fin = new FileInputStream(filename);
|
||||
byte buf[] = new byte[4096];
|
||||
try {
|
||||
while (true) {
|
||||
int len = fin.read(buf);
|
||||
if (len == -1) break;
|
||||
baos.write(buf, 0, len);
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
_log.debug("Failed reading the file", ioe);
|
||||
return false;
|
||||
}
|
||||
baos.close();
|
||||
byte val[] = baos.toByteArray();
|
||||
_log.debug("Sending " + filename + " with a full payload of " + val.length);
|
||||
try {
|
||||
boolean rv = _session.sendMessage(_peerDestination, val);
|
||||
_log.debug("Sending " + filename + " complete: rv = " + rv);
|
||||
return rv;
|
||||
} catch (Throwable t) {
|
||||
_log.error("Error sending file", t);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** I2PSessionListener.messageAvailable requires this method to be called whenever
|
||||
* I2P wants to tell the session that a message is available. ATalk always grabs
|
||||
* the message immediately and either processes it as a "send file" command (passing
|
||||
* it off to handleRecieveFile(..) or simply displays the
|
||||
* message to the user.
|
||||
*
|
||||
*/
|
||||
public void messageAvailable(I2PSession session, int msgId, long size) {
|
||||
_log.debug("Message available: id = " + msgId + " size = " + size);
|
||||
try {
|
||||
byte msg[] = session.receiveMessage(msgId);
|
||||
// inefficient way to just read the first line of text, but its easy
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(msg)));
|
||||
String line = reader.readLine();
|
||||
if (line.startsWith(FILE_COMMAND)) {
|
||||
handleRecieveFile(line, msg);
|
||||
} else {
|
||||
// not a file command, so just plop 'er out on the screen
|
||||
_out.write(now() + " --> " + new String(msg));
|
||||
_out.write(NL);
|
||||
_out.flush();
|
||||
}
|
||||
} catch (I2PSessionException ise) {
|
||||
_log.error("Error fetching available message", ise);
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error writing out the message", ioe);
|
||||
}
|
||||
}
|
||||
|
||||
/** React to a file being sent our way from the peer via {@link #sendFile sendFile}
|
||||
* by saving the file to a temporary location and displaying where, what, and how large
|
||||
* it is.
|
||||
*
|
||||
* @param firstline the first line of the message that, according to the sendFile
|
||||
* implementation, contains the command and the filename that it was stored
|
||||
* at on the peer's computer
|
||||
* @param msg the entire message recieved, including the firstline
|
||||
*/
|
||||
private void handleRecieveFile(String firstline, byte msg[]) throws IOException {
|
||||
_log.debug("handleRecieveFile called");
|
||||
File f = File.createTempFile("recieve", ".dat", new File("."));
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
int lineLen = firstline.getBytes().length + "\n".getBytes().length;
|
||||
int lenToCopy = msg.length - lineLen;
|
||||
byte buf[] = new byte[lenToCopy];
|
||||
System.arraycopy(msg, lineLen, buf, 0, lenToCopy);
|
||||
fos.write(buf);
|
||||
fos.close();
|
||||
String name = firstline.substring(FILE_COMMAND.length());
|
||||
_out.write("Recieved a file called [" + name + "] of size [" + lenToCopy + "] bytes, saved as ["
|
||||
+ f.getAbsolutePath() + "]" + NL);
|
||||
_out.flush();
|
||||
}
|
||||
|
||||
/** driver */
|
||||
public static void main(String args[]) {
|
||||
I2PAppContext context = new I2PAppContext();
|
||||
if (args.length == 2) {
|
||||
String myKeyFile = args[0];
|
||||
String myDestinationFile = args[1];
|
||||
boolean success = generateKeys(myKeyFile, myDestinationFile);
|
||||
if (success)
|
||||
_log.debug("Keys generated (private key file: " + myKeyFile + " destination file: " + myDestinationFile
|
||||
+ ")");
|
||||
else
|
||||
_log.debug("Keys generation failed");
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException ie) { // nop
|
||||
}
|
||||
} else if (args.length == 3) {
|
||||
_log.debug("Starting chat");
|
||||
String myKeyfile = args[0];
|
||||
String peerDestFile = args[1];
|
||||
String shouldLog = args[2];
|
||||
if (Boolean.TRUE.toString().equalsIgnoreCase(shouldLog))
|
||||
context.logManager().setDisplayOnScreen(true);
|
||||
else
|
||||
context.logManager().setDisplayOnScreen(false);
|
||||
String logFile = args[2];
|
||||
Thread talkThread = new I2PThread(new ATalk(myKeyfile, peerDestFile));
|
||||
talkThread.start();
|
||||
} else {
|
||||
System.out.println(MANUAL);
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException ie) { // nop
|
||||
}
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
/** Generate a new Destination, saving that destination and the associated
|
||||
* private keys in the privKeyFile, and also saving the destination without
|
||||
* any private keys to destinationFile.
|
||||
*
|
||||
* @param privKeyFile private key file, including the destination and the various
|
||||
* private keys, as defined by {@link I2PClient#createDestination I2PClient.createDestination}
|
||||
* @param destinationFile file in which the Destination is serialized in
|
||||
*/
|
||||
private static boolean generateKeys(String privKeyFile, String destinationFile) {
|
||||
try {
|
||||
Destination d = I2PClientFactory.createClient().createDestination(new FileOutputStream(privKeyFile));
|
||||
FileOutputStream fos = new FileOutputStream(destinationFile);
|
||||
d.writeBytes(fos);
|
||||
fos.flush();
|
||||
fos.close();
|
||||
return true;
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error generating keys", ioe);
|
||||
} catch (I2PException ipe) {
|
||||
_log.error("Error generating keys", ipe);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** required by {@link I2PSessionListener I2PSessionListener} to notify of disconnect */
|
||||
public void disconnected(I2PSession session) {
|
||||
_log.debug("Disconnected");
|
||||
}
|
||||
|
||||
/** required by {@link I2PSessionListener I2PSessionListener} to notify of error */
|
||||
public void errorOccurred(I2PSession session, String message, Throwable error) {
|
||||
_log.debug("Error occurred: " + message, error);
|
||||
}
|
||||
|
||||
/** required by {@link I2PSessionListener I2PSessionListener} to notify of abuse */
|
||||
public void reportAbuse(I2PSession session, int severity) {
|
||||
_log.debug("Abuse reported of severity " + severity);
|
||||
}
|
||||
}
|
||||
|
||||
57
apps/desktopgui/locale/messages_da.po
Normal file
57
apps/desktopgui/locale/messages_da.po
Normal file
@@ -0,0 +1,57 @@
|
||||
# I2P
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the desktopgui package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# <kia___@hushmail.com>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
|
||||
"POT-Creation-Date: 2011-03-03 18:29+0000\n"
|
||||
"PO-Revision-Date: 2011-07-12 19:41+0000\n"
|
||||
"Last-Translator: KIA <kia___@hushmail.com>\n"
|
||||
"Language-Team: Danish (http://www.transifex.net/projects/p/I2P/team/da/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: da\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
|
||||
msgid "Start I2P"
|
||||
msgstr "Start I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
|
||||
msgid "I2P is starting!"
|
||||
msgstr "I2P starter nu!"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
|
||||
msgid "Starting"
|
||||
msgstr "Starter"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:26
|
||||
msgid "Launch I2P Browser"
|
||||
msgstr "Start I2P Browseren"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:50
|
||||
msgid "Configure desktopgui"
|
||||
msgstr "Konfigurer desktopgui"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:67
|
||||
msgid "Restart I2P"
|
||||
msgstr "Genstart I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:85
|
||||
msgid "Stop I2P"
|
||||
msgstr "Stop I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
|
||||
msgid "Tray icon configuration"
|
||||
msgstr "Konfiguration af processbar ikonet"
|
||||
|
||||
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
|
||||
msgid "Should tray icon be enabled?"
|
||||
msgstr "Skal processbar ikonet være aktivt?"
|
||||
|
||||
|
||||
57
apps/desktopgui/locale/messages_uk.po
Normal file
57
apps/desktopgui/locale/messages_uk.po
Normal file
@@ -0,0 +1,57 @@
|
||||
# I2P
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the desktopgui package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# <gribua@gmail.com>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
|
||||
"POT-Creation-Date: 2011-03-03 18:29+0000\n"
|
||||
"PO-Revision-Date: 2011-06-19 14:01+0000\n"
|
||||
"Last-Translator: Pharmasolin <gribua@gmail.com>\n"
|
||||
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.net/projects/p/I2P/team/uk_UA/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: uk_UA\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
|
||||
msgid "Start I2P"
|
||||
msgstr "Запустити I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
|
||||
msgid "I2P is starting!"
|
||||
msgstr "I2P запускається!"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
|
||||
msgid "Starting"
|
||||
msgstr "Запускається"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:26
|
||||
msgid "Launch I2P Browser"
|
||||
msgstr "Запустити I2P Браузер"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:50
|
||||
msgid "Configure desktopgui"
|
||||
msgstr "Настроїти вигляд інтерфейсу"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:67
|
||||
msgid "Restart I2P"
|
||||
msgstr "Перезапустити I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:85
|
||||
msgid "Stop I2P"
|
||||
msgstr "Зупинити I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
|
||||
msgid "Tray icon configuration"
|
||||
msgstr "Настройка трей-іконки"
|
||||
|
||||
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
|
||||
msgid "Should tray icon be enabled?"
|
||||
msgstr "Чм повинна трей-іконка бути включена?"
|
||||
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
# I2P
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the desktopgui package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# ducki2p <ducki2p@gmail.com>, 2011.
|
||||
# walking <walking@i2pmail.org>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-02-16 17:10+0000\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
|
||||
"POT-Creation-Date: 2011-03-03 18:29+0000\n"
|
||||
"PO-Revision-Date: 2011-03-24 09:18+0000\n"
|
||||
"Last-Translator: walking <walking@i2pmail.org>\n"
|
||||
"Language-Team: Chinese (China) (http://www.transifex.net/projects/p/I2P/team/zh_CN/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: zh_CN\n"
|
||||
"Plural-Forms: nplurals=1; plural=0\n"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
|
||||
msgid "Start I2P"
|
||||
@@ -28,7 +37,7 @@ msgstr "正在启动I2P浏览器"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:50
|
||||
msgid "Configure desktopgui"
|
||||
msgstr "界面设置"
|
||||
msgstr "设置desktopgui"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:67
|
||||
msgid "Restart I2P"
|
||||
@@ -38,13 +47,12 @@ msgstr "重启 I2P"
|
||||
msgid "Stop I2P"
|
||||
msgstr "停止 I2P"
|
||||
|
||||
#. Translate interface
|
||||
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:26
|
||||
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
|
||||
msgid "Tray icon configuration"
|
||||
msgstr "托盘图标配置"
|
||||
|
||||
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
|
||||
msgid "Should tray icon be enabled?"
|
||||
msgstr "显示托盘图标。"
|
||||
msgstr "是否启用托盘图标?"
|
||||
|
||||
#~ msgid "Browser not found"
|
||||
#~ msgstr "Browser niet gevonden"
|
||||
#~ msgid "The default browser for your system was not found."
|
||||
#~ msgstr "De standaard webbrowser voor je systeem werd niet gevonden."
|
||||
|
||||
|
||||
@@ -44,34 +44,34 @@ import org.klomp.snark.dht.DHT;
|
||||
* (but not multiple SnarkManagers, it is still static)
|
||||
*/
|
||||
public class I2PSnarkUtil {
|
||||
private I2PAppContext _context;
|
||||
private Log _log;
|
||||
private final I2PAppContext _context;
|
||||
private final Log _log;
|
||||
|
||||
private boolean _shouldProxy;
|
||||
private String _proxyHost;
|
||||
private int _proxyPort;
|
||||
private String _i2cpHost;
|
||||
private int _i2cpPort;
|
||||
private Map<String, String> _opts;
|
||||
private final Map<String, String> _opts;
|
||||
private I2PSocketManager _manager;
|
||||
private boolean _configured;
|
||||
private final Set<Hash> _shitlist;
|
||||
private int _maxUploaders;
|
||||
private int _maxUpBW;
|
||||
private int _maxConnections;
|
||||
private File _tmpDir;
|
||||
private final File _tmpDir;
|
||||
private int _startupDelay;
|
||||
private boolean _shouldUseOT;
|
||||
private boolean _areFilesPublic;
|
||||
private String _openTrackerString;
|
||||
private DHT _dht;
|
||||
|
||||
public static final int DEFAULT_STARTUP_DELAY = 3;
|
||||
public static final String PROP_USE_OPENTRACKERS = "i2psnark.useOpentrackers";
|
||||
public static final boolean DEFAULT_USE_OPENTRACKERS = true;
|
||||
public static final String PROP_OPENTRACKERS = "i2psnark.opentrackers";
|
||||
public static final String DEFAULT_OPENTRACKERS = "http://tracker.welterde.i2p/a";
|
||||
public static final int DEFAULT_MAX_UP_BW = 8; //KBps
|
||||
public static final int MAX_CONNECTIONS = 16; // per torrent
|
||||
private static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
|
||||
public static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
|
||||
//private static final boolean ENABLE_DHT = true;
|
||||
|
||||
public I2PSnarkUtil(I2PAppContext ctx) {
|
||||
@@ -125,6 +125,8 @@ public class I2PSnarkUtil {
|
||||
// can't remove any options this way...
|
||||
if (opts != null)
|
||||
_opts.putAll(opts);
|
||||
// this updates the session options and tells the router
|
||||
setMaxUpBW(_maxUpBW);
|
||||
_configured = true;
|
||||
}
|
||||
|
||||
@@ -134,6 +136,7 @@ public class I2PSnarkUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* This updates the session options and tells the router
|
||||
* @param limit KBps
|
||||
*/
|
||||
public void setMaxUpBW(int limit) {
|
||||
@@ -175,6 +178,12 @@ public class I2PSnarkUtil {
|
||||
public int getMaxConnections() { return _maxConnections; }
|
||||
public int getStartupDelay() { return _startupDelay; }
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public boolean getFilesPublic() { return _areFilesPublic; }
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public void setFilesPublic(boolean yes) { _areFilesPublic = yes; }
|
||||
|
||||
/**
|
||||
* Connect to the router, if we aren't already
|
||||
*/
|
||||
@@ -433,14 +442,13 @@ public class I2PSnarkUtil {
|
||||
|
||||
/** @param ot non-null */
|
||||
public void setOpenTrackerString(String ot) {
|
||||
_opts.put(PROP_OPENTRACKERS, ot);
|
||||
_openTrackerString = ot;
|
||||
}
|
||||
|
||||
public String getOpenTrackerString() {
|
||||
String rv = (String) _opts.get(PROP_OPENTRACKERS);
|
||||
if (rv == null)
|
||||
if (_openTrackerString == null)
|
||||
return DEFAULT_OPENTRACKERS;
|
||||
return rv;
|
||||
return _openTrackerString;
|
||||
}
|
||||
|
||||
/** comma delimited list open trackers to use as backups */
|
||||
|
||||
@@ -24,7 +24,6 @@ import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
|
||||
@@ -32,7 +31,7 @@ import net.i2p.I2PAppContext;
|
||||
* TimerTask that checks for good/bad up/downloader. Works together
|
||||
* with the PeerCoordinator to select which Peers get (un)choked.
|
||||
*/
|
||||
class PeerCheckerTask extends TimerTask
|
||||
class PeerCheckerTask implements Runnable
|
||||
{
|
||||
private static final long KILOPERSECOND = 1024*(PeerCoordinator.CHECK_PERIOD/1000);
|
||||
|
||||
@@ -54,8 +53,6 @@ class PeerCheckerTask extends TimerTask
|
||||
List<Peer> peerList = coordinator.peerList();
|
||||
if (peerList.isEmpty() || coordinator.halted()) {
|
||||
coordinator.setRateHistory(0, 0);
|
||||
if (coordinator.halted())
|
||||
cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
package org.klomp.snark;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
|
||||
@@ -29,7 +28,7 @@ import net.i2p.data.DataHelper;
|
||||
* TimerTask that monitors the peers and total up/download speeds.
|
||||
* Works together with the main Snark class to report periodical statistics.
|
||||
*/
|
||||
class PeerMonitorTask extends TimerTask
|
||||
class PeerMonitorTask implements Runnable
|
||||
{
|
||||
final static long MONITOR_PERIOD = 10 * 1000; // Ten seconds.
|
||||
private static final long KILOPERSECOND = 1024 * (MONITOR_PERIOD / 1000);
|
||||
|
||||
@@ -32,8 +32,6 @@ import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Random;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.client.streaming.I2PServerSocket;
|
||||
@@ -781,6 +779,26 @@ public class Snark
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return exact value. or -1 if no storage yet.
|
||||
* getNeeded() * pieceLength(0) isn't accurate if last piece
|
||||
* is still needed.
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public long getRemainingLength() {
|
||||
if (meta != null && storage != null) {
|
||||
long needed = storage.needed();
|
||||
long length0 = meta.getPieceLength(0);
|
||||
long remaining = needed * length0;
|
||||
// fixup if last piece is needed
|
||||
int last = meta.getPieces() - 1;
|
||||
if (last != 0 && !storage.getBitField().get(last))
|
||||
remaining -= length0 - meta.getPieceLength(last);
|
||||
return remaining;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return number of pieces still needed (magnet mode or not), or -1 if unknown
|
||||
* @since 0.8.4
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.klomp.snark;
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
@@ -48,14 +49,14 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
private final Object _addSnarkLock;
|
||||
private /* FIXME final FIXME */ File _configFile;
|
||||
private Properties _config;
|
||||
private I2PAppContext _context;
|
||||
private Log _log;
|
||||
private final I2PAppContext _context;
|
||||
private final Log _log;
|
||||
private final List _messages;
|
||||
private I2PSnarkUtil _util;
|
||||
private final I2PSnarkUtil _util;
|
||||
private PeerCoordinatorSet _peerCoordinatorSet;
|
||||
private ConnectionAcceptor _connectionAcceptor;
|
||||
private Thread _monitor;
|
||||
private boolean _running;
|
||||
private volatile boolean _running;
|
||||
|
||||
public static final String PROP_I2CP_HOST = "i2psnark.i2cpHost";
|
||||
public static final String PROP_I2CP_PORT = "i2psnark.i2cpPort";
|
||||
@@ -71,17 +72,23 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
public static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet.";
|
||||
|
||||
private static final String CONFIG_FILE = "i2psnark.config";
|
||||
public static final String PROP_FILES_PUBLIC = "i2psnark.filesPublic";
|
||||
public static final String PROP_AUTO_START = "i2snark.autoStart"; // oops
|
||||
public static final String DEFAULT_AUTO_START = "false";
|
||||
public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix";
|
||||
public static final String DEFAULT_LINK_PREFIX = "file:///";
|
||||
//public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix";
|
||||
//public static final String DEFAULT_LINK_PREFIX = "file:///";
|
||||
public static final String PROP_STARTUP_DELAY = "i2psnark.startupDelay";
|
||||
public static final String PROP_REFRESH_DELAY = "i2psnark.refreshSeconds";
|
||||
public static final String PROP_THEME = "i2psnark.theme";
|
||||
public static final String DEFAULT_THEME = "ubergine";
|
||||
private static final String PROP_USE_OPENTRACKERS = "i2psnark.useOpentrackers";
|
||||
public static final String PROP_OPENTRACKERS = "i2psnark.opentrackers";
|
||||
|
||||
public static final int MIN_UP_BW = 2;
|
||||
public static final int DEFAULT_MAX_UP_BW = 10;
|
||||
public static final int DEFAULT_STARTUP_DELAY = 3;
|
||||
public static final int DEFAULT_REFRESH_DELAY_SECS = 60;
|
||||
|
||||
private SnarkManager() {
|
||||
_snarks = new ConcurrentHashMap();
|
||||
_magnets = new ConcurrentHashSet();
|
||||
@@ -136,20 +143,57 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean shouldAutoStart() {
|
||||
return Boolean.valueOf(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START+"")).booleanValue();
|
||||
/**
|
||||
* @return default false
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public boolean areFilesPublic() {
|
||||
return Boolean.valueOf(_config.getProperty(PROP_FILES_PUBLIC)).booleanValue();
|
||||
}
|
||||
|
||||
public boolean shouldAutoStart() {
|
||||
return Boolean.valueOf(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START)).booleanValue();
|
||||
}
|
||||
|
||||
/****
|
||||
public String linkPrefix() {
|
||||
return _config.getProperty(PROP_LINK_PREFIX, DEFAULT_LINK_PREFIX + getDataDir().getAbsolutePath() + File.separatorChar);
|
||||
}
|
||||
private int getStartupDelayMinutes() {
|
||||
return Integer.valueOf(_config.getProperty(PROP_STARTUP_DELAY)).intValue();
|
||||
****/
|
||||
|
||||
/**
|
||||
* @return -1 for never
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public int getRefreshDelaySeconds() {
|
||||
try {
|
||||
return Integer.parseInt(_config.getProperty(PROP_REFRESH_DELAY));
|
||||
} catch (NumberFormatException nfe) {
|
||||
return DEFAULT_REFRESH_DELAY_SECS;
|
||||
}
|
||||
}
|
||||
|
||||
private int getStartupDelayMinutes() {
|
||||
try {
|
||||
return Integer.parseInt(_config.getProperty(PROP_STARTUP_DELAY));
|
||||
} catch (NumberFormatException nfe) {
|
||||
return DEFAULT_STARTUP_DELAY;
|
||||
}
|
||||
}
|
||||
|
||||
public File getDataDir() {
|
||||
String dir = _config.getProperty(PROP_DIR, "i2psnark");
|
||||
File f = new SecureDirectory(dir);
|
||||
if (!f.isAbsolute())
|
||||
f = new SecureDirectory(_context.getAppDir(), dir);
|
||||
File f;
|
||||
if (areFilesPublic())
|
||||
f = new File(dir);
|
||||
else
|
||||
f = new SecureDirectory(dir);
|
||||
if (!f.isAbsolute()) {
|
||||
if (areFilesPublic())
|
||||
f = new File(_context.getAppDir(), dir);
|
||||
else
|
||||
f = new SecureDirectory(_context.getAppDir(), dir);
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
@@ -187,8 +231,10 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
_config.setProperty(PROP_DIR, "i2psnark");
|
||||
if (!_config.containsKey(PROP_AUTO_START))
|
||||
_config.setProperty(PROP_AUTO_START, DEFAULT_AUTO_START);
|
||||
if (!_config.containsKey(PROP_REFRESH_DELAY))
|
||||
_config.setProperty(PROP_REFRESH_DELAY, Integer.toString(DEFAULT_REFRESH_DELAY_SECS));
|
||||
if (!_config.containsKey(PROP_STARTUP_DELAY))
|
||||
_config.setProperty(PROP_STARTUP_DELAY, "" + DEFAULT_STARTUP_DELAY);
|
||||
_config.setProperty(PROP_STARTUP_DELAY, Integer.toString(DEFAULT_STARTUP_DELAY));
|
||||
if (!_config.containsKey(PROP_THEME))
|
||||
_config.setProperty(PROP_THEME, DEFAULT_THEME);
|
||||
updateConfig();
|
||||
@@ -258,10 +304,11 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
_util.setMaxUploaders(getInt(PROP_UPLOADERS_TOTAL, Snark.MAX_TOTAL_UPLOADERS));
|
||||
_util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
|
||||
_util.setStartupDelay(getInt(PROP_STARTUP_DELAY, DEFAULT_STARTUP_DELAY));
|
||||
String ot = _config.getProperty(I2PSnarkUtil.PROP_OPENTRACKERS);
|
||||
_util.setFilesPublic(areFilesPublic());
|
||||
String ot = _config.getProperty(PROP_OPENTRACKERS);
|
||||
if (ot != null)
|
||||
_util.setOpenTrackerString(ot);
|
||||
String useOT = _config.getProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS);
|
||||
String useOT = _config.getProperty(PROP_USE_OPENTRACKERS);
|
||||
boolean bOT = useOT == null || Boolean.valueOf(useOT).booleanValue();
|
||||
_util.setUseOpenTrackers(bOT);
|
||||
getDataDir().mkdirs();
|
||||
@@ -278,7 +325,8 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
return defaultVal;
|
||||
}
|
||||
|
||||
public void updateConfig(String dataDir, boolean autoStart, String startDelay, String seedPct, String eepHost,
|
||||
public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay,
|
||||
String startDelay, String seedPct, String eepHost,
|
||||
String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts,
|
||||
String upLimit, String upBW, boolean useOpenTrackers, String openTrackers, String theme) {
|
||||
boolean changed = false;
|
||||
@@ -333,19 +381,34 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
changed = true;
|
||||
_config.setProperty(PROP_STARTUP_DELAY, "" + minutes);
|
||||
addMessage(_("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * 60 * 1000)));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
// FIXME do this even if == null
|
||||
if (i2cpHost != null) {
|
||||
|
||||
if (refreshDelay != null) {
|
||||
try {
|
||||
int secs = Integer.parseInt(refreshDelay);
|
||||
if (secs != getRefreshDelaySeconds()) {
|
||||
changed = true;
|
||||
_config.setProperty(PROP_REFRESH_DELAY, refreshDelay);
|
||||
if (secs >= 0)
|
||||
addMessage(_("Refresh time changed to {0}", DataHelper.formatDuration2(secs * 1000)));
|
||||
else
|
||||
addMessage(_("Refresh disabled"));
|
||||
}
|
||||
} catch (NumberFormatException nfe) {}
|
||||
}
|
||||
|
||||
// Start of I2CP stuff.
|
||||
// i2cpHost will generally be null since it is hidden from the form if in router context.
|
||||
|
||||
int oldI2CPPort = _util.getI2CPPort();
|
||||
String oldI2CPHost = _util.getI2CPHost();
|
||||
int port = oldI2CPPort;
|
||||
if (i2cpPort != null) {
|
||||
try { port = Integer.parseInt(i2cpPort); } catch (NumberFormatException nfe) {}
|
||||
}
|
||||
String host = oldI2CPHost;
|
||||
Map opts = new HashMap();
|
||||
|
||||
Map<String, String> opts = new HashMap();
|
||||
if (i2cpOpts == null) i2cpOpts = "";
|
||||
StringTokenizer tok = new StringTokenizer(i2cpOpts, " \t\n");
|
||||
while (tok.hasMoreTokens()) {
|
||||
@@ -354,7 +417,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
if (split > 0)
|
||||
opts.put(pair.substring(0, split), pair.substring(split+1));
|
||||
}
|
||||
Map oldOpts = new HashMap();
|
||||
Map<String, String> oldOpts = new HashMap();
|
||||
String oldI2CPOpts = _config.getProperty(PROP_I2CP_OPTS);
|
||||
if (oldI2CPOpts == null) oldI2CPOpts = "";
|
||||
tok = new StringTokenizer(oldI2CPOpts, " \t\n");
|
||||
@@ -365,37 +428,39 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
oldOpts.put(pair.substring(0, split), pair.substring(split+1));
|
||||
}
|
||||
|
||||
if ( (i2cpHost.trim().length() > 0) && (port > 0) &&
|
||||
((!host.equals(i2cpHost) ||
|
||||
(port != _util.getI2CPPort()) ||
|
||||
(!oldOpts.equals(opts)))) ) {
|
||||
boolean reconnect = i2cpHost != null && i2cpHost.trim().length() > 0 && port > 0 &&
|
||||
(port != _util.getI2CPPort() || !oldI2CPHost.equals(i2cpHost));
|
||||
if (reconnect || !oldOpts.equals(opts)) {
|
||||
boolean snarksActive = false;
|
||||
Set names = listTorrentFiles();
|
||||
for (Iterator iter = names.iterator(); iter.hasNext(); ) {
|
||||
Snark snark = getTorrent((String)iter.next());
|
||||
if ( (snark != null) && (!snark.isStopped()) ) {
|
||||
snarksActive = true;
|
||||
break;
|
||||
if (reconnect) {
|
||||
for (Snark snark : _snarks.values()) {
|
||||
if (!snark.isStopped()) {
|
||||
snarksActive = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts
|
||||
+ "] oldOpts [" + oldOpts + "]");
|
||||
if (snarksActive) {
|
||||
Properties p = new Properties();
|
||||
p.putAll(opts);
|
||||
_util.setI2CPConfig(i2cpHost, port, p);
|
||||
_util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
|
||||
addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents"));
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts
|
||||
+ "] oldOpts [" + oldOpts + "]");
|
||||
} else if (!reconnect) {
|
||||
// The usual case, the other two are if not in router context
|
||||
_config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim());
|
||||
addMessage(_("I2CP options changed to {0}", i2cpOpts));
|
||||
_util.setI2CPConfig(oldI2CPHost, oldI2CPPort, opts);
|
||||
} else {
|
||||
if (_util.connected()) {
|
||||
_util.disconnect();
|
||||
addMessage(_("Disconnecting old I2CP destination"));
|
||||
}
|
||||
Properties p = new Properties();
|
||||
p.putAll(opts);
|
||||
addMessage(_("I2CP settings changed to {0}", i2cpHost + ":" + port + " (" + i2cpOpts.trim() + ")"));
|
||||
_util.setI2CPConfig(i2cpHost, port, p);
|
||||
addMessage(_("I2CP settings changed to {0}", i2cpHost + ':' + port + ' ' + i2cpOpts));
|
||||
_util.setI2CPConfig(i2cpHost, port, opts);
|
||||
_util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
|
||||
boolean ok = _util.connect();
|
||||
if (!ok) {
|
||||
@@ -409,22 +474,29 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
_config.setProperty(PROP_I2CP_HOST, i2cpHost.trim());
|
||||
_config.setProperty(PROP_I2CP_PORT, "" + port);
|
||||
_config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim());
|
||||
changed = true;
|
||||
// no PeerAcceptors/I2PServerSockets to deal with, since all snarks are inactive
|
||||
for (Iterator iter = names.iterator(); iter.hasNext(); ) {
|
||||
String name = (String)iter.next();
|
||||
Snark snark = getTorrent(name);
|
||||
if (snark != null && snark.restartAcceptor()) {
|
||||
for (Snark snark : _snarks.values()) {
|
||||
if (snark.restartAcceptor()) {
|
||||
addMessage(_("I2CP listener restarted for \"{0}\"", snark.getBaseName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
changed = true;
|
||||
}
|
||||
} // reconnect || changed options
|
||||
|
||||
if (areFilesPublic() != filesPublic) {
|
||||
_config.setProperty(PROP_FILES_PUBLIC, Boolean.toString(filesPublic));
|
||||
_util.setFilesPublic(filesPublic);
|
||||
if (filesPublic)
|
||||
addMessage(_("New files will be publicly readable"));
|
||||
else
|
||||
addMessage(_("New files will not be publicly readable"));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (shouldAutoStart() != autoStart) {
|
||||
_config.setProperty(PROP_AUTO_START, autoStart + "");
|
||||
_config.setProperty(PROP_AUTO_START, Boolean.toString(autoStart));
|
||||
if (autoStart)
|
||||
addMessage(_("Enabled autostart"));
|
||||
else
|
||||
@@ -432,7 +504,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
changed = true;
|
||||
}
|
||||
if (_util.shouldUseOpenTrackers() != useOpenTrackers) {
|
||||
_config.setProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS, useOpenTrackers + "");
|
||||
_config.setProperty(PROP_USE_OPENTRACKERS, useOpenTrackers + "");
|
||||
if (useOpenTrackers)
|
||||
addMessage(_("Enabled open trackers - torrent restart required to take effect."));
|
||||
else
|
||||
@@ -442,7 +514,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
}
|
||||
if (openTrackers != null) {
|
||||
if (openTrackers.trim().length() > 0 && !openTrackers.trim().equals(_util.getOpenTrackerString())) {
|
||||
_config.setProperty(I2PSnarkUtil.PROP_OPENTRACKERS, openTrackers.trim());
|
||||
_config.setProperty(PROP_OPENTRACKERS, openTrackers.trim());
|
||||
_util.setOpenTrackerString(openTrackers);
|
||||
addMessage(_("Open Tracker list changed - torrent restart required to take effect."));
|
||||
changed = true;
|
||||
@@ -489,7 +561,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
* Grab the torrent given the (canonical) filename of the .torrent file
|
||||
* @return Snark or null
|
||||
*/
|
||||
public Snark getTorrent(String filename) { synchronized (_snarks) { return (Snark)_snarks.get(filename); } }
|
||||
public Snark getTorrent(String filename) { synchronized (_snarks) { return _snarks.get(filename); } }
|
||||
|
||||
/**
|
||||
* Grab the torrent given the base name of the storage
|
||||
@@ -723,7 +795,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
// so addTorrent won't recheck
|
||||
saveTorrentStatus(metainfo, bitfield, null); // no file priorities
|
||||
try {
|
||||
locked_writeMetaInfo(metainfo, filename);
|
||||
locked_writeMetaInfo(metainfo, filename, areFilesPublic());
|
||||
// hold the lock for a long time
|
||||
addTorrent(filename, dontAutoStart);
|
||||
} catch (IOException ioe) {
|
||||
@@ -754,7 +826,8 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
_log.error("Failed to write torrent file to " + filename);
|
||||
return;
|
||||
}
|
||||
SecureFileOutputStream.setPerms(new File(filename));
|
||||
if (!areFilesPublic())
|
||||
SecureFileOutputStream.setPerms(new File(filename));
|
||||
// hold the lock for a long time
|
||||
addTorrent(filename);
|
||||
}
|
||||
@@ -769,13 +842,16 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
* Must be a filesystem-safe name.
|
||||
* @since 0.8.4
|
||||
*/
|
||||
private static void locked_writeMetaInfo(MetaInfo metainfo, String filename) throws IOException {
|
||||
private static void locked_writeMetaInfo(MetaInfo metainfo, String filename, boolean areFilesPublic) throws IOException {
|
||||
File file = new File(filename);
|
||||
if (file.exists())
|
||||
throw new IOException("Cannot overwrite an existing .torrent file: " + file.getPath());
|
||||
OutputStream out = null;
|
||||
try {
|
||||
out = new SecureFileOutputStream(filename);
|
||||
if (areFilesPublic)
|
||||
out = new FileOutputStream(filename);
|
||||
else
|
||||
out = new SecureFileOutputStream(filename);
|
||||
out.write(metainfo.getTorrentData());
|
||||
} catch (IOException ioe) {
|
||||
// remove any partial
|
||||
@@ -783,7 +859,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
throw ioe;
|
||||
} finally {
|
||||
try {
|
||||
if (out == null)
|
||||
if (out != null)
|
||||
out.close();
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
@@ -1089,7 +1165,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
// although the user will see the default until then
|
||||
getBWLimit();
|
||||
boolean doMagnets = true;
|
||||
while (true) {
|
||||
while (_running) {
|
||||
File dir = getDataDir();
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
|
||||
@@ -1102,8 +1178,12 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
_log.error("Error in the DirectoryMonitor", e);
|
||||
}
|
||||
if (doMagnets) {
|
||||
addMagnets();
|
||||
doMagnets = false;
|
||||
try {
|
||||
addMagnets();
|
||||
doMagnets = false;
|
||||
} catch (Exception e) {
|
||||
_log.error("Error in the DirectoryMonitor", e);
|
||||
}
|
||||
}
|
||||
try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
|
||||
}
|
||||
@@ -1166,7 +1246,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
if (announce != null)
|
||||
meta = meta.reannounce(announce);
|
||||
synchronized (_snarks) {
|
||||
locked_writeMetaInfo(meta, name);
|
||||
locked_writeMetaInfo(meta, name, areFilesPublic());
|
||||
// put it in the list under the new name
|
||||
_snarks.remove(snark.getName());
|
||||
_snarks.put(name, snark);
|
||||
@@ -1222,6 +1302,8 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
}
|
||||
|
||||
Set<String> existingNames = listTorrentFiles();
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("DirMon found: " + DataHelper.toString(foundNames) + " existing: " + DataHelper.toString(existingNames));
|
||||
// lets find new ones first...
|
||||
for (int i = 0; i < foundNames.size(); i++) {
|
||||
if (existingNames.contains(foundNames.get(i))) {
|
||||
@@ -1288,8 +1370,9 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
// , "Galen", "http://5jpwQMI5FT303YwKa5Rd38PYSX04pbIKgTaKQsWbqoWjIfoancFdWCShXHLI5G5ofOb0Xu11vl2VEMyPsg1jUFYSVnu4-VfMe3y4TKTR6DTpetWrnmEK6m2UXh91J5DZJAKlgmO7UdsFlBkQfR2rY853-DfbJtQIFl91tbsmjcA5CGQi4VxMFyIkBzv-pCsuLQiZqOwWasTlnzey8GcDAPG1LDcvfflGV~6F5no9mnuisZPteZKlrv~~TDoXTj74QjByWc4EOYlwqK8sbU9aOvz~s31XzErbPTfwiawiaZ0RUI-IDrKgyvmj0neuFTWgjRGVTH8bz7cBZIc3viy6ioD-eMQOrXaQL0TCWZUelRwHRvgdPiQrxdYQs7ixkajeHzxi-Pq0EMm5Vbh3j3Q9kfUFW3JjFDA-MLB4g6XnjCbM5J1rC0oOBDCIEfhQkszru5cyLjHiZ5yeA0VThgu~c7xKHybv~OMXION7V8pBKOgET7ZgAkw1xgYe3Kkyq5syAAAA.i2p/tr/announce.php=http://galen.i2p/tr/"
|
||||
"Postman", "http://tracker2.postman.i2p/announce.php=http://tracker2.postman.i2p/"
|
||||
,"Welterde", "http://tracker.welterde.i2p/a=http://tracker.welterde.i2p/stats?mode=top5"
|
||||
,"Diftracker", "http://n--XWjHjUPjnMNrSwXA2OYXpMIUL~u4FNXnrt2HtjK3y6j~4SOClyyeKzd0zRPlixxkCe2wfBIYye3bZsaqAD8bd0QMmowxbq91WpjsPfKMiphJbePKXtYAVARiy0cqyvh1d2LyDE-6wkvgaw45hknmS0U-Dg3YTJZbAQRU2SKXgIlAbWCv4R0kDFBLEVpReDiJef3rzAWHiW8yjmJuJilkYjMwlfRjw8xx1nl2s~yhlljk1pl13jGYb0nfawQnuOWeP-ASQWvAAyVgKvZRJE2O43S7iveu9piuv7plXWbt36ef7ndu2GNoNyPOBdpo9KUZ-NOXm4Kgh659YtEibL15dEPAOdxprY0sYUurVw8OIWqrpX7yn08nbi6qHVGqQwTpxH35vkL8qrCbm-ym7oQJQnNmSDrNTyWYRFSq5s5~7DAdFDzqRPW-pX~g0zEivWj5tzkhvG9rVFgFo0bpQX3X0PUAV9Xbyf8u~v8Zbr9K1pCPqBq9XEr4TqaLHw~bfAAAA.i2p/announce.php=http://diftracker.i2p/"
|
||||
// , "CRSTRACK", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/"
|
||||
,"Exotrack", "http://blbgywsjubw3d2zih2giokakhe3o2cko7jtte4risb3hohbcoyva.b32.i2p/announce.php=http://exotrack.i2p/"
|
||||
// ,"Exotrack", "http://blbgywsjubw3d2zih2giokakhe3o2cko7jtte4risb3hohbcoyva.b32.i2p/announce.php=http://exotrack.i2p/"
|
||||
};
|
||||
|
||||
/** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */
|
||||
|
||||
@@ -48,7 +48,7 @@ public class Storage
|
||||
private int[] priorities;
|
||||
|
||||
private final StorageListener listener;
|
||||
private I2PSnarkUtil _util;
|
||||
private final I2PSnarkUtil _util;
|
||||
|
||||
private /* FIXME final FIXME */ BitField bitfield; // BitField to represent the pieces
|
||||
private int needed; // Number of pieces needed
|
||||
@@ -433,7 +433,12 @@ public class Storage
|
||||
/** use a saved bitfield and timestamp from a config file */
|
||||
public void check(String rootDir, long savedTime, BitField savedBitField) throws IOException
|
||||
{
|
||||
File base = new SecureFile(rootDir, filterName(metainfo.getName()));
|
||||
File base;
|
||||
boolean areFilesPublic = _util.getFilesPublic();
|
||||
if (areFilesPublic)
|
||||
base = new File(rootDir, filterName(metainfo.getName()));
|
||||
else
|
||||
base = new SecureFile(rootDir, filterName(metainfo.getName()));
|
||||
boolean useSavedBitField = savedTime > 0 && savedBitField != null;
|
||||
|
||||
List<List<String>> files = metainfo.getFiles();
|
||||
@@ -479,7 +484,7 @@ public class Storage
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
List<String> path = files.get(i);
|
||||
File f = createFileFromNames(base, path);
|
||||
File f = createFileFromNames(base, path, areFilesPublic);
|
||||
// dup file name check after filtering
|
||||
for (int j = 0; j < i; j++) {
|
||||
if (f.equals(RAFfile[j])) {
|
||||
@@ -495,7 +500,7 @@ public class Storage
|
||||
else
|
||||
lastPath = '_' + lastPath;
|
||||
path.set(last, lastPath);
|
||||
f = createFileFromNames(base, path);
|
||||
f = createFileFromNames(base, path, areFilesPublic);
|
||||
j = 0;
|
||||
}
|
||||
}
|
||||
@@ -585,7 +590,7 @@ public class Storage
|
||||
* things going in the wrong place if there are duplicates
|
||||
* in intermediate path elements after filtering.
|
||||
*/
|
||||
private static File createFileFromNames(File base, List<String> names) throws IOException
|
||||
private static File createFileFromNames(File base, List<String> names, boolean areFilesPublic) throws IOException
|
||||
{
|
||||
File f = null;
|
||||
Iterator<String> it = names.iterator();
|
||||
@@ -595,7 +600,10 @@ public class Storage
|
||||
if (it.hasNext())
|
||||
{
|
||||
// Another dir in the hierarchy.
|
||||
f = new File(base, name);
|
||||
if (areFilesPublic)
|
||||
f = new File(base, name);
|
||||
else
|
||||
f = new SecureFile(base, name);
|
||||
if (!f.mkdir() && !f.isDirectory())
|
||||
throw new IOException("Could not create directory " + f);
|
||||
base = f;
|
||||
@@ -603,7 +611,10 @@ public class Storage
|
||||
else
|
||||
{
|
||||
// The final element (file) in the hierarchy.
|
||||
f = new SecureFile(base, name);
|
||||
if (areFilesPublic)
|
||||
f = new File(base, name);
|
||||
else
|
||||
f = new SecureFile(base, name);
|
||||
if (!f.createNewFile() && !f.exists())
|
||||
throw new IOException("Could not create file " + f);
|
||||
}
|
||||
@@ -751,27 +762,19 @@ public class Storage
|
||||
openRAF(nr, false); // RW
|
||||
// XXX - Is this the best way to make sure we have enough space for
|
||||
// the whole file?
|
||||
long remaining = lengths[nr];
|
||||
if (listener != null)
|
||||
listener.storageCreateFile(this, names[nr], lengths[nr]);
|
||||
final int ZEROBLOCKSIZE = piece_size;
|
||||
byte[] zeros;
|
||||
try {
|
||||
zeros = new byte[ZEROBLOCKSIZE];
|
||||
} catch (OutOfMemoryError oom) {
|
||||
throw new IOException(oom.toString());
|
||||
listener.storageCreateFile(this, names[nr], remaining);
|
||||
final int ZEROBLOCKSIZE = (int) Math.min(remaining, 32*1024);
|
||||
byte[] zeros = new byte[ZEROBLOCKSIZE];
|
||||
while (remaining > 0) {
|
||||
int size = (int) Math.min(remaining, ZEROBLOCKSIZE);
|
||||
rafs[nr].write(zeros, 0, size);
|
||||
remaining -= size;
|
||||
}
|
||||
int i;
|
||||
for (i = 0; i < lengths[nr]/ZEROBLOCKSIZE; i++)
|
||||
{
|
||||
rafs[nr].write(zeros);
|
||||
if (listener != null)
|
||||
listener.storageAllocated(this, ZEROBLOCKSIZE);
|
||||
}
|
||||
int size = (int)(lengths[nr] - i*ZEROBLOCKSIZE);
|
||||
rafs[nr].write(zeros, 0, size);
|
||||
// caller will close rafs[nr]
|
||||
if (listener != null)
|
||||
listener.storageAllocated(this, size);
|
||||
listener.storageAllocated(this, lengths[nr]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@ import net.i2p.data.DataHelper;
|
||||
import net.i2p.util.FileUtil;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SecureFileOutputStream;
|
||||
|
||||
import org.klomp.snark.I2PSnarkUtil;
|
||||
import org.klomp.snark.MetaInfo;
|
||||
@@ -208,8 +207,11 @@ public class I2PSnarkServlet extends Default {
|
||||
out.write("</title>\n");
|
||||
|
||||
// we want it to go to the base URI so we don't refresh with some funky action= value
|
||||
if (!isConfigure)
|
||||
out.write("<meta http-equiv=\"refresh\" content=\"60;/i2psnark/" + peerString + "\">\n");
|
||||
if (!isConfigure) {
|
||||
int delay = _manager.getRefreshDelaySeconds();
|
||||
if (delay > 0)
|
||||
out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n");
|
||||
}
|
||||
out.write(HEADER_A + _themePath + HEADER_B);
|
||||
out.write("</head><body>");
|
||||
out.write("<center>");
|
||||
@@ -611,6 +613,7 @@ public class I2PSnarkServlet extends Default {
|
||||
}
|
||||
} else if ("Save".equals(action)) {
|
||||
String dataDir = req.getParameter("dataDir");
|
||||
boolean filesPublic = req.getParameter("filesPublic") != null;
|
||||
boolean autoStart = req.getParameter("autoStart") != null;
|
||||
String seedPct = req.getParameter("seedPct");
|
||||
String eepHost = req.getParameter("eepHost");
|
||||
@@ -620,11 +623,14 @@ public class I2PSnarkServlet extends Default {
|
||||
String i2cpOpts = buildI2CPOpts(req);
|
||||
String upLimit = req.getParameter("upLimit");
|
||||
String upBW = req.getParameter("upBW");
|
||||
String refreshDel = req.getParameter("refreshDelay");
|
||||
String startupDel = req.getParameter("startupDelay");
|
||||
boolean useOpenTrackers = req.getParameter("useOpenTrackers") != null;
|
||||
String openTrackers = req.getParameter("openTrackers");
|
||||
String theme = req.getParameter("theme");
|
||||
_manager.updateConfig(dataDir, autoStart, startupDel, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, openTrackers, theme);
|
||||
_manager.updateConfig(dataDir, filesPublic, autoStart, refreshDel, startupDel,
|
||||
seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts,
|
||||
upLimit, upBW, useOpenTrackers, openTrackers, theme);
|
||||
} else if ("Create".equals(action)) {
|
||||
String baseData = req.getParameter("baseFile");
|
||||
if (baseData != null && baseData.trim().length() > 0) {
|
||||
@@ -765,8 +771,7 @@ public class I2PSnarkServlet extends Default {
|
||||
}
|
||||
}
|
||||
long total = snark.getTotalLength();
|
||||
// Early typecast, avoid possibly overflowing a temp integer
|
||||
long remaining = (long) snark.getNeeded() * (long) snark.getPieceLength(0);
|
||||
long remaining = snark.getRemainingLength();
|
||||
if (remaining > total)
|
||||
remaining = total;
|
||||
long downBps = snark.getDownloadRate();
|
||||
@@ -978,7 +983,7 @@ public class I2PSnarkServlet extends Default {
|
||||
if (noThinsp)
|
||||
out.write("<a href=\"/i2psnark/?action=Remove_" + b64 + "&nonce=" + _nonce + "\"><img title=\"");
|
||||
else
|
||||
out.write("<input type=\"image\" name=\"action\" value=\"Remove_" + b64 + "\" title=\"");
|
||||
out.write("<input type=\"image\" name=\"action_Remove_" + b64 + "\" value=\"foo\" title=\"");
|
||||
out.write(_("Remove the torrent from the active list, deleting the .torrent file"));
|
||||
out.write("\" onclick=\"if (!confirm('");
|
||||
// Can't figure out how to escape double quotes inside the onclick string.
|
||||
@@ -1191,7 +1196,7 @@ public class I2PSnarkServlet extends Default {
|
||||
out.write("</span><hr>\n<table border=\"0\"><tr><td>");
|
||||
out.write(_("From URL"));
|
||||
out.write(":<td><input type=\"text\" name=\"newURL\" size=\"85\" value=\"" + newURL + "\"");
|
||||
out.write("title=\"");
|
||||
out.write(" title=\"");
|
||||
out.write(_("Enter the torrent file download URL (I2P only), magnet link, or maggot link"));
|
||||
out.write("\"> \n");
|
||||
// not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve)
|
||||
@@ -1260,44 +1265,55 @@ public class I2PSnarkServlet extends Default {
|
||||
out.write(" <input type=\"text\" name=\"announceURLOther\" size=\"57\" value=\"http://\" " +
|
||||
"title=\"");
|
||||
out.write(_("Specify custom tracker announce URL"));
|
||||
out.write("\" > ");
|
||||
out.write("<input type=\"submit\" value=\"");
|
||||
out.write("\" > " +
|
||||
"<input type=\"submit\" value=\"");
|
||||
out.write(_("Create torrent"));
|
||||
out.write("\" name=\"foo\" ></table>\n");
|
||||
out.write("</form></div></div>");
|
||||
out.write("\" name=\"foo\" ></table>\n" +
|
||||
"</form></div></div>");
|
||||
}
|
||||
|
||||
private static final int[] times = { 30, 60, 2*60, 5*60, 10*60, 30*60, -1 };
|
||||
|
||||
private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||
String dataDir = _manager.getDataDir().getAbsolutePath();
|
||||
boolean filesPublic = _manager.areFilesPublic();
|
||||
boolean autoStart = _manager.shouldAutoStart();
|
||||
boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers();
|
||||
String openTrackers = _manager.util().getOpenTrackerString();
|
||||
//int seedPct = 0;
|
||||
|
||||
out.write("<form action=\"/i2psnark/configure\" method=\"POST\">\n");
|
||||
out.write("<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n");
|
||||
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
|
||||
out.write("<input type=\"hidden\" name=\"action\" value=\"Save\" >\n");
|
||||
out.write("<span class=\"snarkConfigTitle\">");
|
||||
out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
|
||||
out.write("<form action=\"/i2psnark/configure\" method=\"POST\">\n" +
|
||||
"<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n" +
|
||||
"<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n" +
|
||||
"<input type=\"hidden\" name=\"action\" value=\"Save\" >\n" +
|
||||
"<span class=\"snarkConfigTitle\">" +
|
||||
"<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
|
||||
out.write(_("Configuration"));
|
||||
out.write("</span><hr>\n");
|
||||
out.write("<table border=\"0\"><tr><td>");
|
||||
out.write("</span><hr>\n" +
|
||||
"<table border=\"0\"><tr><td>");
|
||||
|
||||
out.write(_("Data directory"));
|
||||
out.write(": <td><code>" + dataDir + "</code> <i>(");
|
||||
out.write(_("Edit i2psnark.config and restart to change"));
|
||||
out.write(")</i><br>\n");
|
||||
out.write(")</i><br>\n" +
|
||||
|
||||
out.write("<tr><td>");
|
||||
"<tr><td>");
|
||||
out.write(_("Files readable by all"));
|
||||
out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"filesPublic\" value=\"true\" "
|
||||
+ (filesPublic ? "checked " : "")
|
||||
+ "title=\"");
|
||||
out.write(_("If checked, other users may access the downloaded files"));
|
||||
out.write("\" >" +
|
||||
|
||||
"<tr><td>");
|
||||
out.write(_("Auto start"));
|
||||
out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"autoStart\" value=\"true\" "
|
||||
+ (autoStart ? "checked " : "")
|
||||
+ "title=\"");
|
||||
out.write(_("If checked, automatically start torrents that are added"));
|
||||
out.write("\" >");
|
||||
out.write("\" >" +
|
||||
|
||||
out.write("<tr><td>");
|
||||
"<tr><td>");
|
||||
out.write(_("Theme"));
|
||||
out.write(": <td><select name='theme'>");
|
||||
String theme = _manager.getTheme();
|
||||
@@ -1308,9 +1324,28 @@ public class I2PSnarkServlet extends Default {
|
||||
else
|
||||
out.write("\n<OPTION value=\"" + themes[i] + "\">" + themes[i]);
|
||||
}
|
||||
out.write("</select>\n");
|
||||
out.write("</select>\n" +
|
||||
|
||||
out.write("<tr><td>");
|
||||
"<tr><td>");
|
||||
out.write(_("Refresh time"));
|
||||
out.write(": <td><select name=\"refreshDelay\">");
|
||||
int delay = _manager.getRefreshDelaySeconds();
|
||||
for (int i = 0; i < times.length; i++) {
|
||||
out.write("<option value=\"");
|
||||
out.write(Integer.toString(times[i]));
|
||||
out.write("\"");
|
||||
if (times[i] == delay)
|
||||
out.write(" selected=\"true\"");
|
||||
out.write(">");
|
||||
if (times[i] > 0)
|
||||
out.write(DataHelper.formatDuration2(times[i] * 1000));
|
||||
else
|
||||
out.write(_("Never"));
|
||||
out.write("</option>\n");
|
||||
}
|
||||
out.write("</select><br>" +
|
||||
|
||||
"<tr><td>");
|
||||
out.write(_("Startup delay"));
|
||||
out.write(": <td><input name=\"startupDelay\" size=\"3\" class=\"r\" value=\"" + _manager.util().getStartupDelay() + "\"> ");
|
||||
out.write(_("minutes"));
|
||||
@@ -1341,26 +1376,26 @@ public class I2PSnarkServlet extends Default {
|
||||
out.write(": <td><input type=\"text\" name=\"upLimit\" class=\"r\" value=\""
|
||||
+ _manager.util().getMaxUploaders() + "\" size=\"3\" maxlength=\"3\" > ");
|
||||
out.write(_("peers"));
|
||||
out.write("<br>\n");
|
||||
out.write("<br>\n" +
|
||||
|
||||
out.write("<tr><td>");
|
||||
"<tr><td>");
|
||||
out.write(_("Up bandwidth limit"));
|
||||
out.write(": <td><input type=\"text\" name=\"upBW\" class=\"r\" value=\""
|
||||
+ _manager.util().getMaxUpBW() + "\" size=\"3\" maxlength=\"3\" > KBps <i>(");
|
||||
out.write(_("Half available bandwidth recommended."));
|
||||
out.write(" <a href=\"/config.jsp\" target=\"blank\">");
|
||||
out.write(_("View or change router bandwidth"));
|
||||
out.write("</a>)</i><br>\n");
|
||||
out.write("</a>)</i><br>\n" +
|
||||
|
||||
out.write("<tr><td>");
|
||||
"<tr><td>");
|
||||
out.write(_("Use open trackers also"));
|
||||
out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"useOpenTrackers\" value=\"true\" "
|
||||
+ (useOpenTrackers ? "checked " : "")
|
||||
+ "title=\"");
|
||||
out.write(_("If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"));
|
||||
out.write("\" > ");
|
||||
out.write("\" > " +
|
||||
|
||||
out.write("<tr><td>");
|
||||
"<tr><td>");
|
||||
out.write(_("Open tracker announce URLs"));
|
||||
out.write(": <td><input type=\"text\" name=\"openTrackers\" value=\""
|
||||
+ openTrackers + "\" size=\"50\" ><br>\n");
|
||||
@@ -1389,36 +1424,38 @@ public class I2PSnarkServlet extends Default {
|
||||
out.write("<tr><td>");
|
||||
out.write(_("I2CP host"));
|
||||
out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\""
|
||||
+ _manager.util().getI2CPHost() + "\" size=\"15\" > ");
|
||||
+ _manager.util().getI2CPHost() + "\" size=\"15\" > " +
|
||||
|
||||
out.write("<tr><td>");
|
||||
"<tr><td>");
|
||||
out.write(_("I2CP port"));
|
||||
out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" +
|
||||
+ _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n");
|
||||
}
|
||||
|
||||
options.remove(I2PSnarkUtil.PROP_MAX_BW);
|
||||
// was accidentally in the I2CP options prior to 0.8.9 so it will be in old config files
|
||||
options.remove(SnarkManager.PROP_OPENTRACKERS);
|
||||
StringBuilder opts = new StringBuilder(64);
|
||||
for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) {
|
||||
Map.Entry entry = (Map.Entry)iter.next();
|
||||
String key = (String)entry.getKey();
|
||||
String val = (String)entry.getValue();
|
||||
for (Map.Entry<String, String> e : options.entrySet()) {
|
||||
String key = e.getKey();
|
||||
String val = e.getValue();
|
||||
opts.append(key).append('=').append(val).append(' ');
|
||||
}
|
||||
out.write("<tr><td>");
|
||||
out.write(_("I2CP options"));
|
||||
out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" spellcheck=\"false\" >"
|
||||
+ opts.toString() + "</textarea><br>\n");
|
||||
+ opts.toString() + "</textarea><br>\n" +
|
||||
|
||||
out.write("<tr><td> <td><input type=\"submit\" value=\"");
|
||||
"<tr><td> <td><input type=\"submit\" value=\"");
|
||||
out.write(_("Save configuration"));
|
||||
out.write("\" name=\"foo\" >\n");
|
||||
out.write("</table></div></div></form>");
|
||||
out.write("\" name=\"foo\" >\n" +
|
||||
"</table></div></div></form>");
|
||||
}
|
||||
|
||||
private void writeConfigLink(PrintWriter out) throws IOException {
|
||||
out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n");
|
||||
out.write("<span class=\"snarkConfigTitle\"><a href=\"configure\">");
|
||||
out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
|
||||
out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n" +
|
||||
"<span class=\"snarkConfigTitle\"><a href=\"configure\">" +
|
||||
"<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
|
||||
out.write(_("Configuration"));
|
||||
out.write("</a></span></span></div>\n");
|
||||
}
|
||||
@@ -1849,7 +1886,7 @@ public class I2PSnarkServlet extends Default {
|
||||
buf.append("</TR>\n");
|
||||
}
|
||||
if (showSaveButton) {
|
||||
buf.append("<thead><tr><th colspan=\"3\"> </th><th align=\"center\"><input type=\"submit\" value=\"");
|
||||
buf.append("<thead><tr><th colspan=\"3\"> </th><th class=\"headerpriority\"><input type=\"submit\" value=\"");
|
||||
buf.append(_("Save priorities"));
|
||||
buf.append("\" name=\"foo\" ></th></tr></thead>\n");
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2psnark\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-05-02 11:08+0000\n"
|
||||
"POT-Creation-Date: 2011-07-08 13:20+0000\n"
|
||||
"PO-Revision-Date: 2011-05-19 07:39+0100\n"
|
||||
"Last-Translator: magma <magma@mail.i2p>\n"
|
||||
"Language-Team: foo <foo@bar>\n"
|
||||
@@ -46,7 +46,9 @@ msgstr "Délai de démarrage modifié à {0} minutes"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:386
|
||||
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
|
||||
msgstr "Les modifications d'I2CP et des tunnels seront prise en compte après avoir arrêté tous les torrents"
|
||||
msgstr ""
|
||||
"Les modifications d'I2CP et des tunnels seront prise en compte après avoir "
|
||||
"arrêté tous les torrents"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:393
|
||||
msgid "Disconnecting old I2CP destination"
|
||||
@@ -58,8 +60,11 @@ msgid "I2CP settings changed to {0}"
|
||||
msgstr "Les paramètres I2CP ont été changés : {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:402
|
||||
msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
|
||||
msgstr "Impossible de se connecter avec les nouveaux paramètres, retour à l'ancienne configuration I2CP"
|
||||
msgid ""
|
||||
"Unable to connect with the new settings, reverting to the old I2CP settings"
|
||||
msgstr ""
|
||||
"Impossible de se connecter avec les nouveaux paramètres, retour à l'ancienne "
|
||||
"configuration I2CP"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:406
|
||||
msgid "Unable to reconnect with the old settings!"
|
||||
@@ -84,20 +89,27 @@ msgstr "Démarrage automatique désactivé"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:437
|
||||
msgid "Enabled open trackers - torrent restart required to take effect."
|
||||
msgstr "Open trackers activés - redémarrage des torrents requis pour prise en compte."
|
||||
msgstr ""
|
||||
"Open trackers activés - redémarrage des torrents requis pour prise en compte."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:439
|
||||
msgid "Disabled open trackers - torrent restart required to take effect."
|
||||
msgstr "Open trackers désactivés - redémarrage des torrents requis pour prise en compte."
|
||||
msgstr ""
|
||||
"Open trackers désactivés - redémarrage des torrents requis pour prise en "
|
||||
"compte."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:447
|
||||
msgid "Open Tracker list changed - torrent restart required to take effect."
|
||||
msgstr "Liste des Open trackers modifiée - redémarrage des torrents requis pour prise en compte"
|
||||
msgstr ""
|
||||
"Liste des Open trackers modifiée - redémarrage des torrents requis pour "
|
||||
"prise en compte"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:454
|
||||
#, java-format
|
||||
msgid "{0} theme loaded, return to main i2psnark page to view."
|
||||
msgstr "Thème {0} chargé, revenez à la page d''accueil d''i2psnark pour voir comme il est beau !"
|
||||
msgstr ""
|
||||
"Thème {0} chargé, revenez à la page d''accueil d''i2psnark pour voir comme "
|
||||
"il est beau !"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:461
|
||||
msgid "Configuration unchanged."
|
||||
@@ -131,7 +143,7 @@ msgstr "Impossible d’ouvrir: \"{0}\""
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:589
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:665
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:720
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1978
|
||||
#, java-format
|
||||
msgid "Torrent with this info hash is already running: {0}"
|
||||
msgstr "Un torrent avec cette empreinte est déjà actif: {0}"
|
||||
@@ -139,14 +151,22 @@ msgstr "Un torrent avec cette empreinte est déjà actif: {0}"
|
||||
#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:596
|
||||
#, java-format
|
||||
msgid "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only."
|
||||
msgstr "Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, seuls les trackers ouverts I2P seront utilisés!"
|
||||
msgid ""
|
||||
"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
|
||||
"only."
|
||||
msgstr ""
|
||||
"Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, seuls les "
|
||||
"trackers ouverts I2P seront utilisés!"
|
||||
|
||||
#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:601
|
||||
#, java-format
|
||||
msgid "Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent."
|
||||
msgstr "Attention - aucun tracker i2p dans \"{0}\". Vous devez activer les open trackers avant de démarrer le torrent!"
|
||||
msgid ""
|
||||
"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
|
||||
"enabled before starting this torrent."
|
||||
msgstr ""
|
||||
"Attention - aucun tracker i2p dans \"{0}\". Vous devez activer les open "
|
||||
"trackers avant de démarrer le torrent!"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:622
|
||||
#, java-format
|
||||
@@ -154,7 +174,7 @@ msgid "Torrent in \"{0}\" is invalid"
|
||||
msgstr "Le torrent dans \"{0}\" est invalide"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:627
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1998
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2000
|
||||
#, java-format
|
||||
msgid "ERROR - Out of memory, cannot create torrent from {0}"
|
||||
msgstr "ERREUR - Mémoire insuffisante, impossible de créer le torrent de {0}"
|
||||
@@ -177,8 +197,12 @@ msgstr "Envoi {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:679
|
||||
#, java-format
|
||||
msgid "We have no saved peers and no other torrents are running. Fetch of {0} will not succeed until you start another torrent."
|
||||
msgstr "Aucun pair sauvegardé et aucun autre torrent en cours. Le téléchargement de {0} ne commencera que lorsque vous démarrerez un autre torrent."
|
||||
msgid ""
|
||||
"We have no saved peers and no other torrents are running. Fetch of {0} will "
|
||||
"not succeed until you start another torrent."
|
||||
msgstr ""
|
||||
"Aucun pair sauvegardé et aucun autre torrent en cours. Le téléchargement de "
|
||||
"{0} ne commencera que lorsque vous démarrerez un autre torrent."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:683
|
||||
#, java-format
|
||||
@@ -200,7 +224,9 @@ msgstr "Trop de fichiers dans \"{0}\" ({1}), suppression! "
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:978
|
||||
#, java-format
|
||||
msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
|
||||
msgstr "Le fichier torrent \"{0}\" ne peut pas se terminer par \".torrent\", suppression!"
|
||||
msgstr ""
|
||||
"Le fichier torrent \"{0}\" ne peut pas se terminer par \".torrent\", "
|
||||
"suppression!"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:980
|
||||
#, java-format
|
||||
@@ -230,7 +256,9 @@ msgstr "Le fichier torrent \"{0}\" n'a pas de données, suppression!"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:995
|
||||
#, java-format
|
||||
msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
|
||||
msgstr "Les torrents dont la taille est supérieure à \"{0}\"octets ne sont pas encore supportés, suppression \"{1}\"."
|
||||
msgstr ""
|
||||
"Les torrents dont la taille est supérieure à \"{0}\"octets ne sont pas "
|
||||
"encore supportés, suppression \"{1}\"."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1011
|
||||
#, java-format
|
||||
@@ -301,7 +329,7 @@ msgid "Forum"
|
||||
msgstr "Forum"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721
|
||||
msgid "Status"
|
||||
msgstr "État"
|
||||
|
||||
@@ -316,8 +344,8 @@ msgid "Show Peers"
|
||||
msgstr "Afficher les pairs"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1661
|
||||
msgid "Torrent"
|
||||
msgstr "Torrent"
|
||||
|
||||
@@ -407,7 +435,8 @@ msgstr[1] "{0} pairs connectés"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:497
|
||||
#, java-format
|
||||
msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
|
||||
msgstr "URL incorrecte - elle doit débuter par \"http://\", \"{0}\", ou \"{1}\""
|
||||
msgstr ""
|
||||
"URL incorrecte - elle doit débuter par \"http://\", \"{0}\", ou \"{1}\""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
|
||||
@@ -440,7 +469,8 @@ msgstr "Répertoire des données effacé: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:638
|
||||
msgid "Error creating torrent - you must select a tracker"
|
||||
msgstr "Erreur lors de la création du torrent - vous devez sélectionner un tracker"
|
||||
msgstr ""
|
||||
"Erreur lors de la création du torrent - vous devez sélectionner un tracker"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
|
||||
#, java-format
|
||||
@@ -449,8 +479,12 @@ msgstr "Torrent créé pour \"{0}\""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
|
||||
#, java-format
|
||||
msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\""
|
||||
msgstr "De nombreux trackers I2P nécessitent d’enregistrer les nouveaux torrents avant de seeder - faites-le avant de démarrer \"{0}\"!"
|
||||
msgid ""
|
||||
"Many I2P trackers require you to register new torrents before seeding - "
|
||||
"please do so before starting \"{0}\""
|
||||
msgstr ""
|
||||
"De nombreux trackers I2P nécessitent d’enregistrer les nouveaux torrents "
|
||||
"avant de seeder - faites-le avant de démarrer \"{0}\"!"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
|
||||
#, java-format
|
||||
@@ -464,7 +498,8 @@ msgstr "Impossible de créer un torrent pour des données inexistantes: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
|
||||
msgid "Error creating torrent - you must enter a file or directory"
|
||||
msgstr "Erreur de création du torrent - vous devez saisir un fichier ou un répertoire"
|
||||
msgstr ""
|
||||
"Erreur de création du torrent - vous devez saisir un fichier ou un répertoire"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
|
||||
msgid "Stopping all torrents and closing the I2P tunnel."
|
||||
@@ -504,8 +539,8 @@ msgid "Seeding"
|
||||
msgstr "Seed en cours"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772
|
||||
msgid "Complete"
|
||||
msgstr "Complet"
|
||||
|
||||
@@ -533,7 +568,7 @@ msgid "Torrent details"
|
||||
msgstr "Détails du torrent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1162
|
||||
msgid "Info"
|
||||
msgstr "Info"
|
||||
|
||||
@@ -570,8 +605,12 @@ msgstr "Enlever le torrent de la liste active, suprression du fichier .torrent"
|
||||
#. Then the remaining single quite must be escaped
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
|
||||
#, java-format
|
||||
msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?"
|
||||
msgstr "Êtes-vous certain de vouloir supprimer le fichier \\''{0}.torrent\\'' (les données déjà téléchargées ne seront pas supprimées) ?"
|
||||
msgid ""
|
||||
"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
|
||||
"data will not be deleted) ?"
|
||||
msgstr ""
|
||||
"Êtes-vous certain de vouloir supprimer le fichier \\''{0}.torrent\\'' (les "
|
||||
"données déjà téléchargées ne seront pas supprimées) ?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
|
||||
msgid "Remove"
|
||||
@@ -579,323 +618,336 @@ msgstr "Enlever"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
|
||||
msgid "Delete the .torrent file and the associated data file(s)"
|
||||
msgstr "Supprimer le fichier .torrent et le(s) fichier(s) de données associé(s)"
|
||||
msgstr ""
|
||||
"Supprimer le fichier .torrent et le(s) fichier(s) de données associé(s)"
|
||||
|
||||
#. Can't figure out how to escape double quotes inside the onclick string.
|
||||
#. Single quotes in translate strings with parameters must be doubled.
|
||||
#. Then the remaining single quite must be escaped
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
|
||||
#, java-format
|
||||
msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?"
|
||||
msgstr "Êtes-vous certain de vouloir supprimer le torrent \\''{0}\\'' ainsi que toutes les données téléchargées ?"
|
||||
msgid ""
|
||||
"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
|
||||
"data?"
|
||||
msgstr ""
|
||||
"Êtes-vous certain de vouloir supprimer le torrent \\''{0}\\'' ainsi que "
|
||||
"toutes les données téléchargées ?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
|
||||
msgid "Delete"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
|
||||
msgid "Unknown"
|
||||
msgstr "Inconnu"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1056
|
||||
msgid "Seed"
|
||||
msgstr "Seed"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
|
||||
msgid "Uninteresting (The peer has no pieces we need)"
|
||||
msgstr "Aucun intérêt (le pair n'a aucun tronçon utile)"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081
|
||||
msgid "Choked (The peer is not allowing us to request pieces)"
|
||||
msgstr "bridé (le pair ne nous permet pas de demander des tronçons)"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
|
||||
msgid "Uninterested (We have no pieces the peer needs)"
|
||||
msgstr "Pas intéressé (aucun tronçon utile au pair)"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1103
|
||||
msgid "Choking (We are not allowing the peer to request pieces)"
|
||||
msgstr "bridage (nous ne permettons pas au pair de demander un tronçon)"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
|
||||
#, java-format
|
||||
msgid "Details at {0} tracker"
|
||||
msgstr "Détails au tracker {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
|
||||
msgid "Add Torrent"
|
||||
msgstr "Ajouter torrent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
|
||||
msgid "From URL"
|
||||
msgstr "Depuis l'URL"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
|
||||
msgid "Enter the torrent file download URL (I2P only), magnet link, or maggot link"
|
||||
msgstr "Entrez l'URL (I2P uniquement) de téléchargement du fichier torrent, du lien magnet ou maggot."
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
|
||||
msgid ""
|
||||
"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
|
||||
msgstr ""
|
||||
"Entrez l'URL (I2P uniquement) de téléchargement du fichier torrent, du lien "
|
||||
"magnet ou maggot."
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1200
|
||||
msgid "Add torrent"
|
||||
msgstr "Ajouter torrent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
|
||||
#, java-format
|
||||
msgid "You can also copy .torrent files to: {0}."
|
||||
msgstr "Vous pouvez aussi copier les fichiers .torrent vers {0}."
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205
|
||||
msgid "Removing a .torrent will cause it to stop."
|
||||
msgstr "La suppression d'un fichier .torrent entraîne l'arrêt du torrent."
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
|
||||
msgid "Create Torrent"
|
||||
msgstr "Créer torrent"
|
||||
|
||||
#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231
|
||||
msgid "Data to seed"
|
||||
msgstr "Données à seeder"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
|
||||
msgid "File or directory to seed (must be within the specified path)"
|
||||
msgstr "Fichier ou répertoire à seeder (doit être dans le chemin spécifié)"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686
|
||||
msgid "Tracker"
|
||||
msgstr "Tracker"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1239
|
||||
msgid "Select a tracker"
|
||||
msgstr "Sélectionner un tracker"
|
||||
|
||||
#. out.write(_("Open trackers and DHT only"));
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
|
||||
msgid "Open trackers only"
|
||||
msgstr "Trackers ouverts seulement"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259
|
||||
msgid "or"
|
||||
msgstr "ou"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262
|
||||
msgid "Specify custom tracker announce URL"
|
||||
msgstr "Spécifier une URL d'annonce de tracker personnalisé"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265
|
||||
msgid "Create torrent"
|
||||
msgstr "Créer torrent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1283
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1422
|
||||
msgid "Configuration"
|
||||
msgstr "Configuration"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
|
||||
msgid "Data directory"
|
||||
msgstr "Répertoire de données"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1289
|
||||
msgid "Edit i2psnark.config and restart to change"
|
||||
msgstr "Editez i2psnark.config et redémarrez pour prendre en compte les modifications"
|
||||
msgstr ""
|
||||
"Editez i2psnark.config et redémarrez pour prendre en compte les modifications"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293
|
||||
msgid "Auto start"
|
||||
msgstr "Démarrage automatique"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1297
|
||||
msgid "If checked, automatically start torrents that are added"
|
||||
msgstr "Si coché, les torrents démarreront automatiquement lors de l'ajout"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301
|
||||
msgid "Theme"
|
||||
msgstr "Thème"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
|
||||
msgid "Startup delay"
|
||||
msgstr "Délais de démarrage"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
|
||||
msgid "minutes"
|
||||
msgstr "minutes"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1340
|
||||
msgid "Total uploader limit"
|
||||
msgstr "Limite totale d'envoi"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343
|
||||
msgid "peers"
|
||||
msgstr "pairs"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1347
|
||||
msgid "Up bandwidth limit"
|
||||
msgstr "Limite de bande passante en envoi"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
|
||||
msgid "Half available bandwidth recommended."
|
||||
msgstr "La moitié de la bande passante est recommandée."
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1352
|
||||
msgid "View or change router bandwidth"
|
||||
msgstr "Consulter ou modifier la bande passante du routeur"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1356
|
||||
msgid "Use open trackers also"
|
||||
msgstr "Utiliser les open trackers aussi"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
|
||||
msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
|
||||
msgstr "Si coché, les torrents seront annoncés vers les open trackers ainsi que vers les trackers indiqués dans le fichier torrent"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1360
|
||||
msgid ""
|
||||
"If checked, announce torrents to open trackers as well as the tracker listed "
|
||||
"in the torrent file"
|
||||
msgstr ""
|
||||
"Si coché, les torrents seront annoncés vers les open trackers ainsi que vers "
|
||||
"les trackers indiqués dans le fichier torrent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1364
|
||||
msgid "Open tracker announce URLs"
|
||||
msgstr "URLs d'annonce open tracker"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376
|
||||
msgid "Inbound Settings"
|
||||
msgstr "Paramètres entrants"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1382
|
||||
msgid "Outbound Settings"
|
||||
msgstr "Paramètres sortants"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1390
|
||||
msgid "I2CP host"
|
||||
msgstr "Hôte I2CP"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1395
|
||||
msgid "I2CP port"
|
||||
msgstr "Port I2CP"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1408
|
||||
msgid "I2CP options"
|
||||
msgstr "Options I2CP"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1413
|
||||
msgid "Save configuration"
|
||||
msgstr "Sauvegarder la configuration"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
|
||||
#, java-format
|
||||
msgid "Invalid magnet URL {0}"
|
||||
msgstr "URL magnet {0} incorrecte"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1472
|
||||
#, java-format
|
||||
msgid "Invalid info hash in magnet URL {0}"
|
||||
msgstr "Info d'empreinte incorrecte dans l'URL magnet {0}"
|
||||
|
||||
#. * dummies for translation
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502
|
||||
#, java-format
|
||||
msgid "1 hop"
|
||||
msgid_plural "{0} hops"
|
||||
msgstr[0] "{0} saut"
|
||||
msgstr[1] "{0} sauts"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1503
|
||||
#, java-format
|
||||
msgid "1 tunnel"
|
||||
msgid_plural "{0} tunnels"
|
||||
msgstr[0] "{0} tunnel"
|
||||
msgstr[1] "{0} tunnels"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
|
||||
msgid "Completion"
|
||||
msgstr "Finalisation"
|
||||
|
||||
#. else unknown
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1718
|
||||
msgid "Size"
|
||||
msgstr "Taille"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
|
||||
msgid "Files"
|
||||
msgstr "Fichiers"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1676
|
||||
msgid "Pieces"
|
||||
msgstr "Tronçons"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1677
|
||||
msgid "Piece size"
|
||||
msgstr "Taille des tronçons"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699
|
||||
msgid "Magnet link"
|
||||
msgstr "Lien magnet"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
|
||||
msgid "Directory"
|
||||
msgstr "Répertoire"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
|
||||
msgid "Priority"
|
||||
msgstr "Priorité"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730
|
||||
msgid "Up to higher level directory"
|
||||
msgstr "Vers le répertoire parent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760
|
||||
msgid "Torrent not found?"
|
||||
msgstr "Torrent non trouvé?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769
|
||||
msgid "File not found in torrent?"
|
||||
msgstr "Fichier non trouvé dans le torrent?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1782
|
||||
msgid "complete"
|
||||
msgstr "complet"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1783
|
||||
msgid "bytes remaining"
|
||||
msgstr "Octets restants"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1808
|
||||
msgid "Open"
|
||||
msgstr "Ouvrir le fichier"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1834
|
||||
msgid "High"
|
||||
msgstr "Haut"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1844
|
||||
msgid "Skip"
|
||||
msgstr "Ignorer"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853
|
||||
msgid "Save priorities"
|
||||
msgstr "Sauvegarder les priorités"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969
|
||||
#, java-format
|
||||
msgid "Torrent fetched from {0}"
|
||||
msgstr "Torrent reçu de {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1990
|
||||
#, java-format
|
||||
msgid "Torrent already running: {0}"
|
||||
msgstr "Torrent déjà actif: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1990
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1992
|
||||
#, java-format
|
||||
msgid "Torrent already in the queue: {0}"
|
||||
msgstr "Torrent déjà dans la file d''attente: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1996
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1998
|
||||
#, java-format
|
||||
msgid "Torrent at {0} was not valid"
|
||||
msgstr "Le torrent {0} est invalide"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2003
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2005
|
||||
#, java-format
|
||||
msgid "Torrent was not retrieved from {0}"
|
||||
msgstr "Le torrent n’a pas été reçu de {0}"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -20,9 +20,11 @@ import java.util.concurrent.RejectedExecutionException;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.data.ByteArray;
|
||||
import net.i2p.util.BigPipedInputStream;
|
||||
import net.i2p.util.ByteCache;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.ReusableGZIPInputStream;
|
||||
|
||||
/**
|
||||
* This does the transparent gzip decompression on the client side.
|
||||
@@ -44,7 +46,9 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
||||
private final byte _buf1[];
|
||||
protected boolean _gzip;
|
||||
private long _dataWritten;
|
||||
private InternalGZIPInputStream _in;
|
||||
protected long _dataExpected;
|
||||
protected String _contentType;
|
||||
|
||||
private static final int CACHE_SIZE = 8*1024;
|
||||
private static final ByteCache _cache = ByteCache.getInstance(8, CACHE_SIZE);
|
||||
// OOM DOS prevention
|
||||
@@ -129,10 +133,11 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tweak that first HTTP response line (HTTP 200 OK, etc)
|
||||
* Possibly tweak that first HTTP response line (HTTP/1.0 200 OK, etc).
|
||||
* Overridden on server side.
|
||||
*
|
||||
*/
|
||||
protected static String filterResponseLine(String line) {
|
||||
protected String filterResponseLine(String line) {
|
||||
return line;
|
||||
}
|
||||
|
||||
@@ -183,6 +188,15 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
||||
} else if ("Proxy-Authenticate".equalsIgnoreCase(key)) {
|
||||
// filter this hop-by-hop header; outproxy authentication must be configured in I2PTunnelHTTPClient
|
||||
} else {
|
||||
if ("Content-Length".equalsIgnoreCase(key)) {
|
||||
// save for compress decision on server side
|
||||
try {
|
||||
_dataExpected = Long.parseLong(val);
|
||||
} catch (NumberFormatException nfe) {}
|
||||
} else if ("Content-Type".equalsIgnoreCase(key)) {
|
||||
// save for compress decision on server side
|
||||
_contentType = val;
|
||||
}
|
||||
out.write((key.trim() + ": " + val.trim() + "\r\n").getBytes());
|
||||
}
|
||||
break;
|
||||
@@ -227,13 +241,13 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
||||
|
||||
protected void beginProcessing() throws IOException {
|
||||
//out.flush();
|
||||
PipedInputStream pi = new PipedInputStream();
|
||||
PipedInputStream pi = BigPipedInputStream.getInstance();
|
||||
PipedOutputStream po = new PipedOutputStream(pi);
|
||||
// Run in the client thread pool, as there should be an unused thread
|
||||
// there after the accept().
|
||||
// Overridden in I2PTunnelHTTPServer, where it does not use the client pool.
|
||||
try {
|
||||
I2PTunnelClientBase._executor.execute(new Pusher(pi, out));
|
||||
I2PTunnelClientBase.getClientExecutor().execute(new Pusher(pi, out));
|
||||
} catch (RejectedExecutionException ree) {
|
||||
// shouldn't happen
|
||||
throw ree;
|
||||
@@ -242,25 +256,29 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
||||
}
|
||||
|
||||
private class Pusher implements Runnable {
|
||||
private InputStream _inRaw;
|
||||
private OutputStream _out;
|
||||
private final InputStream _inRaw;
|
||||
private final OutputStream _out;
|
||||
|
||||
public Pusher(InputStream in, OutputStream out) {
|
||||
_inRaw = in;
|
||||
_out = out;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
_in = null;
|
||||
ReusableGZIPInputStream _in = null;
|
||||
long written = 0;
|
||||
ByteArray ba = null;
|
||||
try {
|
||||
_in = new InternalGZIPInputStream(_inRaw);
|
||||
_in = ReusableGZIPInputStream.acquire();
|
||||
// blocking
|
||||
_in.initialize(_inRaw);
|
||||
ba = _cache.acquire();
|
||||
byte buf[] = ba.getData();
|
||||
int read = -1;
|
||||
while ( (read = _in.read(buf)) != -1) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Read " + read + " and writing it to the browser/streams");
|
||||
_out.write(buf, 0, read);
|
||||
; _out.write(buf, 0, read);
|
||||
_out.flush();
|
||||
written += read;
|
||||
}
|
||||
@@ -272,13 +290,11 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
||||
} catch (OutOfMemoryError oom) {
|
||||
_log.error("OOM in HTTP Decompressor", oom);
|
||||
} finally {
|
||||
if (_log.shouldLog(Log.WARN) && (_in != null))
|
||||
_log.warn("After decompression, written=" + written +
|
||||
(_in != null ?
|
||||
if (_log.shouldLog(Log.INFO) && (_in != null))
|
||||
_log.info("After decompression, written=" + written +
|
||||
" read=" + _in.getTotalRead()
|
||||
+ ", expanded=" + _in.getTotalExpanded() + ", remaining=" + _in.getRemaining()
|
||||
+ ", finished=" + _in.getFinished()
|
||||
: ""));
|
||||
+ ", finished=" + _in.getFinished());
|
||||
if (ba != null)
|
||||
_cache.release(ba);
|
||||
if (_out != null) try {
|
||||
@@ -286,68 +302,21 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
|
||||
double compressed = (_in != null ? _in.getTotalRead() : 0);
|
||||
double expanded = (_in != null ? _in.getTotalExpanded() : 0);
|
||||
if (compressed > 0 && expanded > 0) {
|
||||
// only update the stats if we did something
|
||||
double ratio = compressed/expanded;
|
||||
_context.statManager().addRateData("i2ptunnel.httpCompressionRatio", (int)(100d*ratio), 0);
|
||||
_context.statManager().addRateData("i2ptunnel.httpCompressed", (long)compressed, 0);
|
||||
_context.statManager().addRateData("i2ptunnel.httpExpanded", (long)expanded, 0);
|
||||
if (_in != null) {
|
||||
double compressed = _in.getTotalRead();
|
||||
double expanded = _in.getTotalExpanded();
|
||||
ReusableGZIPInputStream.release(_in);
|
||||
if (compressed > 0 && expanded > 0) {
|
||||
// only update the stats if we did something
|
||||
double ratio = compressed/expanded;
|
||||
_context.statManager().addRateData("i2ptunnel.httpCompressionRatio", (int)(100d*ratio), 0);
|
||||
_context.statManager().addRateData("i2ptunnel.httpCompressed", (long)compressed, 0);
|
||||
_context.statManager().addRateData("i2ptunnel.httpExpanded", (long)expanded, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** just a wrapper to provide stats for debugging */
|
||||
private static class InternalGZIPInputStream extends GZIPInputStream {
|
||||
public InternalGZIPInputStream(InputStream in) throws IOException {
|
||||
super(in);
|
||||
}
|
||||
public long getTotalRead() {
|
||||
try {
|
||||
return super.inf.getTotalIn();
|
||||
} catch (Exception e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
public long getTotalExpanded() {
|
||||
try {
|
||||
return super.inf.getTotalOut();
|
||||
} catch (Exception e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* From Inflater javadoc:
|
||||
* Returns the total number of bytes remaining in the input buffer. This can be used to find out
|
||||
* what bytes still remain in the input buffer after decompression has finished.
|
||||
*/
|
||||
public long getRemaining() {
|
||||
try {
|
||||
return super.inf.getRemaining();
|
||||
} catch (Exception e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
public boolean getFinished() {
|
||||
try {
|
||||
return super.inf.finished();
|
||||
} catch (Exception e) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Read: " + getTotalRead() + " expanded: " + getTotalExpanded() + " remaining: " + getRemaining() + " finished: " + getFinished();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + ": " + _in;
|
||||
}
|
||||
|
||||
/*******
|
||||
public static void main(String args[]) {
|
||||
String simple = "HTTP/1.1 200 OK\n" +
|
||||
|
||||
@@ -49,6 +49,7 @@ import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
@@ -70,16 +71,18 @@ import net.i2p.util.EventDispatcherImpl;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* An I2PTunnel tracks one or more I2PTunnelTasks and one or more I2PSessions.
|
||||
* Usually one of each.
|
||||
*
|
||||
* Todo: Most events are not listened to elsewhere, so error propagation is poor
|
||||
*/
|
||||
public class I2PTunnel implements Logging, EventDispatcher {
|
||||
private Log _log;
|
||||
private EventDispatcherImpl _event;
|
||||
private I2PAppContext _context;
|
||||
public class I2PTunnel extends EventDispatcherImpl implements Logging {
|
||||
private final Log _log;
|
||||
private final I2PAppContext _context;
|
||||
private static long __tunnelId = 0;
|
||||
private long _tunnelId;
|
||||
private Properties _clientOptions;
|
||||
private final List<I2PSession> _sessions;
|
||||
private final long _tunnelId;
|
||||
private final Properties _clientOptions;
|
||||
private final Set<I2PSession> _sessions;
|
||||
|
||||
public static final int PACKET_DELAY = 100;
|
||||
|
||||
@@ -96,7 +99,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
|
||||
private static final String nocli_args[] = { "-nocli", "-die"};
|
||||
|
||||
private final List tasks = new ArrayList();
|
||||
private final List<I2PTunnelTask> tasks = new ArrayList();
|
||||
private int next_task_id = 1;
|
||||
|
||||
private final Set listeners = new CopyOnWriteArraySet();
|
||||
@@ -114,14 +117,14 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
}
|
||||
|
||||
public I2PTunnel(String[] args, ConnectionEventListener lsnr) {
|
||||
super();
|
||||
_context = I2PAppContext.getGlobalContext(); // new I2PAppContext();
|
||||
_tunnelId = ++__tunnelId;
|
||||
_log = _context.logManager().getLog(I2PTunnel.class);
|
||||
_event = new EventDispatcherImpl();
|
||||
// as of 0.8.4, include context properties
|
||||
Properties p = _context.getProperties();
|
||||
_clientOptions = p;
|
||||
_sessions = new ArrayList(1);
|
||||
_sessions = new CopyOnWriteArraySet();
|
||||
|
||||
addConnectionEventListener(lsnr);
|
||||
boolean gui = true;
|
||||
@@ -193,22 +196,17 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
|
||||
/** @return non-null */
|
||||
List<I2PSession> getSessions() {
|
||||
synchronized (_sessions) {
|
||||
return new ArrayList(_sessions);
|
||||
}
|
||||
}
|
||||
|
||||
void addSession(I2PSession session) {
|
||||
if (session == null) return;
|
||||
synchronized (_sessions) {
|
||||
if (!_sessions.contains(session))
|
||||
_sessions.add(session);
|
||||
}
|
||||
_sessions.add(session);
|
||||
}
|
||||
|
||||
void removeSession(I2PSession session) {
|
||||
if (session == null) return;
|
||||
synchronized (_sessions) {
|
||||
_sessions.remove(session);
|
||||
}
|
||||
_sessions.remove(session);
|
||||
}
|
||||
|
||||
public Properties getClientOptions() { return _clientOptions; }
|
||||
@@ -218,9 +216,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
if (tsk.isOpen()) {
|
||||
tsk.setId(next_task_id);
|
||||
next_task_id++;
|
||||
synchronized (tasks) {
|
||||
tasks.add(tsk);
|
||||
}
|
||||
tasks.add(tsk);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -693,7 +689,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("clientTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
String msg = "Invalid I2PTunnel configuration to create an HTTP Proxy connecting to the router at " + host + ':'+ port +
|
||||
" and listening on " + listenHost + ':' + port;
|
||||
" and listening on " + listenHost + ':' + portNum;
|
||||
_log.error(getPrefix() + msg, iae);
|
||||
l.log(msg);
|
||||
notifyEvent("clientTaskId", Integer.valueOf(-1));
|
||||
@@ -769,7 +765,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("httpclientTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
String msg = "Invalid I2PTunnel configuration to create an HTTP Proxy connecting to the router at " + host + ':'+ port +
|
||||
" and listening on " + listenHost + ':' + port;
|
||||
" and listening on " + listenHost + ':' + clientPort;
|
||||
_log.error(getPrefix() + msg, iae);
|
||||
l.log(msg);
|
||||
notifyEvent("httpclientTaskId", Integer.valueOf(-1));
|
||||
@@ -837,7 +833,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
addtask(task);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
String msg = "Invalid I2PTunnel configuration to create a CONNECT client connecting to the router at " + host + ':'+ port +
|
||||
" and listening on " + listenHost + ':' + port;
|
||||
" and listening on " + listenHost + ':' + _port;
|
||||
_log.error(getPrefix() + msg, iae);
|
||||
l.log(msg);
|
||||
// Since nothing listens to TaskID events, use this to propagate the error to TunnelController
|
||||
@@ -903,7 +899,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("ircclientTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
String msg = "Invalid I2PTunnel configuration to create an IRC client connecting to the router at " + host + ':'+ port +
|
||||
" and listening on " + listenHost + ':' + port;
|
||||
" and listening on " + listenHost + ':' + _port;
|
||||
_log.error(getPrefix() + msg, iae);
|
||||
l.log(msg);
|
||||
notifyEvent("ircclientTaskId", Integer.valueOf(-1));
|
||||
@@ -957,7 +953,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("sockstunnelTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
String msg = "Invalid I2PTunnel configuration to create a SOCKS Proxy connecting to the router at " + host + ':'+ port +
|
||||
" and listening on " + listenHost + ':' + port;
|
||||
" and listening on " + listenHost + ':' + _port;
|
||||
_log.error(getPrefix() + msg, iae);
|
||||
l.log(msg);
|
||||
notifyEvent("sockstunnelTaskId", Integer.valueOf(-1));
|
||||
@@ -1004,7 +1000,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("sockstunnelTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
String msg = "Invalid I2PTunnel configuration to create a SOCKS IRC Proxy connecting to the router at " + host + ':'+ port +
|
||||
" and listening on " + listenHost + ':' + port;
|
||||
" and listening on " + listenHost + ':' + _port;
|
||||
_log.error(getPrefix() + msg, iae);
|
||||
l.log(msg);
|
||||
notifyEvent("sockstunnelTaskId", Integer.valueOf(-1));
|
||||
@@ -1054,7 +1050,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
String msg = "Invalid I2PTunnel configuration to create a Streamr Client connecting to the router at " + host + ':'+ port +
|
||||
" and sending to " + _host + ':' + port;
|
||||
" and sending to " + _host + ':' + _port;
|
||||
_log.error(getPrefix() + msg, iae);
|
||||
l.log(msg);
|
||||
notifyEvent("streamrtunnnelTaskId", Integer.valueOf(-1));
|
||||
@@ -1261,10 +1257,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
*/
|
||||
public void runQuit(Logging l) {
|
||||
purgetasks(l);
|
||||
synchronized (tasks) {
|
||||
if (tasks.isEmpty()) {
|
||||
System.exit(0);
|
||||
}
|
||||
if (tasks.isEmpty()) {
|
||||
System.exit(0);
|
||||
}
|
||||
l.log("There are running tasks. Try 'list'.");
|
||||
notifyEvent("quitResult", "error");
|
||||
@@ -1280,11 +1274,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
*/
|
||||
public void runList(Logging l) {
|
||||
purgetasks(l);
|
||||
synchronized (tasks) {
|
||||
for (int i = 0; i < tasks.size(); i++) {
|
||||
I2PTunnelTask t = (I2PTunnelTask) tasks.get(i);
|
||||
l.log("[" + t.getId() + "] " + t.toString());
|
||||
}
|
||||
for (I2PTunnelTask t : tasks) {
|
||||
l.log("[" + t.getId() + "] " + t.toString());
|
||||
}
|
||||
notifyEvent("listDone", "done");
|
||||
}
|
||||
@@ -1313,14 +1304,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
argindex++;
|
||||
}
|
||||
if (args[argindex].equalsIgnoreCase("all")) {
|
||||
List curTasks = null;
|
||||
synchronized (tasks) {
|
||||
curTasks = new LinkedList(tasks);
|
||||
}
|
||||
|
||||
boolean error = false;
|
||||
for (int i = 0; i < curTasks.size(); i++) {
|
||||
I2PTunnelTask t = (I2PTunnelTask) curTasks.get(i);
|
||||
for (I2PTunnelTask t : tasks) {
|
||||
if (!closetask(t, forced, l)) {
|
||||
notifyEvent("closeResult", "error");
|
||||
error = true;
|
||||
@@ -1442,9 +1427,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
boolean closed = false;
|
||||
|
||||
_log.debug(getPrefix() + "closetask(): looking for task " + num);
|
||||
synchronized (tasks) {
|
||||
for (Iterator it = tasks.iterator(); it.hasNext();) {
|
||||
I2PTunnelTask t = (I2PTunnelTask) it.next();
|
||||
for (I2PTunnelTask t : tasks) {
|
||||
int id = t.getId();
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + "closetask(): parsing task " + id + " (" + t.toString() + ")");
|
||||
@@ -1454,7 +1437,6 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
} else if (id > num) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return closed;
|
||||
}
|
||||
@@ -1482,15 +1464,14 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
*
|
||||
*/
|
||||
private void purgetasks(Logging l) {
|
||||
synchronized (tasks) {
|
||||
for (Iterator it = tasks.iterator(); it.hasNext();) {
|
||||
I2PTunnelTask t = (I2PTunnelTask) it.next();
|
||||
List<I2PTunnelTask> removed = new ArrayList();
|
||||
for (I2PTunnelTask t : tasks) {
|
||||
if (!t.isOpen()) {
|
||||
_log.debug(getPrefix() + "Purging inactive tunnel: [" + t.getId() + "] " + t.toString());
|
||||
it.remove();
|
||||
removed.add(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
tasks.removeAll(removed);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1657,41 +1638,4 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
public interface ConnectionEventListener {
|
||||
public void routerDisconnected();
|
||||
}
|
||||
|
||||
/* Required by the EventDispatcher interface */
|
||||
public EventDispatcher getEventDispatcher() {
|
||||
return _event;
|
||||
}
|
||||
|
||||
public void attachEventDispatcher(EventDispatcher e) {
|
||||
_event.attachEventDispatcher(e.getEventDispatcher());
|
||||
}
|
||||
|
||||
public void detachEventDispatcher(EventDispatcher e) {
|
||||
_event.detachEventDispatcher(e.getEventDispatcher());
|
||||
}
|
||||
|
||||
public void notifyEvent(String e, Object a) {
|
||||
_event.notifyEvent(e, a);
|
||||
}
|
||||
|
||||
public Object getEventValue(String n) {
|
||||
return _event.getEventValue(n);
|
||||
}
|
||||
|
||||
public Set getEvents() {
|
||||
return _event.getEvents();
|
||||
}
|
||||
|
||||
public void ignoreEvents() {
|
||||
_event.ignoreEvents();
|
||||
}
|
||||
|
||||
public void unIgnoreEvents() {
|
||||
_event.unIgnoreEvents();
|
||||
}
|
||||
|
||||
public Object waitEventValue(String n) {
|
||||
return _event.waitEventValue(n);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
protected long _clientId;
|
||||
protected final Object sockLock = new Object(); // Guards sockMgr and mySockets
|
||||
protected I2PSocketManager sockMgr; // should be final and use a factory. LINT
|
||||
protected List mySockets = new ArrayList();
|
||||
protected final List<I2PSocket> mySockets = new ArrayList();
|
||||
protected boolean _ownDest;
|
||||
|
||||
protected Destination dest = null;
|
||||
@@ -59,7 +59,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
|
||||
private boolean listenerReady = false;
|
||||
|
||||
private ServerSocket ss;
|
||||
protected ServerSocket ss;
|
||||
|
||||
private final Object startLock = new Object();
|
||||
private boolean startRunning = false;
|
||||
@@ -83,12 +83,17 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
* Extending classes may use it for other purposes.
|
||||
* Not for use by servers, as there is no limit on threads.
|
||||
*/
|
||||
static final Executor _executor;
|
||||
private static volatile ThreadPoolExecutor _executor;
|
||||
private static int _executorThreadCount;
|
||||
static {
|
||||
_executor = new CustomThreadPoolExecutor();
|
||||
}
|
||||
private static final Object _executorLock = new Object();
|
||||
|
||||
/**
|
||||
* This constructor always starts the tunnel (ignoring the i2cp.delayOpen option).
|
||||
* It is used to add a client to an existing socket manager.
|
||||
*
|
||||
* @param localPort if 0, use any port, get actual port selected with getLocalPort()
|
||||
* @param sktMgr the existing socket manager
|
||||
*/
|
||||
public I2PTunnelClientBase(int localPort, Logging l, I2PSocketManager sktMgr,
|
||||
I2PTunnel tunnel, EventDispatcher notifyThis, long clientId )
|
||||
throws IllegalArgumentException {
|
||||
@@ -107,8 +112,12 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
_context.statManager().createRateStat("i2ptunnel.client.buildRunTime", "How long it takes to run a queued socket into an i2ptunnel runner?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
|
||||
_log = _context.logManager().getLog(getClass());
|
||||
|
||||
synchronized (_executorLock) {
|
||||
if (_executor == null)
|
||||
_executor = new CustomThreadPoolExecutor();
|
||||
}
|
||||
|
||||
Thread t = new I2PAppThread(this, "Client " + tunnel.listenHost + ':' + localPort);
|
||||
listenerReady = false;
|
||||
t.start();
|
||||
open = true;
|
||||
synchronized (this) {
|
||||
@@ -130,6 +139,14 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The main constructor.
|
||||
* This may take a LONG time if building and starting a new manager.
|
||||
*
|
||||
* @param localPort if 0, use any port, get actual port selected with getLocalPort()
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we can't create a socketManager
|
||||
*/
|
||||
public I2PTunnelClientBase(int localPort, boolean ownDest, Logging l,
|
||||
EventDispatcher notifyThis, String handlerName,
|
||||
I2PTunnel tunnel) throws IllegalArgumentException {
|
||||
@@ -137,10 +154,14 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
|
||||
/**
|
||||
* @param pkf null to generate a transient key
|
||||
* Use this to build a client with a persistent private key.
|
||||
* This may take a LONG time if building and starting a new manager.
|
||||
*
|
||||
* @param localPort if 0, use any port, get actual port selected with getLocalPort()
|
||||
* @param pkf Path to the private key file, or null to generate a transient key
|
||||
*
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
* badly that we can't create a socketManager
|
||||
*/
|
||||
public I2PTunnelClientBase(int localPort, boolean ownDest, Logging l,
|
||||
EventDispatcher notifyThis, String handlerName,
|
||||
@@ -160,6 +181,11 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
_context.statManager().createRateStat("i2ptunnel.client.buildRunTime", "How long it takes to run a queued socket into an i2ptunnel runner?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
|
||||
_log = _context.logManager().getLog(getClass());
|
||||
|
||||
synchronized (_executorLock) {
|
||||
if (_executor == null)
|
||||
_executor = new CustomThreadPoolExecutor();
|
||||
}
|
||||
|
||||
// normalize path so we can find it
|
||||
if (pkf != null) {
|
||||
File keyFile = new File(pkf);
|
||||
@@ -170,7 +196,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
|
||||
// no need to load the netDb with leaseSets for destinations that will never
|
||||
// be looked up
|
||||
tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true");
|
||||
boolean dccEnabled = (this instanceof I2PTunnelIRCClient) &&
|
||||
Boolean.valueOf(tunnel.getClientOptions().getProperty(I2PTunnelIRCClient.PROP_DCC)).booleanValue();
|
||||
if (!dccEnabled)
|
||||
tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true");
|
||||
|
||||
boolean openNow = !Boolean.valueOf(tunnel.getClientOptions().getProperty("i2cp.delayOpen")).booleanValue();
|
||||
if (openNow) {
|
||||
@@ -183,17 +212,17 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
try { Thread.sleep(10*1000); } catch (InterruptedException ie) {}
|
||||
}
|
||||
}
|
||||
if (sockMgr == null) {
|
||||
l.log("Invalid I2CP configuration");
|
||||
throw new IllegalArgumentException("Socket manager could not be created");
|
||||
}
|
||||
// can't be null unless we limit the loop above
|
||||
//if (sockMgr == null) {
|
||||
// l.log("Invalid I2CP configuration");
|
||||
// throw new IllegalArgumentException("Socket manager could not be created");
|
||||
//}
|
||||
l.log("Tunnels ready for client: " + handlerName);
|
||||
|
||||
} // else delay creating session until createI2PSocket() is called
|
||||
|
||||
Thread t = new I2PAppThread(this);
|
||||
t.setName("Client " + _clientId);
|
||||
listenerReady = false;
|
||||
t.start();
|
||||
open = true;
|
||||
synchronized (this) {
|
||||
@@ -219,7 +248,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the this.sockMgr field if it is null, or if we want a new one
|
||||
* Sets the this.sockMgr field if it is null, or if we want a new one.
|
||||
* This may take a LONG time if building a new manager.
|
||||
*
|
||||
* We need a socket manager before getDefaultOptions() and most other things
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
@@ -258,27 +288,33 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
|
||||
|
||||
/**
|
||||
* this is ONLY for shared clients
|
||||
* This is ONLY for shared clients.
|
||||
* This may take a LONG time if building a new manager.
|
||||
*
|
||||
* @return non-null
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
*/
|
||||
protected synchronized I2PSocketManager getSocketManager() {
|
||||
protected I2PSocketManager getSocketManager() {
|
||||
return getSocketManager(getTunnel(), this.privKeyFile);
|
||||
}
|
||||
|
||||
/**
|
||||
* this is ONLY for shared clients
|
||||
* This is ONLY for shared clients.
|
||||
* This may take a LONG time if building a new manager.
|
||||
*
|
||||
* @return non-null
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
*/
|
||||
protected static synchronized I2PSocketManager getSocketManager(I2PTunnel tunnel) {
|
||||
protected static I2PSocketManager getSocketManager(I2PTunnel tunnel) {
|
||||
return getSocketManager(tunnel, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* this is ONLY for shared clients
|
||||
* This is ONLY for shared clients.
|
||||
* This may take a LONG time if building a new manager.
|
||||
*
|
||||
* @return non-null
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
@@ -293,6 +329,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
_log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Building a new socket manager since the old one closed [s=" + s + "]");
|
||||
if (s != null)
|
||||
tunnel.removeSession(s);
|
||||
// We could be here a LONG time, holding the lock
|
||||
socketManager = buildSocketManager(tunnel, pkf);
|
||||
} else {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
@@ -307,6 +344,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
|
||||
/**
|
||||
* This may take a LONG time.
|
||||
*
|
||||
* @return non-null
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
@@ -315,6 +354,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
return buildSocketManager(getTunnel(), this.privKeyFile, this.l);
|
||||
}
|
||||
/**
|
||||
* This may take a LONG time.
|
||||
*
|
||||
* @return non-null
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
@@ -327,6 +368,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
private static final int MAX_RETRIES = 4;
|
||||
|
||||
/**
|
||||
* This may take a LONG time.
|
||||
*
|
||||
* @param pkf absolute path or null
|
||||
* @return non-null
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
@@ -337,6 +380,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
|
||||
/**
|
||||
* This may take a LONG time.
|
||||
*
|
||||
* @param pkf absolute path or null
|
||||
* @return non-null
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
@@ -357,7 +402,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
|
||||
I2PSocketManager sockManager = null;
|
||||
// Todo: Can't stop a tunnel from the UI while it's in this loop (no session yet)
|
||||
// FIXME: Can't stop a tunnel from the UI while it's in this loop (no session yet)
|
||||
int retries = 0;
|
||||
while (sockManager == null) {
|
||||
if (pkf != null) {
|
||||
@@ -512,7 +557,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
if (localPort == 0) {
|
||||
localPort = ss.getLocalPort();
|
||||
}
|
||||
notifyEvent("clientLocalPort", new Integer(ss.getLocalPort()));
|
||||
notifyEvent("clientLocalPort", Integer.valueOf(ss.getLocalPort()));
|
||||
// duplicates message in constructor
|
||||
//l.log("Listening for clients on port " + localPort + " of " + getTunnel().listenHost);
|
||||
|
||||
@@ -551,6 +596,30 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return may be null if no class has been instantiated
|
||||
* @since 0.8.8
|
||||
*/
|
||||
static ThreadPoolExecutor getClientExecutor() {
|
||||
return _executor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.8.8
|
||||
*/
|
||||
static void killClientExecutor() {
|
||||
synchronized (_executorLock) {
|
||||
if (_executor != null) {
|
||||
_executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
|
||||
_executor.shutdownNow();
|
||||
_executor = null;
|
||||
}
|
||||
// kill the shared client, so that on restart in android
|
||||
// we won't latch onto the old one
|
||||
socketManager = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Manage the connection just opened on the specified socket
|
||||
*
|
||||
@@ -558,8 +627,16 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
*/
|
||||
protected void manageConnection(Socket s) {
|
||||
if (s == null) return;
|
||||
ThreadPoolExecutor tpe = _executor;
|
||||
if (tpe == null) {
|
||||
_log.error("No executor for socket!");
|
||||
try {
|
||||
s.close();
|
||||
} catch (IOException ioe) {}
|
||||
return;
|
||||
}
|
||||
try {
|
||||
_executor.execute(new BlockingRunner(s));
|
||||
tpe.execute(new BlockingRunner(s));
|
||||
} catch (RejectedExecutionException ree) {
|
||||
// should never happen, we have an unbounded pool and never stop the executor
|
||||
try {
|
||||
@@ -610,11 +687,11 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
synchronized (sockLock) {
|
||||
if (sockMgr != null) {
|
||||
mySockets.retainAll(sockMgr.listSockets());
|
||||
if (!forced && mySockets.size() != 0) {
|
||||
l.log("There are still active connections!");
|
||||
if ((!forced) && (!mySockets.isEmpty())) {
|
||||
l.log("Not closing, there are still active connections!");
|
||||
_log.debug("can't close: there are still active connections!");
|
||||
for (Iterator it = mySockets.iterator(); it.hasNext();) {
|
||||
l.log("->" + it.next());
|
||||
for (I2PSocket s : mySockets) {
|
||||
l.log(" -> " + s.toString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -630,12 +707,12 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
try {
|
||||
if (ss != null) ss.close();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("error closing", ex);
|
||||
return false;
|
||||
}
|
||||
//l.log("Client closed.");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -305,7 +305,8 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
|
||||
else
|
||||
response = SUCCESS_RESPONSE;
|
||||
Runnable onTimeout = new OnTimeout(s, s.getOutputStream(), targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
I2PTunnelRunner runner = new I2PTunnelRunner(s, i2ps, sockLock, data, response, mySockets, onTimeout);
|
||||
// starts itself
|
||||
new I2PTunnelRunner(s, i2ps, sockLock, data, response, mySockets, onTimeout);
|
||||
} catch (SocketException ex) {
|
||||
_log.info(getPrefix(requestId) + "Error trying to connect", ex);
|
||||
handleConnectClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.I2PSession;
|
||||
import net.i2p.client.naming.NamingService;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
@@ -34,6 +35,7 @@ import net.i2p.data.Base64;
|
||||
import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.FileUtil;
|
||||
import net.i2p.util.Log;
|
||||
@@ -143,6 +145,17 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
"or naming one of them differently.<p>")
|
||||
.getBytes();
|
||||
|
||||
private final static byte[] ERR_AHELPER_NOTFOUND =
|
||||
("HTTP/1.1 404 Not Found\r\n"+
|
||||
"Content-Type: text/html; charset=iso-8859-1\r\n"+
|
||||
"Cache-control: no-cache\r\n"+
|
||||
"\r\n"+
|
||||
"<html><body><H1>I2P ERROR: Helper key not resolvable.</H1>"+
|
||||
"The helper key you put for i2paddresshelper= is not resolvable. "+
|
||||
"It seems to be garbage data, or a mistyped b32. Check your URL "+
|
||||
"to try and fix the helper key to be either a b32 or a base64.")
|
||||
.getBytes();
|
||||
|
||||
private final static byte[] ERR_AHELPER_NEW =
|
||||
("HTTP/1.1 409 New Address\r\n"+
|
||||
"Content-Type: text/html; charset=iso-8859-1\r\n"+
|
||||
@@ -185,6 +198,12 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
"This proxy is configured to require authentication.<BR>")
|
||||
.getBytes();
|
||||
|
||||
/**
|
||||
* This constructor always starts the tunnel (ignoring the i2cp.delayOpen option).
|
||||
* It is used to add a client to an existing socket manager.
|
||||
*
|
||||
* @param sockMgr the existing socket manager
|
||||
*/
|
||||
public I2PTunnelHTTPClient(int localPort, Logging l, I2PSocketManager sockMgr, I2PTunnel tunnel, EventDispatcher notifyThis, long clientId) {
|
||||
super(localPort, l, sockMgr, tunnel, notifyThis, clientId);
|
||||
_proxyNonce = Long.toString(_context.random().nextLong());
|
||||
@@ -372,6 +391,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
// pos is the start of the path
|
||||
pos = request.indexOf("/");
|
||||
if (pos == -1) {
|
||||
//pos = request.length();
|
||||
method = null;
|
||||
break;
|
||||
}
|
||||
@@ -449,9 +469,30 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
!Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER)).booleanValue()) {
|
||||
pos2 = fragment.indexOf("=");
|
||||
ahelperKey = fragment.substring(pos2 + 1);
|
||||
|
||||
// Key contains data, lets not ignore it
|
||||
if (ahelperKey != null) {
|
||||
if(ahelperKey.endsWith(".i2p")) {
|
||||
// allow i2paddresshelper=<b32>.b32.i2p syntax.
|
||||
/*
|
||||
also i2paddresshelper=name.i2p for aliases
|
||||
i.e. on your eepsite put
|
||||
<a href="?i2paddresshelper=name.i2p">This is the name I want to be called.</a>
|
||||
*/
|
||||
Destination dest = _context.namingService().lookup(ahelperKey);
|
||||
if(dest==null) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getPrefix(requestId) + "Could not find destination for "+ahelperKey);
|
||||
byte[] header = getErrorPage("ahelper-notfound", ERR_AHELPER_NOTFOUND);
|
||||
out.write(header);
|
||||
out.write(("<p>" + _("This seems to be a bad destination:") + " " + ahelperKey + " " + _("i2paddresshelper cannot help you with a destination like that!") + "</p>").getBytes("UTF-8"));
|
||||
writeFooter(out);
|
||||
// XXX: should closeSocket(s) be in a finally block?
|
||||
closeSocket(s);
|
||||
return;
|
||||
}
|
||||
ahelperKey = dest.toBase64();
|
||||
}
|
||||
|
||||
ahelperPresent = true;
|
||||
// ahelperKey will be validated later
|
||||
if (host == null || "i2p".equals(host)) {
|
||||
@@ -478,6 +519,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getPrefix(requestId) + "Addresshelper key conflict for site [" + destination +
|
||||
"], trusted key [" + destB64 + "], specified key [" + ahelperKey + "].");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -512,7 +554,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
byte[] header = getErrorPage("ahelper-conflict", ERR_AHELPER_CONFLICT);
|
||||
out.write(header);
|
||||
out.write(_("To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>.", trustedURL, conflictURL).getBytes("UTF-8"));
|
||||
out.write(("<p></div>").getBytes());
|
||||
out.write(("</p></div>").getBytes());
|
||||
writeFooter(out);
|
||||
}
|
||||
}
|
||||
@@ -761,7 +803,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
// If the host is "i2p", the getHostName() lookup failed, don't try to
|
||||
// look it up again as the naming service does not do negative caching
|
||||
// so it will be slow.
|
||||
Destination clientDest;
|
||||
Destination clientDest = null;
|
||||
String addressHelper = addressHelpers.get(destination.toLowerCase());
|
||||
if (addressHelper != null) {
|
||||
clientDest = _context.namingService().lookup(addressHelper);
|
||||
@@ -770,6 +812,21 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
addressHelpers.remove(destination.toLowerCase());
|
||||
} else if ("i2p".equals(host)) {
|
||||
clientDest = null;
|
||||
} else if (destination.length() == 60 && destination.toLowerCase().endsWith(".b32.i2p")) {
|
||||
// use existing session to look up for efficiency
|
||||
verifySocketManager();
|
||||
I2PSession sess = sockMgr.getSession();
|
||||
if (sess != null && !sess.isClosed()) {
|
||||
byte[] hData = Base32.decode(destination.substring(0, 52));
|
||||
if (hData != null) {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("lookup in-session " + destination);
|
||||
Hash hash = Hash.create(hData);
|
||||
clientDest = sess.lookupDest(hash, 20*1000);
|
||||
}
|
||||
} else {
|
||||
clientDest = _context.namingService().lookup(destination);
|
||||
}
|
||||
} else {
|
||||
clientDest = _context.namingService().lookup(destination);
|
||||
}
|
||||
@@ -784,7 +841,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
header = getErrorPage("dnfp", ERR_DESTINATION_UNKNOWN);
|
||||
else if (ahelperPresent)
|
||||
header = getErrorPage("dnfb", ERR_DESTINATION_UNKNOWN);
|
||||
else if (destination.length() == 60 && destination.endsWith(".b32.i2p"))
|
||||
else if (destination.length() == 60 && destination.toLowerCase().endsWith(".b32.i2p"))
|
||||
header = getErrorPage("dnf", ERR_DESTINATION_UNKNOWN);
|
||||
else {
|
||||
header = getErrorPage("dnfh", ERR_DESTINATION_UNKNOWN);
|
||||
@@ -1189,7 +1246,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
String filename = null;
|
||||
try {
|
||||
filename = targetRequest.substring(LOCAL_SERVER.length() + 8, space); // "/themes/".length
|
||||
} catch (IndexOutOfBoundsException ioobe) {}
|
||||
} catch (IndexOutOfBoundsException ioobe) {
|
||||
return;
|
||||
}
|
||||
// theme hack
|
||||
if (filename.startsWith("console/default/"))
|
||||
filename = filename.replaceFirst("default", I2PAppContext.getGlobalContext().getProperty("routerconsole.theme", "light"));
|
||||
|
||||
@@ -66,6 +66,12 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
|
||||
_proxyList = new ArrayList(4);
|
||||
}
|
||||
|
||||
/**
|
||||
* This constructor always starts the tunnel (ignoring the i2cp.delayOpen option).
|
||||
* It is used to add a client to an existing socket manager.
|
||||
*
|
||||
* @param sktMgr the existing socket manager
|
||||
*/
|
||||
public I2PTunnelHTTPClientBase(int localPort, Logging l, I2PSocketManager sktMgr,
|
||||
I2PTunnel tunnel, EventDispatcher notifyThis, long clientId )
|
||||
throws IllegalArgumentException {
|
||||
|
||||
@@ -24,10 +24,9 @@ import net.i2p.util.Log;
|
||||
*
|
||||
*/
|
||||
public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner {
|
||||
private Log _log;
|
||||
public I2PTunnelHTTPClientRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, List sockList, Runnable onTimeout) {
|
||||
public I2PTunnelHTTPClientRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData,
|
||||
List<I2PSocket> sockList, Runnable onTimeout) {
|
||||
super(s, i2ps, slock, initialI2PData, sockList, onTimeout);
|
||||
_log = I2PAppContext.getGlobalContext().logManager().getLog(I2PTunnelHTTPClientRunner.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -36,10 +35,22 @@ public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner {
|
||||
return new HTTPResponseOutputStream(raw);
|
||||
}
|
||||
|
||||
/**
|
||||
* Why is this overridden?
|
||||
* Why flush in super but not here?
|
||||
* Why do things in different order than in super?
|
||||
*/
|
||||
@Override
|
||||
protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin, Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException, IOException {
|
||||
protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin,
|
||||
Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException, IOException {
|
||||
try {
|
||||
i2pin.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Unable to close the i2p socket input stream: " + i2pin, ioe);
|
||||
}
|
||||
try {
|
||||
i2pout.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
@@ -48,14 +59,28 @@ public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner {
|
||||
}
|
||||
try {
|
||||
in.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Unable to close the browser input stream: " + in, ioe);
|
||||
}
|
||||
try {
|
||||
out.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Unable to close the browser output stream: " + out, ioe);
|
||||
}
|
||||
i2ps.close();
|
||||
s.close();
|
||||
try {
|
||||
i2ps.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
s.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
}
|
||||
t1.join(30*1000);
|
||||
t2.join(30*1000);
|
||||
}
|
||||
|
||||
@@ -303,19 +303,58 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This plus a typ. HTTP response header will fit into a 1730-byte streaming message.
|
||||
*/
|
||||
private static final int MIN_TO_COMPRESS = 1300;
|
||||
|
||||
private static class CompressedResponseOutputStream extends HTTPResponseOutputStream {
|
||||
private InternalGZIPOutputStream _gzipOut;
|
||||
|
||||
public CompressedResponseOutputStream(OutputStream o) {
|
||||
super(o);
|
||||
_dataExpected = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overridden to peek at response code. Always returns line.
|
||||
*/
|
||||
@Override
|
||||
protected boolean shouldCompress() { return true; }
|
||||
protected String filterResponseLine(String line) {
|
||||
String[] s = line.split(" ", 3);
|
||||
if (s.length > 1 &&
|
||||
(s[1].startsWith("3") || s[1].startsWith("5")))
|
||||
_dataExpected = 0;
|
||||
return line;
|
||||
}
|
||||
|
||||
/**
|
||||
* Don't compress small responses or images.
|
||||
* Compression is inline but decompression on the client side
|
||||
* creates a new thread.
|
||||
*/
|
||||
@Override
|
||||
protected boolean shouldCompress() {
|
||||
return (_dataExpected < 0 || _dataExpected >= MIN_TO_COMPRESS) &&
|
||||
(_contentType == null ||
|
||||
((!_contentType.startsWith("audio/")) &&
|
||||
(!_contentType.startsWith("image/")) &&
|
||||
(!_contentType.startsWith("video/")) &&
|
||||
(!_contentType.equals("application/compress")) &&
|
||||
(!_contentType.equals("application/bzip2")) &&
|
||||
(!_contentType.equals("application/gzip")) &&
|
||||
(!_contentType.equals("application/x-bzip")) &&
|
||||
(!_contentType.equals("application/x-bzip2")) &&
|
||||
(!_contentType.equals("application/x-gzip")) &&
|
||||
(!_contentType.equals("application/zip"))));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finishHeaders() throws IOException {
|
||||
//if (_log.shouldLog(Log.INFO))
|
||||
// _log.info("Including x-i2p-gzip as the content encoding in the response");
|
||||
out.write("Content-encoding: x-i2p-gzip\r\n".getBytes());
|
||||
if (shouldCompress())
|
||||
out.write("Content-encoding: x-i2p-gzip\r\n".getBytes());
|
||||
super.finishHeaders();
|
||||
}
|
||||
|
||||
@@ -324,9 +363,12 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
|
||||
//if (_log.shouldLog(Log.INFO))
|
||||
// _log.info("Beginning compression processing");
|
||||
//out.flush();
|
||||
_gzipOut = new InternalGZIPOutputStream(out);
|
||||
out = _gzipOut;
|
||||
if (shouldCompress()) {
|
||||
_gzipOut = new InternalGZIPOutputStream(out);
|
||||
out = _gzipOut;
|
||||
}
|
||||
}
|
||||
|
||||
public long getTotalRead() {
|
||||
InternalGZIPOutputStream gzipOut = _gzipOut;
|
||||
if (gzipOut != null)
|
||||
@@ -334,6 +376,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
public long getTotalCompressed() {
|
||||
InternalGZIPOutputStream gzipOut = _gzipOut;
|
||||
if (gzipOut != null)
|
||||
@@ -369,9 +412,9 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
|
||||
protected static String formatHeaders(Map<String, List<String>> headers, StringBuilder command) {
|
||||
StringBuilder buf = new StringBuilder(command.length() + headers.size() * 64);
|
||||
buf.append(command.toString().trim()).append("\r\n");
|
||||
for (Iterator<String> iter = headers.keySet().iterator(); iter.hasNext(); ) {
|
||||
String name = (String)iter.next();
|
||||
for(String val: headers.get(name)) {
|
||||
for (Map.Entry<String, List<String>> e : headers.entrySet()) {
|
||||
String name = e.getKey();
|
||||
for(String val: e.getValue()) {
|
||||
buf.append(name.trim()).append(": ").append(val.trim()).append("\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,13 @@ import java.util.List;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.data.Base32;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.i2ptunnel.irc.DCCClientManager;
|
||||
import net.i2p.i2ptunnel.irc.DCCHelper;
|
||||
import net.i2p.i2ptunnel.irc.I2PTunnelDCCServer;
|
||||
import net.i2p.i2ptunnel.irc.IrcInboundFilter;
|
||||
import net.i2p.i2ptunnel.irc.IrcOutboundFilter;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
@@ -18,7 +24,7 @@ import net.i2p.util.Log;
|
||||
/**
|
||||
* Todo: Can we extend I2PTunnelClient instead and remove some duplicated code?
|
||||
*/
|
||||
public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable {
|
||||
public class I2PTunnelIRCClient extends I2PTunnelClientBase {
|
||||
|
||||
/** used to assign unique IDs to the threads / clients. no logic or functionality */
|
||||
private static volatile long __clientId = 0;
|
||||
@@ -27,6 +33,14 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
protected List<Destination> dests;
|
||||
private static final long DEFAULT_READ_TIMEOUT = 5*60*1000; // -1
|
||||
protected long readTimeout = DEFAULT_READ_TIMEOUT;
|
||||
private final boolean _dccEnabled;
|
||||
private I2PTunnelDCCServer _DCCServer;
|
||||
private DCCClientManager _DCCClientManager;
|
||||
|
||||
/**
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public static final String PROP_DCC = "i2ptunnel.ircclient.enableDCC";
|
||||
|
||||
/**
|
||||
* @throws IllegalArgumentException if the I2PTunnel does not contain
|
||||
@@ -75,23 +89,28 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
|
||||
setName("IRC Client on " + tunnel.listenHost + ':' + localPort);
|
||||
|
||||
_dccEnabled = Boolean.valueOf(tunnel.getClientOptions().getProperty(PROP_DCC)).booleanValue();
|
||||
// TODO add some prudent tunnel options (or is it too late?)
|
||||
|
||||
startRunning();
|
||||
|
||||
notifyEvent("openIRCClientResult", "ok");
|
||||
}
|
||||
|
||||
protected void clientConnectionRun(Socket s) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("got a connection.");
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("New connection local addr is: " + s.getLocalAddress() +
|
||||
" from: " + s.getInetAddress());
|
||||
Destination clientDest = pickDestination();
|
||||
I2PSocket i2ps = null;
|
||||
try {
|
||||
i2ps = createI2PSocket(clientDest);
|
||||
i2ps.setReadTimeout(readTimeout);
|
||||
StringBuffer expectedPong = new StringBuffer();
|
||||
Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong, _log), "IRC Client " + __clientId + " in", true);
|
||||
DCCHelper dcc = _dccEnabled ? new DCC(s.getLocalAddress().getAddress()) : null;
|
||||
Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong, _log, dcc), "IRC Client " + __clientId + " in", true);
|
||||
in.start();
|
||||
Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong, _log), "IRC Client " + __clientId + " out", true);
|
||||
Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong, _log, dcc), "IRC Client " + __clientId + " out", true);
|
||||
out.start();
|
||||
} catch (Exception ex) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
@@ -120,388 +139,112 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
return dests.get(index);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
*
|
||||
*/
|
||||
public static class IrcInboundFilter implements Runnable {
|
||||
|
||||
private Socket local;
|
||||
private I2PSocket remote;
|
||||
private StringBuffer expectedPong;
|
||||
private final Log _log;
|
||||
|
||||
public IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong, Log log) {
|
||||
local=_local;
|
||||
remote=_remote;
|
||||
expectedPong=pong;
|
||||
_log = log;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// Todo: Don't use BufferedReader - IRC spec limits line length to 512 but...
|
||||
BufferedReader in;
|
||||
OutputStream output;
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(remote.getInputStream(), "ISO-8859-1"));
|
||||
output=local.getOutputStream();
|
||||
} catch (IOException e) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("IrcInboundFilter: no streams",e);
|
||||
return;
|
||||
@Override
|
||||
public boolean close(boolean forced) {
|
||||
synchronized(this) {
|
||||
if (_DCCServer != null) {
|
||||
_DCCServer.close(forced);
|
||||
_DCCServer = null;
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcInboundFilter: Running.");
|
||||
try {
|
||||
while(true)
|
||||
{
|
||||
try {
|
||||
String inmsg = in.readLine();
|
||||
if(inmsg==null)
|
||||
break;
|
||||
if(inmsg.endsWith("\r"))
|
||||
inmsg=inmsg.substring(0,inmsg.length()-1);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("in: [" + inmsg + "]");
|
||||
String outmsg = inboundFilter(inmsg, expectedPong);
|
||||
if(outmsg!=null)
|
||||
{
|
||||
if(!inmsg.equals(outmsg)) {
|
||||
if (_log.shouldLog(Log.WARN)) {
|
||||
_log.warn("inbound FILTERED: "+outmsg);
|
||||
_log.warn(" - inbound was: "+inmsg);
|
||||
}
|
||||
} else {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("inbound: "+outmsg);
|
||||
}
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
// probably doesn't do much but can't hurt
|
||||
output.flush();
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("inbound BLOCKED: "+inmsg);
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("IrcInboundFilter: disconnected",e1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException re) {
|
||||
_log.error("Error filtering inbound data", re);
|
||||
} finally {
|
||||
if (local != null) try { local.close(); } catch (IOException e) {}
|
||||
}
|
||||
if(_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcInboundFilter: Done.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
*
|
||||
*/
|
||||
public static class IrcOutboundFilter implements Runnable {
|
||||
|
||||
private Socket local;
|
||||
private I2PSocket remote;
|
||||
private StringBuffer expectedPong;
|
||||
private final Log _log;
|
||||
|
||||
public IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong, Log log) {
|
||||
local=_local;
|
||||
remote=_remote;
|
||||
expectedPong=pong;
|
||||
_log = log;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// Todo: Don't use BufferedReader - IRC spec limits line length to 512 but...
|
||||
BufferedReader in;
|
||||
OutputStream output;
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(local.getInputStream(), "ISO-8859-1"));
|
||||
output=remote.getOutputStream();
|
||||
} catch (IOException e) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("IrcOutboundFilter: no streams",e);
|
||||
return;
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcOutboundFilter: Running.");
|
||||
try {
|
||||
while(true)
|
||||
{
|
||||
try {
|
||||
String inmsg = in.readLine();
|
||||
if(inmsg==null)
|
||||
break;
|
||||
if(inmsg.endsWith("\r"))
|
||||
inmsg=inmsg.substring(0,inmsg.length()-1);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("out: [" + inmsg + "]");
|
||||
String outmsg = outboundFilter(inmsg, expectedPong);
|
||||
if(outmsg!=null)
|
||||
{
|
||||
if(!inmsg.equals(outmsg)) {
|
||||
if (_log.shouldLog(Log.WARN)) {
|
||||
_log.warn("outbound FILTERED: "+outmsg);
|
||||
_log.warn(" - outbound was: "+inmsg);
|
||||
}
|
||||
} else {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("outbound: "+outmsg);
|
||||
}
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
// save 250 ms in streaming
|
||||
output.flush();
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("outbound BLOCKED: "+"\""+inmsg+"\"");
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("IrcOutboundFilter: disconnected",e1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException re) {
|
||||
_log.error("Error filtering outbound data", re);
|
||||
} finally {
|
||||
if (remote != null) try { remote.close(); } catch (IOException e) {}
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcOutboundFilter: Done.");
|
||||
if (_DCCClientManager != null) {
|
||||
_DCCClientManager.close(forced);
|
||||
_DCCClientManager = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
*
|
||||
*/
|
||||
|
||||
public static String inboundFilter(String s, StringBuffer expectedPong) {
|
||||
|
||||
String field[]=s.split(" ",4);
|
||||
String command;
|
||||
int idx=0;
|
||||
final String[] allowedCommands =
|
||||
{
|
||||
// "NOTICE", // can contain CTCP
|
||||
//"PING",
|
||||
//"PONG",
|
||||
"MODE",
|
||||
"JOIN",
|
||||
"NICK",
|
||||
"QUIT",
|
||||
"PART",
|
||||
"WALLOPS",
|
||||
"ERROR",
|
||||
"KICK",
|
||||
"H", // "hide operator status" (after kicking an op)
|
||||
"TOPIC"
|
||||
};
|
||||
|
||||
if(field[0].charAt(0)==':')
|
||||
idx++;
|
||||
|
||||
try { command = field[idx++]; }
|
||||
catch (IndexOutOfBoundsException ioobe) // wtf, server sent borked command?
|
||||
{
|
||||
//_log.warn("Dropping defective message: index out of bounds while extracting command.");
|
||||
return null;
|
||||
}
|
||||
|
||||
idx++; //skip victim
|
||||
|
||||
// Allow numerical responses
|
||||
try {
|
||||
new Integer(command);
|
||||
return s;
|
||||
} catch(NumberFormatException nfe){}
|
||||
|
||||
|
||||
if ("PING".equalsIgnoreCase(command))
|
||||
return "PING 127.0.0.1"; // no way to know what the ircd to i2ptunnel server con is, so localhost works
|
||||
if ("PONG".equalsIgnoreCase(command)) {
|
||||
// Turn the received ":irc.freshcoffee.i2p PONG irc.freshcoffee.i2p :127.0.0.1"
|
||||
// into ":127.0.0.1 PONG 127.0.0.1 " so that the caller can append the client's extra parameter
|
||||
// though, does 127.0.0.1 work for irc clients connecting remotely? and for all of them? sure would
|
||||
// be great if irc clients actually followed the RFCs here, but i guess thats too much to ask.
|
||||
// If we haven't PINGed them, or the PING we sent isn't something we know how to filter, this
|
||||
// is blank.
|
||||
//
|
||||
// String pong = expectedPong.length() > 0 ? expectedPong.toString() : null;
|
||||
// If we aren't going to rewrite it, pass it through
|
||||
String pong = expectedPong.length() > 0 ? expectedPong.toString() : s;
|
||||
expectedPong.setLength(0);
|
||||
return pong;
|
||||
}
|
||||
|
||||
// Allow all allowedCommands
|
||||
for(int i=0;i<allowedCommands.length;i++) {
|
||||
if(allowedCommands[i].equalsIgnoreCase(command))
|
||||
return s;
|
||||
}
|
||||
|
||||
// Allow PRIVMSG, but block CTCP.
|
||||
if("PRIVMSG".equalsIgnoreCase(command) || "NOTICE".equalsIgnoreCase(command))
|
||||
{
|
||||
String msg;
|
||||
msg = field[idx++];
|
||||
|
||||
if(msg.indexOf(0x01) >= 0) // CTCP marker ^A can be anywhere, not just immediately after the ':'
|
||||
{
|
||||
// CTCP
|
||||
msg=msg.substring(2);
|
||||
if(msg.startsWith("ACTION ")) {
|
||||
// /me says hello
|
||||
return s;
|
||||
}
|
||||
return null; // Block all other ctcp
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
// Block the rest
|
||||
return null;
|
||||
return super.close(forced);
|
||||
}
|
||||
|
||||
public static String outboundFilter(String s, StringBuffer expectedPong) {
|
||||
|
||||
String field[]=s.split(" ",3);
|
||||
String command;
|
||||
final String[] allowedCommands =
|
||||
{
|
||||
// "NOTICE", // can contain CTCP
|
||||
"MODE",
|
||||
"JOIN",
|
||||
"NICK",
|
||||
"WHO",
|
||||
"WHOIS",
|
||||
"LIST",
|
||||
"NAMES",
|
||||
"NICK",
|
||||
// "QUIT", // replace with a filtered QUIT to hide client quit messages
|
||||
"SILENCE",
|
||||
"MAP", // seems safe enough, the ircd should protect themselves though
|
||||
// "PART", // replace with filtered PART to hide client part messages
|
||||
"OPER",
|
||||
// "PONG", // replaced with a filtered PING/PONG since some clients send the server IP (thanks aardvax!)
|
||||
// "PING",
|
||||
"KICK",
|
||||
"HELPME",
|
||||
"RULES",
|
||||
"TOPIC",
|
||||
"ISON", // jIRCii uses this for a ping (response is 303)
|
||||
"INVITE"
|
||||
};
|
||||
|
||||
if(field[0].length()==0)
|
||||
return null; // W T F?
|
||||
|
||||
|
||||
if(field[0].charAt(0)==':')
|
||||
return null; // wtf
|
||||
|
||||
command = field[0].toUpperCase();
|
||||
//
|
||||
// Start of the DCCHelper interface
|
||||
//
|
||||
|
||||
if ("PING".equals(command)) {
|
||||
// Most clients just send a PING and are happy with any old PONG. Others,
|
||||
// like BitchX, actually expect certain behavior. It sends two different pings:
|
||||
// "PING :irc.freshcoffee.i2p" and "PING 1234567890 127.0.0.1" (where the IP is the proxy)
|
||||
// the PONG to the former seems to be "PONG 127.0.0.1", while the PONG to the later is
|
||||
// ":irc.freshcoffee.i2p PONG irc.freshcoffe.i2p :1234567890".
|
||||
// We don't want to send them our proxy's IP address, so we need to rewrite the PING
|
||||
// sent to the server, but when we get a PONG back, use what we expected, rather than
|
||||
// what they sent.
|
||||
//
|
||||
// Yuck.
|
||||
private class DCC implements DCCHelper {
|
||||
|
||||
String rv = null;
|
||||
expectedPong.setLength(0);
|
||||
if (field.length == 1) { // PING
|
||||
rv = "PING";
|
||||
// If we aren't rewriting the PING don't rewrite the PONG
|
||||
// expectedPong.append("PONG 127.0.0.1");
|
||||
} else if (field.length == 2) { // PING nonce
|
||||
rv = "PING " + field[1];
|
||||
// If we aren't rewriting the PING don't rewrite the PONG
|
||||
// expectedPong.append("PONG ").append(field[1]);
|
||||
} else if (field.length == 3) { // PING nonce serverLocation
|
||||
rv = "PING " + field[1];
|
||||
expectedPong.append("PONG ").append(field[2]).append(" :").append(field[1]); // PONG serverLocation nonce
|
||||
} else {
|
||||
//if (_log.shouldLog(Log.ERROR))
|
||||
// _log.error("IRC client sent a PING we don't understand, filtering it (\"" + s + "\")");
|
||||
rv = null;
|
||||
}
|
||||
|
||||
//if (_log.shouldLog(Log.WARN))
|
||||
// _log.warn("sending ping [" + rv + "], waiting for [" + expectedPong + "] orig was [" + s + "]");
|
||||
|
||||
return rv;
|
||||
}
|
||||
if ("PONG".equals(command))
|
||||
return "PONG 127.0.0.1"; // no way to know what the ircd to i2ptunnel server con is, so localhost works
|
||||
private final byte[] _localAddr;
|
||||
|
||||
// Allow all allowedCommands
|
||||
for(int i=0;i<allowedCommands.length;i++)
|
||||
{
|
||||
if(allowedCommands[i].equals(command))
|
||||
return s;
|
||||
}
|
||||
|
||||
// mIRC sends "NOTICE user :DCC Send file (IP)"
|
||||
// in addition to the CTCP version
|
||||
if("NOTICE".equals(command))
|
||||
{
|
||||
String msg = field[2];
|
||||
if(msg.startsWith(":DCC "))
|
||||
return null;
|
||||
// fall through
|
||||
}
|
||||
|
||||
// Allow PRIVMSG, but block CTCP (except ACTION).
|
||||
if("PRIVMSG".equals(command) || "NOTICE".equals(command))
|
||||
{
|
||||
String msg;
|
||||
msg = field[2];
|
||||
|
||||
if(msg.indexOf(0x01) >= 0) // CTCP marker ^A can be anywhere, not just immediately after the ':'
|
||||
{
|
||||
// CTCP
|
||||
msg=msg.substring(2);
|
||||
if(msg.startsWith("ACTION ")) {
|
||||
// /me says hello
|
||||
return s;
|
||||
}
|
||||
return null; // Block all other ctcp
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
if("USER".equals(command)) {
|
||||
int idx = field[2].lastIndexOf(":");
|
||||
if(idx<0)
|
||||
return "USER user hostname localhost :realname";
|
||||
String realname = field[2].substring(idx+1);
|
||||
String ret = "USER "+field[1]+" hostname localhost :"+realname;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ("PART".equals(command)) {
|
||||
// hide client message
|
||||
return "PART " + field[1] + " :leaving";
|
||||
}
|
||||
|
||||
if ("QUIT".equals(command)) {
|
||||
return "QUIT :leaving";
|
||||
}
|
||||
|
||||
// Block the rest
|
||||
return null;
|
||||
/**
|
||||
* @param local Our IP address, from the IRC client's perspective
|
||||
*/
|
||||
public DCC(byte[] local) {
|
||||
if (local.length == 4)
|
||||
_localAddr = local;
|
||||
else
|
||||
_localAddr = new byte[] {127, 0, 0, 1};
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return _dccEnabled;
|
||||
}
|
||||
|
||||
public String getB32Hostname() {
|
||||
return Base32.encode(sockMgr.getSession().getMyDestination().calculateHash().getData()) + ".b32.i2p";
|
||||
}
|
||||
|
||||
public byte[] getLocalAddress() {
|
||||
return _localAddr;
|
||||
}
|
||||
|
||||
public int newOutgoing(byte[] ip, int port, String type) {
|
||||
I2PTunnelDCCServer server;
|
||||
synchronized(this) {
|
||||
if (_DCCServer == null) {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("Starting DCC Server");
|
||||
_DCCServer = new I2PTunnelDCCServer(sockMgr, l, I2PTunnelIRCClient.this, getTunnel());
|
||||
// TODO add some prudent tunnel options (or is it too late?)
|
||||
_DCCServer.startRunning();
|
||||
}
|
||||
server = _DCCServer;
|
||||
}
|
||||
int rv = server.newOutgoing(ip, port, type);
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("New outgoing " + type + ' ' + port + " returns " + rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
public int newIncoming(String b32, int port, String type) {
|
||||
DCCClientManager tracker;
|
||||
synchronized(this) {
|
||||
if (_DCCClientManager == null) {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("Starting DCC Client");
|
||||
_DCCClientManager = new DCCClientManager(sockMgr, l, I2PTunnelIRCClient.this, getTunnel());
|
||||
}
|
||||
tracker = _DCCClientManager;
|
||||
}
|
||||
// The tracker starts our client
|
||||
int rv = tracker.newIncoming(b32, port, type);
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("New incoming " + type + ' ' + b32 + ' ' + port + " returns " + rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
public int resumeOutgoing(int port) {
|
||||
DCCClientManager tracker = _DCCClientManager;
|
||||
if (tracker != null)
|
||||
return tracker.resumeOutgoing(port);
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int resumeIncoming(int port) {
|
||||
I2PTunnelDCCServer server = _DCCServer;
|
||||
if (server != null)
|
||||
return server.resumeIncoming(port);
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int acceptOutgoing(int port) {
|
||||
I2PTunnelDCCServer server = _DCCServer;
|
||||
if (server != null)
|
||||
return server.acceptOutgoing(port);
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int acceptIncoming(int port) {
|
||||
DCCClientManager tracker = _DCCClientManager;
|
||||
if (tracker != null)
|
||||
return tracker.acceptIncoming(port);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,6 +63,13 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
|
||||
public static final String PROP_HOSTNAME_DEFAULT="%f.b32.i2p";
|
||||
private static final long HEADER_TIMEOUT = 60*1000;
|
||||
|
||||
private final static byte[] ERR_UNAVAILABLE =
|
||||
(":ircserver.i2p 499 you :" +
|
||||
"This I2P IRC server is unvailable. It may be down or undergoing maintenance. " +
|
||||
"Please try again later." +
|
||||
"\r\n")
|
||||
.getBytes();
|
||||
|
||||
/**
|
||||
* @throws IllegalArgumentException if the I2PTunnel does not contain
|
||||
* valid config to contact the router
|
||||
@@ -125,7 +132,11 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
|
||||
Socket s = new Socket(remoteHost, remotePort);
|
||||
new I2PTunnelRunner(s, socket, slock, null, modifiedRegistration.getBytes(), null);
|
||||
} catch (SocketException ex) {
|
||||
// TODO send the equivalent of a 503?
|
||||
try {
|
||||
// Send a response so the user doesn't just see a disconnect
|
||||
// and blame his router or the network.
|
||||
socket.getOutputStream().write(ERR_UNAVAILABLE);
|
||||
} catch (IOException ioe) {}
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {}
|
||||
|
||||
@@ -12,6 +12,7 @@ import java.net.SocketException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.data.ByteArray;
|
||||
import net.i2p.util.ByteCache;
|
||||
@@ -20,10 +21,10 @@ import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErrorListener {
|
||||
private final static Log _log = new Log(I2PTunnelRunner.class);
|
||||
protected final Log _log;
|
||||
|
||||
private static volatile long __runnerId;
|
||||
private long _runnerId;
|
||||
private final long _runnerId;
|
||||
/**
|
||||
* max bytes streamed in a packet - smaller ones might be filled
|
||||
* up to this size. Larger ones are not split (at least not on
|
||||
@@ -34,35 +35,52 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
|
||||
static final int NETWORK_BUFFER_SIZE = MAX_PACKET_SIZE;
|
||||
|
||||
private Socket s;
|
||||
private I2PSocket i2ps;
|
||||
final Object slock, finishLock = new Object();
|
||||
private final Socket s;
|
||||
private final I2PSocket i2ps;
|
||||
private final Object slock, finishLock = new Object();
|
||||
boolean finished = false;
|
||||
HashMap ostreams, sockets;
|
||||
byte[] initialI2PData;
|
||||
byte[] initialSocketData;
|
||||
private final byte[] initialI2PData;
|
||||
private final byte[] initialSocketData;
|
||||
/** when the last data was sent/received (or -1 if never) */
|
||||
private long lastActivityOn;
|
||||
/** when the runner started up */
|
||||
private long startedOn;
|
||||
private List sockList;
|
||||
private final long startedOn;
|
||||
private final List<I2PSocket> sockList;
|
||||
/** if we die before receiving any data, run this job */
|
||||
private Runnable onTimeout;
|
||||
private final Runnable onTimeout;
|
||||
private long totalSent;
|
||||
private long totalReceived;
|
||||
|
||||
private volatile long __forwarderId;
|
||||
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, List sockList) {
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData,
|
||||
List<I2PSocket> sockList) {
|
||||
this(s, i2ps, slock, initialI2PData, null, sockList, null);
|
||||
}
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, byte[] initialSocketData, List sockList) {
|
||||
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData,
|
||||
byte[] initialSocketData, List<I2PSocket> sockList) {
|
||||
this(s, i2ps, slock, initialI2PData, initialSocketData, sockList, null);
|
||||
}
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, List sockList, Runnable onTimeout) {
|
||||
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData,
|
||||
List<I2PSocket> sockList, Runnable onTimeout) {
|
||||
this(s, i2ps, slock, initialI2PData, null, sockList, onTimeout);
|
||||
}
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, byte[] initialSocketData, List sockList, Runnable onTimeout) {
|
||||
|
||||
/**
|
||||
* Starts itself
|
||||
*
|
||||
* @param slock the socket lock, non-null
|
||||
* @param initialI2PData may be null
|
||||
* @param initialSocketData may be null
|
||||
* @param sockList may be null. Caller must add i2ps to the list! It will be removed here on completion.
|
||||
* Will synchronize on slock when removing.
|
||||
* @param onTimeout May be null. If non-null and no data (except initial data) was sent or received,
|
||||
it will be run before closing s.
|
||||
*/
|
||||
public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData,
|
||||
byte[] initialSocketData, List<I2PSocket> sockList, Runnable onTimeout) {
|
||||
this.sockList = sockList;
|
||||
this.s = s;
|
||||
this.i2ps = i2ps;
|
||||
@@ -72,6 +90,7 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
this.onTimeout = onTimeout;
|
||||
lastActivityOn = -1;
|
||||
startedOn = Clock.getInstance().now();
|
||||
_log = I2PAppContext.getGlobalContext().logManager().getLog(getClass());
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("I2PTunnelRunner started");
|
||||
_runnerId = ++__runnerId;
|
||||
@@ -84,6 +103,7 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
* have we closed at least one (if not both) of the streams
|
||||
* [aka we're done running the streams]?
|
||||
*
|
||||
* @deprecated unused
|
||||
*/
|
||||
public boolean isFinished() {
|
||||
return finished;
|
||||
@@ -93,7 +113,7 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
* When was the last data for this runner sent or received?
|
||||
*
|
||||
* @return date (ms since the epoch), or -1 if no data has been transferred yet
|
||||
*
|
||||
* @deprecated unused
|
||||
*/
|
||||
public long getLastActivityOn() {
|
||||
return lastActivityOn;
|
||||
@@ -175,6 +195,20 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
} catch (IOException ex) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Error forwarding", ex);
|
||||
} catch (IllegalStateException ise) {
|
||||
// JamVM (Gentoo: jamvm-1.5.4, gnu-classpath-0.98+gmp)
|
||||
//java.nio.channels.NotYetConnectedException
|
||||
// at gnu.java.nio.SocketChannelImpl.write(SocketChannelImpl.java:240)
|
||||
// at gnu.java.net.PlainSocketImpl$SocketOutputStream.write(PlainSocketImpl.java:668)
|
||||
// at java.io.OutputStream.write(OutputStream.java:86)
|
||||
// at net.i2p.i2ptunnel.I2PTunnelHTTPClient.writeFooter(I2PTunnelHTTPClient.java:1029)
|
||||
// at net.i2p.i2ptunnel.I2PTunnelHTTPClient.writeErrorMessage(I2PTunnelHTTPClient.java:1114)
|
||||
// at net.i2p.i2ptunnel.I2PTunnelHTTPClient.handleHTTPClientException(I2PTunnelHTTPClient.java:1131)
|
||||
// at net.i2p.i2ptunnel.I2PTunnelHTTPClient.access$000(I2PTunnelHTTPClient.java:67)
|
||||
// at net.i2p.i2ptunnel.I2PTunnelHTTPClient$OnTimeout.run(I2PTunnelHTTPClient.java:1052)
|
||||
// at net.i2p.i2ptunnel.I2PTunnelRunner.run(I2PTunnelRunner.java:167)
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("gnu?", ise);
|
||||
} catch (Exception e) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("Internal error", e);
|
||||
@@ -184,22 +218,23 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
if (s != null)
|
||||
s.close();
|
||||
} catch (IOException ex) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("Could not close java socket", ex);
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Could not close java socket", ex);
|
||||
}
|
||||
if (i2ps != null) {
|
||||
try {
|
||||
i2ps.close();
|
||||
} catch (IOException ex) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("Could not close I2PSocket", ex);
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Could not close I2PSocket", ex);
|
||||
}
|
||||
i2ps.setSocketErrorListener(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin, Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException, IOException {
|
||||
protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin,
|
||||
Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException, IOException {
|
||||
try {
|
||||
out.flush();
|
||||
} catch (IOException ioe) {
|
||||
@@ -210,12 +245,28 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
}
|
||||
in.close();
|
||||
i2pin.close();
|
||||
try {
|
||||
in.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
i2pin.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
}
|
||||
// ok, yeah, there's a race here in theory, if data comes in after flushing and before
|
||||
// closing, but its better than before...
|
||||
s.close();
|
||||
i2ps.close();
|
||||
try {
|
||||
s.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
i2ps.close();
|
||||
} catch (IOException ioe) {
|
||||
// ignore
|
||||
}
|
||||
t1.join(30*1000);
|
||||
t2.join(30*1000);
|
||||
}
|
||||
@@ -237,11 +288,11 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
|
||||
private class StreamForwarder extends I2PAppThread {
|
||||
|
||||
InputStream in;
|
||||
OutputStream out;
|
||||
String direction;
|
||||
private boolean _toI2P;
|
||||
private ByteCache _cache;
|
||||
private final InputStream in;
|
||||
private final OutputStream out;
|
||||
private final String direction;
|
||||
private final boolean _toI2P;
|
||||
private final ByteCache _cache;
|
||||
|
||||
private StreamForwarder(InputStream in, OutputStream out, boolean toI2P) {
|
||||
this.in = in;
|
||||
@@ -330,7 +381,17 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
_log.warn(direction + ": Error closing input stream", ex);
|
||||
}
|
||||
try {
|
||||
out.flush();
|
||||
// Thread must close() before exiting for a PipedOutputStream,
|
||||
// or else input end gives up and we have data loss.
|
||||
// http://techtavern.wordpress.com/2008/07/16/whats-this-ioexception-write-end-dead/
|
||||
//out.flush();
|
||||
// DON'T close if we have a timeout job and we haven't received anything,
|
||||
// or else the timeout job can't write the error message to the stream.
|
||||
// close() above will close it after the timeout job is run.
|
||||
if (!(onTimeout != null && (!_toI2P) && totalReceived <= 0))
|
||||
out.close();
|
||||
else if (_log.shouldLog(Log.INFO))
|
||||
_log.info(direction + ": not closing so we can write the error message");
|
||||
} catch (IOException ioe) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(direction + ": Error flushing to close", ioe);
|
||||
|
||||
@@ -47,7 +47,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
protected int remotePort;
|
||||
private boolean _usePool;
|
||||
|
||||
private Logging l;
|
||||
protected Logging l;
|
||||
|
||||
private static final long DEFAULT_READ_TIMEOUT = -1; // 3*60*1000;
|
||||
/** default timeout to 3 minutes - override if desired */
|
||||
@@ -67,11 +67,15 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
|
||||
protected I2PTunnelTask task = null;
|
||||
protected boolean bidir = false;
|
||||
private ThreadPoolExecutor _executor;
|
||||
|
||||
/** unused? port should always be specified */
|
||||
private int DEFAULT_LOCALPORT = 4488;
|
||||
protected int localPort = DEFAULT_LOCALPORT;
|
||||
|
||||
/**
|
||||
* @param privData Base64-encoded private key data,
|
||||
* format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
*/
|
||||
@@ -83,6 +87,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param privkey file containing the private key data,
|
||||
* format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
|
||||
* @param privkeyname the name of the privKey file, not clear why we need this too
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
*/
|
||||
@@ -104,6 +111,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param privData stream containing the private key data,
|
||||
* format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
|
||||
* @param privkeyname the name of the privKey file, not clear why we need this too
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
*/
|
||||
@@ -113,10 +123,28 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
init(host, port, privData, privkeyname, l);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sktMgr the existing socket manager
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public I2PTunnelServer(InetAddress host, int port, I2PSocketManager sktMgr,
|
||||
Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
|
||||
super("Server at " + host + ':' + port, notifyThis, tunnel);
|
||||
this.l = l;
|
||||
this.remoteHost = host;
|
||||
this.remotePort = port;
|
||||
_log = tunnel.getContext().logManager().getLog(getClass());
|
||||
sockMgr = sktMgr;
|
||||
open = true;
|
||||
}
|
||||
|
||||
private static final int RETRY_DELAY = 20*1000;
|
||||
private static final int MAX_RETRIES = 4;
|
||||
|
||||
/**
|
||||
* @param privData stream containing the private key data,
|
||||
* format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
|
||||
* @param privkeyname the name of the privKey file, not clear why we need this too
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
*/
|
||||
@@ -259,6 +287,10 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
}
|
||||
//l.log("Server shut down.");
|
||||
open = false;
|
||||
if (_usePool && _executor != null) {
|
||||
_executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
|
||||
_executor.shutdownNow();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -283,7 +315,6 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
*/
|
||||
public void run() {
|
||||
I2PServerSocket i2pS_S = sockMgr.getServerSocket();
|
||||
ThreadPoolExecutor executor = null;
|
||||
if (_log.shouldLog(Log.WARN)) {
|
||||
if (_usePool)
|
||||
_log.warn("Starting executor with " + getHandlerCount() + " threads max");
|
||||
@@ -291,7 +322,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
_log.warn("Threads disabled, running blockingHandles inline");
|
||||
}
|
||||
if (_usePool) {
|
||||
executor = new CustomThreadPoolExecutor(getHandlerCount(), "ServerHandler pool " + remoteHost + ':' + remotePort);
|
||||
_executor = new CustomThreadPoolExecutor(getHandlerCount(), "ServerHandler pool " + remoteHost + ':' + remotePort);
|
||||
}
|
||||
while (open) {
|
||||
try {
|
||||
@@ -299,7 +330,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
if (i2ps == null) throw new I2PException("I2PServerSocket closed");
|
||||
if (_usePool) {
|
||||
try {
|
||||
executor.execute(new Handler(i2ps));
|
||||
_executor.execute(new Handler(i2ps));
|
||||
} catch (RejectedExecutionException ree) {
|
||||
try {
|
||||
i2ps.close();
|
||||
@@ -328,8 +359,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
// ignored, we never set the timeout
|
||||
}
|
||||
}
|
||||
if (executor != null)
|
||||
executor.shutdownNow();
|
||||
if (_executor != null)
|
||||
_executor.shutdownNow();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -13,9 +13,7 @@ import net.i2p.util.EventDispatcherImpl;
|
||||
* Either a Server or a Client.
|
||||
*/
|
||||
|
||||
public abstract class I2PTunnelTask implements EventDispatcher {
|
||||
|
||||
private final EventDispatcherImpl _event = new EventDispatcherImpl();
|
||||
public abstract class I2PTunnelTask extends EventDispatcherImpl {
|
||||
|
||||
private int id;
|
||||
private String name;
|
||||
@@ -77,41 +75,4 @@ public abstract class I2PTunnelTask implements EventDispatcher {
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/* Required by the EventDispatcher interface */
|
||||
public EventDispatcher getEventDispatcher() {
|
||||
return _event;
|
||||
}
|
||||
|
||||
public void attachEventDispatcher(EventDispatcher e) {
|
||||
_event.attachEventDispatcher(e.getEventDispatcher());
|
||||
}
|
||||
|
||||
public void detachEventDispatcher(EventDispatcher e) {
|
||||
_event.detachEventDispatcher(e.getEventDispatcher());
|
||||
}
|
||||
|
||||
public void notifyEvent(String e, Object a) {
|
||||
_event.notifyEvent(e, a);
|
||||
}
|
||||
|
||||
public Object getEventValue(String n) {
|
||||
return _event.getEventValue(n);
|
||||
}
|
||||
|
||||
public Set getEvents() {
|
||||
return _event.getEvents();
|
||||
}
|
||||
|
||||
public void ignoreEvents() {
|
||||
_event.ignoreEvents();
|
||||
}
|
||||
|
||||
public void unIgnoreEvents() {
|
||||
_event.unIgnoreEvents();
|
||||
}
|
||||
|
||||
public Object waitEventValue(String n) {
|
||||
return _event.waitEventValue(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,11 +15,10 @@ import net.i2p.util.Log;
|
||||
* @since 0.7.9
|
||||
*/
|
||||
class InternalSocketRunner implements Runnable {
|
||||
private I2PTunnelClientBase client;
|
||||
private int port;
|
||||
private final I2PTunnelClientBase client;
|
||||
private final int port;
|
||||
private ServerSocket ss;
|
||||
private boolean open;
|
||||
private static final Log _log = new Log(InternalSocketRunner.class);
|
||||
private volatile boolean open;
|
||||
|
||||
/** starts the runner */
|
||||
InternalSocketRunner(I2PTunnelClientBase client) {
|
||||
@@ -33,13 +32,14 @@ class InternalSocketRunner implements Runnable {
|
||||
try {
|
||||
this.ss = new InternalServerSocket(this.port);
|
||||
this.open = true;
|
||||
while (true) {
|
||||
while (this.open) {
|
||||
Socket s = this.ss.accept();
|
||||
this.client.manageConnection(s);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
if (this.open) {
|
||||
_log.error("Error listening for internal connections on port " + this.port, ex);
|
||||
Log log = new Log(InternalSocketRunner.class);
|
||||
log.error("Error listening for internal connections on port " + this.port, ex);
|
||||
}
|
||||
this.open = false;
|
||||
}
|
||||
@@ -47,10 +47,10 @@ class InternalSocketRunner implements Runnable {
|
||||
|
||||
void stopRunning() {
|
||||
if (this.open) {
|
||||
this.open = false;
|
||||
try {
|
||||
this.ss.close();
|
||||
} catch (IOException ex) {}
|
||||
this.open = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,16 +22,19 @@ import net.i2p.util.Log;
|
||||
import net.i2p.util.SecureFileOutputStream;
|
||||
|
||||
/**
|
||||
* Coordinate the runtime operation and configuration of a tunnel.
|
||||
* Coordinate the runtime operation and configuration of a single I2PTunnel.
|
||||
* An I2PTunnel tracks one or more I2PTunnelTasks and one or more I2PSessions.
|
||||
* Usually one of each.
|
||||
*
|
||||
* These objects are bundled together under a TunnelControllerGroup where the
|
||||
* entire group is stored / loaded from a single config file.
|
||||
*
|
||||
*/
|
||||
public class TunnelController implements Logging {
|
||||
private Log _log;
|
||||
private final Log _log;
|
||||
private Properties _config;
|
||||
private I2PTunnel _tunnel;
|
||||
private List<String> _messages;
|
||||
private final I2PTunnel _tunnel;
|
||||
private final List<String> _messages;
|
||||
private List<I2PSession> _sessions;
|
||||
private boolean _running;
|
||||
private boolean _starting;
|
||||
@@ -153,6 +156,15 @@ public class TunnelController implements Logging {
|
||||
_log.warn("Cannot start the tunnel - no type specified");
|
||||
return;
|
||||
}
|
||||
// Config options may have changed since instantiation, so do this again.
|
||||
// Or should we take it out of the constructor completely?
|
||||
if (type.endsWith("server") || getPersistentClientKey()) {
|
||||
boolean ok = createPrivateKey();
|
||||
if (!ok) {
|
||||
log("Failed to start tunnel " + getName() + " as the private key file could not be created");
|
||||
return;
|
||||
}
|
||||
}
|
||||
setI2CPOptions();
|
||||
setSessionOptions();
|
||||
if ("httpclient".equals(type)) {
|
||||
|
||||
@@ -26,7 +26,7 @@ import net.i2p.util.OrderedProperties;
|
||||
* Warning - this is a singleton. Todo: fix
|
||||
*/
|
||||
public class TunnelControllerGroup {
|
||||
private final Log _log;
|
||||
private Log _log;
|
||||
private static TunnelControllerGroup _instance;
|
||||
static final String DEFAULT_CONFIG_FILE = "i2ptunnel.config";
|
||||
|
||||
@@ -55,6 +55,7 @@ public class TunnelControllerGroup {
|
||||
_configFile = configFile;
|
||||
_sessions = new HashMap(4);
|
||||
loadControllers(_configFile);
|
||||
I2PAppContext.getGlobalContext().addShutdownTask(new Shutdown());
|
||||
}
|
||||
|
||||
public static void main(String args[]) {
|
||||
@@ -71,6 +72,34 @@ public class TunnelControllerGroup {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Warning - destroys the singleton!
|
||||
* @since 0.8.8
|
||||
*/
|
||||
private static class Shutdown implements Runnable {
|
||||
public void run() {
|
||||
shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Warning - destroys the singleton!
|
||||
* Caller must root a new context before calling instance() or main() again.
|
||||
* Agressively kill and null everything to reduce memory usage in the JVM
|
||||
* after stopping, and to recognize what must be reinitialized on restart (Android)
|
||||
*
|
||||
* @since 0.8.8
|
||||
*/
|
||||
public static void shutdown() {
|
||||
synchronized (TunnelControllerGroup.class) {
|
||||
if (_instance == null) return;
|
||||
_instance.unloadControllers();
|
||||
_instance._log = null;
|
||||
_instance = null;
|
||||
}
|
||||
I2PTunnelClientBase.killClientExecutor();
|
||||
}
|
||||
|
||||
/**
|
||||
* Load up all of the tunnels configured in the given file (but do not start
|
||||
|
||||
@@ -0,0 +1,236 @@
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.data.Base32;
|
||||
import net.i2p.i2ptunnel.I2PTunnel;
|
||||
import net.i2p.i2ptunnel.Logging;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* Start, track, and expire the I2PTunnelDCCClients.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* direct conn
|
||||
* <---> I2PTunnelDCCServer <--------------->I2PTunnelDCCClient <---->
|
||||
* originating responding
|
||||
* chat client chat client
|
||||
* CHAT ---> I2PTunnelIRCClient --> IRC server --> I2TunnelIRCClient ----->
|
||||
* SEND ---> I2PTunnelIRCClient --> IRC server --> I2TunnelIRCClient ----->
|
||||
* RESUME <--- I2PTunnelIRCClient <-- IRC server <-- I2TunnelIRCClient <-----
|
||||
* ACCEPT ---> I2PTunnelIRCClient --> IRC server --> I2TunnelIRCClient ----->
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public class DCCClientManager extends EventReceiver {
|
||||
private final I2PSocketManager sockMgr;
|
||||
private final EventDispatcher _dispatch;
|
||||
private final Logging l;
|
||||
private final I2PTunnel _tunnel;
|
||||
private final Log _log;
|
||||
|
||||
/** key is the DCC client's local port */
|
||||
private final ConcurrentHashMap<Integer, I2PTunnelDCCClient> _incoming;
|
||||
/** key is the DCC client's local port */
|
||||
private final ConcurrentHashMap<Integer, I2PTunnelDCCClient> _active;
|
||||
/** key is the DCC client's local port */
|
||||
private final ConcurrentHashMap<Integer, I2PTunnelDCCClient> _complete;
|
||||
|
||||
// list of client tunnels?
|
||||
private static long _id;
|
||||
|
||||
private static final int MAX_INCOMING_PENDING = 10;
|
||||
private static final int MAX_INCOMING_ACTIVE = 10;
|
||||
private static final long ACTIVE_EXPIRE = 60*60*1000;
|
||||
|
||||
public DCCClientManager(I2PSocketManager sktMgr, Logging logging,
|
||||
EventDispatcher dispatch, I2PTunnel tunnel) {
|
||||
sockMgr = sktMgr;
|
||||
l = logging;
|
||||
_dispatch = dispatch;
|
||||
_tunnel = tunnel;
|
||||
_log = tunnel.getContext().logManager().getLog(DCCClientManager.class);
|
||||
_incoming = new ConcurrentHashMap(8);
|
||||
_active = new ConcurrentHashMap(8);
|
||||
_complete = new ConcurrentHashMap(8);
|
||||
}
|
||||
|
||||
public boolean close(boolean forced) {
|
||||
for (I2PTunnelDCCClient c : _incoming.values()) {
|
||||
c.stop();
|
||||
}
|
||||
_incoming.clear();
|
||||
for (I2PTunnelDCCClient c : _active.values()) {
|
||||
c.stop();
|
||||
}
|
||||
_active.clear();
|
||||
_complete.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* An incoming DCC request
|
||||
*
|
||||
* @param b32 remote dcc server b32 address
|
||||
* @param port remote dcc server I2P port
|
||||
* @param type ignored
|
||||
* @return local DCC client tunnel port or -1 on error
|
||||
*/
|
||||
public int newIncoming(String b32, int port, String type) {
|
||||
return newIncoming(b32, port, type, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param localPort bind to port or 0; if nonzero it will be the rv
|
||||
*/
|
||||
private int newIncoming(String b32, int port, String type, int localPort) {
|
||||
b32 = b32.toLowerCase();
|
||||
// do some basic verification before starting the client
|
||||
if (b32.length() != 60 || !b32.endsWith(".b32.i2p"))
|
||||
return -1;
|
||||
byte[] dec = Base32.decode(b32.substring(0, 52));
|
||||
if (dec == null || dec.length != 32)
|
||||
return -1;
|
||||
expireInbound();
|
||||
if (_incoming.size() >= MAX_INCOMING_PENDING ||
|
||||
_active.size() >= MAX_INCOMING_PENDING) {
|
||||
_log.error("Too many incoming DCC, max is " + MAX_INCOMING_PENDING +
|
||||
'/' + MAX_INCOMING_ACTIVE + " pending/active");
|
||||
return -1;
|
||||
}
|
||||
try {
|
||||
// Transparent tunnel used for all types...
|
||||
// Do we need to do any filtering for chat?
|
||||
I2PTunnelDCCClient cTunnel = new I2PTunnelDCCClient(b32, localPort, port, l, sockMgr,
|
||||
_dispatch, _tunnel, ++_id);
|
||||
cTunnel.attachEventDispatcher(this);
|
||||
int lport = cTunnel.getLocalPort();
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Opened client tunnel at port " + lport +
|
||||
" pointing to " + b32 + ':' + port);
|
||||
_incoming.put(Integer.valueOf(lport), cTunnel);
|
||||
return lport;
|
||||
} catch (IllegalArgumentException uhe) {
|
||||
l.log("Could not find listen host to bind to [" + _tunnel.host + "]");
|
||||
_log.error("Error finding host to bind", uhe);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An outgoing RESUME request
|
||||
*
|
||||
* @param port local DCC client tunnel port
|
||||
* @return remote DCC server i2p port or -1 on error
|
||||
*/
|
||||
public int resumeOutgoing(int port) {
|
||||
Integer lport = Integer.valueOf(port);
|
||||
I2PTunnelDCCClient tun = _complete.get(lport);
|
||||
if (tun == null) {
|
||||
tun = _active.get(lport);
|
||||
if (tun == null)
|
||||
// shouldn't happen
|
||||
tun = _incoming.get(lport);
|
||||
}
|
||||
if (tun != null) {
|
||||
tun.stop();
|
||||
return tun.getLocalPort();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* An incoming ACCEPT response
|
||||
*
|
||||
* @param port remote dcc server I2P port
|
||||
* @return local DCC client tunnel port or -1 on error
|
||||
*/
|
||||
public int acceptIncoming(int port) {
|
||||
// do a reverse lookup
|
||||
for (I2PTunnelDCCClient tun : _complete.values()) {
|
||||
if (tun.getRemotePort() == port)
|
||||
return newIncoming(tun.getDest(), port, "ACCEPT", tun.getLocalPort());
|
||||
}
|
||||
for (I2PTunnelDCCClient tun : _active.values()) {
|
||||
if (tun.getRemotePort() == port)
|
||||
return newIncoming(tun.getDest(), port, "ACCEPT", tun.getLocalPort());
|
||||
}
|
||||
for (I2PTunnelDCCClient tun : _incoming.values()) {
|
||||
if (tun.getRemotePort() == port) {
|
||||
// shouldn't happen
|
||||
tun.stop();
|
||||
return newIncoming(tun.getDest(), port, "ACCEPT", tun.getLocalPort());
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* The EventReceiver callback
|
||||
*/
|
||||
public void notifyEvent(String eventName, Object args) {
|
||||
if (eventName.equals(I2PTunnelDCCClient.CONNECT_START_EVENT)) {
|
||||
try {
|
||||
I2PTunnelDCCClient client = (I2PTunnelDCCClient) args;
|
||||
connStarted(client);
|
||||
} catch (ClassCastException cce) {}
|
||||
} else if (eventName.equals(I2PTunnelDCCClient.CONNECT_STOP_EVENT)) {
|
||||
try {
|
||||
Integer port = (Integer) args;
|
||||
connStopped(port);
|
||||
} catch (ClassCastException cce) {}
|
||||
}
|
||||
}
|
||||
|
||||
private void connStarted(I2PTunnelDCCClient client) {
|
||||
Integer lport = Integer.valueOf(client.getLocalPort());
|
||||
I2PTunnelDCCClient c = _incoming.remove(lport);
|
||||
if (c != null) {
|
||||
_active.put(lport, client);
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Added client tunnel for port " + lport +
|
||||
" pending count now: " + _incoming.size() +
|
||||
" active count now: " + _active.size() +
|
||||
" complete count now: " + _complete.size());
|
||||
}
|
||||
}
|
||||
|
||||
private void connStopped(Integer lport) {
|
||||
I2PTunnelDCCClient tun = _incoming.remove(lport);
|
||||
if (tun != null)
|
||||
_complete.put(lport, tun);
|
||||
tun = _active.remove(lport);
|
||||
if (tun != null)
|
||||
_complete.put(lport, tun);
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Removed client tunnel for port " + lport +
|
||||
" pending count now: " + _incoming.size() +
|
||||
" active count now: " + _active.size() +
|
||||
" complete count now: " + _complete.size());
|
||||
}
|
||||
|
||||
private void expireInbound() {
|
||||
for (Iterator<I2PTunnelDCCClient> iter = _incoming.values().iterator(); iter.hasNext(); ) {
|
||||
I2PTunnelDCCClient c = iter.next();
|
||||
if (c.getExpires() < _tunnel.getContext().clock().now()) {
|
||||
iter.remove();
|
||||
c.stop();
|
||||
}
|
||||
}
|
||||
// shouldn't need to expire active
|
||||
for (Iterator<I2PTunnelDCCClient> iter = _complete.values().iterator(); iter.hasNext(); ) {
|
||||
I2PTunnelDCCClient c = iter.next();
|
||||
if (c.getExpires() < _tunnel.getContext().clock().now()) {
|
||||
iter.remove();
|
||||
c.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
74
apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/DCCHelper.java
Normal file
74
apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/DCCHelper.java
Normal file
@@ -0,0 +1,74 @@
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
/**
|
||||
* Hooks to create and maintain DCC client and server tunnels
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public interface DCCHelper {
|
||||
|
||||
public boolean isEnabled();
|
||||
|
||||
/**
|
||||
* String to put in the outgoing DCC
|
||||
*/
|
||||
public String getB32Hostname();
|
||||
|
||||
/**
|
||||
* Our IP address (taken from the socket), must be IPv4
|
||||
*/
|
||||
public byte[] getLocalAddress();
|
||||
|
||||
/**
|
||||
* An outgoing DCC request
|
||||
*
|
||||
* @param ip local irc client IP
|
||||
* @param port local irc client port
|
||||
* @param type string
|
||||
* @return local DCC server i2p port or -1 on error
|
||||
*/
|
||||
public int newOutgoing(byte[] ip, int port, String type);
|
||||
|
||||
/**
|
||||
* An incoming DCC request
|
||||
*
|
||||
* @param b32 remote dcc server b32 address
|
||||
* @param port remote dcc server I2P port
|
||||
* @param type string
|
||||
* @return local DCC client tunnel port or -1 on error
|
||||
*/
|
||||
public int newIncoming(String b32, int port, String type);
|
||||
|
||||
/**
|
||||
* An outgoing RESUME request
|
||||
*
|
||||
* @param port local DCC client tunnel port
|
||||
* @return remote DCC server i2p port or -1 on error
|
||||
*/
|
||||
public int resumeOutgoing(int port);
|
||||
|
||||
/**
|
||||
* An incoming RESUME request
|
||||
*
|
||||
* @param port local dcc server I2P port
|
||||
* @return local IRC client DCC port or -1 on error
|
||||
*/
|
||||
public int resumeIncoming(int port);
|
||||
|
||||
/**
|
||||
* An outgoing ACCEPT response
|
||||
*
|
||||
* @param port local irc client DCC port
|
||||
* @return local DCC server i2p port or -1 on error
|
||||
*/
|
||||
public int acceptOutgoing(int port);
|
||||
|
||||
/**
|
||||
* An incoming ACCEPT response
|
||||
*
|
||||
* @param port remote dcc server I2P port
|
||||
* @return local DCC client tunnel port or -1 on error
|
||||
*/
|
||||
public int acceptIncoming(int port);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
/*
|
||||
* free (adj.): unencumbered; not under the control of others Written
|
||||
* by human & jrandom in 2004 and released into the public domain with
|
||||
* no warranty of any kind, either expressed or implied. It probably
|
||||
* won't make your computer catch on fire, or eat your children, but
|
||||
* it might. Use at your own risk.
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import net.i2p.util.EventDispatcher;
|
||||
|
||||
/**
|
||||
* An implementation of the EventDispatcher interface for
|
||||
* receiving events via in-line notifyEvent() only.
|
||||
* Does not support chaining to additional dispatchers.
|
||||
* Does not support waitEventValue().
|
||||
* Does not support ignoring.
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public abstract class EventReceiver implements EventDispatcher {
|
||||
|
||||
public EventDispatcher getEventDispatcher() {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException always
|
||||
*/
|
||||
public void attachEventDispatcher(EventDispatcher ev) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException always
|
||||
*/
|
||||
public void detachEventDispatcher(EventDispatcher ev) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public abstract void notifyEvent(String eventName, Object args);
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException always
|
||||
*/
|
||||
public Object getEventValue(String name) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException always
|
||||
*/
|
||||
public Set<String> getEvents() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException always
|
||||
*/
|
||||
public void ignoreEvents() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void unIgnoreEvents() {}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException always
|
||||
*/
|
||||
public Object waitEventValue(String name) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
/* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java)
|
||||
* (c) 2003 - 2004 mihi
|
||||
*/
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
import java.net.Socket;
|
||||
import java.io.IOException;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.client.streaming.I2PSocketOptions;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.i2ptunnel.I2PTunnel;
|
||||
import net.i2p.i2ptunnel.I2PTunnelClientBase;
|
||||
import net.i2p.i2ptunnel.I2PTunnelRunner;
|
||||
import net.i2p.i2ptunnel.Logging;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* A standard client, using an existing socket manager.
|
||||
* Targets a single destination and port.
|
||||
* Naming resolution is delayed until connect time.
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public class I2PTunnelDCCClient extends I2PTunnelClientBase {
|
||||
|
||||
// delay resolution until connect time
|
||||
private final String _dest;
|
||||
private final int _remotePort;
|
||||
private long _expires;
|
||||
|
||||
private static final long INBOUND_EXPIRE = 30*60*1000;
|
||||
private static final long INBOUND_STOP_EXPIRE = 30*60*1000;
|
||||
public static final String CONNECT_START_EVENT = "connectionStarted";
|
||||
public static final String CONNECT_STOP_EVENT = "connectionStopped";
|
||||
|
||||
/**
|
||||
* @param dest the target, presumably b32
|
||||
* @param localPort if 0, use any port, get actual port selected with getLocalPort()
|
||||
* @throws IllegalArgumentException if the I2PTunnel does not contain
|
||||
* valid config to contact the router
|
||||
*/
|
||||
public I2PTunnelDCCClient(String dest, int localPort, int remotePort, Logging l,
|
||||
I2PSocketManager sktMgr, EventDispatcher notifyThis,
|
||||
I2PTunnel tunnel, long clientId) throws IllegalArgumentException {
|
||||
super(localPort, l, sktMgr, tunnel, notifyThis, clientId);
|
||||
_dest = dest;
|
||||
_remotePort = remotePort;
|
||||
_expires = tunnel.getContext().clock().now() + INBOUND_EXPIRE;
|
||||
|
||||
setName("DCC send -> " + dest + ':' + remotePort);
|
||||
|
||||
startRunning();
|
||||
}
|
||||
|
||||
/**
|
||||
* Accept one connection only.
|
||||
*/
|
||||
protected void clientConnectionRun(Socket s) {
|
||||
I2PSocket i2ps = null;
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("Opening DCC connection to " + _dest + ':' + _remotePort);
|
||||
Destination dest = _context.namingService().lookup(_dest);
|
||||
if (dest == null) {
|
||||
_log.error("Could not find leaseset for DCC connection to " + _dest + ':' + _remotePort);
|
||||
closeSocket(s);
|
||||
stop();
|
||||
notifyEvent(CONNECT_STOP_EVENT, Integer.valueOf(getLocalPort()));
|
||||
return;
|
||||
}
|
||||
|
||||
I2PSocketOptions opts = sockMgr.buildOptions();
|
||||
opts.setPort(_remotePort);
|
||||
try {
|
||||
i2ps = createI2PSocket(dest, opts);
|
||||
new Runner(s, i2ps);
|
||||
} catch (Exception ex) {
|
||||
_log.error("Could not make DCC connection to " + _dest + ':' + _remotePort, ex);
|
||||
closeSocket(s);
|
||||
if (i2ps != null) {
|
||||
try { i2ps.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
notifyEvent(CONNECT_STOP_EVENT, Integer.valueOf(getLocalPort()));
|
||||
}
|
||||
stop();
|
||||
}
|
||||
|
||||
public long getExpires() {
|
||||
return _expires;
|
||||
}
|
||||
|
||||
public String getDest() {
|
||||
return _dest;
|
||||
}
|
||||
|
||||
public int getRemotePort() {
|
||||
return _remotePort;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop listening for new sockets.
|
||||
* We can't call super.close() as it kills all sockets in the sockMgr
|
||||
*/
|
||||
public void stop() {
|
||||
open = false;
|
||||
try {
|
||||
ss.close();
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Just so we can do the callbacks
|
||||
*/
|
||||
private class Runner extends I2PTunnelRunner {
|
||||
|
||||
public Runner(Socket s, I2PSocket i2ps) {
|
||||
// super calls start()
|
||||
super(s, i2ps, sockLock, null, mySockets);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
_expires = getTunnel().getContext().clock().now() + INBOUND_STOP_EXPIRE;
|
||||
notifyEvent(CONNECT_START_EVENT, I2PTunnelDCCClient.this);
|
||||
super.run();
|
||||
_expires = getTunnel().getContext().clock().now() + INBOUND_STOP_EXPIRE;
|
||||
notifyEvent(CONNECT_STOP_EVENT, Integer.valueOf(getLocalPort()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,272 @@
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.i2ptunnel.I2PTunnel;
|
||||
import net.i2p.i2ptunnel.I2PTunnelRunner;
|
||||
import net.i2p.i2ptunnel.I2PTunnelServer;
|
||||
import net.i2p.i2ptunnel.Logging;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* A standard server that only answers for registered ports,
|
||||
* and each port can only be used once.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* direct conn
|
||||
* <---> I2PTunnelDCCServer <--------------->I2PTunnelDCCClient <---->
|
||||
* originating responding
|
||||
* chat client chat client
|
||||
* CHAT ---> I2PTunnelIRCClient --> IRC server --> I2TunnelIRCClient ----->
|
||||
* SEND ---> I2PTunnelIRCClient --> IRC server --> I2TunnelIRCClient ----->
|
||||
* RESUME <--- I2PTunnelIRCClient <-- IRC server <-- I2TunnelIRCClient <-----
|
||||
* ACCEPT ---> I2PTunnelIRCClient --> IRC server --> I2TunnelIRCClient ----->
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public class I2PTunnelDCCServer extends I2PTunnelServer {
|
||||
|
||||
/** key is the server's local I2P port */
|
||||
private final ConcurrentHashMap<Integer, LocalAddress> _outgoing;
|
||||
/** key is the server's local I2P port */
|
||||
private final ConcurrentHashMap<Integer, LocalAddress> _active;
|
||||
/** key is the server's local I2P port */
|
||||
private final ConcurrentHashMap<Integer, LocalAddress> _resume;
|
||||
private final List<I2PSocket> _sockList;
|
||||
|
||||
// list of client tunnels?
|
||||
private static long _id;
|
||||
|
||||
/** just to keep super() happy */
|
||||
private static final InetAddress DUMMY;
|
||||
static {
|
||||
InetAddress dummy = null;
|
||||
try {
|
||||
dummy = InetAddress.getByAddress(new byte[4]);
|
||||
} catch (UnknownHostException uhe) {}
|
||||
DUMMY = dummy;
|
||||
}
|
||||
|
||||
private static final int MIN_I2P_PORT = 1;
|
||||
private static final int MAX_I2P_PORT = 65535;
|
||||
private static final int MAX_OUTGOING_PENDING = 20;
|
||||
private static final int MAX_OUTGOING_ACTIVE = 20;
|
||||
private static final long OUTBOUND_EXPIRE = 30*60*1000;
|
||||
private static final long ACTIVE_EXPIRE = 60*60*1000;
|
||||
|
||||
/**
|
||||
* There's no support for unsolicited incoming I2P connections,
|
||||
* so there's no server host or port parameters.
|
||||
*
|
||||
* @param sktMgr an existing socket manager
|
||||
* @throws IllegalArgumentException if the I2PTunnel does not contain
|
||||
* valid config to contact the router
|
||||
*/
|
||||
public I2PTunnelDCCServer(I2PSocketManager sktMgr, Logging l,
|
||||
EventDispatcher notifyThis, I2PTunnel tunnel) {
|
||||
super(DUMMY, 0, sktMgr, l, notifyThis, tunnel);
|
||||
_outgoing = new ConcurrentHashMap(8);
|
||||
_active = new ConcurrentHashMap(8);
|
||||
_resume = new ConcurrentHashMap(8);
|
||||
_sockList = new CopyOnWriteArrayList();
|
||||
}
|
||||
|
||||
/**
|
||||
* An incoming DCC connection, only accept for a known port.
|
||||
* Passed through without filtering.
|
||||
*/
|
||||
@Override
|
||||
protected void blockingHandle(I2PSocket socket) {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("Incoming connection to '" + toString() + "' from: " + socket.getPeerDestination().calculateHash().toBase64());
|
||||
|
||||
try {
|
||||
expireOutbound();
|
||||
int myPort = socket.getLocalPort();
|
||||
// Port is a one-time-use only
|
||||
LocalAddress local = _outgoing.remove(Integer.valueOf(myPort));
|
||||
if (local == null) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Rejecting incoming DCC connection for unknown port " + myPort);
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {}
|
||||
return;
|
||||
}
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Incoming DCC connection for I2P port " + myPort +
|
||||
" sending to " + local.ia + ':' + local.port);
|
||||
Socket s = new Socket(local.ia, local.port);
|
||||
_sockList.add(socket);
|
||||
new I2PTunnelRunner(s, socket, slock, null, _sockList);
|
||||
local.socket = socket;
|
||||
local.expire = getTunnel().getContext().clock().now() + OUTBOUND_EXPIRE;
|
||||
_active.put(Integer.valueOf(myPort), local);
|
||||
} catch (SocketException ex) {
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {}
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("Error connecting to server " + remoteHost + ':' + remotePort, ex);
|
||||
} catch (IOException ex) {
|
||||
_log.error("Error while waiting for I2PConnections", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean close(boolean forced) {
|
||||
_outgoing.clear();
|
||||
_active.clear();
|
||||
for (I2PSocket s : _sockList) {
|
||||
try {
|
||||
s.close();
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
_sockList.clear();
|
||||
return super.close(forced);
|
||||
}
|
||||
|
||||
/**
|
||||
* An outgoing DCC request
|
||||
*
|
||||
* @param ip local irc client IP
|
||||
* @param port local irc client port
|
||||
* @param type ignored
|
||||
* @return i2p port or -1 on error
|
||||
*/
|
||||
public int newOutgoing(byte[] ip, int port, String type) {
|
||||
return newOutgoing(ip, port, type, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param port local dcc server I2P port or 0 to pick one at random
|
||||
*/
|
||||
private int newOutgoing(byte[] ip, int port, String type, int i2pPort) {
|
||||
expireOutbound();
|
||||
if (_outgoing.size() >= MAX_OUTGOING_PENDING ||
|
||||
_active.size() >= MAX_OUTGOING_ACTIVE) {
|
||||
_log.error("Too many outgoing DCC, max is " + MAX_OUTGOING_PENDING +
|
||||
'/' + MAX_OUTGOING_ACTIVE + " pending/active");
|
||||
return -1;
|
||||
}
|
||||
InetAddress ia;
|
||||
try {
|
||||
ia = InetAddress.getByAddress(ip);
|
||||
} catch (UnknownHostException uhe) {
|
||||
return -1;
|
||||
}
|
||||
int limit = i2pPort > 0 ? 10 : 1;
|
||||
LocalAddress client = new LocalAddress(ia, port, getTunnel().getContext().clock().now() + OUTBOUND_EXPIRE);
|
||||
for (int i = 0; i < limit; i++) {
|
||||
int iport;
|
||||
if (i2pPort > 0)
|
||||
iport = i2pPort;
|
||||
else
|
||||
iport = MIN_I2P_PORT + getTunnel().getContext().random().nextInt(1 + MAX_I2P_PORT - MIN_I2P_PORT);
|
||||
if (_active.containsKey(Integer.valueOf(iport)))
|
||||
continue;
|
||||
LocalAddress old = _outgoing.putIfAbsent(Integer.valueOf(iport), client);
|
||||
if (old != null)
|
||||
continue;
|
||||
// TODO expire in a few minutes
|
||||
return iport;
|
||||
}
|
||||
// couldn't find an unused i2p port
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* An incoming RESUME request
|
||||
*
|
||||
* @param port local dcc server I2P port
|
||||
* @return local IRC client DCC port or -1 on error
|
||||
*/
|
||||
public int resumeIncoming(int port) {
|
||||
Integer iport = Integer.valueOf(port);
|
||||
LocalAddress local = _active.remove(iport);
|
||||
if (local != null) {
|
||||
local.expire = getTunnel().getContext().clock().now() + OUTBOUND_EXPIRE;
|
||||
_resume.put(Integer.valueOf(local.port), local);
|
||||
return local.port;
|
||||
}
|
||||
local = _outgoing.get(iport);
|
||||
if (local != null) {
|
||||
// shouldn't happen
|
||||
local.expire = getTunnel().getContext().clock().now() + OUTBOUND_EXPIRE;
|
||||
return local.port;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* An outgoing ACCEPT response
|
||||
*
|
||||
* @param port local irc client DCC port
|
||||
* @return local DCC server i2p port or -1 on error
|
||||
*/
|
||||
public int acceptOutgoing(int port) {
|
||||
// do a reverse lookup
|
||||
for (Iterator<Map.Entry<Integer, LocalAddress>> iter = _resume.entrySet().iterator(); iter.hasNext(); ) {
|
||||
Map.Entry<Integer, LocalAddress> e = iter.next();
|
||||
LocalAddress local = e.getValue();
|
||||
if (local.port == port) {
|
||||
iter.remove();
|
||||
return newOutgoing(local.ia.getAddress(), port, "ACCEPT", e.getKey().intValue());
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
private InetAddress getListenHost(Logging l) {
|
||||
try {
|
||||
return InetAddress.getByName(getTunnel().listenHost);
|
||||
} catch (UnknownHostException uhe) {
|
||||
l.log("Could not find listen host to bind to [" + getTunnel().host + "]");
|
||||
_log.error("Error finding host to bind", uhe);
|
||||
notifyEvent("openBaseClientResult", "error");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void expireOutbound() {
|
||||
for (Iterator<LocalAddress> iter = _outgoing.values().iterator(); iter.hasNext(); ) {
|
||||
LocalAddress a = iter.next();
|
||||
if (a.expire < getTunnel().getContext().clock().now())
|
||||
iter.remove();
|
||||
}
|
||||
for (Iterator<LocalAddress> iter = _active.values().iterator(); iter.hasNext(); ) {
|
||||
LocalAddress a = iter.next();
|
||||
I2PSocket s = a.socket;
|
||||
if (s != null && s.isClosed())
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
|
||||
private static class LocalAddress {
|
||||
public final InetAddress ia;
|
||||
public final int port;
|
||||
public long expire;
|
||||
public I2PSocket socket;
|
||||
|
||||
public LocalAddress(InetAddress a, int p, long exp) {
|
||||
ia = a;
|
||||
port = p;
|
||||
expire = exp;
|
||||
}
|
||||
}
|
||||
}
|
||||
507
apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IRCFilter.java
Normal file
507
apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IRCFilter.java
Normal file
@@ -0,0 +1,507 @@
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
|
||||
/**
|
||||
* Static methods to filter individual lines.
|
||||
* Moved from I2PTunnelIRCClient.java
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
abstract class IRCFilter {
|
||||
|
||||
private static final boolean ALLOW_ALL_DCC_IN = false;
|
||||
private static final boolean ALLOW_ALL_DCC_OUT = false;
|
||||
/** does not override DCC handling */
|
||||
private static final boolean ALLOW_ALL_CTCP_IN = false;
|
||||
/** does not override DCC handling */
|
||||
private static final boolean ALLOW_ALL_CTCP_OUT = false;
|
||||
|
||||
/*************************************************************************
|
||||
*
|
||||
* Modify or filter a single inbound line.
|
||||
*
|
||||
* @param helper may be null
|
||||
* @return the original or modified line, or null if it should be dropped.
|
||||
*/
|
||||
public static String inboundFilter(String s, StringBuffer expectedPong, DCCHelper helper) {
|
||||
|
||||
String field[]=s.split(" ",4);
|
||||
String command;
|
||||
int idx=0;
|
||||
final String[] allowedCommands =
|
||||
{
|
||||
// "NOTICE", // can contain CTCP
|
||||
//"PING",
|
||||
//"PONG",
|
||||
"MODE",
|
||||
"JOIN",
|
||||
"NICK",
|
||||
"QUIT",
|
||||
"PART",
|
||||
"WALLOPS",
|
||||
"ERROR",
|
||||
"KICK",
|
||||
"H", // "hide operator status" (after kicking an op)
|
||||
"TOPIC",
|
||||
// http://tools.ietf.org/html/draft-mitchell-irc-capabilities-01
|
||||
"CAP"
|
||||
};
|
||||
|
||||
if(field[0].charAt(0)==':')
|
||||
idx++;
|
||||
|
||||
try { command = field[idx++]; }
|
||||
catch (IndexOutOfBoundsException ioobe) // wtf, server sent borked command?
|
||||
{
|
||||
//_log.warn("Dropping defective message: index out of bounds while extracting command.");
|
||||
return null;
|
||||
}
|
||||
|
||||
idx++; //skip victim
|
||||
|
||||
// Allow numerical responses
|
||||
try {
|
||||
new Integer(command);
|
||||
return s;
|
||||
} catch(NumberFormatException nfe){}
|
||||
|
||||
|
||||
if ("PING".equalsIgnoreCase(command))
|
||||
return "PING 127.0.0.1"; // no way to know what the ircd to i2ptunnel server con is, so localhost works
|
||||
if ("PONG".equalsIgnoreCase(command)) {
|
||||
// Turn the received ":irc.freshcoffee.i2p PONG irc.freshcoffee.i2p :127.0.0.1"
|
||||
// into ":127.0.0.1 PONG 127.0.0.1 " so that the caller can append the client's extra parameter
|
||||
// though, does 127.0.0.1 work for irc clients connecting remotely? and for all of them? sure would
|
||||
// be great if irc clients actually followed the RFCs here, but i guess thats too much to ask.
|
||||
// If we haven't PINGed them, or the PING we sent isn't something we know how to filter, this
|
||||
// is blank.
|
||||
//
|
||||
// String pong = expectedPong.length() > 0 ? expectedPong.toString() : null;
|
||||
// If we aren't going to rewrite it, pass it through
|
||||
String pong = expectedPong.length() > 0 ? expectedPong.toString() : s;
|
||||
expectedPong.setLength(0);
|
||||
return pong;
|
||||
}
|
||||
|
||||
// Allow all allowedCommands
|
||||
for(int i=0;i<allowedCommands.length;i++) {
|
||||
if(allowedCommands[i].equalsIgnoreCase(command))
|
||||
return s;
|
||||
}
|
||||
|
||||
// Allow PRIVMSG, but block CTCP.
|
||||
if("PRIVMSG".equalsIgnoreCase(command) || "NOTICE".equalsIgnoreCase(command))
|
||||
{
|
||||
String msg;
|
||||
msg = field[idx++];
|
||||
|
||||
if(msg.indexOf(0x01) >= 0) // CTCP marker ^A can be anywhere, not just immediately after the ':'
|
||||
{
|
||||
// CTCP
|
||||
|
||||
// don't even try to parse multiple CTCP in the same message
|
||||
int count = 0;
|
||||
for (int i = 0; i < msg.length(); i++) {
|
||||
if (msg.charAt(i) == 0x01)
|
||||
count++;
|
||||
}
|
||||
if (count != 2)
|
||||
return null;
|
||||
|
||||
msg=msg.substring(2);
|
||||
if(msg.startsWith("ACTION ")) {
|
||||
// /me says hello
|
||||
return s;
|
||||
}
|
||||
if (msg.startsWith("DCC ")) {
|
||||
StringBuilder buf = new StringBuilder(128);
|
||||
for (int i = 0; i <= idx - 2; i++) {
|
||||
buf.append(field[i]).append(' ');
|
||||
}
|
||||
buf.append(":\001DCC ");
|
||||
return filterDCCIn(buf.toString(), msg.substring(4), helper);
|
||||
}
|
||||
// XDCC looks safe, ip/port happens over regular DCC
|
||||
// http://en.wikipedia.org/wiki/XDCC
|
||||
if (msg.toUpperCase().startsWith("XDCC ") && helper != null && helper.isEnabled())
|
||||
return s;
|
||||
if (ALLOW_ALL_CTCP_IN)
|
||||
return s;
|
||||
return null; // Block all other ctcp
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
// Block the rest
|
||||
return null;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
*
|
||||
* Modify or filter a single outbound line.
|
||||
*
|
||||
* @param helper may be null
|
||||
* @return the original or modified line, or null if it should be dropped.
|
||||
*/
|
||||
public static String outboundFilter(String s, StringBuffer expectedPong, DCCHelper helper) {
|
||||
|
||||
String field[]=s.split(" ",3);
|
||||
String command;
|
||||
final String[] allowedCommands =
|
||||
{
|
||||
// "NOTICE", // can contain CTCP
|
||||
"MODE",
|
||||
"JOIN",
|
||||
"NICK",
|
||||
"WHO",
|
||||
"WHOIS",
|
||||
"LIST",
|
||||
"NAMES",
|
||||
"NICK",
|
||||
// "QUIT", // replace with a filtered QUIT to hide client quit messages
|
||||
"SILENCE",
|
||||
"MAP", // seems safe enough, the ircd should protect themselves though
|
||||
// "PART", // replace with filtered PART to hide client part messages
|
||||
"OPER",
|
||||
// "PONG", // replaced with a filtered PING/PONG since some clients send the server IP (thanks aardvax!)
|
||||
// "PING",
|
||||
"KICK",
|
||||
"HELPME",
|
||||
"RULES",
|
||||
"TOPIC",
|
||||
"ISON", // jIRCii uses this for a ping (response is 303)
|
||||
"INVITE",
|
||||
"AWAY", // should be harmless
|
||||
// http://tools.ietf.org/html/draft-mitchell-irc-capabilities-01
|
||||
"CAP"
|
||||
};
|
||||
|
||||
if(field[0].length()==0)
|
||||
return null; // W T F?
|
||||
|
||||
|
||||
if(field[0].charAt(0)==':')
|
||||
return null; // wtf
|
||||
|
||||
command = field[0].toUpperCase();
|
||||
|
||||
if ("PING".equals(command)) {
|
||||
// Most clients just send a PING and are happy with any old PONG. Others,
|
||||
// like BitchX, actually expect certain behavior. It sends two different pings:
|
||||
// "PING :irc.freshcoffee.i2p" and "PING 1234567890 127.0.0.1" (where the IP is the proxy)
|
||||
// the PONG to the former seems to be "PONG 127.0.0.1", while the PONG to the later is
|
||||
// ":irc.freshcoffee.i2p PONG irc.freshcoffe.i2p :1234567890".
|
||||
// We don't want to send them our proxy's IP address, so we need to rewrite the PING
|
||||
// sent to the server, but when we get a PONG back, use what we expected, rather than
|
||||
// what they sent.
|
||||
//
|
||||
// Yuck.
|
||||
|
||||
String rv = null;
|
||||
expectedPong.setLength(0);
|
||||
if (field.length == 1) { // PING
|
||||
rv = "PING";
|
||||
// If we aren't rewriting the PING don't rewrite the PONG
|
||||
// expectedPong.append("PONG 127.0.0.1");
|
||||
} else if (field.length == 2) { // PING nonce
|
||||
rv = "PING " + field[1];
|
||||
// If we aren't rewriting the PING don't rewrite the PONG
|
||||
// expectedPong.append("PONG ").append(field[1]);
|
||||
} else if (field.length == 3) { // PING nonce serverLocation
|
||||
rv = "PING " + field[1];
|
||||
expectedPong.append("PONG ").append(field[2]).append(" :").append(field[1]); // PONG serverLocation nonce
|
||||
} else {
|
||||
//if (_log.shouldLog(Log.ERROR))
|
||||
// _log.error("IRC client sent a PING we don't understand, filtering it (\"" + s + "\")");
|
||||
rv = null;
|
||||
}
|
||||
|
||||
//if (_log.shouldLog(Log.WARN))
|
||||
// _log.warn("sending ping [" + rv + "], waiting for [" + expectedPong + "] orig was [" + s + "]");
|
||||
|
||||
return rv;
|
||||
}
|
||||
if ("PONG".equals(command))
|
||||
return "PONG 127.0.0.1"; // no way to know what the ircd to i2ptunnel server con is, so localhost works
|
||||
|
||||
// Allow all allowedCommands
|
||||
for(int i=0;i<allowedCommands.length;i++)
|
||||
{
|
||||
if(allowedCommands[i].equals(command))
|
||||
return s;
|
||||
}
|
||||
|
||||
// mIRC sends "NOTICE user :DCC Send file (IP)"
|
||||
// in addition to the CTCP version
|
||||
if("NOTICE".equals(command))
|
||||
{
|
||||
String msg = field[2];
|
||||
if(msg.startsWith(":DCC "))
|
||||
return filterDCCOut(field[0] + ' ' + field[1] + " :DCC ", msg.substring(5), helper);
|
||||
// fall through
|
||||
}
|
||||
|
||||
// Allow PRIVMSG, but block CTCP (except ACTION).
|
||||
if("PRIVMSG".equals(command) || "NOTICE".equals(command))
|
||||
{
|
||||
String msg;
|
||||
msg = field[2];
|
||||
|
||||
if(msg.indexOf(0x01) >= 0) // CTCP marker ^A can be anywhere, not just immediately after the ':'
|
||||
{
|
||||
// CTCP
|
||||
|
||||
// don't even try to parse multiple CTCP in the same message
|
||||
int count = 0;
|
||||
for (int i = 0; i < msg.length(); i++) {
|
||||
if (msg.charAt(i) == 0x01)
|
||||
count++;
|
||||
}
|
||||
if (count != 2)
|
||||
return null;
|
||||
|
||||
msg=msg.substring(2);
|
||||
if(msg.startsWith("ACTION ")) {
|
||||
// /me says hello
|
||||
return s;
|
||||
}
|
||||
if (msg.startsWith("DCC "))
|
||||
return filterDCCOut(field[0] + ' ' + field[1] + " :\001DCC ", msg.substring(4), helper);
|
||||
// XDCC looks safe, ip/port happens over regular DCC
|
||||
// http://en.wikipedia.org/wiki/XDCC
|
||||
if (msg.toUpperCase().startsWith("XDCC ") && helper != null && helper.isEnabled())
|
||||
return s;
|
||||
if (ALLOW_ALL_CTCP_OUT)
|
||||
return s;
|
||||
return null; // Block all other ctcp
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
if("USER".equals(command)) {
|
||||
int idx = field[2].lastIndexOf(":");
|
||||
if(idx<0)
|
||||
return "USER user hostname localhost :realname";
|
||||
String realname = field[2].substring(idx+1);
|
||||
String ret = "USER "+field[1]+" hostname localhost :"+realname;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ("PART".equals(command)) {
|
||||
// hide client message
|
||||
return "PART " + field[1] + " :leaving";
|
||||
}
|
||||
|
||||
if ("QUIT".equals(command)) {
|
||||
return "QUIT :leaving";
|
||||
}
|
||||
|
||||
// Block the rest
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
*<pre>
|
||||
* DCC CHAT chat xxx.b32.i2p i2p-port -> DCC CHAT chat IP port
|
||||
* DCC SEND file xxx.b32.i2p i2p-port length -> DCC SEND file IP port length
|
||||
* DCC RESUME file i2p-port offset -> DCC RESUME file port offset
|
||||
* DCC ACCEPT file i2p-port offset -> DCC ACCEPT file port offset
|
||||
* DCC xxx -> null
|
||||
*</pre>
|
||||
*
|
||||
* @param pfx the message through the "DCC " part
|
||||
* @param msg the message after the "DCC " part
|
||||
* @param helper may be null
|
||||
* @return the sanitized message or null to block
|
||||
* @since 0.8.9
|
||||
*/
|
||||
private static String filterDCCIn(String pfx, String msg, DCCHelper helper) {
|
||||
// strip trailing ctcp (other one is in pfx)
|
||||
int ctcp = msg.indexOf(0x01);
|
||||
if (ctcp > 0)
|
||||
msg = msg.substring(0, ctcp);
|
||||
String[] args = msg.split(" ", 5);
|
||||
if (args.length <= 0)
|
||||
return null;
|
||||
String type = args[0];
|
||||
boolean haveIP = true;
|
||||
// no IP in these, replace port only
|
||||
if (type == "RESUME" || type == "ACCEPT") {
|
||||
haveIP = false;
|
||||
} else if (!(type.equals("CHAT") || type.equals("SEND"))) {
|
||||
if (ALLOW_ALL_DCC_IN) {
|
||||
if (ctcp > 0)
|
||||
return pfx + msg + (char) 0x01;
|
||||
return pfx + msg;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if (helper == null || !helper.isEnabled())
|
||||
return null;
|
||||
if (args.length < 3)
|
||||
return null;
|
||||
if (haveIP && args.length < 4)
|
||||
return null;
|
||||
String arg = args[1];
|
||||
int nextArg = 2;
|
||||
String b32 = null;
|
||||
if (haveIP)
|
||||
b32 = args[nextArg++];
|
||||
int cPort;
|
||||
try {
|
||||
String cp = args[nextArg++];
|
||||
cPort = Integer.parseInt(cp);
|
||||
} catch (NumberFormatException nfe) {
|
||||
return null;
|
||||
}
|
||||
if (cPort < 0 || cPort > 65535)
|
||||
return null;
|
||||
|
||||
int port = -1;
|
||||
if (haveIP) {
|
||||
if (cPort > 0)
|
||||
port = helper.newIncoming(b32, cPort, type);
|
||||
else
|
||||
// "reverse/firewall DCC" - send it through without tracking
|
||||
port = cPort;
|
||||
} else if (type.equals("ACCEPT")) {
|
||||
port = helper.acceptIncoming(cPort);
|
||||
} else if (type.equals("RESUME")) {
|
||||
port = helper.resumeIncoming(cPort);
|
||||
}
|
||||
if (port < 0)
|
||||
return null;
|
||||
StringBuilder buf = new StringBuilder(256);
|
||||
buf.append(pfx)
|
||||
.append(type).append(' ').append(arg).append(' ');
|
||||
if (haveIP) {
|
||||
if (port > 0) {
|
||||
byte[] myIP = helper.getLocalAddress();
|
||||
buf.append(DataHelper.fromLong(myIP, 0, myIP.length)).append(' ');
|
||||
} else {
|
||||
// "reverse/firewall DCC" - set dummy IP and send it through
|
||||
buf.append("0 ");
|
||||
}
|
||||
}
|
||||
buf.append(port);
|
||||
while (args.length > nextArg) {
|
||||
buf.append(' ').append(args[nextArg++]);
|
||||
}
|
||||
if (pfx.indexOf(0x01) >= 0)
|
||||
buf.append((char) 0x01);
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
*<pre>
|
||||
* DCC CHAT chat IP port -> DCC CHAT chat xxx.b32.i2p i2p-port
|
||||
* DCC SEND file IP port length -> DCC SEND file xxx.b32.i2p i2p-port length
|
||||
* DCC RESUME file port offset -> DCC RESUME file i2p-port offset
|
||||
* DCC ACCEPT file port offset -> DCC ACCEPT file i2p-port offset
|
||||
* DCC xxx -> null
|
||||
*</pre>
|
||||
*
|
||||
* @param pfx the message through the "DCC " part
|
||||
* @param msg the message after the "DCC " part
|
||||
* @param helper may be null
|
||||
* @return the sanitized message or null to block
|
||||
* @since 0.8.9
|
||||
*/
|
||||
private static String filterDCCOut(String pfx, String msg, DCCHelper helper) {
|
||||
// strip trailing ctcp (other one is in pfx)
|
||||
int ctcp = msg.indexOf(0x01);
|
||||
if (ctcp > 0)
|
||||
msg = msg.substring(0, ctcp);
|
||||
String[] args = msg.split(" ", 5);
|
||||
if (args.length <= 0)
|
||||
return null;
|
||||
String type = args[0];
|
||||
boolean haveIP = true;
|
||||
// no IP in these, replace port only
|
||||
if (type == "RESUME" || type == "ACCEPT") {
|
||||
haveIP = false;
|
||||
} else if (!(type.equals("CHAT") || type.equals("SEND"))) {
|
||||
if (ALLOW_ALL_DCC_OUT) {
|
||||
if (ctcp > 0)
|
||||
return pfx + msg + (char) 0x01;
|
||||
return pfx + msg;
|
||||
}
|
||||
}
|
||||
if (helper == null || !helper.isEnabled())
|
||||
return null;
|
||||
if (args.length < 3)
|
||||
return null;
|
||||
if (haveIP && args.length < 4)
|
||||
return null;
|
||||
String arg = args[1];
|
||||
byte[] ip = null;
|
||||
int nextArg = 2;
|
||||
if (haveIP) {
|
||||
try {
|
||||
String ips = args[nextArg++];
|
||||
long ipl = Long.parseLong(ips);
|
||||
if (ipl < 0x01000000) {
|
||||
// "reverse/firewall DCC"
|
||||
// http://en.wikipedia.org/wiki/Direct_Client-to-Client
|
||||
// xchat sends an IP of 199 and a port of 0
|
||||
Log log = new Log(IRCFilter.class);
|
||||
log.logAlways(Log.WARN, "Reverse / Firewall DCC, IP = 0x" + Long.toHexString(ipl));
|
||||
//return null;
|
||||
}
|
||||
ip = DataHelper.toLong(4, ipl);
|
||||
} catch (NumberFormatException nfe) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
int cPort;
|
||||
try {
|
||||
String cp = args[nextArg++];
|
||||
cPort = Integer.parseInt(cp);
|
||||
} catch (NumberFormatException nfe) {
|
||||
return null;
|
||||
}
|
||||
if (cPort < 0 || cPort > 65535)
|
||||
return null;
|
||||
|
||||
int port = -1;
|
||||
if (haveIP) {
|
||||
if (cPort > 0) {
|
||||
// nonzero port but bogus IP? hmm. Fix IP and hope.
|
||||
if (ip[0] == 0)
|
||||
ip = new byte[] {127, 0, 0, 1};
|
||||
port = helper.newOutgoing(ip, cPort, type);
|
||||
} else {
|
||||
// "reverse/firewall DCC" - send it through without tracking
|
||||
Log log = new Log(IRCFilter.class);
|
||||
log.logAlways(Log.WARN, "Reverse / Firewall DCC, port = 0");
|
||||
port = cPort;
|
||||
}
|
||||
} else if (type.equals("ACCEPT")) {
|
||||
port = helper.acceptOutgoing(cPort);
|
||||
} else if (type.equals("RESUME")) {
|
||||
port = helper.resumeOutgoing(cPort);
|
||||
}
|
||||
if (port < 0)
|
||||
return null;
|
||||
StringBuilder buf = new StringBuilder(256);
|
||||
buf.append(pfx)
|
||||
.append(type).append(' ').append(arg).append(' ');
|
||||
if (haveIP) {
|
||||
if (port > 0)
|
||||
buf.append(helper.getB32Hostname()).append(' ');
|
||||
else
|
||||
// "reverse/firewall DCC" - set dummy IP and send it through
|
||||
buf.append("0 ");
|
||||
}
|
||||
buf.append(port);
|
||||
while (args.length > nextArg) {
|
||||
buf.append(' ').append(args[nextArg++]);
|
||||
}
|
||||
if (pfx.indexOf(0x01) >= 0)
|
||||
buf.append((char) 0x01);
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* Thread to do inbound filtering.
|
||||
* Moved from I2PTunnelIRCClient.java
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public class IrcInboundFilter implements Runnable {
|
||||
|
||||
private final Socket local;
|
||||
private final I2PSocket remote;
|
||||
private final StringBuffer expectedPong;
|
||||
private final Log _log;
|
||||
private final DCCHelper _dccHelper;
|
||||
|
||||
public IrcInboundFilter(Socket lcl, I2PSocket rem, StringBuffer pong, Log log) {
|
||||
this(lcl, rem, pong, log, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param helper may be null
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public IrcInboundFilter(Socket lcl, I2PSocket rem, StringBuffer pong, Log log, DCCHelper helper) {
|
||||
local = lcl;
|
||||
remote = rem;
|
||||
expectedPong = pong;
|
||||
_log = log;
|
||||
_dccHelper = helper;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// Todo: Don't use BufferedReader - IRC spec limits line length to 512 but...
|
||||
BufferedReader in;
|
||||
OutputStream output;
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(remote.getInputStream(), "ISO-8859-1"));
|
||||
output=local.getOutputStream();
|
||||
} catch (IOException e) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("IrcInboundFilter: no streams",e);
|
||||
return;
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcInboundFilter: Running.");
|
||||
try {
|
||||
while(true)
|
||||
{
|
||||
try {
|
||||
String inmsg = in.readLine();
|
||||
if(inmsg==null)
|
||||
break;
|
||||
if(inmsg.endsWith("\r"))
|
||||
inmsg=inmsg.substring(0,inmsg.length()-1);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("in: [" + inmsg + "]");
|
||||
String outmsg = IRCFilter.inboundFilter(inmsg, expectedPong, _dccHelper);
|
||||
if(outmsg!=null)
|
||||
{
|
||||
if(!inmsg.equals(outmsg)) {
|
||||
if (_log.shouldLog(Log.WARN)) {
|
||||
_log.warn("inbound FILTERED: "+outmsg);
|
||||
_log.warn(" - inbound was: "+inmsg);
|
||||
}
|
||||
} else {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("inbound: "+outmsg);
|
||||
}
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
// probably doesn't do much but can't hurt
|
||||
output.flush();
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("inbound BLOCKED: "+inmsg);
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("IrcInboundFilter: disconnected",e1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException re) {
|
||||
_log.error("Error filtering inbound data", re);
|
||||
} finally {
|
||||
try { local.close(); } catch (IOException e) {}
|
||||
}
|
||||
if(_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcInboundFilter: Done.");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
package net.i2p.i2ptunnel.irc;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* Thread to do outbound filtering.
|
||||
* Moved from I2PTunnelIRCClient.java
|
||||
*
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public class IrcOutboundFilter implements Runnable {
|
||||
|
||||
private final Socket local;
|
||||
private final I2PSocket remote;
|
||||
private final StringBuffer expectedPong;
|
||||
private final Log _log;
|
||||
private final DCCHelper _dccHelper;
|
||||
|
||||
public IrcOutboundFilter(Socket lcl, I2PSocket rem, StringBuffer pong, Log log) {
|
||||
this(lcl, rem, pong, log, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param helper may be null
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public IrcOutboundFilter(Socket lcl, I2PSocket rem, StringBuffer pong, Log log, DCCHelper helper) {
|
||||
local = lcl;
|
||||
remote = rem;
|
||||
expectedPong = pong;
|
||||
_log = log;
|
||||
_dccHelper = helper;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// Todo: Don't use BufferedReader - IRC spec limits line length to 512 but...
|
||||
BufferedReader in;
|
||||
OutputStream output;
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(local.getInputStream(), "ISO-8859-1"));
|
||||
output=remote.getOutputStream();
|
||||
} catch (IOException e) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("IrcOutboundFilter: no streams",e);
|
||||
return;
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcOutboundFilter: Running.");
|
||||
try {
|
||||
while(true)
|
||||
{
|
||||
try {
|
||||
String inmsg = in.readLine();
|
||||
if(inmsg==null)
|
||||
break;
|
||||
if(inmsg.endsWith("\r"))
|
||||
inmsg=inmsg.substring(0,inmsg.length()-1);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("out: [" + inmsg + "]");
|
||||
String outmsg = IRCFilter.outboundFilter(inmsg, expectedPong, _dccHelper);
|
||||
if(outmsg!=null)
|
||||
{
|
||||
if(!inmsg.equals(outmsg)) {
|
||||
if (_log.shouldLog(Log.WARN)) {
|
||||
_log.warn("outbound FILTERED: "+outmsg);
|
||||
_log.warn(" - outbound was: "+inmsg);
|
||||
}
|
||||
} else {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("outbound: "+outmsg);
|
||||
}
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
// save 250 ms in streaming
|
||||
output.flush();
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("outbound BLOCKED: "+"\""+inmsg+"\"");
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("IrcOutboundFilter: disconnected",e1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (RuntimeException re) {
|
||||
_log.error("Error filtering outbound data", re);
|
||||
} finally {
|
||||
try { remote.close(); } catch (IOException e) {}
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("IrcOutboundFilter: Done.");
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,8 @@ import java.net.Socket;
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.i2ptunnel.I2PTunnel;
|
||||
import net.i2p.i2ptunnel.I2PTunnelIRCClient;
|
||||
import net.i2p.i2ptunnel.irc.IrcInboundFilter;
|
||||
import net.i2p.i2ptunnel.irc.IrcOutboundFilter;
|
||||
import net.i2p.i2ptunnel.Logging;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
@@ -50,10 +51,10 @@ public class I2PSOCKSIRCTunnel extends I2PSOCKSTunnel {
|
||||
Socket clientSock = serv.getClientSocket();
|
||||
I2PSocket destSock = serv.getDestinationI2PSocket(this);
|
||||
StringBuffer expectedPong = new StringBuffer();
|
||||
Thread in = new I2PAppThread(new I2PTunnelIRCClient.IrcInboundFilter(clientSock, destSock, expectedPong, _log),
|
||||
Thread in = new I2PAppThread(new IrcInboundFilter(clientSock, destSock, expectedPong, _log),
|
||||
"SOCKS IRC Client " + (++__clientId) + " in", true);
|
||||
in.start();
|
||||
Thread out = new I2PAppThread(new I2PTunnelIRCClient.IrcOutboundFilter(clientSock, destSock, expectedPong, _log),
|
||||
Thread out = new I2PAppThread(new IrcOutboundFilter(clientSock, destSock, expectedPong, _log),
|
||||
"SOCKS IRC Client " + __clientId + " out", true);
|
||||
out.start();
|
||||
} catch (SOCKSException e) {
|
||||
|
||||
@@ -21,6 +21,7 @@ import net.i2p.data.Signature;
|
||||
import net.i2p.data.SigningPrivateKey;
|
||||
import net.i2p.i2ptunnel.I2PTunnelHTTPClient;
|
||||
import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase;
|
||||
import net.i2p.i2ptunnel.I2PTunnelIRCClient;
|
||||
import net.i2p.i2ptunnel.TunnelController;
|
||||
import net.i2p.i2ptunnel.TunnelControllerGroup;
|
||||
import net.i2p.util.Addresses;
|
||||
@@ -170,6 +171,11 @@ public class EditBean extends IndexBean {
|
||||
return getBooleanProperty(tunnel, "i2cp.encryptLeaseSet");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public boolean getDCC(int tunnel) {
|
||||
return getBooleanProperty(tunnel, I2PTunnelIRCClient.PROP_DCC);
|
||||
}
|
||||
|
||||
public String getEncryptKey(int tunnel) {
|
||||
return getProperty(tunnel, "i2cp.leaseSetKey", "");
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ package net.i2p.i2ptunnel.web;
|
||||
*
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -27,9 +28,11 @@ import net.i2p.data.PrivateKeyFile;
|
||||
import net.i2p.data.SessionKey;
|
||||
import net.i2p.i2ptunnel.I2PTunnelHTTPClient;
|
||||
import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase;
|
||||
import net.i2p.i2ptunnel.I2PTunnelIRCClient;
|
||||
import net.i2p.i2ptunnel.TunnelController;
|
||||
import net.i2p.i2ptunnel.TunnelControllerGroup;
|
||||
import net.i2p.util.ConcurrentHashSet;
|
||||
import net.i2p.util.FileUtil;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
@@ -40,9 +43,9 @@ import net.i2p.util.Log;
|
||||
* Usage by classes outside of i2ptunnel.war is deprecated.
|
||||
*/
|
||||
public class IndexBean {
|
||||
protected I2PAppContext _context;
|
||||
protected Log _log;
|
||||
protected TunnelControllerGroup _group;
|
||||
protected final I2PAppContext _context;
|
||||
protected final Log _log;
|
||||
protected final TunnelControllerGroup _group;
|
||||
private String _action;
|
||||
private int _tunnel;
|
||||
//private long _prevNonce;
|
||||
@@ -74,8 +77,8 @@ public class IndexBean {
|
||||
private boolean _sharedClient;
|
||||
private boolean _privKeyGenerate;
|
||||
private boolean _removeConfirmed;
|
||||
private Set<String> _booleanOptions;
|
||||
private Map<String, String> _otherOptions;
|
||||
private final Set<String> _booleanOptions;
|
||||
private final Map<String, String> _otherOptions;
|
||||
private int _hashCashValue;
|
||||
private int _certType;
|
||||
private String _certSigner;
|
||||
@@ -198,17 +201,17 @@ public class IndexBean {
|
||||
}
|
||||
private String stopAll() {
|
||||
if (_group == null) return "";
|
||||
List msgs = _group.stopAllControllers();
|
||||
List<String> msgs = _group.stopAllControllers();
|
||||
return getMessages(msgs);
|
||||
}
|
||||
private String startAll() {
|
||||
if (_group == null) return "";
|
||||
List msgs = _group.startAllControllers();
|
||||
List<String> msgs = _group.startAllControllers();
|
||||
return getMessages(msgs);
|
||||
}
|
||||
private String restartAll() {
|
||||
if (_group == null) return "";
|
||||
List msgs = _group.restartAllControllers();
|
||||
List<String> msgs = _group.restartAllControllers();
|
||||
return getMessages(msgs);
|
||||
}
|
||||
private String reloadConfig() {
|
||||
@@ -316,6 +319,10 @@ public class IndexBean {
|
||||
return rv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop the tunnel, delete from config,
|
||||
* rename the private key file if in the default directory
|
||||
*/
|
||||
private String deleteTunnel() {
|
||||
if (!_removeConfirmed)
|
||||
return "Please confirm removal";
|
||||
@@ -324,8 +331,38 @@ public class IndexBean {
|
||||
if (cur == null)
|
||||
return "Invalid tunnel number";
|
||||
|
||||
List msgs = _group.removeController(cur);
|
||||
List<String> msgs = _group.removeController(cur);
|
||||
msgs.addAll(doSave());
|
||||
|
||||
// Rename private key file if it was a default name in
|
||||
// the default directory, so it doesn't get reused when a new
|
||||
// tunnel is created.
|
||||
// Use configured file name if available, not the one from the form.
|
||||
String pk = cur.getPrivKeyFile();
|
||||
if (pk == null)
|
||||
pk = _privKeyFile;
|
||||
if (pk != null && pk.startsWith("i2ptunnel") && pk.endsWith("-privKeys.dat")) {
|
||||
File pkf = new File(_context.getConfigDir(), pk);
|
||||
if (pkf.exists()) {
|
||||
String name = cur.getName();
|
||||
if (name == null) {
|
||||
name = cur.getDescription();
|
||||
if (name == null) {
|
||||
name = cur.getType();
|
||||
if (name == null)
|
||||
name = Long.toString(_context.clock().now());
|
||||
}
|
||||
}
|
||||
name = "i2ptunnel-deleted-" + name.replace(' ', '_') + "-privkeys.dat";
|
||||
File to = new File(_context.getConfigDir(), name);
|
||||
if (to.exists())
|
||||
to = new File(_context.getConfigDir(), name + '-' + _context.clock().now());
|
||||
boolean success = FileUtil.rename(pkf, to);
|
||||
if (success)
|
||||
msgs.add("Private key file " + pkf.getAbsolutePath() +
|
||||
" renamed to " + to.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
return getMessages(msgs);
|
||||
}
|
||||
|
||||
@@ -675,6 +712,11 @@ public class IndexBean {
|
||||
_booleanOptions.add("i2cp.encryptLeaseSet");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public void setDCC(String moo) {
|
||||
_booleanOptions.add(I2PTunnelIRCClient.PROP_DCC);
|
||||
}
|
||||
|
||||
protected static final String PROP_ENABLE_ACCESS_LIST = "i2cp.enableAccessList";
|
||||
protected static final String PROP_ENABLE_BLACKLIST = "i2cp.enableBlackList";
|
||||
|
||||
@@ -838,7 +880,11 @@ public class IndexBean {
|
||||
} else if (tun.getIsRunning() || tun.getIsStarting()) {
|
||||
return "Tunnel must be stopped before modifying destination";
|
||||
}
|
||||
PrivateKeyFile pkf = new PrivateKeyFile(_privKeyFile);
|
||||
|
||||
File keyFile = new File(_privKeyFile);
|
||||
if (!keyFile.isAbsolute())
|
||||
keyFile = new File(_context.getConfigDir(), _privKeyFile);
|
||||
PrivateKeyFile pkf = new PrivateKeyFile(keyFile);
|
||||
try {
|
||||
pkf.createIfAbsent();
|
||||
} catch (Exception e) {
|
||||
@@ -980,13 +1026,28 @@ public class IndexBean {
|
||||
else
|
||||
config.setProperty("interface", "");
|
||||
}
|
||||
|
||||
if ("ircclient".equals(_type)) {
|
||||
boolean dcc = _booleanOptions.contains(I2PTunnelIRCClient.PROP_DCC);
|
||||
config.setProperty("option." + I2PTunnelIRCClient.PROP_DCC,
|
||||
"" + dcc);
|
||||
// add some sane server options since they aren't in the GUI (yet)
|
||||
if (dcc) {
|
||||
config.setProperty("option." + PROP_MAX_CONNS_MIN, "3");
|
||||
config.setProperty("option." + PROP_MAX_CONNS_HOUR, "10");
|
||||
config.setProperty("option." + PROP_MAX_TOTAL_CONNS_MIN, "5");
|
||||
config.setProperty("option." + PROP_MAX_TOTAL_CONNS_HOUR, "25");
|
||||
}
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
private static final String _noShowOpts[] = {
|
||||
"inbound.length", "outbound.length", "inbound.lengthVariance", "outbound.lengthVariance",
|
||||
"inbound.backupQuantity", "outbound.backupQuantity", "inbound.quantity", "outbound.quantity",
|
||||
"inbound.nickname", "outbound.nickname", "i2p.streaming.connectDelay", "i2p.streaming.maxWindowSize"
|
||||
"inbound.nickname", "outbound.nickname", "i2p.streaming.connectDelay", "i2p.streaming.maxWindowSize",
|
||||
I2PTunnelIRCClient.PROP_DCC
|
||||
};
|
||||
private static final String _booleanClientOpts[] = {
|
||||
"i2cp.reduceOnIdle", "i2cp.closeOnIdle", "i2cp.newDestOnResume", "persistentClientKey", "i2cp.delayOpen"
|
||||
@@ -1008,6 +1069,7 @@ public class IndexBean {
|
||||
PROP_MAX_TOTAL_CONNS_MIN, PROP_MAX_TOTAL_CONNS_HOUR, PROP_MAX_TOTAL_CONNS_DAY,
|
||||
PROP_MAX_STREAMS
|
||||
};
|
||||
|
||||
protected static final Set _noShowSet = new HashSet(64);
|
||||
static {
|
||||
_noShowSet.addAll(Arrays.asList(_noShowOpts));
|
||||
|
||||
@@ -173,6 +173,15 @@
|
||||
<input value="1" type="checkbox" id="startOnLoad" name="startOnLoad" title="Start Tunnel Automatically"<%=(editBean.startAutomatically(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
|
||||
<span class="comment"><%=intl._("(Check the Box for 'YES')")%></span>
|
||||
</div>
|
||||
<% if ("ircclient".equals(tunnelType)) { %>
|
||||
<div id="startupField" class="rowItem">
|
||||
<label for="dcc" accesskey="d">
|
||||
<%=intl._("Enable DCC")%>:
|
||||
</label>
|
||||
<input value="1" type="checkbox" id="startOnLoad" name="DCC" title="Enable DCC"<%=(editBean.getDCC(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
|
||||
<span class="comment"><%=intl._("(Check the Box for 'YES')")%></span>
|
||||
</div>
|
||||
<% } // ircclient %>
|
||||
|
||||
<div class="footer">
|
||||
</div>
|
||||
|
||||
852
apps/i2ptunnel/locale/messages_da.po
Normal file
852
apps/i2ptunnel/locale/messages_da.po
Normal file
@@ -0,0 +1,852 @@
|
||||
# I2P
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the i2ptunnel package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# <kia___@hushmail.com>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
|
||||
"POT-Creation-Date: 2011-06-11 08:23+0000\n"
|
||||
"PO-Revision-Date: 2011-07-13 21:56+0000\n"
|
||||
"Last-Translator: KIA <kia___@hushmail.com>\n"
|
||||
"Language-Team: Danish (http://www.transifex.net/projects/p/I2P/team/da/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: da\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:514
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your host database, click <a "
|
||||
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
|
||||
"click <a href=\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
"For at besøge destinationen i din værts database, klik <a "
|
||||
"href=\"{0}\">her</a>. For at besøge den modstridende adressehjælper "
|
||||
"destination, klik <a href=\"{1}\">her</a>."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:875
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:876
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:881
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:886
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr ""
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:889
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:890
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" "
|
||||
"service:"
|
||||
msgstr ""
|
||||
"Klik på et af nedenstående links for at se efter en adresse hjælper ved at "
|
||||
"benytte en \"jump\" tjeneste:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1262
|
||||
msgid "Added via address helper"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1286
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1292
|
||||
msgid "Router Console"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
msgid "Addressbook"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
msgid "Help"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1298
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1299
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
msgid "internal"
|
||||
msgstr "intern"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr ""
|
||||
"Ugyldig formularafsendelse, sandsynligvis fordi du brugte 'tilbage' eller "
|
||||
"'reload' knappen i din browser. Prøv venligst at sende igen."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
msgstr "Konfiguration er genindlæst for alle tunneler"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
|
||||
msgid "Starting tunnel"
|
||||
msgstr "Starter tunnel"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
|
||||
msgid "Stopping tunnel"
|
||||
msgstr "Stopper tunnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
|
||||
msgid "Configuration changes saved"
|
||||
msgstr "Konfiguration ændringer gemt"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Det mislykkedes at gemme konfigurationen"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
|
||||
msgid "New Tunnel"
|
||||
msgstr "Ny Tunnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
|
||||
msgid "Standard client"
|
||||
msgstr "Standard klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
|
||||
msgid "HTTP client"
|
||||
msgstr "HTTP klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
|
||||
msgid "IRC client"
|
||||
msgstr "Klient for IRC"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
|
||||
msgid "Standard server"
|
||||
msgstr "Standard server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
|
||||
msgid "HTTP server"
|
||||
msgstr "HTTP server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
|
||||
msgid "SOCKS 4/4a/5 proxy"
|
||||
msgstr "SOCKS 4/4a/5 proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
|
||||
msgid "SOCKS IRC proxy"
|
||||
msgstr "SOCKS IRC proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
|
||||
msgid "CONNECT/SSL/HTTPS proxy"
|
||||
msgstr "CONNECT/SSL/HTTPS proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
|
||||
msgid "IRC server"
|
||||
msgstr "Server for IRC"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
|
||||
msgid "Streamr client"
|
||||
msgstr "Klient for Streamr"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
|
||||
msgid "Streamr server"
|
||||
msgstr "Server for Streamr"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
|
||||
msgid "HTTP bidir"
|
||||
msgstr "HTTP bidir"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr "Vært er ikke indstillet"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr "Port er ikke indstillet"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
|
||||
msgid "I2P Tunnel Manager - Edit Client Tunnel"
|
||||
msgstr "I2P Tunnel Maneger - Rediger Klient Tunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
|
||||
msgid "Edit proxy settings"
|
||||
msgstr "Rediger proxy indstillinger"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
|
||||
msgid "New proxy settings"
|
||||
msgstr "Nye proxy indstillinger"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
|
||||
msgid "Name"
|
||||
msgstr "Navn"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
|
||||
msgid "Type"
|
||||
msgstr "Type"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
|
||||
msgid "Description"
|
||||
msgstr "Beskrivelse"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
|
||||
msgid "Target"
|
||||
msgstr "Mål"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
|
||||
msgid "Access Point"
|
||||
msgstr "Adgangspunkt"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
|
||||
msgid "required"
|
||||
msgstr "krævet"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
|
||||
msgid "Reachable by"
|
||||
msgstr "Kan nås med"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
|
||||
msgid "Outproxies"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
|
||||
msgid "Tunnel Destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
|
||||
msgid "name or destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
|
||||
msgid "b32 not recommended"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
|
||||
msgid "Shared Client"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
|
||||
msgid ""
|
||||
"(Share tunnels with other clients and irc/httpclients? Change requires "
|
||||
"restart of client proxy)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
|
||||
msgid "Auto Start"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
|
||||
msgid "(Check the Box for 'YES')"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid ""
|
||||
"(NOTE: when this client proxy is configured to share tunnels, then these "
|
||||
"options are for all the shared proxy clients!)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
msgid "Tunnel Options"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
|
||||
msgid "Length"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
|
||||
msgid "0 hop tunnel (low anonymity, low latency)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
|
||||
msgid "1 hop tunnel (medium anonymity, medium latency)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
|
||||
msgid "2 hop tunnel (high anonymity, high latency)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
|
||||
msgid "3 hop tunnel (very high anonymity, poor performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
|
||||
msgid "hop tunnel (very poor performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
|
||||
msgid "Variance"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
|
||||
msgid "0 hop variance (no randomisation, consistant performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
|
||||
msgid ""
|
||||
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
|
||||
msgid ""
|
||||
"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
|
||||
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
|
||||
msgid "+/- 0-2 hop variance (not recommended)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
|
||||
msgid "hop variance"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
|
||||
msgid "Count"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
|
||||
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
|
||||
msgid ""
|
||||
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
|
||||
"reliability)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
|
||||
msgid ""
|
||||
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
|
||||
msgid "tunnels"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
|
||||
msgid "Backup Count"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
|
||||
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
|
||||
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
|
||||
msgid ""
|
||||
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
|
||||
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
|
||||
msgid "backup tunnels"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
|
||||
msgid "Profile"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
|
||||
msgid "interactive connection"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
|
||||
msgid "bulk connection (downloads/websites/BT)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
|
||||
msgid "Delay Connect"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
msgid "for request/response connections"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
|
||||
msgid "Router I2CP Address"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
|
||||
msgid "Port"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
|
||||
msgid "Reduce tunnel quantity when idle"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
|
||||
msgid "Enable"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
|
||||
msgid "Reduced tunnel count"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
|
||||
msgid "Idle minutes"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
|
||||
msgid "Close tunnels when idle"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
msgid "New Keys on Reopen"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
|
||||
msgid "Disable"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
msgid "Delay tunnel open until required"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
msgid "Persistent private key"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
|
||||
msgid "Local destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
|
||||
msgid "(if known)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
msgid "Local Authorization"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
|
||||
msgid "Outproxy Authorization"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
|
||||
msgid "Jump URL List"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
|
||||
msgid "Custom options"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
|
||||
msgid ""
|
||||
"NOTE: If tunnel is currently running, most changes will not take effect "
|
||||
"until tunnel is stopped and restarted."
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
|
||||
msgid "I2P Tunnel Manager - Edit Server Tunnel"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
|
||||
msgid "Edit server settings"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
|
||||
msgid "New server settings"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
|
||||
msgid "Website name"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
|
||||
msgid "(leave blank for outproxies)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
|
||||
msgid "Private key file"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
|
||||
msgid "Add to local addressbook"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
|
||||
msgid "Hostname Signature"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
|
||||
msgid "Encrypt Leaseset"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
|
||||
msgid "Encryption Key"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
|
||||
msgid "Generate New Key"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
|
||||
msgid "Generate"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
|
||||
msgid "(Tunnel must be stopped first)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
|
||||
msgid "Restricted Access List"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
|
||||
msgid "Whitelist"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
|
||||
msgid "Blacklist"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
|
||||
msgid "Access List"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
|
||||
msgid "Inbound connection limits (0=unlimited)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
|
||||
msgid "Per client"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
|
||||
msgid "Per minute"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
|
||||
msgid "Per hour"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
|
||||
msgid "Per day"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
|
||||
msgid "Total"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
|
||||
msgid "Max concurrent connections (0=unlimited)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
|
||||
msgid "New Certificate type"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
|
||||
msgid "Hashcash (effort)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
|
||||
msgid "Hashcash Calc Time"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
|
||||
msgid "Estimate"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
|
||||
msgid "Hidden"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
|
||||
msgid "Signed (signed by)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
|
||||
msgid "Modify Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
|
||||
msgid "Modify"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74
|
||||
msgid "I2P Tunnel Manager - List"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86
|
||||
msgid "Status Messages"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90
|
||||
msgid "Refresh"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
|
||||
msgid "Stop All"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
|
||||
msgid "Start All"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
|
||||
msgid "Restart All"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
|
||||
msgid "Reload Config"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
|
||||
msgid "I2P Server Tunnels"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
|
||||
msgid "Points at"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
|
||||
msgid "Preview"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
|
||||
msgid "Base32 Address"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
|
||||
msgid "No Preview"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
msgid "Starting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
|
||||
msgid "Stop"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
|
||||
msgid "Running"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
|
||||
msgid "Stopped"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
|
||||
msgid "Start"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
|
||||
msgid "New server tunnel"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
|
||||
msgid "Standard"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
|
||||
msgid "I2P Client Tunnels"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
|
||||
msgid "Interface"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
|
||||
msgid "Standby"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
|
||||
msgid "Outproxy"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
|
||||
msgid "New client tunnel"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -2,121 +2,220 @@
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the i2ptunnel package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
# foo <foo@bar>, 2009.
|
||||
#
|
||||
# Translators:
|
||||
# blabla, 2011.
|
||||
# ducki2p <ducki2p@gmail.com>, 2011.
|
||||
# foo <foo@bar>, 2009.
|
||||
# mixxy, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2ptunnel\n"
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-02-27 16:03+0000\n"
|
||||
"PO-Revision-Date: 2011-02-27 17:38+0100\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: foo <foo@bar>\n"
|
||||
"Language: \n"
|
||||
"POT-Creation-Date: 2011-10-07 13:59+0000\n"
|
||||
"PO-Revision-Date: 2011-10-07 01:43+0000\n"
|
||||
"Last-Translator: blabla <blabla@trash-mail.com>\n"
|
||||
"Language-Team: German (http://www.transifex.net/projects/p/I2P/team/de/)\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-Language: German\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr "Dies scheint kein gültiges Ziel zu sein:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr "Der I2P-Adresshelfer kann dir bei solch einem Ziel nicht helfen."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
|
||||
#, java-format
|
||||
msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>."
|
||||
msgstr "Um das Ziel in Ihrer Host-Datenbank zu besuchen, klicken Sie <a href=\"{0}\">hier</a>, und um das Ziel aus der kollidierenden Adresshelfer-Anfrage zu besuchen, <a href=\"{1}\">hier</a>!"
|
||||
msgid ""
|
||||
"To visit the destination in your host database, click <a href=\"{0}\">here</"
|
||||
"a>. To visit the conflicting addresshelper destination, click <a href="
|
||||
"\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
"Um das Ziel in Ihrer Host-Datenbank zu besuchen, klicken Sie <a href="
|
||||
"\"{0}\">hier</a>, und um das Ziel aus der kollidierenden Adresshelfer-"
|
||||
"Anfrage zu besuchen, <a href=\"{1}\">hier</a>!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Host"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
msgid "Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr "Durch Klicken auf einen der untenstehenden Links bekommen Sie einen Adresshelfer von einem \"Sprung\"-Service:"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Ziel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "Weiter zu {0}, ohne zu speichern"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr "{0} im Router-Adressbuch speichern und auf die Eepseite weiterleiten"
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr "{0} im Master-Adressbuch speichern und auf die Eepseite weiterleiten"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr "{0} im privaten Adressbuch speichern und auf die Eepseite weiterleiten"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr ""
|
||||
"Durch Klicken auf einen der untenstehenden Links bekommen Sie einen "
|
||||
"Adresshelfer von einem \"Sprung\"-Service:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
|
||||
msgid "Added via address helper"
|
||||
msgstr "Durch Adresshelfer hinzugefügt"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "Weiterleitung zu {0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
|
||||
msgid "Router Console"
|
||||
msgstr "Routerkonsole"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Addressbook"
|
||||
msgstr "Adressbuch"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Configuration"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Help"
|
||||
msgstr "Hilfe"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr ""
|
||||
"{0} wurde ins {1} Adressbuch geschrieben. Du wirst nun weitergeleitet."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr ""
|
||||
"Konnte {0} nicht im {1} Adressbuch speichern. Du wirst nun weitergeleitet."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "Klick hier, wenn du nicht automatisch weitergeleitet wirst!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:332
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:342
|
||||
msgid "internal"
|
||||
msgstr "intern"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
|
||||
msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
|
||||
msgstr "Ungültige Formulareingabe - wahrscheinlich haben Sie den \"Zurück\"-Knopf Ihres Browsers betätigt. Bitte neuladen!"
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr ""
|
||||
"Ungültige Formulareingabe - wahrscheinlich haben Sie den \"Zurück\"-Knopf "
|
||||
"Ihres Browsers betätigt. Bitte neuladen!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
msgstr "Einstellungen für alle Tunnel neugeladen"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
|
||||
msgid "Starting tunnel"
|
||||
msgstr "Starte Tunnel ..."
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
|
||||
msgid "Stopping tunnel"
|
||||
msgstr "Beende Tunnel ..."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
msgid "Configuration changes saved"
|
||||
msgstr "Änderungen der Einstellungen gespeichert"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Einstellungen nicht gespeichert"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
|
||||
msgid "New Tunnel"
|
||||
msgstr "Neuer Tunnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
|
||||
msgid "Standard client"
|
||||
msgstr "Standardklient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
|
||||
msgid "HTTP client"
|
||||
msgstr "HTTP-Klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
|
||||
msgid "IRC client"
|
||||
msgstr "IRC-Klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
|
||||
msgid "Standard server"
|
||||
msgstr "Standardserver"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
|
||||
msgid "HTTP server"
|
||||
msgstr "HTTP-Server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
|
||||
msgid "SOCKS 4/4a/5 proxy"
|
||||
msgstr "SOCKS-4/4a/5-Proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
|
||||
msgid "SOCKS IRC proxy"
|
||||
msgstr "SOCKS-IRC-Proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
|
||||
msgid "CONNECT/SSL/HTTPS proxy"
|
||||
msgstr "CONNECT/SSL/HTTPS-Proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
|
||||
msgid "IRC server"
|
||||
msgstr "IRC-Server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
|
||||
msgid "Streamr client"
|
||||
msgstr "Streamr-Klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
|
||||
msgid "Streamr server"
|
||||
msgstr "Streamr-Server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
|
||||
msgid "HTTP bidir"
|
||||
msgstr "HTTP Bidir"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr "Host nicht gesetzt"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr "Port nicht gesetzt"
|
||||
|
||||
@@ -134,24 +233,24 @@ msgstr "Neue Proxyeinstellungen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
|
||||
msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
|
||||
msgid "Type"
|
||||
msgstr "Typ"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
|
||||
msgid "Description"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
@@ -201,8 +300,12 @@ msgid "Shared Client"
|
||||
msgstr "versch. Klienten"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
|
||||
msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)"
|
||||
msgstr "(Soll dieser Tunnel mit anderen Klienten und IRC/HTTP-Klienten geteilt werden? Änderungen benötigen Neustart des Klientenproxys)"
|
||||
msgid ""
|
||||
"(Share tunnels with other clients and irc/httpclients? Change requires "
|
||||
"restart of client proxy)"
|
||||
msgstr ""
|
||||
"(Soll dieser Tunnel mit anderen Klienten und IRC/HTTP-Klienten geteilt "
|
||||
"werden? Änderungen benötigen Neustart des Klientenproxys)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
|
||||
@@ -210,291 +313,316 @@ msgid "Auto Start"
|
||||
msgstr "Automatischer Start"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
|
||||
msgid "(Check the Box for 'YES')"
|
||||
msgstr "(Aktiviere das Kästchen für 'ja')"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid "Enable DCC"
|
||||
msgstr "DCC aktivieren"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr "Erweiterte Netzwerkoptionen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
|
||||
msgstr "(HINWEIS: Ist dieser Proxy konfiguriert, Tunnel mit anderen Klienten zu teilen, so gelten diese Optionen für alle Klienten des Proxys!)"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
|
||||
msgid ""
|
||||
"(NOTE: when this client proxy is configured to share tunnels, then these "
|
||||
"options are for all the shared proxy clients!)"
|
||||
msgstr ""
|
||||
"(HINWEIS: Ist dieser Proxy konfiguriert, Tunnel mit anderen Klienten zu "
|
||||
"teilen, so gelten diese Optionen für alle Klienten des Proxys!)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
msgid "Tunnel Options"
|
||||
msgstr "Tunneloptionen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
|
||||
msgid "Length"
|
||||
msgstr "Länge"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
|
||||
msgid "0 hop tunnel (low anonymity, low latency)"
|
||||
msgstr "0-Hop-Tunnel (geringe Anonymität, geringe Latenz)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
|
||||
msgid "1 hop tunnel (medium anonymity, medium latency)"
|
||||
msgstr "1-Hop-Tunnel (mittlere Anonymität, mittlere Latenz)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
|
||||
msgid "2 hop tunnel (high anonymity, high latency)"
|
||||
msgstr "2-Hop-Tunnel (hohe Anonymität, hohe Latenz)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
|
||||
msgid "3 hop tunnel (very high anonymity, poor performance)"
|
||||
msgstr "3-Hop-Tunnel (sehr hohe Anonymität, geringe Leistung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
|
||||
msgid "hop tunnel (very poor performance)"
|
||||
msgstr "Hop-Tunnel (sehr geringe Leistung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
|
||||
msgid "Variance"
|
||||
msgstr "Varianz"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
|
||||
msgid "0 hop variance (no randomisation, consistant performance)"
|
||||
msgstr "0-Hop-Varianz (keine zufällige Längenveränderung, konsistente Leistung)"
|
||||
msgstr ""
|
||||
"0-Hop-Varianz (keine zufällige Längenveränderung, konsistente Leistung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
|
||||
msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr "+ 0-1 Hop Varianz (mittlere zufällige Verlängerung, verringert die Leistung)"
|
||||
msgid ""
|
||||
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
"+ 0-1 Hop Varianz (mittlere zufällige Verlängerung, verringert die Leistung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
|
||||
msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgid ""
|
||||
"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr "+ 0-2 Hops Varianz (hohe zufällige Verlängerung, verringerte Leistung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
|
||||
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
|
||||
msgstr "+/- 0-1 Hop Varianz (geringe zufällige Längenänderung, Standardleistung)"
|
||||
msgstr ""
|
||||
"+/- 0-1 Hop Varianz (geringe zufällige Längenänderung, Standardleistung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
|
||||
msgid "+/- 0-2 hop variance (not recommended)"
|
||||
msgstr "+/- 0-2 Hops Varianz (nicht empfohlen)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
|
||||
msgid "hop variance"
|
||||
msgstr "Hops Varianz"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
|
||||
msgid "Count"
|
||||
msgstr "Anzahl"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
|
||||
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
|
||||
msgstr "1 eingehender, 1 ausgehender Tunnel (geringe Bandbreitennutzung, weniger zuverlässig)"
|
||||
msgstr ""
|
||||
"1 eingehender, 1 ausgehender Tunnel (geringe Bandbreitennutzung, weniger "
|
||||
"zuverlässig)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
|
||||
msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
|
||||
msgstr "2 eingehende, 2 ausgehende Tunnel (Standardbandbreitennutzung, zuverlässig)"
|
||||
msgid ""
|
||||
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
|
||||
"reliability)"
|
||||
msgstr ""
|
||||
"2 eingehende, 2 ausgehende Tunnel (Standardbandbreitennutzung, zuverlässig)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
|
||||
msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr "3 eingehende, 3 ausgehende Tunnel (hohe Bandbreitennutzung, zuverlässiger)"
|
||||
msgid ""
|
||||
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr ""
|
||||
"3 eingehende, 3 ausgehende Tunnel (hohe Bandbreitennutzung, zuverlässiger)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
|
||||
msgid "tunnels"
|
||||
msgstr "Tunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
|
||||
msgid "Backup Count"
|
||||
msgstr "Anzahl an Ersatztunneln"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
|
||||
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
|
||||
msgstr "0 Ersatztunnel (0 Redundanz, keine zusätzliche Ressourcennutzung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
|
||||
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
|
||||
msgstr "1 Ersatztunnel in jede Richtung (geringe Redundanz, geringe Ressourcennutzung)"
|
||||
msgstr ""
|
||||
"1 Ersatztunnel in jede Richtung (geringe Redundanz, geringe "
|
||||
"Ressourcennutzung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
|
||||
msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr "2 Ersatztunnel in jede Richtung (mittlere Redundanz, mittlere Ressourcennutzung)"
|
||||
msgid ""
|
||||
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr ""
|
||||
"2 Ersatztunnel in jede Richtung (mittlere Redundanz, mittlere "
|
||||
"Ressourcennutzung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
|
||||
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
|
||||
msgstr "3 Ersatztunnel in jede Richtung (hohe Redundanz, hohe Ressourcennutzung)"
|
||||
msgstr ""
|
||||
"3 Ersatztunnel in jede Richtung (hohe Redundanz, hohe Ressourcennutzung)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
|
||||
msgid "backup tunnels"
|
||||
msgstr "Ersatztunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
|
||||
msgid "Profile"
|
||||
msgstr "Profil"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
|
||||
msgid "interactive connection"
|
||||
msgstr "Interaktive Verbindung"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
|
||||
msgid "bulk connection (downloads/websites/BT)"
|
||||
msgstr "Mengenverbindung (Download/Webseiten/BitTorrent)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
msgid "Delay Connect"
|
||||
msgstr "Verbindung verzögern"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
|
||||
msgid "for request/response connections"
|
||||
msgstr "für Verbindungen mit Anfragen/Antworten"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
|
||||
msgid "Router I2CP Address"
|
||||
msgstr "I2CP-Adresse des Routers"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Host"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
|
||||
msgid "Port"
|
||||
msgstr "Port"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
|
||||
msgid "Reduce tunnel quantity when idle"
|
||||
msgstr "Anzahl an Tunneln im Leerlauf reduzieren"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
|
||||
msgid "Enable"
|
||||
msgstr "aktiviert"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
|
||||
msgid "Reduced tunnel count"
|
||||
msgstr "Reduzierte Tunnelanzahl"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
|
||||
msgid "Idle minutes"
|
||||
msgstr "Minuten Inaktivität"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
msgid "Close tunnels when idle"
|
||||
msgstr "nicht genutzte Tunnel schließen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
msgid "New Keys on Reopen"
|
||||
msgstr "Neue Schlüssel beim Wiederöffnen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
|
||||
msgid "Disable"
|
||||
msgstr "deaktiviert"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
msgid "Delay tunnel open until required"
|
||||
msgstr "Aufbau des Tunnela verzögern, bis dieser benötigt wird"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
msgid "Persistent private key"
|
||||
msgstr "Dauerhafter privater Schlüssel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466
|
||||
msgid "File"
|
||||
msgstr "Datei"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
|
||||
msgid "Local destination"
|
||||
msgstr "lokales Ziel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
|
||||
msgid "(if known)"
|
||||
msgstr "(falls bekannt)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
msgid "Local Authorization"
|
||||
msgstr "lokale Autorisation"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
|
||||
msgid "Username"
|
||||
msgstr "Benutzername"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
msgid "Outproxy Authorization"
|
||||
msgstr "Outproxy Autorisation"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
msgid "Jump URL List"
|
||||
msgstr "List der Sprung-URLs"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
|
||||
msgid "Custom options"
|
||||
msgstr "Eigene Optionen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
|
||||
msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
|
||||
msgstr "HINWEIS: Falls der Tunnel gerade aktiv ist, werden die meisten Änderungen erst nach einem Neustart des Tunnels wirksam."
|
||||
msgid ""
|
||||
"NOTE: If tunnel is currently running, most changes will not take effect "
|
||||
"until tunnel is stopped and restarted."
|
||||
msgstr ""
|
||||
"HINWEIS: Falls der Tunnel gerade aktiv ist, werden die meisten Änderungen "
|
||||
"erst nach einem Neustart des Tunnels wirksam."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
|
||||
msgid "Save"
|
||||
msgstr "Speichern"
|
||||
@@ -632,145 +760,127 @@ msgstr "Zertifikat modifizieren"
|
||||
msgid "Modify"
|
||||
msgstr "Modifizieren"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74
|
||||
msgid "I2P Tunnel Manager - List"
|
||||
msgstr "I2P-Tunnel-Manager - Liste"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86
|
||||
msgid "Status Messages"
|
||||
msgstr "Statusnachrichten"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90
|
||||
msgid "Refresh"
|
||||
msgstr "Auffrischen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
|
||||
msgid "Stop All"
|
||||
msgstr "Alle stoppen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
|
||||
msgid "Start All"
|
||||
msgstr "Alle starten"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
|
||||
msgid "Restart All"
|
||||
msgstr "Alle neustarten"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
|
||||
msgid "Reload Config"
|
||||
msgstr "Konfiguration neu einlesen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
|
||||
msgid "I2P Server Tunnels"
|
||||
msgstr "I2P-Servertunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
|
||||
msgid "Points at"
|
||||
msgstr "Läuft auf"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
|
||||
msgid "Preview"
|
||||
msgstr "Vorschau"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
|
||||
msgid "Base32 Address"
|
||||
msgstr "Basis-32-Adresse"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
|
||||
msgid "No Preview"
|
||||
msgstr "Keine Vorschau"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
msgid "Starting..."
|
||||
msgstr "Starte ..."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
|
||||
msgid "Stop"
|
||||
msgstr "Stopp"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
|
||||
msgid "Running"
|
||||
msgstr "Aktiv"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
|
||||
msgid "Stopped"
|
||||
msgstr "Gestoppt"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
|
||||
msgid "Start"
|
||||
msgstr "Start"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
|
||||
msgid "New server tunnel"
|
||||
msgstr "Neuer Servertunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
|
||||
msgid "Standard"
|
||||
msgstr "Standard"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
|
||||
msgid "Create"
|
||||
msgstr "Erstellen"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
|
||||
msgid "I2P Client Tunnels"
|
||||
msgstr "I2P-Klienten-Tunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
|
||||
msgid "Interface"
|
||||
msgstr "Interface"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
|
||||
msgid "Standby"
|
||||
msgstr "Wartestellung"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
|
||||
msgid "Outproxy"
|
||||
msgstr "Ausgehender Proxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
|
||||
msgid "Destination"
|
||||
msgstr "Ziel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
|
||||
msgid "none"
|
||||
msgstr "Keiner"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
|
||||
msgid "New client tunnel"
|
||||
msgstr "Neuer Kliententunnel"
|
||||
|
||||
#~ msgid "Locally (127.0.0.1)"
|
||||
#~ msgstr "Lokal (127.0.0.1)"
|
||||
#~ msgid "Everyone (0.0.0.0)"
|
||||
#~ msgstr "Überall (0.0.0.0)"
|
||||
#~ msgid "LAN Hosts (Please specify your LAN address)"
|
||||
#~ msgstr "LAN-Hosts (Bitte geben Sie ihre LAN-Adressen an!)"
|
||||
#~ msgid "Other"
|
||||
#~ msgstr "Anderen"
|
||||
#~ msgid "I2CP Options"
|
||||
#~ msgstr "I2CP-Optionen"
|
||||
#~ msgid "(Restrict to these clients only)"
|
||||
#~ msgstr "(Zugang wird auf diese Klienten beschränkt)"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2ptunnel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-06-11 08:23+0000\n"
|
||||
"POT-Creation-Date: 2011-09-04 22:56+0000\n"
|
||||
"PO-Revision-Date: 2010-06-15 14:09+0100\n"
|
||||
"Last-Translator: duck <duck@mail.i2p>\n"
|
||||
"Language-Team: duck <duck@mail.i2p>\n"
|
||||
@@ -18,7 +18,15 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:514
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your host database, click <a href=\"{0}\">here</"
|
||||
@@ -26,174 +34,174 @@ msgid ""
|
||||
"\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:875
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:876
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:881
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:886
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr ""
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:889
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:890
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1262
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
|
||||
msgid "Added via address helper"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1286
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1292
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
|
||||
msgid "Router Console"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Addressbook"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Help"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1298
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1299
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:332
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:342
|
||||
msgid "internal"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
msgstr ""
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
|
||||
msgid "Starting tunnel"
|
||||
msgstr ""
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
|
||||
msgid "Stopping tunnel"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
msgid "Configuration changes saved"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
|
||||
msgid "Failed to save configuration"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
|
||||
msgid "New Tunnel"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
|
||||
msgid "Standard client"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
|
||||
msgid "HTTP client"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
|
||||
msgid "IRC client"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
|
||||
msgid "Standard server"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
|
||||
msgid "HTTP server"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
|
||||
msgid "SOCKS 4/4a/5 proxy"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
|
||||
msgid "SOCKS IRC proxy"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
|
||||
msgid "CONNECT/SSL/HTTPS proxy"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
|
||||
msgid "IRC server"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
|
||||
msgid "Streamr client"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
|
||||
msgid "Streamr server"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
|
||||
msgid "HTTP bidir"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr ""
|
||||
@@ -290,181 +298,186 @@ msgid "Auto Start"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
|
||||
msgid "(Check the Box for 'YES')"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid "Enable DCC"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
|
||||
msgid ""
|
||||
"(NOTE: when this client proxy is configured to share tunnels, then these "
|
||||
"options are for all the shared proxy clients!)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
msgid "Tunnel Options"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
|
||||
msgid "Length"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
|
||||
msgid "0 hop tunnel (low anonymity, low latency)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
|
||||
msgid "1 hop tunnel (medium anonymity, medium latency)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
|
||||
msgid "2 hop tunnel (high anonymity, high latency)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
|
||||
msgid "3 hop tunnel (very high anonymity, poor performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
|
||||
msgid "hop tunnel (very poor performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
|
||||
msgid "Variance"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
|
||||
msgid "0 hop variance (no randomisation, consistant performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
|
||||
msgid ""
|
||||
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
|
||||
msgid ""
|
||||
"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
|
||||
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
|
||||
msgid "+/- 0-2 hop variance (not recommended)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
|
||||
msgid "hop variance"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
|
||||
msgid "Count"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
|
||||
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
|
||||
msgid ""
|
||||
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
|
||||
"reliability)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
|
||||
msgid ""
|
||||
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
|
||||
msgid "tunnels"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
|
||||
msgid "Backup Count"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
|
||||
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
|
||||
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
|
||||
msgid ""
|
||||
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
|
||||
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
|
||||
msgid "backup tunnels"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
|
||||
msgid "Profile"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
|
||||
msgid "interactive connection"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
|
||||
msgid "bulk connection (downloads/websites/BT)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
msgid "Delay Connect"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
|
||||
msgid "for request/response connections"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
|
||||
msgid "Router I2CP Address"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
@@ -472,113 +485,113 @@ msgstr ""
|
||||
msgid "Port"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
|
||||
msgid "Reduce tunnel quantity when idle"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
|
||||
msgid "Enable"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
|
||||
msgid "Reduced tunnel count"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
|
||||
msgid "Idle minutes"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
msgid "Close tunnels when idle"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
msgid "New Keys on Reopen"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
|
||||
msgid "Disable"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
msgid "Delay tunnel open until required"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
msgid "Persistent private key"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
|
||||
msgid "Local destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
|
||||
msgid "(if known)"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
msgid "Local Authorization"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
msgid "Outproxy Authorization"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
msgid "Jump URL List"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
|
||||
msgid "Custom options"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
|
||||
msgid ""
|
||||
"NOTE: If tunnel is currently running, most changes will not take effect "
|
||||
"until tunnel is stopped and restarted."
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
@@ -2,192 +2,222 @@
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the i2ptunnel package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
# foo <foo@bar>, 2009.
|
||||
#
|
||||
# Translators:
|
||||
# "blabla", 2011.
|
||||
# ducki2p <ducki2p@gmail.com>, 2011.
|
||||
# foo <foo@bar>, 2009.
|
||||
# <punkibastardo@gmail.com>, 2011.
|
||||
# punkibastardo <punkibastardo@gmail.com>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-06-02 16:13+0000\n"
|
||||
"PO-Revision-Date: 2011-06-24 09:44+0100\n"
|
||||
"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
|
||||
"Language-Team: Spanish (Castilian) <None>\n"
|
||||
"POT-Creation-Date: 2011-10-07 13:58+0000\n"
|
||||
"PO-Revision-Date: 2011-10-07 01:44+0000\n"
|
||||
"Last-Translator: blabla <blabla@trash-mail.com>\n"
|
||||
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/I2P/"
|
||||
"team/es/)\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:514
|
||||
#, java-format
|
||||
msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>."
|
||||
msgstr "Para visitar el destino en la base de datos de hosts, haga clic <a href=\"{0}\">aquí</a> . Para visitar el destino del ayudante de direcciones en conflicto, haga clic <a href=\"{1}\">aquí</a> ."
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr "Éste parece ser un destino falso:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:875
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr "El ayudante de direcciones no te puede ayudar con un destino así."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your host database, click <a href=\"{0}\">here</"
|
||||
"a>. To visit the conflicting addresshelper destination, click <a href="
|
||||
"\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
"Para visitar el destino en la base de datos de hosts, ¡pincha <a href="
|
||||
"\"{0}\">aquí</a>! Para visitar el destino del ayudante de direcciones en "
|
||||
"conflicto, ¡pincha <a href=\"{1}\">aquí</a>!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Host"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:876
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Destino"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:881
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "Acceder a {0} sin guardar"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:886
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr "Guardar {0} a la libreta de direcciones del router y acceder al sitio i2p."
|
||||
msgstr ""
|
||||
"Guardar {0} a la libreta de direcciones del router y acceder al sitio i2p."
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:889
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr "Guardar {0} a la libreta de direcciones principal y acceder al sitio i2p."
|
||||
msgstr ""
|
||||
"Guardar {0} a la libreta de direcciones principal y acceder al sitio i2p."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:890
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr "Guardar {0} a la libreta de direcciones privada y acceder al sitio i2p."
|
||||
msgstr ""
|
||||
"Guardar {0} a la libreta de direcciones privada y acceder al sitio i2p."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046
|
||||
msgid "Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr "Haga clic en un enlace de debajo para buscar un ayudante de direcciones mediante el uso de un servicio de \"salto\":"
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr ""
|
||||
"Pincha en un enlace de debajo para buscar un ayudante de direcciones "
|
||||
"mediante el uso de un servicio de \"salto\":"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1262
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
|
||||
msgid "Added via address helper"
|
||||
msgstr "Agregado por la ayuda a las direcciones."
|
||||
msgstr "Agregado por el ayudante de direcciones."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1286
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "Accediendo a {0}"
|
||||
msgstr "Redireccionando a {0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1292
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
|
||||
msgid "Router Console"
|
||||
msgstr "Consola del Router"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Addressbook"
|
||||
msgstr "Libreta de direcciones"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Configuration"
|
||||
msgstr "Ajustes"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Help"
|
||||
msgstr "Ayuda"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1298
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "{0} ha sido guardada en la {1}, accediendo ahora."
|
||||
msgstr "{0} ha sido guardado en la libreta {1}, accediendo ahora."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1299
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "No se ha podido guardar {0} en la {1}, accediendo ahora."
|
||||
msgstr "No se ha podido guardar {0} en la libreta {1}, accediendo ahora."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "Haz click aquí si no estás siendo enviado automáticamente."
|
||||
msgstr "¡Haz click aquí si no estás siendo enviado automáticamente!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:332
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:342
|
||||
msgid "internal"
|
||||
msgstr "interno"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
|
||||
msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
|
||||
msgstr "El formulario presentado es inválido, probablemente porque ha utilizado el botón 'atrás' o 'recargar' de su navegador. Por favor, vuelva a enviarlo."
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr ""
|
||||
"El formulario presentado es inválido, probablemente porque has utilizado el "
|
||||
"botón 'atrás' o 'recargar' de tu navegador. Por favor, ¡vuelve a enviarlo!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
msgstr "Configuración recargada para todos los túneles"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
|
||||
msgid "Starting tunnel"
|
||||
msgstr "Inicializando el túnel"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
|
||||
msgid "Stopping tunnel"
|
||||
msgstr "Deteniendo el túnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
msgid "Configuration changes saved"
|
||||
msgstr "Cambios en la configuración guardados"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "No se pudo guardar la configuración"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
|
||||
msgid "New Tunnel"
|
||||
msgstr "Nuevo túnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
|
||||
msgid "Standard client"
|
||||
msgstr "Cliente estándar"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
|
||||
msgid "HTTP client"
|
||||
msgstr "Cliente HTTP"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
|
||||
msgid "IRC client"
|
||||
msgstr "Cliente IRC"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
|
||||
msgid "Standard server"
|
||||
msgstr "Servidor estándar"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
|
||||
msgid "HTTP server"
|
||||
msgstr "Servidor HTTP"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
|
||||
msgid "SOCKS 4/4a/5 proxy"
|
||||
msgstr "Proxy SOCKS 4/4a/5"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
|
||||
msgid "SOCKS IRC proxy"
|
||||
msgstr "Proxy IRC SOCKS"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
|
||||
msgid "CONNECT/SSL/HTTPS proxy"
|
||||
msgstr "Proxy CONNECT/SSL/HTTPS"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
|
||||
msgid "IRC server"
|
||||
msgstr "Servidor de IRC"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
|
||||
msgid "Streamr client"
|
||||
msgstr "Cliente Streamr"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
|
||||
msgid "Streamr server"
|
||||
msgstr "Servidor Streamr"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
|
||||
msgid "HTTP bidir"
|
||||
msgstr "HTTP bidir"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr "Host no establecido"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr "Puerto no establecido"
|
||||
@@ -273,8 +303,12 @@ msgid "Shared Client"
|
||||
msgstr "Túnel Compartido"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
|
||||
msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)"
|
||||
msgstr "(¿Compartir túneles con otros clientes y clientes de IRC/http? Cambiar esto requiere reiniciar el proxy de cliente)"
|
||||
msgid ""
|
||||
"(Share tunnels with other clients and irc/httpclients? Change requires "
|
||||
"restart of client proxy)"
|
||||
msgstr ""
|
||||
"(¿Compartir túneles con otros clientes y clientes de IRC/http? Cambiar esto "
|
||||
"requiere reiniciar el proxy de cliente)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
|
||||
@@ -282,173 +316,204 @@ msgid "Auto Start"
|
||||
msgstr "Autoarranque"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
|
||||
msgid "(Check the Box for 'YES')"
|
||||
msgstr "(Marque la casilla para \"SI\")"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr "Opciones avanzadas de red"
|
||||
msgstr "(Marca la casilla para \"SÍ\")"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
|
||||
msgstr "(NOTA: cuando este proxy de cliente está configurado para compartir túneles, entonces estas opciones son para todos los clientes de proxy compartidos!)"
|
||||
msgid "Enable DCC"
|
||||
msgstr "Habilitar DCC"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr "Opciones de red avanzadas"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
|
||||
msgid ""
|
||||
"(NOTE: when this client proxy is configured to share tunnels, then these "
|
||||
"options are for all the shared proxy clients!)"
|
||||
msgstr ""
|
||||
"(NOTA: Si este proxy de cliente está configurado para compartir túneles, "
|
||||
"estas opciones se aplicarán a todos los proxys de cliente compartidos.)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
msgid "Tunnel Options"
|
||||
msgstr "Opciones de Túnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
|
||||
msgid "Length"
|
||||
msgstr "Longitud"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
|
||||
msgid "0 hop tunnel (low anonymity, low latency)"
|
||||
msgstr "Túnel de 0 saltos (anonimato bajo, latencia baja)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
|
||||
msgid "1 hop tunnel (medium anonymity, medium latency)"
|
||||
msgstr "Túnel de 1 salto (anonimato medio, latencia media)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
|
||||
msgid "2 hop tunnel (high anonymity, high latency)"
|
||||
msgstr "Túnel de 2 saltos (anonimato alto, latencia alta)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
|
||||
msgid "3 hop tunnel (very high anonymity, poor performance)"
|
||||
msgstr "Túnel de 3 saltos (anonimato muy alto, rendimiento pobre)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
|
||||
msgid "hop tunnel (very poor performance)"
|
||||
msgstr "saltos de túnel (rendimiento muy pobre)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
|
||||
msgid "Variance"
|
||||
msgstr "Variación"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
|
||||
msgid "0 hop variance (no randomisation, consistant performance)"
|
||||
msgstr "Variación de 0 saltos (sin aleatoriedad, rendimiento constante)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
|
||||
msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr "Variación de + 0-1 saltos (aleatoriedad media aditiva, rendimiento substractivo)"
|
||||
msgid ""
|
||||
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
"Variación de + 0-1 salto (aleatoriedad media aditiva, rendimiento "
|
||||
"substractivo)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
|
||||
msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr "Variación de + 0-2 saltos (aleatoriedad alta aditiva, rendimiento substractivo)"
|
||||
msgid ""
|
||||
"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
"Variación de + 0-2 saltos (aleatoriedad alta aditiva, rendimiento "
|
||||
"substractivo)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
|
||||
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
|
||||
msgstr "Variación de +/- 0-1 saltos (aleatoriedad estándar, rendimiento estándar)"
|
||||
msgstr ""
|
||||
"Variación de +/- 0-1 salto (aleatoriedad estándar, rendimiento estándar)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
|
||||
msgid "+/- 0-2 hop variance (not recommended)"
|
||||
msgstr "Variación de +/- 0-2 saltos (no recomendado)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
|
||||
msgid "hop variance"
|
||||
msgstr "Variación de saltos"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
|
||||
msgid "Count"
|
||||
msgstr "Número"
|
||||
msgstr "Cantidad"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
|
||||
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
|
||||
msgstr "1 entrante, 1 túnel de salida (bajo uso de ancho de banda, menos fiabilidad)"
|
||||
msgstr ""
|
||||
"1 túnel entrante, 1 de salida (bajo uso de ancho de banda, menos fiabilidad)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
|
||||
msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
|
||||
msgstr "2 entrantes, 2 túneles de salida (uso de ancho de banda estándar, fiabilidad estándar)"
|
||||
msgid ""
|
||||
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
|
||||
"reliability)"
|
||||
msgstr ""
|
||||
"2 túneles entrantes, 2 de salida (uso de ancho de banda estándar, fiabilidad "
|
||||
"estándar)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
|
||||
msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr "3 entrantes, 3 túneles de salida (mayor uso de ancho de banda, mayor fiabilidad)"
|
||||
msgid ""
|
||||
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr ""
|
||||
"3 túneles entrantes, 3 de salida (mayor uso de ancho de banda, mayor "
|
||||
"fiabilidad)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
|
||||
msgid "tunnels"
|
||||
msgstr "túneles"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
|
||||
msgid "Backup Count"
|
||||
msgstr "Número de respaldo"
|
||||
msgstr "Cantidad de respaldo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
|
||||
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
|
||||
msgstr "0 túneles de respaldo (redundancia 0, no aumenta el uso de recursos)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
|
||||
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
|
||||
msgstr "1 túnel de respaldo en cada dirección (redundancia baja, uso bajo de recursos)"
|
||||
msgstr ""
|
||||
"1 túnel de respaldo en cada dirección (redundancia baja, uso bajo de "
|
||||
"recursos)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
|
||||
msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr "2 túneles de respaldo en cada dirección (redundancia media, uso de recursos medio)"
|
||||
msgid ""
|
||||
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr ""
|
||||
"2 túneles de respaldo en cada dirección (redundancia media, uso de recursos "
|
||||
"medio)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
|
||||
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
|
||||
msgstr "3 túneles de respaldo en cada dirección (alta redundancia, uso de recursos alto)"
|
||||
msgstr ""
|
||||
"3 túneles de respaldo en cada dirección (alta redundancia, uso de recursos "
|
||||
"alto)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
|
||||
msgid "backup tunnels"
|
||||
msgstr "túneles de respaldo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
|
||||
msgid "Profile"
|
||||
msgstr "Perfil"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
|
||||
msgid "interactive connection"
|
||||
msgstr "conexión interactiva"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
|
||||
msgid "bulk connection (downloads/websites/BT)"
|
||||
msgstr "conexión en masa (descargas/web/BT)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
msgid "Delay Connect"
|
||||
msgstr "Retrasar Conexión"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
|
||||
msgid "for request/response connections"
|
||||
msgstr "para las conexiones de solicitud/respuesta"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
|
||||
msgid "Router I2CP Address"
|
||||
msgstr "Dirección I2CP del router"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
@@ -456,111 +521,115 @@ msgstr "Dirección I2CP del router"
|
||||
msgid "Port"
|
||||
msgstr "Puerto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
|
||||
msgid "Reduce tunnel quantity when idle"
|
||||
msgstr "Reducir la cantidad de túneles cuando se está inactivo"
|
||||
msgstr "Reducir la cantidad de túneles cuando está inactivo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
|
||||
msgid "Enable"
|
||||
msgstr "Habilitar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
|
||||
msgid "Reduced tunnel count"
|
||||
msgstr "Número de túneles reducido"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
|
||||
msgid "Idle minutes"
|
||||
msgstr "Minutos de inactividad"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
msgid "Close tunnels when idle"
|
||||
msgstr "Cerrar los túneles cuando se está inactivo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
msgid "New Keys on Reopen"
|
||||
msgstr "Nuevas claves al reabrir"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
|
||||
msgid "Disable"
|
||||
msgstr "Desactivar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
msgid "Delay tunnel open until required"
|
||||
msgstr "Retrasar apertura del túnel hasta que sea necesario"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
msgid "Persistent private key"
|
||||
msgstr "Clave privada persistente"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466
|
||||
msgid "File"
|
||||
msgstr "Archivo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
|
||||
msgid "Local destination"
|
||||
msgstr "destino local"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
|
||||
msgid "(if known)"
|
||||
msgstr "(Si se conoce)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
msgid "Local Authorization"
|
||||
msgstr "Autorización local"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
|
||||
msgid "Username"
|
||||
msgstr "Nombre de usuario"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
|
||||
msgid "Password"
|
||||
msgstr "Contraseña"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
msgid "Outproxy Authorization"
|
||||
msgstr "Autorización outproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
msgid "Jump URL List"
|
||||
msgstr "Lista de URL de salto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
|
||||
msgid "Custom options"
|
||||
msgstr "Opciones personalizadas"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
|
||||
msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
|
||||
msgstr "NOTA: Si el túnel se está ejecutando actualmente, la mayoría de los cambios no tendrán efecto hasta que se detenga y reinicie el túnel."
|
||||
msgid ""
|
||||
"NOTE: If tunnel is currently running, most changes will not take effect "
|
||||
"until tunnel is stopped and restarted."
|
||||
msgstr ""
|
||||
"NOTA: Si el túnel está ejecutándose actualmente, la mayoría de los cambios "
|
||||
"no tendrá efecto hasta que se detenga y reinicie el túnel."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
|
||||
msgid "Delete"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
|
||||
msgid "Save"
|
||||
msgstr "Guardar"
|
||||
@@ -822,4 +891,3 @@ msgstr "ninguno"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
|
||||
msgid "New client tunnel"
|
||||
msgstr "Nuevo túnel de cliente"
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2ptunnel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-03-25 15:21+0000\n"
|
||||
"PO-Revision-Date: 2011-04-09 02:46+0100\n"
|
||||
"POT-Creation-Date: 2011-07-12 06:46+0000\n"
|
||||
"PO-Revision-Date: 2011-07-12 09:02+0100\n"
|
||||
"Last-Translator: magma <magma@mail.i2p>\n"
|
||||
"Language-Team: duck <duck@mail.i2p>\n"
|
||||
"Language: \n"
|
||||
@@ -18,15 +18,87 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n >= 2)\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:520
|
||||
#, java-format
|
||||
msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>."
|
||||
msgstr "Pour aller à la destination de votre base de données d''hôtes, cliquez <a href=\"{0}\">here</a>. Pour aller à la destination de l''aide d''adresse en conflit, cliquez <a href=\"{1}\">ici</a>."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:881
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Hôte"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:882
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Destination"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:887
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "Aller sur le site i2p {0} sans enregistrer dans un carnet d'adresses. "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:892
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr "Ajouter au carnet d''adresse du routeur {0} et aller sur le site i2p"
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:895
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr "Ajouter au carnet d''adresse principal {0} et aller sur le site i2p"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:896
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr "Ajouter au carnet d''adresse privé {0} et aller sur le site i2p"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1052
|
||||
msgid "Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr "Cliquez sur un des liens ci-dessous pour chercher une aide d'adresse en utilisant un \"service de saut\":"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1270
|
||||
msgid "Added via address helper"
|
||||
msgstr "Ajouté via assitant d'adresse"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1294
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "Redirection vers {0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1300
|
||||
msgid "Router Console"
|
||||
msgstr "Console du routeur"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
msgid "Addressbook"
|
||||
msgstr "Carnet d'adresses"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
msgid "Configuration"
|
||||
msgstr "Configuration"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
msgid "Help"
|
||||
msgstr "Aide"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1306
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "{0} ajouté au carnet d''adresses {1}. Redirection en cours."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1307
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "{0} non ajouté au carnet d''adresses {1}. Redirection en cours."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1309
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "Cliquez ici si vous n'êtes pas redirigé automatiquement."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
msgid "internal"
|
||||
@@ -376,12 +448,6 @@ msgstr "pour les connexions de demandes/réponses"
|
||||
msgid "Router I2CP Address"
|
||||
msgstr "Adresse I2CP du routeur"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Hôte"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
@@ -749,10 +815,6 @@ msgstr "Pause"
|
||||
msgid "Outproxy"
|
||||
msgstr "Mandataire sortant"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Destination"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
|
||||
msgid "none"
|
||||
msgstr "aucun"
|
||||
|
||||
883
apps/i2ptunnel/locale/messages_it.po
Normal file
883
apps/i2ptunnel/locale/messages_it.po
Normal file
@@ -0,0 +1,883 @@
|
||||
# I2P
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the i2ptunnel package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# <jokjok@hotmail.it>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-09-23 19:47+0000\n"
|
||||
"PO-Revision-Date: 2011-08-29 19:19+0000\n"
|
||||
"Last-Translator: mkkid <jokjok@hotmail.it>\n"
|
||||
"Language-Team: Italian (http://www.transifex.net/projects/p/I2P/team/it/)\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr "Questa non sembra essere una buona destinazione :"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr "i2paddresshelper non ti può aiutare con una destinazione del genere!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your host database, click <a href=\"{0}\">here</"
|
||||
"a>. To visit the conflicting addresshelper destination, click <a href="
|
||||
"\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
"Per visitare la destinazione nel tuo database host, cliccare <a href="
|
||||
"\"{0}\">qui</a>. Per visitare la destinazione addresshelper conflittuale, "
|
||||
"cliccare <a href=\"{1}\">qui</a>."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Host"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Destinazione"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "Continua a {0} senza salvare"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr "Salva {0} nella rubrica del router e continua per eepsite"
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr "Salva {0} nella rubrica master e continua per eepsite"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr "Salva {0} nella rubrica privata e continua per eepsite"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr ""
|
||||
"Cliccare un link sotto per cercare un address helper usando un servizio di "
|
||||
"\"jump\":"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
|
||||
msgid "Added via address helper"
|
||||
msgstr "Indirizzo via address helper"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "Redirezionamento a {0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
|
||||
msgid "Router Console"
|
||||
msgstr "Console del Router"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Addressbook"
|
||||
msgstr "Rubrica"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Configuration"
|
||||
msgstr "Configurazione"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Help"
|
||||
msgstr "Aiuto"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "{0} salvato sulla rubrica {1}, in redirezionamento."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "Salvataggio di {0} sulla rubrica {1} fallito, in redirezionamento."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "Clicca qui se non sei redirezionato automaticamente."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:332
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:342
|
||||
msgid "internal"
|
||||
msgstr "interno"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr ""
|
||||
"Sottomissione del form invalida, probabilmente perchè hai usato il bottone "
|
||||
"'indietro' o 'aggiorna' del tuo browser. Prego risottomettere."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
msgstr "Configurazione ricaricata per tutti i tunnel"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
|
||||
msgid "Starting tunnel"
|
||||
msgstr "Tunnel di partenza"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
|
||||
msgid "Stopping tunnel"
|
||||
msgstr "Tunnel di stop"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
msgid "Configuration changes saved"
|
||||
msgstr "Cambiamenti alla configurazione salvati"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Fallimento nel salvataggio della configurazione"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
|
||||
msgid "New Tunnel"
|
||||
msgstr "Nuovo Tunnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
|
||||
msgid "Standard client"
|
||||
msgstr "Client standard"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
|
||||
msgid "HTTP client"
|
||||
msgstr "Client HTTP"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
|
||||
msgid "IRC client"
|
||||
msgstr "Client IRC"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
|
||||
msgid "Standard server"
|
||||
msgstr "Server standard"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
|
||||
msgid "HTTP server"
|
||||
msgstr "Server HTTP"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
|
||||
msgid "SOCKS 4/4a/5 proxy"
|
||||
msgstr "SOCKS 4/4a/5 proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
|
||||
msgid "SOCKS IRC proxy"
|
||||
msgstr "SOCKS IRC proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
|
||||
msgid "CONNECT/SSL/HTTPS proxy"
|
||||
msgstr "CONNECT/SSL/HTTPS proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
|
||||
msgid "IRC server"
|
||||
msgstr "Server IRC"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
|
||||
msgid "Streamr client"
|
||||
msgstr "Client streamr"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
|
||||
msgid "Streamr server"
|
||||
msgstr "Server streamr"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
|
||||
msgid "HTTP bidir"
|
||||
msgstr "HTTP bidir"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr "Host non impostato"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr "Porta non impostata"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
|
||||
msgid "I2P Tunnel Manager - Edit Client Tunnel"
|
||||
msgstr "Gestore Tunnel I2P - Modifica Tunnel Client"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
|
||||
msgid "Edit proxy settings"
|
||||
msgstr "Modifica impostazioni proxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
|
||||
msgid "New proxy settings"
|
||||
msgstr "Nuove impostazioni proxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
|
||||
msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
|
||||
msgid "Type"
|
||||
msgstr "Tipo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
|
||||
msgid "Description"
|
||||
msgstr "Descrizione"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
|
||||
msgid "Target"
|
||||
msgstr "Obiettivo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
|
||||
msgid "Access Point"
|
||||
msgstr "Punto di Accesso"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
|
||||
msgid "required"
|
||||
msgstr "richiesto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
|
||||
msgid "Reachable by"
|
||||
msgstr "Raggiungibile da"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
|
||||
msgid "Outproxies"
|
||||
msgstr "Outproxies"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
|
||||
msgid "Tunnel Destination"
|
||||
msgstr "Tunnel Destinazione"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
|
||||
msgid "name or destination"
|
||||
msgstr "nome o destinazione"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
|
||||
msgid "b32 not recommended"
|
||||
msgstr "b32 non consigliato"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
|
||||
msgid "Shared Client"
|
||||
msgstr "Client Condiviso"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
|
||||
msgid ""
|
||||
"(Share tunnels with other clients and irc/httpclients? Change requires "
|
||||
"restart of client proxy)"
|
||||
msgstr ""
|
||||
"(Condividere tunnel con altri client e client irc/http? Il cambiamento "
|
||||
"richiede il riavvio del proxy client)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
|
||||
msgid "Auto Start"
|
||||
msgstr "Avvio Automatico"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
|
||||
msgid "(Check the Box for 'YES')"
|
||||
msgstr "(Seleziona il Box per 'SI')"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid "Enable DCC"
|
||||
msgstr "Abilita DCC"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr "Opzioni di rete avanzate"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
|
||||
msgid ""
|
||||
"(NOTE: when this client proxy is configured to share tunnels, then these "
|
||||
"options are for all the shared proxy clients!)"
|
||||
msgstr ""
|
||||
"(NOTA: quando questo proxy client è configurato per condividere tunnel, "
|
||||
"queste opzioni valgono per tutti i client proxy condivisi!)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
msgid "Tunnel Options"
|
||||
msgstr "Opzioni Tunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
|
||||
msgid "Length"
|
||||
msgstr "Lunghezza"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
|
||||
msgid "0 hop tunnel (low anonymity, low latency)"
|
||||
msgstr "0 hop tunnel (anonimato basso, latenza bassa)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
|
||||
msgid "1 hop tunnel (medium anonymity, medium latency)"
|
||||
msgstr "1 hop tunnel (anonimato medio, latenza media)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
|
||||
msgid "2 hop tunnel (high anonymity, high latency)"
|
||||
msgstr "2 hop tunnel (anonimato alto, latenza alta)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
|
||||
msgid "3 hop tunnel (very high anonymity, poor performance)"
|
||||
msgstr "3 hop tunnel (anonimato molto alto, prestazioni basse)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
|
||||
msgid "hop tunnel (very poor performance)"
|
||||
msgstr "hop tunnel (prestazioni molto basse)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
|
||||
msgid "Variance"
|
||||
msgstr "Varianza"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
|
||||
msgid "0 hop variance (no randomisation, consistant performance)"
|
||||
msgstr "0 hop varianza (nessuna randomizzazione, prestazioni coerenti)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
|
||||
msgid ""
|
||||
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
"+ 0-1 hop varianza (randomizzazione additiva media, prestazioni sottrattive)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
|
||||
msgid ""
|
||||
"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr ""
|
||||
"+ 0-2 hop varianza (randomizzazione additiva alta, prestazioni sottrattive)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
|
||||
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
|
||||
msgstr "+/- 0-1 hop varianza (randomizzazione standard, prestazioni standard)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
|
||||
msgid "+/- 0-2 hop variance (not recommended)"
|
||||
msgstr "+/- 0-2 hop varianza (non consigliata)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
|
||||
msgid "hop variance"
|
||||
msgstr "hop varianza"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
|
||||
msgid "Count"
|
||||
msgstr "Conteggio"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
|
||||
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
|
||||
msgstr ""
|
||||
"1 tunnel in entrata, 1 tunnel in uscita (utilizzo di banda basso, "
|
||||
"affidabilità minore)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
|
||||
msgid ""
|
||||
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
|
||||
"reliability)"
|
||||
msgstr ""
|
||||
"2 tunnel in entrata, 2 tunnel in uscita (utilizzo di banda standard, "
|
||||
"affidabilità standard)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
|
||||
msgid ""
|
||||
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr ""
|
||||
"3 tunnel in entrata, 3 tunnel in uscita (utilizzo di banda maggiore, "
|
||||
"affidabilità maggiore)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
|
||||
msgid "tunnels"
|
||||
msgstr "tunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
|
||||
msgid "Backup Count"
|
||||
msgstr "Conteggio Backup"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
|
||||
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
|
||||
msgstr ""
|
||||
"0 tunnel di backup (ridondanza zero, nessun utilizzo di risorse aggiuntivo)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
|
||||
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
|
||||
msgstr ""
|
||||
"1 tunnel di backup in ogni direzione (ridondanza bassa, utilizzo di risorse "
|
||||
"basso)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
|
||||
msgid ""
|
||||
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr ""
|
||||
"2 tunnel di backup in ogni direzione (ridondanza media, utilizzo di risorse "
|
||||
"medio)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
|
||||
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
|
||||
msgstr ""
|
||||
"3 tunnel di backup in ogni direzione (ridondanza alta, utilizzo di risorse "
|
||||
"alto)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
|
||||
msgid "backup tunnels"
|
||||
msgstr "tunnel di backup"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
|
||||
msgid "Profile"
|
||||
msgstr "Profilo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
|
||||
msgid "interactive connection"
|
||||
msgstr "connessione interattiva"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
|
||||
msgid "bulk connection (downloads/websites/BT)"
|
||||
msgstr "connessione di massa (download/siti web/BT)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
msgid "Delay Connect"
|
||||
msgstr "Ritarda Connessione"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
|
||||
msgid "for request/response connections"
|
||||
msgstr "per connessioni richiesta/risposta"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
|
||||
msgid "Router I2CP Address"
|
||||
msgstr "Indirizzo I2CP Router"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
|
||||
msgid "Port"
|
||||
msgstr "Porta"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
|
||||
msgid "Reduce tunnel quantity when idle"
|
||||
msgstr "Riduci la quantità di tunnel quando inattivo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
|
||||
msgid "Enable"
|
||||
msgstr "Abilita"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
|
||||
msgid "Reduced tunnel count"
|
||||
msgstr "Conteggio tunnel ridotti"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
|
||||
msgid "Idle minutes"
|
||||
msgstr "Minuti di inattività"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
msgid "Close tunnels when idle"
|
||||
msgstr "Chiudi i tunnel quando inattivo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
msgid "New Keys on Reopen"
|
||||
msgstr "Nuove Chiavi alla Riapertura"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
|
||||
msgid "Disable"
|
||||
msgstr "Disabilita"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
msgid "Delay tunnel open until required"
|
||||
msgstr "Ritarda l'apertura di tunnel fino a che non viene richiesta"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
msgid "Persistent private key"
|
||||
msgstr "Chiave privata persistente"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466
|
||||
msgid "File"
|
||||
msgstr "File"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
|
||||
msgid "Local destination"
|
||||
msgstr "Destinazione locale"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
|
||||
msgid "(if known)"
|
||||
msgstr "(se conosciuto)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
msgid "Local Authorization"
|
||||
msgstr "Autorizzazione Locale"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
|
||||
msgid "Username"
|
||||
msgstr "Nome Utente"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
|
||||
msgid "Password"
|
||||
msgstr "Password"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
msgid "Outproxy Authorization"
|
||||
msgstr "Autorizzazione Outproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
msgid "Jump URL List"
|
||||
msgstr "Lista URL Salto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
|
||||
msgid "Custom options"
|
||||
msgstr "Opzioni personalizzate"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
|
||||
msgid ""
|
||||
"NOTE: If tunnel is currently running, most changes will not take effect "
|
||||
"until tunnel is stopped and restarted."
|
||||
msgstr ""
|
||||
"NOTA: Se il tunnel è correntemente in funzione, la maggiorparte dei "
|
||||
"cambiamenti non avrà effetto finchè il tunnel non verrà fermato e riavviato."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
msgid "Cancel"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
|
||||
msgid "Delete"
|
||||
msgstr "Elimina"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
|
||||
msgid "Save"
|
||||
msgstr "Salva"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
|
||||
msgid "I2P Tunnel Manager - Edit Server Tunnel"
|
||||
msgstr "Gestore Tunnel I2P - Modifica Tunnel Server"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
|
||||
msgid "Edit server settings"
|
||||
msgstr "Modifica impostazioni server"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
|
||||
msgid "New server settings"
|
||||
msgstr "Nuove impostazioni server"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
|
||||
msgid "Website name"
|
||||
msgstr "Nome sito web"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
|
||||
msgid "(leave blank for outproxies)"
|
||||
msgstr "(lascia vuoto per gli outproxy)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
|
||||
msgid "Private key file"
|
||||
msgstr "File chiave privata"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
|
||||
msgid "Add to local addressbook"
|
||||
msgstr "Aggiungi alla rubrica locale"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
|
||||
msgid "Hostname Signature"
|
||||
msgstr "Firma Hostname"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
|
||||
msgid "Encrypt Leaseset"
|
||||
msgstr "Cifra Leaseset"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
|
||||
msgid "Encryption Key"
|
||||
msgstr "Chiave cifratura"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
|
||||
msgid "Generate New Key"
|
||||
msgstr "Genera Nuova Chiave"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
|
||||
msgid "Generate"
|
||||
msgstr "Genera"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
|
||||
msgid "(Tunnel must be stopped first)"
|
||||
msgstr "(Il tunnel deve prima essere fermato)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
|
||||
msgid "Restricted Access List"
|
||||
msgstr "Lista di Accesso Ristretto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
|
||||
msgid "Whitelist"
|
||||
msgstr "Whitelist"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
|
||||
msgid "Blacklist"
|
||||
msgstr "Blacklist"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
|
||||
msgid "Access List"
|
||||
msgstr "Lista di Accesso"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
|
||||
msgid "Inbound connection limits (0=unlimited)"
|
||||
msgstr "Limite di connessioni in ingresso (0=illimitate)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
|
||||
msgid "Per client"
|
||||
msgstr "Per client"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
|
||||
msgid "Per minute"
|
||||
msgstr "Per minuto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
|
||||
msgid "Per hour"
|
||||
msgstr "Per ora"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
|
||||
msgid "Per day"
|
||||
msgstr "Per giorno"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
|
||||
msgid "Total"
|
||||
msgstr "Totale"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
|
||||
msgid "Max concurrent connections (0=unlimited)"
|
||||
msgstr "Massimo numero di connessioni concorrenti (0=illimitate)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
|
||||
msgid "New Certificate type"
|
||||
msgstr "Nuovo tipo di Certificato"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
|
||||
msgid "None"
|
||||
msgstr "Nessun"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
|
||||
msgid "Hashcash (effort)"
|
||||
msgstr "Hashcash (sforzo)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
|
||||
msgid "Hashcash Calc Time"
|
||||
msgstr "Tempo Hashcash Calc"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
|
||||
msgid "Estimate"
|
||||
msgstr "Stima"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
|
||||
msgid "Hidden"
|
||||
msgstr "Nascosto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
|
||||
msgid "Signed (signed by)"
|
||||
msgstr "Firmato (firmato da)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
|
||||
msgid "Modify Certificate"
|
||||
msgstr "Modifica Certificato"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
|
||||
msgid "Modify"
|
||||
msgstr "Modifica"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74
|
||||
msgid "I2P Tunnel Manager - List"
|
||||
msgstr "Gestore Tunnel I2P - Lista"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86
|
||||
msgid "Status Messages"
|
||||
msgstr "Messaggi di stato"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90
|
||||
msgid "Refresh"
|
||||
msgstr "Ricarica"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
|
||||
msgid "Stop All"
|
||||
msgstr "Ferma Tutto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
|
||||
msgid "Start All"
|
||||
msgstr "Avvia Tutto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
|
||||
msgid "Restart All"
|
||||
msgstr "Riavvia Tutto"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
|
||||
msgid "Reload Config"
|
||||
msgstr "Ricarica Configurazione"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
|
||||
msgid "I2P Server Tunnels"
|
||||
msgstr "Tunnel Server I2P"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
|
||||
msgid "Points at"
|
||||
msgstr "Punti a"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
|
||||
msgid "Preview"
|
||||
msgstr "Anteprima"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
|
||||
msgid "Status"
|
||||
msgstr "Stato"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
|
||||
msgid "Base32 Address"
|
||||
msgstr "Indirizzo Base32"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
|
||||
msgid "No Preview"
|
||||
msgstr "Nessuna Anteprima"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
msgid "Starting..."
|
||||
msgstr "In Avvio..."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
|
||||
msgid "Stop"
|
||||
msgstr "Ferma"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
|
||||
msgid "Running"
|
||||
msgstr "In Funzione"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
|
||||
msgid "Stopped"
|
||||
msgstr "Fermato"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
|
||||
msgid "Start"
|
||||
msgstr "Avvio"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
|
||||
msgid "New server tunnel"
|
||||
msgstr "Nuovo server tunnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
|
||||
msgid "Standard"
|
||||
msgstr "Standard"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
|
||||
msgid "Create"
|
||||
msgstr "Crea"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
|
||||
msgid "I2P Client Tunnels"
|
||||
msgstr "Tunnel Client I2P"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
|
||||
msgid "Interface"
|
||||
msgstr "Interfaccia"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
|
||||
msgid "Standby"
|
||||
msgstr "Standby"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
|
||||
msgid "Outproxy"
|
||||
msgstr "Outproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
|
||||
msgid "none"
|
||||
msgstr "nessun"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
|
||||
msgid "New client tunnel"
|
||||
msgstr "Nuovo tunnel client"
|
||||
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2ptunnel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-06-18 14:08+0000\n"
|
||||
"PO-Revision-Date: 2011-06-20 22:55+0500\n"
|
||||
"POT-Creation-Date: 2011-10-07 16:06+0000\n"
|
||||
"PO-Revision-Date: 2011-10-07 23:21+0500\n"
|
||||
"Last-Translator: Hidden Z <hiddenz@mail.i2p>\n"
|
||||
"Language-Team: foo <foo@bar>\n"
|
||||
"Language: \n"
|
||||
@@ -18,176 +18,184 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-Language: Russian\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:514
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr "Это плохой адрес:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr "С таким адресом назначения i2paddresshelper вам не поможет!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
|
||||
#, java-format
|
||||
msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>."
|
||||
msgstr "Для перехода по ссылке из локальной адресной книги, нажмите <a href=\"{0}\">здесь</a>. Для перехода по новой addresshelper-ссылке, нажмите <a href=\"{1}\">здесь</a>."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:875
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Адрес"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:876
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Адрес назначения"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:881
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "Продолжить переход к {0} без сохранения"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:886
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr "Сохранить {0} в адресную книгу роутера (router address book) и продолжить переход к eep-сайту"
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:889
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr "Сохранить {0} в основную (master) адресную книгу и продолжить переход к eep-сайту"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:890
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr "Сохранить {0} в приватную адресную книгу и продолжить переход к eep-сайту"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
|
||||
msgid "Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr "Jump-сервисы, которые, возможно, знают нужную Вам addresshelper-ссылку:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1262
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
|
||||
msgid "Added via address helper"
|
||||
msgstr "Добавлен через address helper"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1286
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "Перенаправляем к {0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1292
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
|
||||
msgid "Router Console"
|
||||
msgstr "Консоль маршрутизатора I2P"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Addressbook"
|
||||
msgstr "Адресная книга"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Configuration"
|
||||
msgstr "Настройки"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Help"
|
||||
msgstr "Помощь"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1298
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "{0} сохранён в {1}, перенаправляем."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1299
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "Не удалось сохранить {0} в {1} адресную книгу, перенаправляем."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "Нажмите сюда если автоматическое перенаправление не сработало"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:332
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:342
|
||||
msgid "internal"
|
||||
msgstr "внутренний"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
|
||||
msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
|
||||
msgstr "Неправильно переданная форма, возможно вы использовали действие браузера \"назад\" или \"обновить\". Пожалуйста повторите попытку."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
msgstr "Конфигурация для всех туннелей перечитана"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
|
||||
msgid "Starting tunnel"
|
||||
msgstr "Запуск туннеля"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
|
||||
msgid "Stopping tunnel"
|
||||
msgstr "Остановка туннеля"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
msgid "Configuration changes saved"
|
||||
msgstr "Настройки сохранены"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Не удалось сохранить настройки"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
|
||||
msgid "New Tunnel"
|
||||
msgstr "Новый туннель"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
|
||||
msgid "Standard client"
|
||||
msgstr "Обычный клиент"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
|
||||
msgid "HTTP client"
|
||||
msgstr "HTTP-клиент"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
|
||||
msgid "IRC client"
|
||||
msgstr "IRC-клиент"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
|
||||
msgid "Standard server"
|
||||
msgstr "Обычный сервер"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
|
||||
msgid "HTTP server"
|
||||
msgstr "HTTP-сервер"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
|
||||
msgid "SOCKS 4/4a/5 proxy"
|
||||
msgstr "SOCKS 4/4a/5 прокси"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
|
||||
msgid "SOCKS IRC proxy"
|
||||
msgstr "SOCKS IRC прокси"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
|
||||
msgid "CONNECT/SSL/HTTPS proxy"
|
||||
msgstr "CONNECT/SSL/HTTPS прокси"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
|
||||
msgid "IRC server"
|
||||
msgstr "IRC-сервер"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
|
||||
msgid "Streamr client"
|
||||
msgstr "Streamr-клиент"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
|
||||
msgid "Streamr server"
|
||||
msgstr "Streamr-сервер"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
|
||||
msgid "HTTP bidir"
|
||||
msgstr "HTTP bidir (экспериментальный двунаправленный режим, инструкцию спрашивайте у sponge)"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr "Хост не задан"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr "Порт не задан"
|
||||
@@ -282,173 +290,178 @@ msgid "Auto Start"
|
||||
msgstr "Автозапуск"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
|
||||
msgid "(Check the Box for 'YES')"
|
||||
msgstr "(поставьте галочку для включения)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid "Enable DCC"
|
||||
msgstr "Включить DCC"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr "Расширенные сетевые настройки"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
|
||||
msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
|
||||
msgstr "(ПРИМЕЧАНИЕ: при коллективном использовании туннелей эти опции будут применяться ко всем коллективным прокси-клиентам!)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
msgid "Tunnel Options"
|
||||
msgstr "Параметры туннеля"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
|
||||
msgid "Length"
|
||||
msgstr "Длина"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
|
||||
msgid "0 hop tunnel (low anonymity, low latency)"
|
||||
msgstr "0 хопов (низкая анонимность, малые задержки)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
|
||||
msgid "1 hop tunnel (medium anonymity, medium latency)"
|
||||
msgstr "1 хоп (умеренная анонимность, умеренные задержки)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
|
||||
msgid "2 hop tunnel (high anonymity, high latency)"
|
||||
msgstr "2 хопа (высокая анонимность, высокие задержки)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
|
||||
msgid "3 hop tunnel (very high anonymity, poor performance)"
|
||||
msgstr "3 хопа (очень высокая анонимность, низкая производительность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
|
||||
msgid "hop tunnel (very poor performance)"
|
||||
msgstr "хопов (очень низкая производительность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
|
||||
msgid "Variance"
|
||||
msgstr "Разброс"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
|
||||
msgid "0 hop variance (no randomisation, consistant performance)"
|
||||
msgstr "нулевой разброс (без рандомизации, фиксированная производительность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
|
||||
msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr "+ 0-1 разброс (умеренно повышенная рандомизация, пониженная производительность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
|
||||
msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr "+ 0-2 разброс (сильно повышенная рандомизация, пониженная производительность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
|
||||
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
|
||||
msgstr "+/- 0-1 разброс (стандартная рандомизация, стандартная производительность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
|
||||
msgid "+/- 0-2 hop variance (not recommended)"
|
||||
msgstr "+/- 0-2 разброс (не рекомендуется)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
|
||||
msgid "hop variance"
|
||||
msgstr "разброс"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
|
||||
msgid "Count"
|
||||
msgstr "Количество"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
|
||||
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
|
||||
msgstr "1 входящий, 1 исходящий туннель (низкая пропускная способность, низкая надежность) "
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
|
||||
msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
|
||||
msgstr "2 входящих, 2 исходящих туннеля (стандартная пропускная способность, стандартная надежность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
|
||||
msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
msgstr "3 входящих, 3 исходящих туннеля (высокая пропускная способность, высокая надежность)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
|
||||
msgid "tunnels"
|
||||
msgstr "туннелей"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
|
||||
msgid "Backup Count"
|
||||
msgstr "Резервное количество"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
|
||||
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
|
||||
msgstr "без резервных туннелей (отсутствие избыточности, отсутствие дополнительной нагрузки на систему)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
|
||||
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
|
||||
msgstr "1 резервный туннель в каждом направлении (низкая избыточность, низкая нагрузка на систему)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
|
||||
msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
msgstr "2 резервных туннеля в каждом направлении (умеренная избыточность, умеренная нагрузка на систему)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
|
||||
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
|
||||
msgstr "3 резервных туннеля в каждом направлении (высокая избыточность, высокая нагрузка на систему)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
|
||||
msgid "backup tunnels"
|
||||
msgstr "резервных туннелей"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
|
||||
msgid "Profile"
|
||||
msgstr "Режим"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
|
||||
msgid "interactive connection"
|
||||
msgstr "оптимизировать для малых задержек (irc)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
|
||||
msgid "bulk connection (downloads/websites/BT)"
|
||||
msgstr "оптимизировать для большого обьема (www/bittorrent)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
msgid "Delay Connect"
|
||||
msgstr "Задержка соединения"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
|
||||
msgid "for request/response connections"
|
||||
msgstr "оптимизация для соединений, начинающихся с запроса клиента/ответа сервера"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
|
||||
msgid "Router I2CP Address"
|
||||
msgstr "I2CP Адрес Роутера"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
@@ -456,111 +469,111 @@ msgstr "I2CP Адрес Роутера"
|
||||
msgid "Port"
|
||||
msgstr "Порт"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
|
||||
msgid "Reduce tunnel quantity when idle"
|
||||
msgstr "Снижать количество туннелей при простое"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
|
||||
msgid "Enable"
|
||||
msgstr "Включить"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
|
||||
msgid "Reduced tunnel count"
|
||||
msgstr "Количество туннелей"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
|
||||
msgid "Idle minutes"
|
||||
msgstr "Минут простоя"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
msgid "Close tunnels when idle"
|
||||
msgstr "Закрыть туннели при простое"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
msgid "New Keys on Reopen"
|
||||
msgstr "Генерировать новый ключ при переоткрытии"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
|
||||
msgid "Disable"
|
||||
msgstr "Выключить"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
msgid "Delay tunnel open until required"
|
||||
msgstr "Отложить запуск до первого запроса"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
msgid "Persistent private key"
|
||||
msgstr "Постоянный секретный ключ"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466
|
||||
msgid "File"
|
||||
msgstr "Файл"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
|
||||
msgid "Local destination"
|
||||
msgstr "Локальный адрес назначения"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
|
||||
msgid "(if known)"
|
||||
msgstr "(если известен)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
msgid "Local Authorization"
|
||||
msgstr "Локальная авторизация"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
|
||||
msgid "Username"
|
||||
msgstr "Имя пользователя"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
msgid "Outproxy Authorization"
|
||||
msgstr "Авторизация outproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
msgid "Jump URL List"
|
||||
msgstr "Список адресов jump-сервисов"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
|
||||
msgid "Custom options"
|
||||
msgstr "Дополнительные параметры"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
|
||||
msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
|
||||
msgstr "ПРИМЕЧАНИЕ: для вступления в силу измененных настроек потребуется остановка и перезапуск туннеля"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
msgid "Cancel"
|
||||
msgstr "Отмена"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
|
||||
msgid "Save"
|
||||
msgstr "Сохранить"
|
||||
|
||||
@@ -2,46 +2,126 @@
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the i2ptunnel package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
|
||||
"POT-Creation-Date: 2011-05-24 06:00+0000\n"
|
||||
"PO-Revision-Date: 2011-06-03 17:14+0000\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-09-23 19:52+0000\n"
|
||||
"PO-Revision-Date: 2011-08-26 09:28+0000\n"
|
||||
"Last-Translator: digitalmannen <digitalmannen@gmail.com>\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.net/projects/p/I2P/team/sv_SE/)\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.net/projects/p/I2P/"
|
||||
"team/sv_SE/)\n"
|
||||
"Language: sv_SE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: sv_SE\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr "Detta verkar vara ett felaktigt mål"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr "i2padresshjälp kan inte hjälpa dig med ett sådant mål!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your host database, click <a "
|
||||
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
|
||||
"click <a href=\"{1}\">here</a>."
|
||||
"To visit the destination in your host database, click <a href=\"{0}\">here</"
|
||||
"a>. To visit the conflicting addresshelper destination, click <a href="
|
||||
"\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
"För att besöka målet i din värd databas href=\"{0}\"> klicka <a här </ a>. "
|
||||
"För att besöka de motstridiga hjälpaddresserna,<a href=\"{1}\"> klicka <a "
|
||||
"här </ a>."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" "
|
||||
"service:"
|
||||
msgstr ""
|
||||
"Klicka på en länk nedan för att söka efter en hjälpaddress genom att använda"
|
||||
" en \"hopp\" tjänst"
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Värd"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Mål"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "Fortsätt till {0} utan att spara"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr "Spara {0} till routeradressboken och fortsätt till eepsite "
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr "Spara {0} till huvudadressboken och fortsätt till eepsite "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr "Spara {0} till privatadressbok och fortsätt till eepsite "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr ""
|
||||
"Klicka på en länk nedan för att söka efter en hjälpaddress genom att använda "
|
||||
"en \"hopp\" tjänst"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
|
||||
msgid "Added via address helper"
|
||||
msgstr "Tillagd via adresshjälpen "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "Om dirigerar till {0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
|
||||
msgid "Router Console"
|
||||
msgstr "Router konsol "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Addressbook"
|
||||
msgstr "Adressbok"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Configuration"
|
||||
msgstr "Konfiguration"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
|
||||
msgid "Help"
|
||||
msgstr "Hjälp"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "Spara {0} till {1}adressboken, omdirigerar nu "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "Misslyckades med att spara {0} till {1}adressboken, omdirigerar nu "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "Klicka här om du inte omdirigeras automatiskt "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:332
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:342
|
||||
msgid "internal"
|
||||
msgstr "Intern "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
@@ -49,86 +129,86 @@ msgstr ""
|
||||
"Ogiltigt formulärbegäran, beror troligtvis på attt du använde 'tillbaka' "
|
||||
"eller 'uppdatera' knappen. Försök att skicka igen"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
msgstr "Konfigurationen uppdateras för alla tunnlar"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
|
||||
msgid "Starting tunnel"
|
||||
msgstr "Startar tunnel"
|
||||
|
||||
#. and give them something to look at in any case
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
|
||||
msgid "Stopping tunnel"
|
||||
msgstr "Stannar tunnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
msgid "Configuration changes saved"
|
||||
msgstr "Konfigurationsändringar sparas"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
|
||||
msgid "Failed to save configuration"
|
||||
msgstr "Det gick inte att spara konfigurationen"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
|
||||
msgid "New Tunnel"
|
||||
msgstr "Ny tunnel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
|
||||
msgid "Standard client"
|
||||
msgstr "Standard klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
|
||||
msgid "HTTP client"
|
||||
msgstr "HTTP-klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
|
||||
msgid "IRC client"
|
||||
msgstr "IRC-klient"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
|
||||
msgid "Standard server"
|
||||
msgstr "Standard server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
|
||||
msgid "HTTP server"
|
||||
msgstr "HTTP server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
|
||||
msgid "SOCKS 4/4a/5 proxy"
|
||||
msgstr "SOCKS 4/4a/5 proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
|
||||
msgid "SOCKS IRC proxy"
|
||||
msgstr "SOCKS IRC proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
|
||||
msgid "CONNECT/SSL/HTTPS proxy"
|
||||
msgstr "CONNECT/SSL/HTTPS proxy"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
|
||||
msgid "IRC server"
|
||||
msgstr "IRC-server"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
|
||||
msgid "Streamr client"
|
||||
msgstr "Klient för Streamr "
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
|
||||
msgid "Streamr server"
|
||||
msgstr "Server för Streamr"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
|
||||
msgid "HTTP bidir"
|
||||
msgstr "HTTP bidir"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr "Ingen värd angiven"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr "Ingen port angiven"
|
||||
@@ -227,108 +307,113 @@ msgid "Auto Start"
|
||||
msgstr "Starta automatiskt"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
|
||||
msgid "(Check the Box for 'YES')"
|
||||
msgstr "(Markera i boxen för 'Ja')"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
msgid "Enable DCC"
|
||||
msgstr "Aktivera DCC"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
|
||||
msgid "Advanced networking options"
|
||||
msgstr "Avancerade nätverks instälningar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
|
||||
msgid ""
|
||||
"(NOTE: when this client proxy is configured to share tunnels, then these "
|
||||
"options are for all the shared proxy clients!)"
|
||||
msgstr ""
|
||||
"(OBS: när denna klientproxyn är konfigurerad för att dela tunnlar, då gäller"
|
||||
" dessa alternativ för alla delade proxyklienter!)"
|
||||
"(OBS: när denna klientproxyn är konfigurerad för att dela tunnlar, då gäller "
|
||||
"dessa alternativ för alla delade proxyklienter!)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
msgid "Tunnel Options"
|
||||
msgstr "Tunnel alternativ"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
|
||||
msgid "Length"
|
||||
msgstr "Längd"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
|
||||
msgid "0 hop tunnel (low anonymity, low latency)"
|
||||
msgstr " 0 tunnel hopp (låg anonymitet, ingen fördröjning)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
|
||||
msgid "1 hop tunnel (medium anonymity, medium latency)"
|
||||
msgstr "1 tunnel hopp (medel anonymitet, medel fördröjning)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
|
||||
msgid "2 hop tunnel (high anonymity, high latency)"
|
||||
msgstr "2 tunnel hopp (hög anonymitet, hög fördröjning)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
|
||||
msgid "3 hop tunnel (very high anonymity, poor performance)"
|
||||
msgstr "3 tunnel hopp (mycket hög anonymitet, dålig prestanda)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
|
||||
msgid "hop tunnel (very poor performance)"
|
||||
msgstr "Tunnel hopp (mycket låg prestanda)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
|
||||
msgid "Variance"
|
||||
msgstr "Variation"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
|
||||
msgid "0 hop variance (no randomisation, consistant performance)"
|
||||
msgstr "0 hopp variation (ingen slumpmässighet, konstant prestanda)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
|
||||
msgid ""
|
||||
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
|
||||
msgstr "+ 0-1 hopp variation (medel slumpmässighet, minskad prestanda)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
|
||||
msgid ""
|
||||
"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
|
||||
msgstr "+ 0-2 hopp variation (ökad slumpmässighet, minskad prestanda)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
|
||||
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
|
||||
msgstr "+/- 0-1 hopp variation (standard slumpmässighet, standardprestanda)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
|
||||
msgid "+/- 0-2 hop variance (not recommended)"
|
||||
msgstr "+/- 0-2 hopp variation (inte rekommenderat)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
|
||||
msgid "hop variance"
|
||||
msgstr "hopp variation"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
|
||||
msgid "Count"
|
||||
msgstr "Antal"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
|
||||
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
|
||||
msgstr ""
|
||||
"1 inkommande, 1 utgående tunnlar (låg bandbreddsanvändning, låg "
|
||||
"tillförlitlighet)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
|
||||
msgid ""
|
||||
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
|
||||
@@ -337,7 +422,7 @@ msgstr ""
|
||||
"2 inkommande, 2 utgående tunnlar (normal bandbreddsanvändning, normal "
|
||||
"tillförlitlighet)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
|
||||
msgid ""
|
||||
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
|
||||
@@ -345,29 +430,28 @@ msgstr ""
|
||||
"3 inkommande, 3 utgående tunnlar (Högre bandbreddsanvändning, högre "
|
||||
"tillförlitlighet)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
|
||||
msgid "tunnels"
|
||||
msgstr "tunnlar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
|
||||
msgid "Backup Count"
|
||||
msgstr "Antal reserver"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
|
||||
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
|
||||
msgstr ""
|
||||
"0 reserv tunnlar i varje riktning (ingen redundans, ingen resursanvändning)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
|
||||
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
|
||||
msgstr ""
|
||||
"1 reserv tunnel i varje riktning (låg redundans, låg resursanvändning)"
|
||||
msgstr "1 reserv tunnel i varje riktning (låg redundans, låg resursanvändning)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
|
||||
msgid ""
|
||||
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
|
||||
@@ -375,52 +459,46 @@ msgstr ""
|
||||
"2 reserv tunnlar i varje riktning (medel hög redundans, medel hög "
|
||||
"resursanvändning)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
|
||||
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
|
||||
msgstr ""
|
||||
"3 reserv tunnlar i varje riktning (hög redundans, hög resursanvändning)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
|
||||
msgid "backup tunnels"
|
||||
msgstr "reserv tunnlar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
|
||||
msgid "Profile"
|
||||
msgstr "Profil"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
|
||||
msgid "interactive connection"
|
||||
msgstr "interaktiv anslutning"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
|
||||
msgid "bulk connection (downloads/websites/BT)"
|
||||
msgstr "bulk-anslutning (hämtningar/webbplatser/BT)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
msgid "Delay Connect"
|
||||
msgstr "Fördröj anslutning"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
|
||||
msgid "for request/response connections"
|
||||
msgstr "för förfrågan/svar-anslutningar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
|
||||
msgid "Router I2CP Address"
|
||||
msgstr "I2CP Routeradress"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "Värd"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
@@ -428,96 +506,96 @@ msgstr "Värd"
|
||||
msgid "Port"
|
||||
msgstr "Port"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
|
||||
msgid "Reduce tunnel quantity when idle"
|
||||
msgstr "Minska kvantitetn på tunnel vid inaktivitet"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
|
||||
msgid "Enable"
|
||||
msgstr "Aktivera"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
|
||||
msgid "Reduced tunnel count"
|
||||
msgstr "Minska antal tunnlar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
|
||||
msgid "Idle minutes"
|
||||
msgstr "Inaktiv i minuter"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
|
||||
msgid "Close tunnels when idle"
|
||||
msgstr "Stäng tunnlar vid inaktivitet"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
|
||||
msgid "New Keys on Reopen"
|
||||
msgstr "Nya nycklar vid återöppnade"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
|
||||
msgid "Disable"
|
||||
msgstr "Inaktivera"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
msgid "Delay tunnel open until required"
|
||||
msgstr "Avvakta med att öppna tunnlar tills de behövs"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
msgid "Persistent private key"
|
||||
msgstr "Beständig privat nyckel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466
|
||||
msgid "File"
|
||||
msgstr "Fil"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
|
||||
msgid "Local destination"
|
||||
msgstr "Lokalt mål"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
|
||||
msgid "(if known)"
|
||||
msgstr "(om känd)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
msgid "Local Authorization"
|
||||
msgstr "Lokala tillstånd"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
|
||||
msgid "Username"
|
||||
msgstr "Användarnamn"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
|
||||
msgid "Password"
|
||||
msgstr "Lösenord"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
|
||||
msgid "Outproxy Authorization"
|
||||
msgstr "Tillstånd för utproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
msgid "Jump URL List"
|
||||
msgstr "Hopp lista för URLer"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
|
||||
msgid "Custom options"
|
||||
msgstr "Anpassade alternativ"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
|
||||
msgid ""
|
||||
"NOTE: If tunnel is currently running, most changes will not take effect "
|
||||
@@ -526,17 +604,17 @@ msgstr ""
|
||||
"OBS: Om tunneln är igång, kommer de flesta ändringarna inte att träda i "
|
||||
"kraft förrän tunneln stoppats och startats om."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
msgid "Cancel"
|
||||
msgstr "Avbryt"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
|
||||
msgid "Delete"
|
||||
msgstr "Radera"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
|
||||
msgid "Save"
|
||||
msgstr "Spara"
|
||||
@@ -791,10 +869,6 @@ msgstr "Standby"
|
||||
msgid "Outproxy"
|
||||
msgstr "Utproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "Mål"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
|
||||
msgid "none"
|
||||
msgstr "Ingen"
|
||||
@@ -802,5 +876,3 @@ msgstr "Ingen"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
|
||||
msgid "New client tunnel"
|
||||
msgstr "Ny klienttunnel"
|
||||
|
||||
|
||||
|
||||
@@ -2,39 +2,110 @@
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the i2ptunnel package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
# foo <foo@bar>, 2009.
|
||||
#
|
||||
#
|
||||
# ducki2p <ducki2p@gmail.com>, 2011.
|
||||
# <walking@i2pmail.org>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2ptunnel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-03-03 18:29+0000\n"
|
||||
"PO-Revision-Date: 2011-02-12 20:07+0800\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: foo <foo@bar>\n"
|
||||
"Language: \n"
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
|
||||
"POT-Creation-Date: 2011-06-11 08:23+0000\n"
|
||||
"PO-Revision-Date: 2011-08-20 06:00+0000\n"
|
||||
"Last-Translator: walking <walking@i2pmail.org>\n"
|
||||
"Language-Team: Chinese (China) (http://www.transifex.net/projects/p/I2P/team/zh_CN/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-Language: Chinese\n"
|
||||
"Language: zh_CN\n"
|
||||
"Plural-Forms: nplurals=1; plural=0\n"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:514
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your host database, click <a href=\"{0}\">here</"
|
||||
"a>. To visit the conflicting addresshelper destination, click <a href="
|
||||
"\"{1}\">here</a>."
|
||||
"To visit the destination in your host database, click <a "
|
||||
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
|
||||
"click <a href=\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
"域名冲突:要访问您本地【地址簿】中设置的目标主机(相当与IP),请点击<a href="
|
||||
"\"{0}\">这里</a>。要访问【地址助手】返回的目标主机请点<a href=\"{1}\">这里</"
|
||||
"a>。"
|
||||
"域名冲突:要访问您本地【地址簿】中设置的目标主机(相当与IP),请点击<a "
|
||||
"href=\"{0}\">这里</a>。要访问【地址助手】返回的目标主机请点<a href=\"{1}\">这里</a>。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:875
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "主机"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:876
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
|
||||
msgid "Destination"
|
||||
msgstr "目标"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:881
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "继续{0},而不保存"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:886
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to eepsite"
|
||||
msgstr "保存{0}至“路由器地址簿”并访问该eepsite。"
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:889
|
||||
#, java-format
|
||||
msgid "Save {0} to master address book and continue to eepsite"
|
||||
msgstr "保存{0}至“主地址簿”并访问该eepsite。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:890
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to eepsite"
|
||||
msgstr "保存{0}至“私有地址簿”并访问该eepsite。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046
|
||||
msgid ""
|
||||
"Click a link below to look for an address helper by using a \"jump\" service:"
|
||||
msgstr ""
|
||||
"请点击下面的链接通过【跳转(Jump)】服务提供的【地址助手】链接跳转至域名对应的"
|
||||
"主机:"
|
||||
"Click a link below to look for an address helper by using a \"jump\" "
|
||||
"service:"
|
||||
msgstr "请点击下面的链接通过【跳转(Jump)】服务提供的【地址助手】链接跳转至域名对应的主机:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1262
|
||||
msgid "Added via address helper"
|
||||
msgstr "已通过地址助手添加"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1286
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "正在重定向至{0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1292
|
||||
msgid "Router Console"
|
||||
msgstr "路由控制台"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
msgid "Addressbook"
|
||||
msgstr "地址簿"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
msgid "Configuration"
|
||||
msgstr "配置"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1293
|
||||
msgid "Help"
|
||||
msgstr "帮助"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1298
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "目标{0}已保存至{1}地址簿中,正在重定向至此目标。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1299
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
|
||||
msgstr "目标{0}在{1}地址簿中保存失败,,正在重定向至此目标。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1301
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "如果未能自动重定向,请点击这里。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
|
||||
@@ -45,9 +116,7 @@ msgstr "内部"
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr ""
|
||||
"网页提交无效,可能的原因是您使用了浏览器的“后退”和“刷新”按钮,导致表单过期,"
|
||||
"请重新提交。"
|
||||
msgstr "网页提交无效,可能的原因是您使用了浏览器的“后退”和“刷新”按钮,导致表单过期,请重新提交。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
|
||||
msgid "Configuration reloaded for all tunnels"
|
||||
@@ -124,12 +193,12 @@ msgid "HTTP bidir"
|
||||
msgstr "双向http"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
|
||||
msgid "Host not set"
|
||||
msgstr "主机未设置"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
|
||||
msgid "Port not set"
|
||||
msgstr "端口未设置"
|
||||
|
||||
@@ -147,24 +216,24 @@ msgstr "新建代理设置"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
|
||||
msgid "Name"
|
||||
msgstr "名称"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
|
||||
msgid "Type"
|
||||
msgstr "类型"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
|
||||
msgid "Description"
|
||||
msgstr "描述"
|
||||
|
||||
@@ -238,9 +307,7 @@ msgstr "高级网络设置"
|
||||
msgid ""
|
||||
"(NOTE: when this client proxy is configured to share tunnels, then these "
|
||||
"options are for all the shared proxy clients!)"
|
||||
msgstr ""
|
||||
"(注意:此客户代理被设置使用共享隧道时,这些设置将影响所有使用共享隧道的客户"
|
||||
"端!)"
|
||||
msgstr "(注意:此客户代理被设置使用共享隧道时,这些设置将影响所有使用共享隧道的客户端!)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
|
||||
@@ -401,17 +468,11 @@ msgstr "单请求/响应连接"
|
||||
msgid "Router I2CP Address"
|
||||
msgstr "路由器I2CP地址"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
|
||||
msgid "Host"
|
||||
msgstr "主机"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
|
||||
msgid "Port"
|
||||
msgstr "端口"
|
||||
|
||||
@@ -509,9 +570,7 @@ msgstr "自定义选项"
|
||||
msgid ""
|
||||
"NOTE: If tunnel is currently running, most changes will not take effect "
|
||||
"until tunnel is stopped and restarted."
|
||||
msgstr ""
|
||||
"注意:如果当前隧道已经启动,设置需要【停止】并重新【启动】相应隧道后才能生"
|
||||
"效。"
|
||||
msgstr "注意:如果当前隧道已经启动,设置需要【停止】并重新【启动】相应隧道后才能生效。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
|
||||
@@ -597,7 +656,6 @@ msgstr "黑名单"
|
||||
msgid "Access List"
|
||||
msgstr "访问列表"
|
||||
|
||||
# disable=>noLimit
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
|
||||
msgid "Inbound connection limits (0=unlimited)"
|
||||
msgstr "入站连接限制(0=无限制)"
|
||||
@@ -622,7 +680,6 @@ msgstr "按天"
|
||||
msgid "Total"
|
||||
msgstr "总数"
|
||||
|
||||
# disable=>noLimit
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
|
||||
msgid "Max concurrent connections (0=unlimited)"
|
||||
msgstr "最大并发连接数(0=无限制)"
|
||||
@@ -663,152 +720,129 @@ msgstr "修改证书"
|
||||
msgid "Modify"
|
||||
msgstr "修改"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74
|
||||
msgid "I2P Tunnel Manager - List"
|
||||
msgstr "I2P隧道管理器 - 列表"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86
|
||||
msgid "Status Messages"
|
||||
msgstr "状态信息"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90
|
||||
msgid "Refresh"
|
||||
msgstr "刷新"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
|
||||
msgid "Stop All"
|
||||
msgstr "全部停止"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
|
||||
msgid "Start All"
|
||||
msgstr "全部启动"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
|
||||
msgid "Restart All"
|
||||
msgstr "全部重启"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
|
||||
msgid "Reload Config"
|
||||
msgstr "重新载入设置"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
|
||||
msgid "I2P Server Tunnels"
|
||||
msgstr "I2P服务端隧道"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
|
||||
msgid "Points at"
|
||||
msgstr "指向"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
|
||||
msgid "Preview"
|
||||
msgstr "预览"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
|
||||
msgid "Status"
|
||||
msgstr "状态"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
|
||||
msgid "Base32 Address"
|
||||
msgstr "Base32地址"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
|
||||
msgid "No Preview"
|
||||
msgstr "无预览"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
msgid "Starting..."
|
||||
msgstr "正在启动..."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
|
||||
msgid "Stop"
|
||||
msgstr "停止"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
|
||||
msgid "Running"
|
||||
msgstr "运行中"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
|
||||
msgid "Stopped"
|
||||
msgstr "已停止"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
|
||||
msgid "Start"
|
||||
msgstr "启动"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
|
||||
msgid "New server tunnel"
|
||||
msgstr "新建服务器隧道"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
|
||||
msgid "Standard"
|
||||
msgstr "标准"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
|
||||
msgid "Create"
|
||||
msgstr "创建"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
|
||||
msgid "I2P Client Tunnels"
|
||||
msgstr "I2P客户端隧道"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
|
||||
msgid "Interface"
|
||||
msgstr "网络接口"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
|
||||
msgid "Standby"
|
||||
msgstr "等待"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
|
||||
msgid "Outproxy"
|
||||
msgstr "出口代理"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
|
||||
msgid "Destination"
|
||||
msgstr "目标"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
|
||||
msgid "none"
|
||||
msgstr "无"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
|
||||
msgid "New client tunnel"
|
||||
msgstr "新建客户隧道"
|
||||
|
||||
#~ msgid "Locally (127.0.0.1)"
|
||||
#~ msgstr "本地(127.0.0.1)"
|
||||
|
||||
#~ msgid "Everyone (0.0.0.0)"
|
||||
#~ msgstr "任何人(0.0.0.0)"
|
||||
|
||||
#~ msgid "LAN Hosts (Please specify your LAN address)"
|
||||
#~ msgstr "局域网(请指定LAN地址)"
|
||||
|
||||
#~ msgid "Other"
|
||||
#~ msgstr "其他"
|
||||
|
||||
#~ msgid "I2CP Options"
|
||||
#~ msgstr "I2CP选项"
|
||||
|
||||
#~ msgid "(Restrict to these clients only)"
|
||||
#~ msgstr "(仅允许这些客户访问)"
|
||||
|
||||
#~ msgid "Unimplemented"
|
||||
#~ msgstr "尚未实现"
|
||||
|
||||
@@ -1,298 +0,0 @@
|
||||
package net.i2p.client.streaming;
|
||||
|
||||
/**
|
||||
* Like a StringBuffer, but for bytes. This class is not internally synchronized,
|
||||
* so care should be taken when using in a multithreaded environment.
|
||||
*
|
||||
* @deprecated Only used by deprecated I2PSocketImpl
|
||||
*/
|
||||
class ByteCollector {
|
||||
byte[] contents;
|
||||
int size;
|
||||
|
||||
private static final int INITIAL_CAPACITY = 1024;
|
||||
private static final int SHORT_CAPACITY = 80;
|
||||
|
||||
/**
|
||||
* New collector with the default initial capacity
|
||||
*
|
||||
*/
|
||||
public ByteCollector() {
|
||||
this(INITIAL_CAPACITY);
|
||||
}
|
||||
|
||||
/**
|
||||
* New collector with an initial capacity as specified
|
||||
*
|
||||
*/
|
||||
public ByteCollector(int capacity) {
|
||||
contents = new byte[capacity];
|
||||
size = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* New collector containing the specified bytes
|
||||
*
|
||||
*/
|
||||
public ByteCollector(byte[] b) {
|
||||
this();
|
||||
append(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* New collector with the specified byte
|
||||
*
|
||||
*/
|
||||
public ByteCollector(byte b) {
|
||||
this();
|
||||
append(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new byte to the collector (extending the buffer if necessary)
|
||||
*
|
||||
* @param b byte to add
|
||||
* @return this object
|
||||
*/
|
||||
public ByteCollector append(byte b) {
|
||||
ensureCapacity(size + 1);
|
||||
contents[size++] = b;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new bytes to the collector (extending the buffer if necessary)
|
||||
*
|
||||
* @param b bytes to add
|
||||
* @return this object
|
||||
*/
|
||||
public ByteCollector append(byte[] b) {
|
||||
ensureCapacity(size + b.length);
|
||||
System.arraycopy(b, 0, contents, size, b.length);
|
||||
size += b.length;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new bytes to the collector (extending the buffer if necessary)
|
||||
*
|
||||
* @param b byte array to add from
|
||||
* @param len number of bytes in the array to add
|
||||
* @return this object
|
||||
*/
|
||||
public ByteCollector append(byte[] b, int len) {
|
||||
return append(b, 0, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new bytes to the collector (extending the buffer if necessary)
|
||||
*
|
||||
* @param b byte array to add from
|
||||
* @param off offset into the array to begin adding from
|
||||
* @param len number of bytes in the array to add
|
||||
* @return this object
|
||||
*/
|
||||
public ByteCollector append(byte[] b, int off, int len) {
|
||||
ensureCapacity(size + len);
|
||||
System.arraycopy(b, off, contents, size, len);
|
||||
size += len;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the contents of the byte collector to the current collector (extending the buffer if necessary)
|
||||
*
|
||||
* @param bc collector to copy
|
||||
* @return this object
|
||||
*/
|
||||
public ByteCollector append(ByteCollector bc) {
|
||||
// optimieren?
|
||||
return append(bc.toByteArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy the contents of the collector into a new array and return it
|
||||
*
|
||||
* @return new array containing a copy of the current collector's data
|
||||
*/
|
||||
public byte[] toByteArray() {
|
||||
byte[] result = new byte[size];
|
||||
System.arraycopy(contents, 0, result, 0, size);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pull off the first $maxlen bytes from the collector, shifting the remaining
|
||||
* bytes into the beginning of the collector's array.
|
||||
*
|
||||
* @param maxlen max number of bytes we want to pull from the collector (we will get
|
||||
* less if the collector doesnt have that many bytes yet)
|
||||
* @return copy of the bytes pulled from the collector
|
||||
*/
|
||||
public byte[] startToByteArray(int maxlen) {
|
||||
if (size < maxlen) {
|
||||
byte[] res = toByteArray();
|
||||
clear();
|
||||
return res;
|
||||
} else {
|
||||
byte[] result = new byte[maxlen];
|
||||
System.arraycopy(contents, 0, result, 0, maxlen);
|
||||
System.arraycopy(contents, maxlen, contents, 0, size - maxlen);
|
||||
size -= maxlen;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* How many bytes are available for retrieval?
|
||||
*
|
||||
* @return number of bytes
|
||||
*/
|
||||
public int getCurrentSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure we have sufficient storage space.
|
||||
*
|
||||
* @param cap minimum number of bytes that the buffer should contain
|
||||
* @return true if the the collector was expanded to meet the minimum,
|
||||
* false if it was already large enough
|
||||
*/
|
||||
public boolean ensureCapacity(int cap) {
|
||||
if (contents.length < cap) {
|
||||
int l = contents.length;
|
||||
while (l < cap) {
|
||||
l = (l * 3) / 2 + 1;
|
||||
}
|
||||
byte[] newcont = new byte[l];
|
||||
System.arraycopy(contents, 0, newcont, 0, size);
|
||||
contents = newcont;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the collector have meaningful data or is it empty?
|
||||
*
|
||||
* @return true if it has no data
|
||||
*/
|
||||
public boolean isEmpty() {
|
||||
return size == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search through the collector for the first occurrence of the sequence of
|
||||
* bytes contained within the specified collector
|
||||
*
|
||||
* @param bc bytes that will be searched for
|
||||
* @return index into the current collector, or -1 if it isn't found
|
||||
*/
|
||||
public int indexOf(ByteCollector bc) {
|
||||
// optimieren?
|
||||
return indexOf(bc.toByteArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Search through the collector for the first occurrence of the specified
|
||||
* byte
|
||||
*
|
||||
* @param b byte that will be searched for
|
||||
* @return index into the current collector, or -1 if it isn't found
|
||||
*/
|
||||
public int indexOf(byte b) {
|
||||
// optimieren?
|
||||
return indexOf(new byte[] { b});
|
||||
}
|
||||
|
||||
/**
|
||||
* Search through the collector for the first occurrence of the sequence of
|
||||
* bytes
|
||||
*
|
||||
* @param ba bytes that will be searched for
|
||||
* @return index into the current collector, or -1 if it isn't found
|
||||
*/
|
||||
public int indexOf(byte[] ba) {
|
||||
loop: for (int i = 0; i < size - ba.length + 1; i++) {
|
||||
for (int j = 0; j < ba.length; j++) {
|
||||
if (contents[i + j] != ba[j]) continue loop;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty the collector. This does not affect its capacity.
|
||||
*
|
||||
*/
|
||||
public void clear() {
|
||||
size = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty the collector and reduce its capacity.
|
||||
*
|
||||
*/
|
||||
public void clearAndShorten() {
|
||||
size = 0;
|
||||
contents = new byte[SHORT_CAPACITY];
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the bytes as a string
|
||||
*
|
||||
* @return the, uh, string
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return new String(toByteArray());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int h = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
h += contents[i] * contents[i];
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare the collectors.
|
||||
*
|
||||
* @return true if and only if both are the same size and the
|
||||
* byte arrays they contain are equal.
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o instanceof ByteCollector) {
|
||||
ByteCollector by = (ByteCollector) o;
|
||||
if (size != by.size) return false;
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (contents[i] != by.contents[i]) return false;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the first byte from the collector, shifting its contents accordingly.
|
||||
*
|
||||
* @return byte removed
|
||||
* @throws IllegalArgumentException if the collector is empty
|
||||
*/
|
||||
public byte removeFirst() throws IllegalArgumentException {
|
||||
byte bb = contents[0];
|
||||
if (size == 0) throw new IllegalArgumentException("ByteCollector is empty");
|
||||
if (size > 1)
|
||||
System.arraycopy(contents, 1, contents, 0, --size);
|
||||
else
|
||||
size = 0;
|
||||
return bb;
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
package net.i2p.client.streaming;
|
||||
|
||||
import java.net.ConnectException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.util.Clock;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* Server socket implementation, allowing multiple threads to accept I2PSockets
|
||||
* and pull from a queue populated by various threads (each of whom have their own
|
||||
* timeout)
|
||||
*
|
||||
* @deprecated use I2PServerSocketFull
|
||||
*/
|
||||
class I2PServerSocketImpl implements I2PServerSocket {
|
||||
private final static Log _log = new Log(I2PServerSocketImpl.class);
|
||||
private I2PSocketManager mgr;
|
||||
/** list of sockets waiting for the client to accept them */
|
||||
private final List<I2PSocket> pendingSockets = Collections.synchronizedList(new ArrayList<I2PSocket>(4));
|
||||
|
||||
/** have we been closed */
|
||||
private volatile boolean closing = false;
|
||||
|
||||
/** lock on this when accepting a pending socket, and wait on it for notification of acceptance */
|
||||
private final Object socketAcceptedLock = new Object();
|
||||
/** lock on this when adding a new socket to the pending list, and wait on it accordingly */
|
||||
private final Object socketAddedLock = new Object();
|
||||
|
||||
/**
|
||||
* Set Sock Option accept timeout stub, does nothing in ministreaming
|
||||
* @param x
|
||||
*/
|
||||
public void setSoTimeout(long x) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Sock Option accept timeout stub, does nothing in ministreaming
|
||||
* @return timeout
|
||||
*/
|
||||
public long getSoTimeout() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
public I2PServerSocketImpl(I2PSocketManager mgr) {
|
||||
this.mgr = mgr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for the next socket connecting. If a remote user tried to make a
|
||||
* connection and the local application wasn't .accept()ing new connections,
|
||||
* they should get refused (if .accept() doesnt occur in some small period -
|
||||
* currently 5 seconds)
|
||||
*
|
||||
* @return a connected I2PSocket
|
||||
*
|
||||
* @throws I2PException if there is a problem with reading a new socket
|
||||
* from the data available (aka the I2PSession closed, etc)
|
||||
* @throws ConnectException if the I2PServerSocket is closed
|
||||
*/
|
||||
public I2PSocket accept() throws I2PException, ConnectException {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("accept() called, pending: " + pendingSockets.size());
|
||||
|
||||
I2PSocket ret = null;
|
||||
|
||||
while ( (ret == null) && (!closing) ){
|
||||
while (pendingSockets.isEmpty()) {
|
||||
if (closing) throw new ConnectException("I2PServerSocket closed");
|
||||
try {
|
||||
synchronized(socketAddedLock) {
|
||||
socketAddedLock.wait();
|
||||
}
|
||||
} catch (InterruptedException ie) {}
|
||||
}
|
||||
synchronized (pendingSockets) {
|
||||
if (!pendingSockets.isEmpty()) {
|
||||
ret = (I2PSocket)pendingSockets.remove(0);
|
||||
}
|
||||
}
|
||||
if (ret != null) {
|
||||
synchronized (socketAcceptedLock) {
|
||||
socketAcceptedLock.notifyAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("TIMING: handed out accept result " + ret.hashCode());
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the socket available and wait until the client app accepts it, or until
|
||||
* the given timeout elapses. This doesn't have any limits on the queue size -
|
||||
* perhaps it should add some choking (e.g. after 5 waiting for accept, refuse)
|
||||
*
|
||||
* @param timeoutMs how long to wait until accept
|
||||
* @return true if the socket was accepted, false if the timeout expired
|
||||
* or the socket was closed
|
||||
*/
|
||||
public boolean addWaitForAccept(I2PSocket s, long timeoutMs) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("addWaitForAccept [new socket arrived [" + s.toString() + "], pending: " + pendingSockets.size());
|
||||
|
||||
if (closing) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Already closing the socket");
|
||||
return false;
|
||||
}
|
||||
|
||||
Clock clock = I2PAppContext.getGlobalContext().clock();
|
||||
long start = clock.now();
|
||||
long end = start + timeoutMs;
|
||||
pendingSockets.add(s);
|
||||
synchronized (socketAddedLock) {
|
||||
socketAddedLock.notifyAll();
|
||||
}
|
||||
|
||||
// keep looping until the socket has been grabbed by the accept()
|
||||
// (or the expiration passes, or the socket is closed)
|
||||
while (pendingSockets.contains(s)) {
|
||||
long now = clock.now();
|
||||
if (now >= end) {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("Expired while waiting for accept (time elapsed =" + (now - start) + "ms) for socket " + s.toString());
|
||||
pendingSockets.remove(s);
|
||||
return false;
|
||||
}
|
||||
if (closing) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Server socket closed while waiting for accept");
|
||||
pendingSockets.remove(s);
|
||||
return false;
|
||||
}
|
||||
long remaining = end - now;
|
||||
try {
|
||||
synchronized (socketAcceptedLock) {
|
||||
socketAcceptedLock.wait(remaining);
|
||||
}
|
||||
} catch (InterruptedException ie) {}
|
||||
}
|
||||
long now = clock.now();
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.info("Socket accepted after " + (now-start) + "ms for socket " + s.toString());
|
||||
return true;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
closing = true;
|
||||
// let anyone .accept()ing know to fsck off
|
||||
synchronized (socketAddedLock) {
|
||||
socketAddedLock.notifyAll();
|
||||
}
|
||||
// let anyone addWaitForAccept()ing know to fsck off
|
||||
synchronized (socketAcceptedLock) {
|
||||
socketAcceptedLock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public I2PSocketManager getManager() { return mgr; }
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package net.i2p.client.streaming;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.channels.SelectableChannel;
|
||||
|
||||
import net.i2p.data.Destination;
|
||||
|
||||
@@ -34,6 +35,11 @@ public interface I2PSocket {
|
||||
*/
|
||||
public OutputStream getOutputStream() throws IOException;
|
||||
|
||||
/**
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public SelectableChannel getChannel() throws IOException;
|
||||
|
||||
/**
|
||||
* @return socket's configuration
|
||||
*/
|
||||
@@ -70,6 +76,21 @@ public interface I2PSocket {
|
||||
public boolean isClosed();
|
||||
|
||||
public void setSocketErrorListener(SocketErrorListener lsnr);
|
||||
|
||||
/**
|
||||
* The remote port.
|
||||
* @return Default I2PSession.PORT_UNSPECIFIED (0) or PORT_ANY (0)
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public int getPort();
|
||||
|
||||
/**
|
||||
* The local port.
|
||||
* @return Default I2PSession.PORT_UNSPECIFIED (0) or PORT_ANY (0)
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public int getLocalPort();
|
||||
|
||||
/**
|
||||
* Allow notification of underlying errors communicating across I2P without
|
||||
* waiting for any sort of cleanup process. For example, if some data could
|
||||
|
||||
@@ -163,7 +163,7 @@ public class I2PSocketEepGet extends EepGet {
|
||||
protected String getRequest() throws IOException {
|
||||
StringBuilder buf = new StringBuilder(2048);
|
||||
URL url = new URL(_actualURL);
|
||||
String host = url.getHost();
|
||||
//String host = url.getHost();
|
||||
String path = url.getPath();
|
||||
String query = url.getQuery();
|
||||
if (query != null)
|
||||
@@ -181,7 +181,13 @@ public class I2PSocketEepGet extends EepGet {
|
||||
"Cache-control: no-cache\r\n" +
|
||||
"Pragma: no-cache\r\n" +
|
||||
"User-Agent: " + USER_AGENT + "\r\n" +
|
||||
"Connection: close\r\n\r\n");
|
||||
"Connection: close\r\n");
|
||||
if (_extraHeaders != null) {
|
||||
for (String hdr : _extraHeaders) {
|
||||
buf.append(hdr).append("\r\n");
|
||||
}
|
||||
}
|
||||
buf.append("\r\n");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,677 +0,0 @@
|
||||
package net.i2p.client.streaming;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.I2PSessionException;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.Clock;
|
||||
import net.i2p.util.I2PThread;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
|
||||
/**
|
||||
* Initial stub implementation for the socket
|
||||
*
|
||||
* @deprecated use I2PSocketFull
|
||||
*/
|
||||
class I2PSocketImpl implements I2PSocket {
|
||||
private final static Log _log = new Log(I2PSocketImpl.class);
|
||||
|
||||
public static final int MAX_PACKET_SIZE = 1024 * 32;
|
||||
public static final int PACKET_DELAY = 100;
|
||||
|
||||
private I2PSocketManagerImpl manager;
|
||||
private Destination local;
|
||||
private Destination remote;
|
||||
private String localID;
|
||||
private String remoteID;
|
||||
private final Object remoteIDWaiter = new Object();
|
||||
private I2PInputStream in;
|
||||
private I2POutputStream out;
|
||||
private I2PSocket.SocketErrorListener _socketErrorListener;
|
||||
private boolean outgoing;
|
||||
private long _socketId;
|
||||
private static long __socketId = 0;
|
||||
private long _bytesRead = 0;
|
||||
private long _bytesWritten = 0;
|
||||
private long _createdOn;
|
||||
private long _closedOn;
|
||||
private long _remoteIdSetTime;
|
||||
private I2PSocketOptions _options;
|
||||
private final Object flagLock = new Object();
|
||||
|
||||
/**
|
||||
* Whether the I2P socket has already been closed.
|
||||
*/
|
||||
private boolean closed = false;
|
||||
|
||||
/**
|
||||
* Whether to send out a close packet when the socket is
|
||||
* closed. (If the socket is closed because of an incoming close
|
||||
* packet, we need not send one.)
|
||||
*/
|
||||
private boolean sendClose = true;
|
||||
|
||||
/**
|
||||
* Whether the I2P socket has already been closed and all data
|
||||
* (from I2P to the app, dunno whether to call this incoming or
|
||||
* outgoing) has been processed.
|
||||
*/
|
||||
private boolean closed2 = false;
|
||||
|
||||
/**
|
||||
* @param peer who this socket is (or should be) connected to
|
||||
* @param mgr how we talk to the network
|
||||
* @param outgoing did we initiate the connection (true) or did we receive it (false)?
|
||||
* @param localID what is our half of the socket ID?
|
||||
*/
|
||||
public I2PSocketImpl(Destination peer, I2PSocketManagerImpl mgr, boolean outgoing, String localID) {
|
||||
this.outgoing = outgoing;
|
||||
manager = mgr;
|
||||
remote = peer;
|
||||
_socketId = ++__socketId;
|
||||
local = mgr.getSession().getMyDestination();
|
||||
String us = mgr.getSession().getMyDestination().calculateHash().toBase64().substring(0,4);
|
||||
String name = us + (outgoing ? "->" : "<-") + peer.calculateHash().toBase64().substring(0,4);
|
||||
in = new I2PInputStream(name + " in");
|
||||
I2PInputStream pin = new I2PInputStream(name + " out");
|
||||
out = new I2POutputStream(pin);
|
||||
new I2PSocketRunner(pin);
|
||||
this.localID = localID;
|
||||
_createdOn = I2PAppContext.getGlobalContext().clock().now();
|
||||
_remoteIdSetTime = -1;
|
||||
_closedOn = -1;
|
||||
_options = mgr.getDefaultOptions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Our half of the socket's unique ID
|
||||
*
|
||||
*/
|
||||
public String getLocalID() {
|
||||
return localID;
|
||||
}
|
||||
|
||||
/**
|
||||
* We've received the other side's half of the socket's unique ID
|
||||
*/
|
||||
public void setRemoteID(String id) {
|
||||
synchronized (remoteIDWaiter) {
|
||||
remoteID = id;
|
||||
_remoteIdSetTime = System.currentTimeMillis();
|
||||
remoteIDWaiter.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the other side's half of the socket's unique ID, or null if it
|
||||
* isn't known yet
|
||||
*
|
||||
* @param wait if true, we should wait until we receive it from the peer, otherwise
|
||||
* return what we know immediately (which may be null)
|
||||
*/
|
||||
public String getRemoteID(boolean wait) {
|
||||
try {
|
||||
return getRemoteID(wait, -1);
|
||||
} catch (InterruptedIOException iie) {
|
||||
_log.error("wtf, we said we didn't want it to time out! you smell", iie);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the other side's half of the socket's unique ID, or null if it isn't
|
||||
* known yet and we were instructed not to wait
|
||||
*
|
||||
* @param wait should we wait for the peer to send us their half of the ID, or
|
||||
* just return immediately?
|
||||
* @param maxWait if we're going to wait, after how long should we timeout and fail?
|
||||
* (if this value is < 0, we wait indefinitely)
|
||||
* @throws InterruptedIOException when the max waiting period has been exceeded
|
||||
*/
|
||||
public String getRemoteID(boolean wait, long maxWait) throws InterruptedIOException {
|
||||
long dieAfter = System.currentTimeMillis() + maxWait;
|
||||
synchronized (remoteIDWaiter) {
|
||||
if (wait) {
|
||||
if (remoteID == null) {
|
||||
try {
|
||||
if (maxWait >= 0)
|
||||
remoteIDWaiter.wait(maxWait);
|
||||
else
|
||||
remoteIDWaiter.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
}
|
||||
}
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
if ((maxWait >= 0) && (now >= dieAfter)) {
|
||||
long waitedExcess = now - dieAfter;
|
||||
throw new InterruptedIOException("Timed out waiting for remote ID (waited " + waitedExcess
|
||||
+ "ms too long [" + maxWait + "ms, remId " + remoteID
|
||||
+ ", remId set " + (now-_remoteIdSetTime) + "ms ago])");
|
||||
}
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("TIMING: RemoteID set to "
|
||||
+ I2PSocketManagerImpl.getReadableForm(remoteID) + " for "
|
||||
+ this.hashCode());
|
||||
}
|
||||
return remoteID;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the other side's half of the socket's unique ID, or null if it
|
||||
* isn't known yet. This does not wait
|
||||
*
|
||||
*/
|
||||
public String getRemoteID() {
|
||||
return getRemoteID(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* The other side has given us some data, so inject it into our socket's
|
||||
* inputStream
|
||||
*
|
||||
* @param data the data to inject into our local inputStream
|
||||
*/
|
||||
public void queueData(byte[] data) {
|
||||
_bytesRead += data.length;
|
||||
try {
|
||||
in.queueData(data, false);
|
||||
} catch (IOException ioe) {
|
||||
_log.log(Log.CRIT, "wtf, we said DONT block, how can we timeout?", ioe);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the Destination of this side of the socket.
|
||||
*/
|
||||
public Destination getThisDestination() {
|
||||
return local;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the destination of the peer.
|
||||
*/
|
||||
public Destination getPeerDestination() {
|
||||
return remote;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an InputStream to read from the socket.
|
||||
*/
|
||||
public InputStream getInputStream() throws IOException {
|
||||
if ((in == null)) throw new IOException("Not connected");
|
||||
return in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an OutputStream to write into the socket.
|
||||
*/
|
||||
public OutputStream getOutputStream() throws IOException {
|
||||
if ((out == null)) throw new IOException("Not connected");
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the socket if not closed yet (from the Application
|
||||
* side).
|
||||
*/
|
||||
public void close() throws IOException {
|
||||
synchronized (flagLock) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Closing connection");
|
||||
closed = true;
|
||||
_closedOn = I2PAppContext.getGlobalContext().clock().now();
|
||||
}
|
||||
out.close();
|
||||
in.notifyClosed();
|
||||
}
|
||||
|
||||
public boolean isClosed() { return _closedOn > 0; }
|
||||
|
||||
/**
|
||||
* Close the socket from the I2P side (by a close packet)
|
||||
*/
|
||||
protected void internalClose() {
|
||||
synchronized (flagLock) {
|
||||
closed = true;
|
||||
closed2 = true;
|
||||
sendClose = false;
|
||||
_closedOn = I2PAppContext.getGlobalContext().clock().now();
|
||||
}
|
||||
out.close();
|
||||
in.notifyClosed();
|
||||
}
|
||||
|
||||
private byte getMask(int add) {
|
||||
if (outgoing)
|
||||
return (byte)(I2PSocketManagerImpl.DATA_IN + (byte)add);
|
||||
else
|
||||
return (byte)(I2PSocketManagerImpl.DATA_OUT + (byte)add);
|
||||
}
|
||||
|
||||
public void setOptions(I2PSocketOptions options) {
|
||||
_options = options;
|
||||
in.setReadTimeout(options.getReadTimeout());
|
||||
}
|
||||
|
||||
public I2PSocketOptions getOptions() {
|
||||
return _options;
|
||||
}
|
||||
|
||||
/**
|
||||
* How long we will wait blocked on a read() operation. This is simply a
|
||||
* helper to query the I2PSocketOptions
|
||||
*
|
||||
* @return milliseconds to wait, or -1 if we will wait indefinitely
|
||||
*/
|
||||
public long getReadTimeout() {
|
||||
return _options.getReadTimeout();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define how long we will wait blocked on a read() operation (-1 will make
|
||||
* the socket wait forever). This is simply a helper to adjust the
|
||||
* I2PSocketOptions
|
||||
*
|
||||
*/
|
||||
public void setReadTimeout(long ms) {
|
||||
_options.setReadTimeout(ms);
|
||||
in.setReadTimeout(ms);
|
||||
}
|
||||
|
||||
public void setSocketErrorListener(I2PSocket.SocketErrorListener lsnr) {
|
||||
_socketErrorListener = lsnr;
|
||||
}
|
||||
|
||||
void errorOccurred() {
|
||||
if (_socketErrorListener != null)
|
||||
_socketErrorListener.errorOccurred();
|
||||
}
|
||||
|
||||
public long getBytesSent() { return _bytesWritten; }
|
||||
public long getBytesReceived() { return _bytesRead; }
|
||||
public long getCreatedOn() { return _createdOn; }
|
||||
public long getClosedOn() { return _closedOn; }
|
||||
|
||||
|
||||
private String getPrefix() { return "[" + _socketId + "]: "; }
|
||||
|
||||
//--------------------------------------------------
|
||||
private class I2PInputStream extends InputStream {
|
||||
private String streamName;
|
||||
private final ByteCollector bc = new ByteCollector();
|
||||
private boolean inStreamClosed = false;
|
||||
|
||||
private long readTimeout = -1;
|
||||
|
||||
public I2PInputStream(String name) {
|
||||
streamName = name;
|
||||
}
|
||||
|
||||
public long getReadTimeout() {
|
||||
return readTimeout;
|
||||
}
|
||||
|
||||
private String getStreamPrefix() {
|
||||
return getPrefix() + streamName + ": ";
|
||||
}
|
||||
|
||||
public void setReadTimeout(long ms) {
|
||||
readTimeout = ms;
|
||||
}
|
||||
|
||||
public int read() throws IOException {
|
||||
byte[] b = new byte[1];
|
||||
int res = read(b);
|
||||
if (res == 1) return b[0] & 0xff;
|
||||
if (res == -1) return -1;
|
||||
throw new RuntimeException("Incorrect read() result");
|
||||
}
|
||||
|
||||
// I have to ask if this method is really needed, since the JDK has this already,
|
||||
// including the timeouts. Perhaps the need is for debugging more than anything
|
||||
// else?
|
||||
@Override
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getStreamPrefix() + "Read called for " + len + " bytes (avail="
|
||||
+ bc.getCurrentSize() + "): " + this.hashCode());
|
||||
if (len == 0) return 0;
|
||||
long dieAfter = System.currentTimeMillis() + readTimeout;
|
||||
byte[] read = null;
|
||||
synchronized (bc) {
|
||||
read = bc.startToByteArray(len);
|
||||
bc.notifyAll();
|
||||
}
|
||||
boolean timedOut = false;
|
||||
|
||||
while ( (read.length == 0) && (!inStreamClosed) ) {
|
||||
synchronized (flagLock) {
|
||||
if (closed) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getStreamPrefix() + "Closed is set after reading "
|
||||
+ _bytesRead + " and writing " + _bytesWritten
|
||||
+ ", so closing stream: " + hashCode());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
try {
|
||||
synchronized (I2PSocketImpl.I2PInputStream.this) {
|
||||
if (readTimeout >= 0) {
|
||||
wait(readTimeout);
|
||||
} else {
|
||||
wait();
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException ex) {}
|
||||
|
||||
if ((readTimeout >= 0)
|
||||
&& (System.currentTimeMillis() >= dieAfter)) {
|
||||
throw new InterruptedIOException(getStreamPrefix() + "Timeout reading from I2PSocket ("
|
||||
+ readTimeout + " msecs)");
|
||||
}
|
||||
|
||||
synchronized (bc) {
|
||||
read = bc.startToByteArray(len);
|
||||
bc.notifyAll();
|
||||
}
|
||||
}
|
||||
if (read.length > len) throw new RuntimeException("BUG");
|
||||
if ( (inStreamClosed) && (read.length <= 0) )
|
||||
return -1;
|
||||
|
||||
System.arraycopy(read, 0, b, off, read.length);
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG)) {
|
||||
_log.debug(getStreamPrefix() + "Read from I2PInputStream " + hashCode() + " returned "
|
||||
+ read.length + " bytes");
|
||||
}
|
||||
//if (_log.shouldLog(Log.DEBUG)) {
|
||||
// _log.debug("Read from I2PInputStream " + this.hashCode()
|
||||
// + " returned "+read.length+" bytes:\n"
|
||||
// + HexDump.dump(read));
|
||||
//}
|
||||
return read.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return 0 if empty, > 0 if there is data.
|
||||
*/
|
||||
@Override
|
||||
public int available() {
|
||||
synchronized (bc) {
|
||||
return bc.getCurrentSize();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the data to the queue
|
||||
*
|
||||
* @param allowBlock if true, we will block if the buffer and the socket options
|
||||
* say so, otherwise we simply take the data regardless.
|
||||
* @throws InterruptedIOException if the queue's buffer is full, the socket has
|
||||
* a write timeout, and that timeout is exceeded
|
||||
* @throws IOException if the connection was closed while queueing up the data
|
||||
*/
|
||||
void queueData(byte[] data, boolean allowBlock) throws InterruptedIOException, IOException {
|
||||
queueData(data, 0, data.length, allowBlock);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the data to the queue
|
||||
*
|
||||
* @param allowBlock if true, we will block if the buffer and the socket options
|
||||
* say so, otherwise we simply take the data regardless.
|
||||
* @throws InterruptedIOException if the queue's buffer is full, the socket has
|
||||
* a write timeout, and that timeout is exceeded
|
||||
* @throws IOException if the connection was closed while queueing up the data
|
||||
*/
|
||||
public void queueData(byte[] data, int off, int len, boolean allowBlock) throws InterruptedIOException, IOException {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getStreamPrefix() + "Insert " + len + " bytes into queue: " + hashCode());
|
||||
Clock clock = I2PAppContext.getGlobalContext().clock();
|
||||
long endAfter = clock.now() + _options.getWriteTimeout();
|
||||
synchronized (bc) {
|
||||
if (allowBlock) {
|
||||
if (_options.getMaxBufferSize() > 0) {
|
||||
while (bc.getCurrentSize() > _options.getMaxBufferSize()) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getStreamPrefix() + "Buffer size exceeded: pending "
|
||||
+ bc.getCurrentSize() + " limit " + _options.getMaxBufferSize());
|
||||
if (_options.getWriteTimeout() > 0) {
|
||||
long timeLeft = endAfter - clock.now();
|
||||
if (timeLeft <= 0) {
|
||||
long waited = _options.getWriteTimeout() - timeLeft;
|
||||
throw new InterruptedIOException(getStreamPrefix() + "Waited too long ("
|
||||
+ waited + "ms) to write "
|
||||
+ len + " with a buffer at " + bc.getCurrentSize());
|
||||
}
|
||||
}
|
||||
if (inStreamClosed)
|
||||
throw new IOException(getStreamPrefix() + "Stream closed while writing");
|
||||
if (_closedOn > 0)
|
||||
throw new IOException(getStreamPrefix() + "I2PSocket closed while writing");
|
||||
try {
|
||||
bc.wait(1000);
|
||||
} catch (InterruptedException ie) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
bc.append(data, off, len);
|
||||
}
|
||||
synchronized (I2PInputStream.this) {
|
||||
I2PInputStream.this.notifyAll();
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getStreamPrefix() + "After insert " + len + " bytes into queue: " + hashCode());
|
||||
}
|
||||
|
||||
public void notifyClosed() {
|
||||
synchronized (I2PInputStream.this) {
|
||||
I2PInputStream.this.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
super.close();
|
||||
notifyClosed();
|
||||
synchronized (bc) {
|
||||
inStreamClosed = true;
|
||||
bc.notifyAll();
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getStreamPrefix() + "After close");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class I2POutputStream extends OutputStream {
|
||||
|
||||
public I2PInputStream sendTo;
|
||||
|
||||
public I2POutputStream(I2PInputStream sendTo) {
|
||||
this.sendTo = sendTo;
|
||||
}
|
||||
|
||||
public void write(int b) throws IOException {
|
||||
write(new byte[] { (byte) b});
|
||||
}
|
||||
|
||||
// This override is faster than the built in JDK,
|
||||
// but there are other variations not handled
|
||||
@Override
|
||||
public void write(byte[] b, int off, int len) throws IOException {
|
||||
_bytesWritten += len;
|
||||
sendTo.queueData(b, off, len, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
sendTo.notifyClosed();
|
||||
}
|
||||
}
|
||||
|
||||
private static volatile long __runnerId = 0;
|
||||
private class I2PSocketRunner extends I2PThread {
|
||||
|
||||
public InputStream in;
|
||||
|
||||
public I2PSocketRunner(InputStream in) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + "Runner's input stream is: " + in.hashCode());
|
||||
this.in = in;
|
||||
String peer = I2PSocketImpl.this.remote.calculateHash().toBase64();
|
||||
setName("SocketRunner " + (++__runnerId) + "/" + _socketId + " " + peer.substring(0, 4));
|
||||
start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pump some more data
|
||||
*
|
||||
* @return true if we should keep on handling, false otherwise
|
||||
*/
|
||||
private boolean handleNextPacket(ByteCollector bc, byte buffer[])
|
||||
throws IOException, I2PSessionException {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + ":" + Thread.currentThread().getName() + "handleNextPacket");
|
||||
int len = in.read(buffer);
|
||||
int bcsize = 0;
|
||||
synchronized (bc) {
|
||||
bcsize = bc.getCurrentSize();
|
||||
}
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + ":" + Thread.currentThread().getName() + "handleNextPacket len=" + len + " bcsize=" + bcsize);
|
||||
|
||||
if (len != -1) {
|
||||
synchronized (bc) {
|
||||
bc.append(buffer, len);
|
||||
}
|
||||
} else if (bcsize == 0) {
|
||||
// nothing left in the buffer, and read(..) got EOF (-1).
|
||||
// the bart the
|
||||
return false;
|
||||
}
|
||||
if ((bcsize < MAX_PACKET_SIZE) && (in.available() == 0)) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + ":" + Thread.currentThread().getName() + "Runner Point d: " + hashCode());
|
||||
|
||||
try {
|
||||
Thread.sleep(PACKET_DELAY);
|
||||
} catch (InterruptedException e) {
|
||||
_log.warn("wtf", e);
|
||||
}
|
||||
}
|
||||
if ((bcsize >= MAX_PACKET_SIZE) || (in.available() == 0)) {
|
||||
byte data[] = null;
|
||||
synchronized (bc) {
|
||||
data = bc.startToByteArray(MAX_PACKET_SIZE);
|
||||
}
|
||||
if (data.length > 0) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + ":" + Thread.currentThread().getName() + "Message size is: " + data.length);
|
||||
boolean sent = sendBlock(data);
|
||||
if (!sent) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getPrefix() + ":" + Thread.currentThread().getName() + "Error sending message to peer. Killing socket runner");
|
||||
errorOccurred();
|
||||
return false;
|
||||
} else {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + ":" + Thread.currentThread().getName() + "Message sent to peer");
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
byte[] buffer = new byte[MAX_PACKET_SIZE];
|
||||
ByteCollector bc = new ByteCollector();
|
||||
boolean keepHandling = true;
|
||||
int packetsHandled = 0;
|
||||
try {
|
||||
// try {
|
||||
while (keepHandling) {
|
||||
keepHandling = handleNextPacket(bc, buffer);
|
||||
packetsHandled++;
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + ":" + Thread.currentThread().getName()
|
||||
+ "Packets handled: " + packetsHandled);
|
||||
}
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info(getPrefix() + ":" + Thread.currentThread().getName()
|
||||
+ "After handling packets, we're done. Packets handled: " + packetsHandled);
|
||||
|
||||
if ((bc.getCurrentSize() > 0) && (packetsHandled > 1)) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getPrefix() + "We lost some data queued up due to a network send error (input stream: "
|
||||
+ in.hashCode() + "; "
|
||||
+ "queue size: " + bc.getCurrentSize() + ")");
|
||||
}
|
||||
synchronized (flagLock) {
|
||||
closed2 = true;
|
||||
}
|
||||
boolean sc;
|
||||
synchronized (flagLock) {
|
||||
sc = sendClose;
|
||||
} // FIXME: Race here?
|
||||
if (sc) {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info(getPrefix() + ":" + Thread.currentThread().getName()
|
||||
+ "Sending close packet: (we started? " + outgoing
|
||||
+ ") after reading " + _bytesRead + " and writing " + _bytesWritten);
|
||||
byte[] packet = I2PSocketManagerImpl.makePacket(getMask(0x02), remoteID, new byte[0]);
|
||||
boolean sent = manager.getSession().sendMessage(remote, packet);
|
||||
if (!sent) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getPrefix() + ":" + Thread.currentThread().getName()
|
||||
+ "Error sending close packet to peer");
|
||||
errorOccurred();
|
||||
}
|
||||
}
|
||||
manager.removeSocket(I2PSocketImpl.this);
|
||||
internalClose();
|
||||
} catch (InterruptedIOException ex) {
|
||||
_log.error(getPrefix() + "BUG! read() operations should not timeout!", ex);
|
||||
} catch (IOException ex) {
|
||||
// WHOEVER removes this event on inconsistent
|
||||
// state before fixing the inconsistent state (a
|
||||
// reference on the socket in the socket manager
|
||||
// etc.) will get hanged by me personally -- mihi
|
||||
_log.error(getPrefix() + "Error running - **INCONSISTENT STATE!!!**", ex);
|
||||
} catch (I2PException ex) {
|
||||
_log.error(getPrefix() + "Error running - **INCONSISTENT STATE!!!**", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean sendBlock(byte data[]) throws I2PSessionException {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix() + "TIMING: Block to send for " + I2PSocketImpl.this.hashCode());
|
||||
if (remoteID == null) {
|
||||
_log.error(getPrefix() + "NULL REMOTEID");
|
||||
return false;
|
||||
}
|
||||
byte[] packet = I2PSocketManagerImpl.makePacket(getMask(0x00), remoteID, data);
|
||||
boolean sent;
|
||||
synchronized (flagLock) {
|
||||
if (closed2) return false;
|
||||
}
|
||||
sent = manager.getSession().sendMessage(remote, packet);
|
||||
return sent;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() { return "" + hashCode(); }
|
||||
}
|
||||
@@ -90,7 +90,7 @@ public class I2PSocketManagerFactory {
|
||||
* Create a socket manager using the destination loaded from the given private key
|
||||
* stream and connected to the default I2CP host and port.
|
||||
*
|
||||
* @param myPrivateKeyStream private key stream
|
||||
* @param myPrivateKeyStream private key stream, format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
|
||||
* @return the newly created socket manager, or null if there were errors
|
||||
*/
|
||||
public static I2PSocketManager createManager(InputStream myPrivateKeyStream) {
|
||||
@@ -101,7 +101,7 @@ public class I2PSocketManagerFactory {
|
||||
* Create a socket manager using the destination loaded from the given private key
|
||||
* stream and connected to the default I2CP host and port.
|
||||
*
|
||||
* @param myPrivateKeyStream private key stream
|
||||
* @param myPrivateKeyStream private key stream, format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
|
||||
* @param opts I2CP options
|
||||
* @return the newly created socket manager, or null if there were errors
|
||||
*/
|
||||
@@ -114,7 +114,7 @@ public class I2PSocketManagerFactory {
|
||||
* stream and connected to the I2CP router on the specified machine on the given
|
||||
* port
|
||||
*
|
||||
* @param myPrivateKeyStream private key stream
|
||||
* @param myPrivateKeyStream private key stream, format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
|
||||
* @param i2cpHost I2CP host
|
||||
* @param i2cpPort I2CP port
|
||||
* @param opts I2CP options
|
||||
|
||||
@@ -1,817 +0,0 @@
|
||||
/*
|
||||
* licensed under BSD license...
|
||||
* (if you know the proper clause for that, add it ...)
|
||||
*/
|
||||
package net.i2p.client.streaming;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.ConnectException;
|
||||
import java.net.NoRouteToHostException;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.I2PSession;
|
||||
import net.i2p.client.I2PSessionException;
|
||||
import net.i2p.client.I2PSessionListener;
|
||||
import net.i2p.data.Base64;
|
||||
import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
|
||||
/**
|
||||
* Centralize the coordination and multiplexing of the local client's streaming.
|
||||
* There should be one I2PSocketManager for each I2PSession, and if an application
|
||||
* is sending and receiving data through the streaming library using an
|
||||
* I2PSocketManager, it should not attempt to call I2PSession's setSessionListener
|
||||
* or receive any messages with its .receiveMessage
|
||||
*
|
||||
* @deprecated use I2PSocketManagerFull
|
||||
*/
|
||||
class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener {
|
||||
private I2PAppContext _context;
|
||||
private Log _log;
|
||||
private /* FIXME final FIXME */ I2PSession _session;
|
||||
private I2PServerSocketImpl _serverSocket = null;
|
||||
private final Object lock = new Object(); // for locking socket lists
|
||||
private HashMap<String,I2PSocket> _outSockets;
|
||||
private HashMap<String,I2PSocket> _inSockets;
|
||||
private I2PSocketOptions _defaultOptions;
|
||||
private long _acceptTimeout;
|
||||
private String _name;
|
||||
private final List<DisconnectListener> _listeners = new ArrayList<DisconnectListener>(1);;
|
||||
private static int __managerId = 0;
|
||||
|
||||
public static final short ACK = 0x51;
|
||||
public static final short CLOSE_OUT = 0x52;
|
||||
public static final short DATA_OUT = 0x50;
|
||||
public static final short SYN = 0xA1;
|
||||
public static final short CLOSE_IN = 0xA2;
|
||||
public static final short DATA_IN = 0xA0;
|
||||
public static final short CHAFF = 0xFF;
|
||||
|
||||
/**
|
||||
* How long to wait for the client app to accept() before sending back CLOSE?
|
||||
* This includes the time waiting in the queue. Currently set to 5 seconds.
|
||||
*/
|
||||
private static final long ACCEPT_TIMEOUT_DEFAULT = 5*1000;
|
||||
|
||||
public I2PSocketManagerImpl() {
|
||||
this("SocketManager " + (++__managerId));
|
||||
}
|
||||
public I2PSocketManagerImpl(String name) {
|
||||
init(I2PAppContext.getGlobalContext(), null, null, name);
|
||||
}
|
||||
|
||||
public void init(I2PAppContext context, I2PSession session, Properties opts, String name) {
|
||||
_name = name;
|
||||
_context = context;
|
||||
_log = _context.logManager().getLog(I2PSocketManager.class);
|
||||
_inSockets = new HashMap<String,I2PSocket>(16);
|
||||
_outSockets = new HashMap<String,I2PSocket>(16);
|
||||
_acceptTimeout = ACCEPT_TIMEOUT_DEFAULT;
|
||||
// _listeners = new ArrayList<DisconnectListener>(1);
|
||||
setSession(session);
|
||||
setDefaultOptions(buildOptions(opts));
|
||||
_context.statManager().createRateStat("streaming.lifetime", "How long before the socket is closed?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
_context.statManager().createRateStat("streaming.sent", "How many bytes are sent in the stream?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
_context.statManager().createRateStat("streaming.received", "How many bytes are received in the stream?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
_context.statManager().createRateStat("streaming.transferBalance", "How many streams send more than they receive (positive means more sent, negative means more received)?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
_context.statManager().createRateStat("streaming.synNoAck", "How many times have we sent a SYN but not received an ACK?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
_context.statManager().createRateStat("streaming.ackSendFailed", "How many times have we tried to send an ACK to a SYN and failed?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
_context.statManager().createRateStat("streaming.nackSent", "How many times have we refused a SYN with a NACK?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
_context.statManager().createRateStat("streaming.nackReceived", "How many times have we received a NACK to our SYN?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 });
|
||||
}
|
||||
|
||||
public I2PSession getSession() {
|
||||
return _session;
|
||||
}
|
||||
|
||||
public void setSession(I2PSession session) {
|
||||
_session = session;
|
||||
if (session != null) session.setSessionListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* How long should we wait for the client to .accept() a socket before
|
||||
* sending back a NACK/Close?
|
||||
*
|
||||
* @param ms milliseconds to wait, maximum
|
||||
*/
|
||||
public void setAcceptTimeout(long ms) { _acceptTimeout = ms; }
|
||||
public long getAcceptTimeout() { return _acceptTimeout; }
|
||||
|
||||
public void disconnected(I2PSession session) {
|
||||
_log.info(getName() + ": Disconnected from the session");
|
||||
destroySocketManager();
|
||||
List<DisconnectListener> listeners = null;
|
||||
synchronized (_listeners) {
|
||||
listeners = new ArrayList<DisconnectListener>(_listeners);
|
||||
_listeners.clear();
|
||||
}
|
||||
for (int i = 0; i < listeners.size(); i++) {
|
||||
I2PSocketManager.DisconnectListener lsnr = (I2PSocketManager.DisconnectListener)listeners.get(i);
|
||||
lsnr.sessionDisconnected();
|
||||
}
|
||||
}
|
||||
|
||||
public void errorOccurred(I2PSession session, String message, Throwable error) {
|
||||
_log.error(getName() + ": Error occurred: [" + message + "]", error);
|
||||
}
|
||||
|
||||
public void messageAvailable(I2PSession session, int msgId, long size) {
|
||||
try {
|
||||
I2PSocketImpl s;
|
||||
byte msg[] = session.receiveMessage(msgId);
|
||||
if (msg.length == 1 && msg[0] == -1) {
|
||||
_log.debug(getName() + ": Ping received");
|
||||
return;
|
||||
}
|
||||
if (msg.length < 4) {
|
||||
_log.warn(getName() + ": ==== packet too short ====");
|
||||
return;
|
||||
}
|
||||
int type = msg[0] & 0xff;
|
||||
String id = toString(new byte[] { msg[1], msg[2], msg[3]});
|
||||
byte[] payload = new byte[msg.length - 4];
|
||||
System.arraycopy(msg, 4, payload, 0, payload.length);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": Message read: type = [" + Integer.toHexString(type)
|
||||
+ "] id = [" + getReadableForm(id)
|
||||
+ "] payload length: [" + payload.length + "]");
|
||||
switch (type) {
|
||||
case ACK:
|
||||
ackAvailable(id, payload);
|
||||
return;
|
||||
case CLOSE_OUT:
|
||||
disconnectAvailable(id, payload);
|
||||
return;
|
||||
case DATA_OUT:
|
||||
sendOutgoingAvailable(id, payload);
|
||||
return;
|
||||
case SYN:
|
||||
synIncomingAvailable(id, payload, session);
|
||||
return;
|
||||
case CLOSE_IN:
|
||||
disconnectIncoming(id, payload);
|
||||
return;
|
||||
case DATA_IN:
|
||||
sendIncoming(id, payload);
|
||||
return;
|
||||
case CHAFF:
|
||||
// ignore
|
||||
return;
|
||||
default:
|
||||
handleUnknown(type, id, payload);
|
||||
return;
|
||||
}
|
||||
} catch (I2PException ise) {
|
||||
_log.warn(getName() + ": Error processing", ise);
|
||||
} catch (IllegalStateException ise) {
|
||||
_log.debug(getName() + ": Error processing", ise);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We've received an ACK packet (hopefully, in response to a SYN that we
|
||||
* recently sent out). Notify the associated I2PSocket that we now have
|
||||
* the remote stream ID (which should get things going, since the handshake
|
||||
* is complete).
|
||||
*
|
||||
*/
|
||||
private void ackAvailable(String id, byte payload[]) {
|
||||
long begin = _context.clock().now();
|
||||
I2PSocketImpl s = null;
|
||||
synchronized (lock) {
|
||||
s = (I2PSocketImpl) _outSockets.get(id);
|
||||
}
|
||||
|
||||
if (s == null) {
|
||||
_log.warn(getName() + ": No socket responsible for ACK packet for id " + getReadableForm(id));
|
||||
return;
|
||||
}
|
||||
|
||||
long socketRetrieved = _context.clock().now();
|
||||
|
||||
String remoteId = null;
|
||||
remoteId = s.getRemoteID(false);
|
||||
|
||||
if ( (payload.length == 3) && (remoteId == null) ) {
|
||||
String newID = toString(payload);
|
||||
long beforeSetRemId = _context.clock().now();
|
||||
s.setRemoteID(newID);
|
||||
if (_log.shouldLog(Log.DEBUG)) {
|
||||
_log.debug(getName() + ": ackAvailable - socket retrieval took "
|
||||
+ (socketRetrieved-begin) + "ms, getRemoteId took "
|
||||
+ (beforeSetRemId-socketRetrieved) + "ms, setRemoteId took "
|
||||
+ (_context.clock().now()-beforeSetRemId) + "ms");
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
// (payload.length != 3 || getRemoteId != null)
|
||||
if (_log.shouldLog(Log.WARN)) {
|
||||
if (payload.length != 3)
|
||||
_log.warn(getName() + ": Ack packet had " + payload.length + " bytes");
|
||||
else
|
||||
_log.warn(getName() + ": Remote ID already exists? " + remoteId);
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG)) {
|
||||
_log.debug(getName() + ": invalid ack - socket retrieval took "
|
||||
+ (socketRetrieved-begin) + "ms, overall took "
|
||||
+ (_context.clock().now()-begin) + "ms");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We received a disconnect packet, telling us to tear down the specified
|
||||
* stream.
|
||||
*/
|
||||
private void disconnectAvailable(String id, byte payload[]) {
|
||||
I2PSocketImpl s = null;
|
||||
synchronized (lock) {
|
||||
s = (I2PSocketImpl) _outSockets.get(id);
|
||||
}
|
||||
|
||||
_log.debug(getName() + ": *Disconnect outgoing for socket " + s + " on id "
|
||||
+ getReadableForm(id));
|
||||
try {
|
||||
if (s != null) {
|
||||
if (payload.length > 0) {
|
||||
_log.debug(getName() + ": Disconnect packet had "
|
||||
+ payload.length + " bytes");
|
||||
}
|
||||
if (s.getRemoteID(false) == null) {
|
||||
s.setRemoteID(null); // Just to wake up socket
|
||||
return;
|
||||
}
|
||||
s.internalClose();
|
||||
synchronized (lock) {
|
||||
_outSockets.remove(id);
|
||||
}
|
||||
}
|
||||
return;
|
||||
} catch (Exception t) {
|
||||
_log.warn(getName() + ": Ignoring error on disconnect for socket " + s, t);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We've received data on a stream we created - toss the data onto
|
||||
* the socket for handling.
|
||||
*
|
||||
* @throws IllegalStateException if the socket isn't open or isn't known
|
||||
*/
|
||||
private void sendOutgoingAvailable(String id, byte payload[]) throws IllegalStateException {
|
||||
I2PSocketImpl s = null;
|
||||
synchronized (lock) {
|
||||
s = (I2PSocketImpl) _outSockets.get(id);
|
||||
}
|
||||
|
||||
// packet send outgoing
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": *Packet send outgoing [" + payload.length + "] for socket "
|
||||
+ s + " on id " + getReadableForm(id));
|
||||
if (s != null) {
|
||||
s.queueData(payload);
|
||||
return;
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getName() + ": Null socket with data available");
|
||||
throw new IllegalStateException("Null socket with data available");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We've received a SYN packet (a request for a new stream). If the client has
|
||||
* said they want incoming sockets (by retrieving the serverSocket), the stream
|
||||
* will be ACKed, but if they have not, they'll be NACKed)
|
||||
*
|
||||
* @throws DataFormatException if the destination in the SYN was invalid
|
||||
* @throws I2PSessionException if there was an I2P error sending the ACK or NACK
|
||||
*/
|
||||
private void synIncomingAvailable(String id, byte payload[], I2PSession session)
|
||||
throws DataFormatException, I2PSessionException {
|
||||
Destination d = new Destination();
|
||||
d.fromByteArray(payload);
|
||||
|
||||
I2PSocketImpl s = null;
|
||||
boolean acceptConnections = (_serverSocket != null);
|
||||
String newLocalID = null;
|
||||
synchronized (lock) {
|
||||
newLocalID = makeID(_inSockets);
|
||||
if (acceptConnections) {
|
||||
s = new I2PSocketImpl(d, this, false, newLocalID);
|
||||
s.setRemoteID(id);
|
||||
}
|
||||
}
|
||||
_log.debug(getName() + ": *Syn! for socket " + s + " on id " + getReadableForm(newLocalID)
|
||||
+ " from " + d.calculateHash().toBase64().substring(0,6));
|
||||
|
||||
if (!acceptConnections) {
|
||||
// The app did not instantiate an I2PServerSocket
|
||||
byte[] packet = makePacket((byte) CLOSE_OUT, id, toBytes(newLocalID));
|
||||
boolean replySentOk = false;
|
||||
synchronized (_session) {
|
||||
replySentOk = _session.sendMessage(d, packet);
|
||||
}
|
||||
if (!replySentOk) {
|
||||
_log.warn(getName() + ": Error sending close to " + d.calculateHash().toBase64()
|
||||
+ " in response to a new con message",
|
||||
new Exception("Failed creation"));
|
||||
}
|
||||
_context.statManager().addRateData("streaming.nackSent", 1, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_serverSocket.addWaitForAccept(s, _acceptTimeout)) {
|
||||
_inSockets.put(newLocalID, s);
|
||||
byte[] packet = makePacket((byte) ACK, id, toBytes(newLocalID));
|
||||
boolean replySentOk = false;
|
||||
replySentOk = _session.sendMessage(d, packet);
|
||||
if (!replySentOk) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getName() + ": Error sending reply to " + d.calculateHash().toBase64()
|
||||
+ " in response to a new con message for socket " + s,
|
||||
new Exception("Failed creation"));
|
||||
s.internalClose();
|
||||
_context.statManager().addRateData("streaming.ackSendFailed", 1, 1);
|
||||
}
|
||||
} else {
|
||||
// timed out or serverSocket closed
|
||||
byte[] packet = toBytes(" " + id);
|
||||
packet[0] = CLOSE_OUT;
|
||||
boolean nackSent = session.sendMessage(d, packet);
|
||||
if (!nackSent) {
|
||||
_log.warn(getName() + ": Error sending NACK for session creation for socket " + s);
|
||||
}
|
||||
s.internalClose();
|
||||
_context.statManager().addRateData("streaming,nackSent", 1, 1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* We've received a disconnect for a socket we didn't initiate, so kill
|
||||
* the socket.
|
||||
*
|
||||
*/
|
||||
private void disconnectIncoming(String id, byte payload[]) {
|
||||
I2PSocketImpl s = null;
|
||||
synchronized (lock) {
|
||||
s = (I2PSocketImpl) _inSockets.get(id);
|
||||
if (payload.length == 0 && s != null) {
|
||||
_inSockets.remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
_log.debug(getName() + ": *Disconnect incoming for socket " + s);
|
||||
|
||||
try {
|
||||
if (payload.length == 0 && s != null) {
|
||||
s.internalClose();
|
||||
return;
|
||||
} else {
|
||||
if ( (payload.length > 0) && (_log.shouldLog(Log.ERROR)) )
|
||||
_log.warn(getName() + ": Disconnect packet had " + payload.length + " bytes");
|
||||
if (s != null)
|
||||
s.internalClose();
|
||||
return;
|
||||
}
|
||||
} catch (Exception t) {
|
||||
_log.warn(getName() + ": Ignoring error on disconnect", t);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We've received data on a stream we received - toss the data onto
|
||||
* the socket for handling.
|
||||
*
|
||||
* @throws IllegalStateException if the socket isn't open or isn't known
|
||||
*/
|
||||
private void sendIncoming(String id, byte payload[]) throws IllegalStateException {
|
||||
I2PSocketImpl s = null;
|
||||
synchronized (lock) {
|
||||
s = (I2PSocketImpl) _inSockets.get(id);
|
||||
}
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": *Packet send incoming [" + payload.length + "] for socket " + s);
|
||||
|
||||
if (s != null) {
|
||||
s.queueData(payload);
|
||||
return;
|
||||
} else {
|
||||
_log.info(getName() + ": Null socket with data available");
|
||||
throw new IllegalStateException("Null socket with data available");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unknown packet. moo.
|
||||
*
|
||||
*/
|
||||
private void handleUnknown(int type, String id, byte payload[]) {
|
||||
_log.error(getName() + ": \n\n=============== Unknown packet! " + "============"
|
||||
+ "\nType: " + type
|
||||
+ "\nID: " + getReadableForm(id)
|
||||
+ "\nBase64'ed Data: " + Base64.encode(payload)
|
||||
+ "\n\n\n");
|
||||
if (id != null) {
|
||||
synchronized (lock) {
|
||||
_inSockets.remove(id);
|
||||
_outSockets.remove(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void reportAbuse(I2PSession session, int severity) {
|
||||
_log.error(getName() + ": Abuse reported [" + severity + "]");
|
||||
}
|
||||
|
||||
public void setDefaultOptions(I2PSocketOptions options) {
|
||||
_defaultOptions = options;
|
||||
}
|
||||
|
||||
public I2PSocketOptions getDefaultOptions() {
|
||||
return _defaultOptions;
|
||||
}
|
||||
|
||||
public I2PSocketOptions buildOptions() { return buildOptions(null); }
|
||||
public I2PSocketOptions buildOptions(Properties opts) {
|
||||
return new I2PSocketOptionsImpl(opts);
|
||||
}
|
||||
|
||||
public I2PServerSocket getServerSocket() {
|
||||
if (_serverSocket == null) {
|
||||
_serverSocket = new I2PServerSocketImpl(this);
|
||||
}
|
||||
return _serverSocket;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException
|
||||
* @since 0.8.4
|
||||
*/
|
||||
public ServerSocket getStandardServerSocket() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new connected socket (block until the socket is created)
|
||||
*
|
||||
* @param peer Destination to connect to
|
||||
* @param options I2P socket options to be used for connecting
|
||||
*
|
||||
* @throws ConnectException if the peer refuses the connection
|
||||
* @throws NoRouteToHostException if the peer is not found or not reachable
|
||||
* @throws InterruptedIOException if the connection timeouts
|
||||
* @throws I2PException if there is some other I2P-related problem
|
||||
*/
|
||||
public I2PSocket connect(Destination peer, I2PSocketOptions options)
|
||||
throws I2PException, ConnectException,
|
||||
NoRouteToHostException, InterruptedIOException {
|
||||
String localID, lcID;
|
||||
I2PSocketImpl s;
|
||||
synchronized (lock) {
|
||||
localID = makeID(_outSockets);
|
||||
lcID = getReadableForm(localID);
|
||||
s = new I2PSocketImpl(peer, this, true, localID);
|
||||
_outSockets.put(localID, s);
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": connect(" + peer.calculateHash().toBase64().substring(0,6)
|
||||
+ ", ...): localID = " + lcID);
|
||||
|
||||
try {
|
||||
ByteArrayOutputStream pubkey = new ByteArrayOutputStream();
|
||||
_session.getMyDestination().writeBytes(pubkey);
|
||||
String remoteID;
|
||||
byte[] packet = makePacket((byte) SYN, localID, pubkey.toByteArray());
|
||||
boolean sent = false;
|
||||
sent = _session.sendMessage(peer, packet);
|
||||
if (!sent) {
|
||||
_log.info(getName() + ": Unable to send & receive ack for SYN packet for socket "
|
||||
+ s + " with localID = " + lcID);
|
||||
synchronized (lock) {
|
||||
_outSockets.remove(s.getLocalID());
|
||||
}
|
||||
_context.statManager().addRateData("streaming.synNoAck", 1, 1);
|
||||
throw new I2PException("Error sending through I2P network");
|
||||
} else {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": syn sent ok to "
|
||||
+ peer.calculateHash().toBase64().substring(0,6)
|
||||
+ " with localID = " + lcID);
|
||||
}
|
||||
if (options != null)
|
||||
remoteID = s.getRemoteID(true, options.getConnectTimeout());
|
||||
else
|
||||
remoteID = s.getRemoteID(true, getDefaultOptions().getConnectTimeout());
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": remoteID received from "
|
||||
+ peer.calculateHash().toBase64().substring(0,6)
|
||||
+ ": " + getReadableForm(remoteID)
|
||||
+ " with localID = " + lcID);
|
||||
|
||||
if (remoteID == null) {
|
||||
_context.statManager().addRateData("streaming.nackReceived", 1, 1);
|
||||
throw new ConnectException("Connection refused by peer for socket " + s);
|
||||
}
|
||||
if ("".equals(remoteID)) {
|
||||
_context.statManager().addRateData("streaming.synNoAck", 1, 1);
|
||||
throw new NoRouteToHostException("Unable to reach peer for socket " + s);
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": TIMING: s given out for remoteID "
|
||||
+ getReadableForm(remoteID) + " for socket " + s);
|
||||
|
||||
return s;
|
||||
} catch (InterruptedIOException ioe) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getName() + ": Timeout waiting for ack from syn for id "
|
||||
+ lcID + " to " + peer.calculateHash().toBase64().substring(0,6)
|
||||
+ " for socket " + s, ioe);
|
||||
synchronized (lock) {
|
||||
_outSockets.remove(s.getLocalID());
|
||||
}
|
||||
s.internalClose();
|
||||
_context.statManager().addRateData("streaming.synNoAck", 1, 1);
|
||||
throw new InterruptedIOException("Timeout waiting for ack");
|
||||
} catch (ConnectException ex) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": Connection error waiting for ack from syn for id "
|
||||
+ lcID + " to " + peer.calculateHash().toBase64().substring(0,6)
|
||||
+ " for socket " + s, ex);
|
||||
s.internalClose();
|
||||
throw ex;
|
||||
} catch (NoRouteToHostException ex) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": No route to host waiting for ack from syn for id "
|
||||
+ lcID + " to " + peer.calculateHash().toBase64().substring(0,6)
|
||||
+ " for socket " + s, ex);
|
||||
s.internalClose();
|
||||
throw ex;
|
||||
} catch (IOException ex) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getName() + ": Error sending syn on id "
|
||||
+ lcID + " to " + peer.calculateHash().toBase64().substring(0,6)
|
||||
+ " for socket " + s, ex);
|
||||
synchronized (lock) {
|
||||
_outSockets.remove(s.getLocalID());
|
||||
}
|
||||
s.internalClose();
|
||||
throw new I2PException("Unhandled IOException occurred");
|
||||
} catch (I2PException ex) {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info(getName() + ": Error sending syn on id "
|
||||
+ lcID + " to " + peer.calculateHash().toBase64().substring(0,6)
|
||||
+ " for socket " + s, ex);
|
||||
synchronized (lock) {
|
||||
_outSockets.remove(s.getLocalID());
|
||||
}
|
||||
s.internalClose();
|
||||
throw ex;
|
||||
} catch (Exception e) {
|
||||
s.internalClose();
|
||||
_log.warn(getName() + ": Unhandled error connecting on "
|
||||
+ lcID + " to " + peer.calculateHash().toBase64().substring(0,6)
|
||||
+ " for socket " + s, e);
|
||||
throw new ConnectException("Unhandled error connecting: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new connected socket (block until the socket is created)
|
||||
*
|
||||
* @param peer Destination to connect to
|
||||
*
|
||||
* @throws ConnectException if the peer refuses the connection
|
||||
* @throws NoRouteToHostException if the peer is not found or not reachable
|
||||
* @throws InterruptedIOException if the connection timeouts
|
||||
* @throws I2PException if there is some other I2P-related problem
|
||||
*/
|
||||
public I2PSocket connect(Destination peer) throws I2PException, ConnectException,
|
||||
NoRouteToHostException, InterruptedIOException {
|
||||
return connect(peer, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException
|
||||
* @since 0.8.4
|
||||
*/
|
||||
public Socket connectToSocket(Destination peer) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws UnsupportedOperationException
|
||||
* @since 0.8.4
|
||||
*/
|
||||
public Socket connectToSocket(Destination peer, int timeout) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy the socket manager, freeing all the associated resources. This
|
||||
* method will block untill all the managed sockets are closed.
|
||||
*
|
||||
*/
|
||||
public void destroySocketManager() {
|
||||
if (_serverSocket != null) {
|
||||
_serverSocket.close();
|
||||
_serverSocket = null;
|
||||
}
|
||||
|
||||
synchronized (lock) {
|
||||
Iterator iter;
|
||||
String id = null;
|
||||
I2PSocketImpl sock;
|
||||
|
||||
iter = _inSockets.keySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
id = (String)iter.next();
|
||||
sock = (I2PSocketImpl)_inSockets.get(id);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": Closing inSocket \""
|
||||
+ getReadableForm(sock.getLocalID()) + "\"");
|
||||
sock.internalClose();
|
||||
}
|
||||
|
||||
iter = _outSockets.keySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
id = (String)iter.next();
|
||||
sock = (I2PSocketImpl)_outSockets.get(id);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getName() + ": Closing outSocket \""
|
||||
+ getReadableForm(sock.getLocalID()) + "\"");
|
||||
sock.internalClose();
|
||||
}
|
||||
}
|
||||
|
||||
_log.debug(getName() + ": Waiting for all open sockets to really close...");
|
||||
synchronized (lock) {
|
||||
while ((_inSockets.size() != 0) || (_outSockets.size() != 0)) {
|
||||
try {
|
||||
lock.wait();
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
_log.debug(getName() + ": Destroying I2P session...");
|
||||
_session.destroySession();
|
||||
_log.debug(getName() + ": I2P session destroyed");
|
||||
} catch (I2PSessionException e) {
|
||||
_log.warn(getName() + ": Error destroying I2P session", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a set of currently connected I2PSockets, either initiated locally or remotely.
|
||||
*
|
||||
*/
|
||||
public Set<I2PSocket> listSockets() {
|
||||
Set<I2PSocket> sockets = new HashSet<I2PSocket>(8);
|
||||
synchronized (lock) {
|
||||
sockets.addAll(_inSockets.values());
|
||||
sockets.addAll(_outSockets.values());
|
||||
}
|
||||
return sockets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ping the specified peer, returning true if they replied to the ping within
|
||||
* the timeout specified, false otherwise. This call blocks.
|
||||
*
|
||||
* @deprecated timeout is ignored - use I2PSocketManagerFull.ping()
|
||||
* @param timeoutMs ignored
|
||||
*/
|
||||
public boolean ping(Destination peer, long timeoutMs) {
|
||||
try {
|
||||
return _session.sendMessage(peer, new byte[] { (byte) CHAFF});
|
||||
} catch (I2PException ex) {
|
||||
_log.warn(getName() + ": I2PException:", ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void removeSocket(I2PSocketImpl sock) {
|
||||
String localId = sock.getLocalID();
|
||||
boolean removed = false;
|
||||
synchronized (lock) {
|
||||
removed = (null != _inSockets.remove(localId));
|
||||
removed = removed || (null != _outSockets.remove(localId));
|
||||
lock.notify();
|
||||
}
|
||||
|
||||
long now = _context.clock().now();
|
||||
long lifetime = now - sock.getCreatedOn();
|
||||
long timeSinceClose = now - sock.getClosedOn();
|
||||
long sent = sock.getBytesSent();
|
||||
long recv = sock.getBytesReceived();
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG)) {
|
||||
_log.debug(getName() + ": Removing socket \"" + getReadableForm(localId) + "\" [" + sock
|
||||
+ ", send: " + sent + ", recv: " + recv
|
||||
+ ", lifetime: " + lifetime + "ms, time since close: " + timeSinceClose
|
||||
+ " removed? " + removed + ")]",
|
||||
new Exception("removeSocket called"));
|
||||
}
|
||||
|
||||
_context.statManager().addRateData("streaming.lifetime", lifetime, lifetime);
|
||||
_context.statManager().addRateData("streaming.sent", sent, lifetime);
|
||||
_context.statManager().addRateData("streaming.received", recv, lifetime);
|
||||
|
||||
if (sent > recv) {
|
||||
_context.statManager().addRateData("streaming.transferBalance", 1, lifetime);
|
||||
} else if (recv > sent) {
|
||||
_context.statManager().addRateData("streaming.transferBalance", -1, lifetime);
|
||||
} else {
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
public String getName() { return _name; }
|
||||
public void setName(String name) { _name = name; }
|
||||
|
||||
public void addDisconnectListener(I2PSocketManager.DisconnectListener lsnr) {
|
||||
synchronized (_listeners) {
|
||||
_listeners.add(lsnr);
|
||||
}
|
||||
}
|
||||
public void removeDisconnectListener(I2PSocketManager.DisconnectListener lsnr) {
|
||||
synchronized (_listeners) {
|
||||
_listeners.remove(lsnr);
|
||||
}
|
||||
}
|
||||
|
||||
public static String getReadableForm(String id) {
|
||||
if (id == null) return "(null)";
|
||||
if (id.length() != 3) return "Bogus";
|
||||
return Base64.encode(toBytes(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new part the connection ID that is locally unique
|
||||
*
|
||||
* @param uniqueIn map of already known local IDs so we don't collide. WARNING - NOT THREADSAFE!
|
||||
*/
|
||||
private static String makeID(HashMap uniqueIn) {
|
||||
String newID;
|
||||
do {
|
||||
int id = (int) (Math.random() * 16777215 + 1);
|
||||
byte[] nid = new byte[3];
|
||||
nid[0] = (byte) (id / 65536);
|
||||
nid[1] = (byte) ((id / 256) % 256);
|
||||
nid[2] = (byte) (id % 256);
|
||||
newID = toString(nid);
|
||||
} while (uniqueIn.get(newID) != null);
|
||||
return newID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new packet of the given type for the specified connection containing
|
||||
* the given payload
|
||||
*/
|
||||
public static byte[] makePacket(byte type, String id, byte[] payload) {
|
||||
byte[] packet = new byte[payload.length + 4];
|
||||
packet[0] = type;
|
||||
byte[] temp = toBytes(id);
|
||||
if (temp.length != 3) throw new RuntimeException("Incorrect ID length: " + temp.length);
|
||||
System.arraycopy(temp, 0, packet, 1, 3);
|
||||
System.arraycopy(payload, 0, packet, 4, payload.length);
|
||||
return packet;
|
||||
}
|
||||
|
||||
private static final String toString(byte data[]) {
|
||||
try {
|
||||
return new String(data, "ISO-8859-1");
|
||||
} catch (UnsupportedEncodingException uee) {
|
||||
throw new RuntimeException("WTF! iso-8859-1 isn't supported?");
|
||||
}
|
||||
}
|
||||
|
||||
private static final byte[] toBytes(String str) {
|
||||
try {
|
||||
return str.getBytes("ISO-8859-1");
|
||||
} catch (UnsupportedEncodingException uee) {
|
||||
throw new RuntimeException("WTF! iso-8859-1 isn't supported?");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package net.i2p.client.streaming;
|
||||
|
||||
/**
|
||||
* Define the configuration for streaming and verifying data on the socket.
|
||||
*
|
||||
* Use I2PSocketManager.buildOptions() to get one of these.
|
||||
*/
|
||||
public interface I2PSocketOptions {
|
||||
/** How much data will we accept that hasn't been written out yet. */
|
||||
@@ -81,4 +81,32 @@ public interface I2PSocketOptions {
|
||||
* @param ms wait time to block on the output stream while waiting for the data to flush.
|
||||
*/
|
||||
public void setWriteTimeout(long ms);
|
||||
|
||||
/**
|
||||
* The remote port.
|
||||
* @return Default I2PSession.PORT_UNSPECIFIED (0) or PORT_ANY (0)
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public int getPort();
|
||||
|
||||
/**
|
||||
* The remote port.
|
||||
* @param port 0 - 65535
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public void setPort(int port);
|
||||
|
||||
/**
|
||||
* The local port.
|
||||
* @return Default I2PSession.PORT_UNSPECIFIED (0) or PORT_ANY (0)
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public int getLocalPort();
|
||||
|
||||
/**
|
||||
* The local port.
|
||||
* @param port 0 - 65535
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public void setLocalPort(int port);
|
||||
}
|
||||
|
||||
@@ -4,22 +4,32 @@ import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Define the configuration for streaming and verifying data on the socket.
|
||||
*
|
||||
* Use I2PSocketManager.buildOptions() to get one of these.
|
||||
*/
|
||||
class I2PSocketOptionsImpl implements I2PSocketOptions {
|
||||
private long _connectTimeout;
|
||||
private long _readTimeout;
|
||||
private long _writeTimeout;
|
||||
private int _maxBufferSize;
|
||||
private int _localPort;
|
||||
private int _remotePort;
|
||||
|
||||
public static final int DEFAULT_BUFFER_SIZE = 1024*64;
|
||||
public static final int DEFAULT_WRITE_TIMEOUT = -1;
|
||||
public static final int DEFAULT_CONNECT_TIMEOUT = 60*1000;
|
||||
|
||||
/**
|
||||
* Sets max buffer size, connect timeout, read timeout, and write timeout
|
||||
* from System properties. Does not set local port or remote port.
|
||||
*/
|
||||
public I2PSocketOptionsImpl() {
|
||||
this(System.getProperties());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes from System properties then copies over all options.
|
||||
* @param opts may be null
|
||||
*/
|
||||
public I2PSocketOptionsImpl(I2PSocketOptions opts) {
|
||||
this(System.getProperties());
|
||||
if (opts != null) {
|
||||
@@ -27,13 +37,25 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
|
||||
_readTimeout = opts.getReadTimeout();
|
||||
_writeTimeout = opts.getWriteTimeout();
|
||||
_maxBufferSize = opts.getMaxBufferSize();
|
||||
_localPort = opts.getLocalPort();
|
||||
_remotePort = opts.getPort();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets max buffer size, connect timeout, read timeout, and write timeout
|
||||
* from properties. Does not set local port or remote port.
|
||||
* @param opts may be null
|
||||
*/
|
||||
public I2PSocketOptionsImpl(Properties opts) {
|
||||
init(opts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets max buffer size, connect timeout, read timeout, and write timeout
|
||||
* from properties. Does not set local port or remote port.
|
||||
* @param opts may be null
|
||||
*/
|
||||
public void setProperties(Properties opts) {
|
||||
if (opts == null) return;
|
||||
if (opts.containsKey(PROP_BUFFER_SIZE))
|
||||
@@ -46,6 +68,10 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
|
||||
_writeTimeout = getInt(opts, PROP_WRITE_TIMEOUT, DEFAULT_WRITE_TIMEOUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets max buffer size, connect timeout, read timeout, and write timeout
|
||||
* from properties. Does not set local port or remote port.
|
||||
*/
|
||||
protected void init(Properties opts) {
|
||||
_maxBufferSize = getInt(opts, PROP_BUFFER_SIZE, DEFAULT_BUFFER_SIZE);
|
||||
_connectTimeout = getInt(opts, PROP_CONNECT_TIMEOUT, DEFAULT_CONNECT_TIMEOUT);
|
||||
@@ -144,4 +170,40 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
|
||||
public void setWriteTimeout(long ms) {
|
||||
_writeTimeout = ms;
|
||||
}
|
||||
|
||||
/**
|
||||
* The remote port.
|
||||
* @return Default I2PSession.PORT_UNSPECIFIED (0) or PORT_ANY (0)
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public int getPort() {
|
||||
return _remotePort;
|
||||
}
|
||||
|
||||
/**
|
||||
* The remote port.
|
||||
* @param port 0 - 65535
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public void setPort(int port) {
|
||||
_remotePort = port;
|
||||
}
|
||||
|
||||
/**
|
||||
* The local port.
|
||||
* @return Default I2PSession.PORT_UNSPECIFIED (0) or PORT_ANY (0)
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public int getLocalPort() {
|
||||
return _localPort;
|
||||
}
|
||||
|
||||
/**
|
||||
* The local port.
|
||||
* @param port 0 - 65535
|
||||
* @since 0.8.9
|
||||
*/
|
||||
public void setLocalPort(int port) {
|
||||
_localPort = port;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
package net.i2p.router.web;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* Copied and modded from I2PTunnel IndexBean (GPL)
|
||||
* @author zzz
|
||||
*/
|
||||
public class CSSHelper extends HelperBase {
|
||||
|
||||
private static final Map<String, Boolean> _UACache = new ConcurrentHashMap();
|
||||
|
||||
public CSSHelper() {}
|
||||
|
||||
public static final String PROP_THEME_NAME = "routerconsole.theme";
|
||||
@@ -69,7 +75,18 @@ public class CSSHelper extends HelperBase {
|
||||
* @since 0.8.5
|
||||
*/
|
||||
public boolean allowIFrame(String ua) {
|
||||
return ua == null ||
|
||||
if (ua == null)
|
||||
return true;
|
||||
Boolean brv = _UACache.get(ua);
|
||||
if (brv != null)
|
||||
return brv.booleanValue();
|
||||
boolean rv = shouldAllowIFrame(ua);
|
||||
_UACache.put(ua, Boolean.valueOf(rv));
|
||||
return rv;
|
||||
}
|
||||
|
||||
private static boolean shouldAllowIFrame(String ua) {
|
||||
return
|
||||
// text
|
||||
!(ua.startsWith("Lynx") || ua.startsWith("w3m") ||
|
||||
ua.startsWith("ELinks") || ua.startsWith("Links") ||
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
package net.i2p.router.web;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
import net.i2p.router.Router;
|
||||
import net.i2p.router.transport.FIFOBandwidthRefiller;
|
||||
import net.i2p.router.transport.TransportImpl;
|
||||
import net.i2p.router.transport.TransportManager;
|
||||
import net.i2p.router.transport.udp.UDPTransport;
|
||||
import net.i2p.router.web.ConfigServiceHandler;
|
||||
@@ -144,12 +148,16 @@ public class ConfigNetHandler extends FormHandler {
|
||||
_udpAutoIP = UDPTransport.DEFAULT_SOURCES;
|
||||
}
|
||||
_context.router().setConfigSetting(UDPTransport.PROP_SOURCES, _udpAutoIP);
|
||||
// Todo: Catch local IPs right here rather than complaining later
|
||||
if (uhost.length() > 0)
|
||||
_context.router().setConfigSetting(UDPTransport.PROP_EXTERNAL_HOST, uhost);
|
||||
else
|
||||
boolean valid = true;
|
||||
if (uhost.length() > 0) {
|
||||
valid = verifyAddress(uhost);
|
||||
if (valid) {
|
||||
_context.router().setConfigSetting(UDPTransport.PROP_EXTERNAL_HOST, uhost);
|
||||
}
|
||||
} else {
|
||||
_context.router().removeConfigSetting(UDPTransport.PROP_EXTERNAL_HOST);
|
||||
if ((!oldUdp.equals(_udpAutoIP)) || (!oldUHost.equals(uhost))) {
|
||||
}
|
||||
if (valid && ((!oldUdp.equals(_udpAutoIP)) || (!oldUHost.equals(uhost)))) {
|
||||
addFormNotice(_("Updating IP address"));
|
||||
restartRequired = true;
|
||||
}
|
||||
@@ -167,12 +175,15 @@ public class ConfigNetHandler extends FormHandler {
|
||||
if (_ntcpAutoIP == null) _ntcpAutoIP = "true";
|
||||
|
||||
if ((!oldAutoHost.equals(_ntcpAutoIP)) || ! oldNHost.equalsIgnoreCase(_ntcpHostname)) {
|
||||
boolean valid = true;
|
||||
if ("disabled".equals(_ntcpAutoIP)) {
|
||||
addFormNotice(_("Disabling TCP completely"));
|
||||
} else if ("false".equals(_ntcpAutoIP) && _ntcpHostname.length() > 0) {
|
||||
// Todo: Catch local IPs right here rather than complaining later
|
||||
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME, _ntcpHostname);
|
||||
addFormNotice(_("Updating inbound TCP address to") + " " + _ntcpHostname);
|
||||
valid = verifyAddress(_ntcpHostname);
|
||||
if (valid) {
|
||||
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME, _ntcpHostname);
|
||||
addFormNotice(_("Updating inbound TCP address to") + " " + _ntcpHostname);
|
||||
}
|
||||
} else {
|
||||
_context.router().removeConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME);
|
||||
if ("false".equals(_ntcpAutoIP))
|
||||
@@ -180,9 +191,11 @@ public class ConfigNetHandler extends FormHandler {
|
||||
else
|
||||
addFormNotice(_("Updating inbound TCP address to auto")); // true or always
|
||||
}
|
||||
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_IP, _ntcpAutoIP);
|
||||
_context.router().setConfigSetting(TransportManager.PROP_ENABLE_NTCP, "" + !"disabled".equals(_ntcpAutoIP));
|
||||
restartRequired = true;
|
||||
if (valid) {
|
||||
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_IP, _ntcpAutoIP);
|
||||
_context.router().setConfigSetting(TransportManager.PROP_ENABLE_NTCP, "" + !"disabled".equals(_ntcpAutoIP));
|
||||
restartRequired = true;
|
||||
}
|
||||
}
|
||||
if (oldAutoPort != _ntcpAutoPort || ! oldNPort.equals(_ntcpPort)) {
|
||||
if (_ntcpPort.length() > 0 && !_ntcpAutoPort) {
|
||||
@@ -271,11 +284,12 @@ public class ConfigNetHandler extends FormHandler {
|
||||
if (switchRequired) {
|
||||
hiddenSwitch();
|
||||
} else if (restartRequired) {
|
||||
if (System.getProperty("wrapper.version") == null) {
|
||||
//if (_context.hasWrapper()) {
|
||||
// Wow this dumps all conns immediately and really isn't nice
|
||||
addFormNotice("Performing a soft restart");
|
||||
_context.router().restart();
|
||||
addFormNotice("Soft restart complete");
|
||||
// restart() returns immediately now
|
||||
//addFormNotice("Soft restart complete");
|
||||
|
||||
// Most of the time we aren't changing addresses, just enabling or disabling
|
||||
// things, so let's try just a new routerInfo and see how that works.
|
||||
@@ -285,19 +299,40 @@ public class ConfigNetHandler extends FormHandler {
|
||||
// So don't do this...
|
||||
//_context.router().rebuildRouterInfo();
|
||||
//addFormNotice("Router Info rebuilt");
|
||||
} else {
|
||||
//} else {
|
||||
// There's a few changes that don't really require restart (e.g. enabling inbound TCP)
|
||||
// But it would be hard to get right, so just do a restart.
|
||||
addFormError(_("Gracefully restarting I2P to change published router address"));
|
||||
_context.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART));
|
||||
_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
|
||||
}
|
||||
//addFormError(_("Gracefully restarting I2P to change published router address"));
|
||||
//_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do basic verification of address here to prevent problems later
|
||||
* @return valid
|
||||
* @since 0.8.9
|
||||
*/
|
||||
private boolean verifyAddress(String addr) {
|
||||
if (addr == null || addr.length() <= 0)
|
||||
return false;
|
||||
try {
|
||||
InetAddress ia = InetAddress.getByName(addr);
|
||||
byte[] iab = ia.getAddress();
|
||||
boolean rv = TransportImpl.isPubliclyRoutable(iab);
|
||||
if (!rv)
|
||||
addFormError(_("The hostname or IP {0} is not publicly routable", addr));
|
||||
return rv;
|
||||
} catch (UnknownHostException uhe) {
|
||||
addFormError(_("The hostname or IP {0} is invalid", addr) + ": " + uhe);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void hiddenSwitch() {
|
||||
// Full restart required to generate new keys
|
||||
_context.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART));
|
||||
// FIXME don't call wrapper if not present, only rekey
|
||||
ConfigServiceHandler.registerWrapperNotifier(_context, Router.EXIT_GRACEFUL_RESTART, false);
|
||||
_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ public class ConfigNetHelper extends HelperBase {
|
||||
boolean enabled = TransportManager.isNTCPEnabled(_context);
|
||||
String hostname = _context.getProperty(PROP_I2NP_NTCP_HOSTNAME);
|
||||
boolean specified = hostname != null && hostname.length() > 0;
|
||||
String auto = _context.getProperty(PROP_I2NP_NTCP_AUTO_IP, "false");
|
||||
String auto = _context.getProperty(PROP_I2NP_NTCP_AUTO_IP, "true");
|
||||
if ((mode == 0 && (!specified) && auto.equals("false") && enabled) ||
|
||||
(mode == 1 && specified && auto.equals("false") && enabled) ||
|
||||
(mode == 2 && auto.equals("true") && enabled) ||
|
||||
|
||||
@@ -43,13 +43,32 @@ public class ConfigReseedHandler extends FormHandler {
|
||||
return arr[0].trim();
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
private void saveString(String config, String param) {
|
||||
String val = getJettyString(param);
|
||||
if (val != null && val.length() > 0)
|
||||
_context.router().setConfigSetting(config, val);
|
||||
else
|
||||
_context.router().removeConfigSetting(config);
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
private void saveBoolean(String config, String param) {
|
||||
boolean val = getJettyString(param) != null;
|
||||
_context.router().setConfigSetting(config, Boolean.toString(val));
|
||||
}
|
||||
|
||||
private void saveChanges() {
|
||||
String port = getJettyString("port");
|
||||
if (port != null)
|
||||
_context.router().setConfigSetting(Reseeder.PROP_PROXY_PORT, port);
|
||||
String host = getJettyString("host");
|
||||
if (host != null)
|
||||
_context.router().setConfigSetting(Reseeder.PROP_PROXY_HOST, host);
|
||||
saveString(Reseeder.PROP_PROXY_PORT, "port");
|
||||
saveString(Reseeder.PROP_PROXY_HOST, "host");
|
||||
saveString(Reseeder.PROP_PROXY_USERNAME, "username");
|
||||
saveString(Reseeder.PROP_PROXY_PASSWORD, "password");
|
||||
saveBoolean(Reseeder.PROP_PROXY_AUTH_ENABLE, "auth");
|
||||
saveString(Reseeder.PROP_SPROXY_PORT, "sport");
|
||||
saveString(Reseeder.PROP_SPROXY_HOST, "shost");
|
||||
saveString(Reseeder.PROP_SPROXY_USERNAME, "susername");
|
||||
saveString(Reseeder.PROP_SPROXY_PASSWORD, "spassword");
|
||||
saveBoolean(Reseeder.PROP_SPROXY_AUTH_ENABLE, "sauth");
|
||||
String url = getJettyString("reseedURL");
|
||||
if (url != null)
|
||||
_context.router().setConfigSetting(Reseeder.PROP_RESEED_URL, url.trim().replace("\r\n", ",").replace("\n", ","));
|
||||
@@ -60,8 +79,8 @@ public class ConfigReseedHandler extends FormHandler {
|
||||
Boolean.toString(req));
|
||||
_context.router().setConfigSetting(Reseeder.PROP_SSL_DISABLE,
|
||||
Boolean.toString(disabled));
|
||||
boolean proxy = getJettyString("enable") != null;
|
||||
_context.router().setConfigSetting(Reseeder.PROP_PROXY_ENABLE, Boolean.toString(proxy));
|
||||
saveBoolean(Reseeder.PROP_PROXY_ENABLE, "enable");
|
||||
saveBoolean(Reseeder.PROP_SPROXY_ENABLE, "senable");
|
||||
_context.router().saveConfig();
|
||||
addFormNotice(_("Configuration saved successfully."));
|
||||
}
|
||||
|
||||
@@ -20,9 +20,39 @@ public class ConfigReseedHelper extends HelperBase {
|
||||
return _context.getProperty(Reseeder.PROP_PROXY_HOST, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getUsername() {
|
||||
return _context.getProperty(Reseeder.PROP_PROXY_USERNAME, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getPassword() {
|
||||
return _context.getProperty(Reseeder.PROP_PROXY_PASSWORD, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getSport() {
|
||||
return _context.getProperty(Reseeder.PROP_SPROXY_PORT, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getShost() {
|
||||
return _context.getProperty(Reseeder.PROP_SPROXY_HOST, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getSusername() {
|
||||
return _context.getProperty(Reseeder.PROP_SPROXY_USERNAME, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getSpassword() {
|
||||
return _context.getProperty(Reseeder.PROP_SPROXY_PASSWORD, "");
|
||||
}
|
||||
|
||||
public String modeChecked(int mode) {
|
||||
boolean required = _context.getBooleanProperty(Reseeder.PROP_SSL_REQUIRED);
|
||||
boolean disabled = _context.getBooleanPropertyDefaultTrue(Reseeder.PROP_SSL_DISABLE);
|
||||
boolean disabled = _context.getBooleanProperty(Reseeder.PROP_SSL_DISABLE);
|
||||
if ((mode == 0 && (!disabled) && (!required)) ||
|
||||
(mode == 1 && (!disabled) && required) ||
|
||||
(mode == 2 && disabled))
|
||||
@@ -31,7 +61,26 @@ public class ConfigReseedHelper extends HelperBase {
|
||||
}
|
||||
|
||||
public String getEnable() {
|
||||
boolean enabled = _context.getBooleanProperty(Reseeder.PROP_PROXY_ENABLE);
|
||||
return checked(Reseeder.PROP_PROXY_ENABLE);
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getAuth() {
|
||||
return checked(Reseeder.PROP_PROXY_AUTH_ENABLE);
|
||||
}
|
||||
|
||||
public String getSenable() {
|
||||
return checked(Reseeder.PROP_SPROXY_ENABLE);
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
public String getSauth() {
|
||||
return checked(Reseeder.PROP_SPROXY_AUTH_ENABLE);
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
private String checked(String prop) {
|
||||
boolean enabled = _context.getBooleanProperty(prop);
|
||||
if (enabled)
|
||||
return "checked=\"true\"";
|
||||
return "";
|
||||
|
||||
@@ -30,21 +30,25 @@ public class ConfigRestartBean {
|
||||
if ( (nonce != null) && (systemNonce.equals(nonce)) && (action != null) ) {
|
||||
// Normal browsers send value, IE sends button label
|
||||
if ("shutdownImmediate".equals(action) || _("Shutdown immediately", ctx).equals(action)) {
|
||||
ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_HARD));
|
||||
if (ctx.hasWrapper())
|
||||
ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_HARD, false);
|
||||
//ctx.router().shutdown(Router.EXIT_HARD); // never returns
|
||||
ctx.router().shutdownGracefully(Router.EXIT_HARD); // give the UI time to respond
|
||||
} else if ("cancelShutdown".equals(action) || _("Cancel shutdown", ctx).equals(action) ||
|
||||
_("Cancel restart", ctx).equals(action)) {
|
||||
ctx.router().cancelGracefulShutdown();
|
||||
} else if ("restartImmediate".equals(action) || _("Restart immediately", ctx).equals(action)) {
|
||||
ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_HARD_RESTART));
|
||||
if (ctx.hasWrapper())
|
||||
ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_HARD_RESTART, false);
|
||||
//ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns
|
||||
ctx.router().shutdownGracefully(Router.EXIT_HARD_RESTART); // give the UI time to respond
|
||||
} else if ("restart".equals(action) || _("Restart", ctx).equals(action)) {
|
||||
ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART));
|
||||
if (ctx.hasWrapper())
|
||||
ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_GRACEFUL_RESTART, false);
|
||||
ctx.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
|
||||
} else if ("shutdown".equals(action) || _("Shutdown", ctx).equals(action)) {
|
||||
ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL));
|
||||
if (ctx.hasWrapper())
|
||||
ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_GRACEFUL, false);
|
||||
ctx.router().shutdownGracefully();
|
||||
}
|
||||
}
|
||||
@@ -71,7 +75,7 @@ public class ConfigRestartBean {
|
||||
buf.append("</b></center><br>");
|
||||
buttons(ctx, buf, urlBase, systemNonce, SET2);
|
||||
} else {
|
||||
if (System.getProperty("wrapper.version") != null)
|
||||
if (ctx.hasWrapper())
|
||||
buttons(ctx, buf, urlBase, systemNonce, SET3);
|
||||
else
|
||||
buttons(ctx, buf, urlBase, systemNonce, SET4);
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.util.List;
|
||||
import net.i2p.apps.systray.SysTray;
|
||||
import net.i2p.apps.systray.UrlLauncher;
|
||||
import net.i2p.router.Router;
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.startup.ClientAppConfig;
|
||||
|
||||
import org.tanukisoftware.wrapper.WrapperManager;
|
||||
@@ -17,65 +18,151 @@ import org.tanukisoftware.wrapper.WrapperManager;
|
||||
*/
|
||||
public class ConfigServiceHandler extends FormHandler {
|
||||
|
||||
public static class UpdateWrapperManagerTask implements Runnable {
|
||||
private int _exitCode;
|
||||
public UpdateWrapperManagerTask(int exitCode) {
|
||||
_exitCode = exitCode;
|
||||
}
|
||||
public void run() {
|
||||
try {
|
||||
WrapperManager.signalStopped(_exitCode);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
/**
|
||||
* Register two shutdown hooks, one to rekey and/or tell the wrapper we are stopping,
|
||||
* and a final one to tell the wrapper we are stopped.
|
||||
*
|
||||
* @since 0.8.8
|
||||
*/
|
||||
private void registerWrapperNotifier(int code, boolean rekey) {
|
||||
registerWrapperNotifier(_context, code, rekey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register two shutdown hooks, one to rekey and/or tell the wrapper we are stopping,
|
||||
* and a final one to tell the wrapper we are stopped.
|
||||
*
|
||||
* @since 0.8.8
|
||||
*/
|
||||
public static void registerWrapperNotifier(RouterContext ctx, int code, boolean rekey) {
|
||||
Runnable task = new UpdateWrapperOrRekeyTask(rekey, ctx.hasWrapper());
|
||||
ctx.addShutdownTask(task);
|
||||
if (ctx.hasWrapper()) {
|
||||
task = new FinalWrapperTask(code);
|
||||
ctx.addFinalShutdownTask(task);
|
||||
}
|
||||
}
|
||||
|
||||
public static class UpdateWrapperManagerAndRekeyTask implements Runnable {
|
||||
private int _exitCode;
|
||||
public UpdateWrapperManagerAndRekeyTask(int exitCode) {
|
||||
_exitCode = exitCode;
|
||||
/**
|
||||
* Rekey and/or tell the wrapper we are stopping,
|
||||
*/
|
||||
private static class UpdateWrapperOrRekeyTask implements Runnable {
|
||||
private final boolean _rekey;
|
||||
private final boolean _tellWrapper;
|
||||
private static final int HASHCODE = -123999871;
|
||||
private static final int WAIT = 30*1000;
|
||||
|
||||
public UpdateWrapperOrRekeyTask(boolean rekey, boolean tellWrapper) {
|
||||
_rekey = rekey;
|
||||
_tellWrapper = tellWrapper;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
if (_rekey)
|
||||
ContextHelper.getContext(null).router().killKeys();
|
||||
if (_tellWrapper)
|
||||
WrapperManager.signalStopping(WAIT);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make them all look the same since the hooks are stored in a set
|
||||
* and we don't want dups
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return HASHCODE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make them all look the same since the hooks are stored in a set
|
||||
* and we don't want dups
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return (o != null) && (o instanceof UpdateWrapperOrRekeyTask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tell the wrapper we are stopped.
|
||||
*
|
||||
* @since 0.8.8
|
||||
*/
|
||||
private static class FinalWrapperTask implements Runnable {
|
||||
private final int _exitCode;
|
||||
private static final int HASHCODE = 123999871;
|
||||
|
||||
public FinalWrapperTask(int exitCode) {
|
||||
_exitCode = exitCode;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
ContextHelper.getContext(null).router().killKeys();
|
||||
WrapperManager.signalStopped(_exitCode);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make them all look the same since the hooks are stored in a set
|
||||
* and we don't want dups
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return HASHCODE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make them all look the same since the hooks are stored in a set
|
||||
* and we don't want dups
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return (o != null) && (o instanceof FinalWrapperTask);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void processForm() {
|
||||
if (_action == null) return;
|
||||
|
||||
if (_("Shutdown gracefully").equals(_action)) {
|
||||
_context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_GRACEFUL));
|
||||
if (_context.hasWrapper())
|
||||
registerWrapperNotifier(Router.EXIT_GRACEFUL, false);
|
||||
_context.router().shutdownGracefully();
|
||||
addFormNotice(_("Graceful shutdown initiated"));
|
||||
} else if (_("Shutdown immediately").equals(_action)) {
|
||||
_context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_HARD));
|
||||
if (_context.hasWrapper())
|
||||
registerWrapperNotifier(Router.EXIT_HARD, false);
|
||||
_context.router().shutdown(Router.EXIT_HARD);
|
||||
addFormNotice(_("Shutdown immediately! boom bye bye bad bwoy"));
|
||||
} else if (_("Cancel graceful shutdown").equals(_action)) {
|
||||
_context.router().cancelGracefulShutdown();
|
||||
addFormNotice(_("Graceful shutdown cancelled"));
|
||||
} else if (_("Graceful restart").equals(_action)) {
|
||||
_context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART));
|
||||
// should have wrapper if restart button is visible
|
||||
if (_context.hasWrapper())
|
||||
registerWrapperNotifier(Router.EXIT_GRACEFUL_RESTART, false);
|
||||
_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
|
||||
addFormNotice(_("Graceful restart requested"));
|
||||
} else if (_("Hard restart").equals(_action)) {
|
||||
_context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_HARD_RESTART));
|
||||
// should have wrapper if restart button is visible
|
||||
if (_context.hasWrapper())
|
||||
registerWrapperNotifier(Router.EXIT_HARD_RESTART, false);
|
||||
_context.router().shutdown(Router.EXIT_HARD_RESTART);
|
||||
addFormNotice(_("Hard restart requested"));
|
||||
} else if (_("Rekey and Restart").equals(_action)) {
|
||||
addFormNotice(_("Rekeying after graceful restart"));
|
||||
_context.addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART));
|
||||
registerWrapperNotifier(Router.EXIT_GRACEFUL_RESTART, true);
|
||||
_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
|
||||
} else if (_("Rekey and Shutdown").equals(_action)) {
|
||||
addFormNotice(_("Rekeying after graceful shutdown"));
|
||||
_context.addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL));
|
||||
registerWrapperNotifier(Router.EXIT_GRACEFUL, true);
|
||||
_context.router().shutdownGracefully(Router.EXIT_GRACEFUL);
|
||||
} else if (_("Run I2P on startup").equals(_action)) {
|
||||
installService();
|
||||
|
||||
@@ -53,15 +53,17 @@ public class ConfigUIHelper extends HelperBase {
|
||||
* Any language-specific flag added to the icon set must be
|
||||
* added to the top-level build.xml for the updater.
|
||||
*/
|
||||
private static final String langs[] = {"ar", "de", "en", "es", "fi", "fr", "it", "nl", "pl", "pt", "ru",
|
||||
"sv", "vi", "zh"};
|
||||
private static final String flags[] = {"lang_ar", "de", "us", "es", "fi", "fr", "it", "nl", "pl", "pt", "ru",
|
||||
"se", "vn", "cn"};
|
||||
private static final String xlangs[] = {_x("Arabic"),
|
||||
private static final String langs[] = {"ar", "da", "de", "en", "es", "fi",
|
||||
"fr", "it", "nl", "pl", "pt", "ru",
|
||||
"sv", "uk", "vi", "zh"};
|
||||
private static final String flags[] = {"lang_ar", "dk", "de", "us", "es", "fi",
|
||||
"fr", "it", "nl", "pl", "pt", "ru",
|
||||
"se", "ua", "vn", "cn"};
|
||||
private static final String xlangs[] = {_x("Arabic"), _x("Danish"),
|
||||
_x("German"), _x("English"), _x("Spanish"),_x("Finnish"),
|
||||
_x("French"), _x("Italian"), _x("Dutch"), _x("Polish"),
|
||||
_x("Portuguese"), _x("Russian"), _x("Swedish"),
|
||||
_x("Vietnamese"), _x("Chinese")};
|
||||
_x("Ukrainian"), _x("Vietnamese"), _x("Chinese")};
|
||||
|
||||
/** todo sort by translated string */
|
||||
public String getLangSettings() {
|
||||
|
||||
@@ -24,7 +24,7 @@ public class ConfigUpdateHandler extends FormHandler {
|
||||
public static final String OLD_DEFAULT_NEWS_URL = "http://complication.i2p/news.xml";
|
||||
public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml";
|
||||
public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
|
||||
public static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + "";
|
||||
public static final String DEFAULT_REFRESH_FREQUENCY = 36*60*60*1000 + "";
|
||||
public static final String PROP_UPDATE_POLICY = "router.updatePolicy";
|
||||
public static final String DEFAULT_UPDATE_POLICY = "download";
|
||||
public static final String PROP_SHOULD_PROXY = "router.updateThroughProxy";
|
||||
|
||||
@@ -67,11 +67,14 @@ public class ConfigUpdateHelper extends HelperBase {
|
||||
return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateUnsigned\" >";
|
||||
}
|
||||
|
||||
private static final long PERIODS[] = new long[] { 12*60*60*1000l, 24*60*60*1000l, 48*60*60*1000l, -1l };
|
||||
private static final long PERIODS[] = new long[] { 12*60*60*1000l, 24*60*60*1000l,
|
||||
36*60*60*1000l, 48*60*60*1000l,
|
||||
3*24*60*60*1000l, 7*24*60*60*1000l,
|
||||
-1l };
|
||||
|
||||
public String getRefreshFrequencySelectBox() {
|
||||
String freq = _context.getProperty(ConfigUpdateHandler.PROP_REFRESH_FREQUENCY);
|
||||
if (freq == null) freq = ConfigUpdateHandler.DEFAULT_REFRESH_FREQUENCY;
|
||||
String freq = _context.getProperty(ConfigUpdateHandler.PROP_REFRESH_FREQUENCY,
|
||||
ConfigUpdateHandler.DEFAULT_REFRESH_FREQUENCY);
|
||||
long ms = -1;
|
||||
try {
|
||||
ms = Long.parseLong(freq);
|
||||
@@ -114,7 +117,7 @@ public class ConfigUpdateHelper extends HelperBase {
|
||||
buf.append(" selected=\"true\"");
|
||||
buf.append('>').append(_("Download and verify only")).append("</option>");
|
||||
|
||||
if (System.getProperty("wrapper.version") != null) {
|
||||
if (_context.hasWrapper()) {
|
||||
buf.append("<option value=\"install\"");
|
||||
if (_dontInstall)
|
||||
buf.append(" disabled=\"true\"");
|
||||
|
||||
@@ -3,19 +3,28 @@ package net.i2p.router.web;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.router.Job;
|
||||
import net.i2p.router.JobStats;
|
||||
|
||||
public class JobQueueHelper extends HelperBase {
|
||||
public JobQueueHelper() {}
|
||||
|
||||
public String getJobQueueSummary() {
|
||||
try {
|
||||
if (_out != null) {
|
||||
_context.jobQueue().renderStatusHTML(_out);
|
||||
renderStatusHTML(_out);
|
||||
return "";
|
||||
} else {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024);
|
||||
_context.jobQueue().renderStatusHTML(new OutputStreamWriter(baos));
|
||||
renderStatusHTML(new OutputStreamWriter(baos));
|
||||
return new String(baos.toByteArray());
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
@@ -23,4 +32,147 @@ public class JobQueueHelper extends HelperBase {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Moved from JobQueue
|
||||
* @since 0.8.9
|
||||
*/
|
||||
private void renderStatusHTML(Writer out) throws IOException {
|
||||
List<Job> readyJobs = new ArrayList(8);
|
||||
List<Job> timedJobs = new ArrayList(128);
|
||||
List<Job> activeJobs = new ArrayList(8);
|
||||
List<Job> justFinishedJobs = new ArrayList(8);
|
||||
|
||||
int numRunners = _context.jobQueue().getJobs(readyJobs, timedJobs, activeJobs, justFinishedJobs);
|
||||
|
||||
StringBuilder buf = new StringBuilder(32*1024);
|
||||
buf.append("<b><div class=\"joblog\"><h3>I2P Job Queue</h3><div class=\"wideload\">Job runners: ").append(numRunners);
|
||||
buf.append("</b><br>\n");
|
||||
|
||||
long now = _context.clock().now();
|
||||
|
||||
buf.append("<hr><b>Active jobs: ").append(activeJobs.size()).append("</b><ol>\n");
|
||||
for (int i = 0; i < activeJobs.size(); i++) {
|
||||
Job j = activeJobs.get(i);
|
||||
buf.append("<li>[started ").append(DataHelper.formatDuration2(now-j.getTiming().getStartAfter())).append(" ago]: ");
|
||||
buf.append(j.toString()).append("</li>\n");
|
||||
}
|
||||
buf.append("</ol>\n");
|
||||
buf.append("<hr><b>Just finished jobs: ").append(justFinishedJobs.size()).append("</b><ol>\n");
|
||||
for (int i = 0; i < justFinishedJobs.size(); i++) {
|
||||
Job j = justFinishedJobs.get(i);
|
||||
buf.append("<li>[finished ").append(DataHelper.formatDuration2(now-j.getTiming().getActualEnd())).append(" ago]: ");
|
||||
buf.append(j.toString()).append("</li>\n");
|
||||
}
|
||||
buf.append("</ol>\n");
|
||||
buf.append("<hr><b>Ready/waiting jobs: ").append(readyJobs.size()).append("</b><ol>\n");
|
||||
for (int i = 0; i < readyJobs.size(); i++) {
|
||||
Job j = readyJobs.get(i);
|
||||
buf.append("<li>[waiting ");
|
||||
buf.append(DataHelper.formatDuration2(now-j.getTiming().getStartAfter()));
|
||||
buf.append("]: ");
|
||||
buf.append(j.toString()).append("</li>\n");
|
||||
}
|
||||
buf.append("</ol>\n");
|
||||
out.flush();
|
||||
|
||||
buf.append("<hr><b>Scheduled jobs: ").append(timedJobs.size()).append("</b><ol>\n");
|
||||
TreeMap<Long, Job> ordered = new TreeMap();
|
||||
for (int i = 0; i < timedJobs.size(); i++) {
|
||||
Job j = timedJobs.get(i);
|
||||
ordered.put(Long.valueOf(j.getTiming().getStartAfter()), j);
|
||||
}
|
||||
for (Job j : ordered.values()) {
|
||||
long time = j.getTiming().getStartAfter() - now;
|
||||
buf.append("<li>").append(j.getName()).append(" in ");
|
||||
buf.append(DataHelper.formatDuration2(time)).append("</li>\n");
|
||||
}
|
||||
buf.append("</ol></div>\n");
|
||||
|
||||
out.flush();
|
||||
|
||||
getJobStats(buf);
|
||||
|
||||
out.flush();
|
||||
|
||||
out.write(buf.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the HTML for the job stats.
|
||||
* Moved from JobQueue
|
||||
* @since 0.8.9
|
||||
*/
|
||||
private void getJobStats(StringBuilder buf) {
|
||||
buf.append("<table>\n" +
|
||||
"<tr><th>Job</th><th>Runs</th>" +
|
||||
"<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>" +
|
||||
"<th>Pending</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th></tr>\n");
|
||||
long totRuns = 0;
|
||||
long totExecTime = 0;
|
||||
long avgExecTime = 0;
|
||||
long maxExecTime = -1;
|
||||
long minExecTime = -1;
|
||||
long totPendingTime = 0;
|
||||
long avgPendingTime = 0;
|
||||
long maxPendingTime = -1;
|
||||
long minPendingTime = -1;
|
||||
|
||||
List<JobStats> tstats = new ArrayList(_context.jobQueue().getJobStats());
|
||||
Collections.sort(tstats, new JobStatsComparator());
|
||||
|
||||
for (JobStats stats : tstats) {
|
||||
buf.append("<tr>");
|
||||
buf.append("<td><b>").append(stats.getName()).append("</b></td>");
|
||||
buf.append("<td align=\"right\">").append(stats.getRuns()).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getTotalTime())).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getAvgTime())).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMaxTime())).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMinTime())).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getTotalPendingTime())).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getAvgPendingTime())).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMaxPendingTime())).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMinPendingTime())).append("</td>");
|
||||
buf.append("</tr>\n");
|
||||
totRuns += stats.getRuns();
|
||||
totExecTime += stats.getTotalTime();
|
||||
if (stats.getMaxTime() > maxExecTime)
|
||||
maxExecTime = stats.getMaxTime();
|
||||
if ( (minExecTime < 0) || (minExecTime > stats.getMinTime()) )
|
||||
minExecTime = stats.getMinTime();
|
||||
totPendingTime += stats.getTotalPendingTime();
|
||||
if (stats.getMaxPendingTime() > maxPendingTime)
|
||||
maxPendingTime = stats.getMaxPendingTime();
|
||||
if ( (minPendingTime < 0) || (minPendingTime > stats.getMinPendingTime()) )
|
||||
minPendingTime = stats.getMinPendingTime();
|
||||
}
|
||||
|
||||
if (totRuns != 0) {
|
||||
if (totExecTime != 0)
|
||||
avgExecTime = totExecTime / totRuns;
|
||||
if (totPendingTime != 0)
|
||||
avgPendingTime = totPendingTime / totRuns;
|
||||
}
|
||||
|
||||
buf.append("<tr class=\"tablefooter\">");
|
||||
buf.append("<td><b>").append("SUMMARY").append("</b></td>");
|
||||
buf.append("<td align=\"right\">").append(totRuns).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(totExecTime)).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(avgExecTime)).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(maxExecTime)).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(minExecTime)).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(totPendingTime)).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(avgPendingTime)).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(maxPendingTime)).append("</td>");
|
||||
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(minPendingTime)).append("</td>");
|
||||
buf.append("</tr></table></div>\n");
|
||||
}
|
||||
|
||||
/** @since 0.8.9 */
|
||||
private static class JobStatsComparator implements Comparator<JobStats> {
|
||||
public int compare(JobStats l, JobStats r) {
|
||||
return l.getName().compareTo(r.getName());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -50,11 +50,11 @@ public class LogsHelper extends HelperBase {
|
||||
private String formatMessages(List<String> msgs) {
|
||||
if (msgs.isEmpty())
|
||||
return "<p><i>" + _("No log messages") + "</i></p>";
|
||||
boolean colorize = Boolean.valueOf(_context.getProperty("routerconsole.logs.color")).booleanValue();
|
||||
boolean colorize = _context.getBooleanPropertyDefaultTrue("routerconsole.logs.color");
|
||||
StringBuilder buf = new StringBuilder(16*1024);
|
||||
buf.append("<ul>");
|
||||
for (int i = msgs.size(); i > 0; i--) {
|
||||
String msg = msgs.get(i - 1);
|
||||
for (int i = msgs.size() - 1; i >= 0; i--) {
|
||||
String msg = msgs.get(i);
|
||||
msg = msg.replace("&", "&").replace("<", "<").replace(">", ">");
|
||||
// remove last \n that LogRecordFormatter added
|
||||
if (msg.endsWith(NL))
|
||||
@@ -63,18 +63,18 @@ public class LogsHelper extends HelperBase {
|
||||
msg = msg.replace("\n", "<br> \n");
|
||||
buf.append("<li>");
|
||||
if (colorize) {
|
||||
// TODO this would be a lot easier if LogConsoleBuffer stored LogRecords instead of formatted strings
|
||||
String color;
|
||||
// Homeland Security Advisory System
|
||||
// http://www.dhs.gov/xinfoshare/programs/Copy_of_press_release_0046.shtm
|
||||
// but pink instead of yellow for WARN
|
||||
// FIXME doesnt work for translated levels
|
||||
if (msg.contains("CRIT"))
|
||||
if (msg.contains(_("CRIT")))
|
||||
color = "#cc0000";
|
||||
else if (msg.contains("ERROR"))
|
||||
else if (msg.contains(_("ERROR")))
|
||||
color = "#ff3300";
|
||||
else if (msg.contains("WARN"))
|
||||
else if (msg.contains(_("WARN")))
|
||||
color = "#ff00cc";
|
||||
else if (msg.contains("INFO"))
|
||||
else if (msg.contains(_("INFO")))
|
||||
color = "#000099";
|
||||
else
|
||||
color = "#006600";
|
||||
|
||||
@@ -407,7 +407,6 @@ public class NetDbRenderer {
|
||||
*/
|
||||
private static int classifyTransports(RouterInfo info) {
|
||||
int rv = 0;
|
||||
String hash = info.getIdentity().getHash().toBase64();
|
||||
for (RouterAddress addr : info.getAddresses()) {
|
||||
String style = addr.getTransportStyle();
|
||||
if (style.equals("NTCP")) {
|
||||
|
||||
@@ -37,6 +37,8 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
||||
private File _newsFile;
|
||||
private File _tempFile;
|
||||
private static NewsFetcher _instance;
|
||||
private volatile boolean _isRunning;
|
||||
|
||||
//public static final synchronized NewsFetcher getInstance() { return _instance; }
|
||||
public static final synchronized NewsFetcher getInstance(I2PAppContext ctx) {
|
||||
if (_instance != null)
|
||||
@@ -64,8 +66,14 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
||||
_tempFile = new File(_context.getTempDir(), TEMP_NEWS_FILE);
|
||||
updateLastFetched();
|
||||
_updateVersion = "";
|
||||
_isRunning = true;
|
||||
}
|
||||
|
||||
/** @since 0.8.8 */
|
||||
void shutdown() {
|
||||
_isRunning = false;
|
||||
}
|
||||
|
||||
private void updateLastFetched() {
|
||||
if (_newsFile.exists()) {
|
||||
if (_lastUpdated == 0)
|
||||
@@ -108,7 +116,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
||||
|
||||
public void run() {
|
||||
try { Thread.sleep(INITIAL_DELAY + _context.random().nextLong(INITIAL_DELAY)); } catch (InterruptedException ie) {}
|
||||
while (true) {
|
||||
while (_isRunning) {
|
||||
if (!_updateAvailable) checkForUpdates();
|
||||
if (shouldFetchNews()) {
|
||||
fetchNews();
|
||||
@@ -351,7 +359,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
||||
|
||||
long now = _context.clock().now();
|
||||
if (_tempFile.exists()) {
|
||||
boolean copied = FileUtil.copy(_tempFile.getAbsolutePath(), _newsFile.getAbsolutePath(), true);
|
||||
boolean copied = FileUtil.copy(_tempFile, _newsFile, true, false);
|
||||
if (copied) {
|
||||
_lastUpdated = now;
|
||||
_tempFile.delete();
|
||||
|
||||
@@ -128,7 +128,8 @@ public class PluginUpdateChecker extends UpdateHandler {
|
||||
protected void update() {
|
||||
updateStatus("<b>" + _("Checking for update of plugin {0}", _appName) + "</b>");
|
||||
// use the same settings as for updater
|
||||
boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
|
||||
// always proxy, or else FIXME
|
||||
//boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
|
||||
String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
|
||||
int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
|
||||
_baos.reset();
|
||||
|
||||
@@ -183,7 +183,8 @@ class ProfileOrganizerRenderer {
|
||||
}
|
||||
buf.append("</table>");
|
||||
|
||||
buf.append("<h2><a name=\"flood\"></a>").append(_("Floodfill and Integrated Peers")).append("</h2>\n");
|
||||
buf.append("<h2><a name=\"flood\"></a>").append(_("Floodfill and Integrated Peers"))
|
||||
.append(" (").append(integratedPeers.size()).append(")</h2>\n");
|
||||
buf.append("<table>");
|
||||
buf.append("<tr>");
|
||||
buf.append("<th class=\"smallhead\">").append(_("Peer")).append("</th>");
|
||||
|
||||
@@ -342,10 +342,10 @@ public class RouterConsoleRunner {
|
||||
}
|
||||
|
||||
NewsFetcher fetcher = NewsFetcher.getInstance(I2PAppContext.getGlobalContext());
|
||||
Thread t = new I2PAppThread(fetcher, "NewsFetcher", true);
|
||||
t.start();
|
||||
Thread newsThread = new I2PAppThread(fetcher, "NewsFetcher", true);
|
||||
newsThread.start();
|
||||
|
||||
t = new I2PAppThread(new StatSummarizer(), "StatSummarizer", true);
|
||||
Thread t = new I2PAppThread(new StatSummarizer(), "StatSummarizer", true);
|
||||
t.start();
|
||||
|
||||
List<RouterContext> contexts = RouterContext.listContexts();
|
||||
@@ -356,6 +356,9 @@ public class RouterConsoleRunner {
|
||||
t.start();
|
||||
ctx.addShutdownTask(new PluginStopper(ctx));
|
||||
}
|
||||
ctx.addShutdownTask(new NewsShutdown(fetcher, newsThread));
|
||||
// stat summarizer registers its own hook
|
||||
ctx.addShutdownTask(new ServerShutdown());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -495,16 +498,31 @@ public class RouterConsoleRunner {
|
||||
}
|
||||
}
|
||||
|
||||
/*******
|
||||
public void stopConsole() {
|
||||
try {
|
||||
_server.stop();
|
||||
} catch (InterruptedException ie) {
|
||||
ie.printStackTrace();
|
||||
/** @since 0.8.8 */
|
||||
private class ServerShutdown implements Runnable {
|
||||
public void run() {
|
||||
try {
|
||||
_server.stop();
|
||||
} catch (InterruptedException ie) {}
|
||||
}
|
||||
}
|
||||
********/
|
||||
|
||||
/** @since 0.8.8 */
|
||||
private static class NewsShutdown implements Runnable {
|
||||
private final NewsFetcher _fetcher;
|
||||
private final Thread _newsThread;
|
||||
|
||||
public NewsShutdown(NewsFetcher fetcher, Thread t) {
|
||||
_fetcher = fetcher;
|
||||
_newsThread = t;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
_fetcher.shutdown();
|
||||
_newsThread.interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
public static Properties webAppProperties() {
|
||||
return webAppProperties(I2PAppContext.getGlobalContext().getConfigDir().getAbsolutePath());
|
||||
}
|
||||
|
||||
@@ -24,15 +24,15 @@ import net.i2p.router.Shitlist;
|
||||
* Moved from Shitlist.java
|
||||
*/
|
||||
public class ShitlistRenderer {
|
||||
private RouterContext _context;
|
||||
private final RouterContext _context;
|
||||
|
||||
public ShitlistRenderer(RouterContext context) {
|
||||
_context = context;
|
||||
}
|
||||
|
||||
private static class HashComparator implements Comparator {
|
||||
public int compare(Object l, Object r) {
|
||||
return ((Hash)l).toBase64().compareTo(((Hash)r).toBase64());
|
||||
private static class HashComparator implements Comparator<Hash> {
|
||||
public int compare(Hash l, Hash r) {
|
||||
return l.toBase64().compareTo(r.toBase64());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,9 +54,11 @@ public class ShitlistRenderer {
|
||||
for (Map.Entry<Hash, Shitlist.Entry> e : entries.entrySet()) {
|
||||
Hash key = e.getKey();
|
||||
Shitlist.Entry entry = e.getValue();
|
||||
long expires = entry.expireOn-_context.clock().now();
|
||||
if (expires <= 0)
|
||||
continue;
|
||||
buf.append("<li>").append(_context.commSystem().renderPeerHTML(key));
|
||||
buf.append(' ');
|
||||
long expires = entry.expireOn-_context.clock().now();
|
||||
String expireString = DataHelper.formatDuration2(expires);
|
||||
if (expires < 5l*24*60*60*1000)
|
||||
buf.append(_("Temporary ban expiring in {0}", expireString));
|
||||
|
||||
@@ -128,8 +128,8 @@ public class SummaryHelper extends HelperBase {
|
||||
return _("WARN-Firewalled with Inbound TCP Enabled");
|
||||
if (((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled())
|
||||
return _("WARN-Firewalled and Floodfill");
|
||||
if (_context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0)
|
||||
return _("WARN-Firewalled and Fast");
|
||||
//if (_context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0)
|
||||
// return _("WARN-Firewalled and Fast");
|
||||
return _("Firewalled");
|
||||
case CommSystemFacade.STATUS_HOSED:
|
||||
return _("ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart");
|
||||
@@ -221,8 +221,8 @@ public class SummaryHelper extends HelperBase {
|
||||
public int getWellIntegratedPeers() {
|
||||
if (_context == null)
|
||||
return 0;
|
||||
else
|
||||
return _context.profileOrganizer().countWellIntegratedPeers();
|
||||
//return _context.profileOrganizer().countWellIntegratedPeers();
|
||||
return _context.peerManager().getPeersByCapability(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL).size();
|
||||
}
|
||||
/**
|
||||
* How many peers the router ranks as failing.
|
||||
@@ -515,9 +515,12 @@ public class SummaryHelper extends HelperBase {
|
||||
*/
|
||||
public String getJobLag() {
|
||||
if (_context == null)
|
||||
return "0 ms";
|
||||
return "0";
|
||||
|
||||
Rate lagRate = _context.statManager().getRate("jobQueue.jobLag").getRate(60*1000);
|
||||
RateStat rs = _context.statManager().getRate("jobQueue.jobLag");
|
||||
if (rs == null)
|
||||
return "0";
|
||||
Rate lagRate = rs.getRate(60*1000);
|
||||
return DataHelper.formatDuration2((long)lagRate.getAverageValue());
|
||||
}
|
||||
|
||||
@@ -528,7 +531,7 @@ public class SummaryHelper extends HelperBase {
|
||||
*/
|
||||
public String getMessageDelay() {
|
||||
if (_context == null)
|
||||
return "0 ms";
|
||||
return "0";
|
||||
|
||||
return DataHelper.formatDuration2(_context.throttle().getMessageDelay());
|
||||
}
|
||||
@@ -540,7 +543,7 @@ public class SummaryHelper extends HelperBase {
|
||||
*/
|
||||
public String getTunnelLag() {
|
||||
if (_context == null)
|
||||
return "0 ms";
|
||||
return "0";
|
||||
|
||||
return DataHelper.formatDuration2(_context.throttle().getTunnelLag());
|
||||
}
|
||||
|
||||
@@ -113,13 +113,14 @@ class SummaryListener implements RateSummaryListener {
|
||||
String baseName = rs.getName() + "." + period;
|
||||
_name = createName(_context, baseName);
|
||||
_eventName = createName(_context, baseName + ".events");
|
||||
File rrdFile = null;
|
||||
try {
|
||||
RrdBackendFactory factory = RrdBackendFactory.getFactory(getBackendName());
|
||||
String rrdDefName;
|
||||
if (_isPersistent) {
|
||||
// generate full path for persistent RRD files
|
||||
File rrdDir = new SecureFile(_context.getRouterDir(), RRD_DIR);
|
||||
File rrdFile = new File(rrdDir, RRD_PREFIX + _name + RRD_SUFFIX);
|
||||
rrdFile = new File(rrdDir, RRD_PREFIX + _name + RRD_SUFFIX);
|
||||
rrdDefName = rrdFile.getAbsolutePath();
|
||||
if (rrdFile.exists()) {
|
||||
_db = new RrdDb(rrdDefName, factory);
|
||||
@@ -164,6 +165,9 @@ class SummaryListener implements RateSummaryListener {
|
||||
_log.error("Error starting RRD for stat " + baseName, oom);
|
||||
} catch (RrdException re) {
|
||||
_log.error("Error starting RRD for stat " + baseName, re);
|
||||
// corrupt file?
|
||||
if (_isPersistent && rrdFile != null)
|
||||
rrdFile.delete();
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error starting RRD for stat " + baseName, ioe);
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ import net.i2p.util.ObjectCounter;
|
||||
*/
|
||||
public class TunnelRenderer {
|
||||
private RouterContext _context;
|
||||
|
||||
private static final int DISPLAY_LIMIT = 200;
|
||||
|
||||
public TunnelRenderer(RouterContext ctx) {
|
||||
_context = ctx;
|
||||
@@ -77,12 +79,17 @@ public class TunnelRenderer {
|
||||
if (rs != null)
|
||||
processed = (long)rs.getRate(10*60*1000).getLifetimeTotalValue();
|
||||
int inactive = 0;
|
||||
int displayed = 0;
|
||||
for (int i = 0; i < participating.size(); i++) {
|
||||
HopConfig cfg = (HopConfig)participating.get(i);
|
||||
if (cfg.getProcessedMessagesCount() <= 0) {
|
||||
long count = cfg.getProcessedMessagesCount();
|
||||
if (count <= 0) {
|
||||
inactive++;
|
||||
continue;
|
||||
}
|
||||
processed += count;
|
||||
if (++displayed > DISPLAY_LIMIT)
|
||||
continue;
|
||||
out.write("<tr>");
|
||||
if (cfg.getReceiveTunnel() != null)
|
||||
out.write("<td class=\"cells\" align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
|
||||
@@ -120,9 +127,10 @@ public class TunnelRenderer {
|
||||
else
|
||||
out.write("<td class=\"cells\" align=\"center\">" + _("Participant") + "</td>");
|
||||
out.write("</tr>\n");
|
||||
processed += cfg.getProcessedMessagesCount();
|
||||
}
|
||||
out.write("</table>\n");
|
||||
if (displayed > DISPLAY_LIMIT)
|
||||
out.write("<div class=\"statusnotes\"><b>" + _("Limited display to the {0} tunnels with the highest usage", DISPLAY_LIMIT) + "</b></div>\n");
|
||||
out.write("<div class=\"statusnotes\"><b>" + _("Inactive participating tunnels") + ": " + inactive + "</b></div>\n");
|
||||
out.write("<div class=\"statusnotes\"><b>" + _("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B</b></div>\n");
|
||||
renderPeers(out);
|
||||
@@ -339,4 +347,9 @@ public class TunnelRenderer {
|
||||
private String _(String s) {
|
||||
return Messages.getString(s, _context);
|
||||
}
|
||||
|
||||
/** translate a string */
|
||||
public String _(String s, Object o) {
|
||||
return Messages.getString(s, o, _context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,8 +93,8 @@ public class UnsignedUpdateHandler extends UpdateHandler {
|
||||
_log.log(Log.CRIT, "Corrupt zip file from " + url);
|
||||
return;
|
||||
}
|
||||
String to = (new File(_context.getRouterDir(), Router.UPDATE_FILE)).getAbsolutePath();
|
||||
boolean copied = FileUtil.copy(_updateFile, to, true);
|
||||
File to = new File(_context.getRouterDir(), Router.UPDATE_FILE);
|
||||
boolean copied = FileUtil.copy(updFile, to, true, false);
|
||||
if (copied) {
|
||||
updFile.delete();
|
||||
String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY);
|
||||
@@ -115,7 +115,7 @@ public class UnsignedUpdateHandler extends UpdateHandler {
|
||||
_log.log(Log.CRIT, "Update was downloaded, will be installed at next restart");
|
||||
StringBuilder buf = new StringBuilder(64);
|
||||
buf.append("<b>").append(_("Update downloaded")).append("</b><br>");
|
||||
if (System.getProperty("wrapper.version") != null)
|
||||
if (_context.hasWrapper())
|
||||
buf.append(_("Click Restart to install"));
|
||||
else
|
||||
buf.append(_("Click Shutdown and restart to install"));
|
||||
@@ -124,7 +124,7 @@ public class UnsignedUpdateHandler extends UpdateHandler {
|
||||
}
|
||||
} else {
|
||||
_log.log(Log.CRIT, "Failed copy to " + to);
|
||||
updateStatus("<b>" + _("Failed copy to {0}", to) + "</b>");
|
||||
updateStatus("<b>" + _("Failed copy to {0}", to.getAbsolutePath()) + "</b>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,7 +285,7 @@ public class UpdateHandler {
|
||||
_log.log(Log.CRIT, "Update was VERIFIED, will be installed at next restart");
|
||||
StringBuilder buf = new StringBuilder(64);
|
||||
buf.append("<b>").append(_("Update downloaded")).append("<br>");
|
||||
if (System.getProperty("wrapper.version") != null)
|
||||
if (_context.hasWrapper())
|
||||
buf.append(_("Click Restart to install"));
|
||||
else
|
||||
buf.append(_("Click Shutdown and restart to install"));
|
||||
@@ -312,7 +312,8 @@ public class UpdateHandler {
|
||||
}
|
||||
|
||||
protected void restart() {
|
||||
_context.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART));
|
||||
if (_context.hasWrapper())
|
||||
ConfigServiceHandler.registerWrapperNotifier(_context, Router.EXIT_GRACEFUL_RESTART, false);
|
||||
_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,21 +33,46 @@
|
||||
</p>
|
||||
<div class="wideload">
|
||||
<table border="0" cellspacing="5">
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Reseed URL Selection")%></b></td>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Reseed URL Selection")%>:</b></td>
|
||||
<td><input type="radio" class="optbox" name="mode" value="0" <%=reseedHelper.modeChecked(0) %> >
|
||||
<%=intl._("Try SSL first then non-SSL")%>
|
||||
<b><%=intl._("Try SSL first then non-SSL")%></b><br>
|
||||
<input type="radio" class="optbox" name="mode" value="1" <%=reseedHelper.modeChecked(1) %> >
|
||||
<%=intl._("Use SSL only")%>
|
||||
<b><%=intl._("Use SSL only")%></b><br>
|
||||
<input type="radio" class="optbox" name="mode" value="2" <%=reseedHelper.modeChecked(2) %> >
|
||||
<%=intl._("Use non-SSL only")%></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Reseed URLs")%></b></td>
|
||||
<b><%=intl._("Use non-SSL only")%></b></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Reseed URLs")%>:</b></td>
|
||||
<td><textarea name="reseedURL" wrap="off" spellcheck="false"><jsp:getProperty name="reseedHelper" property="reseedURL" /></textarea></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Enable HTTP proxy (not used for SSL)")%></b></td>
|
||||
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Enable HTTP Proxy?")%></b></td>
|
||||
<td><input type="checkbox" class="optbox" name="enable" value="true" <jsp:getProperty name="reseedHelper" property="enable" /> ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTP Proxy Host")%>:</b></td>
|
||||
<td><input name="host" type="text" value="<jsp:getProperty name="reseedHelper" property="host" />" ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTP Proxy Port")%>:</b></td>
|
||||
<td><input name="port" type="text" value="<jsp:getProperty name="reseedHelper" property="port" />" ></td></tr>
|
||||
<td><input name="port" type="text" size="5" maxlength="5" value="<jsp:getProperty name="reseedHelper" property="port" />" ></td></tr>
|
||||
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Use HTTP Proxy Authorization?")%></b></td>
|
||||
<td><input type="checkbox" class="optbox" name="auth" value="true" <jsp:getProperty name="reseedHelper" property="auth" /> ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTP Proxy Username")%>:</b></td>
|
||||
<td><input name="username" type="text" value="<jsp:getProperty name="reseedHelper" property="username" />" ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTP Proxy Password")%>:</b></td>
|
||||
<td><input name="password" type="password" value="<jsp:getProperty name="reseedHelper" property="password" />" ></td></tr>
|
||||
|
||||
<!-- TODO Need SSLEepGet support
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Enable HTTPS Proxy?")%></b></td>
|
||||
<td><input type="checkbox" class="optbox" name="senable" value="true" <jsp:getProperty name="reseedHelper" property="senable" /> ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTPS Proxy Host")%>:</b></td>
|
||||
<td><input name="shost" type="text" value="<jsp:getProperty name="reseedHelper" property="shost" />" ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTPS Proxy Port")%>:</b></td>
|
||||
<td><input name="sport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="reseedHelper" property="sport" />" ></td></tr>
|
||||
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("Use HTTPS Proxy Authorization?")%></b></td>
|
||||
<td><input type="checkbox" class="optbox" name="sauth" value="true" <jsp:getProperty name="reseedHelper" property="sauth" /> ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTPS Proxy Username")%>:</b></td>
|
||||
<td><input name="susername" type="text" value="<jsp:getProperty name="reseedHelper" property="susername" />" ></td></tr>
|
||||
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTPS Proxy Password")%>:</b></td>
|
||||
<td><input name="spassword" type="password" value="<jsp:getProperty name="reseedHelper" property="spassword" />" ></td></tr>
|
||||
-->
|
||||
|
||||
</table></div>
|
||||
<hr><div class="formaction">
|
||||
<input type="submit" name="foo" value="<%=intl._("Cancel")%>" />
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<% } %>
|
||||
<h3><%=uihelper._("Router Console Language")%></h3>
|
||||
<jsp:getProperty name="uihelper" property="langSettings" />
|
||||
<%=uihelper._("Please contribute to the router console translation project! Contact the developers on IRC #i2p to help.")%>
|
||||
<%=uihelper._("Please contribute to the router console translation project! Contact the developers in #i2p-dev on IRC to help.")%>
|
||||
<hr><div class="formaction">
|
||||
<input type="reset" value="<%=intl._("Cancel")%>" >
|
||||
<input type="submit" name="shouldsave" value="<%=intl._("Apply")%>" >
|
||||
|
||||
@@ -42,7 +42,8 @@ if (c != null && c.length() > 0) {
|
||||
if (!response.isCommitted()) {
|
||||
response.sendError(403, ioe.toString());
|
||||
} else {
|
||||
net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).error("Error serving flags/" + c + ".png", ioe);
|
||||
// not an error, happens when the browser closes the stream
|
||||
net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).warn("Error serving flags/" + c + ".png", ioe);
|
||||
// Jetty doesn't log this
|
||||
throw ioe;
|
||||
}
|
||||
|
||||
@@ -27,16 +27,18 @@ Many of the stats on the summary bar may be
|
||||
<a href="configstats.jsp">configured</a> to be
|
||||
<a href="graphs.jsp">graphed</a> for further analysis.
|
||||
</p><h3>General</h3><ul>
|
||||
<li class="tidylist"><b>Ident:</b>
|
||||
<li class="tidylist"><b>Local Identity:</b>
|
||||
The first four characters (24 bits) of your 44-character (256-bit) Base64 router hash.
|
||||
The full hash is shown on your <a href="netdb.jsp?r=.">router info page</a>.
|
||||
Never reveal this to anyone, as your router info contains your IP.</li>
|
||||
<li class="tidylist"><b>Version:</b>
|
||||
The version of the I2P software you are running.</li>
|
||||
<li class="tidylist"><b>Now:</b>
|
||||
<%
|
||||
/* <li class="tidylist"><b>Now:</b>
|
||||
The current time (UTC) and the skew, if any. I2P requires your computer's time be accurate.
|
||||
If the skew is more than a few seconds, please correct the problem by adjusting
|
||||
your computer's time.</li>
|
||||
your computer's time.</li> */
|
||||
%>
|
||||
<li class="tidylist"><b>Reachability:</b>
|
||||
The router's view of whether it can be contacted by other routers.
|
||||
Further information is on the <a href="config.jsp#help">configuration page</a>.
|
||||
|
||||
@@ -30,20 +30,22 @@
|
||||
<jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
|
||||
<div class="welcome">
|
||||
<div class="langbox">
|
||||
<a href="/?lang=en&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=us" title="English" alt="English"></a>
|
||||
<a href="/?lang=ar&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=lang_ar" title="عربية" alt="عربية"></a>
|
||||
<a href="/?lang=zh&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a>
|
||||
<a href="/?lang=de&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||
<a href="/?lang=es&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||
<a href="/?lang=fi&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=fi" title="Suomi" alt="Suomi"></a>
|
||||
<a href="/?lang=fr&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a><br/>
|
||||
<a href="/?lang=it&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=it" title="Italiano" alt="Italiano"></a>
|
||||
<a href="/?lang=nl&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||
<a href="/?lang=pl&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=pl" title="Polski" alt="Polski"></a>
|
||||
<a href="/?lang=pt&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||
<a href="/?lang=ru&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||
<a href="/?lang=sv&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a>
|
||||
<a href="/?lang=vi&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=vn" title="Tiếng Việt" alt="Tiếng Việt"></a>
|
||||
<a href="/?lang=en&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=us" title="English" alt="English"></a>
|
||||
<a href="/?lang=ar&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=lang_ar" title="عربية" alt="عربية"></a>
|
||||
<a href="/?lang=zh&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=cn" title="中文" alt="中文"></a>
|
||||
<a href="/?lang=da&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=dk" title="Danish" alt="Danish"></a>
|
||||
<a href="/?lang=de&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||
<a href="/?lang=es&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||
<a href="/?lang=fi&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=fi" title="Suomi" alt="Suomi"></a>
|
||||
<a href="/?lang=fr&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=fr" title="Français" alt="Français"></a><br/>
|
||||
<a href="/?lang=it&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=it" title="Italiano" alt="Italiano"></a>
|
||||
<a href="/?lang=nl&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||
<a href="/?lang=pl&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=pl" title="Polski" alt="Polski"></a>
|
||||
<a href="/?lang=pt&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||
<a href="/?lang=ru&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||
<a href="/?lang=sv&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a>
|
||||
<a href="/?lang=uk&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=ua" title="Ukrainian" alt="Ukrainian"></a>
|
||||
<a href="/?lang=vi&consoleNonce=<%=consoleNonce%>"><img style="padding: 0 2px;" src="/flags.jsp?c=vn" title="Tiếng Việt" alt="Tiếng Việt"></a>
|
||||
</div>
|
||||
<a name="top"></a>
|
||||
<h2><%=intl._("Welcome to I2P")%></h2>
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
<p>
|
||||
<b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br>
|
||||
<b>Java version:</b> <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)<br>
|
||||
<b>Wrapper version:</b> <%=System.getProperty("wrapper.version", "none")%><br>
|
||||
<b>Platform:</b> <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%><br>
|
||||
<b>Processor:</b> <%=net.i2p.util.NativeBigInteger.cpuModel()%> (<%=net.i2p.util.NativeBigInteger.cpuType()%>)<br>
|
||||
<b>Jbigi:</b> <%=net.i2p.util.NativeBigInteger.loadStatus()%><br>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user