Compare commits

..

193 Commits

Author SHA1 Message Date
idk
0e8e8480ea Patch for family key issue in 1.8.0 affecting Android 2022-06-17 03:07:37 -04:00
zzz
8256f61d56 1.8.0 / 0.9.54 2022-05-23 09:25:37 -04:00
zzz
ffc5ed8dc2 i2psnark standalone: Add hint to disable browser launch on windows 2022-05-23 09:10:48 -04:00
zzz
860eb22af7 refresh Debian patch 2022-05-23 08:47:56 -04:00
zzz
1a050303fa bump for review 2022-05-20 13:30:19 -04:00
idk
ce0c84c5d9 make SAMException class public so that it can easily be used by SAM implementers/embedders. Looks like it should have been public, all the constructors are public but the public keyword is missing on the class itself. Make tabs and spacing consistent in that file. 2022-05-19 14:37:17 -04:00
zzz
b537bd18b0 bump -20-rc 2022-05-19 13:40:25 -04:00
zzz
de79f52c81 New zh_TW translations 2022-05-19 13:35:28 -04:00
zzz
a5bc80da09 i2ptunnel: Improve message on filter file error 2022-05-19 13:15:16 -04:00
zzz
5f4ad87d10 Bump build time 2022-05-19 13:13:16 -04:00
zzz
cc56c4b506 Rebuild updated man page translations 2022-05-19 13:12:39 -04:00
zzz
13efc59916 Pull translations from Transifex 2022-05-19 13:10:57 -04:00
zzz
515a9b8d0d i2psnark: Fix 'left' amount in announce exceeding size
and causing tracker error on initial announce
2022-05-17 09:51:34 -04:00
zzz
52958b95d5 i2ptunnel: Add log message on reconnect 2022-05-14 08:58:58 -04:00
zzz
b36ed7de1a SSU2: Method scope 2022-05-14 08:52:15 -04:00
zzz
693aefe83a javadoc 2022-05-14 08:50:37 -04:00
zzz
ed30da0f0f NetDB: Remove dup now() calls 2022-05-14 08:48:13 -04:00
zzz
81255e19ae Transport: Fix thrashing of UPnP IPv6 listen sockets
Strip % suffixes from addresses before comparing
Fix HTTPMUSocket.getLocalAddress() to return the correct bound address
Throw exception on multicast socket bind failures, don't attempt
further operations on failed sockets
Add toString() to sockets for debugging
Log tweaks
2022-05-11 11:54:25 -04:00
zzz
07dbab9f02 Util: Rename modified apache classes (Gitlab ticket #353)
to avoid conflict in applications linking to apache jars
As requested by 'mesh' project
Remove with-libhttpclient-java build option
No known external uses other than obsolete i2pcontrol plugin
2022-05-11 07:54:56 -04:00
zzz
bf27bf140d poupdate-source 2022-05-10 12:41:09 -04:00
idk
3a906a6ce5 Merge branch 'sam-secure-session' into 'master'
Interactive SAM Authentication Interface

See merge request i2p-hackers/i2p.i2p!58
2022-05-07 16:36:39 +00:00
idk
47e02f7930 Interactive SAM Authentication Interface 2022-05-07 16:36:38 +00:00
zzz
75b808fcf6 DoH Server list update 2022-05-06 08:50:13 -04:00
zzz
5cbdb7d806 Tomcat 9.0.62 2022-05-02 11:31:45 -04:00
zzz
2c8428d85e GeoIP 2022-05-01 2022-05-02 10:15:06 -04:00
zzz
8fe9d7ac06 SSU2 minor updates
Send ack for peer test and relay blocks
Add SSU2 pending inbound states to establisher check
Remove unused PacketBuilder2 method
2022-04-30 11:44:52 -04:00
zzz
db8a843e82 SSU: Enforce peer test message 4 in-session
for routers 0.9.52 or higher
2022-04-29 09:41:10 -04:00
zzz
a730c1acea SSU2: Handle RI block in Data and Peer Test messages
Don't process out-of-session Peer Test message unless enabled
2022-04-28 10:52:01 -04:00
zzz
d6aaf3ee3a NTCP: Don't flood RI block unless newer
Don't accept store of our RI in RI block
2022-04-28 10:49:13 -04:00
zzz
9e4063a161 NetDB: Don't flood RIs banlisted forever 2022-04-28 10:47:01 -04:00
zzz
008943f699 SSU2: Peer Test fixes part 6
Change size/ip/port fields to match changes in proposal 159
2022-04-27 08:30:22 -04:00
zzz
71a58cb1bf Crypto: Destroy ChaCha/Poly after one-time-use 2022-04-25 10:05:16 -04:00
zzz
4a6f6f8647 SSU2: Peer Test fixes part 5
Fix extraction of Charlie address after receiving message 4
for use in message 6
2022-04-25 07:38:48 -04:00
zzz
32bba60bed SSU2: Peer Test fixes part 4
Fix NPE sending message 6
2022-04-24 15:46:57 -04:00
zzz
0f3abf0c9e SSU: Publish empty IPv6 address when missing introducers 2022-04-24 10:23:33 -04:00
zzz
5c1b6ba703 SSU2: Add properties to address when missing introducers 2022-04-24 09:36:23 -04:00
zzz
5e6ec442a7 SSU2: Fix PacketPusher NPE 2022-04-24 09:35:00 -04:00
zzz
cdf5bec155 SSU2: Peer Test fixes part 3
Reject if alice/charlie already connected
Do not retransmit msg 1 after receiving msg 4
Log tweaks
2022-04-24 08:57:20 -04:00
zzz
281bf68098 SSU2: Peer Test fixes part 2
Don't send message 5 unless we sent accept in message 3
Fix packet length for messages 5-7
Pass messages 5-7 from PacketHandler to PeerTestManager
Decrypt and process messages 5-7
Handle messages 4 and 5 in either order
Don't set test complete after message 5
Build data block for message 6
Log tweaks
2022-04-23 15:57:00 -04:00
zzz
ce2b5639b5 SSU2: Peer Test fixes part 1
Store our IP/port in PeerState2
Send our IP/port in message 1
Fix signature validation of message 4
Check for 0 status in messages 1 and 2
Fail on nonzero status in message 4
Log tweaks
2022-04-23 12:13:03 -04:00
zzz
4c10b414c4 InNetMessagePool: Remove some low-level logging 2022-04-17 10:13:46 -04:00
zzz
4c15a0e1c4 i2psnark: Make PeerCoordinatorSet and ConnectionAcceptor final 2022-04-17 10:11:19 -04:00
zzz
203fbdaa9f Console: Usage formatting on /tunnels 2022-04-17 10:10:18 -04:00
zzz
9431b9cfdc i2psnark: Soft restart fixes part 5
Do not stop the ConnectionAcceptor after RouterRestartException,
delay and reconnect instead.
Fix restart() to actually restart after stopped.
2022-04-17 09:56:07 -04:00
zzz
2bec84dd88 Streaming: Soft restart fixes part 4
Do not clear the DisconnectListeners after notification
2022-04-17 09:51:30 -04:00
zzz
cf7efcada8 I2CP: Soft restart fixes part 3
Remove low-level I2CP reconnector
as it may result in duplicate destinations after
higher-level (i2ptunnel) or application-layer reconnections
Root cause identified by BiglyBT
Gitlab issue #350
2022-04-17 09:45:40 -04:00
zzz
dda25bf1ed Router: Restart fixes part 2
Don't set our RI loaded from disk if too old
Rekeying was prevented by previous checkin,
but this fixes root cause
2022-04-14 08:25:16 -04:00
zzz
04b1bdb453 Router: Soft restart fixes part 1
Reset uptime on soft restart
Don't rekey after failure to store our RI due to clock skew
Change comm system state during soft restart
Restarter log tweaks
2022-04-13 10:28:43 -04:00
zzz
e04d31eb04 Update: Log full path to update file 2022-04-12 09:33:06 -04:00
zzz
706ed2ced2 javadoc 2022-04-12 09:33:06 -04:00
zzz
bb7278c5f6 Transport: Remove unnecessary isEmpty() check 2022-04-12 09:33:06 -04:00
zzz
3edc235104 SSU2: Minor updates
send timeout code in termination
remove unused intro key block handling
log tweaks
2022-04-12 09:33:06 -04:00
zzz
806046df64 One more ihost to itag change, missed in earlier checkin 2022-04-12 09:33:06 -04:00
zzz
345c64ebaf Tunnels: Don't build client tunnels less than min length
even if we don't have enough peers
2022-04-12 09:33:05 -04:00
zzz
53eb6ba7e0 Console: Fix Sybil closest hash tabs 2022-04-12 09:33:05 -04:00
zzz
eaa526583d Transport: Fix UPnP deadlock 2022-04-12 09:33:05 -04:00
idk
c0b8fe94a8 fix margins on dark theme bandwidth config table and info div 2022-04-11 13:59:26 -04:00
idk
6e5049c1db remove remaining absolute tags from xhr's on wizard page 2022-04-11 13:56:11 -04:00
idk
949f619ecc fix margin on bandwidth configuration page, fix alignment on bandwidth configuration page, align informational text to language start 2022-04-11 13:35:13 -04:00
zzz
f7c3e06db5 I2CP: Fix external I2CP broken when session ID is 0
one chance in 64K, broken since 2005
don't revert previous attempted fix using synching,
that's still a good idea
2022-04-11 10:30:29 -04:00
idk
1a26e1789c remove the startup wizard images themselves from the source tree 2022-04-08 16:55:31 -04:00
idk
e40bbc9f18 Overhaul CSS n New Install Wizard in order to make it less dependent on absolute positioning. Remove confusing M-Lab measurement table since the meaningful results are already populated in the configuration table. Adjust postioning of some elements on the bandwidth config pages. remove the old images from both themes. 2022-04-08 16:53:36 -04:00
idk
ec72f3cdf6 disable high-contrast mode on browsers where it is possible 2022-04-07 22:36:09 -04:00
zzz
b19998c072 Console: Change sidebar netdb tooltip 2022-04-06 08:37:41 -04:00
zzz
66e1c94bee Console: Use full hash for links to RI
for efficient lookup and to prevent display of dup prefixes
2022-04-06 08:22:12 -04:00
zzz
0449589406 SSU2: Fix hashcode function to detect dup acks
Arrays.hashCode() interacted badly with it,
causing numerous false positives
2022-04-05 14:13:23 -04:00
zzz
cc85df19aa SSU2: Fragmented Session Confirmed
Revert related parts of "Prep for fragmented RI",
we are now fragmenting Session Confirmed instead.
Fragment and send multiple Session Confirmed packets if required
Reassemble Session Confirmed packets

Don't process ack block identical to previous received
Log tweaks
bump -12
2022-04-05 09:26:42 -04:00
zzz
8418bda5a5 Console: Add netdb search options for v1 or v2 only transports 2022-04-05 08:22:26 -04:00
zzz
75492514ca SSU: Fix packet-too-large check in UDPSender 2022-04-05 07:55:28 -04:00
zzz
e43810f182 SSU2: Don't send our RI after outbound handshake, it's in the handshake already 2022-04-05 07:49:43 -04:00
zzz
9d49dc7af7 SSU2: Fix NPE in PeerState.loadFrom() 2022-04-05 07:47:56 -04:00
zzz
680320dede SSU2: Add termination reason codes 2022-04-05 07:45:02 -04:00
zzz
b2d6a091d1 Add more family certs 2022-03-31 06:05:57 -04:00
zzz
5d22a2152a Data: Add cached X25519/Ed25519 key cert, now common 2022-03-28 08:30:36 -04:00
zzz
acbf849b44 Crypto: Micro-optimize AES encrypt loop 2022-03-28 08:08:22 -04:00
zzz
7cf9895908 Transport: Add util methods for AddressType
WIP, not hooked in
2022-03-28 06:38:18 -04:00
zzz
d41c39a4d0 Debian: Add Java 18 2022-03-28 06:24:08 -04:00
zzz
b1852c127b SSU2: Prep for fragmented RI (WIP)
Fix IES2 not being removed from pending after complete
Don't send DSM after handshake
Validate conn ID before pkt type for data pkts
More log tweaks

SSU: Increase min pending establish states limit (unless slow)
Reduce IB establish timeout to 15s
Log pending inbound establish states when limit exceeded
Log tweaks to add establish state lifetime
Bump -11
2022-03-27 12:36:12 -04:00
zzz
8c59c514b2 Router: Validate family sig at startup
when loaded from router.info, and discard if invalid or when family changed.
This fixes some routers out there with bad sigs.
Don't loop forever through LoadRouterInfoJob.
2022-03-27 08:21:22 -04:00
zzz
93493a6d15 Crypto: Add provider in CertUtil so we can load EdDSA certs
Check cert sigs when loading, and log warning on failure
2022-03-27 08:00:08 -04:00
zzz
03e5c6c13c Crypto: Add official EdDSA OIDs to provider 2022-03-26 13:05:28 -04:00
zzz
826bf3c24f SSU2: Hook in IMF Bloom filter to detect dups
Call messagePartiallyReceived() even for dups or expired messages
so an ack is generated.
2022-03-26 11:39:10 -04:00
zzz
68273cd256 SSU2: Reduce ack delay, see MR !57
See previous checkin for SSU 1.
This change dramatically reduces the measured RTT to get it much closer to the real RTT by reducing the ack delay.
With the ack delay dependent on the measured RTT, the measured RTT will increase.

Simulation results: For a denominator D in the ack delay calculation (currently 2) and a true RTT = TRTT:
For D <= about 2, measured RTT -> TRTT + 2 * TRTT/D For D >= about 4, measured RTT -> TRTT + TRTT/D

In other words, for D == 2, measured RTT -> 2 * TRTT. For a TRTT of 50, the measured RTT is 100.
D == 2 is too small. It's been like that since 2005.
Testnet results: measured RTT 80-90

This changes D to 6. measured RTT -> 6/5 * TRTT.
Simulation results: For a TRTT of 50, the measured RTT is 58.
Testnet results: measured RTT 60
2022-03-26 07:04:49 -04:00
zzz
e130f85a65 Merge branch 'ssuackdelay' into 'master'
SSU: Reduce ack delay to minimize addition to measured RTT

See merge request i2p-hackers/i2p.i2p!57
2022-03-26 10:53:49 +00:00
zzz
9385ce7080 Console: Prevent creating a family that another router is using 2022-03-25 08:47:19 -04:00
zzz
da190cc24f SSU2 cleanups
Remove padding and unknown block callbacks
Remove handshake state logging in IES2 now that i2pd works
2022-03-25 08:27:53 -04:00
zzz
2a6dc58659 SSU: Reduce ack delay to minimize addition to measured RTT 2022-03-25 05:59:33 -04:00
zzz
f4eda0551d Router: Change quick address check for introducers
from ihost0 to itag0, because SSU2 probably won't use ihost
2022-03-24 17:31:48 -04:00
zzz
0560b3221d SSU2: Flush tokens on ip/port change
both inbound and outbound
2022-03-24 05:21:58 -04:00
zzz
631a6dd2b2 I2CP: Synch fixes
Synch fields in the data messages both directions,
after one report of zero session ID in MessagePayloadMessage
to an external client on fast hardware with Java 18.
Add new constructors for efficiency.
Deprecated setters, unit tests not changed, TODO.
Should fix all the other messages also, TODO.
2022-03-23 07:25:01 -04:00
zzz
0154a87cbf SSU2: Refactor tokens
Store OB tokens by IP/port
Centralize token generation and expiration in Establishment Manager
Add methods to flush OB tokens on IP/port change
Log tweaks
Javadoc fix
2022-03-23 06:46:01 -04:00
zzz
4f8ad3b6cb Router family fixes
Don't overwrite an existing family keystore file
Don't allow starting a new family with an existing family keystore file
Don't add family to RI until we have restarted and have a keystore file
Don't fail a netdb store for no family sig
Don't ever fail our own netdb store for family errors, to avoid rekey/restart
2022-03-22 08:03:18 -04:00
zzz
458e980e2f bump -10, javadoc typo 2022-03-20 07:59:32 -04:00
zzz
e08d2f354a File missed in previous netdb checkin 2022-03-20 07:57:43 -04:00
zzz
037e6940a9 SSU2: More work on peer test
generate msgs 1,5-7
handle msgs 5-7
log tweaks
2022-03-20 07:53:41 -04:00
zzz
b3055feff6 NetDB: Remove duplicate store in FloodOnlyLookupMatchJob
which bypassed all the checks in HandleFloodfillDatabaseStoreMessageJob
Don't store an entry which is older
2022-03-20 07:45:33 -04:00
zzz
c520dcb0f6 NetDB: Refactor family validation
Return a result code from verify()
Load all known certs at startup rather than continually reloading them
Only give full verified status to known keys
Enforce signatures in netdb store when key is available
Show family verification status on /netdb
Export our cert to disk if missing
Add stormycloud family cert
Bypass /24 Sybil penalty
2022-03-20 07:41:49 -04:00
zzz
fc88d672c5 Console: Fix rare IAE on destination sort 2022-03-18 11:40:09 -04:00
zzz
c62884ef85 SSU2: Implement peer test state machine
msgs 5-7 still TODO
WIP, untested
2022-03-18 10:21:30 -04:00
zzz
d9c629a6b1 SSU2: Log tweaks 2022-03-17 16:45:16 -04:00
zzz
70b7d1204b SSU2: Still more prep for Peer Test (WIP) 2022-03-17 16:43:24 -04:00
zzz
a90bbc3554 SSU2: More prep for Peer Test (WIP) 2022-03-17 16:10:26 -04:00
zzz
c2ec6cdeff SSU2: Set _lastACKSend 2022-03-17 16:08:15 -04:00
zzz
f57abe84bd SSU: Peer Test refactor
to store Bob's PeerState directly in PeerTestState
prep for SSU2
2022-03-17 16:04:28 -04:00
zzz
a1ee8220bb SSU2: Relay and Peer Test WIP
Packet building, fix peer test block
Not hooked in
2022-03-17 10:48:10 -04:00
zzz
ce73b9e8da Console: Remove CSS for hidden text on /graph 2022-03-16 07:59:55 -04:00
zzz
e6c3c097b5 Console: Remove UTC text already hidden by CSS 2022-03-16 07:47:26 -04:00
zzz
8961009292 SSU2: Minor cleanups
Add min packet size constants and notes
Don't attempt to decrypt a packet as a new inbound session if too small
Remove unused payload[] in IES2, now decrypted in-place
Log level tweaks in Establisher
2022-03-16 07:28:22 -04:00
zzz
de27cb1a46 Util: Increase min log file size limit
Rotate the log before we hit the limit, not after
2022-03-16 07:22:00 -04:00
zzz
e8afbc5b92 Transport: Don't use HE addresses for GeoIP
Limit max MTU for HE addresses
2022-03-15 14:30:04 -04:00
zzz
587409daa7 SSU2: Compress large RIs in Session Confirmed
even if they would fit in the MTU uncompressed,
to save bandwidth and room for other blocks
2022-03-15 07:23:53 -04:00
zzz
af5019c8dd SSU2: Fixes part 11
Save data messages received before or immediately after session confirmed
by queueing them for processing after the PeerState2 is created.
The fragments for the first I2NP message from Alice to Bob are frequently lost,
this will hopefully fix it.
Not fully tested, needs wider network testing.
2022-03-15 07:20:23 -04:00
zzz
46bba0fe71 SSU2: Fixes part 10
Avoid relaying until it's implemented:
Don't use SSU2 for an SSU address with introducers (fixes NPE)
Don't connect to SSU2 address without host/port
Don't ask for relay tag
Log tweaks
2022-03-15 07:12:25 -04:00
zzz
049456493f SSU2: Stubs for relay and peer test (phase 2) 2022-03-13 12:42:13 -04:00
zzz
2f63762c80 SSU2: Fixes part 9
Fix length calculation to see if new token block will fit in session confirmed
Extend timeout after sending retry
Fix retx timer for sess req after sending token req
Remove dup call to confirmedPacketsSent()
Cancel ack timer when sending acks
Include intro key in firewalled addresses too
Use SSU2 version of ping packet for SSU2 peers
Reduce max padding
Log tweaks
2022-03-13 07:33:36 -04:00
zzz
ca0d9f5a26 Tunnels: Reduce build reply timeout 2022-03-12 11:37:29 -05:00
zzz
aa620f5ed3 SSU2: Fixes part 8
Fix packet length for retransmitted handshake messages
Expire pending acks
2022-03-12 11:08:20 -05:00
zzz
15bb157126 NTCP: Encrypt handshake options in-place
round timestamp in Session Created
2022-03-12 09:48:33 -05:00
zzz
7e3e42ce42 i2psnark standalone: Add DTG and notifications 2022-03-11 07:23:46 -05:00
zzz
981c5e3878 i2psnark: Don't js-reload CSS on first click 2022-03-11 07:13:09 -05:00
zzz
393ee71ad9 SSU2: Fixes part 7
Clean up and optimize ack handling
Log tweaks and javadocs
2022-03-10 10:27:19 -05:00
zzz
97736cef1c SSU2: Fixes part 6
MTU and related fixes:
Fix max fragment size
Fix max space for acks
Fix max packet size
Pull MTU from best address in Session Confirmed
Pass MTU from establish state to peer state
Use SSU2 min/default/max MTU in PeerState
Stop looping when out of space in OMF (SSU 1 too)
2022-03-09 13:53:16 -05:00
zzz
25af51faf9 SSU2: Fixes part 5
Correctly calculate skew after retry in establish state
Pass calculated skew from establish state to peer state
Round time in DateTime block
Periodically send DateTime block
Handle DateTime block in peer state
2022-03-09 07:04:31 -05:00
zzz
a717dfb923 DTG: Add new ExternalMain class for app context use
that does not require router.jar
and rework other classes as necessary
2022-03-09 05:21:58 -05:00
zzz
e594b9532c SSU2: Track dup packets received
Log tweaks
2022-03-09 04:37:36 -05:00
zzz
a7a5b06b5c I2NP: Fix TunnelGatewayMessage.calculateWrittenLength()
so it doesn't null out the contained message.
Required for SSU2.
Unrelated TunnelDispatcher cleanup done while trying to find the problem.
2022-03-08 05:39:47 -05:00
zzz
eb72e97c03 SSU2: Fixes part 4
Fix deadlock in AckTimer
Enforce token in IES2
Increase bitfield sizes in PS2
Log tweaks
2022-03-07 10:44:17 -05:00
zzz
25cdc988e1 SSU2: Fixes part 3
Handle acks
Set ack timer
Retransmit session confirmed
Fix bitfield constructor when no ranges
2022-03-07 09:55:10 -05:00
zzz
3ce669575f SSU2: Fixes part 2
Add method to put additional blocks in data messages
Send and handle termination blocks
2022-03-06 07:31:16 -05:00
zzz
63aa64f8bb Console: Improve class selection on /configlogging 2022-03-06 06:16:59 -05:00
zzz
a6f61d2bf6 SSU2: Fixes part 1
after initial testnet testing

Use correct intro key for Session/Token request
Fix state management in EstablishmentManager, OES2, IES2
Fix next send time during handshake
Fix header decryption in PacketHandler
Add additional packet checks in IES2 handling
Remove expired IES immediately (SSU1 also)
Failsafe sleep in EstablishmentManager on exception
Remove dup requestSent() calls
Don't release packet in PS2
Log tweaks and javadocs
2022-03-06 06:15:23 -05:00
zzz
9457271ce6 Transport: Fix wasUnreachable() for transports with alt style
Only affects NTCP for now.
This bug had little impact when both transports were enabled,
but significantly harmed connectivity and tunnel building for NTCP2-only.
Decrease unreachable cache time in testnet
Make cache cleaner a little more efficient
2022-03-04 09:17:26 -05:00
zzz
22512d3889 i2psnark standalone: Add more CLI messages
Increase memory
2022-03-04 07:15:16 -05:00
zzz
a7115263f0 i2psnark: Reduce log level 2022-03-04 05:57:27 -05:00
zzz
c4b167b845 i2psnark: Fix css icon link 2022-03-04 05:52:44 -05:00
zzz
5e09245234 i2psnark: Add js theme preview 2022-03-04 05:47:18 -05:00
zzz
fee38c1c32 Console: Add SSU version column to /peers 2022-03-04 05:36:18 -05:00
zzz
a1ced67bad Transport: Fix port selection for NTCP-only 2022-03-04 05:06:01 -05:00
zzz
87f7d470a6 bump -3 2022-03-03 13:38:37 -05:00
zzz
32d60858da NTCP: Start out reachable if SSU disabled
So peers will attempt to connect
2022-03-03 13:37:28 -05:00
zzz
be4ad7eba9 NetDB: Load reseed RI if newer than that in-memory
previously, was only loaded if not known at all
2022-03-03 13:11:08 -05:00
zzz
7f8fa825ac SSU2: More debug logging additions/fixes 2022-03-02 11:08:57 -05:00
zzz
1cd5926f6c SSU2: Debug logging additions/fixes 2022-03-02 11:04:19 -05:00
zzz
9c31be66e6 SSU2: Data phase updates
Send immediate ack of Session Confirmed
Process I2NP messages and fragments in Session Confirmed
2022-03-02 10:47:47 -05:00
zzz
0e89b07ae8 SSU2: Data phase fix
Fix initialization of IMS when receiving last fragment first
2022-03-02 09:37:10 -05:00
zzz
7b6e6270ba SSU2: Data phase more fixes
Fix writing follow-on fragment block
Call messageFullyReceived() for I2NP block
Override messageFullyReceived() to avoid NPE
2022-03-02 09:05:09 -05:00
zzz
9d9310a726 SSU2: Data phase fixes
Fix receiver CipherState key
Override clearWantedACKSendSince() to avoid NPE
Add/tweak debug logging
2022-03-02 08:32:22 -05:00
zzz
0f26baf114 SSU2: Implement split()
Use socket address in PacketBuilder2
Decrypt session confirmed in-place
Check for RI in session confirmed
Copy session confirmed to PeerState2 for retx
RTT calculation fixes
State transitions
Javadoc fixes
WIP, untested
2022-03-01 13:52:16 -05:00
zzz
5ef93f11a9 Util: Add Addresses.getConnectedAddressTypes()
method to efficiently get all types in one pass
2022-03-01 07:25:49 -05:00
zzz
ce53714ba1 Util: Add AddressType enum 2022-03-01 05:48:20 -05:00
zzz
50ce3c2856 NetDB: New reseeds 2022-03-01 05:15:49 -05:00
zzz
21c1f89249 SSU2: Validate DateTime block in handshake messages 2022-02-28 16:50:41 -05:00
zzz
46ef49f2cf SSU2: Token Req. and Retry fixes
Fix Token Request and Retry payload generation
Implement Token Request and Retry payload decryption
Decrypt payloads in-place
Change from numbers to constants
2022-02-28 16:24:59 -05:00
zzz
e53a59b4ac SSU2: fix PS2 packet numbering 2022-02-28 13:36:19 -05:00
zzz
a13f2b9768 SSU2 more fixes
Fix OES2 MTU
Fix Token Request header encryption
2022-02-28 12:32:36 -05:00
zzz
44c30e78fc SSU2 fixes
Fix NPE in PS2
Fix Token Request message type
2022-02-28 10:01:05 -05:00
zzz
ec63f41b27 SSU2: Handle handshake messages
Decrypt handshake headers in Packet Handler
Pass handshake messages to Establishment Manager
SSU 1 and 2: Pass establish state to Establishment Manager
so it doesn't have to look it up again
Add notes about causes of decrypt failures
WIP, untested
2022-02-28 09:18:06 -05:00
zzz
c19944384e SSU2: Fix packet numbering to match spec 2022-02-27 14:50:13 -05:00
zzz
0c08a05bce SSU2: Hook in new classes to EstablishmentManager
Implement handshake retransmissions
Fix up calls to IES2/OES2
split() TODO
not hooked in to PacketHandler yet
WIP, untested
2022-02-27 12:03:28 -05:00
zzz
7eda9c77af SSU: Don't use SSU2 for peer test or relay
Add getAltStyle() so getTargetAddresses() will return SSU2
Add getSSUVersion()
2022-02-27 06:38:43 -05:00
zzz
66045cebc2 SSU2: Store RI in IES2 2022-02-27 05:41:48 -05:00
zzz
2b93dbbf48 SSU2: Add token support to EstablishmentManager 2022-02-27 05:26:04 -05:00
zzz
759f6968f6 Add SSU2 support to OMF 2022-02-26 17:15:07 -05:00
zzz
e3db28542c SSU2: Fix overhead calculations 2022-02-26 16:33:35 -05:00
zzz
e7f98e9243 SSU2: Add acks to data messages
implement buildPing() and buildACK()
2022-02-26 15:39:50 -05:00
zzz
4908f760d9 SSU2: PeerState2 I2NP handling
Handle complete messages and fragments in PeerState2
Send complete messages to transport
Add SSU2 constructor and reader in IMS
Change fragment callback to avoid an extra copy
Fix checks of fragment blocks
MessageReader cleanups for SSU1
Other cleanups

WIP, untested, not hooked in
2022-02-26 11:31:04 -05:00
zzz
6bb3657de2 SSU2: Start of packet handling
Store CipherStates in PeerState2
Add missing getVersion() overrides
2022-02-26 08:25:55 -05:00
zzz
dc40755e7c Sybil: Improve family analysis
Increase credit if family sig is verified
Speed up analysis by only looping through RIs once
Add link to all family members
Add SUNYSB certificate
bump -2
2022-02-25 10:36:17 -05:00
zzz
140ab47354 Fix SSU2 enable logic 2022-02-24 14:42:33 -05:00
zzz
da887f7c6c SSU2: Publish keys and version in address when enabled 2022-02-24 08:49:57 -05:00
zzz
f4be99ecd0 SSU: Add SSU2 class extensions and packet builder
Pass XDH key builder to UDPTransport
Add SSU2 static keygen when enabled
WIP, not hooked in
2022-02-24 06:13:28 -05:00
zzz
b8407a261e SSU2: ACK bitfield support and conversion to ACK block
WIP, not hooked in
2022-02-23 15:55:03 -05:00
zzz
969a8a5d8a SSU: Add support for SSU2 fragmentation to OMS 2022-02-23 15:22:40 -05:00
zzz
b57d9f2f7e SSU: More prep of classes for SSU2 extension 2022-02-23 11:57:03 -05:00
zzz
c9a97d889b SSU: Prep classes for SSU2 extension
add SSU2 states
2022-02-23 10:55:51 -05:00
zzz
51bdd9a283 SSU: Add getVersion() methods (prep for SSU2) 2022-02-23 09:25:21 -05:00
zzz
04dd18615c i2psnark: Load sytem mime types if available 2022-02-23 08:12:39 -05:00
zzz
265f5ee5df Util, i2ptunnel: Update firefox user-agent 2022-02-23 07:08:34 -05:00
zzz
9c3f8602da i2psnark standalone: Add startup message
update readme
2022-02-23 06:28:42 -05:00
zzz
74dedcf7f0 SSU2: More WIP 2022-02-23 06:12:35 -05:00
zzz
ae2b99b1c6 Build: Fix it 2022-02-22 14:53:41 -05:00
zzz
818ecc3563 Build: Fix testscripts target 2022-02-22 14:52:35 -05:00
zzz
5ccbeca676 bump -1 2022-02-22 10:34:31 -05:00
zzz
a621f56c33 Console: Add search for SSU2 transport 2022-02-22 10:32:25 -05:00
zzz
1513695768 Update: Add notification for new version
remove old Java 7 check
2022-02-22 10:30:41 -05:00
zzz
63e202f8f0 SSU: Start of SSU2 support
WIP, not hooked in
2022-02-22 10:27:42 -05:00
zzz
80535875ad SSU: PacketHandler cleanup (prep for SSU2) 2022-02-22 10:22:16 -05:00
zzz
f0ad921fd2 NetDB: Prevent rare deadlock via FloodfillMonitorJob at startup 2022-02-22 10:06:07 -05:00
zzz
63f3d88f78 Util: Speed up PRNG nextInt() and nextLong()
Add signedNextInt()
2022-02-22 09:57:35 -05:00
zzz
9f7f1bbcab Crypto: Prep for SSU2
- ChaCha20: Add ivOffset param
- ChaCha20/Poly1305: Add adOffset/adLength params
- Noise: Add XK-SSU2 initializer
- Noise: Add notes about handshake offsets
2022-02-22 09:45:22 -05:00
zzz
edc9d6fec5 NTCP: Reduce max writer threads 2022-02-22 09:07:58 -05:00
zzz
a089156afc Remove BOB source 2022-02-22 08:58:56 -05:00
zzz
767a5043ab Debian files for 1.7.0 2022-02-22 08:04:03 -05:00
392 changed files with 27746 additions and 21579 deletions

View File

@@ -66,6 +66,7 @@ trans.tr_TR = apps/i2ptunnel/locale-proxy/messages_tr.po
trans.uk_UA = apps/i2ptunnel/locale-proxy/messages_uk.po
trans.vi = apps/i2ptunnel/locale-proxy/messages_vi.po
trans.zh_CN = apps/i2ptunnel/locale-proxy/messages_zh.po
trans.zh_TW = apps/i2ptunnel/locale-proxy/messages_zh_TW.po
[I2P.core]
type = PO
@@ -479,6 +480,7 @@ trans.sv_SE = installer/resources/locale/po/messages_sv.po
trans.tr_TR = installer/resources/locale/po/messages_tr.po
trans.uk_UA = installer/resources/locale/po/messages_uk.po
trans.zh_CN = installer/resources/locale/po/messages_zh.po
trans.zh_TW = installer/resources/locale/po/messages_zh_TW.po
[I2P.getopt]
;;
@@ -563,6 +565,7 @@ trans.tk = apps/ministreaming/locale/messages_tk.po
trans.tr_TR = apps/ministreaming/locale/messages_tr.po
trans.uk_UA = apps/ministreaming/locale/messages_uk.po
trans.zh_CN = apps/ministreaming/locale/messages_zh.po
trans.zh_TW = apps/ministreaming/locale/messages_zh_TW.po
[I2P.manpages]
;;
@@ -592,6 +595,7 @@ trans.ru_RU = installer/resources/locale-man/man_ru.po
trans.sv_SE = installer/resources/locale-man/man_sv.po
trans.tr_TR = installer/resources/locale-man/man_tr.po
trans.zh_CN = installer/resources/locale-man/man_zh.po
trans.zh_TW = installer/resources/locale-man/man_zh_TW.po
[I2P.eepsite]
;;
@@ -650,6 +654,7 @@ trans.sl = apps/routerconsole/resources/docs/readme_sl.html
trans.tr_TR = apps/routerconsole/resources/docs/readme_tr.html
trans.uk_UA = apps/routerconsole/resources/docs/readme_uk.html
trans.zh_CN = apps/routerconsole/resources/docs/readme_zh.html
trans.zh_TW = apps/routerconsole/resources/docs/readme_zh_TW.html
[main]
host = https://www.transifex.com

View File

@@ -212,10 +212,6 @@ Applications:
Copyright (c) 2006, Matthew Estes
See licenses/LICENSE-BlockFile.txt
BOB (BOB.jar):
Copyright (C) sponge
See licenses/COPYING-BOB.txt
Desktopgui (desktopgui.jar):
Copyright (c) Mathias De Maré
See licenses/LICENSE-DesktopGUI.txt
@@ -339,9 +335,9 @@ Applications:
Systray (systray.jar):
Public domain.
Tomcat 9.0.54 (jasper-runtime.jar):
Tomcat 9.0.62 (jasper-runtime.jar):
(not included in most distribution packages)
Copyright 1999-2021 The Apache Software Foundation
Copyright 1999-2022 The Apache Software Foundation
See licenses/LICENSE-Apache2.0.txt
See licenses/NOTICE-Tomcat.txt

View File

@@ -1,14 +0,0 @@
#bob.config
#Tue Dec 30 00:00:00 UTC 2008
# Please leave this file here for testing.
# Thank you,
# Sponge
i2cp.tcp.port=7654
BOB.host=localhost
inbound.lengthVariance=0
i2cp.messageReliability=BestEffort
BOB.port=45678
outbound.length=1
inbound.length=1
outbound.lengthVariance=0
i2cp.tcp.host=localhost

View File

@@ -1,12 +0,0 @@
sourceSets {
main {
java {
srcDir 'src'
}
}
}
dependencies {
compile project(':core')
compile project(':apps:ministreaming')
}

View File

@@ -1,115 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="BOB" default="default" basedir=".">
<description>Builds, tests, and runs the project BOB.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar-with-manifest: JAR building (if you are using a manifest)
-do-jar-without-manifest: JAR building (if you are not using a manifest)
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="BOB-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
<target depends="jar" description="Build BOB into a SINGLE JAR." name="onejar">
<!-- Make needed working dirs -->
<mkdir dir="${dist.dir}/lib" />
<mkdir dir="${dist.dir}/classes" />
<!-- Copy jars -->
<copy todir="${dist.dir}/lib" flatten="true" >
<path>
<pathelement path="${javac.classpath}" />
</path>
</copy>
<copy todir="${dist.dir}/lib" file="../../build/jbigi.jar" />
<!-- Extract the classes inside the jar files -->
<unjar dest="${dist.dir}/classes" >
<fileset dir="${dist.dir}/lib" >
<include name="**/*.jar" />
</fileset>
</unjar>
<!-- Recombine the classes into a new jar file -->
<jar jarfile="${dist.dir}/lib/all-in-one.jar" >
<fileset dir="${dist.dir}/classes" />
</jar>
<!-- Clean up work area -->
<delete dir="${dist.dir}/classes" followsymlinks="false" includeemptydirs="true"/>
<!-- Make the single jar file -->
<jar jarfile="dist/BOB-one.jar" >
<zipfileset src="${dist.jar}" excludes="META-INF/*" />
<zipfileset src="${dist.dir}/lib/all-in-one.jar" excludes="**/META-INF/*" />
<manifest>
<attribute name="Main-Class" value="net.i2p.BOB.Main" />
</manifest>
</jar>
<!-- Clean up the fake jar file -->
<delete file="${dist.dir}/lib/all-in-one.jar" />
</target>
</project>

View File

@@ -1,3 +0,0 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build

View File

@@ -1,643 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
*** GENERATED FROM project.xml - DO NOT EDIT ***
*** EDIT ../build.xml INSTEAD ***
For the purpose of easier reading the script
is divided into following sections:
- initialization
- compilation
- jar
- execution
- debugging
- javadoc
- junit compilation
- junit execution
- junit debugging
- applet
- cleanup
-->
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="BOB-impl">
<target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
<!--
======================
INITIALIZATION SECTION
======================
-->
<target name="-pre-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="-pre-init" name="-init-private">
<property file="nbproject/private/config.properties"/>
<property file="nbproject/private/configs/${config}.properties"/>
<property file="nbproject/private/private.properties"/>
</target>
<target depends="-pre-init,-init-private" name="-init-user">
<property file="${user.properties.file}"/>
<!-- The two properties below are usually overridden -->
<!-- by the active platform. Just a fallback. -->
<property name="default.javac.source" value="1.8"/>
<property name="default.javac.target" value="1.8"/>
<property name="javac.release" value="8"/>
</target>
<target depends="-pre-init,-init-private,-init-user" name="-init-project">
<property file="nbproject/configs/${config}.properties"/>
<property file="nbproject/project.properties"/>
</target>
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
<available file="${manifest.file}" property="manifest.available"/>
<condition property="manifest.available+main.class">
<and>
<isset property="manifest.available"/>
<isset property="main.class"/>
<not>
<equals arg1="${main.class}" arg2="" trim="true"/>
</not>
</and>
</condition>
<condition property="manifest.available+main.class+mkdist.available">
<and>
<istrue value="${manifest.available+main.class}"/>
<isset property="libs.CopyLibs.classpath"/>
</and>
</condition>
<condition property="have.tests">
<or>
<available file="${test.src.dir}"/>
</or>
</condition>
<condition property="have.sources">
<or>
<available file="${src.dir}"/>
</or>
</condition>
<condition property="netbeans.home+have.tests">
<and>
<isset property="netbeans.home"/>
<isset property="have.tests"/>
</and>
</condition>
<condition property="no.javadoc.preview">
<and>
<isset property="javadoc.preview"/>
<isfalse value="${javadoc.preview}"/>
</and>
</condition>
<property name="run.jvmargs" value=""/>
<property name="javac.compilerargs" value=""/>
<property name="work.dir" value="${basedir}"/>
<condition property="no.deps">
<and>
<istrue value="${no.dependencies}"/>
</and>
</condition>
<property name="javac.debug" value="true"/>
<property name="javadoc.preview" value="true"/>
<property name="application.args" value=""/>
<property name="source.encoding" value="${file.encoding}"/>
<condition property="javadoc.encoding.used" value="${javadoc.encoding}">
<and>
<isset property="javadoc.encoding"/>
<not>
<equals arg1="${javadoc.encoding}" arg2=""/>
</not>
</and>
</condition>
<property name="javadoc.encoding.used" value="${source.encoding}"/>
<property name="includes" value="**"/>
<property name="excludes" value=""/>
<property name="do.depend" value="false"/>
<condition property="do.depend.true">
<istrue value="${do.depend}"/>
</condition>
<condition else="" property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'">
<and>
<isset property="jaxws.endorsed.dir"/>
<available file="nbproject/jaxws-build.xml"/>
</and>
</condition>
</target>
<target name="-post-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
<fail unless="src.dir">Must set src.dir</fail>
<fail unless="test.src.dir">Must set test.src.dir</fail>
<fail unless="build.dir">Must set build.dir</fail>
<fail unless="dist.dir">Must set dist.dir</fail>
<fail unless="build.classes.dir">Must set build.classes.dir</fail>
<fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
<fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
<fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
<fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
<fail unless="dist.jar">Must set dist.jar</fail>
</target>
<target name="-init-macrodef-property">
<macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<property name="@{name}" value="${@{value}}"/>
</sequential>
</macrodef>
</target>
<target name="-init-macrodef-javac">
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
<attribute default="${javac.classpath}" name="classpath"/>
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="${javac.debug}" name="debug"/>
<attribute default="/does/not/exist" name="sourcepath"/>
<element name="customize" optional="true"/>
<sequential>
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" release="${javac.release}">
<classpath>
<path path="@{classpath}"/>
</classpath>
<compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/>
<customize/>
</javac>
</sequential>
</macrodef>
<macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
<attribute default="${javac.classpath}" name="classpath"/>
<sequential>
<depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
<classpath>
<path path="@{classpath}"/>
</classpath>
</depend>
</sequential>
</macrodef>
<macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${build.classes.dir}" name="destdir"/>
<sequential>
<fail unless="javac.includes">Must set javac.includes</fail>
<pathconvert pathsep="," property="javac.includes.binary">
<path>
<filelist dir="@{destdir}" files="${javac.includes}"/>
</path>
<globmapper from="*.java" to="*.class"/>
</pathconvert>
<delete>
<files includes="${javac.includes.binary}"/>
</delete>
</sequential>
</macrodef>
</target>
<target name="-init-macrodef-junit">
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<sequential>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true">
<batchtest todir="${build.test.results.dir}">
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
<filename name="@{testincludes}"/>
</fileset>
</batchtest>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg line="${run.jvmargs}"/>
</junit>
</sequential>
</macrodef>
</target>
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/>
<attribute default="${debug.classpath}" name="classpath"/>
<attribute default="" name="stopclassname"/>
<sequential>
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
<classpath>
<path path="@{classpath}"/>
</classpath>
</nbjpdastart>
</sequential>
</macrodef>
<macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${build.classes.dir}" name="dir"/>
<sequential>
<nbjpdareload>
<fileset dir="@{dir}" includes="${fix.classes}">
<include name="${fix.includes}*.class"/>
</fileset>
</nbjpdareload>
</sequential>
</macrodef>
</target>
<target name="-init-debug-args">
<property name="version-output" value="java version &quot;${ant.java.version}"/>
<condition property="have-jdk-older-than-1.4">
<or>
<contains string="${version-output}" substring="java version &quot;1.0"/>
<contains string="${version-output}" substring="java version &quot;1.1"/>
<contains string="${version-output}" substring="java version &quot;1.2"/>
<contains string="${version-output}" substring="java version &quot;1.3"/>
</or>
</condition>
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
<istrue value="${have-jdk-older-than-1.4}"/>
</condition>
<condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
<os family="windows"/>
</condition>
<condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
<isset property="debug.transport"/>
</condition>
</target>
<target depends="-init-debug-args" name="-init-macrodef-debug">
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${main.class}" name="classname"/>
<attribute default="${debug.classpath}" name="classpath"/>
<element name="customize" optional="true"/>
<sequential>
<java classname="@{classname}" dir="${work.dir}" fork="true">
<jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<jvmarg line="${run.jvmargs}"/>
<classpath>
<path path="@{classpath}"/>
</classpath>
<syspropertyset>
<propertyref prefix="run-sys-prop."/>
<mapper from="run-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<customize/>
</java>
</sequential>
</macrodef>
</target>
<target name="-init-macrodef-java">
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="classname"/>
<element name="customize" optional="true"/>
<sequential>
<java classname="@{classname}" dir="${work.dir}" fork="true">
<jvmarg line="${run.jvmargs}"/>
<classpath>
<path path="${run.classpath}"/>
</classpath>
<syspropertyset>
<propertyref prefix="run-sys-prop."/>
<mapper from="run-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<customize/>
</java>
</sequential>
</macrodef>
</target>
<target name="-init-presetdef-jar">
<presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
<jar compress="${jar.compress}" jarfile="${dist.jar}">
<j2seproject1:fileset dir="${build.classes.dir}"/>
</jar>
</presetdef>
</target>
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
<!--
===================
COMPILATION SECTION
===================
-->
<target depends="init" name="deps-jar" unless="no.deps"/>
<target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
<target depends="init" name="-check-automatic-build">
<available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
</target>
<target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
<antcall target="clean"/>
</target>
<target depends="init,deps-jar" name="-pre-pre-compile">
<mkdir dir="${build.classes.dir}"/>
</target>
<target name="-pre-compile">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target if="do.depend.true" name="-compile-depend">
<j2seproject3:depend/>
</target>
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
<j2seproject3:javac/>
<copy todir="${build.classes.dir}">
<fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
</copy>
</target>
<target name="-post-compile">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
<target name="-pre-compile-single">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile/>
<j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
</target>
<target name="-post-compile-single">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
<!--
====================
JAR BUILDING SECTION
====================
-->
<target depends="init" name="-pre-pre-jar">
<dirname file="${dist.jar}" property="dist.jar.dir"/>
<mkdir dir="${dist.jar.dir}"/>
</target>
<target name="-pre-jar">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
<j2seproject1:jar/>
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
<j2seproject1:jar manifest="${manifest.file}"/>
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
<j2seproject1:jar manifest="${manifest.file}">
<j2seproject1:manifest>
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
</j2seproject1:manifest>
</j2seproject1:jar>
<echo>To run this application from the command line without Ant, try:</echo>
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<pathconvert property="run.classpath.with.dist.jar">
<path path="${run.classpath}"/>
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
</pathconvert>
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
<pathconvert property="run.classpath.without.build.classes.dir">
<path path="${run.classpath}"/>
<map from="${build.classes.dir.resolved}" to=""/>
</pathconvert>
<pathconvert pathsep=" " property="jar.classpath">
<path path="${run.classpath.without.build.classes.dir}"/>
<chainedmapper>
<flattenmapper/>
<globmapper from="*" to="lib/*"/>
</chainedmapper>
</pathconvert>
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
<copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
<fileset dir="${build.classes.dir}"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
<attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>
</copylibs>
<echo>To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<echo>java -jar "${dist.jar.resolved}"</echo>
</target>
<target name="-post-jar">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
<!--
=================
EXECUTION SECTION
=================
-->
<target depends="init,compile" description="Run a main class." name="run">
<j2seproject1:java>
<customize>
<arg line="${application.args}"/>
</customize>
</j2seproject1:java>
</target>
<target name="-do-not-recompile">
<property name="javac.includes.binary" value=""/>
</target>
<target depends="init,-do-not-recompile,compile-single" name="run-single">
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
<j2seproject1:java classname="${run.class}"/>
</target>
<!--
=================
DEBUGGING SECTION
=================
-->
<target depends="init" if="netbeans.home" name="-debug-start-debugger">
<j2seproject1:nbjpdastart name="${debug.class}"/>
</target>
<target depends="init,compile" name="-debug-start-debuggee">
<j2seproject3:debug>
<customize>
<arg line="${application.args}"/>
</customize>
</j2seproject3:debug>
</target>
<target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
<target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
<j2seproject1:nbjpdastart stopclassname="${main.class}"/>
</target>
<target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
<j2seproject3:debug classname="${debug.class}"/>
</target>
<target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
<target depends="init" name="-pre-debug-fix">
<fail unless="fix.includes">Must set fix.includes</fail>
<property name="javac.includes" value="${fix.includes}.java"/>
</target>
<target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
<j2seproject1:nbjpdareload/>
</target>
<target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
<!--
===============
JAVADOC SECTION
===============
-->
<target depends="init" name="-javadoc-build">
<mkdir dir="${dist.javadoc.dir}"/>
<javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
<classpath>
<path path="${javac.classpath}"/>
</classpath>
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
<filename name="**/*.java"/>
</fileset>
</javadoc>
</target>
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
<nbbrowse file="${dist.javadoc.dir}/index.html"/>
</target>
<target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
<!--
=========================
JUNIT COMPILATION SECTION
=========================
-->
<target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
<mkdir dir="${build.test.classes.dir}"/>
</target>
<target name="-pre-compile-test">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target if="do.depend.true" name="-compile-test-depend">
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
</target>
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
<copy todir="${build.test.classes.dir}">
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
</copy>
</target>
<target name="-post-compile-test">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
<target name="-pre-compile-test-single">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
<copy todir="${build.test.classes.dir}">
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
</copy>
</target>
<target name="-post-compile-test-single">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
<!--
=======================
JUNIT EXECUTION SECTION
=======================
-->
<target depends="init" if="have.tests" name="-pre-test-run">
<mkdir dir="${build.test.results.dir}"/>
</target>
<target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
<j2seproject3:junit testincludes="**/*Test.java"/>
</target>
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
<fail if="tests.failed">Some tests failed; see details above.</fail>
</target>
<target depends="init" if="have.tests" name="test-report"/>
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
<target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
<target depends="init" if="have.tests" name="-pre-test-run-single">
<mkdir dir="${build.test.results.dir}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
<j2seproject3:junit excludes="" includes="${test.includes}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
<fail if="tests.failed">Some tests failed; see details above.</fail>
</target>
<target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
<!--
=======================
JUNIT DEBUGGING SECTION
=======================
-->
<target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
<property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
<delete file="${test.report.file}"/>
<mkdir dir="${build.test.results.dir}"/>
<j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
<customize>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<arg value="${test.class}"/>
<arg value="showoutput=true"/>
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
</customize>
</j2seproject3:debug>
</target>
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
</target>
<target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
</target>
<target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
<!--
=========================
APPLET EXECUTION SECTION
=========================
-->
<target depends="init,compile-single" name="run-applet">
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
<j2seproject1:java classname="sun.applet.AppletViewer">
<customize>
<arg value="${applet.url}"/>
</customize>
</j2seproject1:java>
</target>
<!--
=========================
APPLET DEBUGGING SECTION
=========================
-->
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
<j2seproject3:debug classname="sun.applet.AppletViewer">
<customize>
<arg value="${applet.url}"/>
</customize>
</j2seproject3:debug>
</target>
<target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
<!--
===============
CLEANUP SECTION
===============
-->
<target depends="init" name="deps-clean" unless="no.deps"/>
<target depends="init" name="-do-clean">
<delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/>
</target>
<target name="-post-clean">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
</project>

View File

@@ -1,8 +0,0 @@
build.xml.data.CRC32=209349b6
build.xml.script.CRC32=403e69e6
build.xml.stylesheet.CRC32=958a1d3e
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=209349b6
nbproject/build-impl.xml.script.CRC32=c51e188e
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21

View File

@@ -1,84 +0,0 @@
application.homepage=http://bob.i2p/
application.title=BOB
application.vendor=Sponge
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=false
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=8
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=8
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=80
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/BOB.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=**/*.html,**/*.txt
file.reference.build-javadoc=../../i2p.i2p/build/javadoc
file.reference.i2p.jar=../../core/java/build/i2p.jar
file.reference.mstreaming.jar=../ministreaming/java/build/mstreaming.jar
includes=**
jar.compress=true
javac.classpath=\
${file.reference.mstreaming.jar}:\
${file.reference.i2p.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.version=1.8
javac.source=${javac.version}
javac.target=${javac.version}
javac.release=8
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}:\
${libs.junit.classpath}:\
${libs.junit_4.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api"
jnlp.codebase.type=local
jnlp.codebase.url=file:/usblv/NetBeansProjects/i2p.i2p/apps/BOB/dist
jnlp.descriptor=application
jnlp.enabled=false
jnlp.offline-allowed=false
jnlp.signed=false
main.class=net.i2p.BOB.Main
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
platform.active=default_platform
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
# or test-sys-prop.name=value to set system properties for unit tests):
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>BOB</name>
<minimum-ant-version>1.9.8</minimum-ant-version>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
</configuration>
</project>

View File

@@ -1,542 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import static net.i2p.app.ClientAppState.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.Arrays;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import net.i2p.I2PAppContext;
import net.i2p.app.*;
import net.i2p.client.I2PClient;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
import net.i2p.util.PortMapper;
import net.i2p.util.SimpleTimer2;
/**
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
* ################################################################################<br>
* ############################.#..........#..#..........##########################<br>
* #######################......................................###################<br>
* ####################...........................#.......#........################<br>
* #################..................##...................#.........##############<br>
* ###############................###...####.....#..###.....#.........#############<br>
* #############...........###..#..###...#####...###.##........#.......############<br>
* ###########................#......##...#####...##..##.......#..#........########<br>
* ##########.........................#....##.##..#...##.....................######<br>
* #########...................................#....#.........................#####<br>
* ########.........................................#...............#..........####<br>
* ########.........................................#..........#######..........###<br>
* #######.................................................############..........##<br>
* #######..........................................####################.........##<br>
* #######............####################......########################.........##<br>
* ######.............###############################################.##.........##<br>
* ######............################################################..##........##<br>
* ######............################################################..##........##<br>
* ######.............##############################################..##.........##<br>
* ######............##############################################...##..........#<br>
* ######............#..###########################################...##..........#<br>
* ######.............#############################################....#..........#<br>
* #######...........###############################################..##.........##<br>
* #######...........#####.#.#.#.########################.....#.####...##........##<br>
* ######............#..............##################.................##.........#<br>
* ######................####.........###############........#####......##........#<br>
* ######..............####..#.........############.......##.#.######...##.......##<br>
* ######.................#.####.........########...........##....###...##.......##<br>
* #######....#....###...................#######...............#...###..##.......##<br>
* #######.........###..###.....###.......######.##.#####.........####..##.......##<br>
* #######.....#...##############.........############......###########.###......##<br>
* #######....##...##########.......##...##############......#.############.....###<br>
* ########....#..########......######...##################################....####<br>
* ########....##.####################...##################################....####<br>
* ########..#.##..###################..##################################..#..####<br>
* ##########..###..#################...##################################...#.####<br>
* #########....##...##############....########..#####.################.##..#.#####<br>
* ############.##....##########.......#########.###.......###########..#.#########<br>
* ###############.....#######...#.......########.....##.....######.....###########<br>
* ###############......###....##..........##.......######....#.........#.#########<br>
* ##############............##..................##########..............##########<br>
* ##############..............................##########..#.............##########<br>
* ###############.......##..................#####..............####....###########<br>
* ###############.......#####.......#.............####.....#######.....###########<br>
* ################...#...####......##################.....########....############<br>
* ################...##..#####.........####.##.....#....##########....############<br>
* ##################..##..####...........#####.#....############.....#############<br>
* ##################......#####.................################....##############<br>
* ###################.....####..........##########..###########....###############<br>
* ####################..#..#..........................########.....###############<br>
* #####################.##.......###.................########....#################<br>
* ######################.........#.......#.##.###############....#################<br>
* #############.#######...............#####################....###################<br>
* ###..#.....##...####..........#.....####################....####################<br>
* ####......##........................##################....######################<br>
* #.##...###..............###.........###############......#######################<br>
* #...###..##............######...........................########################<br>
* ##.......###..........##########....#...#...........############################<br>
* ##.........##.......############################################################<br>
* ###........##.....##############################################################<br>
* ####.............###############################################################<br>
* ######.........#################################################################<br>
* #########....###################################################################<br>
* ################################################################################<br>
* </span>
* BOB, main command socket listener, launches the command parser engine.
*
* @author sponge
* @deprecated Please port applications to SAMv3
*/
@Deprecated
public class BOB implements Runnable, ClientApp {
public final static String PROP_CONFIG_LOCATION = "BOB.config";
public final static String PROP_BOB_PORT = "BOB.port";
public final static String PROP_BOB_HOST = "BOB.host";
public final static String PROP_CFG_VER = "BOB.CFG.VER";
/** unused when started via the ClientApp interface */
private static BOB _bob;
private final NamedDB database;
private final Properties props = new Properties();
private final AtomicBoolean spin = new AtomicBoolean(true);
private static final String P_RUNNING = "RUNNING";
private static final String P_STARTING = "STARTING";
private static final String P_STOPPING = "STOPPING";
private final AtomicBoolean lock = new AtomicBoolean(false);
// no longer used.
// private static int maxConnections = 0;
private final I2PAppContext _context;
private final Logger _log;
private final ClientAppManager _mgr;
private final String[] _args;
private volatile ClientAppState _state = UNINITIALIZED;
private volatile ServerSocket listener;
private volatile Thread _runner;
private volatile boolean _warned;
/**
* Stop BOB gracefully
* @deprecated unused
*/
@Deprecated
public synchronized static void stop() {
if (_bob != null)
_bob.shutdown(null);
}
/**
* For ClientApp interface.
* Does NOT open the listener socket or start threads; caller must call startup()
*
* @param mgr may be null
* @param args non-null
* @since 0.9.10
*/
public BOB(I2PAppContext context, ClientAppManager mgr, String[] args) {
_context = context;
// If we were run from command line, log to stdout
boolean logToStdout = false;
URL classResource = BOB.class.getResource("BOB.class");
if (classResource != null) {
String classPath = classResource.toString();
if (classPath.startsWith("jar")) {
String manifestPath = classPath.substring(0, classPath.lastIndexOf('!') + 1) +
"/META-INF/MANIFEST.MF";
try {
Manifest manifest = new Manifest(new URL(manifestPath).openStream());
Attributes attrs = manifest.getMainAttributes();
String mainClass = attrs.getValue("Main-Class");
if ("net.i2p.BOB.Main".equals(mainClass))
logToStdout = true;
} catch (IOException ioe) {}
}
}
_log = new Logger(context.logManager().getLog(BOB.class), logToStdout);
_mgr = mgr;
_args = args;
_state = INITIALIZED;
database = new NamedDB();
loadConfig();
}
/**
* Listen for incoming connections and handle them
*
* @param args
*/
public synchronized static void main(String[] args) {
try {
_bob = new BOB(I2PAppContext.getGlobalContext(), null, args);
_bob.startup();
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* @since 0.9.10
*/
private void loadConfig() {
int i = 0;
boolean save = false;
// Set up all defaults to be passed forward to other threads.
// Re-reading the config file in each thread is pretty damn stupid.
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config");
// This is here just to ensure there is no interference with our threadgroups.
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
i = Y2.hashCode();
{
File cfg = new File(configLocation);
if (!cfg.isAbsolute()) {
cfg = new File(_context.getConfigDir(), configLocation);
}
FileInputStream fi = null;
try {
fi = new FileInputStream(cfg);
props.load(fi);
} catch (FileNotFoundException fnfe) {
_log.warn("Unable to load up the BOB config file " + cfg.getAbsolutePath() + ", Using defaults.", fnfe);
save = true;
} catch (IOException ioe) {
_log.warn("IOException on BOB config file " + cfg.getAbsolutePath() + ", using defaults.", ioe);
} finally {
if (fi != null) try { fi.close(); } catch (IOException ioe) {}
}
}
// Global router and client API configurations that are missing are set to defaults here.
if (!props.containsKey(I2PClient.PROP_TCP_HOST)) {
props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
save = true;
}
if (!props.containsKey(I2PClient.PROP_TCP_PORT)) {
props.setProperty(I2PClient.PROP_TCP_PORT, Integer.toString(I2PClient.DEFAULT_LISTEN_PORT));
save = true;
}
if (!props.containsKey(PROP_BOB_PORT)) {
props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B
save = true;
}
if (!props.containsKey("inbound.length")) {
props.setProperty("inbound.length", "3");
save = true;
}
if (!props.containsKey("outbound.length")) {
props.setProperty("outbound.length", "3");
save = true;
}
if (!props.containsKey("inbound.lengthVariance")) {
props.setProperty("inbound.lengthVariance", "0");
save = true;
}
if (!props.containsKey("outbound.lengthVariance")) {
props.setProperty("outbound.lengthVariance", "0");
save = true;
}
if (!props.containsKey(PROP_BOB_HOST)) {
props.setProperty(PROP_BOB_HOST, "localhost");
save = true;
}
// PROP_RELIABILITY_NONE, PROP_RELIABILITY_BEST_EFFORT, PROP_RELIABILITY_GUARANTEED
if (!props.containsKey(PROP_CFG_VER)) {
props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_NONE);
props.setProperty(PROP_CFG_VER,"1");
save = true;
}
if (save) {
File cfg = new File(configLocation);
if (!cfg.isAbsolute()) {
cfg = new File(_context.getConfigDir(), configLocation);
}
FileOutputStream fo = null;
try {
_log.warn("Writing new defaults file " + cfg.getAbsolutePath());
fo = new FileOutputStream(cfg);
props.store(fo, cfg.getAbsolutePath());
} catch (IOException ioe) {
_log.error("IOException on BOB config file " + cfg.getAbsolutePath(), ioe);
} finally {
if (fo != null) try { fo.close(); } catch (IOException ioe) {}
}
}
}
/**
* @since 0.9.10
*/
private void startListener() throws IOException {
listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
listener.setSoTimeout(500); // .5 sec
}
/**
* @since 0.9.10
*/
private void startThread() {
I2PAppThread t = new I2PAppThread(this, "BOBListener");
t.start();
_runner = t;
}
/**
* @since 0.9.10
*/
public void run() {
if (listener == null) return;
changeState(RUNNING);
_log.info("BOB is now running.");
if (_mgr != null)
_mgr.register(this);
_context.portMapper().register(PortMapper.SVC_BOB, props.getProperty(PROP_BOB_HOST),
Integer.parseInt(props.getProperty(PROP_BOB_PORT)));
int i = 0;
boolean g = false;
spin.set(true);
try {
Socket server = null;
while (spin.get()) {
//DoCMDS connection;
try {
server = listener.accept();
server.setKeepAlive(true);
g = true;
} catch (ConnectException ce) {
g = false;
} catch (SocketTimeoutException ste) {
g = false;
}
if (g) {
if (!_warned) {
_warned = true;
String s = "BOB is deprecated. Please port applications to SAMv3.";
_context.logManager().getLog(BOB.class).logAlways(Log.WARN, s);
_log.warn(s);
}
DoCMDS conn_c = new DoCMDS(spin, lock, server, props, database, _log);
Thread t = new I2PAppThread(conn_c);
t.setName("BOB.DoCMDS " + i);
t.start();
i++;
}
}
changeState(STOPPING);
} catch (Exception e) {
if (spin.get())
_log.error("Unexpected error while listening for connections", e);
else
e = null;
changeState(STOPPING, e);
} finally {
_log.info("BOB is now shutting down...");
_context.portMapper().unregister(PortMapper.SVC_BOB);
// Clean up everything.
try {
listener.close();
} catch (Exception ex) {
// nop
}
// Find all our "BOB.DoCMDS" threads, wait for them to be finished.
// We could order them to stop, but that could cause nasty issues in the locks.
visitAllThreads();
database.getReadLock();
NamedDB nickinfo;
try {
for (Object ndb : database.values()) {
nickinfo = (NamedDB) ndb;
nickinfo.getReadLock();
boolean released = false;
try {
if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) {
nickinfo.releaseReadLock();
released = true;
nickinfo.getWriteLock();
try {
nickinfo.add(P_STOPPING, Boolean.TRUE);
} finally {
nickinfo.releaseWriteLock();
}
}
} finally {
if (!released)
nickinfo.releaseReadLock();
}
}
} finally {
database.releaseReadLock();
}
changeState(STOPPED);
_log.info("BOB is now stopped.");
}
}
/**
* Find the root thread group,
* then find all theads with certain names and wait for them all to be dead.
*
*/
private static void visitAllThreads() {
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
while (root.getParent() != null) {
root = root.getParent();
}
// Visit each thread group
waitjoin(root, 0, root.getName());
}
private static void waitjoin(ThreadGroup group, int level, String tn) {
// Get threads in `group'
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads * 2];
numThreads = group.enumerate(threads, false);
// Enumerate each thread in `group' and wait for it to stop if it is one of ours.
for (int i = 0; i < numThreads; i++) {
// Get thread
Thread thread = threads[i];
if (thread.getName().startsWith("BOB.DoCMDS ")) {
try {
if (thread.isAlive()) {
try {
thread.join();
} catch (InterruptedException ex) {
}
}
} catch (SecurityException se) {
//nop
}
}
}
// Get thread subgroups of `group'
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
numGroups = group.enumerate(groups, false);
// Recursively visit each subgroup
for (int i = 0; i < numGroups; i++) {
waitjoin(groups[i], level + 1, groups[i].getName());
}
}
////// begin ClientApp interface
/**
* @since 0.9.10
*/
@Override
public void startup() throws IOException {
if (_state != INITIALIZED)
return;
changeState(STARTING);
try {
startListener();
} catch (IOException e) {
_log.error("Error starting BOB on"
+ props.getProperty(PROP_BOB_HOST)
+ ":" + props.getProperty(PROP_BOB_PORT), e);
changeState(START_FAILED, e);
throw e;
}
startThread();
}
/**
* @since 0.9.10
*/
@Override
public void shutdown(String[] args) {
if (_state != RUNNING)
return;
changeState(STOPPING);
spin.set(false);
if (_runner != null)
_runner.interrupt();
else
changeState(STOPPED);
}
/**
* @since 0.9.10
*/
@Override
public ClientAppState getState() {
return _state;
}
/**
* @since 0.9.10
*/
@Override
public String getName() {
return "BOB";
}
/**
* @since 0.9.10
*/
@Override
public String getDisplayName() {
return "BOB " + Arrays.toString(_args);
}
////// end ClientApp interface
////// begin ClientApp helpers
/**
* @since 0.9.10
*/
private void changeState(ClientAppState state) {
changeState(state, null);
}
/**
* @since 0.9.10
*/
private synchronized void changeState(ClientAppState state, Exception e) {
_state = state;
if (_mgr != null)
_mgr.notify(this, state, null, e);
}
////// end ClientApp helpers
}

View File

@@ -1,996 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.I2PClientFactory;
import net.i2p.data.Destination;
import net.i2p.util.I2PAppThread;
// needed only for debugging.
// import java.util.logging.Level;
// import java.util.logging.Logger;
/**
* Simplistic command parser for BOB
*
* @author sponge
*
*/
public class DoCMDS implements Runnable {
// FIX ME
// I need a better way to do versioning, but this will do for now.
public static final String BMAJ = "00", BMIN = "00", BREV = "10", BEXT = "";
public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
private final Socket server;
private final Properties props;
private final NamedDB database;
private String line;
private Destination d;
private ByteArrayOutputStream prikey;
private boolean dk, ns, ip, op;
private NamedDB nickinfo;
private final Logger _log;
private final AtomicBoolean LIVE;
private final AtomicBoolean lock;
/* database strings */
private static final String P_DEST = "DESTINATION";
private static final String P_INHOST = "INHOST";
private static final String P_INPORT = "INPORT";
private static final String P_KEYS = "KEYS";
private static final String P_NICKNAME = "NICKNAME";
private static final String P_OUTHOST = "OUTHOST";
private static final String P_OUTPORT = "OUTPORT";
private static final String P_PROPERTIES = "PROPERTIES";
private static final String P_QUIET = "QUIET";
private static final String P_RUNNING = "RUNNING";
private static final String P_STARTING = "STARTING";
private static final String P_STOPPING = "STOPPING";
/* command strings */
private static final String C_help = "help";
private static final String C_clear = "clear";
private static final String C_getdest = "getdest";
private static final String C_getkeys = "getkeys";
private static final String C_getnick = "getnick";
private static final String C_inhost = "inhost";
private static final String C_inport = "inport";
private static final String C_list = "list";
private static final String C_lookup = "lookup";
private static final String C_newkeys = "newkeys";
private static final String C_option = "option";
private static final String C_outhost = "outhost";
private static final String C_outport = "outport";
private static final String C_quiet = "quiet";
private static final String C_quit = "quit";
private static final String C_setkeys = "setkeys";
private static final String C_setnick = "setnick";
private static final String C_show = "show";
private static final String C_show_props = "showprops";
private static final String C_start = "start";
private static final String C_status = "status";
private static final String C_stop = "stop";
private static final String C_verify = "verify";
private static final String C_visit = "visit";
private static final String C_zap = "zap";
/* all the commands available, plus description */
private static final String C_ALL[][] = {
{C_help, C_help + " <command> * Get help on a command."},
{C_clear, C_clear + " * Clear the current nickname out of the list."},
{C_getdest, C_getdest + " * Return the destination for the current nickname."},
{C_getkeys, C_getkeys + " * Return the keypair for the current nickname."},
{C_getnick, C_getnick + " tunnelname * Set the nickname from the database."},
{C_inhost, C_inhost + " hostname | IP * Set the inbound hostname or IP."},
{C_inport, C_inport + " port_number * Set the inbound port number nickname listens on."},
{C_list, C_list + " * List all tunnels."},
{C_lookup, C_lookup + " * Lookup an i2p address."},
{C_newkeys, C_newkeys + " * Generate a new keypair for the current nickname."},
{C_option, C_option + " I2CPoption=something * Set an I2CP option. NOTE: Don't use any spaces."},
{C_outhost, C_outhost + " hostname | IP * Set the outbound hostname or IP."},
{C_outport, C_outport + " port_number * Set the outbound port that nickname contacts."},
{C_quiet, C_quiet + " True | False * Don't send to the application the incoming destination."},
{C_quit, C_quit + " * Quits this session with BOB."},
{C_setkeys, C_setkeys + " BASE64_keypair * Sets the keypair for the current nickname."},
{C_setnick, C_setnick + " nickname * Create a new nickname."},
{C_show, C_show + " * Display the status of the current nickname."},
{C_show_props, C_show_props + " * Display the properties of the current nickname."},
{C_start, C_start + " * Start the current nickname tunnel."},
{C_status, C_status + " nickname * Display status of a nicknamed tunnel."},
{C_stop, C_stop + " * Stops the current nicknamed tunnel."},
{C_verify, C_verify + " BASE64_key * Verifies BASE64 destination."},
{C_visit, C_visit + " * Thread dump to wrapper.log."},
{C_zap, C_zap + " * Shuts down BOB."},
{"", "COMMANDS: " + // this is ugly, but...
C_help + " " +
C_clear + " " +
C_getdest + " " +
C_getkeys + " " +
C_getnick + " " +
C_inhost + " " +
C_inport + " " +
C_list + " " +
C_lookup + " " +
C_newkeys + " " +
C_option + " " +
C_outhost + " " +
C_outport + " " +
C_quiet + " " +
C_quit + " " +
C_setkeys + " " +
C_setnick + " " +
C_show + " " +
C_show_props + " " +
C_start + " " +
C_status + " " +
C_stop + " " +
C_verify + " " +
C_visit + " " +
C_zap
},
{" ", " "} // end of list
};
/**
* @param LIVE
* @param server
* @param props
* @param database
* @param _log
*/
DoCMDS(AtomicBoolean LIVE, AtomicBoolean lock, Socket server, Properties props, NamedDB database, Logger _log) {
this.lock = lock;
this.LIVE = LIVE;
this.server = server;
this.props = new Properties();
this.database = database;
this._log = _log;
Lifted.copyProperties(props, this.props);
}
private void rlock() {
rlock(nickinfo);
}
private void rlock(NamedDB Arg) {
database.getReadLock();
Arg.getReadLock();
}
private void runlock() {
runlock(nickinfo);
}
private void runlock(NamedDB Arg) {
Arg.releaseReadLock();
database.releaseReadLock();
}
private void wlock() {
wlock(nickinfo);
}
private void wlock(NamedDB Arg) {
database.getWriteLock();
Arg.getWriteLock();
}
private void wunlock() {
wunlock(nickinfo);
}
private void wunlock(NamedDB Arg) {
Arg.releaseWriteLock();
database.releaseWriteLock();
}
/**
* Try to print info from the database
*
* @param out
* @param info
* @param key
*/
private void trypnt(PrintStream out, NamedDB info, String key) {
rlock(info);
try {
out.print(" " + key + ": ");
if (info.exists(key)) {
out.print(info.get(key));
} else {
out.print("not_set");
}
} finally {
runlock(info);
}
}
/**
* Print true or false if an object exists
*
* @param out
* @param info
* @param key
*/
private void tfpnt(PrintStream out, NamedDB info, String key) {
rlock(info);
try {
out.print(" " + key + ": ");
out.print(info.exists(key));
} finally {
runlock(info);
}
}
/**
* Print an error message
*
* @param out
*/
private static void nns(PrintStream out) {
out.println("ERROR no nickname has been set");
}
/**
* Dump various information from the database
*
* @param out
* @param info
*/
private void nickprint(PrintStream out, NamedDB info) {
trypnt(out, info, P_NICKNAME);
trypnt(out, info, P_STARTING);
trypnt(out, info, P_RUNNING);
trypnt(out, info, P_STOPPING);
tfpnt(out, info, P_KEYS);
trypnt(out, info, P_QUIET);
trypnt(out, info, P_INPORT);
trypnt(out, info, P_INHOST);
trypnt(out, info, P_OUTPORT);
trypnt(out, info, P_OUTHOST);
out.println();
}
/**
* Dump properties information from the database
*
* @param out
* @param info
*/
private void propprint(PrintStream out, NamedDB info) {
trypnt(out, info, P_PROPERTIES);
}
/**
* Print information on a specific record, indicated by NamedDB
* @param out
* @param Arg
*/
private void ttlpnt(PrintStream out, String Arg) {
database.getReadLock();
try {
if (database.exists(Arg)) {
out.print("DATA");
nickprint(out, (NamedDB) database.get(Arg));
}
} finally {
database.releaseReadLock();
}
}
/**
* Is this NamedDB's tunnel active?
*
* @param Arg
* @return true if the tunnel is active
*/
private boolean tunnelactive(NamedDB Arg) {
boolean retval;
rlock(Arg);
try {
retval = (Arg.get(P_STARTING).equals(Boolean.TRUE) ||
Arg.get(P_STOPPING).equals(Boolean.TRUE) ||
Arg.get(P_RUNNING).equals(Boolean.TRUE));
} finally {
runlock();
}
return retval;
}
/**
* Does the base64 information look OK
*
* @param data
* @return OK
*/
private static boolean is64ok(String data) {
try {
new Destination(data);
return true;
} catch (Exception e) {
return false;
}
}
/**
* The actual parser.
* It probabbly needs a rewrite into functions, but I kind-of like inline code.
*
*/
public void run() {
dk = ns = ip = op = false;
try {
try {
// Get input from the client
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintStream out = new PrintStream(server.getOutputStream());
quit:
{
die:
{
prikey = new ByteArrayOutputStream();
out.println("BOB " + BOBversion);
out.println("OK");
while ((line = in.readLine()) != null) {
StringTokenizer token = new StringTokenizer(line, " "); // use a space as a delimiter
String Command = "";
String Arg = "";
NamedDB info;
if (token.countTokens() != 0) {
Command = token.nextToken();
Command =
Command.toLowerCase(Locale.US);
if (token.countTokens() != 0) {
Arg = token.nextToken();
} else {
Arg = "";
}
// The rest of the tokens are considered junk,
// and discarded without any warnings.
if (Command.equals(C_help)) {
for (int i = 0; !C_ALL[i][0].equals(" "); i++) {
if (C_ALL[i][0].equalsIgnoreCase(Arg)) {
out.println("OK " + C_ALL[i][1]);
}
}
} else if (Command.equals(C_visit)) {
visitAllThreads();
out.println("OK ");
} else if (Command.equals(C_lookup)) {
Destination dest = null;
String reply = null;
if (Arg.endsWith(".i2p")) {
try {
//try {
//dest = I2PTunnel.destFromName(Arg);
//} catch (DataFormatException ex) {
//}
dest = I2PAppContext.getGlobalContext().namingService().lookup(Arg);
if(dest != null) {
reply = dest.toBase64();
}
} catch (NullPointerException npe) {
// Could not find the destination!?
}
}
if (reply == null) {
out.println("ERROR Address Not found.");
} else {
out.println("OK " + reply);
}
} else if (Command.equals(C_getdest)) {
if (ns) {
if (dk) {
rlock();
try {
out.println("OK " + nickinfo.get(P_DEST));
} catch (Exception e) {
break die;
} finally {
runlock();
}
} else {
out.println("ERROR keys not set.");
}
} else {
nns(out);
}
} else if (Command.equals(C_list)) {
// Produce a formatted list of all nicknames
database.getReadLock();
try {
for (Object ndb : database.values()) {
try {
info = (NamedDB) ndb;
out.print("DATA");
} catch (Exception e) {
break die;
}
nickprint(out, info);
}
} finally {
database.releaseReadLock();
}
out.println("OK Listing done");
} else if (Command.equals(C_quit)) {
// End the command session
break quit;
} else if (Command.equals(C_zap)) {
// Kill BOB!! (let's hope this works!)
LIVE.set(false);
// End the command session
break quit;
} else if (Command.equals(C_newkeys)) {
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
try {
// Make a new PublicKey and PrivateKey
prikey = new ByteArrayOutputStream();
d = I2PClientFactory.createClient().createDestination(prikey);
wlock();
try {
nickinfo.add(P_KEYS, prikey.toByteArray());
nickinfo.add(P_DEST, d.toBase64());
out.println("OK " + nickinfo.get(P_DEST));
} catch (Exception e) {
break die;
} finally {
wunlock();
}
dk = true;
} catch (I2PException ipe) {
_log.error("Error generating keys", ipe);
out.println("ERROR generating keys");
}
}
} catch (Exception e) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_getkeys)) {
// Return public key
if (dk) {
prikey = new ByteArrayOutputStream();
rlock();
try {
prikey.write(((byte[]) nickinfo.get(P_KEYS)));
} catch (Exception ex) {
break die;
} finally {
runlock();
}
out.println("OK " + net.i2p.data.Base64.encode(prikey.toByteArray()));
} else {
out.println("ERROR no public key has been set");
}
} else if (Command.equals(C_quiet)) {
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
wlock();
try {
nickinfo.add(P_QUIET, Boolean.valueOf(Arg));
} catch (Exception ex) {
break die;
} finally {
wunlock();
}
out.println("OK Quiet set");
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_verify)) {
if (is64ok(Arg)) {
out.println("OK");
} else {
out.println("ERROR not in BASE64 format");
}
} else if (Command.equals(C_setkeys)) {
// Set the NamedDB to a privatekey in BASE64 format
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
try {
prikey = new ByteArrayOutputStream();
prikey.write(net.i2p.data.Base64.decode(Arg));
d = new Destination();
d.fromBase64(Arg);
} catch (Exception ex) {
Arg = "";
}
if ((Arg.length() == 884) && is64ok(Arg)) {
wlock();
try {
nickinfo.add(P_KEYS, prikey.toByteArray());
nickinfo.add(P_DEST, d.toBase64());
out.println("OK " + nickinfo.get(P_DEST));
} catch (Exception ex) {
break die;
} finally {
wunlock();
}
dk = true;
} else {
out.println("ERROR not in BASE64 format");
}
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_setnick)) {
ns = dk = ip = op = false;
database.getReadLock();
try {
nickinfo = (NamedDB) database.get(Arg);
if (!tunnelactive(nickinfo)) {
nickinfo = null;
ns = true;
}
} catch (Exception b) {
nickinfo = null;
ns = true;
} finally {
database.releaseReadLock();
}
// Clears and Sets the initial NamedDB structure to work with
if (ns) {
nickinfo = new NamedDB();
wlock();
try {
database.add(Arg, nickinfo);
nickinfo.add(P_NICKNAME, Arg);
nickinfo.add(P_STARTING, Boolean.FALSE);
nickinfo.add(P_RUNNING, Boolean.FALSE);
nickinfo.add(P_STOPPING, Boolean.FALSE);
nickinfo.add(P_QUIET, Boolean.FALSE);
nickinfo.add(P_INHOST, "localhost");
nickinfo.add(P_OUTHOST, "localhost");
Properties Q = new Properties();
Lifted.copyProperties(this.props, Q);
Q.setProperty("inbound.nickname", Arg);
Q.setProperty("outbound.nickname", Arg);
nickinfo.add(P_PROPERTIES, Q);
} catch (Exception e) {
break die;
} finally {
wunlock();
}
out.println("OK Nickname set to " + Arg);
} else {
out.println("ERROR tunnel is active");
}
} else if (Command.equals(C_option)) {
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
StringTokenizer otoken = new StringTokenizer(Arg, "="); // use an equal sign as a delimiter
if (otoken.countTokens() != 2) {
out.println("ERROR too many or no options.");
} else {
String pname = otoken.nextToken();
String pval = otoken.nextToken();
wlock();
try {
Properties Q = (Properties) nickinfo.get(P_PROPERTIES);
Q.setProperty(pname, pval);
nickinfo.add(P_PROPERTIES, Q);
} catch (Exception ex) {
break die;
} finally {
wunlock();
}
out.println("OK " + pname + " set to " + pval);
}
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_getnick)) {
// Get the NamedDB to work with...
boolean nsfail = false;
database.getReadLock();
try {
nickinfo = (NamedDB) database.get(Arg);
ns = true;
} catch (RuntimeException b) {
nsfail = true;
nns(out);
} finally {
database.releaseReadLock();
}
if (ns && !nsfail) {
rlock();
try {
dk = nickinfo.exists(P_KEYS);
ip = nickinfo.exists(P_INPORT);
op = nickinfo.exists(P_OUTPORT);
} catch (Exception ex) {
break die;
} finally {
runlock();
}
// Finally say OK.
out.println("OK Nickname set to " + Arg);
}
} else if (Command.equals(C_inport)) {
// Set the NamedDB inbound TO the router port
// app --> BOB
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
int prt;
wlock();
try {
nickinfo.kill(P_INPORT);
prt = Integer.parseInt(Arg);
if (prt > 1 && prt < 65536) {
try {
nickinfo.add(P_INPORT, Integer.valueOf(prt));
} catch (Exception ex) {
break die;
}
}
ip = nickinfo.exists(P_INPORT);
} catch (NumberFormatException nfe) {
out.println("ERROR not a number");
} finally {
wunlock();
}
if (ip) {
out.println("OK inbound port set");
} else {
out.println("ERROR port out of range");
}
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_outport)) {
// Set the NamedDB outbound FROM the router port
// BOB --> app
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
int prt;
wlock();
try {
nickinfo.kill(P_OUTPORT);
prt = Integer.parseInt(Arg);
if (prt > 1 && prt < 65536) {
nickinfo.add(P_OUTPORT, Integer.valueOf(prt));
}
ip = nickinfo.exists(P_OUTPORT);
} catch (NumberFormatException nfe) {
out.println("ERROR not a number");
} catch (Exception ex) {
break die;
} finally {
wunlock();
}
if (ip) {
out.println("OK outbound port set");
} else {
out.println("ERROR port out of range");
}
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_inhost)) {
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
wlock();
try {
nickinfo.add(P_INHOST, Arg);
} catch (Exception ex) {
break die;
} finally {
wunlock();
}
out.println("OK inhost set");
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_outhost)) {
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
wlock();
try {
nickinfo.add(P_OUTHOST, Arg);
} catch (Exception ex) {
break die;
} finally {
wunlock();
}
out.println("OK outhost set");
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_show)) {
// Get the current NamedDB properties
if (ns) {
out.print("OK");
nickprint(out, nickinfo);
} else {
nns(out);
}
} else if (Command.equals(C_show_props)) {
// Get the current options properties
if (ns) {
out.print("OK");
propprint(out, nickinfo);
} else {
nns(out);
}
} else if (Command.equals(C_start)) {
// Start the tunnel, if we have all the information
if (ns && dk && (ip || op)) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
MUXlisten tunnel;
try {
while (!lock.compareAndSet(false, true)) {
// wait
}
tunnel = new MUXlisten(lock, database, nickinfo, _log);
Thread t = new I2PAppThread(tunnel);
t.start();
// try {
// Thread.sleep(1000 * 10); // Slow down the startup.
// } catch(InterruptedException ie) {
// // ignore it
// }
out.println("OK tunnel starting");
} catch (I2PException e) {
lock.set(false);
out.println("ERROR starting tunnel: " + e);
} catch (IOException e) {
lock.set(false);
out.println("ERROR starting tunnel: " + e);
}
}
} catch (Exception ex) {
break die;
}
} else {
out.println("ERROR tunnel settings incomplete");
}
} else if (Command.equals(C_stop)) {
// Stop the tunnel, if it is running
if (ns) {
rlock();
boolean released = false;
try {
if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) {
runlock();
released = true;
wlock();
try {
nickinfo.add(P_STOPPING, Boolean.TRUE);
} catch (Exception e) {
break die;
} finally {
wunlock();
}
out.println("OK tunnel stopping");
} else {
out.println("ERROR tunnel is inactive");
}
} catch (Exception e) {
break die;
} finally {
if (!released)
runlock();
}
} else {
nns(out);
}
} else if (Command.equals(C_clear)) {
// Clear use of the NamedDB if stopped
if (ns) {
try {
if (tunnelactive(nickinfo)) {
out.println("ERROR tunnel is active");
} else {
database.getWriteLock();
try {
database.kill((String) nickinfo.get(P_NICKNAME));
} catch (Exception e) {
} finally {
database.releaseWriteLock();
}
dk = ns = ip = op = false;
out.println("OK cleared");
}
} catch (Exception ex) {
break die;
}
} else {
nns(out);
}
} else if (Command.equals(C_status)) {
database.getReadLock();
try {
if (database.exists(Arg)) {
// Show status of a NamedDB
out.print("OK ");
try {
ttlpnt(out, Arg);
} catch (Exception e) {
out.println(); // this will cause an IOE if IOE
break die;
}
} else {
nns(out);
}
} catch (Exception e) {
break die;
} finally {
database.releaseReadLock();
}
} else {
out.println("ERROR UNKNOWN COMMAND! Try help");
}
}
}
} // die
out.print("ERROR A really bad error just happened, ");
} // quit
// Say goodbye.
out.println("OK Bye!");
} catch (IOException ioe) {
// not really needed, except to debug.
// BOB.warn("IOException on socket listen: " + ioe);
// ioe.printStackTrace();
}
} finally {
try {
server.close();
} catch (IOException ex) {
// nop
}
}
}
// Debugging... None of this is normally used.
/**
* Find the root thread group and print them all.
*
*/
private void visitAllThreads() {
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
while (root.getParent() != null) {
root = root.getParent();
}
// Visit each thread group
visit(root, 0, root.getName());
}
/**
* Recursively visits all thread groups under `group' and dumps them.
* @param group ThreadGroup to visit
* @param level Current level
*/
private static void visit(ThreadGroup group, int level, String tn) {
// Get threads in `group'
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads * 2];
numThreads = group.enumerate(threads, false);
String indent = "------------------------------------".substring(0, level) + "-> ";
// Enumerate each thread in `group' and print it.
for (int i = 0; i < numThreads; i++) {
// Get thread
Thread thread = threads[i];
System.out.println("BOB: " + indent + tn + ": " + thread.toString());
}
// Get thread subgroups of `group'
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
numGroups = group.enumerate(groups, false);
// Recursively visit each subgroup
for (int i = 0; i < numGroups; i++) {
visit(groups[i], level + 1, groups[i].getName());
}
}
}

View File

@@ -1,99 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.util.I2PAppThread;
/**
* Listen on I2P and connect to TCP
*
* @author sponge
*/
public class I2Plistener implements Runnable {
private final NamedDB info, database;
private final Logger _log;
private final I2PServerSocket serverSocket;
private final AtomicBoolean lives;
/**
* Constructor
* @param SS
* @param S unused
* @param info
* @param database
* @param _log
*/
I2Plistener(I2PServerSocket SS, I2PSocketManager S, NamedDB info, NamedDB database, Logger _log, AtomicBoolean lives) {
this.database = database;
this.info = info;
this._log = _log;
this.serverSocket = SS;
this.lives = lives;
}
/**
* Simply listen on I2P port, and thread connections
*
*/
public void run() {
boolean g = false;
I2PSocket sessSocket = null;
int conn = 0;
try {
try {
serverSocket.setSoTimeout(50);
while (lives.get()) {
try {
sessSocket = serverSocket.accept();
g = true;
} catch (ConnectException ce) {
g = false;
} catch (SocketTimeoutException ste) {
g = false;
}
if (g) {
g = false;
conn++;
// toss the connection to a new thread.
I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database, lives);
Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn);
t.start();
}
}
} catch (I2PException e) {
// bad stuff
System.out.println("Exception " + e);
}
} finally {
try {
serverSocket.close();
} catch (I2PException ex) {
}
// System.out.println("I2Plistener: Close");
}
}
}

View File

@@ -1,169 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.data.DataHelper;
import net.i2p.util.I2PAppThread;
/**
* Process I2P-&gt;TCP
*
* @author sponge
*/
public class I2PtoTCP implements Runnable {
private I2PSocket I2P;
private final NamedDB info, database;
private Socket sock;
private final AtomicBoolean lives;
/**
* Constructor
*
* @param I2Psock
* @param info
* @param database
*/
I2PtoTCP(I2PSocket I2Psock, NamedDB info, NamedDB database, AtomicBoolean lives) {
this.I2P = I2Psock;
this.info = info;
this.database = database;
this.lives = lives;
}
private void rlock() {
database.getReadLock();
info.getReadLock();
}
private void runlock() {
info.releaseReadLock();
database.releaseReadLock();
}
/**
* I2P stream to TCP stream thread starter
*
*/
public void run() {
String host;
int port;
boolean tell;
InputStream in = null;
OutputStream out = null;
InputStream Iin = null;
OutputStream Iout = null;
Thread t = null;
Thread q = null;
try {
die:
{
try {
rlock();
try {
host = info.get("OUTHOST").toString();
port = Integer.parseInt(info.get("OUTPORT").toString());
tell = info.get("QUIET").equals(Boolean.FALSE);
} catch (Exception e) {
break die;
} finally {
runlock();
}
sock = new Socket(host, port);
sock.setKeepAlive(true);
// make readers/writers
in = sock.getInputStream();
out = sock.getOutputStream();
Iin = I2P.getInputStream();
Iout = I2P.getOutputStream();
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
if (tell) {
// tell who is connecting
out.write(DataHelper.getASCII(I2P.getPeerDestination().toBase64()));
out.write(10); // nl
out.flush(); // not really needed, but...
}
// setup to cross the streams
TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P
TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app
t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA");
q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB");
// Fire!
t.start();
q.start();
while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread
try {
Thread.sleep(10); //sleep for 10 ms
} catch (InterruptedException e) {
break die;
}
}
// System.out.println("I2PtoTCP: Going away...");
} catch (Exception e) {
// System.out.println("I2PtoTCP: Owch! damn!");
break die;
}
} // die
} finally {
try {
in.close();
} catch (Exception ex) {
}
try {
out.close();
} catch (Exception ex) {
}
try {
Iin.close();
} catch (Exception ex) {
}
try {
Iout.close();
} catch (Exception ex) {
}
try {
t.interrupt();
} catch (Exception e) {
}
try {
q.interrupt();
} catch (Exception e) {
}
try {
// System.out.println("I2PtoTCP: Close I2P");
I2P.close();
} catch (Exception e) {
tell = false;
}
//System.out.println("I2PtoTCP: Closed I2P");
try {
// System.out.println("I2PtoTCP: Close sock");
sock.close();
} catch (Exception e) {
tell = false;
}
// System.out.println("I2PtoTCP: Done");
}
}
}

View File

@@ -1,46 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.util.Map;
import java.util.Properties;
/**
* Sets of "friendly" utilities to make life easier.
* Any "Lifted" code will apear here, and credits given.
* It's better to "Lift" a small chunk of "free" code than add in piles of
* code we don't need, and don't want.
*
* @author sponge
*/
public class Lifted {
/**
* Copy a set of properties from one Property to another.
* Lifted from Apache Derby code svn repository.
* Liscenced as follows:
* http://svn.apache.org/repos/asf/db/derby/code/trunk/LICENSE
*
* @param src_prop Source set of properties to copy from.
* @param dest_prop Dest Properties to copy into.
*
**/
public static void copyProperties(Properties src_prop, Properties dest_prop) {
for (Map.Entry<Object, Object> e : src_prop.entrySet()) {
dest_prop.put((String)e.getKey(), (String)e.getValue());
}
}
}

View File

@@ -1,44 +0,0 @@
package net.i2p.BOB;
import net.i2p.util.Log;
public class Logger {
public Log log;
private boolean logToStdout;
public Logger(Log log, boolean logToStdout) {
this.log = log;
this.logToStdout = logToStdout;
}
public void info(String msg) {
if (logToStdout)
System.out.println("INFO: " + msg);
if (log.shouldLog(Log.INFO))
log.info(msg);
}
public void warn(String msg) {
warn(msg, null);
}
public void warn(String msg, Throwable e) {
if (logToStdout) {
System.out.println("WARNING: " + msg);
if (e != null)
e.printStackTrace();
}
if (log.shouldLog(Log.WARN))
log.warn(msg, e);
}
public void error(String msg, Throwable e) {
if (logToStdout) {
System.out.println("ERROR: " + msg);
if (e != null)
e.printStackTrace();
}
if (log.shouldLog(Log.ERROR))
log.error(msg, e);
}
}

View File

@@ -1,416 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.I2PException;
import net.i2p.client.I2PClient;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
/**
*
* Multiplex listeners for TCP and I2P
*
* @author sponge
*/
public class MUXlisten implements Runnable {
private final NamedDB database, info;
private final Logger _log;
private final I2PSocketManager socketManager;
private final ByteArrayInputStream prikey;
private ThreadGroup tg;
private final String N;
private ServerSocket listener;
private static final int backlog = 50; // should this be more? less?
private final boolean go_out;
private final boolean come_in;
private final AtomicBoolean lock;
private final AtomicBoolean lives;
/**
* Constructor Will fail if INPORT is occupied.
*
* @param info DB entry for this tunnel
* @param database master database of tunnels
* @param _log
* @throws net.i2p.I2PException
* @throws java.io.IOException
*/
MUXlisten(AtomicBoolean lock, NamedDB database, NamedDB info, Logger _log) throws I2PException, IOException, RuntimeException {
int port = 0;
InetAddress host = null;
this.lock = lock;
this.tg = null;
this.database = database;
this.info = info;
this._log = _log;
lives = new AtomicBoolean(false);
try {
wlock();
try {
this.info.add("STARTING", Boolean.TRUE);
} finally {
wunlock();
}
Properties Q = new Properties();
rlock();
try {
N = this.info.get("NICKNAME").toString();
prikey = new ByteArrayInputStream((byte[]) info.get("KEYS"));
// Make a new copy so that anything else won't muck with our database.
Properties R = (Properties) info.get("PROPERTIES");
Lifted.copyProperties(R, Q);
this.go_out = info.exists("OUTPORT");
this.come_in = info.exists("INPORT");
if (this.come_in) {
port = Integer.parseInt(info.get("INPORT").toString());
host = InetAddress.getByName(info.get("INHOST").toString());
}
} finally {
runlock();
}
String i2cpHost = Q.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
int i2cpPort = I2PClient.DEFAULT_LISTEN_PORT;
String i2cpPortStr = Q.getProperty(I2PClient.PROP_TCP_PORT);
if (i2cpPortStr != null) {
try {
i2cpPort = Integer.parseInt(i2cpPortStr);
} catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Invalid I2CP port specified [" + i2cpPortStr + "]");
}
}
if (this.come_in) {
this.listener = new ServerSocket(port, backlog, host);
}
socketManager = I2PSocketManagerFactory.createManager(
prikey, i2cpHost, i2cpPort, Q);
} catch (IOException e) {
// Something went bad.
wlock();
try {
this.info.add("STARTING", Boolean.FALSE);
} finally {
wunlock();
}
throw e;
} catch (RuntimeException e) {
// Something went bad.
wlock();
try {
this.info.add("STARTING", Boolean.FALSE);
} finally {
wunlock();
}
throw e;
} catch (Exception e) {
// Something else went bad.
wlock();
try {
this.info.add("STARTING", Boolean.FALSE);
} finally {
wunlock();
}
e.printStackTrace();
throw new RuntimeException(e);
}
}
private void rlock() {
database.getReadLock();
info.getReadLock();
}
private void runlock() {
info.releaseReadLock();
database.releaseReadLock();
}
private void wlock() {
database.getWriteLock();
info.getWriteLock();
}
private void wunlock() {
info.releaseWriteLock();
database.releaseWriteLock();
}
/**
* MUX sockets, fire off a thread to connect, get destination info, and do I/O
*
*/
public void run() {
I2PServerSocket SS = null;
Thread t = null;
Thread q = null;
try {
wlock();
try {
try {
info.add("RUNNING", Boolean.TRUE);
} catch (Exception e) {
lock.set(false);
return;
}
} catch (Exception e) {
lock.set(false);
return;
} finally {
wunlock();
}
lives.set(true);
lock.set(false);
quit:
{
try {
tg = new ThreadGroup(N);
{
// toss the connections to a new threads.
// will wrap with TCP and UDP when UDP works
if (go_out) {
// I2P -> TCP
SS = socketManager.getServerSocket();
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log, lives);
t = new I2PAppThread(tg, conn, "BOBI2Plistener " + N);
t.start();
}
if (come_in) {
// TCP -> I2P
TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log, lives);
q = new I2PAppThread(tg, conn, "BOBTCPlistener " + N);
q.start();
}
wlock();
try {
try {
info.add("STARTING", Boolean.FALSE);
} catch (Exception e) {
break quit;
}
} catch (Exception e) {
break quit;
} finally {
wunlock();
}
boolean spin = true;
while (spin && lives.get()) {
try {
Thread.sleep(1000); //sleep for 1 second
} catch (InterruptedException e) {
break quit;
}
rlock();
try {
try {
spin = info.get("STOPPING").equals(Boolean.FALSE);
} catch (Exception e) {
break quit;
}
} catch (Exception e) {
break quit;
} finally {
runlock();
}
}
} // die
} catch (Exception e) {
// System.out.println("MUXlisten: Caught an exception" + e);
break quit;
}
} // quit
} finally {
lives.set(false);
// Some grace time.
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
try {
wlock();
try {
info.add("STARTING", Boolean.FALSE);
info.add("STOPPING", Boolean.TRUE);
info.add("RUNNING", Boolean.FALSE);
} catch (Exception e) {
lock.set(false);
return;
}
} catch (Exception e) {
} finally {
wunlock();
}
// Start cleanup.
while (!lock.compareAndSet(false, true)) {
// wait
}
if (SS != null) {
try {
SS.close();
} catch (I2PException ex) {
}
}
if (listener != null) {
try {
listener.close();
} catch (IOException e) {
}
}
// Some grace time.
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
// Hopefully nuke stuff here...
{
String groupName = tg.getName();
try {
_log.warn("destroySocketManager " + groupName);
socketManager.destroySocketManager();
_log.warn("destroySocketManager Successful" + groupName);
} catch (Exception e) {
// nop
_log.warn("destroySocketManager Failed" + groupName);
_log.warn(e.toString());
}
}
// zero out everything.
try {
wlock();
try {
info.add("STARTING", Boolean.FALSE);
info.add("STOPPING", Boolean.FALSE);
info.add("RUNNING", Boolean.FALSE);
} catch (Exception e) {
lock.set(false);
return;
} finally {
wunlock();
}
} catch (Exception e) {
}
lock.set(false); // Should we force waiting for all threads??
// Wait around till all threads are collected.
if (tg != null) {
String groupName = tg.getName();
// System.out.println("BOB: MUXlisten: Starting thread collection for: " + groupName);
_log.warn("BOB: MUXlisten: Starting thread collection for: " + groupName);
if (tg.activeCount() + tg.activeGroupCount() != 0) {
// visit(tg, 0, groupName);
int foo = tg.activeCount() + tg.activeGroupCount();
// hopefully no longer needed!
// int bar = lives;
// System.out.println("BOB: MUXlisten: Waiting on threads for " + groupName);
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + groupName);
// visit(tg, 0, groupName);
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + groupName + "\n");
// Happily spin forever :-(
while (foo != 0) {
foo = tg.activeCount() + tg.activeGroupCount();
// if (lives != bar && lives != 0) {
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + groupName);
// visit(tg, 0, groupName);
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + groupName + "\n");
// }
// bar = lives;
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch (InterruptedException ex) {
// nop
}
}
}
// System.out.println("BOB: MUXlisten: Threads went away. Success: " + groupName);
_log.warn("BOB: MUXlisten: Threads went away. Success: " + groupName);
tg.destroy();
// Zap reference to the ThreadGroup so the JVM can GC it.
tg = null;
}
try {
socketManager.destroySocketManager();
} catch (Exception e) {
// nop
}
}
}
// Debugging... None of this is normally used.
/**
* Find the root thread group and print them all.
*
*/
private void visitAllThreads() {
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
while (root.getParent() != null) {
root = root.getParent();
}
// Visit each thread group
visit(root, 0, root.getName());
}
/**
* Recursively visits all thread groups under `group' and dumps them.
* @param group ThreadGroup to visit
* @param level Current level
*/
private static void visit(ThreadGroup group, int level, String tn) {
// Get threads in `group'
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads * 2];
numThreads = group.enumerate(threads, false);
String indent = "------------------------------------".substring(0, level) + "-> ";
// Enumerate each thread in `group' and print it.
for (int i = 0; i < numThreads; i++) {
// Get thread
Thread thread = threads[i];
System.out.println("BOB: MUXlisten: " + tn + ": " + indent + thread.toString());
}
// Get thread subgroups of `group'
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
numGroups = group.enumerate(groups, false);
// Recursively visit each subgroup
for (int i = 0; i < numGroups; i++) {
visit(groups[i], level + 1, groups[i].getName());
}
}
}

View File

@@ -1,39 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import net.i2p.util.SimpleTimer2;
/**
* Start from command line
*
* @author sponge
*
*/
public class Main {
/**
* @param args the command line arguments, these are not used yet
*/
public static void main(String[] args) {
// THINK THINK THINK THINK THINK THINK
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
BOB.main(args);
Y2.stop();
}
}

View File

@@ -1,106 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Internal database to relate nicknames to options to values
*
* @author sponge
*/
public class NamedDB {
private final Map<String, Object> data;
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(false);
/**
*
*/
public NamedDB() {
this.data = new HashMap<String, Object>();
}
public void getReadLock() {
lock.readLock().lock();
}
public void releaseReadLock() {
lock.readLock().unlock();
}
public void getWriteLock() {
lock.writeLock().lock();
}
public void releaseWriteLock() {
lock.writeLock().unlock();
}
/**
* Delete an object if it exists
*
* @param key
*/
public void kill(String key) {
data.remove(key);
}
/**
* Add object, deletes the old one if it exists
*
* @param key
* @param val
*/
public void add(String key, Object val) {
data.put(key, val);
}
/**
* Get the object, and return it, throws RuntimeException if not found
*
* @param key non-null
* @return Object non-null
* @throws java.lang.RuntimeException if not found
*/
public Object get(String key) throws RuntimeException {
Object rv = data.get(key);
if (rv != null)
return rv;
throw new RuntimeException("Key not found");
}
/**
* returns true if an object exists, else returns false
*
* @param key
* @return true if an object exists, else returns false
*/
public boolean exists(String key) {
return data.containsKey(key);
}
/**
* @since 0.9.29 replaces getcount() and getnext(int)
*/
public Collection<Object> values() {
return data.values();
}
}

View File

@@ -1,121 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Shove data from one stream to the other.
*
* @author sponge
*/
public class TCPio implements Runnable {
private final InputStream Ain;
private final OutputStream Aout;
private final AtomicBoolean lives;
/**
* Constructor
*
* @param Ain InputStream
* @param Aout OutputStream
*
* param database
*/
TCPio(InputStream Ain, OutputStream Aout, AtomicBoolean lives) {
this.Ain = Ain;
this.Aout = Aout;
this.lives = lives;
}
/**
* Copy from source to destination...
* and yes, we are totally OK to block here on writes,
* The OS has buffers, and I intend to use them.
* We send an interrupt signal to the threadgroup to
* unwedge any pending writes.
*
*/
public void run() {
/*
* NOTE:
* The write method of OutputStream calls the write method of
* one argument on each of the bytes to be written out.
* Subclasses are encouraged to override this method and provide
* a more efficient implementation.
*
* So, is this really a performance problem?
* Should we expand to several bytes?
* I don't believe there would be any gain, since read method
* has the same reccomendations. If anyone has a better way to
* do this, I'm interested in performance improvements.
*
* --Sponge
*
* Tested with 128 bytes, and there was no performance gain.
* 8192 bytes did lower load average across many connections.
* Should I raise it higer? The correct thing to do would be to
* override... perhaps use NTCP, but I2P's streaming lib lacks
* anything NTCP compatable.
*
* --Sponge
*/
int b;
byte a[] = new byte[8192];
try {
try {
while (lives.get()) {
b = Ain.read(a, 0, 8192);
if (b > 0) {
Aout.write(a, 0, b);
} else if (b == 0) {
while(Ain.available() == 0) {
Thread.sleep(20);
}
} else {
/* according to the specs:
*
* The total number of bytes read into the buffer,
* or -1 if there is no more data because the end of
* the stream has been reached.
*
*/
// System.out.println("TCPio: End Of Stream");
break;
}
}
} catch (Exception e) {
}
// System.out.println("TCPio: Leaving.");
} finally {
// Eject!!! Eject!!!
//System.out.println("TCPio: Caught an exception " + e);
try {
Ain.close();
} catch (IOException ex) {
}
try {
Aout.close();
} catch (IOException ex) {
}
}
}
}

View File

@@ -1,95 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.util.I2PAppThread;
/**
* Listen on TCP port and connect to I2P
*
* @author sponge
*/
public class TCPlistener implements Runnable {
private final NamedDB info, database;
private final Logger _log;
private final I2PSocketManager socketManager;
private final ServerSocket listener;
private final AtomicBoolean lives;
/**
* Constructor
* @param S
* @param info
* @param database
* @param _log
*/
TCPlistener(ServerSocket listener, I2PSocketManager S, NamedDB info, NamedDB database, Logger _log, AtomicBoolean lives) {
this.database = database;
this.info = info;
this._log = _log;
this.socketManager = S;
this.listener = listener;
this.lives = lives;
}
/**
* Simply listen on TCP port, and thread connections
*
*/
public void run() {
boolean g = false;
int conn = 0;
Socket server = null;
try {
try {
listener.setSoTimeout(50); // We don't block, we cycle and check.
while (lives.get()) {
try {
server = listener.accept();
server.setKeepAlive(true);
g = true;
} catch (SocketTimeoutException ste) {
g = false;
}
if (g) {
conn++;
// toss the connection to a new thread.
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database, lives);
Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn);
t.start();
g = false;
}
}
} catch (IOException ioe) {
}
} finally {
try {
listener.close();
} catch (IOException ex) {
}
//System.out.println("TCPlistener: " + Thread.currentThread().getName() + "Done.");
}
}
}

View File

@@ -1,222 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination;
import net.i2p.util.I2PAppThread;
/**
*
* Process TCP-&gt;I2P
*
* @author sponge
*/
public class TCPtoI2P implements Runnable {
private I2PSocket I2P;
private final Socket sock;
private final I2PSocketManager socketManager;
private final AtomicBoolean lives;
/**
* Constructor
* @param i2p
* @param socket
* @param info unused
* @param database unused
*/
TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database, AtomicBoolean lives) {
this.sock = socket;
this.socketManager = i2p;
this.lives = lives;
}
/**
* This is a more forgiving readline,
* it works on unbuffered streams
*
* @param in
* @return line of text as a String
* @throws IOException
*/
private static String lnRead(InputStream in) throws IOException {
StringBuilder builder = new StringBuilder();
int b;
char c;
while (true) {
b = in.read();
if (b == 13) {
//skip CR
continue;
}
if (b < 20 || b > 126) {
// exit on anything not legal
break;
}
c = (char) (b & 0x7f); // We only care about ASCII
builder.append(c);
}
return builder.toString();
}
/**
* Print an error message to out
*
* @param e
* @param out
* @throws java.io.IOException
*/
private void Emsg(String e, OutputStream out) throws IOException {
// Debugging System.out.println("ERROR TCPtoI2P: " + e);
out.write("ERROR ".concat(e).getBytes("UTF-8"));
out.write(13);
out.write(10);
out.flush();
}
/**
* TCP stream to I2P stream thread starter
*
*/
public void run() {
String line, input;
InputStream Iin = null;
OutputStream Iout = null;
InputStream in = null;
OutputStream out = null;
Thread t = null;
Thread q = null;
try {
try {
in = sock.getInputStream();
out = sock.getOutputStream();
line = lnRead(in);
input = line.toLowerCase(Locale.US);
Destination dest = null;
if (input.endsWith(".i2p")) {
//dest = I2PTunnel.destFromName(input);
dest = I2PAppContext.getGlobalContext().namingService().lookup(input);
if (dest != null) {
line = dest.toBase64();
} else {
Emsg("Can't find destination: " + input, out);
return;
}
}
dest = new Destination();
dest.fromBase64(line);
try {
// get a client socket
I2P = socketManager.connect(dest);
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
// make readers/writers
Iin = I2P.getInputStream();
Iout = I2P.getOutputStream();
// setup to cross the streams
TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P
TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app
t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA");
q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB");
// Fire!
t.start();
q.start();
while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread
Thread.sleep(10); //sleep for 10 ms
}
} catch (I2PException e) {
Emsg(e.toString(), out);
} catch (ConnectException e) {
Emsg(e.toString(), out);
} catch (NoRouteToHostException e) {
Emsg(e.toString(), out);
}
} catch (InterruptedIOException e) {
// We're breaking away.
} catch (InterruptedException e) {
// ditto
} catch (IOException e) {
try {
Emsg(e.toString(), out);
} catch (IOException ex) {
// ditto
}
} catch (DataFormatException e) {
try {
Emsg(e.toString(), out);
} catch (IOException ex) {
// ditto
}
}
} finally {
try {
t.interrupt();
} catch (Exception e) {
}
try {
q.interrupt();
} catch (Exception e) {
}
try {
in.close();
} catch (Exception e) {
}
try {
out.close();
} catch (Exception e) {
}
try {
Iin.close();
} catch (Exception e) {
}
try {
Iout.close();
} catch (Exception e) {
}
try {
// System.out.println("TCPtoI2P: Close I2P");
I2P.close();
} catch (Exception e) {
}
try {
// System.out.println("TCPtoI2P: Close sock");
sock.close();
} catch (Exception e) {
}
}
// System.out.println("TCPtoI2P: Done.");
}
}

View File

@@ -1,140 +0,0 @@
/**
* WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
*
* See...
*
* http://sam.zoy.org/wtfpl/
* and
* http://en.wikipedia.org/wiki/WTFPL
*
* ...for any additional details and license questions.
*/
package net.i2p.BOB;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import net.i2p.client.I2PSession;
import net.i2p.client.I2PSessionException;
import net.i2p.client.I2PSessionListener;
import net.i2p.data.Destination;
import net.i2p.util.Log;
/**
* UDP IO on I2P
*
* FIX ME: Untested, and incomplete!
* I have no personal need to UDP yet,
* however alot of p2p apps pretty much demand it.
* The skeletal frame is here, just needs to be finished.
*
* @author sponge
* @deprecated incomplete, unused
*/
@Deprecated
public class UDPIOthread implements I2PSessionListener, Runnable {
private final NamedDB info;
private final Log _log;
private final Socket socket;
private DataInputStream in;
private DataOutputStream out;
private final I2PSession _session;
// FIXME never set
private Destination _peerDestination;
private boolean up;
/**
* Constructor
* @param info
* @param _log
* @param socket
* @param _session
*/
UDPIOthread(NamedDB info, Log _log, Socket socket, I2PSession _session) {
this.info = info;
this._log = _log;
this.socket = socket;
this._session = _session;
}
/**
*
*/
public void run() {
byte data[] = new byte[1024];
up = true;
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
while (up) {
int c = in.read(data);
// Note: could do a loopback test here with a wrapper.
boolean ok = _session.sendMessage(_peerDestination, data, 0, c);
if (!ok) {
up = false; // Is this the right thing to do??
}
}
} 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 {
if (_session != null) {
try {
_session.destroySession();
} catch (I2PSessionException ise) {
// ignored
}
}
}
}
/**
*
* @param session
* @param msgId
* @param size
*/
public void messageAvailable(I2PSession session, int msgId, long size) {
// _log.debug("Message available: id = " + msgId + " size = " + size);
try {
byte msg[] = session.receiveMessage(msgId);
if (msg != null) {
out.write(msg);
out.flush();
}
} catch (I2PSessionException ise) {
up = false;
} catch (IOException ioe) {
up = false;
}
}
// Great, can these be used to kill ourselves.
/** required by {@link I2PSessionListener I2PSessionListener} to notify of disconnect */
public void disconnected(I2PSession session) {
_log.debug("Disconnected");
// up = false;
}
/** required by {@link I2PSessionListener I2PSessionListener} to notify of error */
public void errorOccurred(I2PSession session, String message, Throwable error) {
_log.debug("Error occurred: " + message, error);
// up = false;
}
/** required by {@link I2PSessionListener I2PSessionListener} to notify of abuse */
public void reportAbuse(I2PSession session, int severity) {
_log.debug("Abuse reported of severity " + severity);
// up = false;
}
}

View File

@@ -1,21 +0,0 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) sponge
Planet Earth
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
See...
http://sam.zoy.org/wtfpl/
and
http://en.wikipedia.org/wiki/WTFPL
...for any additional details and license questions.

View File

@@ -1,5 +0,0 @@
<html>
<body>
<p>BOB, the Basic Open Bridge, allows TCP applications to talk over I2P - DEPRECATED - Please port applications to SAMv3.</p>
</body>
</html>

View File

@@ -4,14 +4,15 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# slrslr, 2022
# slrslr, 2021
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2021-07-08 09:41+0000\n"
"Last-Translator: slrslr\n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2011-02-13 12:05+0000\n"
"Last-Translator: slrslr, 2022\n"
"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -26,69 +27,81 @@ msgstr "Spustit I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
msgid "I2P is starting!"
msgstr "I2P startuje!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
msgid "Starting"
msgstr "Startuji"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
#: src/net/i2p/desktopgui/InternalTrayManager.java:65
#: src/net/i2p/desktopgui/InternalTrayManager.java:249
msgid "Launch I2P Browser"
msgstr "Spouštím I2P Browser"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
#: src/net/i2p/desktopgui/InternalTrayManager.java:86
#: src/net/i2p/desktopgui/InternalTrayManager.java:270
msgid "Configure I2P System Tray"
msgstr "Nastavit I2P Systémovou Lištu"
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Zakázat"
#: src/net/i2p/desktopgui/InternalTrayManager.java:87
#: src/net/i2p/desktopgui/InternalTrayManager.java:271
msgid "Enable notifications"
msgstr "Zapnout upozornění"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
#: src/net/i2p/desktopgui/InternalTrayManager.java:101
#: src/net/i2p/desktopgui/InternalTrayManager.java:285
msgid "Disable notifications"
msgstr "Vypnout upozornění"
#: src/net/i2p/desktopgui/InternalTrayManager.java:115
#: src/net/i2p/desktopgui/InternalTrayManager.java:299
msgid "Disable system tray"
msgstr "Vypnout ikonu systémové lišty"
#: src/net/i2p/desktopgui/InternalTrayManager.java:131
#: src/net/i2p/desktopgui/InternalTrayManager.java:315
msgid "Restart I2P"
msgstr "Restart I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
#: src/net/i2p/desktopgui/InternalTrayManager.java:148
#: src/net/i2p/desktopgui/InternalTrayManager.java:332
msgid "Stop I2P"
msgstr "Zastavit I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
#: src/net/i2p/desktopgui/InternalTrayManager.java:164
#: src/net/i2p/desktopgui/InternalTrayManager.java:348
msgid "Restart I2P Immediately"
msgstr "Restartovat I2P Hned"
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
#: src/net/i2p/desktopgui/InternalTrayManager.java:181
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Stop I2P Immediately"
msgstr "Zastavit I2P Hned"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
#: src/net/i2p/desktopgui/InternalTrayManager.java:195
#: src/net/i2p/desktopgui/InternalTrayManager.java:379
msgid "Cancel I2P Shutdown"
msgstr "Zrušit I2P Zastavení"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#: src/net/i2p/desktopgui/InternalTrayManager.java:437
#, java-format
msgid "Shutdown in {0}"
msgstr "Zastavení za {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
#: src/net/i2p/desktopgui/InternalTrayManager.java:439
msgid "Shutdown imminent"
msgstr "Vypínání"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
#: src/net/i2p/desktopgui/InternalTrayManager.java:444
msgid "Network"
msgstr "Síť"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
#: src/net/i2p/desktopgui/TrayManager.java:73
msgid "I2P: Right-click for menu"
msgstr "I2P: Pravé-kliknutí pro menu"

View File

@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2018-10-04 00:43+0000\n"
"Last-Translator: erinm\n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2011-02-13 12:05+0000\n"
"Last-Translator: 黃彥儒 <r1235613@gmail.com>, 2017\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/otf/I2P/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -26,69 +26,81 @@ msgstr "啟動I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
msgid "I2P is starting!"
msgstr "I2P已啟動"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
msgid "Starting"
msgstr "啟動中"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
#: src/net/i2p/desktopgui/InternalTrayManager.java:65
#: src/net/i2p/desktopgui/InternalTrayManager.java:249
msgid "Launch I2P Browser"
msgstr "開啟I2P瀏覽器"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
#: src/net/i2p/desktopgui/InternalTrayManager.java:86
#: src/net/i2p/desktopgui/InternalTrayManager.java:270
msgid "Configure I2P System Tray"
msgstr "設定I2P系統文件夾"
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "停用"
#: src/net/i2p/desktopgui/InternalTrayManager.java:87
#: src/net/i2p/desktopgui/InternalTrayManager.java:271
msgid "Enable notifications"
msgstr "启用通知"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
#: src/net/i2p/desktopgui/InternalTrayManager.java:101
#: src/net/i2p/desktopgui/InternalTrayManager.java:285
msgid "Disable notifications"
msgstr "禁用通知"
#: src/net/i2p/desktopgui/InternalTrayManager.java:115
#: src/net/i2p/desktopgui/InternalTrayManager.java:299
msgid "Disable system tray"
msgstr "禁用系统托盘"
#: src/net/i2p/desktopgui/InternalTrayManager.java:131
#: src/net/i2p/desktopgui/InternalTrayManager.java:315
msgid "Restart I2P"
msgstr "重啟I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
#: src/net/i2p/desktopgui/InternalTrayManager.java:148
#: src/net/i2p/desktopgui/InternalTrayManager.java:332
msgid "Stop I2P"
msgstr "停止I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
#: src/net/i2p/desktopgui/InternalTrayManager.java:164
#: src/net/i2p/desktopgui/InternalTrayManager.java:348
msgid "Restart I2P Immediately"
msgstr "強制重啟I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
#: src/net/i2p/desktopgui/InternalTrayManager.java:181
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Stop I2P Immediately"
msgstr "強制終止I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
#: src/net/i2p/desktopgui/InternalTrayManager.java:195
#: src/net/i2p/desktopgui/InternalTrayManager.java:379
msgid "Cancel I2P Shutdown"
msgstr "取消停止I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#: src/net/i2p/desktopgui/InternalTrayManager.java:437
#, java-format
msgid "Shutdown in {0}"
msgstr "關閉於 {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
#: src/net/i2p/desktopgui/InternalTrayManager.java:439
msgid "Shutdown imminent"
msgstr "強制關閉"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
#: src/net/i2p/desktopgui/InternalTrayManager.java:444
msgid "Network"
msgstr "網路"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
#: src/net/i2p/desktopgui/TrayManager.java:73
msgid "I2P: Right-click for menu"
msgstr "I2P右鍵開啟選單"

View File

@@ -0,0 +1,227 @@
package net.i2p.desktopgui;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import javax.swing.SwingUtilities;
import net.i2p.I2PAppContext;
import net.i2p.app.ClientAppManager;
import net.i2p.app.ClientApp;
import net.i2p.app.ClientAppState;
import net.i2p.app.NotificationService;
import net.i2p.util.Log;
import net.i2p.util.SystemVersion;
/**
* A simplified Main that does not require router.jar, for App Context only.
* Invokes ExternalTrayManager only.
* No state tracking, ClientAppManager doesn't care.
*
* @since 0.9.54
*/
public class ExternalMain implements ClientApp, NotificationService {
private final I2PAppContext _appContext;
private final ClientAppManager _mgr;
private final Log log;
private TrayManager _trayManager;
private static final String PROP_SWING = "desktopgui.swing";
public ExternalMain(I2PAppContext ctx, ClientAppManager mgr, String args[]) {
_appContext = ctx;
_mgr = mgr;
log = _appContext.logManager().getLog(ExternalMain.class);
}
public ExternalMain() {
_appContext = I2PAppContext.getGlobalContext();
_mgr = _appContext.clientAppManager();
log = _appContext.logManager().getLog(ExternalMain.class);
}
public static void main(String[] args) {
// early check so we can bail out when started via CLI
if (!SystemTray.isSupported()) {
System.err.println("SystemTray not supported");
return;
}
ExternalMain main = new ExternalMain();
main.beginStartup(args);
}
/**
* Start the tray icon code (loads tray icon in the tray area).
* @throws AWTException on startup error, including systray not supported
*/
private synchronized void startUp() throws Exception {
final TrayManager trayManager;
boolean useSwingDefault = !(SystemVersion.isWindows() || SystemVersion.isMac());
boolean useSwing = _appContext.getProperty(PROP_SWING, useSwingDefault);
_trayManager = new ExternalTrayManager(_appContext, useSwing);
_trayManager.startManager();
if (_mgr != null)
_mgr.register(this);
}
/**
* Main method launching the application.
*
* @param args unused
*/
private void beginStartup(String[] args) {
String headless = System.getProperty("java.awt.headless");
boolean isHeadless = Boolean.parseBoolean(headless);
if (isHeadless) {
log.warn("Headless environment: not starting desktopgui!");
return;
}
if (SystemVersion.isMac())
setMacTrayIcon();
launchForeverLoop();
// We'll be doing GUI work, so let's stay in the event dispatcher thread.
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
startUp();
} catch(Exception e) {
log.error("Failed while running desktopgui!", e);
}
}
});
}
/**
* Unless we do this, when we start DesktopGUI we get a Java coffee cup
* in the tray.
*
* Based on code from https://gist.github.com/bchapuis/1562406 , no apparent license.
* See also https://stackoverflow.com/questions/6006173/how-do-you-change-the-dock-icon-of-a-java-program
*
* TODO, if we wanted to add our own menu, see
* https://stackoverflow.com/questions/1319805/java-os-x-dock-menu
*
* TODO, if we want to make it bounce, see
* https://stackoverflow.com/questions/15079783/how-to-make-my-app-icon-bounce-in-the-mac-dock
*
* TODO, if we want to handle Quit, see
* https://nakkaya.com/2009/04/19/java-osx-integration/
*
* @since 0.9.33
*/
@SuppressWarnings("unchecked")
private void setMacTrayIcon() {
File f = new File(_appContext.getBaseDir(), "docs/themes/console/images/itoopie_sm.png");
if (!f.exists())
return;
try {
Class util = Class.forName("com.apple.eawt.Application");
Method getApplication = util.getMethod("getApplication", new Class[0]);
Object application = getApplication.invoke(util);
Class params[] = new Class[1];
params[0] = Image.class;
Method setDockIconImage = util.getMethod("setDockIconImage", params);
URL url = f.toURI().toURL();
Image image = Toolkit.getDefaultToolkit().getImage(url);
setDockIconImage.invoke(application, image);
} catch (Exception e) {
if (log.shouldWarn())
log.warn("Can't set OSX Dock icon", e);
}
}
/**
* Avoids the app terminating because no Window is opened anymore.
* More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown
*/
private static void launchForeverLoop() {
Runnable r = new Runnable() {
public void run() {
try {
Object o = new Object();
synchronized (o) {
o.wait();
}
} catch (InterruptedException ie) {
}
}
};
Thread t = new Thread(r, "DesktopGUI spinner");
t.setDaemon(false);
t.start();
}
/////// NotificationService methods
/**
* Send a notification to the user.
*
* @param source unsupported
* @param category unsupported
* @param priority unsupported
* @param title for the popup, translated
* @param message translated
* @param path unsupported
* @return 0, or -1 on failure
*/
public int notify(String source, String category, int priority, String title, String message, String path) {
TrayManager tm = _trayManager;
if (tm == null)
return -1;
return tm.displayMessage(priority, title, message, path);
}
/**
* Cancel a notification if possible.
* Unsupported.
*
* @return false always
*/
public boolean cancel(int id) {
return false;
}
/**
* Update the text of a notification if possible.
* Unsupported.
*
* @return false always
*/
public boolean update(int id, String title, String message, String path) {
return false;
}
/////// ClientApp methods
public synchronized void startup() {
beginStartup(null);
}
public synchronized void shutdown(String[] args) {
if (_trayManager != null)
_trayManager.stopManager();
}
public ClientAppState getState() {
return ClientAppState.INITIALIZED;
}
public String getName() {
return "desktopgui";
}
public String getDisplayName() {
return "Desktop GUI";
}
/////// end ClientApp methods
}

View File

@@ -22,8 +22,8 @@ import net.i2p.desktopgui.router.RouterManager;
*/
class ExternalTrayManager extends TrayManager {
public ExternalTrayManager(I2PAppContext ctx, Main main, boolean useSwing) {
super(ctx, main, useSwing);
public ExternalTrayManager(I2PAppContext ctx, boolean useSwing) {
super(ctx, useSwing);
}
public PopupMenu getMainMenu() {

View File

@@ -30,6 +30,7 @@ class InternalTrayManager extends TrayManager {
private final RouterContext _context;
private final Log log;
private final Main _main;
private MenuItem _statusItem, _browserItem, _configItem, _restartItem, _stopItem,
_restartHardItem, _stopHardItem, _cancelItem,
_notificationItem1, _notificationItem2;
@@ -42,8 +43,9 @@ class InternalTrayManager extends TrayManager {
private static final String CONSOLE_BUNDLE_NAME = "net.i2p.router.web.messages";
public InternalTrayManager(RouterContext ctx, Main main, boolean useSwing) {
super(ctx, main, useSwing);
super(ctx, useSwing);
_context = ctx;
_main = main;
log = ctx.logManager().getLog(InternalTrayManager.class);
}

View File

@@ -57,7 +57,7 @@ public class Main implements RouterApp, NotificationService {
*/
public Main() {
_appContext = I2PAppContext.getGlobalContext();
if (_appContext instanceof RouterContext)
if (_appContext.isRouterContext())
_context = (RouterContext) _appContext;
else
_context = null;
@@ -77,7 +77,7 @@ public class Main implements RouterApp, NotificationService {
if (_context != null)
trayManager = new InternalTrayManager(_context, this, useSwing);
else
trayManager = new ExternalTrayManager(_appContext, this, useSwing);
trayManager = new ExternalTrayManager(_appContext, useSwing);
trayManager.startManager();
_trayManager = trayManager;
changeState(RUNNING);

View File

@@ -37,7 +37,6 @@ import net.i2p.util.SystemVersion;
abstract class TrayManager {
protected final I2PAppContext _appContext;
protected final Main _main;
protected final boolean _useSwing;
///The tray area, or null if unsupported
protected SystemTray tray;
@@ -55,9 +54,8 @@ abstract class TrayManager {
/**
* Instantiate tray manager.
*/
protected TrayManager(I2PAppContext ctx, Main main, boolean useSwing) {
protected TrayManager(I2PAppContext ctx, boolean useSwing) {
_appContext = ctx;
_main = main;
_useSwing = useSwing;
}

View File

@@ -12,7 +12,7 @@ import net.i2p.I2PAppContext;
import net.i2p.data.DataHelper;
import net.i2p.util.Log;
import org.apache.http.conn.util.InetAddressUtils;
import net.i2p.apache.http.conn.util.InetAddressUtils;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.HandlerWrapper;

View File

@@ -4,5 +4,9 @@
#
# disable browser launch on startup
#routerconsole.browser=/bin/false
# disable browser launch on startup (Windows)
#routerconsole.browser=NUL
# change browser
#routerconsole.browser=firefox
# disable system tray
#desktopgui.enabled=false

View File

@@ -21,6 +21,8 @@
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
<!-- jsp-api.jar only present for debian builds -->
<pathelement location="../../jetty/jettylib/jsp-api.jar" />
<!-- following jars only for standalone builds -->
<pathelement location="../../desktopgui/dist/desktopgui.jar" />
</classpath>
</depend>
</target>
@@ -60,6 +62,7 @@
<pathelement location="../../systray/java/build/systray.jar" />
<pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
<pathelement location="../../jetty/jettylib/jetty-util.jar" />
<pathelement location="../../desktopgui/dist/desktopgui.jar" />
</classpath>
</javac>
</target>
@@ -236,6 +239,7 @@
<zipfileset src="../../streaming/java/build/streaming.jar" />
<zipfileset src="../../systray/java/build/systray.jar" />
<zipfileset src="../../../build/jbigi.jar" />
<zipfileset src="../../desktopgui/dist/desktopgui.jar" />
<!-- Countries translations. The i2psnark translations are in the war but it's easier to put these here -->
<!-- 300KB just to translate "Brazil", but why not... -->
<!--

View File

@@ -30,6 +30,7 @@ import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.RouterRestartException;
import net.i2p.data.Hash;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
@@ -131,12 +132,13 @@ class ConnectionAcceptor implements Runnable
/**
* Effectively unused, would only be called if we changed
* I2CP host/port, which is hidden in the gui if in router context
* FIXME this only works if already running
*/
public synchronized void restart() {
Thread t = thread;
if (t != null)
t.interrupt();
else
startAccepting();
}
public int getPort()
@@ -201,6 +203,24 @@ class ConnectionAcceptor implements Runnable
t.start();
}
}
catch (RouterRestartException rre) {
if (_log.shouldWarn())
_log.warn("Waiting for router restart", rre);
try {
Thread.sleep(2*60*1000);
} catch (InterruptedException ie) {}
while (true) {
if (_util.connected())
break;
if (_util.connect())
break;
try {
Thread.sleep(60*1000);
} catch (InterruptedException ie) { break; }
}
if (_log.shouldWarn())
_log.warn("Router restarted");
}
catch (I2PException ioe)
{
int level = stop ? Log.WARN : Log.ERROR;

View File

@@ -720,8 +720,9 @@ public class MetaInfo
if (infoMap != null)
return Collections.unmodifiableMap(infoMap);
// we should only get here if serving a magnet on a torrent we created
if (_log.shouldLog(Log.WARN))
_log.warn("Creating new infomap", new Exception());
// or on edit torrent save
if (_log.shouldDebug())
_log.debug("Creating new infomap", new Exception());
// otherwise we must create it
Map<String, BEValue> info = new HashMap<String, BEValue>();
info.put("name", new BEValue(DataHelper.getUTF8(name)));

View File

@@ -279,7 +279,6 @@ class PeerCoordinator implements PeerListener
/**
* Bytes not yet in storage. Does NOT account for skipped files.
* Not exact (does not adjust for last piece size).
* Returns how many bytes are still needed to get the complete torrent.
* @return -1 if in magnet mode
*/
@@ -287,8 +286,13 @@ class PeerCoordinator implements PeerListener
{
if (metainfo == null | storage == null)
return -1;
// XXX - Only an approximation.
return ((long) storage.needed()) * metainfo.getPieceLength(0);
int psz = metainfo.getPieceLength(0);
long rv = ((long) storage.needed()) * psz;
int last = metainfo.getPieces() - 1;
BitField bf = storage.getBitField();
if (bf != null && !bf.get(last))
rv -= psz - metainfo.getPieceLength(last);
return rv;
}
/**

View File

@@ -1259,6 +1259,8 @@ public class Snark
*/
private void fatalRouter(String s, Throwable t) throws RouterException {
_log.error(s, t);
if (!_util.getContext().isRouterContext())
System.out.println(s);
stopTorrent(true);
if (completeListener != null)
completeListener.fatal(this, s);

View File

@@ -85,8 +85,8 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
private final Log _log;
private final UIMessages _messages;
private final I2PSnarkUtil _util;
private PeerCoordinatorSet _peerCoordinatorSet;
private ConnectionAcceptor _connectionAcceptor;
private final PeerCoordinatorSet _peerCoordinatorSet;
private final ConnectionAcceptor _connectionAcceptor;
private Thread _monitor;
private volatile boolean _running;
private volatile boolean _stopping;
@@ -271,6 +271,8 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
_log = _context.logManager().getLog(SnarkManager.class);
_messages = new UIMessages(MAX_MESSAGES);
_util = new I2PSnarkUtil(_context, ctxName, this);
_peerCoordinatorSet = new PeerCoordinatorSet();
_connectionAcceptor = new ConnectionAcceptor(_util, _peerCoordinatorSet);
DEFAULT_AUTO_START = !ctx.isRouterContext();
String cfile = ctxName + CONFIG_FILE_SUFFIX;
File configFile = new File(cfile);
@@ -296,8 +298,6 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
if (cmgr != null)
cmgr.register(this);
}
_peerCoordinatorSet = new PeerCoordinatorSet();
_connectionAcceptor = new ConnectionAcceptor(_util, _peerCoordinatorSet);
_monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor", true);
_monitor.start();
// only if default instance
@@ -1718,21 +1718,31 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
String link = linkify(torrent);
if (!dontAutoStart && shouldAutoStart() && running) {
if (!_util.connected()) {
addMessage(_t("Connecting to I2P"));
String msg = _t("Connecting to I2P");
addMessage(msg);
if (!_context.isRouterContext())
System.out.println(msg);
boolean ok = _util.connect();
if (!ok) {
if (_context.isRouterContext())
if (_context.isRouterContext()) {
addMessage(_t("Unable to connect to I2P"));
else
addMessage(_t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
} else {
msg = _t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
addMessage(msg);
System.out.println(msg);
}
// this would rename the torrent to .BAD
//return false;
}
}
torrent.startTorrent();
addMessageNoEscape(_t("Torrent added and started: {0}", link));
if (!_context.isRouterContext())
System.out.println(_t("Torrent added and started: {0}", torrent.getBaseName()));
} else {
addMessageNoEscape(_t("Torrent added: {0}", link));
if (!_context.isRouterContext())
System.out.println(_t("Torrent added: {0}", torrent.getBaseName()));
}
return true;
}
@@ -2554,6 +2564,9 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
// Test if the router is there
// For standalone, this will probe the router every 60 seconds if not connected
boolean oldOK = routerOK;
// standalone, first time only
if (doMagnets && !_context.isRouterContext())
dtgNotify(Log.INFO, _t("Connecting to I2P") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
routerOK = getBWLimit();
if (routerOK) {
autostart = shouldAutoStart();
@@ -2564,17 +2577,29 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
String prop = config.getProperty(PROP_META_RUNNING);
if (prop == null || Boolean.parseBoolean(prop)) {
if (!_util.connected()) {
addMessage(_t("Connecting to I2P"));
String msg = _t("Connecting to I2P");
addMessage(msg);
if (!_context.isRouterContext())
dtgNotify(Log.INFO, msg + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
// getBWLimit() was successful so this should work
boolean ok = _util.connect();
if (!ok) {
if (_context.isRouterContext())
if (_context.isRouterContext()) {
addMessage(_t("Unable to connect to I2P"));
else
addMessage(_t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
} else {
msg = _t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
addMessage(msg);
dtgNotify(Log.ERROR, msg);
}
routerOK = false;
autostart = false;
break;
} else {
if (!_context.isRouterContext()) {
msg = "Connected to I2P at " + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
addMessage(msg);
dtgNotify(Log.INFO, msg);
}
}
}
addMessageNoEscape(_t("Starting up torrent {0}", linkify(snark)));
@@ -2623,10 +2648,13 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
if (ok)
cleanupTorrentStatus();
if (!routerOK) {
if (_context.isRouterContext())
if (_context.isRouterContext()) {
addMessage(_t("Unable to connect to I2P"));
else
addMessage(_t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
} else {
String msg = _t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
addMessage(msg);
dtgNotify(Log.ERROR, msg);
}
}
}
try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
@@ -2646,15 +2674,9 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
return;
if (snark.getDownloaded() > 0) {
addMessageNoEscape(_t("Download finished: {0}", linkify(snark)));
ClientAppManager cmgr = _context.clientAppManager();
if (cmgr != null) {
NotificationService ns = (NotificationService) cmgr.getRegisteredApp("desktopgui");
if (ns != null) {
ns.notify("I2PSnark", null, Log.INFO, _t("I2PSnark"),
_t("Download finished: {0}", snark.getName()),
"/i2psnark/" + linkify(snark));
}
}
dtgNotify(Log.INFO,
_t("Download finished: {0}", snark.getName()),
"/i2psnark/" + linkify(snark));
}
updateStatus(snark);
}
@@ -2745,6 +2767,38 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
// End Snark.CompleteListeners
/**
* Send a notification to the user via desktopgui and,
* if standalone, on the console.
*
* @param priority log level
* @param message translated
* @since 0.9.54
*/
private void dtgNotify(int priority, String message) {
dtgNotify(priority, message, null);
}
/**
* Send a notification to the user via desktopgui and,
* if standalone, on the console.
*
* @param priority log level
* @param message translated
* @param path in console for more information, starting with /, must be URL-escaped, or null
* @since 0.9.54
*/
private void dtgNotify(int priority, String message, String path) {
ClientAppManager cmgr = _context.clientAppManager();
if (cmgr != null) {
NotificationService ns = (NotificationService) cmgr.getRegisteredApp("desktopgui");
if (ns != null)
ns.notify("I2PSnark", null, priority, _t("I2PSnark"), message, path);
}
if (!_context.isRouterContext())
System.out.println(message);
}
/**
* An HTML link to the file if complete and a single file,
* to the directory if not complete or not a single file,

View File

@@ -1,5 +1,6 @@
package org.klomp.snark.standalone;
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
@@ -9,8 +10,10 @@ import org.eclipse.jetty.util.log.Log;
import net.i2p.I2PAppContext;
import net.i2p.apps.systray.UrlLauncher;
import net.i2p.data.DataHelper;
import net.i2p.desktopgui.ExternalMain;
import net.i2p.jetty.I2PLogger;
import net.i2p.jetty.JettyStart;
import net.i2p.util.SystemVersion;
/**
* @since moved from ../web and fixed in 0.9.27
@@ -23,6 +26,7 @@ public class RunStandalone {
private String _host = "127.0.0.1";
private static RunStandalone _instance;
static final File APP_CONFIG_FILE = new File("i2psnark-appctx.config");
private static final String PROP_DTG_ENABLED = "desktopgui.enabled";
private RunStandalone(String args[]) throws Exception {
Properties p = new Properties();
@@ -66,8 +70,10 @@ public class RunStandalone {
public void start() {
try {
_jettyStart.startup();
String url = "http://" + _host + ':' + _port + "/i2psnark/";
System.out.println("Starting i2psnark at " + url);
startTrayApp();
_jettyStart.startup();
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {}
@@ -92,4 +98,39 @@ public class RunStandalone {
} catch (InterruptedException ie) {}
System.exit(1);
}
/**
* @since 0.9.54 adapted from RouterConsoleRunner
*/
private static boolean isSystrayEnabled(I2PAppContext context) {
if (GraphicsEnvironment.isHeadless())
return false;
// default false except on OSX and Windows,
// and on Linux KDE and LXDE.
// Xubuntu XFCE works but doesn't look very good
// Ubuntu Unity was far too buggy to enable
// Ubuntu GNOME does not work, SystemTray.isSupported() returns false
String xdg = System.getenv("XDG_CURRENT_DESKTOP");
boolean dflt = SystemVersion.isWindows() ||
SystemVersion.isMac() ||
//"XFCE".equals(xdg) ||
"KDE".equals(xdg) ||
"LXDE".equals(xdg);
return context.getProperty(PROP_DTG_ENABLED, dflt);
}
/**
* @since 0.9.54 adapted from RouterConsoleRunner
*/
private void startTrayApp() {
try {
if (isSystrayEnabled(_context)) {
System.setProperty("java.awt.headless", "false");
ExternalMain dtg = new ExternalMain(_context, _context.clientAppManager(), null);
dtg.startup();
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}

View File

@@ -320,7 +320,9 @@ public class I2PSnarkServlet extends BasicServlet {
// we want it to go to the base URI so we don't refresh with some funky action= value
int delay = 0;
if (!isConfigure) {
if (isConfigure) {
out.write("<script src=\".resources/js/configui.js?" + CoreVersion.VERSION + "\" type=\"text/javascript\"></script>\n");
} else {
delay = _manager.getRefreshDelaySeconds();
if (delay > 0) {
String jsPfx = _context.isRouterContext() ? "" : ".resources";
@@ -2503,7 +2505,7 @@ public class I2PSnarkServlet extends BasicServlet {
out.write(_t("Theme"));
out.write(":<td colspan=\"2\">");
if (_manager.getUniversalTheming()) {
out.write("<select name='theme' disabled=\"disabled\" title=\"");
out.write("<select id=\"theme\" name=\"theme\" disabled=\"disabled\" title=\"");
out.write(_t("To change themes manually, disable universal theming"));
out.write("\"><option>");
out.write(_manager.getTheme());
@@ -2513,7 +2515,7 @@ public class I2PSnarkServlet extends BasicServlet {
out.write(_t("Configure"));
out.write("]</a>");
} else {
out.write("<select name='theme'>");
out.write("<select id=\"theme\" name=\"theme\">");
String theme = _manager.getTheme();
String[] themes = _manager.getThemes();
// translated sort
@@ -2954,7 +2956,7 @@ public class I2PSnarkServlet extends BasicServlet {
}
private static final String DOCTYPE = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
private static final String HEADER_A = "<link href=\"";
private static final String HEADER_A = "<link id=\"pagestyle\" href=\"";
private static final String HEADER_B = "snark.css?" + CoreVersion.VERSION + "\" rel=\"stylesheet\" type=\"text/css\" >";
private static final String HEADER_C = "nocollapse.css?" + CoreVersion.VERSION + "\" rel=\"stylesheet\" type=\"text/css\" >";

View File

@@ -14,6 +14,10 @@
package org.klomp.snark.web;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
@@ -21,6 +25,9 @@ import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.concurrent.ConcurrentHashMap;
import net.i2p.data.DataHelper;
import net.i2p.util.SystemVersion;
/* ------------------------------------------------------------ */
/**
@@ -47,6 +54,8 @@ class MimeTypes
public MimeTypes() {
_mimeMap = new ConcurrentHashMap<String, String>();
if (!(SystemVersion.isWindows() || SystemVersion.isMac() || SystemVersion.getMaxMemory() < 100*1024*1024L))
loadSystemMimeTypes();
}
/* ------------------------------------------------------------ */
@@ -86,6 +95,37 @@ class MimeTypes
}
}
/**
* Load mime types from /etc/mime.types
* Format: mimetype suffix1 suffix2 ...
*
* @since 0.9.54
*/
private void loadSystemMimeTypes() {
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(new FileInputStream("/etc/mime.types"), "ISO-8859-1"));
while (true) {
String line = in.readLine();
if (line == null)
break;
if (line.startsWith("#"))
continue;
String[] s = DataHelper.split(line, "[ \t]+", 16);
if (s.length < 2)
continue;
for (int i = 1; i < s.length; i++) {
_mimeMap.put(s[i].toLowerCase(Locale.US), s[0]);
//System.out.println("Mapping: '" + s[i] + "' -> '" + s[0] + "'");
}
}
//System.out.println("Loaded " + _mimeMap.size() + " mime types from /etc/mime.types");
} catch (IOException ioe) {
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {}
}
}
/* ------------------------------------------------------------ */
/** Get the MIME type by filename extension.
*

View File

@@ -8,6 +8,9 @@
# Raise the soft open files soft ulimit to this value, if able
OPEN_FILES_ULIMIT=2048
# Increase memory to 512 MB
JAVA_OPTS='-Xmx512m'
raiseopenfilesulimit() {
OPEN_FILES_SOFT=`ulimit -S -n` 2> /dev/null || return
if [ "$OPEN_FILES_SOFT" != "unlimited" ]
@@ -33,4 +36,4 @@ raiseopenfilesulimit() {
raiseopenfilesulimit
I2P="."
java -jar "$I2P/i2psnark.jar"
java $JAVA_OPTS -jar "$I2P/i2psnark.jar"

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: A5h8d0wf0x <littleslyfoxie28@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: A5h8d0wf0x <littleslyfoxie28@gmail.com>, 2014\n"
"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1128,7 +1128,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
msgid "Completed"
msgstr ""
msgstr "Dokončeno"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1929
msgid "Stop the torrent"

View File

@@ -11,6 +11,7 @@
# D.A. Loader, 2012
# ducki2p <ducki2p@gmail.com>, 2011
# Ettore Atalan <atalanttore@googlemail.com>, 2014,2017
# Fabian Schuler, 2022
# foo <foo@bar>, 2009
# SteinQuadrat, 2013
# Lars Schimmer <echelon@i2pmail.org>, 2014-2016,2018,2020-2021
@@ -25,8 +26,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: ducki2p <ducki2p@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Fabian Schuler, 2022\n"
"Language-Team: German (http://www.transifex.com/otf/I2P/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -56,7 +57,7 @@ msgstr "Magnet"
#: ../java/src/org/klomp/snark/SnarkManager.java:2572
#: ../java/src/org/klomp/snark/SnarkManager.java:2627
msgid "Unable to connect to I2P"
msgstr ""
msgstr "Verbindung zu I2P nicht möglich"
#: ../java/src/org/klomp/snark/Snark.java:597
#: ../java/src/org/klomp/snark/SnarkManager.java:1727
@@ -1546,7 +1547,7 @@ msgstr[1] "{0} Tunnel"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3121
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3428
msgid "Edit Torrent"
msgstr ""
msgstr "Torrent bearbeiten"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3131
msgid "Torrent file"
@@ -1641,7 +1642,7 @@ msgstr "Überprüfung forcieren"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4205
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4544
msgid "Torrent must be stopped"
msgstr ""
msgstr "Torrent muss beendet werden"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3425
msgid "Check integrity of the downloaded files"
@@ -1649,7 +1650,7 @@ msgstr "Integrität der heruntergeladenen Dateien überprüfen."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3434
msgid "Add or remove trackers"
msgstr ""
msgstr "Tracker hinzufügen oder entfernen"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3444
msgid "Download files in order"
@@ -1821,7 +1822,7 @@ msgstr "Tracker"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4273
msgid "Add Tracker"
msgstr ""
msgstr "Tracker hinzufügen"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
msgid "Save Changes"

View File

@@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: Alex <hestia@riseup.net>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: LaScapigliata <ditri2000@hotmail.com>, 2015\n"
"Language-Team: Greek (http://www.transifex.com/otf/I2P/language/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1598,7 +1598,7 @@ msgstr "Υπόλοιπα"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
msgid "Skipped"
msgstr ""
msgstr "Παρελήφθη"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
msgid "Files"

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: Martus Translations <translations@martus.org>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Reza Ghasemi, 2019\n"
"Language-Team: Persian (http://www.transifex.com/otf/I2P/language/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1114,7 +1114,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
msgid "Completed"
msgstr ""
msgstr "تکمیل شد"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1929
msgid "Stop the torrent"

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: outolumo <outolumo@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: outolumo <outolumo@gmail.com>, 2016\n"
"Language-Team: Finnish (http://www.transifex.com/otf/I2P/language/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1795,7 +1795,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4165
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4251
msgid "Mark for deletion"
msgstr ""
msgstr "Merkitse poistettavaksi"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4178
msgid "Delete Selected"
@@ -1811,4 +1811,4 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
msgid "Save Changes"
msgstr ""
msgstr "Tallenna muutokset"

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>, 2017\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/otf/I2P/language/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -804,7 +804,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:916
msgid "First"
msgstr ""
msgstr "Først"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:916
msgid "First page"
@@ -828,7 +828,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
msgid "Last"
msgstr ""
msgstr "Sist"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
msgid "Last page"
@@ -1092,7 +1092,7 @@ msgstr "Torrentdetaljer"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4036
msgid "Comments"
msgstr ""
msgstr "Kommentarer"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1863
msgid "View files"
@@ -1599,7 +1599,7 @@ msgstr "Gjennstår"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
msgid "Skipped"
msgstr ""
msgstr "Hoppet over"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
msgid "Files"
@@ -1777,7 +1777,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4087
msgid "Add Comment"
msgstr ""
msgstr "Legg til kommentar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4099
msgid "My Rating"
@@ -1811,4 +1811,4 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
msgid "Save Changes"
msgstr ""
msgstr "Lagre endringer"

View File

@@ -20,8 +20,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: hxdcmls\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Manuela Silva <mmsrs@sky.com>, 2017-2018\n"
"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -247,11 +247,11 @@ msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1326
msgid "Enabled Comments."
msgstr ""
msgstr "Comentário Ativado."
#: ../java/src/org/klomp/snark/SnarkManager.java:1328
msgid "Disabled Comments."
msgstr ""
msgstr "Comentário Desativado."
#: ../java/src/org/klomp/snark/SnarkManager.java:1341
#, java-format
@@ -1123,7 +1123,7 @@ msgstr "restantes"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
msgid "Completed"
msgstr ""
msgstr "Completado"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1929
msgid "Stop the torrent"
@@ -1608,7 +1608,7 @@ msgstr "Restantes"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
msgid "Skipped"
msgstr ""
msgstr "Ignorado"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
msgid "Files"
@@ -1786,7 +1786,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4087
msgid "Add Comment"
msgstr ""
msgstr "Adicionar Comentário"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4099
msgid "My Rating"

View File

@@ -6,14 +6,14 @@
# Translators:
# testsubject67 <deborinha97@hotmail.com>, 2014
# Eduardo Rodrigues, 2020
# blueboy, 2015-2016
# L., 2015-2016
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: blueboy\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Eduardo Rodrigues, 2020\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,7 +23,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/IdleChecker.java:76
msgid "No more torrents running."
msgstr ""
msgstr "Sem mais torrents em execução."
#: ../java/src/org/klomp/snark/IdleChecker.java:77
#: ../java/src/org/klomp/snark/SnarkManager.java:3149
@@ -35,7 +35,7 @@ msgstr "Túnel I2P fechado"
#: ../java/src/org/klomp/snark/MagnetURI.java:60
#: ../java/src/org/klomp/snark/SnarkManager.java:2788
msgid "Magnet"
msgstr ""
msgstr "magnet"
#: ../java/src/org/klomp/snark/Snark.java:595
#: ../java/src/org/klomp/snark/SnarkManager.java:355
@@ -67,7 +67,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:146
msgid "vanilla"
msgstr ""
msgstr "vanilla"
#: ../java/src/org/klomp/snark/SnarkManager.java:997
#: ../java/src/org/klomp/snark/SnarkManager.java:1151
@@ -77,14 +77,14 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
msgid "No write permissions for data directory"
msgstr ""
msgstr "Sem permissões de gravação para a diretoria de dados"
#: ../java/src/org/klomp/snark/SnarkManager.java:1000
#: ../java/src/org/klomp/snark/SnarkManager.java:1144
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:735
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
msgid "Data directory cannot be created"
msgstr ""
msgstr "Não é possível criar a diretoria de dados"
#: ../java/src/org/klomp/snark/SnarkManager.java:1062
#, java-format
@@ -114,33 +114,33 @@ msgstr "Atraso de inicialização alterada para {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1101
#, java-format
msgid "Refresh time changed to {0}"
msgstr ""
msgstr "Tempo de actualização alterado para {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1103
msgid "Refresh disabled"
msgstr ""
msgstr "Actualização desactivada"
#: ../java/src/org/klomp/snark/SnarkManager.java:1119
#, java-format
msgid "Page size changed to {0}"
msgstr ""
msgstr "Tamanho de pagina alterado para {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1129
msgid "New files will be publicly readable"
msgstr ""
msgstr "Novos ficheiros serão lidos pelo publico"
#: ../java/src/org/klomp/snark/SnarkManager.java:1131
msgid "New files will not be publicly readable"
msgstr ""
msgstr "Novos ficheiros não serão lidos pelo publico"
#: ../java/src/org/klomp/snark/SnarkManager.java:1139
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1050
msgid "Data directory must be an absolute path"
msgstr ""
msgstr "Diretório de dados deve ter um caminho absoluto"
#: ../java/src/org/klomp/snark/SnarkManager.java:1143
msgid "Data directory does not exist"
msgstr ""
msgstr "Diretório de dados não existe"
#: ../java/src/org/klomp/snark/SnarkManager.java:1146
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:737
@@ -155,7 +155,7 @@ msgstr "Não legível"
#: ../java/src/org/klomp/snark/SnarkManager.java:1155
#, java-format
msgid "Data directory changed to {0}"
msgstr ""
msgstr "Diretório de dados alterado para {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1236
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
@@ -164,7 +164,7 @@ msgstr "Alterações em túneis e I2C entrarão em vigor depois de parar todos t
#: ../java/src/org/klomp/snark/SnarkManager.java:1240
#, java-format
msgid "I2CP options changed to {0}"
msgstr ""
msgstr "opções de I2cp alteradas para {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1246
msgid "Disconnecting old I2CP destination"
@@ -219,15 +219,15 @@ msgstr "Trackers abertos não permitidos - reinício de torrents é preciso para
#: ../java/src/org/klomp/snark/SnarkManager.java:1306
msgid "Enabled DHT."
msgstr ""
msgstr "Habilitar DHT."
#: ../java/src/org/klomp/snark/SnarkManager.java:1308
msgid "Disabled DHT."
msgstr ""
msgstr "Desabilitar DHT."
#: ../java/src/org/klomp/snark/SnarkManager.java:1310
msgid "DHT change requires tunnel shutdown and reopen"
msgstr ""
msgstr "Mudança no DHT requer fechamento e reabertura do túnel"
#: ../java/src/org/klomp/snark/SnarkManager.java:1317
msgid "Enabled Ratings."
@@ -273,7 +273,7 @@ msgstr "Lista de trackers abertos alterada - reinício de torrents é preciso pa
#: ../java/src/org/klomp/snark/SnarkManager.java:1409
msgid "Private tracker list changed - affects newly created torrents only."
msgstr ""
msgstr "Lista de rastreadores privados alterada - somente afetará os novos torrentes criados."
#: ../java/src/org/klomp/snark/SnarkManager.java:1455
#, java-format
@@ -307,7 +307,7 @@ msgstr "Erro: não é possível adicionar o torrent {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
#, java-format
msgid "Torrent already running: {0}"
msgstr ""
msgstr "torrente já em marcha: {0}"
#. catch this here so we don't try do delete it below
#: ../java/src/org/klomp/snark/SnarkManager.java:1624
@@ -335,21 +335,21 @@ msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1655
#, java-format
msgid "ERROR - No I2P trackers in private torrent \"{0}\""
msgstr ""
msgstr "ERRO - Não há tracker I2P no torrent privado \"{0}\""
#: ../java/src/org/klomp/snark/SnarkManager.java:1657
#, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and"
" DHT only."
msgstr ""
msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", o anúncio será feito apenas por rastreadores I2P abertos e DHT."
#: ../java/src/org/klomp/snark/SnarkManager.java:1660
#, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
"announce to DHT only."
msgstr ""
msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", e rastreadores I2P abertos estão desabilitados. O anúncio será feito apenas por DHT."
#: ../java/src/org/klomp/snark/SnarkManager.java:1662
#, java-format
@@ -357,7 +357,7 @@ msgid ""
"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
"disabled, you should enable open trackers or DHT before starting the "
"torrent."
msgstr ""
msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", e DHT e rastreadores abertos estão desabilitados. Rastreadores abertos ou DHT devem ser habilitados antes de começar o torrente."
#: ../java/src/org/klomp/snark/SnarkManager.java:1688
#, java-format
@@ -369,7 +369,7 @@ msgstr "O torrent em \"{0}\" é inválido"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1148
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
msgstr ""
msgstr "ERRO - Não ha espaço suficente, não se pode crear um torrente desde {0}."
#: ../java/src/org/klomp/snark/SnarkManager.java:1721
#: ../java/src/org/klomp/snark/SnarkManager.java:2567
@@ -398,7 +398,7 @@ msgid ""
"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
"succeed until you start another torrent, enable open trackers, or enable "
"DHT."
msgstr ""
msgstr "Rastreadores abertos estão desabilitados e não há participantes DHT. Descarregamento de {0} pode não prosseguir enquanto outra torrente não for iniciada, rastreadores abertos forem habilitados ou DHT habilitado."
#: ../java/src/org/klomp/snark/SnarkManager.java:1823
#, java-format
@@ -408,7 +408,7 @@ msgstr "Adicionando {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1856
#, java-format
msgid "Download already running: {0}"
msgstr ""
msgstr "arquivo já descarregando: {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1906
#: ../java/src/org/klomp/snark/SnarkManager.java:1916
@@ -496,7 +496,7 @@ msgstr "Iniciando torrent {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:2617
#, java-format
msgid "Up bandwidth limit is {0} KBps"
msgstr ""
msgstr "Limite de transmissão de dados é {0} KBps"
#: ../java/src/org/klomp/snark/SnarkManager.java:2648
#: ../java/src/org/klomp/snark/SnarkManager.java:2654
@@ -515,12 +515,12 @@ msgstr "I2PSnar"
#: ../java/src/org/klomp/snark/SnarkManager.java:2729
#, java-format
msgid "Error on torrent {0}"
msgstr ""
msgstr "Erro no torrente {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:3022
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130
msgid "Opening the I2P tunnel"
msgstr ""
msgstr "Abrindo o túnel I2P"
#: ../java/src/org/klomp/snark/SnarkManager.java:3042
msgid "Opening the I2P tunnel and starting all torrents."
@@ -532,7 +532,7 @@ msgstr "Parando todos os torrents e fechando o túnel I2P"
#: ../java/src/org/klomp/snark/SnarkManager.java:3134
msgid "Closing I2P tunnel after notifying trackers."
msgstr ""
msgstr "Fechando túnel I2P após notificar os rastreadores."
#: ../java/src/org/klomp/snark/SnarkManager.java:3204
#, java-format
@@ -552,7 +552,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/TrackerClient.java:245
#, java-format
msgid "No valid trackers for {0} - enable opentrackers or DHT?"
msgstr ""
msgstr "Nenhum rastreador válido para {0} - habilitar rastreadores abertos ou DHT?"
#: ../java/src/org/klomp/snark/UpdateHandler.java:49
#: ../java/src/org/klomp/snark/UpdateRunner.java:233
@@ -567,30 +567,30 @@ msgstr "Atualizando a partir de {0}"
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:80
#, java-format
msgid "Download torrent file from {0}"
msgstr ""
msgstr "Descarregando arquivo torrente de {0}"
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:103
#, java-format
msgid "Torrent was not retrieved from {0}"
msgstr ""
msgstr "Não se pode obter torrente de {0}"
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:157
#, java-format
msgid "Torrent fetched from {0}"
msgstr ""
msgstr "torrente obtido de {0}"
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1133
#, java-format
msgid "Torrent already in the queue: {0}"
msgstr ""
msgstr "torrente já na cola: {0}"
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1146
#, java-format
msgid "Torrent at {0} was not valid"
msgstr ""
msgstr "torrente em {0} não foi válido"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2436
@@ -615,7 +615,7 @@ msgstr "O roteador está fora do ar"
msgid ""
"Are you sure you want to delete the file \\''{0}\\'' (downloaded data will "
"not be deleted) ?"
msgstr ""
msgstr "Tem a certeza que deseja apagar o ficheiro \\\"{0}\\\" (dados transferidos não serão apagados) ?"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
#, java-format
@@ -634,11 +634,11 @@ msgstr "Recarregar página"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:384
msgid "Click \"Add torrent\" button to fetch torrent"
msgstr ""
msgstr "Clique no botão \"Adicionar torrent\" para obter o torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:448
msgid "clear messages"
msgstr ""
msgstr "limpar mensagens"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
msgid "Status"
@@ -724,7 +724,7 @@ msgstr "Uploaded"
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647
msgid "RX Rate"
msgstr ""
msgstr "Taxa de recepção"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:649
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:650
@@ -734,7 +734,7 @@ msgstr "Taxa de down"
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:662
msgid "TX Rate"
msgstr ""
msgstr "Taxa de transmissão"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:664
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
@@ -751,7 +751,7 @@ msgstr "Parar todos"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:694
msgid "Start all stopped torrents"
msgstr ""
msgstr "Iniciar todos os torrents interrompidos"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:696
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:710
@@ -809,7 +809,7 @@ msgstr "Primeiro"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:916
msgid "First page"
msgstr ""
msgstr "Primeira página"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:926
msgid "Prev"
@@ -817,7 +817,7 @@ msgstr "Anterior"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:926
msgid "Previous page"
msgstr ""
msgstr "Página anterior"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
msgid "Next"
@@ -825,7 +825,7 @@ msgstr "Próximo"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
msgid "Next page"
msgstr ""
msgstr "Próxima página"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
msgid "Last"
@@ -833,7 +833,7 @@ msgstr "Último"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
msgid "Last page"
msgstr ""
msgstr "Última página"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376
@@ -867,7 +867,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
#, java-format
msgid "Download deleted: {0}"
msgstr ""
msgstr "Download excluído: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254
#, java-format
@@ -883,12 +883,12 @@ msgstr "Não foi possível apagar o arquivo de data: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1283
#, java-format
msgid "Directory could not be deleted: {0}"
msgstr ""
msgstr "Pasta não pôde ser excluída: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
#, java-format
msgid "Directory deleted: {0}"
msgstr ""
msgstr "Pasta excluída: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1355
#, java-format
@@ -912,11 +912,11 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1407
msgid "Error - Cannot include alternate trackers without a primary tracker"
msgstr ""
msgstr "Erro - Impossível incluir rastreadores alternativos sem o rastreador primário"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
msgid "Error - Cannot mix private and public trackers in a torrent"
msgstr ""
msgstr "Erro - Impossível misturar rastreadores públicos e privados num torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442
#, java-format
@@ -947,12 +947,12 @@ msgstr "Erro ao criar torrent - é preciso entrar com um arquivo ou diretório"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798
msgid "Delete selected"
msgstr ""
msgstr "Apagar selecionados"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2800
msgid "Save tracker configuration"
msgstr ""
msgstr "Salvar configurações do rastreador"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1508
msgid "Removed"
@@ -963,35 +963,35 @@ msgstr "Removido"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2799
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4279
msgid "Add tracker"
msgstr ""
msgstr "Adicionar tracker"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566
msgid "Enter valid tracker name and URLs"
msgstr ""
msgstr "Insira um nome válido para o tracker e URLs"
#. "<input type=\"reset\" class=\"cancel\"
#. value=\"").append(_t("Cancel")).append("\">\n" +
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1568
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2802
msgid "Restore defaults"
msgstr ""
msgstr "Voltar ao padrão"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571
msgid "Restored default trackers"
msgstr ""
msgstr "Voltar aos rastreadores padrão"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3404
msgid "Checking"
msgstr ""
msgstr "Verificando"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1688
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3411
msgid "Allocating"
msgstr ""
msgstr "Reservando espaço"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704
msgid "Tracker Error"
@@ -1105,12 +1105,12 @@ msgstr "Abrir arquivo"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1883
msgid "complete"
msgstr ""
msgstr "completo"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1883
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3691
msgid "remaining"
msgstr ""
msgstr "restantes"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
@@ -1249,7 +1249,7 @@ msgstr "Criar torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2359
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728
msgid "Trackers"
msgstr ""
msgstr "Rastreadores"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361
msgid "Primary"
@@ -1257,7 +1257,7 @@ msgstr "Primária"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2363
msgid "Alternates"
msgstr ""
msgstr "Alternativos"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2365
msgid "Tracker Type"
@@ -1293,7 +1293,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448
msgid "Files readable by all"
msgstr ""
msgstr "Ficheiro legível por todos"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2452
msgid ""
@@ -1357,7 +1357,7 @@ msgstr "Configurar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2536
msgid "Refresh time"
msgstr ""
msgstr "Tempo de actualização"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2539
msgid "How frequently torrent status is updated on the main page"
@@ -1413,15 +1413,15 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2614
msgid "Half available bandwidth recommended."
msgstr ""
msgstr "Se recomenda a metade da largura de banda disponível."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2617
msgid "View or change router bandwidth"
msgstr ""
msgstr "mostrar e mudar as preferências da largura de banda do roteador"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2623
msgid "Use open trackers also"
msgstr ""
msgstr "usar também rastreadores abertos"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2627
msgid ""
@@ -1431,7 +1431,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2631
msgid "Enable DHT"
msgstr ""
msgstr "Habilitar DHT"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2635
msgid "Use DHT to find additional peers"
@@ -1463,11 +1463,11 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2672
msgid "Inbound Settings"
msgstr ""
msgstr "Preferências de entrada"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2679
msgid "Outbound Settings"
msgstr ""
msgstr "Preferências de saida"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2688
msgid "I2CP host"
@@ -1483,7 +1483,7 @@ msgstr "opções I2CP"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713
msgid "Save configuration"
msgstr ""
msgstr "Guardar configuração"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2731
msgid "Select trackers for removal from I2PSnark's known list"
@@ -1496,11 +1496,11 @@ msgstr "Nome"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736
msgid "Website URL"
msgstr ""
msgstr "URL do Website"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2744
msgid "Announce URL"
msgstr ""
msgstr "URL para anúncio"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2756
msgid "Mark tracker for deletion"
@@ -1513,7 +1513,7 @@ msgstr "Adicionar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2835
#, java-format
msgid "Invalid magnet URL {0}"
msgstr ""
msgstr "URL magnet {0} não válida"
#. * dummies for translation
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2843
@@ -1537,7 +1537,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3131
msgid "Torrent file"
msgstr ""
msgstr "Arquivo torrente"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139
msgid "Data location"
@@ -1549,11 +1549,11 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3170
msgid "Primary Tracker"
msgstr ""
msgstr "Rastreador Primário"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3189
msgid "Tracker List"
msgstr ""
msgstr "Lista de Rastreadores"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3215
msgid "Web Seeds"
@@ -1571,7 +1571,7 @@ msgstr "Criada"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3258
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4307
msgid "Created By"
msgstr ""
msgstr "Criado por"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3268
msgid "Added"
@@ -1583,15 +1583,15 @@ msgstr "Última atividade"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3302
msgid "Magnet link"
msgstr ""
msgstr "URL magnet"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3317
msgid "Private torrent"
msgstr ""
msgstr "Torrente privado"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3331
msgid "Completion"
msgstr ""
msgstr "Finalização"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3366
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3604
@@ -1608,11 +1608,11 @@ msgstr "Arquivos"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3389
msgid "Pieces"
msgstr ""
msgstr "Peças"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3394
msgid "Piece size"
msgstr ""
msgstr "Tamanho das peças"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407
msgid "Refresh page for results"
@@ -1683,7 +1683,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3626
msgid "Up to higher level directory"
msgstr ""
msgstr "Subir uma herarquia"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3637
msgid "Audio Playlist"
@@ -1691,11 +1691,11 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3669
msgid "Torrent not found?"
msgstr ""
msgstr "Não achei o arquivo torrente?"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3675
msgid "File not found in torrent?"
msgstr ""
msgstr "Arquivo não achado no torrente?"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3717
msgid "Preview"
@@ -1739,7 +1739,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3806
msgid "Save priorities"
msgstr ""
msgstr "Guardar prioridades"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4020
msgid "Ratings and Comments"
@@ -1804,7 +1804,7 @@ msgstr "Apagar selecionado"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4238
msgid "Tracker"
msgstr ""
msgstr "Rastreador"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4273
msgid "Add Tracker"

View File

@@ -32,8 +32,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: Irina Fedulova <istartlin@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: ValdikSS <iam@valdikss.org.ru>, 2017-2021\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/otf/I2P/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1852,4 +1852,4 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
msgid "Save Changes"
msgstr ""
msgstr "Сохранить изменения"

View File

@@ -24,8 +24,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: efef6ec5b435a041fce803c7f8af77d2_2341d43\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>, 2017,2021-2022\n"
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1591,7 +1591,7 @@ msgstr "Tillagd"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3288
msgid "Last activity"
msgstr ""
msgstr "Senaste aktivitet"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3302
msgid "Magnet link"
@@ -1824,4 +1824,4 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
msgid "Save Changes"
msgstr ""
msgstr "Spara ändringar"

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-10 06:32+0000\n"
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>, 2015-2022\n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1474,7 +1474,7 @@ msgstr "I2CP sunucusu"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2693
msgid "I2CP port"
msgstr "I2CP kapı numarası"
msgstr "I2CP bağlantı noktası"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2708
msgid "I2CP options"

View File

@@ -14,8 +14,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
"Last-Translator: madjong <madjong@i2pmail.org>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Greg Koval <gregjsmith@gmx.com>, 2020\n"
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1109,7 +1109,7 @@ msgstr "Деталі торрента"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4036
msgid "Comments"
msgstr ""
msgstr "Коментарі"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1863
msgid "View files"
@@ -1269,7 +1269,7 @@ msgstr "Трекери"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361
msgid "Primary"
msgstr ""
msgstr "Основний"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2363
msgid "Alternates"
@@ -1512,7 +1512,7 @@ msgstr "Назва"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736
msgid "Website URL"
msgstr ""
msgstr "URL-адреса сайту"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2744
msgid "Announce URL"
@@ -1599,7 +1599,7 @@ msgstr "Додано"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3288
msgid "Last activity"
msgstr ""
msgstr "Остання активність"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3302
msgid "Magnet link"
@@ -1620,7 +1620,7 @@ msgstr "Залишилось"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
msgid "Skipped"
msgstr ""
msgstr "Пропущено"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
msgid "Files"
@@ -1678,7 +1678,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3463
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3481
msgid "Resource"
msgstr ""
msgstr "Джерело"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3464
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3482
@@ -1800,7 +1800,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4087
msgid "Add Comment"
msgstr ""
msgstr "Додати Коментар"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4099
msgid "My Rating"

View File

@@ -6,6 +6,7 @@
# Translators:
# ducki2p <ducki2p@gmail.com>, 2011
# foo <foo@bar>, 2009
# Fosworn D4, 2022
# Scott Rhodes <starring169@gmail.com>, 2020-2022
# Tommy Lmath <l5h5t7@qq.com>, 2016
# walking <waling@mail.i2p>, 2013
@@ -16,8 +17,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
"PO-Revision-Date: 2022-02-10 03:00+0000\n"
"Last-Translator: Scott Rhodes <starring169@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
"Last-Translator: Fosworn D4, 2022\n"
"Language-Team: Chinese (China) (http://www.transifex.com/otf/I2P/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -81,7 +82,7 @@ msgstr "香草白"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
msgid "No write permissions for data directory"
msgstr ""
msgstr "没有对数据文件夹的写入权限。"
#: ../java/src/org/klomp/snark/SnarkManager.java:1000
#: ../java/src/org/klomp/snark/SnarkManager.java:1144
@@ -252,20 +253,20 @@ msgstr "已禁用评论。"
#: ../java/src/org/klomp/snark/SnarkManager.java:1341
#, java-format
msgid "Comments name set to {0}."
msgstr ""
msgstr "评论名设置为{0}。"
#: ../java/src/org/klomp/snark/SnarkManager.java:1348
#, java-format
msgid "{0} theme loaded."
msgstr ""
msgstr "{0}主题已加载。"
#: ../java/src/org/klomp/snark/SnarkManager.java:1355
msgid "Collapsible panels enabled."
msgstr ""
msgstr "可折叠面板已启用。"
#: ../java/src/org/klomp/snark/SnarkManager.java:1357
msgid "Collapsible panels disabled."
msgstr ""
msgstr "可折叠面板已禁用。"
#: ../java/src/org/klomp/snark/SnarkManager.java:1367
msgid "Configuration unchanged."
@@ -334,7 +335,7 @@ msgstr "具有相同Hash链接的种子已在下载中:{0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1896
#, java-format
msgid "Torrent with the same data location is already running: {0}"
msgstr ""
msgstr "具有相同数据地址的种子已在下载中:{0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1655
#, java-format
@@ -846,12 +847,12 @@ msgstr "无法添加内含另一个种子的种子 {0}{1}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082
#, java-format
msgid "Download from non-I2P location {0} is not supported"
msgstr ""
msgstr "不支持从非 I2P 地址{0}下载"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153
#, java-format
msgid "Invalid URL: Must start with \"{0}\" or \"{1}\""
msgstr ""
msgstr "无效的 URL必须以“{0}”或“{1}”开头。"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1230
@@ -863,7 +864,7 @@ msgstr "Magnet 已删除:{0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243
#, java-format
msgid "Torrent file could not be deleted: {0}"
msgstr ""
msgstr "无法删除种子文件:{0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
#, java-format
@@ -1024,7 +1025,7 @@ msgstr "正做种"
#, java-format
msgid "Seeding to {0} peer"
msgid_plural "Seeding to {0} peers"
msgstr[0] ""
msgstr[0] "正在与用户{0}做种"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1731
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747
@@ -1050,13 +1051,13 @@ msgstr "正常"
#, java-format
msgid "Downloading from {0} peer"
msgid_plural "Downloading from {0} peers"
msgstr[0] ""
msgstr[0] "正在从节点{0}下载"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1763
#, java-format
msgid "Connected to {0} peer"
msgid_plural "Connected to {0} peers"
msgstr[0] ""
msgstr[0] "已连接到节点{0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1763
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
@@ -1142,7 +1143,7 @@ msgstr "移除"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1978
msgid "Delete the .torrent file and the associated data files"
msgstr ""
msgstr "删除种子及所下载的文件"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1982
msgid "Delete"
@@ -1150,7 +1151,7 @@ msgstr "删除"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1998
msgid "Peer attached to swarm"
msgstr ""
msgstr "附属于集群的节点"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2028
msgid "Unknown"
@@ -1200,7 +1201,7 @@ msgstr "从URL"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315
msgid ""
"Enter the torrent file download URL (I2P only), magnet link, or info hash"
msgstr ""
msgstr "输入种子文件的下载链接(仅支持 I2P magnet 链接,或信息散列值"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2320
msgid "Add torrent"
@@ -1286,7 +1287,7 @@ msgstr "数据文件夹"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2443
msgid "Directory where torrents and downloaded/shared files are stored"
msgstr ""
msgstr " 种子和下载/分享的文件存储目录"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448
msgid "Files readable by all"
@@ -1296,7 +1297,7 @@ msgstr "文件对所有人可读"
msgid ""
"Set file permissions to allow other local users to access the downloaded "
"files"
msgstr ""
msgstr "给其他本地用户设置文件权限使其能够访问已下载文件"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2456
msgid "Auto start torrents"
@@ -1306,7 +1307,7 @@ msgstr "自动开始种子"
msgid ""
"Automatically start torrents when added and restart torrents when I2PSnark "
"starts"
msgstr ""
msgstr "当种子被添加时自动启动并且在 I2PSnark 启动时自动重启种子"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2464
msgid "Smart torrent sorting"
@@ -1314,21 +1315,21 @@ msgstr "智能种子排序"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2468
msgid "Ignore words such as 'a' and 'the' when sorting"
msgstr ""
msgstr "排序时忽略诸如 athe 的单词"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472
msgid "Collapsible panels"
msgstr ""
msgstr "可折叠面板"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2477
msgid "Your browser does not support this feature."
msgstr ""
msgstr "您的浏览器不支持这个功能。"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2480
msgid ""
"Allow the 'Add Torrent' and 'Create Torrent' panels to be collapsed, and "
"collapse by default in non-embedded mode"
msgstr ""
msgstr "允许‘添加种子’和‘创建种子’面板被折叠,并且在非嵌入模式下默认折叠。"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2492
msgid "Language"
@@ -1340,11 +1341,11 @@ msgstr "主题"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2507
msgid "To change themes manually, disable universal theming"
msgstr ""
msgstr "要手动更改主题,请禁用通用主题"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2511
msgid "Universal theming is enabled."
msgstr ""
msgstr "通用主题已开启。"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2513
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2619

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
To run i2psnark's standalone mode make sure you have an i2p router running in the background, then run:
java -jar i2psnark.jar
launch-i2psnark
or
launch-i2psnark.bat (Windows)
I2PSnark web ui will be at http://127.0.0.1:8002/i2psnark/

View File

@@ -0,0 +1,35 @@
/* @license http://creativecommons.org/publicdomain/zero/1.0/legalcode CC0-1.0 */
// This component is dedicated to the public domain. It uses the CC0
// as a formal dedication to the public domain and in circumstances where
// a public domain is not usable.
var oldTheme = "ubergine";
var change = false;
function swapStyleSheet(theme) {
// https://stackoverflow.com/questions/14292997/changing-style-sheet-javascript
document.getElementById("pagestyle").setAttribute("href", "/i2psnark/.resources/themes/" + theme + "/snark.css");
}
function initThemeSwitcher() {
var theme = document.getElementById("theme");
if (theme == null) {
return;
}
oldtheme = theme.value;
theme.onclick = function() {
if (change) {
swapStyleSheet(theme.value);
} else {
// skip the first click to avoid the flash
change = true;
}
}
}
document.addEventListener("DOMContentLoaded", function() {
initThemeSwitcher();
}, true);
/* @license-end */

View File

@@ -2264,7 +2264,7 @@ hr.debug:last-child {
}
.accept {
background: url(/i2psnark/.resources/icons/solid/yes.png) left 6px center no-repeat !important;
background: url(/i2psnark/.resources/icons/solid/tick.png) left 6px center no-repeat !important;
background-size: 12px 12px !important;
}

View File

@@ -1968,7 +1968,7 @@ hr.debug:last-child {
}
.accept {
background: url(/i2psnark/.resources/icons/solid/yes.png) left 6px center no-repeat;
background: url(/i2psnark/.resources/icons/solid/tick.png) left 6px center no-repeat;
background-size: 12px 12px;
}

View File

@@ -38,6 +38,7 @@ import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.i2ptunnel.localServer.LocalHTTPServer;
import net.i2p.util.ConvertToHash;
import net.i2p.util.DNSOverHTTPS;
import net.i2p.util.EventDispatcher;
import net.i2p.util.Log;
import net.i2p.util.PortMapper;
@@ -92,7 +93,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
"\r\n";
// ESR version of Firefox, same as Tor Browser
private static final String UA_CLEARNET = "User-Agent: " +
"Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0" +
DNSOverHTTPS.UA_CLEARNET +
"\r\n";
// overrides
private static final String PROP_UA_I2P = "httpclient.userAgent.i2p";

View File

@@ -233,7 +233,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
try {
_filter = FilterFactory.createFilter(context, filterDefinition);
} catch (IOException | InvalidDefinitionException bad) {
throw new IllegalArgumentException("Can't create socket manager "+bad.getMessage(), bad);
throw new IllegalArgumentException("Bad filter definition file: " + bad.getMessage(), bad);
}
}
@@ -667,6 +667,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
} catch (InterruptedException ie) {}
// This should be the same as before, but we have to call getServerSocket()
// so sockMgr will call ConnectionManager.setAllowIncomingConnections(true) again
_log.logAlways(Log.WARN, "Reconnecting to router after restart");
i2pss = sockMgr.getServerSocket();
} catch (I2PException ipe) {
String s = "Error accepting - KILLING THE TUNNEL SERVER";

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>, 2017\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/otf/I2P/language/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -588,7 +588,7 @@ msgstr "Opprett"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
msgid "Encryption key"
msgstr ""
msgstr "Krypteringsnøkkel"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
msgid ""

View File

@@ -8,7 +8,7 @@
# kgtm <fabio.h.f.antunes@gmail.com>, 2014
# hxdcmls, 2013
# hxdcmls, 2013
# Manuela Silva <manuelarodsilva@gmail.com>, 2017
# Manuela Silva <mmsrs@sky.com>, 2017
# rafaelbf, 2013
# tuliouel, 2013
# wicked, 2012
@@ -17,8 +17,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
"Last-Translator: e8f1a29f7bd45d2490d729ad149fc504_6eadd8e\n"
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
"Last-Translator: Manuela Silva <mmsrs@sky.com>, 2017\n"
"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -144,7 +144,7 @@ msgstr ""
#: ../java/build/Proxy.java:24
msgid ""
"The outproxy is probably down, but there could also be network congestion."
msgstr ""
msgstr "O proxy de saída está provavelmente fora do ar, mas pode ser também congestionamento na rede."
#: ../java/build/Proxy.java:25 ../java/build/Proxy.java:169
#: ../java/build/Proxy.java:194 ../java/build/Proxy.java:215
@@ -213,7 +213,7 @@ msgstr ""
#: ../java/build/Proxy.java:57
msgid ""
"The website is probably down, but there could also be network congestion."
msgstr ""
msgstr "O website está provavelmente fora do ar, mas pode ser também congestionamento na rede."
#: ../java/build/Proxy.java:60 ../java/build/Proxy.java:66
msgid "Warning: Invalid Request URI"
@@ -249,15 +249,15 @@ msgstr "Não utilize o proxy para aceder à consola do roteador, anfitrião loca
#: ../java/build/Proxy.java:78
msgid "Website Unknown"
msgstr ""
msgstr "Site Desconhecido"
#: ../java/build/Proxy.java:84
msgid "Website Not Found in Addressbook"
msgstr ""
msgstr "Website Não Encontrado no Livro de endereços"
#: ../java/build/Proxy.java:85
msgid "The website was not found in your router's addressbook."
msgstr ""
msgstr "O website não foi encontrado no livro de endereços do seu roteador."
#: ../java/build/Proxy.java:86
msgid "Check the link or find a Base 32 or Base 64 address."
@@ -289,7 +289,7 @@ msgstr ""
#: ../java/build/Proxy.java:99 ../java/build/Proxy.java:217
msgid "Could not connect to the following destination:"
msgstr ""
msgstr "Não foi possível se conectar ao seguinte destino:"
#: ../java/build/Proxy.java:100 ../java/build/Proxy.java:106
#: ../java/build/Proxy.java:185 ../java/build/Proxy.java:191
@@ -298,13 +298,13 @@ msgstr ""
#: ../java/build/Proxy.java:107
msgid "The connection to the website was reset while the page was loading."
msgstr ""
msgstr "A conexão ao website foi resetada enquanto a página carregava."
#: ../java/build/Proxy.java:108
msgid ""
"The website could be temporarily unavailable, too busy, or it has blocked "
"your access."
msgstr ""
msgstr "O site pode estar temporariamente indisponível, sobrecarregado ou bloqueando o seu acesso."
#: ../java/build/Proxy.java:117
msgid "Warning: Authorization Required"
@@ -314,7 +314,7 @@ msgstr ""
msgid ""
"The website destination specified was not valid, or was otherwise "
"unreachable."
msgstr ""
msgstr "O destino de website especificado não era válido ou era inatingível."
#: ../java/build/Proxy.java:127
msgid ""
@@ -348,7 +348,7 @@ msgstr "Aviso: Conflito entre ligações de ajudante de endereço"
msgid ""
"The address helper link you followed specifies a different destination key "
"than the entry in your address book."
msgstr ""
msgstr "O linque do auxiliar de endereço que você seguiu especifica uma chave de destino diferente da que consta na entrada do seu livro de endereços."
#: ../java/build/Proxy.java:148
msgid ""
@@ -430,13 +430,13 @@ msgstr "Para desabilitar a autorização, remova a configuração {0}i2ptunnel.p
#: ../java/build/Proxy.java:192
msgid "The connection to the proxy was reset."
msgstr ""
msgstr "A conexão com o proxy foi resetada."
#: ../java/build/Proxy.java:193
msgid ""
"The proxy could be temporarily unavailable, too busy, or it has blocked your"
" access."
msgstr ""
msgstr "O proxy pode estar temporariamente indisponível, sobrecarregado ou bloqueando o seu acesso."
#: ../java/build/Proxy.java:197 ../java/build/Proxy.java:203
msgid "Warning: Non-HTTP Protocol"
@@ -448,15 +448,15 @@ msgstr "O pedido usa um protocolo ruim."
#: ../java/build/Proxy.java:205
msgid "The I2P HTTP Proxy supports HTTP and HTTPS requests only."
msgstr ""
msgstr "O proxy HTTP I2P suporta apenas requisições HTTP e HTTPS."
#: ../java/build/Proxy.java:206
msgid "Other protocols such as FTP are not allowed."
msgstr ""
msgstr "Outros protocolos como FTP não são permitidos."
#: ../java/build/Proxy.java:207 ../java/build/Proxy.java:213
msgid "Outproxy Unreachable"
msgstr ""
msgstr "Proxy de saída inalcançável"
#: ../java/build/Proxy.java:214
msgid ""
@@ -495,7 +495,7 @@ msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304
msgid "Destination lease set not found"
msgstr ""
msgstr "Conjunto de locação de destino não encontrado"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1437
msgid "Host"
@@ -528,7 +528,7 @@ msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1460
#, java-format
msgid "Save {0} to router address book and continue to website"
msgstr ""
msgstr "Salvar {0} no livro de endereços do roteador e continuar no website."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1461
msgid ""
@@ -594,7 +594,7 @@ msgstr "Gerar"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
msgid "Encryption key"
msgstr ""
msgstr "Chave de Criptografia"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
msgid ""

View File

@@ -4,16 +4,16 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# blueboy, 2013
# blueboy, 2015,2017
# blueboy, 2013-2014
# L., 2013
# L., 2015,2017
# L., 2013-2014
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
"PO-Revision-Date: 2021-02-09 18:15+0000\n"
"Last-Translator: Eduardo Rodrigues\n"
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
"Last-Translator: L., 2015,2017\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -147,7 +147,7 @@ msgstr "O proxy de saída está provavelmente fora do ar, mas pode ser também c
msgid ""
"You may want to {0}retry{1} as this will randomly reselect an outproxy from "
"the pool you have defined {2}here{3} (if you have more than one configured)."
msgstr ""
msgstr "Talvez queiras {0}tentar novamente{1}, o que irá selecionar aleatoriamente um intermediador externo a rede I2P da lista que definiste {2}aqui{3} (Se tens mais de um configurado)."
#: ../java/build/Proxy.java:26 ../java/build/Proxy.java:170
#: ../java/build/Proxy.java:195 ../java/build/Proxy.java:216
@@ -274,7 +274,7 @@ msgstr "Noutro caso, procure um endereço Base 32 ou um linque de auxiliar de en
msgid ""
"Seeing this page often? See {0}the FAQ{1} for help in {2}adding some "
"subscriptions{3} to your addressbook."
msgstr ""
msgstr "Estar a ver esta página frequentemente? Veja as {0}perguntas frequentes{1} para ajuda em {2}incluindo novos registros{3} em teu livro de endereços."
#: ../java/build/Proxy.java:98
msgid ""
@@ -315,7 +315,7 @@ msgstr "O destino de website especificado não era válido ou era inatingível."
msgid ""
"Perhaps you pasted in the wrong Base 64 string or the link you are following"
" is bad."
msgstr ""
msgstr "Talvez colaste uma cadeia de caracteres na base 64 errada ou a ligação que seguiste não serve."
#: ../java/build/Proxy.java:128
msgid "The I2P host could also be offline."
@@ -365,7 +365,7 @@ msgstr "Aviso: Auxiliar de endereço ruim"
#: ../java/build/Proxy.java:157
#, java-format
msgid "The helper key in the URL ({0}i2paddresshelper={1}) is not resolvable."
msgstr ""
msgstr "A palavra ajudante na URL({0}i2paddresshelper={1}) não é traduzível."
#: ../java/build/Proxy.java:158
msgid "It seems to be garbage data, or a mistyped Base 32 address."
@@ -508,7 +508,7 @@ msgstr "Destino"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1451
#, java-format
msgid "Continue to {0} without saving"
msgstr ""
msgstr "Continuar para {0} sem salvar"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1452
msgid ""

View File

@@ -18,8 +18,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
"PO-Revision-Date: 2022-01-14 17:57+0000\n"
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>, 2016-2017,2021-2022\n"
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -339,7 +339,7 @@ msgstr "Din förfrågan gällde en webbplats utanför I2P, men du har ingen HTTP
#: ../java/build/Proxy.java:139
msgid "Please configure an outproxy in I2PTunnel."
msgstr "Vänligen ställ in en utproxy i I2PTunnel."
msgstr "Ställ in en utproxy i I2PTunnel."
#: ../java/build/Proxy.java:140 ../java/build/Proxy.java:146
msgid "Warning: Destination Key Conflict"
@@ -419,7 +419,7 @@ msgstr "Denna proxy är inställd till att kräva användarnamn och lösenord f
msgid ""
"Please enter your username and password, or check your {0}router "
"configuration{1} or {2}I2PTunnel configuration{3}."
msgstr "Vänligen ange ditt användarnamn och lösenord eller kontrollera din {0}router-konfiguration{1} eller {2}I2PTunnel-konfiguration{3}."
msgstr "Ange ditt användarnamn och lösenord eller kontrollera din {0}router-konfiguration{1} eller {2}I2PTunnel-konfiguration{3}."
#: ../java/build/Proxy.java:184
#, java-format
@@ -595,7 +595,7 @@ msgstr "Generera"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
msgid "Encryption key"
msgstr ""
msgstr "Krypteringsnyckel"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
msgid ""

View File

@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
"PO-Revision-Date: 2022-02-03 06:12+0000\n"
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>, 2016-2022\n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -55,7 +55,7 @@ msgstr "Yöneltici Panosu"
#: ../java/build/Proxy.java:174 ../java/build/Proxy.java:187
#: ../java/build/Proxy.java:199 ../java/build/Proxy.java:209
msgid "I2P Router Console"
msgstr "I2P Yöneltici Panosu"
msgstr "I2P yöneltici panosu"
#: ../java/build/Proxy.java:8 ../java/build/Proxy.java:19
#: ../java/build/Proxy.java:31 ../java/build/Proxy.java:43

View File

@@ -16,8 +16,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
"Last-Translator: LinuxChata\n"
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
"Last-Translator: Greg Koval <gregjsmith@gmx.com>, 2020\n"
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -593,7 +593,7 @@ msgstr "Згенерувати"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
msgid "Encryption key"
msgstr ""
msgstr "Ключ шифрування"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
msgid ""

View File

@@ -0,0 +1,700 @@
# 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
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
"Last-Translator: duck <duck@mail.i2p>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/otf/I2P/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../java/build/Proxy.java:5 ../java/build/Proxy.java:11
#: ../java/build/Proxy.java:40 ../java/build/Proxy.java:49
#: ../java/build/Proxy.java:55 ../java/build/Proxy.java:91
#: ../java/build/Proxy.java:97 ../java/build/Proxy.java:111
msgid "Website Unreachable"
msgstr "网站不可达"
#: ../java/build/Proxy.java:6 ../java/build/Proxy.java:17
#: ../java/build/Proxy.java:29 ../java/build/Proxy.java:41
#: ../java/build/Proxy.java:50 ../java/build/Proxy.java:61
#: ../java/build/Proxy.java:70 ../java/build/Proxy.java:79
#: ../java/build/Proxy.java:92 ../java/build/Proxy.java:101
#: ../java/build/Proxy.java:112 ../java/build/Proxy.java:120
#: ../java/build/Proxy.java:132 ../java/build/Proxy.java:141
#: ../java/build/Proxy.java:151 ../java/build/Proxy.java:161
#: ../java/build/Proxy.java:173 ../java/build/Proxy.java:186
#: ../java/build/Proxy.java:198 ../java/build/Proxy.java:208
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:294
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:368
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:402
msgid "Router Console"
msgstr "路由控制檯"
#: ../java/build/Proxy.java:7 ../java/build/Proxy.java:18
#: ../java/build/Proxy.java:30 ../java/build/Proxy.java:42
#: ../java/build/Proxy.java:51 ../java/build/Proxy.java:62
#: ../java/build/Proxy.java:71 ../java/build/Proxy.java:80
#: ../java/build/Proxy.java:93 ../java/build/Proxy.java:102
#: ../java/build/Proxy.java:113 ../java/build/Proxy.java:121
#: ../java/build/Proxy.java:133 ../java/build/Proxy.java:142
#: ../java/build/Proxy.java:152 ../java/build/Proxy.java:162
#: ../java/build/Proxy.java:174 ../java/build/Proxy.java:187
#: ../java/build/Proxy.java:199 ../java/build/Proxy.java:209
msgid "I2P Router Console"
msgstr "I2P 路由控制檯"
#: ../java/build/Proxy.java:8 ../java/build/Proxy.java:19
#: ../java/build/Proxy.java:31 ../java/build/Proxy.java:43
#: ../java/build/Proxy.java:52 ../java/build/Proxy.java:63
#: ../java/build/Proxy.java:72 ../java/build/Proxy.java:81
#: ../java/build/Proxy.java:94 ../java/build/Proxy.java:103
#: ../java/build/Proxy.java:114 ../java/build/Proxy.java:122
#: ../java/build/Proxy.java:134 ../java/build/Proxy.java:143
#: ../java/build/Proxy.java:153 ../java/build/Proxy.java:163
#: ../java/build/Proxy.java:175 ../java/build/Proxy.java:188
#: ../java/build/Proxy.java:200 ../java/build/Proxy.java:210
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:297
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:369
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:403
msgid "Configuration"
msgstr "設定"
#: ../java/build/Proxy.java:9 ../java/build/Proxy.java:20
#: ../java/build/Proxy.java:32 ../java/build/Proxy.java:44
#: ../java/build/Proxy.java:53 ../java/build/Proxy.java:64
#: ../java/build/Proxy.java:73 ../java/build/Proxy.java:82
#: ../java/build/Proxy.java:95 ../java/build/Proxy.java:104
#: ../java/build/Proxy.java:115 ../java/build/Proxy.java:123
#: ../java/build/Proxy.java:135 ../java/build/Proxy.java:144
#: ../java/build/Proxy.java:154 ../java/build/Proxy.java:164
#: ../java/build/Proxy.java:176 ../java/build/Proxy.java:189
#: ../java/build/Proxy.java:201 ../java/build/Proxy.java:211
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:298
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:369
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:403
msgid "Help"
msgstr "幫助"
#: ../java/build/Proxy.java:10 ../java/build/Proxy.java:21
#: ../java/build/Proxy.java:33 ../java/build/Proxy.java:45
#: ../java/build/Proxy.java:54 ../java/build/Proxy.java:65
#: ../java/build/Proxy.java:74 ../java/build/Proxy.java:83
#: ../java/build/Proxy.java:96 ../java/build/Proxy.java:105
#: ../java/build/Proxy.java:116 ../java/build/Proxy.java:124
#: ../java/build/Proxy.java:136 ../java/build/Proxy.java:145
#: ../java/build/Proxy.java:155 ../java/build/Proxy.java:165
#: ../java/build/Proxy.java:177 ../java/build/Proxy.java:190
#: ../java/build/Proxy.java:202 ../java/build/Proxy.java:212
msgid "Addressbook"
msgstr "地址簿"
#: ../java/build/Proxy.java:12
msgid "The website was not reachable."
msgstr "该网站不可达。"
#: ../java/build/Proxy.java:13
msgid ""
"The website is offline, there is network congestion, or your router is not "
"yet well-integrated with peers."
msgstr "该网站已离线,可能由于网络拥堵,或者您的路由器未良好的与网络整合。"
#: ../java/build/Proxy.java:14 ../java/build/Proxy.java:58
#: ../java/build/Proxy.java:109 ../java/build/Proxy.java:129
#, java-format
msgid "You may want to {0}retry{1}."
msgstr "您可能希望{0}重试{1}。"
#: ../java/build/Proxy.java:15 ../java/build/Proxy.java:27
#: ../java/build/Proxy.java:48 ../java/build/Proxy.java:59
#: ../java/build/Proxy.java:90 ../java/build/Proxy.java:110
#: ../java/build/Proxy.java:118 ../java/build/Proxy.java:130
#: ../java/build/Proxy.java:171 ../java/build/Proxy.java:196
msgid "Could not find the following destination:"
msgstr "未能找到下列目的地:"
#: ../java/build/Proxy.java:16 ../java/build/Proxy.java:22
#: ../java/build/Proxy.java:160 ../java/build/Proxy.java:166
msgid "Outproxy Not Found"
msgstr "出口代理未找到"
#: ../java/build/Proxy.java:23
msgid ""
"The HTTP outproxy was not reachable, because its lease set was not found."
msgstr "HTTP 出口代理不可达,因为找不到其租契。"
#: ../java/build/Proxy.java:24
msgid ""
"The outproxy is probably down, but there could also be network congestion."
msgstr "出口代理可能已下线,但也可能是由于网络拥堵。"
#: ../java/build/Proxy.java:25 ../java/build/Proxy.java:169
#: ../java/build/Proxy.java:194 ../java/build/Proxy.java:215
#, java-format
msgid ""
"You may want to {0}retry{1} as this will randomly reselect an outproxy from "
"the pool you have defined {2}here{3} (if you have more than one configured)."
msgstr "您可能想要{0}重试{1}因为这将从您在{2}此处{3}定义的出口代理列表中随机选择一个进行连接(如果您设置了多个出口代理)。"
#: ../java/build/Proxy.java:26 ../java/build/Proxy.java:170
#: ../java/build/Proxy.java:195 ../java/build/Proxy.java:216
#, java-format
msgid ""
"If you continue to have trouble you may want to edit your outproxy list "
"{0}here{1}."
msgstr "如果问题持续存在,您可能需要{0}在此{1}编辑出口代理列表。"
#: ../java/build/Proxy.java:28
msgid "Information: New Host Name"
msgstr "信息:新站点地址"
#: ../java/build/Proxy.java:34
msgid "Information: New Host Name with Address Helper"
msgstr "信息:通过地址助手发现的新站点地址"
#: ../java/build/Proxy.java:35
msgid ""
"The address helper link you followed is for a new host name that is not in "
"your address book."
msgstr "您打开的地址助手链接指向了一个新站点您的I2P地址簿中尚未收录。"
#: ../java/build/Proxy.java:36
msgid "You may save this host name to your local address book."
msgstr "您可以将此站点网址保存至您的本地地址簿中。"
#: ../java/build/Proxy.java:37
msgid ""
"If you save it to your address book, you will not see this message again."
msgstr "在地址簿中保存后,此提示将不在显示。"
#: ../java/build/Proxy.java:38
msgid ""
"If you do not save it, the host name will be forgotten after the next router"
" restart."
msgstr "如果不保存,路由重启后,此站点地址将被遗忘。"
#: ../java/build/Proxy.java:39
msgid ""
"If you do not wish to visit this host, click the \"back\" button on your "
"browser."
msgstr "如果您不像访问此站点,请点击浏览器的“后退”按钮。"
#: ../java/build/Proxy.java:46 ../java/build/Proxy.java:119
#: ../java/build/Proxy.java:125
msgid "Warning: Invalid Destination"
msgstr "警告:无效目标"
#: ../java/build/Proxy.java:47
msgid "The Base32 address is invalid."
msgstr "Base32 地址无效。"
#: ../java/build/Proxy.java:56
msgid "The website was not reachable, because its lease set was not found."
msgstr "该网站不可达,因为找不到其租契集。"
#: ../java/build/Proxy.java:57
msgid ""
"The website is probably down, but there could also be network congestion."
msgstr "该网站可能已下线,但也可能是由于网络拥堵。"
#: ../java/build/Proxy.java:60 ../java/build/Proxy.java:66
msgid "Warning: Invalid Request URI"
msgstr "警告:请求的 URI 无效。"
#: ../java/build/Proxy.java:67
msgid "The request URI is invalid, and probably contains illegal characters."
msgstr "请求的 URI 无效或包含非法字符。"
#: ../java/build/Proxy.java:68
msgid ""
"If you clicked a link, check the end of the URI for any characters the "
"browser has mistakenly added on."
msgstr "如果您点击的是链接,请检查 URI 结尾是否有浏览器错误添加的多余字符。"
#: ../java/build/Proxy.java:69
msgid "Error: Request Denied"
msgstr "错误:请求被拒绝"
#: ../java/build/Proxy.java:75
msgid "Error: Local Access"
msgstr "错误:本地访问"
#: ../java/build/Proxy.java:76
msgid "Your browser is misconfigured."
msgstr "您的浏览器配置有误。"
#: ../java/build/Proxy.java:77
msgid ""
"Do not use the proxy to access the router console, localhost, or local LAN "
"destinations."
msgstr "请不要使用代理访问路由控制台localhost 或局域网地址。"
#: ../java/build/Proxy.java:78
msgid "Website Unknown"
msgstr "网站未知"
#: ../java/build/Proxy.java:84
msgid "Website Not Found in Addressbook"
msgstr "未在地址簿中找到网站"
#: ../java/build/Proxy.java:85
msgid "The website was not found in your router's addressbook."
msgstr "未在您的地址簿中找到此网站。"
#: ../java/build/Proxy.java:86
msgid "Check the link or find a Base 32 or Base 64 address."
msgstr "请检查链接或找到其对应的 Base32 或 Base64 地址。"
#: ../java/build/Proxy.java:87
#, java-format
msgid "If you have the Base 64 address, {0}add it to your addressbook{1}."
msgstr "如果您拥有 Base64 地址,请{0}将其添加至您的地址簿{1}。"
#: ../java/build/Proxy.java:88
msgid ""
"Otherwise, find a Base 32 or address helper link, or use a jump service link"
" below."
msgstr "否则,请找到其对应的 Base32 地址或地址助手链接,或使用下面列出的跳转服务之一。"
#: ../java/build/Proxy.java:89
#, java-format
msgid ""
"Seeing this page often? See {0}the FAQ{1} for help in {2}adding some "
"subscriptions{3} to your addressbook."
msgstr "经常碰到此页面?请参见 {0}常见问题集 FAQ{1} 查看如何为您的地址簿 {2}添加订阅{3}。"
#: ../java/build/Proxy.java:98
msgid ""
"The website was not reachable, because it uses encryption options that are "
"not supported by your I2P or Java version."
msgstr "此网站不可达,因为您使用的 I2P 或者 Java 版本不支持它使用的加密选项。"
#: ../java/build/Proxy.java:99 ../java/build/Proxy.java:217
msgid "Could not connect to the following destination:"
msgstr "无法连接到以下目标:"
#: ../java/build/Proxy.java:100 ../java/build/Proxy.java:106
#: ../java/build/Proxy.java:185 ../java/build/Proxy.java:191
msgid "Connection Reset"
msgstr "连接重置"
#: ../java/build/Proxy.java:107
msgid "The connection to the website was reset while the page was loading."
msgstr "载入页面时到该网站的连接被重置。"
#: ../java/build/Proxy.java:108
msgid ""
"The website could be temporarily unavailable, too busy, or it has blocked "
"your access."
msgstr "网站暂时不可用、太忙或者被屏蔽。"
#: ../java/build/Proxy.java:117
msgid "Warning: Authorization Required"
msgstr "警告:需要授权"
#: ../java/build/Proxy.java:126
msgid ""
"The website destination specified was not valid, or was otherwise "
"unreachable."
msgstr "指定的网站目标无效,或者不可达。"
#: ../java/build/Proxy.java:127
msgid ""
"Perhaps you pasted in the wrong Base 64 string or the link you are following"
" is bad."
msgstr "或许您粘贴的 Base64 字符串有误或您打开的链接有问题。"
#: ../java/build/Proxy.java:128
msgid "The I2P host could also be offline."
msgstr "也可能是 I2P 站点目前已下线。"
#: ../java/build/Proxy.java:131 ../java/build/Proxy.java:137
msgid "Warning: No Outproxy Configured"
msgstr "警告:没有配置出口代理"
#: ../java/build/Proxy.java:138
msgid ""
"Your request was for a site outside of I2P, but you have no HTTP outproxy "
"configured."
msgstr "请求的站点在 I2P 网络之外,但您没有配置 HTTP 出口代理。"
#: ../java/build/Proxy.java:139
msgid "Please configure an outproxy in I2PTunnel."
msgstr "请到 I2PTunnel 中配置出口代理。"
#: ../java/build/Proxy.java:140 ../java/build/Proxy.java:146
msgid "Warning: Destination Key Conflict"
msgstr "警告:目标密钥冲突"
#: ../java/build/Proxy.java:147
msgid ""
"The address helper link you followed specifies a different destination key "
"than the entry in your address book."
msgstr "您所打开的地址助手链接指定的目标密钥与您的地址簿中的记录不同。"
#: ../java/build/Proxy.java:148
msgid ""
"Someone could be trying to impersonate another website, or people have given"
" two websites identical names."
msgstr "有人可能在试图冒充另一个网站,或者人们给两个网站赋予了同一个名称。"
#: ../java/build/Proxy.java:149
msgid ""
"Resolve the conflict by deciding which key you trust, and then either ignore"
" the address helper link, or delete the host entry from your address book "
"and click the address helper link again."
msgstr "决定您信任哪个密钥以解决冲突,然后要么忽略地址助手链接,要么在您的地址簿中删除该主机项,并再次点击该地址助手链接。"
#: ../java/build/Proxy.java:150 ../java/build/Proxy.java:156
msgid "Warning: Bad Address Helper"
msgstr "警告:无效地址助手"
#: ../java/build/Proxy.java:157
#, java-format
msgid "The helper key in the URL ({0}i2paddresshelper={1}) is not resolvable."
msgstr "URL中的助手键值 ({0}i2paddresshelper={1}) 无法解析。"
#: ../java/build/Proxy.java:158
msgid "It seems to be garbage data, or a mistyped Base 32 address."
msgstr "它看起来可能是无效数据或输入有误的 Base32 地址。"
#: ../java/build/Proxy.java:159
msgid ""
"Check your URL to try and fix the helper key to be a valid Base 32 hostname "
"or Base 64 key."
msgstr "请检查您的链接尝试修复助手密钥为有效的 Base32 地址或 Base64 密钥。"
#: ../java/build/Proxy.java:167
msgid "The HTTP Outproxy was not found."
msgstr "未找到 HTTP 出口代理。"
#: ../java/build/Proxy.java:168
msgid ""
"It is offline, there is network congestion, or your router is not yet well-"
"integrated with peers."
msgstr "它已经下线,遇到网络拥堵,或您的路由尚未完全整合至 I2P 网络中。"
#: ../java/build/Proxy.java:172 ../java/build/Proxy.java:178
msgid "Warning: Request Denied"
msgstr "警告:请求被拒绝"
#: ../java/build/Proxy.java:179
msgid "You attempted to connect to a non-I2P website or location."
msgstr "您尝试连接的网站非 I2P 站点或位置。"
#: ../java/build/Proxy.java:180
msgid "Proxy Authorization Required"
msgstr "出口代理认证"
#: ../java/build/Proxy.java:181
msgid "I2P HTTP Proxy Authorization Required"
msgstr "出口代理认证"
#: ../java/build/Proxy.java:182
msgid ""
"This proxy is configured to require a username and password for access."
msgstr "代理配置要求提供用户名和密码才能访问。"
#: ../java/build/Proxy.java:183
#, java-format
msgid ""
"Please enter your username and password, or check your {0}router "
"configuration{1} or {2}I2PTunnel configuration{3}."
msgstr "请输入您的用户名和密码,否则请检查您的 {0} 路由配置 {1} 或 {2} I2PTunnel 配置 {3}。"
#: ../java/build/Proxy.java:184
#, java-format
msgid ""
"To disable authorization, remove the configuration "
"{0}i2ptunnel.proxy.auth=basic{1}, then stop and restart the HTTP Proxy "
"tunnel."
msgstr "要禁用身份认证,请删除配置 {0}i2ptunnel.proxy.auth=basic{1}, 然后停止并重启 HTTP Proxy 隧道。"
#: ../java/build/Proxy.java:192
msgid "The connection to the proxy was reset."
msgstr "到代理的连接被重置。"
#: ../java/build/Proxy.java:193
msgid ""
"The proxy could be temporarily unavailable, too busy, or it has blocked your"
" access."
msgstr "代理暂时不可用、太忙或者被屏蔽。"
#: ../java/build/Proxy.java:197 ../java/build/Proxy.java:203
msgid "Warning: Non-HTTP Protocol"
msgstr "警告:非 HTTP 协议"
#: ../java/build/Proxy.java:204
msgid "The request uses a bad protocol."
msgstr "请求使用了无效协议。"
#: ../java/build/Proxy.java:205
msgid "The I2P HTTP Proxy supports HTTP and HTTPS requests only."
msgstr "I2P HTTP 代理只支持 HTTP 和 HTTPS 请求。"
#: ../java/build/Proxy.java:206
msgid "Other protocols such as FTP are not allowed."
msgstr "其他协议例如FTP不被支持。"
#: ../java/build/Proxy.java:207 ../java/build/Proxy.java:213
msgid "Outproxy Unreachable"
msgstr "出口代理不可达"
#: ../java/build/Proxy.java:214
msgid ""
"The HTTP outproxy was not reachable, because it uses encryption options that"
" are not supported by your I2P or Java version."
msgstr "此 HTTP 出口代理不可达,因为您使用的 I2P 或者 Java 版本不支持它使用的加密选项。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:692
msgid "This seems to be a bad destination:"
msgstr "目标似乎无效:"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:693
msgid "i2paddresshelper cannot help you with a destination like that!"
msgstr "i2p 地址助手对您输入的目标无能为力!"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:765
#, java-format
msgid ""
"To visit the destination in your address book, click <a "
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
"click <a href=\"{1}\">here</a>."
msgstr "要访问您的地址簿中的该目标,请点击<a href=\"{0}\">这里</a>。要访问冲突的地址助手目标,点击<a href=\"{1}\">这里</a>。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:774
#, java-format
msgid "Destination for {0} in address book"
msgstr "地址簿中的 {0} 的目标"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:777
msgid "Conflicting address helper destination"
msgstr "确认地址助手目标"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1224
msgid "Corrupt Base32 address"
msgstr "损坏的 Base32 地址"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304
msgid "Destination lease set not found"
msgstr "找不到目标租赁"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1437
msgid "Host"
msgstr "主機"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1441
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1502
msgid "Base32"
msgstr "Base32"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1445
msgid "Destination"
msgstr "目標"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1451
#, java-format
msgid "Continue to {0} without saving"
msgstr "继续{0},而不保存"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1452
msgid ""
"You can browse to the site without saving it to the address book. The "
"address will be remembered until you restart your I2P router."
msgstr "您可以不将站点添加到地址簿而进行浏览。地址会被记录直到您重启您的I2P路由器。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1453
msgid "Continue without saving"
msgstr "继续,而不保存"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1460
#, java-format
msgid "Save {0} to router address book and continue to website"
msgstr "保存 {0} 到路由器地址簿并继续访问网站"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1461
msgid ""
"This address will be saved to your Router address book where your "
"subscription-based addresses are stored."
msgstr "本地址会被存储在您的路由器地址簿,您基于订阅的地址所存储的地方。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1463
msgid ""
"If you want to keep track of sites you have added manually, add to your "
"Local or Private address book instead."
msgstr "如果您希望追踪您手动添加的站点,请将其添加到本地或私有地址簿。"
#. FIXME wasn't escaped
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1466
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1548
msgid "Save & continue"
msgstr "保存并继续"
#. only blockfile supports multiple books
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1473
#, java-format
msgid "Save {0} to local address book and continue to website"
msgstr "保存 {0} 到路由器地址簿并继续访问网站"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1474
msgid ""
"This address will be saved to your Local address book. Select this option "
"for addresses you wish to keep separate from the main router address book, "
"but don't mind publishing."
msgstr "该地址会被保存到你的本地地址簿。如果您希望与主路由器地址簿分开存储,但不介意发布的话,请选择此选项。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1478
#, java-format
msgid "Save {0} to private address book and continue to website"
msgstr "保存 {0} 到私有地址簿并继续访问网站"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1479
msgid ""
"This address will be saved to your Private address book, ensuring it is "
"never published."
msgstr "本地址会被存储到您的私有地址簿,以保证其永不被发布。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1507
msgid "Base32 address requires lookup password"
msgstr "Base32地址需要查找密码"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1509
msgid "Base32 address requires encryption key"
msgstr "Base32地址需要加密密钥"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1511
msgid "Base32 address requires encryption key and lookup password"
msgstr "Base32 地址需要加密密钥和查找密码"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1513
msgid "Base32 address decryption failure, check encryption key"
msgstr "Base32 地址解密失败,检查加密密钥"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1524
msgid "Generate"
msgstr "產生"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
msgid "Encryption key"
msgstr "加密密钥"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
msgid ""
"You must either enter a PSK encryption key provided by the server operator, "
"or generate a DH encryption key and send that to the server operator."
msgstr "您必须输入一个服务器操作员提供的 PSK 加密密钥或生成一个 DH 加密密钥并发送到服务器操作员。"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1527
msgid "Ask the server operator for help."
msgstr "向服务器操作者寻求帮助"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1530
msgid "Enter PSK encryption key"
msgstr "输入 PSK 加密密钥"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1533
msgid "Generate new DH encryption key"
msgstr "生成新的加密密钥"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1541
msgid "Lookup password"
msgstr "查找密码"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1542
msgid "You must enter the password provided by the server operator."
msgstr "您需要输入服务器操作者提供的密码。"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:196
#, java-format
msgid "Added via address helper from {0}"
msgstr "已通过地址助手 {0} 添加"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198
msgid "Added via address helper"
msgstr "已通过地址助手添加"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:235
msgid "Missing lookup password"
msgstr "查找密码不存在"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:249
msgid "Missing private key"
msgstr "私有密钥不存在"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:254
msgid "Invalid private key"
msgstr "私有密钥无效"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:287
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:306
msgid "Your new encryption key"
msgstr "您的新加密密钥"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:301
msgid "Address book"
msgstr "通讯录"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:311
msgid "Copy the key and send it to the server operator."
msgstr "复制密钥,并发送给服务器操作者"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:313
msgid "After you are granted permission, you may proceed to the website."
msgstr "被授予权限后,您才可以访问这个网站"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:334
msgid "Go back and fix the error"
msgstr "返回并修复错误"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:345
msgid "router"
msgstr "路由器"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:347
msgid "local"
msgstr "本地"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:349
msgid "private"
msgstr "私有"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:362
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:396
#, java-format
msgid "Redirecting to {0}"
msgstr "正在重定向至 {0}"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:371
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:405
msgid "Address Book"
msgstr "地址簿"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:376
#, java-format
msgid "Saved {0} to the {1} address book, redirecting now."
msgstr "目标{0}已保存至{1}地址簿中,正在重定向至此目标。"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:377
#, java-format
msgid "Failed to save {0} to the {1} address book, redirecting now."
msgstr "目标{0}在{1}地址簿中保存失败,正在重定向至此目标。"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:379
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:411
msgid "Click here if you are not redirected automatically."
msgstr "如果未能自动转到,请点击这里。"
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:409
#, java-format
msgid "Saved the authentication for {0}, redirecting now."
msgstr "已保存 {0} 的凭据,正在重定向。"

View File

@@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: zzzi2p\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: KIA <kia___@hushmail.com>, 2011\n"
"Language-Team: Danish (http://www.transifex.com/otf/I2P/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1148,7 +1148,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
msgid "Encrypted"
msgstr ""
msgstr "Krypteret"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
msgid "Prevents server discovery by floodfills"

View File

@@ -18,8 +18,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: strel\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: strel, 2013-2018\n"
"Language-Team: Spanish (http://www.transifex.com/otf/I2P/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1743,7 +1743,7 @@ msgstr "El destino I2P local no está disponible. Inicie el túnel."
msgid ""
"To enable registration verification, edit tunnel and set name (or website "
"name) to a valid hostname ending in '.i2p'"
msgstr ""
msgstr "Para habilitar la verificación del registro, edite el túnel y establezca el nombre (o nombre del sitio web) a un nombre de servidor válido acabado en '.i2p'"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
@@ -2109,7 +2109,7 @@ msgstr "Esto permite que las conexiones TCP y UDP se hagan a través de un outpr
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Un túnel de cliente que implementa el protocolo SOCKS, personalizado para la conexión con redes IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2234,7 +2234,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Esto puede ser útil para los túneles de uso frecuente (especialmente en los túneles de servidor), pero para los túneles que sólo se utilizan ocasionalmente, significaría que el router I2P está creando y manteniendo túneles innecesarios."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: Reza Ghasemi\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Reza Ghasemi, 2019\n"
"Language-Team: Persian (http://www.transifex.com/otf/I2P/language/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -593,7 +593,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1619
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1669
msgid "Count"
msgstr ""
msgstr "شمارش"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:635
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1621

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: zzzi2p\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>, 2015\n"
"Language-Team: Finnish (http://www.transifex.com/otf/I2P/language/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -192,7 +192,7 @@ msgstr "Muokkaa piilotettua palvelua"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:184
msgid "Are you sure you want to delete?"
msgstr ""
msgstr "Oletko varma, etä haluat poistaa tämän?"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:208
msgid "Edit proxy settings"
@@ -1392,7 +1392,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2311
msgid "unlimited"
msgstr ""
msgstr "rajoittamaton"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2314
msgid ""

View File

@@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: Robert Dafis <robertdafis@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Robert Dafis <robertdafis@gmail.com>, 2018\n"
"Language-Team: Indonesian (http://www.transifex.com/otf/I2P/language/id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1730,7 +1730,7 @@ msgstr "Destinasi lokal ini tidak tersedia. Aktifkan tunnel ini.."
msgid ""
"To enable registration verification, edit tunnel and set name (or website "
"name) to a valid hostname ending in '.i2p'"
msgstr ""
msgstr "Untuk mengaktifkan verifikasi pendaftaran, mengedit tunnel dan menetapkan nama (atau nama website) untuk nama host yang berlaku, yang berakhir dengan '.i2p'"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
@@ -2096,7 +2096,7 @@ msgstr "Ini memungkinkan koneksi TCP dan UDP dibuat melalui outproxy SOCKS di da
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Client tunnel yang menerapkan protokol SOCKS, yang disesuaikan untuk terhubung ke jaringan IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2221,7 +2221,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Ini dapat berguna untuk tunnel yang sering digunakan (terutama server tunnel), namun untuk tunnel yang hanya digunakan sesekali, router I2P menciptakan dan memelihara tunnel yang tidak diperlukan."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -25,8 +25,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: c2ed1e40dec4c77110b8433ca0e8b4a8_488379a <85dd5f0e022835b2532b5ca0658d8435_534014>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: SebastianoPistore <SebastianoPistore.info@protonmail.ch>, 2021\n"
"Language-Team: Italian (http://www.transifex.com/otf/I2P/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -2116,7 +2116,7 @@ msgstr "Questo abilita entrambe le connessioni TCP e UDP a passare tramite un ou
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Un tunnel client che implementa un protocollo di tipo SOCKS, che è personalizzato per connettersi alla rete IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2241,7 +2241,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Questo può essere utile per tunnel usati spesso (specie tunnel server), ma per i tunnel usati solo occasionalmente comporta che il router I2P sta creando e mantenendo tunnel non necessari."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: HelloKS <kqwe1859@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: HelloKS <kqwe1859@gmail.com>, 2017\n"
"Language-Team: Korean (http://www.transifex.com/otf/I2P/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1731,7 +1731,7 @@ msgstr "로컬 목적지가 사용 가능하지 않습니다. 터널을 재시
msgid ""
"To enable registration verification, edit tunnel and set name (or website "
"name) to a valid hostname ending in '.i2p'"
msgstr ""
msgstr "가입 인증을 활성화하려면 터널을 편집하고 이름을 세팅하세요 (또는 웹사이트 이름) '.i2p'로 끝나야 합니다."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
@@ -2097,7 +2097,7 @@ msgstr "TCP와 UDP 모두를 I2P SOCKS 아웃프록시로 가도록 활성화합
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "클라이언트 터널이 IRC 네트워크 연결을 위해 커스텀된 SOCKS 프로토콜을 사용중입니다."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2222,7 +2222,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "자주 사용되는 터널에도 유용할 수 있습니다 (특히 서버 터널), 하지만 가끔 사용되는 터널에 대해서는 자원의 낭비가 있을 수 있습니다. I2P 라우터가 쓸모없는 터널을 생성하고 관리하는 격이니까요."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -13,8 +13,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>, 2016-2017\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/otf/I2P/language/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1631,7 +1631,7 @@ msgstr "Mål"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371
msgid "Hostname"
msgstr ""
msgstr "Vertsnavn"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
msgid "Share your site using the hostname"
@@ -2104,7 +2104,7 @@ msgstr "Dette gjør at både TCP og UDP-tilkoblinger skal sendes gjennom en SOCK
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "En klient tunnel implementering av SOCKS-protokollen, som er tilpasset for tilkobling til IRC-nettverk."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2229,7 +2229,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Dette kan være nyttig for ofte brukte tunneler (spesielt tjenertunneler), men for tunneler som bare brukes innimellom vil det bety at I2P-ruteren skaper og opprettholder unødvendige tunneler."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."
@@ -2298,7 +2298,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:750
msgid "Return to previous page"
msgstr ""
msgstr "Gå tilbake til forrige side"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753
msgid "Previous"

View File

@@ -16,8 +16,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: Nathan Follens\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Nathan Follens, 2015,2018\n"
"Language-Team: Dutch (http://www.transifex.com/otf/I2P/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1741,7 +1741,7 @@ msgstr "Lokale bestemming is niet beschikbaar. Start de tunnel."
msgid ""
"To enable registration verification, edit tunnel and set name (or website "
"name) to a valid hostname ending in '.i2p'"
msgstr ""
msgstr "Om registratie verificatie in te schakelen, bewerk de tunnel en stel een naam (of website naam) in als valide host eindigend op '.i2p'"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
@@ -2107,7 +2107,7 @@ msgstr "Dit zorgt ervoor dat zowel TCP- als UDP-connecties gemaakt kunnen worden
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Een cliënt-tunnel die het SOCKS-protocol implementeert, speciaal om met IRC-netwerken te verbinden."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2232,7 +2232,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Dit kan handig zijn voor veelgebruikte tunnels (vooral server tunnels), maar voor tunnels die maar af en toe gebruikt worden betekent het dat de I2P router onnodige tunnels maakt en bijhoudt."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: zzzi2p\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: <n414210@rtrtr.com>, 2012\n"
"Language-Team: Norwegian Nynorsk (http://www.transifex.com/otf/I2P/language/nn/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1148,7 +1148,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
msgid "Encrypted"
msgstr ""
msgstr "Kryptert"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
msgid "Prevents server discovery by floodfills"
@@ -2101,7 +2101,7 @@ msgstr "Dette gjer det moleg å oppretta både TCP- og UDP-tilkoplingar gjennom
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Ein klienttunell som implementerer SOCKS-protokollen, som i tillegg er spesielt innstilt for IRC-nettverk."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2226,7 +2226,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Dette kan vera nyttig for tunellar du nyttar ofte (spesielt tenartunellar). For tunellar som berre blir nytta av og til vil det tyda at I2P-ruteren opprettar og vedlikehaldar tunellar du ikkje treng."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -15,8 +15,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: dllud\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Manuela Silva <mmsrs@sky.com>, 2017-2018\n"
"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -240,7 +240,7 @@ msgstr "Descrição"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:272
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125
msgid "Auto Start Tunnel"
msgstr ""
msgstr "Iniciar túnel automaticamente"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:274
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1127
@@ -260,7 +260,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1135
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:584
msgid "Automatically start tunnel when router starts"
msgstr ""
msgstr "Iniciar túnel automaticamente quando o roteador iniciar"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:286
msgid ""
@@ -308,7 +308,7 @@ msgstr "obrigatório"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1177
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:512
msgid "Specify the local port this service should be accessible from"
msgstr ""
msgstr "Especificar a porta local a partir da qual esse serviço deve ser acessível"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:330
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1020
@@ -322,7 +322,7 @@ msgstr "Anfitrião"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1163
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:466
msgid "Hostname or IP address of the target server"
msgstr ""
msgstr "Nome do host ou endereço IP do servidor-alvo"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:347
msgid "Local interface (ip address) the client tunnel will be reachable from"
@@ -371,11 +371,11 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:406
msgid "SSL Outproxies"
msgstr ""
msgstr "Proxies de saída SSL"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:418
msgid "Use Outproxy Plugin"
msgstr ""
msgstr "Usar extensão de proxy de saída"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:420
msgid ""
@@ -1153,7 +1153,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
msgid "Encrypted"
msgstr ""
msgstr "Encriptado"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
msgid "Prevents server discovery by floodfills"
@@ -1453,7 +1453,7 @@ msgstr "Limite de POSTs"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2352
msgid "Per Period"
msgstr ""
msgstr "Por período"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2354
msgid "Ban Duration"
@@ -1520,7 +1520,7 @@ msgstr "Apagar"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
msgid "Global Tunnel Control"
msgstr ""
msgstr "Controle de túnel global"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
msgid "Tunnel Wizard"
@@ -1592,7 +1592,7 @@ msgstr "Iniciando..."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:517
msgid "Stop this Tunnel"
msgstr ""
msgstr "Interromper esse túnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
@@ -1619,7 +1619,7 @@ msgstr "Parado"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:347
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:570
msgid "Start this Tunnel"
msgstr ""
msgstr "Iniciar esse túnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577
@@ -1633,7 +1633,7 @@ msgstr "Destino"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371
msgid "Hostname"
msgstr ""
msgstr "Nome do hospedeiro"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
msgid "Share your site using the hostname"
@@ -1676,7 +1676,7 @@ msgstr "Interface"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479
msgid "Edit Tunnel Settings for"
msgstr ""
msgstr "Editar as configurações de túnel para"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534
@@ -2106,7 +2106,7 @@ msgstr "Isto habilita tanto conexões TCP quanto o UDP a serem feitas através d
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Um túnel de cliente implementando o protocolo SOCKS, e projetado para conectar em redes IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2231,7 +2231,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Isto pode ser útil em túneis muito utilizados (especialmente os túneis de servidor), mas para os túneis que são utilizado ocasionalmente significa que o I2P vai ficar mantendo túneis desnecessários."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."
@@ -2300,7 +2300,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:750
msgid "Return to previous page"
msgstr ""
msgstr "Retornar para a página anterior"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753
msgid "Previous"

View File

@@ -6,16 +6,16 @@
# Translators:
# testsubject67 <deborinha97@hotmail.com>, 2014
# Eduardo Rodrigues, 2021
# blueboy, 2013
# blueboy, 2015-2016,2020
# blueboy, 2013-2014
# L., 2013
# L., 2015-2016,2020
# L., 2013-2014
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: Rafael Ferrari\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Eduardo Rodrigues, 2021\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1099,7 +1099,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1371
msgid "Registration Authentication"
msgstr ""
msgstr "Autenticação de Registo"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1377
msgid "HTTPS configuration"
@@ -1945,7 +1945,7 @@ msgstr "Ativado"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:843
msgid "I2P webserver (eepsite)"
msgstr ""
msgstr "servidor web I2P (eepsite)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1025
msgid "SSL is enabled"
@@ -2000,7 +2000,7 @@ msgstr "Destino do túnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
msgid "Binding address and port"
msgstr ""
msgstr "Endereço e porta de escuta"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:711
@@ -2015,25 +2015,25 @@ msgstr "Assistente completado"
msgid ""
"This wizard will take you through the various options available for creating"
" tunnels in I2P."
msgstr ""
msgstr "Este assistente vai apresentar várias opções disponíveis para a criação de túneis I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254
msgid ""
"The first thing to decide is whether you want to create a server or a client"
" tunnel."
msgstr ""
msgstr "A primeira informação é escolher se o túnel será um servidor ou um cliente."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256
msgid ""
"If you need to connect to a remote service, such as an IRC server inside I2P"
" or a code repository, then you will require a CLIENT tunnel."
msgstr ""
msgstr "Se você vai se conectar em um serviço remoto, como um servidor IRC dentro da rede I2P ou um repositório de código fonte, então você precisa de um Túnel de CLIENTE."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258
msgid ""
"On the other hand, if you wish to host a service for others to connect to "
"you'll need to create a SERVER tunnel."
msgstr ""
msgstr "Mas se vai hospedar um serviço para os outros se conectarem, então você precisa criar um Túnel de SERVIDOR."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260
msgid "Server Tunnel"
@@ -2045,18 +2045,18 @@ msgstr "Túnel cliente"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:280
msgid "There are several types of tunnels to choose from:"
msgstr ""
msgstr "Existem diversos tipos de túneis para escolher:"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:288
msgid "Basic tunnel for connecting to a single service inside I2P."
msgstr ""
msgstr "Túnel básico para se conectar em um único serviço na rede I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:290
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:324
msgid ""
"Try this if none of the tunnel types below fit your requirements, or you "
"don't know what type of tunnel you need."
msgstr ""
msgstr "Tente isto se nenhum dos tipos de túneis abaixo atente seus requisitos, ou se você não conhece o tipo de túnel necessário."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:292
msgid "Tunnel that acts as an HTTP proxy for reaching I2P Sites inside I2P."
@@ -2067,7 +2067,7 @@ msgid ""
"Set your browser to use this tunnel as an http proxy, or set your "
"\"http_proxy\" environment variable for command-line applications in "
"GNU/Linux."
msgstr ""
msgstr "Configure seu navegador para usar este túnel como um proxy HTTP, ou configure a variável ambiente \"http_proxy\" para aplicativos GNU/Linux em modo texto."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:296
msgid ""
@@ -2083,13 +2083,13 @@ msgstr ""
msgid ""
"With this tunnel type, your IRC client will be able to connect to an IRC "
"network inside I2P."
msgstr ""
msgstr "Com este tipo de túnel, o seu cliente IRC vai poder se conectar nas redes IRC dentro do I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:302
msgid ""
"Each IRC network in I2P that you wish to connect to will require its own "
"tunnel. (See Also, SOCKS IRC)"
msgstr ""
msgstr "Cada rede IRC do I2P que você vai se conectar requer o seu próprio túnel. (Veja também SOCKS IRC)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:304
msgid "A tunnel that implements the SOCKS protocol."
@@ -2099,37 +2099,37 @@ msgstr "Um túnel que implementa o protocolo SOCKS."
msgid ""
"This enables both TCP and UDP connections to be made through a SOCKS "
"outproxy within I2P."
msgstr ""
msgstr "Isto habilita tanto conexões TCP quanto o UDP a serem feitas através de proxy de saída SOCKS, para a rede I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:308
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Um túnel de cliente implementando o protocolo SOCKS, e projetado para conectar em redes IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
"With this tunnel type, IRC networks in I2P can be reached by typing the I2P "
"address into your IRC client, and configuring the IRC client to use this "
"SOCKS tunnel."
msgstr ""
msgstr "Com este tipo de túnel, as redes IRC do I2P pode ser acessadas digitando o endereço I2P dentro do seu cliente IRC, e configurando ele para utilizar o túnel SOCKS."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:312
msgid ""
"This means that only one I2P tunnel is required rather than a separate "
"tunnel per IRC network."
msgstr ""
msgstr "Isto significa que somente um túnel I2P é necessário para se conectar em redes IRC, ao invés de dois túneis."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:314
msgid ""
"IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P "
"is known, though it depends on whether or not the outproxy has been blocked "
"by the IRC network."
msgstr ""
msgstr "Redes IRC fora do I2P também pode ser acessadas se for conhecido um servidor de saída SOCKS dentro da rede I2P, contudo depende deste servidor não estar bloqueado pela rede IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:322
msgid "A basic server tunnel for hosting a generic service inside I2P."
msgstr ""
msgstr "Um túnel de servidor básico para hospedar um serviço genérico dentro da rede I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326
msgid "A server tunnel that is customized for HTTP connections."
@@ -2147,7 +2147,7 @@ msgstr ""
msgid ""
"Usually, a separate tunnel needs to be created for each IRC server that is "
"to be accessible inside I2P."
msgstr ""
msgstr "Geralmente, cada servidor IRC que vai ser acessado de dentro da rede I2P precisa de um túnel separado."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:338
msgid "Select tunnel type"
@@ -2161,13 +2161,13 @@ msgstr "Escolha um nome e uma descrição para o seu túnel."
msgid ""
"These can be anything you want - they are just for ease of identifying the "
"tunnel in the routerconsole."
msgstr ""
msgstr "Pode ser qualquer informação, é apenas para a sua identificação no Painel do Roteador."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:407
msgid ""
"If you know of any outproxies for this type of tunnel (either HTTP or "
"SOCKS), fill them in below."
msgstr ""
msgstr "Se você conhece algum proxy de saída para este tipo de túnel (HTTP ou SOCKS), preencha ele abaixo."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:409
msgid "Separate multiple proxies with commas."
@@ -2183,7 +2183,7 @@ msgstr ""
msgid ""
"Type in the I2P destination of the service that this client tunnel should "
"connect to."
msgstr ""
msgstr "Tipo do serviço no destino I2P que teste túnel de cliente vai conectar."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
msgid ""
@@ -2207,62 +2207,62 @@ msgstr "Essa é a porta pela qual o serviço está aceitando conexões."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:508
msgid "This is the port that the client tunnel will be accessed from locally."
msgstr ""
msgstr "Esta é a porta que o túnel de cliente escuta para ser acessado localmente."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
msgid ""
"How do you want this tunnel to be accessed? By just this machine, your "
"entire subnet, or external internet?"
msgstr ""
msgstr "Como você deseja que este túnel seja acessado? Apenas por esta máquina, sua sub rede, ou pela internet?"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533
msgid "You will most likely want to just allow 127.0.0.1"
msgstr ""
msgstr "Você precisa apenas permitir conexões de 127.0.0.1"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:576
msgid ""
"The I2P router can automatically start this tunnel for you when the router "
"is started."
msgstr ""
msgstr "O roteador I2P pode iniciar automaticamente este túnel para você quando for iniciado."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:578
msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Isto pode ser útil em túneis muito utilizados (especialmente os túneis de servidor), mas para os túneis que são utilizado ocasionalmente significa que o I2P vai ficar mantendo túneis desnecessários."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."
msgstr ""
msgstr "O assistente já possui agora todas as informações para criar o seu túnel."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:606
msgid ""
"Upon clicking the Save button below, the wizard will set up the tunnel, and "
"take you back to the main I2PTunnel page."
msgstr ""
msgstr "Ao clicar no botão Salvar abaixo, o assistente vai criar o túnel e voltar para a página principal dos túneis I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:611
msgid ""
"Because you chose to automatically start the tunnel when the router starts, "
"you don't have to do anything further."
msgstr ""
msgstr "Como você escolheu para iniciar o túnel automaticamente quando o roteador I2P inicia, não é necessário fazer nenhuma configuração adicional."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:613
msgid "The router will start the tunnel once it has been set up."
msgstr ""
msgstr "O roteador I2P vai iniciar o túnel assim que ele estiver configurado."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:617
msgid ""
"Because you chose not to automatically start the tunnel, you will have to "
"manually start it."
msgstr ""
msgstr "Como você escolheu para não iniciar o túnel automaticamente, você precisa sempre iniciar ele manualmente."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:619
msgid ""
"You can do this by clicking the Start button on the main page which "
"corresponds to the new tunnel."
msgstr ""
msgstr "Você pode fazer isto clicando no botão Iniciar na página principal do novo túnel."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:623
msgid "Below is a summary of the options you chose:"
@@ -2284,14 +2284,14 @@ msgstr ""
msgid ""
"Alongside these basic settings, there are a number of advanced options for "
"tunnel configuration."
msgstr ""
msgstr "Além destas configurações básicas, existem várias opções avançadas para a configuração do túnel."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:724
msgid ""
"The wizard will set reasonably sensible default values for these, but you "
"can view and/or edit these by clicking on the tunnel's name in the main "
"I2PTunnel page."
msgstr ""
msgstr "O assistente vai configurar os parâmetros importantes no padrão recomendado, mas você pode ver/editar estes parâmetros clicando no nome do túnel na página principal dos túneis I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:743
msgid "Cancel the wizard and return to Tunnel Manager home page"

View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: polearnik <polearnik@mail.ru>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: polearnik <polearnik@mail.ru>, 2019-2020\n"
"Language-Team: Romanian (http://www.transifex.com/otf/I2P/language/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1741,7 +1741,7 @@ msgstr "Destinația locală nu este disponibilă. Porniți tunelul."
msgid ""
"To enable registration verification, edit tunnel and set name (or website "
"name) to a valid hostname ending in '.i2p'"
msgstr ""
msgstr "Pentru a activa verificarea înregistrării, editați tunelul și setați numele (sau numele site-ului) la un nume de gazdă valabil care se încheie în „.i2p”"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
@@ -2107,7 +2107,7 @@ msgstr "Acest lucru permite conexiunile cit TCP atât si UDP să se facă printr
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Un tunel client de punere în aplicare protocolul SOCKS, care este personalizat pentru conectarea la retele de IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2232,7 +2232,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Acest lucru poate fi util pentru tuneluri utilizate frecvent (mai ales tuneluri server), dar pentru tuneluri care sunt utilizate doar ocazional, aceasta ar însemna că router-ul I2P creaza și menține tuneluri inutile."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: zzzi2p\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Roman 'Kaktuxista' Benji <romanbeno273@gmail.com>, 2014\n"
"Language-Team: Slovak (http://www.transifex.com/otf/I2P/language/sk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -2111,7 +2111,7 @@ msgstr "Toto umožňuje aj TCP aj UDP pripojeniam byť vytvorenými prostredníc
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Klientský tunel implementujúci protokol SOCKS, ktorý je špeciálne určený na pripájanie sa k IRC sieťam."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2236,7 +2236,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "To môže byť užitočné pre často používané tunely (obvlášť serverové tunely), avšak pre tunely používané len príležitostne by to pre I2P router znamenalo vytvorenie a udržiavanie zbytočných tunelov."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -19,8 +19,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2022-01-22 09:36+0000\n"
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>, 2016-2017,2021-2022\n"
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -70,14 +70,14 @@ msgstr "högre bandbredd och pålitlighet"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:615
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1093
msgid "Tunnels are not initialized yet, please reload in two minutes."
msgstr "Tunnlar har inte initierats ännu, vänligen uppdatera om två minuter."
msgstr "Tunnlar har inte initierats ännu, uppdatera om två minuter."
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:314
msgid ""
"Invalid form submission, probably because you used the 'back' or 'reload' "
"button on your browser. Please resubmit."
msgstr "Ogiltig formulärbegäran, troligen för att du använde knappen \"tillbaka\" eller \"uppdatera\" i din webbläsare. Vänligen skicka igen."
msgstr "Ogiltig formulärbegäran, troligen för att du använde knappen \"tillbaka\" eller \"uppdatera\" i din webbläsare. Försök att skicka igen."
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:189
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:316
@@ -1157,7 +1157,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
msgid "Encrypted"
msgstr ""
msgstr "Krypterat"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
msgid "Prevents server discovery by floodfills"
@@ -2110,7 +2110,7 @@ msgstr "Detta möjliggör både TCP- och UDP-anslutningar kan göras genom en SO
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "En klienttunnel som implementerar SOCKS-protokollet, som är anpassat för anslutning till IRC-nätverk."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2235,7 +2235,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Detta kan vara användbart för tunnlar som används ofta (tex server-tunnlar) men för tunnlar som används sällan innebär det att onödiga tunnlar upprättas. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2022-02-03 06:28+0000\n"
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>, 2016-2022\n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -103,20 +103,20 @@ msgstr "Yeni Tünel"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:444
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:530
msgid "Port not set"
msgstr "Kapı numarası ayarlanmamış"
msgstr "Bağlantı noktası ayarlanmamış"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:532
msgid "Invalid port"
msgstr "Kapı numarası geçersiz"
msgstr "Bağlantı noktası geçersiz"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
msgid "Warning - ports less than 1024 are not recommended"
msgstr "Uyarı - 1024 altındaki kapı numaralarının kullanılması önerilmez"
msgstr "Uyarı - 1024 altındaki bağlantı noktalarının kullanılması önerilmez"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:437
msgid "Warning - duplicate port"
msgstr "Uyarı - Çift kapı numarası"
msgstr "Uyarı - Çift bağlantı noktası"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
msgid "Standard client"
@@ -290,7 +290,7 @@ msgstr "Erişim Noktası"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696
msgid "Port"
msgstr "Kapı numarası"
msgstr "Bağlantı noktası"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:312
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:336
@@ -305,7 +305,7 @@ msgstr "zorunlu"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1177
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:512
msgid "Specify the local port this service should be accessible from"
msgstr "Bu hizmete erişilebilecek yerel kapı numarasını yazın"
msgstr "Bu hizmete erişilebilecek yerel bağlantı noktasını yazın"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:330
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1020
@@ -397,7 +397,7 @@ msgstr "Tünelin .i2p adresini ya da hedefini (b32 ya da b64) buraya yazın."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:446
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:439
msgid "name, name:port, or destination"
msgstr "ad, ad:kapı numarası ya da hedef"
msgstr "ad, ad:bağlantı noktası ya da hedef"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:452
msgid "b32 not recommended"
@@ -702,7 +702,7 @@ msgstr "Bu seçenek etkinleştirildiğinde, tüneller yalnızca gerektiğinde a
msgid ""
"Delay opening client tunnel until activity is detected on the configured "
"tunnel port"
msgstr "Bu seçenek etkinleştirildiğinde, istemci tünelinin açılması yapılandırılan tünel kapısında bir işlem algılanana kadar geciktirilir"
msgstr "Bu seçenek etkinleştirildiğinde, istemci tünelinin açılması yapılandırılan tünel bağlantı noktasında bir işlem algılanana kadar geciktirilir"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:730
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2278
@@ -980,7 +980,7 @@ msgstr "I2CO Sunucu Adı ya da IP Adresi"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1028
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2404
msgid "I2CP Port Number"
msgstr "I2CP Kapı Numarası"
msgstr "I2CP Bağlantı Noktası"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1036
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2412
@@ -1029,7 +1029,7 @@ msgstr "Bu ayarı değiştirebilmek için gizli hizmetin durdurulması gerekir"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1178
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:489
msgid "Specify the port the server is running on"
msgstr "Sunucunun çalıştığı yerel kapı numarasını yazın"
msgstr "Sunucunun çalıştığı yerel bağlantı noktasını yazın"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1193
msgid ""
@@ -1046,7 +1046,7 @@ msgstr "Hedefe bağlanmak için SSL kullanılsın"
msgid ""
"Port required to access service (this can be a different port to the port "
"the service is hosted on)"
msgstr "Hizmete erişmek için kullanılacak kapı numarası (barındırılan hizmetin kapı numarasından farklı olabilir)"
msgstr "Hizmete erişmek için kullanılacak bağlantı noktası (barındırılan hizmetin bağlantı noktasından farklı olabilir)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1232
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:540
@@ -1133,7 +1133,7 @@ msgstr "Gidiş"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1721
msgid "Encrypt Leaseset"
msgstr "Kiralama Kümesini Şifrele"
msgstr "Kiralama Kümesi'ni Şifrele"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1730
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1740
@@ -1372,7 +1372,7 @@ msgstr "Sunucu Hızını Yavaşlatma"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300
msgid "Inbound connection limits"
msgstr "Gelen bağlantı sınırları"
msgstr "Gel bağlantısı sınırları"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2302
msgid "Per Minute"
@@ -1705,7 +1705,7 @@ msgstr "Kayıt Yardımcısı"
msgid ""
"This service uses encrypted leasesets. Registration is not recommended. "
"Registration authentication is disabled."
msgstr "Bu hizmet şifrelenmiş kiralama kümeleri kullanır. Kayıt olmak gerekmez. Kayıt kimliği doğrulaması devre dışıdır."
msgstr "Bu hizmet Şifrelenmiş Kiralama Kümeleri kullanır. Kayıt olmak gerekmez. Kayıt kimliği doğrulaması devre dışıdır."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:246
msgid ""
@@ -1905,11 +1905,11 @@ msgstr "Alt Base32"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:706
msgid "Incoming I2P Port Routing"
msgstr "Gelen I2P Kapı Numarası Yöneltmesi"
msgstr "Gel I2P Bağlantı Noktası Yöneltmesi"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:708
msgid "I2P Port"
msgstr "I2P Kapı Numarası"
msgstr "I2P Bağlantı Noktası"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:710
msgid "Virtual Host"
@@ -1998,7 +1998,7 @@ msgstr "Tünel hedefi"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
msgid "Binding address and port"
msgstr "Bağlanılacak adres ve kapı numarası"
msgstr "Bağlanılacak adres ve bağlantı noktası"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:711
@@ -2201,11 +2201,11 @@ msgstr "Çalıştırdığınız hizmetin IP adresi. Genellikle aynı bilgisayard
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:485
msgid "This is the port that the service is accepting connections on."
msgstr "Hizmetin bağlantıları kabul edeceği kapı numarası."
msgstr "Hizmetin bağlantıları kabul edeceği bağlantı noktası."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:508
msgid "This is the port that the client tunnel will be accessed from locally."
msgstr "İstemci tüneline yerel olarak erişilebilecek kapı numarası."
msgstr "İstemci tüneline yerel olarak erişilebilecek bağlantı noktası."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
msgid ""
@@ -2276,7 +2276,7 @@ msgstr "Bağlanacak adres"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:688
msgid "Tunnel port"
msgstr "Tünel kapı numarası"
msgstr "Tünel bağlantı noktası"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:722
msgid ""

View File

@@ -16,8 +16,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: Maxym Mykhalchuk\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: samalero <ivan.barabash96@mail.ru>, 2017\n"
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -203,7 +203,7 @@ msgstr "Редагувати прихований сервіс"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:184
msgid "Are you sure you want to delete?"
msgstr ""
msgstr "Ви справді хочете вилучити?"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:208
msgid "Edit proxy settings"
@@ -1226,7 +1226,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1886
msgid "Revoke"
msgstr ""
msgstr "Відкликати"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1888
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1925
@@ -1751,7 +1751,7 @@ msgstr "Локальна адреса призначення недоступн
msgid ""
"To enable registration verification, edit tunnel and set name (or website "
"name) to a valid hostname ending in '.i2p'"
msgstr ""
msgstr "Для активації реєстраційної перевірки змініть тунель і встановіть назву (чи назву сайту) з правильним суфіксом '.i2p'"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
@@ -2117,7 +2117,7 @@ msgstr "Це дозволяє як TCP, так і UDP з’єднання чер
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customized for "
"connecting to IRC networks."
msgstr ""
msgstr "Клієнтський тунель, що реалізує протокол SOCKS, налаштований для з’єднання з мережами IRC."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
msgid ""
@@ -2242,7 +2242,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "Це може бути корисно для часто використовуваних тунелів (особливо серверних тунелів), але для тунелів які використовуються тільки іноді це означатиме що маршрутизатор I2P створює і підтримує зайві тунелі."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

View File

@@ -6,6 +6,7 @@
# Translators:
# Beta Ba <linsui@inbox.lv>, 2020
# ducki2p <ducki2p@gmail.com>, 2011
# Fosworn D4, 2022
# gzs, 2019
# a7c0396e818c2941c33529bda1f6bf1b_d554568 <93d1ed349b85f9981f2c90624c315cde_129513>, 2013
# xkimo_daeee <michael_ies@yahoo.com>, 2014
@@ -27,8 +28,8 @@ msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
"Last-Translator: YFdyh000 <yfdyh000@gmail.com>\n"
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
"Last-Translator: Fosworn D4, 2022\n"
"Language-Team: Chinese (China) (http://www.transifex.com/otf/I2P/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -549,40 +550,40 @@ msgstr "无随机性,恒定性能"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1486
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1576
msgid "+ 0-1 hop variance"
msgstr ""
msgstr "+ 0-1 跳点变化幅度"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:600
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1487
msgid "medium randomization, lower performance"
msgstr ""
msgstr "中等随机性,更低性能"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:604
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1491
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1580
msgid "+ 0-2 hop variance"
msgstr ""
msgstr "+ 0-2 跳点变化幅度"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:605
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1492
msgid "high randomization, very low performance"
msgstr ""
msgstr "高随机性,极低性能"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:609
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1496
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1584
msgid "+/- 0-1 hop variance"
msgstr ""
msgstr "+/- 0-1 跳点变化幅度"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:610
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1497
msgid "standard randomization, standard performance"
msgstr ""
msgstr "标准随机性,标准性能"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:614
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1501
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1588
msgid "+/- 0-2 hop variance"
msgstr ""
msgstr "+/- 0-2 跳点变化幅度"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:615
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1502
@@ -647,22 +648,22 @@ msgstr[0] "{0} 备份隧道"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:650
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1635
msgid "no redundancy, no added resource usage"
msgstr ""
msgstr "无冗余,不增加资源占用"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:655
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1640
msgid "low redundancy, low resource usage"
msgstr ""
msgstr "低冗余,低资源占用"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:660
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1645
msgid "medium redundancy, medium resource usage"
msgstr ""
msgstr "中等冗余,中等资源占用"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:665
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1650
msgid "high redundancy, high resource usage"
msgstr ""
msgstr "高冗余,高资源占用"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:679
msgid "Tunnel Management Options"
@@ -873,7 +874,7 @@ msgstr "允许 SSL 到 I2P 地址簿"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:881
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2014
msgid "Configuration cannot be changed after destination is created"
msgstr ""
msgstr "一旦目标被创建后配置将不能被更改"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:886
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1719
@@ -1034,7 +1035,7 @@ msgstr "新服务设置"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1138
msgid "The hidden service must be stopped to change this setting"
msgstr ""
msgstr "为更改此设置,隐藏服务必须被停止"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1178
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:489
@@ -1196,12 +1197,12 @@ msgstr "单独发送密钥给每个用户。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1796
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1809
msgid "Encrypted with per-user key"
msgstr ""
msgstr "用按用户密钥加密"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1803
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1816
msgid "Encrypted with lookup password and per-user key"
msgstr ""
msgstr "用查找密码和按用户密钥加密"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1805
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1811
@@ -1218,7 +1219,7 @@ msgstr "加密密钥"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1872
msgid "Encryption key required to access this service"
msgstr ""
msgstr "需要加密密钥来访问这个服务器"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1886
msgid "Revoke"
@@ -1245,7 +1246,7 @@ msgstr "添加"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2055
msgid "Recommended for blinded and encrypted destinations"
msgstr ""
msgstr "推荐匿名和加密的目标"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2097
msgid "Alternate private key file"
@@ -1257,11 +1258,11 @@ msgstr "备用本地目的地"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2113
msgid "Read Only: Alternate Local Destination"
msgstr ""
msgstr "只读:可选的本地目标"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2172
msgid "Tunnel Access Control Options"
msgstr ""
msgstr "隧道地址控制选项"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2174
msgid "Restricted Access List"
@@ -1309,7 +1310,7 @@ msgstr "格式规范"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2208
msgid "Absolute path to file containing filter definition"
msgstr ""
msgstr "包含过滤目标的文件绝对地址"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2212
msgid "Server Access Options"
@@ -1363,11 +1364,11 @@ msgstr "隧道性能选项"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2286
msgid "Number of tunnels to keep open to maintain availability of service"
msgstr ""
msgstr "许多隧道保持开放来保持服务的有效性"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2292
msgid "Period of inactivity before tunnel number is reduced"
msgstr ""
msgstr "隧道数量减少前的非活动期"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2296
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2366
@@ -1382,7 +1383,7 @@ msgstr "服务器节流"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300
msgid "Inbound connection limits"
msgstr ""
msgstr "入站连接限制"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2302
msgid "Per Minute"
@@ -1403,7 +1404,7 @@ msgstr "每个客户端"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2311
msgid "unlimited"
msgstr ""
msgstr "无限制"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2314
msgid ""
@@ -1415,13 +1416,13 @@ msgstr "在对服务器的访问被阻挡之前,每分钟用于唯一客户端
msgid ""
"Maximum number of web page requests per hour for a unique client before "
"access to the server is blocked"
msgstr ""
msgstr "在对服务器的访问被阻挡之前,每小时用于唯一客户端的最大网页请求数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2322
msgid ""
"Maximum number of web page requests per day for a unique client before "
"access to the server is blocked"
msgstr ""
msgstr "在对服务器的访问被阻挡之前,每天用于唯一客户端的最大网页请求数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2326
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2368
@@ -1432,23 +1433,23 @@ msgstr "总数"
msgid ""
"Total number of web page requests per minute before access to the server is "
"blocked"
msgstr ""
msgstr "在对服务器的访问被阻挡之前,每分钟用于唯一客户端的总网页请求数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2332
msgid ""
"Total number of web page requests per hour before access to the server is "
"blocked"
msgstr ""
msgstr "在对服务器的访问被阻挡之前,每小时用于唯一客户端的总网页请求数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2336
msgid ""
"Total number of web page requests per day before access to the server is "
"blocked"
msgstr ""
msgstr "在对服务器的访问被阻挡之前,每天用于唯一客户端的总网页请求数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2340
msgid "Max concurrent connections"
msgstr ""
msgstr "最大并发连接数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2342
msgid "Maximum number of simultaneous client connections"
@@ -1476,17 +1477,17 @@ msgstr "配置的时间跨度中用于唯一客户端的最大网页请求数"
msgid ""
"If a client exceeds the maximum number of post requests per allocated "
"period, enforce a ban for this number of minutes"
msgstr ""
msgstr "如果一个客户端提交的 POST 请求数量超过了每分配时段的最大 POST 请求数量,那么服务端将会强制执行该数量的分钟数的封禁"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2370
msgid "Total number of post requests permitted for the configured time span"
msgstr ""
msgstr "配置的时间跨度中被允许的总 POST 请求数"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2374
msgid ""
"If the maximum number of post requests per allocated period is exceeded, "
"enforce a global access ban for this number of minutes"
msgstr ""
msgstr "如果提交的 POST 请求数量超过了每分配时段的最大 POST 请求数量,那么服务端将会强制执行该数量的分钟数的全局封禁"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2380
msgid "POST limit period"
@@ -1496,7 +1497,7 @@ msgstr "POST 限制时长"
msgid ""
"Time span for the maximum number of post requests to be reached before a ban"
" is triggered"
msgstr ""
msgstr "在实施封禁之前达到的最大 POST 请求数的时间跨度"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2435
msgid "Tunnels not initialized yet; please retry in a few moments."
@@ -1644,11 +1645,11 @@ msgstr "主机名"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
msgid "Share your site using the hostname"
msgstr ""
msgstr "通过主机名来分享您的站点"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433
msgid "Copy the hostname to the clipboard"
msgstr ""
msgstr "将该主机名复制到剪贴板上"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436
msgid "Copy Hostname"
@@ -1715,7 +1716,7 @@ msgstr "注册助手"
msgid ""
"This service uses encrypted leasesets. Registration is not recommended. "
"Registration authentication is disabled."
msgstr ""
msgstr "这个服务使用了加密的租契集。我们不推荐您注册,因为注册认证已被关闭。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:246
msgid ""
@@ -1747,14 +1748,14 @@ msgstr "本地目标不可用。启动隧道。"
msgid ""
"To enable registration verification, edit tunnel and set name (or website "
"name) to a valid hostname ending in '.i2p'"
msgstr ""
msgstr "为注册验证,编辑隧道并设置名称(或网站名称)为一个有效的以 '.i2p' 结尾的主机名"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
msgid ""
"To enable registration verification, edit tunnel and set name to a valid "
"hostname ending in '.i2p'"
msgstr ""
msgstr "要启用注册验证,请编辑隧道并设置一个名称为以 '.i2p' 结尾的有效主机名"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:294
msgid "Destination signing key is not available. Start the tunnel."
@@ -1763,12 +1764,12 @@ msgstr "目标签名密钥不可用。开始隧道。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:300
msgid ""
"Destination signing key is offline. Use CLI tools on the offline machine."
msgstr ""
msgstr "目标签名密钥已离线。请在离线机器上使用 CLI 工具。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:310
#, java-format
msgid "Authentication for adding host {0}"
msgstr ""
msgstr "添加主机{0}认证"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:312
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:327
@@ -1788,7 +1789,7 @@ msgstr "高级认证字符串"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:325
#, java-format
msgid "Authentication for removing host {0}"
msgstr ""
msgstr "移除主机{0}认证"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:356
msgid "Authentication for changing name"
@@ -1802,7 +1803,7 @@ msgstr "这将更改名称 {0} 至 {1},使用同一个目标"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:376
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:409
msgid "This tunnel must be configured with the new hostname."
msgstr ""
msgstr "此隧道必须使用新的主机名称配置。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:378
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:411
@@ -1899,7 +1900,7 @@ msgstr "生成"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:182
msgid "SSL Helper"
msgstr ""
msgstr "SSL 助手"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:653
msgid "Experts only!"
@@ -1915,7 +1916,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:706
msgid "Incoming I2P Port Routing"
msgstr ""
msgstr "传入 I2P 端口路由"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:708
msgid "I2P Port"
@@ -2145,11 +2146,11 @@ msgstr "为HTTP连接而调整的服务隧道。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:328
msgid "Use this tunnel type if you want to host an I2P Site."
msgstr ""
msgstr "如果您想要创建一个 I2P 网站请使用此隧道类型。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:330
msgid "A customized server tunnel for hosting IRC networks inside I2P."
msgstr ""
msgstr "一个为在 I2P 内部主持 IRC 网络而设立的自定义服务器隧道"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:332
msgid ""
@@ -2197,7 +2198,7 @@ msgstr "请输入该客户端隧道应连接的 I2P 服务目标。"
msgid ""
"This could be the full Base64 destination key, or an I2P URL from your "
"address book."
msgstr ""
msgstr "这可能是一个完整的 Base64 编码的目标密钥或您地址簿中的一个 I2P URL。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:435
msgid "Enter a b64 or .i2p address here"
@@ -2238,7 +2239,7 @@ msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occasionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
msgstr "这适用于经常使用的隧道(尤其是服务端隧道)但如果隧道仅偶尔使用会不必要地占用I2P的资源。"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "The wizard has now collected enough information to create your tunnel."

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
Apache Tomcat
Copyright 1999-2021 The Apache Software Foundation
Copyright 1999-2022 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More