diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/build.xml i2p-0.9.50/apps/BOB/Demos/echo/echoclient/build.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/build.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/build.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ - - - - - - Builds, tests, and runs the project echoclient. - - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/client.sh i2p-0.9.50/apps/BOB/Demos/echo/echoclient/client.sh --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/client.sh 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/client.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -#!/bin/bash -( -cd dist -java -jar echoclient.jar main 37338 testclient $1 -) diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/manifest.mf i2p-0.9.50/apps/BOB/Demos/echo/echoclient/manifest.mf --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/manifest.mf 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/manifest.mf 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/build-impl.xml i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/build-impl.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/build-impl.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/build-impl.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,629 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/genfiles.properties i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/genfiles.properties --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/genfiles.properties 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/genfiles.properties 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -build.xml.data.CRC32=8ce3cee9 -build.xml.script.CRC32=d1de2df3 -build.xml.stylesheet.CRC32=be360661 -# 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=8ce3cee9 -nbproject/build-impl.xml.script.CRC32=22d1fbbb -nbproject/build-impl.xml.stylesheet.CRC32=487672f9 diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/private/private.properties i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/private/private.properties --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/private/private.properties 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/private/private.properties 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -jaxws.endorsed.dir=/usr/local/netbeans-6.1/java2/modules/ext/jaxws21/api -user.properties.file=/root/.netbeans/6.1/build.properties diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/private/private.xml i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/private/private.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/private/private.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/private/private.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - file:/root/NetBeansProjects/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/project.properties i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/project.properties --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/project.properties 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/project.properties 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -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 -# 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}/echoclient.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -file.reference.BOB.jar=../../../dist/BOB.jar -includes=** -jar.compress=false -javac.classpath= -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.source=1.5 -javac.target=1.5 -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= -main.class=net.i2p.BOB.Demos.echo.echoclient.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 diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/project.xml i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/project.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/nbproject/project.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/nbproject/project.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - echoclient - 1.6.5 - - - - - - - - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java i2p-0.9.50/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java --- i2p-0.9.49/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,193 +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.Demos.echo.echoclient; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author sponge - */ -public class Main { - - public static String Lread(InputStream in) throws IOException { - String S; - int b; - char c; - - S = new String(); - - 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 - S = new String(S + c); - } - return S; - } - - /** - * Check for "ERROR" and if so, throw RuntimeException - * @param line - * @throws java.lang.RuntimeException - */ - static void checkline(String line) throws RuntimeException { - System.out.println(line); // print status - if(line.startsWith("ERROR")) { - throw new RuntimeException(line); - } - } - - static void wrtxt(OutputStream CMDout, String s) throws IOException { - CMDout.write(DataHelper.getUTF8(s)); - CMDout.write('\n'); - CMDout.flush(); - } - - static void setupconn(String[] args) throws UnknownHostException, IOException, RuntimeException { - String line; - Socket CMDsock = new Socket("localhost", 0xB0B); - InputStream CMDin = CMDsock.getInputStream(); - OutputStream CMDout = CMDsock.getOutputStream(); - // setup the tunnel. - line = Lread(CMDin); - System.out.println(line); // print the banner - line = Lread(CMDin); - System.out.println(line); // print initial status, should always be "OK" - try { - wrtxt(CMDout, "status " + args[2]); - line = Lread(CMDin); // get the status of this nickname, if it's an error, create it - checkline(line); - } catch(RuntimeException rte) { - wrtxt(CMDout, "setnick " + args[2]); - line = Lread(CMDin); // create a new nickname - checkline(line); - wrtxt(CMDout, "newkeys"); - line = Lread(CMDin); // set up new keys - checkline(line); - wrtxt(CMDout, "inport " + args[1]); - line = Lread(CMDin); // set the port we connect in on - checkline(line); - } - wrtxt(CMDout, "getnick " + args[2]); - line = Lread(CMDin); // Set to our nick - try { - checkline(line); - } catch(RuntimeException rte) { - System.out.println("Continuing on existing tunnel.."); - return; - } - wrtxt(CMDout, "start"); - line = Lread(CMDin); // an error here is OK - System.out.println(line); // print status - CMDsock.close(); // we no longer need this particular socket - - } - - static void deleteconn(String[] args) throws UnknownHostException, IOException, RuntimeException { - String line; - // Wait for things to flush - try { - Thread.sleep(10000); - } catch(InterruptedException ex) { - // nop - } - Socket CMDsock = new Socket("localhost", 0xB0B); - InputStream CMDin = CMDsock.getInputStream(); - OutputStream CMDout = CMDsock.getOutputStream(); - // delete the tunnel. - line = Lread(CMDin); - System.out.println(line); // print the banner - line = Lread(CMDin); - System.out.println(line); // print initial status, should always be "OK" - wrtxt(CMDout, "getnick " + args[2]); // Set to our nick - line = Lread(CMDin); - checkline(line); - wrtxt(CMDout, "stop"); - line = Lread(CMDin); - checkline(line); - try { - Thread.sleep(2000); //sleep for 2000 ms (Two seconds) - } catch(Exception e) { - // nop - } - - wrtxt(CMDout, "clear"); - line = Lread(CMDin); - while(line.startsWith("ERROR")) { - wrtxt(CMDout, "clear"); - line = Lread(CMDin); - } - System.out.println(line); // print status - CMDsock.close(); // we no longer need this particular socket - - } - - static void chatter(String[] args) throws UnknownHostException, IOException, RuntimeException { - String line; - Socket sock = new Socket("localhost", Integer.parseInt(args[1])); - InputStream in = sock.getInputStream(); - OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream()); - out.write(args[3] + "\n"); // send out the i2p address to connect to - out.flush(); - System.out.println("Connecting to " + args[3]); - line = Lread(in); // get server greeting - System.out.println("Got " + line); // show user - out.write("Test complete.\n"); // send something back - out.flush(); // make sure it's sent. - sock.close(); // done. - } - - /** - * - * @param args tunnelport tunnelnickname I2Pdestkey - */ - public static void main(String[] args) { - // I'm lazy, and want to exit on any failures. - try { - setupconn(args); // talk to BOB, set up an outbound port - chatter(args); // talk over the connection - - } catch(UnknownHostException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - try { - deleteconn(args); - } catch(UnknownHostException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(RuntimeException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - } -} diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/build.xml i2p-0.9.50/apps/BOB/Demos/echo/echoserver/build.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/build.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/build.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ - - - - - - Builds, tests, and runs the project echoserver. - - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/manifest.mf i2p-0.9.50/apps/BOB/Demos/echo/echoserver/manifest.mf --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/manifest.mf 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/manifest.mf 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/build-impl.xml i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/build-impl.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/build-impl.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/build-impl.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,629 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/genfiles.properties i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/genfiles.properties --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/genfiles.properties 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/genfiles.properties 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -build.xml.data.CRC32=4ce39738 -build.xml.script.CRC32=c1deb82c -build.xml.stylesheet.CRC32=be360661 -# 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=4ce39738 -nbproject/build-impl.xml.script.CRC32=555cdd2d -nbproject/build-impl.xml.stylesheet.CRC32=487672f9 diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/private/private.properties i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/private/private.properties --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/private/private.properties 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/private/private.properties 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -jaxws.endorsed.dir=/usr/local/netbeans-6.1/java2/modules/ext/jaxws21/api -user.properties.file=/root/.netbeans/6.1/build.properties diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/private/private.xml i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/private/private.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/private/private.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/private/private.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - file:/root/NetBeansProjects/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/project.properties i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/project.properties --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/project.properties 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/project.properties 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -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 -# 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}/echoserver.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -file.reference.BOB.jar=../../../dist/BOB.jar -includes=** -jar.compress=false -javac.classpath= -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.source=1.5 -javac.target=1.5 -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= -main.class=net.i2p.BOB.Demos.echo.echoserver.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 diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/project.xml i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/project.xml --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/nbproject/project.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/nbproject/project.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - echoserver - 1.6.5 - - - - - - - - - diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/server.sh i2p-0.9.50/apps/BOB/Demos/echo/echoserver/server.sh --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/server.sh 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/server.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -( -cd dist -java -jar echoserver.jar main 37337 testserver -) diff -Nru i2p-0.9.49/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java i2p-0.9.50/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java --- i2p-0.9.49/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,189 +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.Demos.echo.echoserver; - -import java.io.BufferedOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author sponge - */ -public class Main { - public static String Lread(InputStream in) throws IOException { - String S; - int b; - char c; - - S = new String(); - - while(true) { - b = in.read(); - if(b < 20) { - break; - } - c = (char)(b & 0x7f); // We only care about ASCII - S = new String(S + c); - } - return S; - } - - /** - * Check for "ERROR" and if so, throw RuntimeException - * @param line - * @throws java.lang.RuntimeException - */ - static void checkline(String line) throws RuntimeException { - System.out.println(line); // print status - if(line.startsWith("ERROR")) { - throw new RuntimeException(line); - } - } - - static void wrtxt(OutputStream CMDout, String s) throws IOException { - CMDout.write(DataHelper.getUTF8(s)); - CMDout.write('\n'); - CMDout.flush(); - } - - static void setupconn(String[] args) throws UnknownHostException, IOException, RuntimeException { - String line; - Socket CMDsock = new Socket("localhost", 0xB0B); - InputStream CMDin = CMDsock.getInputStream(); - OutputStream CMDout = CMDsock.getOutputStream(); - // setup the tunnel. - line = Lread(CMDin); - System.out.println(line); // print the banner - line = Lread(CMDin); - System.out.println(line); // print initial status, should always be "OK" - try { - wrtxt(CMDout, "status " + args[2]); - line =Lread(CMDin); // get the status of this nickname, if it's an error, create it - checkline(line); - } catch(RuntimeException rte) { - wrtxt(CMDout, "setnick " + args[2]); - line =Lread(CMDin); // create a new nickname - checkline(line); - wrtxt(CMDout, "newkeys "); - line =Lread(CMDin); // set up new keys - checkline(line); - wrtxt(CMDout, "outport " + args[1]); - line = Lread(CMDin); // set the port we connect out on - checkline(line); - } - wrtxt(CMDout, "getnick " + args[2]); - line = Lread(CMDin); // Set to our nick - checkline(line); - wrtxt(CMDout, "start "); - line = Lread(CMDin); // an error here is OK - System.out.println(line); // print status - CMDsock.close(); // we no longer need this particular socket - - } - - static void deleteconn(String[] args) throws UnknownHostException, IOException, RuntimeException { - String line; - Socket CMDsock = new Socket("localhost", 0xB0B); - InputStream CMDin = CMDsock.getInputStream(); - OutputStream CMDout = CMDsock.getOutputStream(); - // delete the tunnel. - line = Lread(CMDin); - System.out.println(line); // print the banner - line = Lread(CMDin); - System.out.println(line); // print initial status, should always be "OK" - wrtxt(CMDout, "getnick " + args[2]); // Set to our nick - line = Lread(CMDin); - checkline(line); - wrtxt(CMDout, "stop"); - line = Lread(CMDin); - checkline(line); - try { - Thread.sleep(2000); //sleep for 2000 ms (Two seconds) - } catch(Exception e) { - // nop - } - - wrtxt(CMDout, "clear"); - line = Lread(CMDin); - while(line.startsWith("ERROR")) { - wrtxt(CMDout, "clear"); - line = Lread(CMDin); - } - System.out.println(line); // print status - CMDsock.close(); // we no longer need this particular socket - - } - - static void chatter(Socket sock) throws UnknownHostException, IOException, RuntimeException { - String line; - InputStream in = sock.getInputStream(); - OutputStreamWriter out = new OutputStreamWriter(new BufferedOutputStream(sock.getOutputStream())); - - line = Lread(in); // get remote I2P address - System.out.println("Connect from: " + line); // show user - - out.write("Hello, You are connecting from " + line + "\n"); // send greeting - out.flush(); // make sure it's sent. - line = Lread(in); // get test text from client - System.out.println("Got "+line); // show user - sock.close(); // done. - } - - private static void serverlistener(String[] args) throws UnknownHostException, IOException, RuntimeException { - ServerSocket listener = new ServerSocket(Integer.parseInt(args[1]), 10, InetAddress.getByName("localhost")); - Socket server; - - while(true) { - server = listener.accept(); - chatter(server); - } - } - - /** - * - * @param args tunnelport tunnelnickname - */ - public static void main(String[] args) { - // I'm lazy, and want to exit on any failures. - try { - setupconn(args); // talk to BOB, set up an inbound port - serverlistener(args); // talk over the connection - - } catch(UnknownHostException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - try { - deleteconn(args); - } catch(UnknownHostException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(RuntimeException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - } -} diff -Nru i2p-0.9.49/apps/desktopgui/locale/messages_zh.po i2p-0.9.50/apps/desktopgui/locale/messages_zh.po --- i2p-0.9.49/apps/desktopgui/locale/messages_zh.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/desktopgui/locale/messages_zh.po 2021-05-19 12:11:55.000000000 +0000 @@ -5,6 +5,7 @@ # # Translators: # ducki2p , 2011 +# Scott Rhodes , 2021 # walking , 2011 # YFdyh000 , 2016 msgid "" @@ -12,8 +13,8 @@ "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-05-25 12:29+0000\n" -"PO-Revision-Date: 2019-06-20 03:18+0000\n" -"Last-Translator: Beta Ba \n" +"PO-Revision-Date: 2021-03-07 07:58+0000\n" +"Last-Translator: Scott Rhodes \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" @@ -29,7 +30,7 @@ #: src/net/i2p/desktopgui/ExternalTrayManager.java:44 #: src/net/i2p/desktopgui/ExternalTrayManager.java:72 msgid "I2P is starting!" -msgstr "正在启动 I2P !" +msgstr " I2P 正在启动!" #: src/net/i2p/desktopgui/ExternalTrayManager.java:44 #: src/net/i2p/desktopgui/ExternalTrayManager.java:72 diff -Nru i2p-0.9.49/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java i2p-0.9.50/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java --- i2p-0.9.49/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java 2021-05-19 12:11:55.000000000 +0000 @@ -140,6 +140,7 @@ public static final String RC_PROP_UNIVERSAL_THEMING = "routerconsole.universal.theme"; public static final String PROP_THEME = "i2psnark.theme"; public static final String DEFAULT_THEME = "ubergine"; + private static final String[] THEMES = new String[] { "dark", "light", "ubergine", "vanilla" }; /** From CSSHelper */ private static final String PROP_DISABLE_OLD = "routerconsole.disableOldThemes"; private static final boolean DEFAULT_DISABLE_OLD = true; @@ -913,29 +914,8 @@ * Get all themes * @return String[] -- Array of all the themes found, non-null, unsorted */ - public String[] getThemes() { - String[] themes; - if (_context.isRouterContext()) { - File dir = new File(_context.getBaseDir(), "docs/themes/snark"); - FileFilter fileFilter = new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }; - File[] dirnames = dir.listFiles(fileFilter); - if (dirnames != null) { - List th = new ArrayList(dirnames.length); - boolean skipOld = _context.getProperty(PROP_DISABLE_OLD, DEFAULT_DISABLE_OLD); - for (int i = 0; i < dirnames.length; i++) { - String name = dirnames[i].getName(); - if (skipOld && (name.equals("midnight") || name.equals("classic"))) - continue; - th.add(name); - } - themes = th.toArray(new String[th.size()]); - } else { - themes = new String[0]; - } - } else { - themes = new String[] { "dark", "light", "ubergine", "vanilla" }; - } - return themes; + public static String[] getThemes() { + return THEMES; } diff -Nru i2p-0.9.49/apps/i2psnark/locale/messages_de.po i2p-0.9.50/apps/i2psnark/locale/messages_de.po --- i2p-0.9.49/apps/i2psnark/locale/messages_de.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/locale/messages_de.po 2021-05-19 12:11:55.000000000 +0000 @@ -13,7 +13,7 @@ # Ettore Atalan , 2014,2017 # foo , 2009 # SteinQuadrat, 2013 -# Lars Schimmer , 2014-2016,2018,2020 +# Lars Schimmer , 2014-2016,2018,2020-2021 # Max Muster , 2014 # mixxy, 2011 # nextloop , 2013 @@ -25,8 +25,8 @@ "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 14:30+0000\n" -"PO-Revision-Date: 2021-02-05 15:27+0000\n" -"Last-Translator: zzzi2p\n" +"PO-Revision-Date: 2021-05-05 16:54+0000\n" +"Last-Translator: Lars Schimmer \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" @@ -1532,7 +1532,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3198 msgid "Web Seeds" -msgstr "" +msgstr "Web Seeder" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Comment" diff -Nru i2p-0.9.49/apps/i2psnark/locale/messages_ja.po i2p-0.9.50/apps/i2psnark/locale/messages_ja.po --- i2p-0.9.49/apps/i2psnark/locale/messages_ja.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/locale/messages_ja.po 2021-05-19 12:11:55.000000000 +0000 @@ -5,14 +5,15 @@ # # Translators: # kami , 2014-2015 -# riopfga caetocla, 2020-2021 +# XMPPはいいぞ, 2020-2021 +# XMPPはいいぞ, 2021 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 14:30+0000\n" -"PO-Revision-Date: 2021-02-05 15:27+0000\n" -"Last-Translator: zzzi2p\n" +"PO-Revision-Date: 2021-05-14 01:18+0000\n" +"Last-Translator: XMPPはいいぞ\n" "Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,13 +23,13 @@ #: ../java/src/org/klomp/snark/IdleChecker.java:76 msgid "No more torrents running." -msgstr "これ以上のtorrentを稼働しないでください。" +msgstr "これ以上のトレントを稼働しないでください。" #: ../java/src/org/klomp/snark/IdleChecker.java:77 #: ../java/src/org/klomp/snark/SnarkManager.java:3060 #: ../java/src/org/klomp/snark/SnarkManager.java:3071 msgid "I2P tunnel closed." -msgstr "I2Pトンネルは閉じています。" +msgstr "I2Pトンネルは閉じました。" #: ../java/src/org/klomp/snark/MagnetURI.java:50 #: ../java/src/org/klomp/snark/MagnetURI.java:60 @@ -135,7 +136,7 @@ #: ../java/src/org/klomp/snark/SnarkManager.java:1241 msgid "Disconnecting old I2CP destination" -msgstr "古いI2CP送信先を切断しています" +msgstr "古いI2CP宛先を切断しています" #: ../java/src/org/klomp/snark/SnarkManager.java:1243 #, java-format @@ -194,7 +195,7 @@ #: ../java/src/org/klomp/snark/SnarkManager.java:1305 msgid "DHT change requires tunnel shutdown and reopen" -msgstr "DHTの変更には、トンネルのシャットダウンと再オープンが必要です" +msgstr "DHTの変更には、トンネルのシャットダウンと再開放が必要です" #: ../java/src/org/klomp/snark/SnarkManager.java:1312 msgid "Enabled Ratings." @@ -324,7 +325,7 @@ "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 "警告 - I2Pトラッカーは\"{0}\"になく、I2PオープントラッカーとDHTは無効なので、Torrentを開始する前にオープントラッカーまたはDHTを有効にする必要があります。" +msgstr "警告 - I2Pトラッカーは\"{0}\"になく、I2PオープントラッカーとDHTは無効なので、トレントを開始する前にオープントラッカーまたはDHTを有効にする必要があります。" #: ../java/src/org/klomp/snark/SnarkManager.java:1683 #, java-format @@ -386,7 +387,7 @@ #: ../java/src/org/klomp/snark/SnarkManager.java:2636 #, java-format msgid "Failed to copy torrent file to {0}" -msgstr "{0} へのtorrentファイルのコピーに失敗しました。" +msgstr "{0} へのトレントファイルのコピーに失敗しました。" #: ../java/src/org/klomp/snark/SnarkManager.java:2412 #, java-format @@ -401,17 +402,17 @@ #: ../java/src/org/klomp/snark/SnarkManager.java:2416 #, java-format msgid "No pieces in \"{0}\"!" -msgstr "\"{0}\"にピースがありません!" +msgstr "\"{0}\"に断片がありません!" #: ../java/src/org/klomp/snark/SnarkManager.java:2418 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}!" -msgstr "\"{0}\"にピースが多すぎます、上限は {1} です!" +msgstr "\"{0}\"に断片が多すぎます、上限は {1} です!" #: ../java/src/org/klomp/snark/SnarkManager.java:2420 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B)!" -msgstr "\"{0}\"ではピースが大きすぎます({1}B)!" +msgstr "\"{0}\"では断片が大きすぎます({1}B)!" #: ../java/src/org/klomp/snark/SnarkManager.java:2421 #, java-format @@ -431,7 +432,7 @@ #: ../java/src/org/klomp/snark/SnarkManager.java:2432 #, java-format msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" -msgstr "" +msgstr "{0}Bより大きいトレントは、まだサポートされていません \"{1}\" !" #: ../java/src/org/klomp/snark/SnarkManager.java:2449 #, java-format @@ -487,7 +488,7 @@ #: ../java/src/org/klomp/snark/SnarkManager.java:3018 msgid "Stopping all torrents and closing the I2P tunnel." -msgstr "全てのトレントを停止し、I2Pトンネルを閉じました。" +msgstr "全てのトレントを停止し、I2Pトンネルを閉じます。" #: ../java/src/org/klomp/snark/SnarkManager.java:3045 msgid "Closing I2P tunnel after notifying trackers." @@ -575,7 +576,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:321 msgid "Router is down" -msgstr "ルーターは落ちています" +msgstr "ルータは落ちています" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 #, java-format @@ -605,7 +606,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443 msgid "clear messages" -msgstr "メッセージ消去" +msgstr "通知消去" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:500 msgid "Status" @@ -686,7 +687,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 msgid "Uploaded" -msgstr "" +msgstr "アップロードした量" #. Translators: Please keep short or translate as " " #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 @@ -710,7 +711,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Stop all torrents and the I2P tunnel" -msgstr "全てのtorrentとI2Pトンネルを停止" +msgstr "全てのトレントとI2Pトンネルを停止" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 msgid "Stop All" @@ -761,7 +762,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 msgid "Our destination (identity) for this session" -msgstr "このセッションの destination (同一性)" +msgstr "このセッション用の宛先(同一性)" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:795 msgid "Dht Debug" @@ -954,7 +955,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3392 msgid "Allocating" -msgstr "" +msgstr "割当中" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 msgid "Tracker Error" @@ -986,7 +987,7 @@ #, java-format msgid "Seeding to {0} peer" msgid_plural "Seeding to {0} peers" -msgstr[0] "{0}個のピアへシード中" +msgstr[0] "{0}個のピアがシード中" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1742 @@ -1025,7 +1026,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1765 msgid "Stalled" -msgstr "停滞された" +msgstr "停滞" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 @@ -1043,7 +1044,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1776 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1777 msgid "Stopped" -msgstr "停止しました" +msgstr "停止" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1807 msgid "Torrent details" @@ -1064,7 +1065,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 msgid "complete" -msgstr "完了" +msgstr "完成" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3656 @@ -1074,7 +1075,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1886 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3260 msgid "Completed" -msgstr "完了しました" +msgstr "完結" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1924 msgid "Stop the torrent" @@ -1120,7 +1121,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2025 msgid "Destination (identity) of peer" -msgstr "ピアの destination(同一性)" +msgstr "ピアの宛先(同一性)" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2041 msgid "Seed" @@ -1128,19 +1129,19 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2067 msgid "Uninteresting (The peer has no pieces we need)" -msgstr "Uninteresting(そのピアは私たちが必要なピースを持ちません)" +msgstr "無関心中(そのピアは私たちが必要な断片を持ちません)" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2069 msgid "Choked (The peer is not allowing us to request pieces)" -msgstr "被チョーク(そのピアは、私たちがピースを要求することを許可していません)" +msgstr "被抑制(そのピアは、私たちが断片を要求することを許可していません)" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2089 msgid "Uninterested (We have no pieces the peer needs)" -msgstr "Uninterested(私たちはそのピアが必要なピースを持ちません)" +msgstr "被無関心(私たちはそのピアが必要な断片を持ちません)" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2091 msgid "Choking (We are not allowing the peer to request pieces)" -msgstr "チョーク中(私たちは、そのピアがピースを要求することを許可していません)" +msgstr "抑制中(私たちは、そのピアが断片を要求することを許可していません)" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207 #, java-format @@ -1252,7 +1253,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2443 msgid "Files readable by all" -msgstr "ファイルは全てに読み取り可能です" +msgstr "ファイルが全てに読み取り可能" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2447 msgid "" @@ -1268,7 +1269,7 @@ msgid "" "Automatically start torrents when added and restart torrents when I2PSnark " "starts" -msgstr "I2PSnarkが起動するとトレントの追加と再開をし、自動的にトレントを開始します" +msgstr "I2PSnarkが起動すると、トレントの追加と再開をし、自動的にトレントを開始します" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2459 msgid "Smart torrent sorting" @@ -1328,7 +1329,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 msgid "Startup delay" -msgstr "稼働開始を遅らせる" +msgstr "起動を遅らせる" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2551 msgid "How long before auto-started torrents are loaded when I2PSnark starts" @@ -1352,7 +1353,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2587 msgid "Total uploader limit" -msgstr "合計アップローダー制限" +msgstr "合計アップローダーの上限" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2591 msgid "Maximum number of peers for uploading" @@ -1364,7 +1365,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2597 msgid "Up bandwidth limit" -msgstr "上り帯域幅の制限" +msgstr "上り帯域幅の上限" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2601 msgid "Maximum bandwidth allocated for uploading" @@ -1376,7 +1377,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2606 msgid "View or change router bandwidth" -msgstr "ルーターの帯域幅を閲覧または変更" +msgstr "ルータの帯域幅を閲覧または変更" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2612 msgid "Use open trackers also" @@ -1386,7 +1387,7 @@ msgid "" "Announce torrents to open trackers as well as trackers listed in the torrent" " file" -msgstr "オープントラッカーだけでなく、トレントファイルに記載されているトラッカーにトレントをアナウンスします。" +msgstr "トレントファイルに記載されているトラッカーだけでなく、オープントラッカーにトレントをアナウンスします。" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2620 msgid "Enable DHT" @@ -1479,13 +1480,13 @@ #, java-format msgid "1 hop" msgid_plural "{0} hops" -msgstr[0] "" +msgstr[0] "{0}ホップ" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" -msgstr[0] "" +msgstr[0] "{0}トンネル" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3116 msgid "Torrent file" @@ -1509,7 +1510,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3198 msgid "Web Seeds" -msgstr "" +msgstr "ウェブシード" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Comment" @@ -1525,7 +1526,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3251 msgid "Added" -msgstr "追加されました" +msgstr "追加" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3271 msgid "Last activity" @@ -1558,11 +1559,11 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3371 msgid "Pieces" -msgstr "ピース個数" +msgstr "断片個数" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3376 msgid "Piece size" -msgstr "ピースの大きさ" +msgstr "断片の大きさ" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3388 msgid "Refresh page for results" @@ -1586,7 +1587,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3417 msgid "Download pieces in order" -msgstr "ピースを順にダウンロード" +msgstr "断片を順にダウンロード" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3424 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4012 @@ -1605,7 +1606,7 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3436 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3447 msgid "Base" -msgstr "" +msgstr "Base" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3445 msgid "Resource Does Not Exist" diff -Nru i2p-0.9.49/apps/i2psnark/locale/messages_pl.po i2p-0.9.50/apps/i2psnark/locale/messages_pl.po --- i2p-0.9.49/apps/i2psnark/locale/messages_pl.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/locale/messages_pl.po 2021-05-19 12:11:55.000000000 +0000 @@ -12,15 +12,16 @@ # sebx, 2014 # Smert i2p , 2013 # Taporpo Ne , 2015 -# Verdulo :-), 2016-2017 -# Verdulo :-), 2017 +# ☆Verdulo, 2016-2017 +# ☆Verdulo, 2021 +# ☆Verdulo, 2017 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-11-16 17:30+0000\n" -"PO-Revision-Date: 2020-11-18 17:55+0000\n" -"Last-Translator: zzzi2p\n" +"POT-Creation-Date: 2021-02-05 14:30+0000\n" +"PO-Revision-Date: 2021-05-12 21:48+0000\n" +"Last-Translator: ☆Verdulo\n" "Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,300 +34,300 @@ msgstr "Nie ma więcej uruchomionych torrentów." #: ../java/src/org/klomp/snark/IdleChecker.java:77 -#: ../java/src/org/klomp/snark/SnarkManager.java:3058 -#: ../java/src/org/klomp/snark/SnarkManager.java:3069 +#: ../java/src/org/klomp/snark/SnarkManager.java:3060 +#: ../java/src/org/klomp/snark/SnarkManager.java:3071 msgid "I2P tunnel closed." msgstr "Zamknięto tunel I2P." #: ../java/src/org/klomp/snark/MagnetURI.java:50 #: ../java/src/org/klomp/snark/MagnetURI.java:60 -#: ../java/src/org/klomp/snark/SnarkManager.java:2705 +#: ../java/src/org/klomp/snark/SnarkManager.java:2707 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:990 -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1070 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1204 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1239 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1347 +#: ../java/src/org/klomp/snark/SnarkManager.java:992 +#: ../java/src/org/klomp/snark/SnarkManager.java:1146 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:736 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1202 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "No write permissions for data directory" msgstr "Brak praw zapisu w katalogu danych" -#: ../java/src/org/klomp/snark/SnarkManager.java:993 -#: ../java/src/org/klomp/snark/SnarkManager.java:1137 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:732 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051 +#: ../java/src/org/klomp/snark/SnarkManager.java:995 +#: ../java/src/org/klomp/snark/SnarkManager.java:1139 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:730 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 msgid "Data directory cannot be created" msgstr "Katalog nie może zostać utworzony" -#: ../java/src/org/klomp/snark/SnarkManager.java:1055 +#: ../java/src/org/klomp/snark/SnarkManager.java:1057 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Ograniczenie liczby uploaderów zmieniono do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1057 +#: ../java/src/org/klomp/snark/SnarkManager.java:1059 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimalny całkowity limit uploadera: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1069 +#: ../java/src/org/klomp/snark/SnarkManager.java:1071 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Ograniczenie pasma wyjściowego zmieniono na: {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:1071 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimalne pasmo wyjściowe to: {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:1083 +#: ../java/src/org/klomp/snark/SnarkManager.java:1085 #, java-format msgid "Startup delay changed to {0}" msgstr "Opóźnienie uruchamiania zmieniono na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1094 +#: ../java/src/org/klomp/snark/SnarkManager.java:1096 #, java-format msgid "Refresh time changed to {0}" msgstr "Czas odświeżania zmieniony na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1096 +#: ../java/src/org/klomp/snark/SnarkManager.java:1098 msgid "Refresh disabled" msgstr "Odświeżanie wyłączone" -#: ../java/src/org/klomp/snark/SnarkManager.java:1112 +#: ../java/src/org/klomp/snark/SnarkManager.java:1114 #, java-format msgid "Page size changed to {0}" msgstr "Rozmiar strony zmieniony do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1122 +#: ../java/src/org/klomp/snark/SnarkManager.java:1124 msgid "New files will be publicly readable" msgstr "Nowe pliki będą publicznie dostępne" -#: ../java/src/org/klomp/snark/SnarkManager.java:1124 +#: ../java/src/org/klomp/snark/SnarkManager.java:1126 msgid "New files will not be publicly readable" msgstr "Nowe pliki nie będą publicznie dostępne" -#: ../java/src/org/klomp/snark/SnarkManager.java:1132 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047 +#: ../java/src/org/klomp/snark/SnarkManager.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1045 msgid "Data directory must be an absolute path" msgstr "Katalog danych musi być pełną ścieżką" -#: ../java/src/org/klomp/snark/SnarkManager.java:1136 +#: ../java/src/org/klomp/snark/SnarkManager.java:1138 msgid "Data directory does not exist" msgstr "Katalog danych nie istnieje" -#: ../java/src/org/klomp/snark/SnarkManager.java:1139 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:732 msgid "Not a directory" msgstr "To nie jest katalog" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:1143 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 msgid "Unreadable" msgstr "Nieczytelne" -#: ../java/src/org/klomp/snark/SnarkManager.java:1148 +#: ../java/src/org/klomp/snark/SnarkManager.java:1150 #, java-format msgid "Data directory changed to {0}" msgstr "Katalog danych zmieniony do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1229 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Zmiany dotyczące I2CP i tuneli będą wprowadzone po zatrzymaniu wszystkich torrentów." -#: ../java/src/org/klomp/snark/SnarkManager.java:1233 +#: ../java/src/org/klomp/snark/SnarkManager.java:1235 #, java-format msgid "I2CP options changed to {0}" msgstr "Opcje I2CP zmienione na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1239 +#: ../java/src/org/klomp/snark/SnarkManager.java:1241 msgid "Disconnecting old I2CP destination" msgstr "Rozłączanie starych celów I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1243 #, java-format msgid "I2CP settings changed to {0}" msgstr "Ustawienia I2CP zmienione do: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1246 +#: ../java/src/org/klomp/snark/SnarkManager.java:1248 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Nie można połączyć się z nowymi ustawieniami, powrót do starych ustawień I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:1250 +#: ../java/src/org/klomp/snark/SnarkManager.java:1252 msgid "Unable to reconnect with the old settings!" msgstr "Nie można się połączyć ze starymi ustawieniami!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1252 +#: ../java/src/org/klomp/snark/SnarkManager.java:1254 msgid "Reconnected on the new I2CP destination" msgstr "Ponowne podłączanie do nowych celów I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:1259 +#: ../java/src/org/klomp/snark/SnarkManager.java:1261 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Nasłuch I2CP zrestartowany dla \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1272 +#: ../java/src/org/klomp/snark/SnarkManager.java:1274 msgid "Enabled autostart" msgstr "Włączono automatyczne uruchamianie" -#: ../java/src/org/klomp/snark/SnarkManager.java:1274 +#: ../java/src/org/klomp/snark/SnarkManager.java:1276 msgid "Disabled autostart" msgstr "Wyłączono automatyczne uruchamianie" -#: ../java/src/org/klomp/snark/SnarkManager.java:1281 +#: ../java/src/org/klomp/snark/SnarkManager.java:1283 msgid "Enabled smart sort" msgstr "Włączono sprytne sortowanie" -#: ../java/src/org/klomp/snark/SnarkManager.java:1283 +#: ../java/src/org/klomp/snark/SnarkManager.java:1285 msgid "Disabled smart sort" msgstr "Wyłączono sprytne sortowanie" -#: ../java/src/org/klomp/snark/SnarkManager.java:1290 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Włączono otwarte trackery - wymagane ponowne uruchomienie torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/SnarkManager.java:1294 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Wyłączono otwarte trackery - wymagane ponowne uruchomienie torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:1299 +#: ../java/src/org/klomp/snark/SnarkManager.java:1301 msgid "Enabled DHT." msgstr "DHT włączone." -#: ../java/src/org/klomp/snark/SnarkManager.java:1301 +#: ../java/src/org/klomp/snark/SnarkManager.java:1303 msgid "Disabled DHT." msgstr "DHT wyłączone." -#: ../java/src/org/klomp/snark/SnarkManager.java:1303 +#: ../java/src/org/klomp/snark/SnarkManager.java:1305 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Zmiana DHT wymaga zamknięcia tunelu i jego ponownego otwarcia" -#: ../java/src/org/klomp/snark/SnarkManager.java:1310 +#: ../java/src/org/klomp/snark/SnarkManager.java:1312 msgid "Enabled Ratings." msgstr "Włączono oceny." -#: ../java/src/org/klomp/snark/SnarkManager.java:1312 +#: ../java/src/org/klomp/snark/SnarkManager.java:1314 msgid "Disabled Ratings." msgstr "Wyłączono oceny." -#: ../java/src/org/klomp/snark/SnarkManager.java:1319 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 msgid "Enabled Comments." msgstr "Włączono komentarze." -#: ../java/src/org/klomp/snark/SnarkManager.java:1321 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 msgid "Disabled Comments." msgstr "Wyłączono komentarze." -#: ../java/src/org/klomp/snark/SnarkManager.java:1334 +#: ../java/src/org/klomp/snark/SnarkManager.java:1336 #, java-format msgid "Comments name set to {0}." msgstr "Nazwa komentarza ustawiona na {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1343 #, java-format msgid "{0} theme loaded." msgstr "Załadowano skórkę {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:1348 +#: ../java/src/org/klomp/snark/SnarkManager.java:1350 msgid "Collapsible panels enabled." msgstr "Włączono rozwijalne panele." -#: ../java/src/org/klomp/snark/SnarkManager.java:1350 +#: ../java/src/org/klomp/snark/SnarkManager.java:1352 msgid "Collapsible panels disabled." msgstr "Wyłączono rozwijalne panele." -#: ../java/src/org/klomp/snark/SnarkManager.java:1360 +#: ../java/src/org/klomp/snark/SnarkManager.java:1362 msgid "Configuration unchanged." msgstr "Ustawienia niezmienione." -#: ../java/src/org/klomp/snark/SnarkManager.java:1392 +#: ../java/src/org/klomp/snark/SnarkManager.java:1394 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Lista otwartych trackerów została zmieniona – wymagane ponowne uruchomienie torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:1402 +#: ../java/src/org/klomp/snark/SnarkManager.java:1404 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Lista prywatnych trackerów została zmieniona – dotyczy tylko nowo utworzonych torrentów." -#: ../java/src/org/klomp/snark/SnarkManager.java:1448 +#: ../java/src/org/klomp/snark/SnarkManager.java:1450 #, java-format msgid "Unable to save the config to {0}" msgstr "Nie można zapisać konfiguracji do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1555 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1236 +#: ../java/src/org/klomp/snark/SnarkManager.java:1557 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1234 #, java-format msgid "Torrent file deleted: {0}" msgstr "Plik torrenta usunięto: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1558 +#: ../java/src/org/klomp/snark/SnarkManager.java:1560 #, java-format msgid "Torrent file moved from {0} to {1}" msgstr "Torrent przeniesiony z {0} do {1}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1592 -#: ../java/src/org/klomp/snark/SnarkManager.java:2758 -#: ../java/src/org/klomp/snark/SnarkManager.java:2764 -#: ../java/src/org/klomp/snark/SnarkManager.java:2768 +#: ../java/src/org/klomp/snark/SnarkManager.java:1594 +#: ../java/src/org/klomp/snark/SnarkManager.java:2760 +#: ../java/src/org/klomp/snark/SnarkManager.java:2766 +#: ../java/src/org/klomp/snark/SnarkManager.java:2770 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Błąd: Nie można dodać torrenta {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1607 -#: ../java/src/org/klomp/snark/SnarkManager.java:1695 -#: ../java/src/org/klomp/snark/SnarkManager.java:2926 +#: ../java/src/org/klomp/snark/SnarkManager.java:1609 +#: ../java/src/org/klomp/snark/SnarkManager.java:1697 +#: ../java/src/org/klomp/snark/SnarkManager.java:2928 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent już uruchomiony: {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1617 +#: ../java/src/org/klomp/snark/SnarkManager.java:1619 #, java-format msgid "Cannot open \"{0}\"" msgstr "Nie można otworzyć \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1636 -#: ../java/src/org/klomp/snark/SnarkManager.java:1791 -#: ../java/src/org/klomp/snark/SnarkManager.java:1880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1638 +#: ../java/src/org/klomp/snark/SnarkManager.java:1793 +#: ../java/src/org/klomp/snark/SnarkManager.java:1882 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1117 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1115 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent o tym hashu jest już uruchomiony: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1642 -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1644 +#: ../java/src/org/klomp/snark/SnarkManager.java:1888 #, java-format msgid "Torrent with the same data location is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1648 +#: ../java/src/org/klomp/snark/SnarkManager.java:1650 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "BŁĄD – brak trackerów w prywatnym torrencie \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1650 +#: ../java/src/org/klomp/snark/SnarkManager.java:1652 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Uwaga – Nie ma trackerów I2P w \"{0}\", zostanie to zameldowane tylko do otwartych trackerów i DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1653 +#: ../java/src/org/klomp/snark/SnarkManager.java:1655 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Uwaga – Brak trackerów I2P w \"{0}\", a otwarte trackery są wyłączone. Torrent będzie działał wyłącznie w oparciu o DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1655 +#: ../java/src/org/klomp/snark/SnarkManager.java:1657 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -334,43 +335,43 @@ "torrent." msgstr "Uwaga – Brak trackerów I2P w \"{0}\". Otwarte trackery i DHT również są wyłączone. Należy włączyć otwarte trackery lub DHT przed rozpoczęciem torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:1681 +#: ../java/src/org/klomp/snark/SnarkManager.java:1683 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent w \"{0}\" jest niepoprawny" -#: ../java/src/org/klomp/snark/SnarkManager.java:1687 +#: ../java/src/org/klomp/snark/SnarkManager.java:1689 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:195 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "BŁĄD – Brak pamięci, nie można utworzyć pliku torrent z {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1714 +#: ../java/src/org/klomp/snark/SnarkManager.java:1716 msgid "Connecting to I2P" msgstr "Łączenie z I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1717 +#: ../java/src/org/klomp/snark/SnarkManager.java:1719 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Nie można się połączyć z I2P, sprawdź swoje ustawienia I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1723 +#: ../java/src/org/klomp/snark/SnarkManager.java:1725 #, java-format msgid "Torrent added and started: {0}" msgstr "Torrent dodany i uruchomiony: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1725 +#: ../java/src/org/klomp/snark/SnarkManager.java:1727 #, java-format msgid "Torrent added: {0}" msgstr "Torrent dodany: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1805 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Pobieranie: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1809 +#: ../java/src/org/klomp/snark/SnarkManager.java:1811 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -378,55 +379,55 @@ "DHT." msgstr "Otwarte trackery są wyłączone i nie mamy żadnych peerów DHT. Pobranie z {0} może się nie udać, dopóki nie uruchomisz innego torrenta, włączysz otwarte trackery lub włączysz DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1813 +#: ../java/src/org/klomp/snark/SnarkManager.java:1815 #, java-format msgid "Adding {0}" msgstr "Dodawanie {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1846 +#: ../java/src/org/klomp/snark/SnarkManager.java:1848 #, java-format msgid "Download already running: {0}" msgstr "Pobieranie już zostało uruchomione: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1896 -#: ../java/src/org/klomp/snark/SnarkManager.java:1906 -#: ../java/src/org/klomp/snark/SnarkManager.java:1932 -#: ../java/src/org/klomp/snark/SnarkManager.java:2634 +#: ../java/src/org/klomp/snark/SnarkManager.java:1898 +#: ../java/src/org/klomp/snark/SnarkManager.java:1908 +#: ../java/src/org/klomp/snark/SnarkManager.java:1934 +#: ../java/src/org/klomp/snark/SnarkManager.java:2636 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Nie udało się skopiować pliku torrent do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2410 +#: ../java/src/org/klomp/snark/SnarkManager.java:2412 #, java-format msgid "Too many files in \"{0}\" ({1})!" msgstr "Zbyt wiele plików w \"{0}\" ({1})!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2412 +#: ../java/src/org/klomp/snark/SnarkManager.java:2414 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" msgstr "Plik torrent \"{0}\" nie może kończyć się na \".torrent\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2414 +#: ../java/src/org/klomp/snark/SnarkManager.java:2416 #, java-format msgid "No pieces in \"{0}\"!" msgstr "Brak kawałków w \"{0}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2416 +#: ../java/src/org/klomp/snark/SnarkManager.java:2418 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}!" msgstr "Zbyt dużo kawałków w \"{0}\", limit wynosi {1}!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2418 +#: ../java/src/org/klomp/snark/SnarkManager.java:2420 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B)!" msgstr "Kawałki są zbyt duże w \"{0}\" ({1}B)!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2419 +#: ../java/src/org/klomp/snark/SnarkManager.java:2421 #, java-format msgid "Limit is {0}B" msgstr "Granica to {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:2421 +#: ../java/src/org/klomp/snark/SnarkManager.java:2423 #, java-format msgid "Torrent \"{0}\" has no data!" msgstr "Torrent \"{0}\" nie zawiera danych!" @@ -436,82 +437,82 @@ #. if (lengths != null) #. for (int i = 0; i < lengths.size(); i++) #. System.out.println("File " + i + " is " + lengths.get(i) + " long."); -#: ../java/src/org/klomp/snark/SnarkManager.java:2430 +#: ../java/src/org/klomp/snark/SnarkManager.java:2432 #, java-format msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" msgstr "Torrenty większe niż {0}B nie są jeszcze wspierane \"{1}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2447 +#: ../java/src/org/klomp/snark/SnarkManager.java:2449 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Błąd: nie można usunąć torrenta {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2470 -#: ../java/src/org/klomp/snark/SnarkManager.java:2489 +#: ../java/src/org/klomp/snark/SnarkManager.java:2472 +#: ../java/src/org/klomp/snark/SnarkManager.java:2491 #, java-format msgid "Torrent stopped: {0}" msgstr "Torrent zatrzymany: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2509 +#: ../java/src/org/klomp/snark/SnarkManager.java:2511 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent usunięty: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:2517 +#: ../java/src/org/klomp/snark/SnarkManager.java:2519 #, java-format msgid "Adding torrents in {0}" msgstr "Dodawanie torrentów w {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2550 +#: ../java/src/org/klomp/snark/SnarkManager.java:2552 #, java-format msgid "Up bandwidth limit is {0} KBps" -msgstr "Limit transferu połączeń wychodzcych to {0} KBps" +msgstr "Limit transferu połączeń wychodzących to {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:2575 +#: ../java/src/org/klomp/snark/SnarkManager.java:2577 #, java-format msgid "Download finished: {0}" msgstr "Pobieranie ukończone: {0}" #. addMessage(_t("Metainfo received for {0}", snark.getName())); -#: ../java/src/org/klomp/snark/SnarkManager.java:2631 -#: ../java/src/org/klomp/snark/SnarkManager.java:2932 +#: ../java/src/org/klomp/snark/SnarkManager.java:2633 +#: ../java/src/org/klomp/snark/SnarkManager.java:2934 #, java-format msgid "Starting up torrent {0}" msgstr "Uruchamianie torrenta: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2646 +#: ../java/src/org/klomp/snark/SnarkManager.java:2648 #, java-format msgid "Error on torrent {0}" msgstr "Błąd w torrencie {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2931 +#: ../java/src/org/klomp/snark/SnarkManager.java:2933 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Otwieranie tunelu I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2951 +#: ../java/src/org/klomp/snark/SnarkManager.java:2953 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Otwieranie tunelu I2P i uruchamianie wszystkich torrentów." -#: ../java/src/org/klomp/snark/SnarkManager.java:3016 +#: ../java/src/org/klomp/snark/SnarkManager.java:3018 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Zatrzymywanie wszystkich torrentów i zamykanie tunelu I2P." -#: ../java/src/org/klomp/snark/SnarkManager.java:3043 +#: ../java/src/org/klomp/snark/SnarkManager.java:3045 msgid "Closing I2P tunnel after notifying trackers." msgstr "Zamknięcie tunelu I2P po powiadomieniu trackerów." -#: ../java/src/org/klomp/snark/SnarkManager.java:3113 +#: ../java/src/org/klomp/snark/SnarkManager.java:3115 #, java-format msgid "Finished recheck of torrent {0}, now {1} complete" msgstr "Zakończono sprawdzanie torrenta {0}, teraz {1} jest zakończony" -#: ../java/src/org/klomp/snark/SnarkManager.java:3115 +#: ../java/src/org/klomp/snark/SnarkManager.java:3117 #, java-format msgid "Finished recheck of torrent {0}, unchanged" msgstr "Zakończono sprawdzanie torrenta {0}, bez zmian" -#: ../java/src/org/klomp/snark/SnarkManager.java:3119 +#: ../java/src/org/klomp/snark/SnarkManager.java:3121 #, java-format msgid "Error checking the torrent {0}" msgstr "Błąd sprawdzania torrenta {0}" @@ -547,205 +548,205 @@ msgstr "Torrent pobrano z {0}" #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1130 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Torrent już w kolejce: {0}" #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1141 #, java-format msgid "Torrent at {0} was not valid" msgstr "Torrent pobrany z {0} jest niepoprawny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:302 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2001 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3079 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:361 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2003 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3082 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2428 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2800 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2803 msgid "Configuration" msgstr "Ustawienia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 msgid "Anonymous BitTorrent Client" msgstr "Anonimowy klient protokołu BitTorrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:321 msgid "I2PSnark has stopped" msgstr "I2PSnark został zatrzymany" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:321 msgid "Router is down" msgstr "Węzeł jest wyłączony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Czy jesteś pewnien, że chcesz usunąć plik \\''{0}\\'' (pobrane dane nie będą usunięte) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:335 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Czy na pewno chcesz usunąć plik \\''{0}.torrent\\'' oraz pobrane dane?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349 msgid "Torrents" msgstr "Torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:358 msgid "Refresh page" msgstr "Odśwież stronę" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Kliknij \"Dodaj torrent\" by pobrać torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:445 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443 msgid "clear messages" msgstr "wyczyść komunikaty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:500 msgid "Status" msgstr "Stan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:504 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:556 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3529 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3557 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3569 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3581 #, java-format msgid "Sort by {0}" msgstr "Sortuj wg {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:524 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:522 msgid "Hide Peers" msgstr "Ukryj peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528 msgid "Show Peers" msgstr "Pokaż peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3067 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3103 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3409 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3420 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3070 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3437 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3448 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:556 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 msgid "File type" msgstr "Rodzaj pliku" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 msgid "ETA" msgstr "Pozostało" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:573 msgid "Estimated time remaining" msgstr "Szacowany pozostały czas" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:599 msgid "Downloaded" msgstr "Pobrano" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3293 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3321 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3555 msgid "Size" msgstr "Rozmiar" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3328 msgid "Upload ratio" msgstr "Współczynnik wysyłania (ratio)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:632 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 msgid "Uploaded" msgstr "Wysłano" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 msgid "RX Rate" msgstr "↓" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Down Rate" msgstr "Prędkość pobierania" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 msgid "TX Rate" msgstr "↑" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:662 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 msgid "Up Rate" msgstr "Prędkość wysyłania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Stop all torrents and the I2P tunnel" msgstr "Zatrzymaj wszystkie torrenty i tunel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 msgid "Stop All" msgstr "Zatrzymaj wszystkie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689 msgid "Start all stopped torrents" msgstr "Uruchom wszystkie zatrzymane torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:693 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:707 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705 msgid "Start All" msgstr "Uruchom wszystkie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:703 msgid "Start all torrents and the I2P tunnel" msgstr "Uruchom wszystkie torrenty i tunel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:740 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738 msgid "No torrents loaded." msgstr "Nie załadowano torrentów." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:746 msgid "Totals" msgstr "Łącznie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:748 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -754,7 +755,7 @@ msgstr[2] "{0} torrentów" msgstr[3] "{0} torrentów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -763,7 +764,7 @@ msgstr[2] "{0} podłączonych peerów" msgstr[3] "{0} podłączonych peerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:760 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" @@ -772,218 +773,218 @@ msgstr[2] "{0} peerów DHT" msgstr[3] "{0} peerów DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:768 msgid "Dest" msgstr "Cel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:772 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 msgid "Our destination (identity) for this session" msgstr "Nasz adres docelowy (identyfikacja) dla tej sesji" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:797 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:795 msgid "Dht Debug" msgstr "Odpluskwianie DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 msgid "First" msgstr "Pierwsza" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 msgid "First page" msgstr "Pierwsza strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 msgid "Prev" msgstr "Poprzednia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 msgid "Previous page" msgstr "Poprzednia strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:954 msgid "Next" msgstr "Następna" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:954 msgid "Next page" msgstr "Następna strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Last" msgstr "Ostatnia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Last page" msgstr "Ostatnia strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1371 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "Nie można dodać torrenta {0} wewnątrz innego torrenta {1}" #. TODO -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 #, java-format msgid "Download from non-I2P location {0} is not supported" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1150 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1148 #, java-format msgid "Invalid URL: Must start with \"{0}\" or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1227 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225 #, java-format msgid "Magnet deleted: {0}" msgstr "Odnośnik Magnet usunięty: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1238 #, java-format msgid "Torrent file could not be deleted: {0}" msgstr "Nie można usunąć pliku torrent: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1223 #, java-format msgid "Download deleted: {0}" msgstr "Pobrane usunięte: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 #, java-format msgid "Data file deleted: {0}" msgstr "Pliki z danymi usunięte: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Nie można usunąć pliku z danymi: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1280 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Katalog nie może być usunięty: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 #, java-format msgid "Directory deleted: {0}" msgstr "Usunięto katalog: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1352 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "Nie można dodać torrent kończącego się \".torrent\": {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1355 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Torrent z tą nazwą już jest uruchomiony: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1363 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "Nie można dodać torrenta zawierającego katalog I2P: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1378 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "Nie można dodać torrenta {0} zawierającego inny torrent {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1404 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1402 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Błąd – Nie można dodać alternatywnych trackerów bez głównego trackera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1417 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1415 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Błąd – Nie można mieszać prywatnych i publicznych trackerów w torrencie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Utworzono torrent dla \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1441 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Wiele trackerów w I2P wymaga zarejestrowania torrenta przed seedowaniem – proszę, zrób tak przed uruchomieniem \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1443 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1441 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Błąd podczas tworzenia torrenta dla: \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1447 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Nie można utworzyć torrenta dla nieistniejących danych: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1448 msgid "Error creating torrent - you must enter a file or directory" msgstr "Błąd przy tworzeniu torrenta – musisz podać plik lub katalog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2784 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2787 msgid "Delete selected" msgstr "Usuń zaznaczone" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2786 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2789 msgid "Save tracker configuration" msgstr "Zapisz ustawienia trackerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1503 msgid "Removed" msgstr "Usunięto" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2783 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2785 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1535 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2786 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2788 msgid "Add tracker" msgstr "Dodaj tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 msgid "Enter valid tracker name and URLs" msgstr "Podaj prawidłową nazwę trackera i URL" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1565 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2788 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2791 msgid "Restore defaults" msgstr "Przywróć domyślne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 msgid "Restored default trackers" msgstr "Przywrócono domyślne trackery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1681 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1679 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3385 msgid "Checking" msgstr "Sprawdzanie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3364 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1683 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3392 msgid "Allocating" msgstr "Alokowanie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 msgid "Tracker Error" msgstr "Błąd trackera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1741 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -992,17 +993,17 @@ msgstr[2] "{0} peerów" msgstr[3] "{0} peerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1713 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3362 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1711 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3390 msgid "Starting" msgstr "Uruchamianie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 msgid "Seeding" msgstr "Seedowanie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1722 #, java-format msgid "Seeding to {0} peer" msgid_plural "Seeding to {0} peers" @@ -1011,27 +1012,27 @@ msgstr[2] "" msgstr[3] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1744 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1745 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3289 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3643 msgid "Complete" msgstr "Zakończono" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747 #, java-format msgid "Downloading from {0} of {1} peers in swarm" msgstr "Pobieranie od {0} z {1} rówieśnikom roju" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 #, java-format msgid "Downloading from {0} peer" msgid_plural "Downloading from {0} peers" @@ -1040,7 +1041,7 @@ msgstr[2] "" msgstr[3] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 #, java-format msgid "Connected to {0} peer" msgid_plural "Connected to {0} peers" @@ -1049,462 +1050,462 @@ msgstr[2] "" msgstr[3] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1765 msgid "Stalled" msgstr "Utknięto" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 #, java-format msgid "Connected to {0} of {1} peers in swarm" msgstr "Połączono z {0} z {1} rówieśnikom roju" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1776 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1773 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1774 msgid "No Peers" msgstr "Brak peerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1779 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1776 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1777 msgid "Stopped" msgstr "Zatrzymany" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1807 msgid "Torrent details" msgstr "Szczegóły torrenta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1836 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4001 msgid "Comments" msgstr "Komentarze" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1860 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1858 msgid "View files" msgstr "Zobacz pliki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1860 msgid "Open file" msgstr "Otwórz plik" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 msgid "complete" msgstr "zakończono" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3656 msgid "remaining" msgstr "pozostało" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1888 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1886 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3260 msgid "Completed" msgstr "Zakończony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1926 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1924 msgid "Stop the torrent" msgstr "Zatrzymaj torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1928 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3369 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1926 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3397 msgid "Stop" msgstr "Zatrzymaj" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1939 msgid "Start the torrent" msgstr "Uruchom torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1943 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3371 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3399 msgid "Start" msgstr "Uruchom" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1954 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Usuń torrent z aktywnej listy, usuwając plik .torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 msgid "Remove" msgstr "Usuń" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1973 msgid "Delete the .torrent file and the associated data files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1979 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1977 msgid "Delete" msgstr "Usuń" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1995 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1993 msgid "Peer attached to swarm" msgstr "Rówieśnik w roju" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023 msgid "Unknown" msgstr "Nieznany" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2025 msgid "Destination (identity) of peer" msgstr "Adres docelowy (identyfikator) rówieśnika" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2038 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2041 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2064 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2067 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Uninteresting (peer nie ma piece'ów, które potrzebujemy)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2069 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Choked (peer nie pozwala nam na prośbę o piece)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2086 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2089 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Uninterested (nie mamy piece'ów, których peer potrzebuje)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2088 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2091 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Choking (nie pozwalamy peerowi na prośbę o piece)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207 #, java-format msgid "Details at {0} tracker" msgstr "Szczegóły na trackerze {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2224 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 msgid "Add Torrent" msgstr "Dodaj torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "From URL" msgstr "Z adresu URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2310 msgid "" "Enter the torrent file download URL (I2P only), magnet link, or info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315 msgid "Add torrent" msgstr "Dodaj torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2319 msgid "Data dir" msgstr "Katalog na pobrane dane" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2319 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2322 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Podaj katalog do zapisu danych (domyślnie: {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Możesz także skopiować pliki .torrent do: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 msgid "Removing a .torrent will cause it to stop." msgstr "Usunięcie pliku .torrent spowoduje jego zatrzymanie." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "Create Torrent" msgstr "Utwórz torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2344 msgid "Data to seed" msgstr "Dane do seedowania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2345 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2348 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Plik lub katalog do seedowania (pełna ścieżka lub katalog wewnątrz \"{0}\")" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351 msgid "Create torrent" msgstr "Utwórz torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2354 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2717 msgid "Trackers" msgstr "Trackery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2356 msgid "Primary" msgstr "Główne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2355 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2358 msgid "Alternates" msgstr "Alternatywne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2360 msgid "Tracker Type" msgstr "Typ trackera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2381 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2724 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2384 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2727 msgid "Standard" msgstr "Standardowy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2383 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2726 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2386 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2729 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3699 msgid "Open" msgstr "Otwarty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2385 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2731 msgid "Private" msgstr "Prywatny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2389 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 msgid "none" msgstr "brak" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435 msgid "Data directory" msgstr "Katalog z danymi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2438 msgid "Directory where torrents and downloaded/shared files are stored" msgstr "Katalog przechowywania torrentów i udostępnianych/pobranych plików" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2440 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2443 msgid "Files readable by all" msgstr "Pliki dostępne dla wszystkich" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2444 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2447 msgid "" "Set file permissions to allow other local users to access the downloaded " "files" msgstr "Ustawia prawa do plików, aby inni użytkownicy lokalni mogli mieć dostęp do pobranych plików" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2451 msgid "Auto start torrents" msgstr "Uruchamiaj automatycznie torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2452 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2455 msgid "" "Automatically start torrents when added and restart torrents when I2PSnark " "starts" msgstr "Automatycznie startuj torrenty po dodaniu i po uruchomieniu I2PSnarka" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2456 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2459 msgid "Smart torrent sorting" msgstr "Sprytne sortowanie torrentów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 msgid "Ignore words such as 'a' and 'the' when sorting" msgstr "Ignorowanie słów takich jak ‘a’ i ‘the’ przy sortowaniu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2467 msgid "Collapsible panels" msgstr "Rozwijalne panele" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2469 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 msgid "Your browser does not support this feature." msgstr "Twoja przeglądarka nie wspiera tej funkcji." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2475 msgid "" "Allow the 'Add Torrent' and 'Create Torrent' panels to be collapsed, and " "collapse by default in non-embedded mode" msgstr "Pozwala na zwijanie paneli „dodaj torrent” „utwórz torrent” i domyślnie je zwija w trybie nie-wbudowanym" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2484 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2487 msgid "Language" msgstr "Język" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2498 msgid "Theme" msgstr "Motyw" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2499 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2502 msgid "To change themes manually, disable universal theming" msgstr "Aby ręcznie zmienić skórkę, wyłącz ‘styl uniwersalny’" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2503 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2506 msgid "Universal theming is enabled." msgstr "Styl uniwersalny jest włączony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2505 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2605 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3962 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2608 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3990 msgid "Configure" msgstr "Konfiguruj" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2525 msgid "Refresh time" msgstr "Czas odświeżania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2525 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2528 msgid "How frequently torrent status is updated on the main page" msgstr "Jak często odświeżać stan torrentów na stronie głównej" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2538 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2541 msgid "Never" msgstr "Nigdy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 msgid "Startup delay" msgstr "Opóźnienie uruchomienia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2551 msgid "How long before auto-started torrents are loaded when I2PSnark starts" msgstr "Po jakim czasie automatycznie uruchamiać torrenty przy starcie I2PSnarka" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2553 msgid "minutes" msgstr "minuty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2558 msgid "Page size" msgstr "Rozmiar strony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2561 msgid "Maximum number of torrents to display per page" msgstr "Maksymalna liczba wyświetlanych torrentów na stronę" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2563 msgid "torrents" msgstr "torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2584 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2587 msgid "Total uploader limit" msgstr "Całkowity limit uploaderów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2588 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2591 msgid "Maximum number of peers for uploading" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2590 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2593 msgid "peers" msgstr "peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2594 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2597 msgid "Up bandwidth limit" msgstr "Ograniczenie pasma wyjściowego" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2601 msgid "Maximum bandwidth allocated for uploading" msgstr "Maksymalna przepustowość przeznaczona do wysyłania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2603 msgid "Half available bandwidth recommended." msgstr "Zalecana połowa dostępnego pasma." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2603 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2606 msgid "View or change router bandwidth" msgstr "Zobacz lub zmień pasmo węzła" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2609 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2612 msgid "Use open trackers also" msgstr "Używaj również otwartych trackerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2616 msgid "" "Announce torrents to open trackers as well as trackers listed in the torrent" " file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2620 msgid "Enable DHT" msgstr "Włącz DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2621 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2624 msgid "Use DHT to find additional peers" msgstr "Użyj DHT, aby znaleźć dodatkowych rówieśników" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2625 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2628 msgid "Enable Ratings" msgstr "Włącz oceny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2632 msgid "Show ratings on torrent pages" msgstr "Pokazuj oceny na stronie torrentów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2636 msgid "Enable Comments" msgstr "Włącz komentarze" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2637 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2640 msgid "Show comments on torrent pages" msgstr "Pokazuj komentarze na stronie torrentów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2639 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2642 msgid "Comment Author" msgstr "Autor komentarza" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2645 msgid "Set the author name for your comments and ratings" msgstr "Ustaw ksywkę dla wystawianych komentarzy i ocen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2658 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2661 msgid "Inbound Settings" msgstr "Tunele wejściowe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2668 msgid "Outbound Settings" msgstr "Tunele wyjściowe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2674 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 msgid "I2CP host" msgstr "Adres I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2679 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2682 msgid "I2CP port" msgstr "Port I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2697 msgid "I2CP options" msgstr "Parametry I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2702 msgid "Save configuration" msgstr "Zapisz ustawienia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2717 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2720 msgid "Select trackers for removal from I2PSnark's known list" msgstr "Wybierz trackery do usunięcia z listy znanych trackerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2720 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2723 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 msgid "Name" msgstr "Nazwa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2725 msgid "Website URL" msgstr "URL strony www" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2730 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2733 msgid "Announce URL" msgstr "URL rozgłaszania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Mark tracker for deletion" msgstr "Zaznacz tracker do usunięcia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2774 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2777 msgid "Add" msgstr "Dodaj" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2824 #, java-format msgid "Invalid magnet URL {0}" msgstr "Nieprawidłowy link magnet {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2829 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2832 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -1513,7 +1514,7 @@ msgstr[2] "{0} skoków" msgstr[3] "{0} skoków" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2830 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -1522,215 +1523,219 @@ msgstr[2] "{0} tuneli" msgstr[3] "{0} tuneli" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3113 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3116 msgid "Torrent file" msgstr "Plik torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3121 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3124 msgid "Data location" msgstr "Położenie danych" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3133 msgid "Info hash" msgstr "Info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3153 msgid "Primary Tracker" msgstr "Główny Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3169 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Tracker List" msgstr "Lista Trackerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3192 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3198 +msgid "Web Seeds" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Comment" msgstr "Komentarz" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3202 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3230 msgid "Created" msgstr "Utworzony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3241 msgid "Created By" msgstr "Utworzony przez" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3223 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3251 msgid "Added" msgstr "Dodany" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3243 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3271 msgid "Last activity" msgstr "Ostatnia aktywność" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3256 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3284 msgid "Magnet link" msgstr "Link magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3271 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3299 msgid "Private torrent" msgstr "Prywatny torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3285 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3313 msgid "Completion" msgstr "Zakończono" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3569 msgid "Remaining" msgstr "Pozostało" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3329 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3357 msgid "Skipped" msgstr "Pominięty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3365 msgid "Files" msgstr "Pliki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3343 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3371 msgid "Pieces" msgstr "Części" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3376 msgid "Piece size" msgstr "Rozmiar części" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3388 msgid "Refresh page for results" msgstr "Odśwież stronę, aby zobaczyć" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3400 msgid "Force Recheck" msgstr "Wymuś ponowne sprawdzenie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3403 msgid "Stop the torrent in order to check file integrity" msgstr "Zatrzymaj torrent, aby skontrolować integralność plików" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407 msgid "Check integrity of the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3388 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3416 msgid "Download files in order" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3389 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3417 msgid "Download pieces in order" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3396 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3984 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3424 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4012 msgid "Save Preference" msgstr "Zapisz ustawienia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3406 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3434 msgid "Resource Not found" msgstr "Nie znaleziono zasobu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3418 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3446 msgid "Resource" msgstr "Zasób" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3408 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3419 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3436 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3447 msgid "Base" msgstr "Baza" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3417 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3445 msgid "Resource Does Not Exist" msgstr "Zasób nie istnieje" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3521 msgid "Directory" msgstr "Katalog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3567 msgid "Download Status" msgstr "Stan pobierania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3579 msgid "Download Priority" msgstr "Priorytet pobierania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3591 msgid "Up to higher level directory" msgstr "Do katalogu nadrzędnego" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3574 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3602 msgid "Audio Playlist" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3606 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3634 msgid "Torrent not found?" msgstr "Torrent nie znaleziony?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3612 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3640 msgid "File not found in torrent?" msgstr "Plik nie znaleziony w torrencie?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3654 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3682 msgid "Preview" msgstr "Podgląd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3705 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3733 msgid "Download file at high priority" msgstr "Pobierz plik z wysokich priorytetem" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3710 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3738 msgid "High" msgstr "Wysoki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3741 msgid "Download file at normal priority" msgstr "Pobierz plik z normalnym priorytetem" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3718 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3746 msgid "Normal" msgstr "Normalny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3720 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3748 msgid "Do not download this file" msgstr "Nie pobieraj pliku" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3725 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3753 msgid "Skip" msgstr "Pomiń" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3737 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3765 msgid "Set all high" msgstr "Ustaw wszystkie na wysoki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3740 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3768 msgid "Set all normal" msgstr "Ustaw wszystkie na normalny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3770 msgid "Skip all" msgstr "Pomiń wszystkie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3771 msgid "Save priorities" msgstr "Zapisz priorytety" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3957 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3985 msgid "Ratings and Comments" msgstr "Oceny i komentarze" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3988 msgid "Author name required to rate or comment" msgstr "Wymagana ksywka, aby oceniać lub komentować" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3994 msgid "Your author name for published comments and ratings" msgstr "Twoja ksywka użyta do opublikowanych komentarzy i ocen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4008 msgid "Enable viewing and posting comments for this torrent" msgstr "Włącz przeglądanie i publikowanie komentarzy dla tego torrenta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4003 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4031 #, java-format msgid "1 star" msgid_plural "{0} stars" @@ -1739,39 +1744,39 @@ msgstr[2] "{0} gwiazdek" msgstr[3] "{0} gwiazdek" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4005 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4033 msgid "No rating" msgstr "Brak ocen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4020 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4048 msgid "Rate and Comment" msgstr "Oceń i skomentuj" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4022 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4050 msgid "Rate Torrent" msgstr "Oceń torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4052 msgid "Add Comment" msgstr "Dodaj komentarz" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4036 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4064 msgid "My Rating" msgstr "Moja ocena" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4049 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4077 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4081 msgid "Average Rating" msgstr "Średnia ocena" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4054 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4082 msgid "No community ratings currently available" msgstr "Brak dostępnych ocen użytkowników" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4130 msgid "Mark for deletion" msgstr "Zaznacz do usunięcia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4143 msgid "Delete Selected" msgstr "Usuń zaznaczone" diff -Nru i2p-0.9.49/apps/i2psnark/locale/messages_pt_BR.po i2p-0.9.50/apps/i2psnark/locale/messages_pt_BR.po --- i2p-0.9.49/apps/i2psnark/locale/messages_pt_BR.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/locale/messages_pt_BR.po 2021-05-19 12:11:55.000000000 +0000 @@ -12,7 +12,7 @@ "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 14:30+0000\n" -"PO-Revision-Date: 2021-02-09 18:23+0000\n" +"PO-Revision-Date: 2021-05-08 02:17+0000\n" "Last-Translator: Eduardo Rodrigues\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -1438,11 +1438,11 @@ #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 msgid "I2CP host" -msgstr "" +msgstr "Host do I2CP" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2682 msgid "I2CP port" -msgstr "" +msgstr "Porta do I2CP" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2697 msgid "I2CP options" diff -Nru i2p-0.9.49/apps/i2psnark/locale/messages_sv.po i2p-0.9.50/apps/i2psnark/locale/messages_sv.po --- i2p-0.9.49/apps/i2psnark/locale/messages_sv.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/locale/messages_sv.po 2021-05-19 12:11:55.000000000 +0000 @@ -13,9 +13,9 @@ # hottuna , 2011 # hottuna , 2013 # hottuna , 2011-2012 -# Jonatan Nyberg , 2017 -# Jonatan Nyberg , 2018-2020 -# Jonatan Nyberg , 2017-2018 +# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2017 +# Jonatan Nyberg , 2018-2021 +# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2017-2018 # Martin Svensson , 2011-2012 # mon , 2012 # WinterFairy , 2014 @@ -23,9 +23,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-11-16 17:30+0000\n" -"PO-Revision-Date: 2020-11-24 17:55+0000\n" -"Last-Translator: Jonatan Nyberg \n" +"POT-Creation-Date: 2021-02-05 14:30+0000\n" +"PO-Revision-Date: 2021-04-27 19:05+0000\n" +"Last-Translator: Jonatan Nyberg \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" @@ -38,300 +38,300 @@ msgstr "Inga fler torrenter körs." #: ../java/src/org/klomp/snark/IdleChecker.java:77 -#: ../java/src/org/klomp/snark/SnarkManager.java:3058 -#: ../java/src/org/klomp/snark/SnarkManager.java:3069 +#: ../java/src/org/klomp/snark/SnarkManager.java:3060 +#: ../java/src/org/klomp/snark/SnarkManager.java:3071 msgid "I2P tunnel closed." msgstr "I2P-tunneln är stängd." #: ../java/src/org/klomp/snark/MagnetURI.java:50 #: ../java/src/org/klomp/snark/MagnetURI.java:60 -#: ../java/src/org/klomp/snark/SnarkManager.java:2705 +#: ../java/src/org/klomp/snark/SnarkManager.java:2707 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:990 -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1070 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1204 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1239 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1347 +#: ../java/src/org/klomp/snark/SnarkManager.java:992 +#: ../java/src/org/klomp/snark/SnarkManager.java:1146 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:736 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1202 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "No write permissions for data directory" msgstr "Inga skrivbehörigheter för datamappen" -#: ../java/src/org/klomp/snark/SnarkManager.java:993 -#: ../java/src/org/klomp/snark/SnarkManager.java:1137 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:732 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051 +#: ../java/src/org/klomp/snark/SnarkManager.java:995 +#: ../java/src/org/klomp/snark/SnarkManager.java:1139 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:730 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 msgid "Data directory cannot be created" msgstr "Datamapp kan inte skapas" -#: ../java/src/org/klomp/snark/SnarkManager.java:1055 +#: ../java/src/org/klomp/snark/SnarkManager.java:1057 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Gräns för totalt antal uppladdare är ändrat till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1057 +#: ../java/src/org/klomp/snark/SnarkManager.java:1059 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minsta tillåtna gräns för uppladdare är {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1069 +#: ../java/src/org/klomp/snark/SnarkManager.java:1071 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Uppladdningsbandbredd bytt till {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1071 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minsta uppladdningsbandbredd är {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1083 +#: ../java/src/org/klomp/snark/SnarkManager.java:1085 #, java-format msgid "Startup delay changed to {0}" msgstr "Fördröjning vid uppstart bytt till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1094 +#: ../java/src/org/klomp/snark/SnarkManager.java:1096 #, java-format msgid "Refresh time changed to {0}" msgstr "Uppdateringstiden ändrad till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1096 +#: ../java/src/org/klomp/snark/SnarkManager.java:1098 msgid "Refresh disabled" msgstr "Uppdatering inaktiverad" -#: ../java/src/org/klomp/snark/SnarkManager.java:1112 +#: ../java/src/org/klomp/snark/SnarkManager.java:1114 #, java-format msgid "Page size changed to {0}" msgstr "Torrenter per sida ändrat till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1122 +#: ../java/src/org/klomp/snark/SnarkManager.java:1124 msgid "New files will be publicly readable" msgstr "Nya filer kommer vara offentligt läsbara" -#: ../java/src/org/klomp/snark/SnarkManager.java:1124 +#: ../java/src/org/klomp/snark/SnarkManager.java:1126 msgid "New files will not be publicly readable" msgstr "Nya filer kommer inte vara offentligt läsbara" -#: ../java/src/org/klomp/snark/SnarkManager.java:1132 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047 +#: ../java/src/org/klomp/snark/SnarkManager.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1045 msgid "Data directory must be an absolute path" msgstr "Datamappen måste vara en absolut sökväg" -#: ../java/src/org/klomp/snark/SnarkManager.java:1136 +#: ../java/src/org/klomp/snark/SnarkManager.java:1138 msgid "Data directory does not exist" msgstr "Datamappen finns inte" -#: ../java/src/org/klomp/snark/SnarkManager.java:1139 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:732 msgid "Not a directory" msgstr "Inte en mapp" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:1143 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 msgid "Unreadable" msgstr "Oläsbar" -#: ../java/src/org/klomp/snark/SnarkManager.java:1148 +#: ../java/src/org/klomp/snark/SnarkManager.java:1150 #, java-format msgid "Data directory changed to {0}" msgstr "Datamappen ändrad till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1229 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP- och tunnelförändringar kommer träda i kraft efter alla torrenter stoppats" -#: ../java/src/org/klomp/snark/SnarkManager.java:1233 +#: ../java/src/org/klomp/snark/SnarkManager.java:1235 #, java-format msgid "I2CP options changed to {0}" msgstr "Alternativ för I2CP ändrade till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1239 +#: ../java/src/org/klomp/snark/SnarkManager.java:1241 msgid "Disconnecting old I2CP destination" msgstr "Kopplar ifrån gammal I2CP destination" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1243 #, java-format msgid "I2CP settings changed to {0}" msgstr "Inställningar för I2CP ändrade till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1246 +#: ../java/src/org/klomp/snark/SnarkManager.java:1248 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Misslyckades med anslutningsförsök med nya inställningar, återställer de gamla I2CP inställningarna" -#: ../java/src/org/klomp/snark/SnarkManager.java:1250 +#: ../java/src/org/klomp/snark/SnarkManager.java:1252 msgid "Unable to reconnect with the old settings!" msgstr "Misslyckades med anslutningsförsök med gamla inställningar!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1252 +#: ../java/src/org/klomp/snark/SnarkManager.java:1254 msgid "Reconnected on the new I2CP destination" msgstr "Återanslöt mot den nya I2CP destinationen" -#: ../java/src/org/klomp/snark/SnarkManager.java:1259 +#: ../java/src/org/klomp/snark/SnarkManager.java:1261 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP-lyssnare omstartad för \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1272 +#: ../java/src/org/klomp/snark/SnarkManager.java:1274 msgid "Enabled autostart" msgstr "Aktiverade automatisk start" -#: ../java/src/org/klomp/snark/SnarkManager.java:1274 +#: ../java/src/org/klomp/snark/SnarkManager.java:1276 msgid "Disabled autostart" msgstr "Inaktiverade automatisk start" -#: ../java/src/org/klomp/snark/SnarkManager.java:1281 +#: ../java/src/org/klomp/snark/SnarkManager.java:1283 msgid "Enabled smart sort" msgstr "Aktiverade smart sortering" -#: ../java/src/org/klomp/snark/SnarkManager.java:1283 +#: ../java/src/org/klomp/snark/SnarkManager.java:1285 msgid "Disabled smart sort" msgstr "Inaktiverade smart sortering" -#: ../java/src/org/klomp/snark/SnarkManager.java:1290 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Aktiverade offentliga bevakare - torrenten måste startas om för att inställningen ska träda i kraft" -#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/SnarkManager.java:1294 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Inaktiverade offentliga bevakare - torrenten måste startas om för att inställningen ska träda i kraft" -#: ../java/src/org/klomp/snark/SnarkManager.java:1299 +#: ../java/src/org/klomp/snark/SnarkManager.java:1301 msgid "Enabled DHT." msgstr "Aktivera DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1301 +#: ../java/src/org/klomp/snark/SnarkManager.java:1303 msgid "Disabled DHT." msgstr "Inaktiverade DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1303 +#: ../java/src/org/klomp/snark/SnarkManager.java:1305 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Förändring i DHT kräver att tunneln stängs och öppnas igen" -#: ../java/src/org/klomp/snark/SnarkManager.java:1310 +#: ../java/src/org/klomp/snark/SnarkManager.java:1312 msgid "Enabled Ratings." msgstr "Aktiverade betyg." -#: ../java/src/org/klomp/snark/SnarkManager.java:1312 +#: ../java/src/org/klomp/snark/SnarkManager.java:1314 msgid "Disabled Ratings." msgstr "Inaktiverade betyg." -#: ../java/src/org/klomp/snark/SnarkManager.java:1319 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 msgid "Enabled Comments." msgstr "Aktiverade kommentarer." -#: ../java/src/org/klomp/snark/SnarkManager.java:1321 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 msgid "Disabled Comments." msgstr "Inaktiverade kommentarer." -#: ../java/src/org/klomp/snark/SnarkManager.java:1334 +#: ../java/src/org/klomp/snark/SnarkManager.java:1336 #, java-format msgid "Comments name set to {0}." msgstr "Kommentarnamn satt till {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1343 #, java-format msgid "{0} theme loaded." msgstr "{0} temat laddat." -#: ../java/src/org/klomp/snark/SnarkManager.java:1348 +#: ../java/src/org/klomp/snark/SnarkManager.java:1350 msgid "Collapsible panels enabled." msgstr "Fällbara paneler aktiverade." -#: ../java/src/org/klomp/snark/SnarkManager.java:1350 +#: ../java/src/org/klomp/snark/SnarkManager.java:1352 msgid "Collapsible panels disabled." msgstr "Fällbara paneler inaktiverade." -#: ../java/src/org/klomp/snark/SnarkManager.java:1360 +#: ../java/src/org/klomp/snark/SnarkManager.java:1362 msgid "Configuration unchanged." msgstr "Inställningar oförändrade." -#: ../java/src/org/klomp/snark/SnarkManager.java:1392 +#: ../java/src/org/klomp/snark/SnarkManager.java:1394 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Listan över offentliga bevakare förändrad - torrenten måste startas om för att inställningen ska träda i kraft" -#: ../java/src/org/klomp/snark/SnarkManager.java:1402 +#: ../java/src/org/klomp/snark/SnarkManager.java:1404 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Privat bevakarlista ändrad - påverkar bara nyligen skapade torrenter" -#: ../java/src/org/klomp/snark/SnarkManager.java:1448 +#: ../java/src/org/klomp/snark/SnarkManager.java:1450 #, java-format msgid "Unable to save the config to {0}" msgstr "Misslyckades med att spara inställningar till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1555 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1236 +#: ../java/src/org/klomp/snark/SnarkManager.java:1557 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1234 #, java-format msgid "Torrent file deleted: {0}" msgstr "Torrentfil borttagen: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1558 +#: ../java/src/org/klomp/snark/SnarkManager.java:1560 #, java-format msgid "Torrent file moved from {0} to {1}" msgstr "Torrentfil flyttad från {0} till {1}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1592 -#: ../java/src/org/klomp/snark/SnarkManager.java:2758 -#: ../java/src/org/klomp/snark/SnarkManager.java:2764 -#: ../java/src/org/klomp/snark/SnarkManager.java:2768 +#: ../java/src/org/klomp/snark/SnarkManager.java:1594 +#: ../java/src/org/klomp/snark/SnarkManager.java:2760 +#: ../java/src/org/klomp/snark/SnarkManager.java:2766 +#: ../java/src/org/klomp/snark/SnarkManager.java:2770 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Problem: Kunde inte lägga till torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1607 -#: ../java/src/org/klomp/snark/SnarkManager.java:1695 -#: ../java/src/org/klomp/snark/SnarkManager.java:2926 +#: ../java/src/org/klomp/snark/SnarkManager.java:1609 +#: ../java/src/org/klomp/snark/SnarkManager.java:1697 +#: ../java/src/org/klomp/snark/SnarkManager.java:2928 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent redan igång: {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1617 +#: ../java/src/org/klomp/snark/SnarkManager.java:1619 #, java-format msgid "Cannot open \"{0}\"" msgstr "Kan inte öppna \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1636 -#: ../java/src/org/klomp/snark/SnarkManager.java:1791 -#: ../java/src/org/klomp/snark/SnarkManager.java:1880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1638 +#: ../java/src/org/klomp/snark/SnarkManager.java:1793 +#: ../java/src/org/klomp/snark/SnarkManager.java:1882 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1117 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1115 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent med denna infohash körs redan: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1642 -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1644 +#: ../java/src/org/klomp/snark/SnarkManager.java:1888 #, java-format msgid "Torrent with the same data location is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1648 +#: ../java/src/org/klomp/snark/SnarkManager.java:1650 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "FEL - Inga I2P bevakare i den privata torrenten \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1650 +#: ../java/src/org/klomp/snark/SnarkManager.java:1652 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Varning - Ingen I2P bevakare i \"{0}\", kommer enbart att annonsera till offentliga I2P bevakare och DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1653 +#: ../java/src/org/klomp/snark/SnarkManager.java:1655 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Varning - Ingen I2P bevakare i \"{0}\" och offentliga bevakare är inaktiverade, kommer enbart att annonsera till DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1655 +#: ../java/src/org/klomp/snark/SnarkManager.java:1657 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -339,43 +339,43 @@ "torrent." msgstr "Varning - Ingen I2P bevakare i \"{0}\" och både DHT och offentliga bevakare är inaktiverade, du bör aktivera offentliga bevakare eller DHT innan du startar torrenten. " -#: ../java/src/org/klomp/snark/SnarkManager.java:1681 +#: ../java/src/org/klomp/snark/SnarkManager.java:1683 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent i \"{0}\" är ogiltig" -#: ../java/src/org/klomp/snark/SnarkManager.java:1687 +#: ../java/src/org/klomp/snark/SnarkManager.java:1689 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:195 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "FEL - Minnet har tagit slut, kan inte skapa torrent från {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1714 +#: ../java/src/org/klomp/snark/SnarkManager.java:1716 msgid "Connecting to I2P" msgstr "Ansluter till I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1717 +#: ../java/src/org/klomp/snark/SnarkManager.java:1719 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Problem vid anslutning till I2P - kontrollera dina inställningar för I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1723 +#: ../java/src/org/klomp/snark/SnarkManager.java:1725 #, java-format msgid "Torrent added and started: {0}" msgstr "Torrent tillagd och startad: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1725 +#: ../java/src/org/klomp/snark/SnarkManager.java:1727 #, java-format msgid "Torrent added: {0}" msgstr "Torrent tillagd: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1805 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Hämtar {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1809 +#: ../java/src/org/klomp/snark/SnarkManager.java:1811 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -383,55 +383,55 @@ "DHT." msgstr "Publika bevakare är inaktiverade och vi har inga DHT-noder. Hämtningen av {0} kan kanske inte genomföras innan du startar en annan torrent eller aktiverar offentliga bevakare eller DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1813 +#: ../java/src/org/klomp/snark/SnarkManager.java:1815 #, java-format msgid "Adding {0}" msgstr "Lägger till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1846 +#: ../java/src/org/klomp/snark/SnarkManager.java:1848 #, java-format msgid "Download already running: {0}" msgstr "Hämtar redan: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1896 -#: ../java/src/org/klomp/snark/SnarkManager.java:1906 -#: ../java/src/org/klomp/snark/SnarkManager.java:1932 -#: ../java/src/org/klomp/snark/SnarkManager.java:2634 +#: ../java/src/org/klomp/snark/SnarkManager.java:1898 +#: ../java/src/org/klomp/snark/SnarkManager.java:1908 +#: ../java/src/org/klomp/snark/SnarkManager.java:1934 +#: ../java/src/org/klomp/snark/SnarkManager.java:2636 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Misslyckades att kopiera torrentfil till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2410 +#: ../java/src/org/klomp/snark/SnarkManager.java:2412 #, java-format msgid "Too many files in \"{0}\" ({1})!" msgstr "För många filer i \"{0}\" ({1})!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2412 +#: ../java/src/org/klomp/snark/SnarkManager.java:2414 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" msgstr "Torrentfilen \"{0}\" kan inte sluta på \".torrent\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2414 +#: ../java/src/org/klomp/snark/SnarkManager.java:2416 #, java-format msgid "No pieces in \"{0}\"!" msgstr "Inga delar i \"{0}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2416 +#: ../java/src/org/klomp/snark/SnarkManager.java:2418 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}!" msgstr "För många delar i \"{0}\", gränsen är {1}!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2418 +#: ../java/src/org/klomp/snark/SnarkManager.java:2420 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B)!" msgstr "Delarna är för stora i \"{0}\" ({1}B)!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2419 +#: ../java/src/org/klomp/snark/SnarkManager.java:2421 #, java-format msgid "Limit is {0}B" msgstr "Gränsen är {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:2421 +#: ../java/src/org/klomp/snark/SnarkManager.java:2423 #, java-format msgid "Torrent \"{0}\" has no data!" msgstr "Torrent \"{0}\" har ingen data!" @@ -441,82 +441,82 @@ #. if (lengths != null) #. for (int i = 0; i < lengths.size(); i++) #. System.out.println("File " + i + " is " + lengths.get(i) + " long."); -#: ../java/src/org/klomp/snark/SnarkManager.java:2430 +#: ../java/src/org/klomp/snark/SnarkManager.java:2432 #, java-format msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" msgstr "Torrenter större än {0}B stöds inte än \"{1}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2447 +#: ../java/src/org/klomp/snark/SnarkManager.java:2449 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Fel: Kunde inte ta bort torrenten {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2470 -#: ../java/src/org/klomp/snark/SnarkManager.java:2489 +#: ../java/src/org/klomp/snark/SnarkManager.java:2472 +#: ../java/src/org/klomp/snark/SnarkManager.java:2491 #, java-format msgid "Torrent stopped: {0}" msgstr "Torrent stoppad: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2509 +#: ../java/src/org/klomp/snark/SnarkManager.java:2511 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent borttagen: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:2517 +#: ../java/src/org/klomp/snark/SnarkManager.java:2519 #, java-format msgid "Adding torrents in {0}" msgstr "Lägger till torrenter om {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2550 +#: ../java/src/org/klomp/snark/SnarkManager.java:2552 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Bandbreddsgräns för uppladdning är {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:2575 +#: ../java/src/org/klomp/snark/SnarkManager.java:2577 #, java-format msgid "Download finished: {0}" msgstr "Hämtning klar: {0}" #. addMessage(_t("Metainfo received for {0}", snark.getName())); -#: ../java/src/org/klomp/snark/SnarkManager.java:2631 -#: ../java/src/org/klomp/snark/SnarkManager.java:2932 +#: ../java/src/org/klomp/snark/SnarkManager.java:2633 +#: ../java/src/org/klomp/snark/SnarkManager.java:2934 #, java-format msgid "Starting up torrent {0}" msgstr "Startar torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2646 +#: ../java/src/org/klomp/snark/SnarkManager.java:2648 #, java-format msgid "Error on torrent {0}" msgstr "Fel på torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2931 +#: ../java/src/org/klomp/snark/SnarkManager.java:2933 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Öppnar I2P tunneln" -#: ../java/src/org/klomp/snark/SnarkManager.java:2951 +#: ../java/src/org/klomp/snark/SnarkManager.java:2953 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Öppnar I2P-tunneln och startar torrenter." -#: ../java/src/org/klomp/snark/SnarkManager.java:3016 +#: ../java/src/org/klomp/snark/SnarkManager.java:3018 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Stoppar alla torrenter och stänger I2P-tunneln." -#: ../java/src/org/klomp/snark/SnarkManager.java:3043 +#: ../java/src/org/klomp/snark/SnarkManager.java:3045 msgid "Closing I2P tunnel after notifying trackers." msgstr "Stänger I2P tunnel efter att ha meddelat bevakare." -#: ../java/src/org/klomp/snark/SnarkManager.java:3113 +#: ../java/src/org/klomp/snark/SnarkManager.java:3115 #, java-format msgid "Finished recheck of torrent {0}, now {1} complete" msgstr "Avslutade omkontroll av torrent {0}, nu {1} färdig" -#: ../java/src/org/klomp/snark/SnarkManager.java:3115 +#: ../java/src/org/klomp/snark/SnarkManager.java:3117 #, java-format msgid "Finished recheck of torrent {0}, unchanged" msgstr "Avslutade omkontroll av torrent {0}, oförändrad" -#: ../java/src/org/klomp/snark/SnarkManager.java:3119 +#: ../java/src/org/klomp/snark/SnarkManager.java:3121 #, java-format msgid "Error checking the torrent {0}" msgstr "Fel vid kontroll av torrent {0}" @@ -552,1211 +552,1215 @@ msgstr "Torrent hämtad från {0}" #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1130 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Torrent finns redan i kön: {0}" #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1141 #, java-format msgid "Torrent at {0} was not valid" msgstr "Torrent vid {0} var inte giltig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:302 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2001 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3079 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:361 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2003 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3082 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2428 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2800 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2803 msgid "Configuration" msgstr "Inställningar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 msgid "Anonymous BitTorrent Client" -msgstr "Anonym BitTorrent Klient" +msgstr "Anonym BitTorrent-klient" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:321 msgid "I2PSnark has stopped" msgstr "I2PSnark har stoppats" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:321 msgid "Router is down" msgstr "Routern är avstängd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Är du säker på att du vill radera filen \\''{0}\\' (hämtade data kommer inte att raderas) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:335 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Är du säker på att du vill ta bort torrenten \"{0}\" och all hämtad data?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349 msgid "Torrents" msgstr "Torrenter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:358 msgid "Refresh page" msgstr "Läs om sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Klicka på \"Lägg till torrent\" för att hämta en torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:445 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443 msgid "clear messages" msgstr "rensa meddelandena" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:500 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:504 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:556 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3529 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3557 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3569 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3581 #, java-format msgid "Sort by {0}" msgstr "Sortera efter{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:524 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:522 msgid "Hide Peers" msgstr "Dölj noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528 msgid "Show Peers" msgstr "Visa noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3067 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3103 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3409 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3420 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3070 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3437 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3448 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:556 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 msgid "File type" msgstr "Filtyp" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 msgid "ETA" msgstr "Förväntas klar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:573 msgid "Estimated time remaining" msgstr "Uppskattad återstående tid" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:599 msgid "Downloaded" msgstr "Hämtade" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3293 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3321 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3555 msgid "Size" msgstr "Storlek" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3328 msgid "Upload ratio" msgstr "Sändningsförhållande" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:632 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 msgid "Uploaded" msgstr "Uppladdat" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 msgid "RX Rate" msgstr "RX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Down Rate" msgstr "Nerhastighet" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 msgid "TX Rate" msgstr "TX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:662 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 msgid "Up Rate" msgstr "Upphastighet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Stop all torrents and the I2P tunnel" msgstr "Stoppa alla torrenter och I2P-tunneln" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 msgid "Stop All" msgstr "Stoppa alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689 msgid "Start all stopped torrents" msgstr "Starta alla stannade torrenter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:693 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:707 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705 msgid "Start All" msgstr "Starta alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:703 msgid "Start all torrents and the I2P tunnel" msgstr "Starta alla torrenter och I2P-tunneln" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:740 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738 msgid "No torrents loaded." msgstr "Inga torrenter lästes in." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:746 msgid "Totals" msgstr "Totalt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:748 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrenter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 ansluten klient" msgstr[1] "{0} anslutna noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:760 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 DHT klient" msgstr[1] "{0} DHT-noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:768 msgid "Dest" msgstr "Destination" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:772 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 msgid "Our destination (identity) for this session" msgstr "Vår destination (identitet) för denna session" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:797 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:795 msgid "Dht Debug" msgstr "Dht-felsökning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 msgid "First" msgstr "Första" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 msgid "First page" msgstr "Första sidan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 msgid "Prev" msgstr "Bakåt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 msgid "Previous page" msgstr "Föregående sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:954 msgid "Next" msgstr "Nästa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:954 msgid "Next page" msgstr "Nästa sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Last" msgstr "Sista" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Last page" msgstr "Sista sidan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1371 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "Kan inte lägga till torrent{0} inuti annan torrent:{1}" #. TODO -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 #, java-format msgid "Download from non-I2P location {0} is not supported" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1150 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1148 #, java-format msgid "Invalid URL: Must start with \"{0}\" or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1227 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet borttagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1238 #, java-format msgid "Torrent file could not be deleted: {0}" msgstr "Torrentfilen kunde inte tas bort: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1223 #, java-format msgid "Download deleted: {0}" msgstr "Hämtning borttagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 #, java-format msgid "Data file deleted: {0}" msgstr "Datafil borttagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Datafil kunde inte tas bort: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1280 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Katalogen kunde inta tas bort: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 #, java-format msgid "Directory deleted: {0}" msgstr "Katalogen bort tagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1352 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "Kan inte lägga till en torrent som slutar på \".torrent\":{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1355 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Torrent med detta namn kör redan: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1363 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "Kan inte lägga till en torrent som inkluderar en I2P directory:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1378 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "Kan inte lägga till en torrent{0} som inkluderar en annan torrent{1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1404 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1402 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Fel - Kan inte inkludera alternativa bevakare utan en primär bevakare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1417 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1415 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Fel - Kan inte blanda privata och publika bevakare i samma torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent skapad för \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1441 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Många I2P bevakare kräver att du registrerar nya torrenter innan uppladdningen påbörjas - gör det innan \"{0}\" startas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1443 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1441 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Misslyckades med att skapa torrent för \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1447 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Det går inte att skapa en torrent för de obefintliga data: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1448 msgid "Error creating torrent - you must enter a file or directory" msgstr "Misslyckades med att skapa torrent - en fil eller mapp måste anges" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2784 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2787 msgid "Delete selected" msgstr "Ta bort valda" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2786 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2789 msgid "Save tracker configuration" msgstr "Spara bevakare konfiguration" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1503 msgid "Removed" msgstr "Borttagen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2783 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2785 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1535 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2786 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2788 msgid "Add tracker" msgstr "Lägg till bevakare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 msgid "Enter valid tracker name and URLs" msgstr "Ange giltigt namn och adresser för bevakaren " #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1565 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2788 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2791 msgid "Restore defaults" msgstr "Återställ standardvärden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 msgid "Restored default trackers" msgstr "Återställ standard bevakare " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1681 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1679 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3385 msgid "Checking" msgstr "Kontrollerar " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3364 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1683 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3392 msgid "Allocating" msgstr "Allokerar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 msgid "Tracker Error" msgstr "Bevakarfel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1741 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 klient" msgstr[1] "{0} noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1713 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3362 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1711 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3390 msgid "Starting" msgstr "Startar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 msgid "Seeding" msgstr "Uppladdning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1722 #, java-format msgid "Seeding to {0} peer" msgid_plural "Seeding to {0} peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1744 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1745 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3289 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3643 msgid "Complete" msgstr "Färdig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747 #, java-format msgid "Downloading from {0} of {1} peers in swarm" msgstr "Hämtar från {0} av {1} noder i svärm" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 #, java-format msgid "Downloading from {0} peer" msgid_plural "Downloading from {0} peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 #, java-format msgid "Connected to {0} peer" msgid_plural "Connected to {0} peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1765 msgid "Stalled" msgstr "Avstannad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 #, java-format msgid "Connected to {0} of {1} peers in swarm" msgstr "Ansluten till {0} av {1} noder i svärm" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1776 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1773 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1774 msgid "No Peers" msgstr "Inga noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1779 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1776 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1777 msgid "Stopped" msgstr "Stoppad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1807 msgid "Torrent details" msgstr "Torrentdetaljer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1836 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4001 msgid "Comments" msgstr "Kommentarer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1860 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1858 msgid "View files" msgstr "Se filer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1860 msgid "Open file" msgstr "Öppna fil" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 msgid "complete" msgstr "färdig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3656 msgid "remaining" msgstr "kvar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1888 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1886 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3260 msgid "Completed" msgstr "Färdig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1926 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1924 msgid "Stop the torrent" msgstr "Stoppa torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1928 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3369 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1926 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3397 msgid "Stop" msgstr "Stoppa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1939 msgid "Start the torrent" msgstr "Starta torrenten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1943 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3371 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3399 msgid "Start" msgstr "Starta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1954 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Ta bort torrenten från den aktiva listan, tar bort .torrent filen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 msgid "Remove" msgstr "Ta bort" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1973 msgid "Delete the .torrent file and the associated data files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1979 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1977 msgid "Delete" msgstr "Ta bort" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1995 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1993 msgid "Peer attached to swarm" msgstr "Nod fäst vid svärm" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023 msgid "Unknown" msgstr "Okänd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2025 msgid "Destination (identity) of peer" msgstr "Destinat (identitet) för nod" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2038 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2041 msgid "Seed" msgstr "Källa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2064 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2067 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Ointressant (nod har inga delar vi behöver)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2069 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Strypt (nod låter oss inte be om delar)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2086 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2089 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Ointresserad (vi har inga delar nod behöver)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2088 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2091 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Stryper (vi låter inte nod be om delar)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207 #, java-format msgid "Details at {0} tracker" msgstr "Detaljer för {0} bevakare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2224 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 msgid "Add Torrent" msgstr "Lägg till torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "From URL" msgstr "Adress" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2310 msgid "" "Enter the torrent file download URL (I2P only), magnet link, or info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315 msgid "Add torrent" msgstr "Lägg till torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2319 msgid "Data dir" msgstr "Datakatalog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2319 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2322 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Ange mappen att spara data i (standard {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Du kan även kopiera .torrent-filer till: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 msgid "Removing a .torrent will cause it to stop." msgstr "Om du tar bort en .torrent stoppas den." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "Create Torrent" msgstr "Skapa torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2344 msgid "Data to seed" msgstr "Data att ladda upp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2345 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2348 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Fil eller katalog att seeda (fullständig sökväg eller inom katalog {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351 msgid "Create torrent" msgstr "Skapa torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2354 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2717 msgid "Trackers" msgstr "Bevakare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2356 msgid "Primary" msgstr "Primär" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2355 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2358 msgid "Alternates" msgstr "Alternativ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2360 msgid "Tracker Type" msgstr "Bevakartyp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2381 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2724 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2384 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2727 msgid "Standard" msgstr "Standard" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2383 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2726 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2386 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2729 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3699 msgid "Open" msgstr "Öppen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2385 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2731 msgid "Private" msgstr "Privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2389 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 msgid "none" msgstr "inga" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435 msgid "Data directory" msgstr "Datamapp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2438 msgid "Directory where torrents and downloaded/shared files are stored" msgstr "Katalog var torrenter och hämtade/delade filer lagras" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2440 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2443 msgid "Files readable by all" msgstr "Filer läsbara för alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2444 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2447 msgid "" "Set file permissions to allow other local users to access the downloaded " "files" msgstr "Ställ in filbehörigheter för att tillåta andra lokala användare att komma åt de nedladdade filerna" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2451 msgid "Auto start torrents" msgstr "Starta torrenter automatiskt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2452 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2455 msgid "" "Automatically start torrents when added and restart torrents when I2PSnark " "starts" msgstr "Starta automatiskt torrenter när de läggs till och starta om torrenter när I2PSnark startar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2456 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2459 msgid "Smart torrent sorting" msgstr "Smart torrentsortering" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 msgid "Ignore words such as 'a' and 'the' when sorting" msgstr "Ignorera ord som \"a\" och \"the\" vid sortering" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2467 msgid "Collapsible panels" msgstr "Fällbara paneler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2469 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 msgid "Your browser does not support this feature." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2475 msgid "" "Allow the 'Add Torrent' and 'Create Torrent' panels to be collapsed, and " "collapse by default in non-embedded mode" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2484 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2487 msgid "Language" msgstr "Språk" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2498 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2499 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2502 msgid "To change themes manually, disable universal theming" msgstr "Om du vill ändra teman manuellt, inaktivera universella teman" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2503 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2506 msgid "Universal theming is enabled." msgstr "Universella teman är aktiverad." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2505 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2605 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3962 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2608 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3990 msgid "Configure" msgstr "Inställningar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2525 msgid "Refresh time" msgstr "Uppdateringsintervall" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2525 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2528 msgid "How frequently torrent status is updated on the main page" msgstr "Hur ofta torrentstatus uppdateras på huvudsidan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2538 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2541 msgid "Never" msgstr "Aldrig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 msgid "Startup delay" msgstr "Uppstartsfördröjning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2551 msgid "How long before auto-started torrents are loaded when I2PSnark starts" msgstr "Hur länge innan automatiskt startade torrenter laddas när I2PSnark startar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2553 msgid "minutes" msgstr "minuter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2558 msgid "Page size" msgstr "Per sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2561 msgid "Maximum number of torrents to display per page" msgstr "Maximalt antal torrenter som ska visas per sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2563 msgid "torrents" msgstr "torrenter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2584 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2587 msgid "Total uploader limit" msgstr "Gräns för totalt antal uppladdare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2588 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2591 msgid "Maximum number of peers for uploading" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2590 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2593 msgid "peers" msgstr "noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2594 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2597 msgid "Up bandwidth limit" msgstr "Gräns för uppladdningsbandbredd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2601 msgid "Maximum bandwidth allocated for uploading" msgstr "Maximal bandbredd avsedd för uppladdning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2603 msgid "Half available bandwidth recommended." msgstr "Hälften av tillgänglig bandbredd rekommenderas." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2603 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2606 msgid "View or change router bandwidth" msgstr "Se eller ändra routerns bandbredd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2609 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2612 msgid "Use open trackers also" msgstr "Använd också offentliga bevakare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2616 msgid "" "Announce torrents to open trackers as well as trackers listed in the torrent" " file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2620 msgid "Enable DHT" msgstr "Aktivera DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2621 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2624 msgid "Use DHT to find additional peers" msgstr "Använd DHT för att hitta ytterligare noder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2625 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2628 msgid "Enable Ratings" msgstr "Aktivera betyg" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2632 msgid "Show ratings on torrent pages" msgstr "Visa betyg på torrentsidor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2636 msgid "Enable Comments" msgstr "Aktivera kommentarer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2637 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2640 msgid "Show comments on torrent pages" msgstr "Visa kommentarer på torrentsidor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2639 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2642 msgid "Comment Author" msgstr "Kommentarförfattare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2645 msgid "Set the author name for your comments and ratings" msgstr "Ange författarnamnet för dina kommentarer och betyg" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2658 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2661 msgid "Inbound Settings" msgstr "Inställningar för inkommande" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2668 msgid "Outbound Settings" msgstr "Inställningar för utgående" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2674 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 msgid "I2CP host" msgstr "I2CP-värd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2679 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2682 msgid "I2CP port" msgstr "I2CP-port" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2697 msgid "I2CP options" msgstr "Alternativ för I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2702 msgid "Save configuration" msgstr "Spara inställningar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2717 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2720 msgid "Select trackers for removal from I2PSnark's known list" msgstr "Välj bevakare för borttagning från I2PSnarks kända lista" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2720 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2723 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 msgid "Name" msgstr "Namn" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2725 msgid "Website URL" msgstr "Webbplatsadress" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2730 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2733 msgid "Announce URL" msgstr "Annonseringsadress" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Mark tracker for deletion" msgstr "Markera bevakare för borttagning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2774 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2777 msgid "Add" msgstr "Lägg till" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2824 #, java-format msgid "Invalid magnet URL {0}" msgstr "Ogiltig magnet-adress {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2829 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2832 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 hopp" msgstr[1] "{0} hopp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2830 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 tunnel" msgstr[1] "{0} tunnlar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3113 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3116 msgid "Torrent file" msgstr "Torrentfil" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3121 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3124 msgid "Data location" msgstr "Plats för data" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3133 msgid "Info hash" msgstr "Info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3153 msgid "Primary Tracker" msgstr "Primär bevakare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3169 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Tracker List" msgstr "Bevakarlista" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3192 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3198 +msgid "Web Seeds" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Comment" msgstr "Kommentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3202 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3230 msgid "Created" msgstr "Skapad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3241 msgid "Created By" msgstr "Skapad av" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3223 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3251 msgid "Added" msgstr "Tillagd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3243 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3271 msgid "Last activity" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3256 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3284 msgid "Magnet link" msgstr "Magnet länk" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3271 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3299 msgid "Private torrent" msgstr "Privat torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3285 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3313 msgid "Completion" msgstr "Färdigställning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3569 msgid "Remaining" msgstr "Kvar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3329 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3357 msgid "Skipped" msgstr "Hoppade över" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3365 msgid "Files" msgstr "Filer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3343 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3371 msgid "Pieces" msgstr "Delar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3376 msgid "Piece size" msgstr "Delstorlek" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3388 msgid "Refresh page for results" msgstr "Ladda om sidan för resultat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3400 msgid "Force Recheck" msgstr "Tvinga omkontroll" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3403 msgid "Stop the torrent in order to check file integrity" msgstr "Stoppa torrenten för att kontrollera filens integritet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407 msgid "Check integrity of the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3388 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3416 msgid "Download files in order" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3389 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3417 msgid "Download pieces in order" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3396 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3984 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3424 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4012 msgid "Save Preference" msgstr "Spara preferens" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3406 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3434 msgid "Resource Not found" msgstr "Resurs hittades inte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3418 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3446 msgid "Resource" msgstr "Resurs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3408 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3419 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3436 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3447 msgid "Base" msgstr "Grund" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3417 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3445 msgid "Resource Does Not Exist" msgstr "Resurs finns inte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3521 msgid "Directory" msgstr "Mapp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3567 msgid "Download Status" msgstr "Hämtningsstatus" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3579 msgid "Download Priority" msgstr "Hämtningsprioritet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3591 msgid "Up to higher level directory" msgstr "Upp till högre mappnivå" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3574 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3602 msgid "Audio Playlist" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3606 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3634 msgid "Torrent not found?" msgstr "Torrenten hittades inte?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3612 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3640 msgid "File not found in torrent?" msgstr "Filen hittades inte i torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3654 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3682 msgid "Preview" msgstr "Förhandsgranskning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3705 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3733 msgid "Download file at high priority" msgstr "Hämta filen med hög prioritet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3710 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3738 msgid "High" msgstr "Hög" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3741 msgid "Download file at normal priority" msgstr "Hämta filen med normal prioritet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3718 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3746 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3720 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3748 msgid "Do not download this file" msgstr "Hämta inte den här filen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3725 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3753 msgid "Skip" msgstr "Hoppa över" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3737 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3765 msgid "Set all high" msgstr "Sätt alla höga" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3740 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3768 msgid "Set all normal" msgstr "Sätt alla normala" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3770 msgid "Skip all" msgstr "Hoppa över alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3771 msgid "Save priorities" msgstr "Spara prioriteter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3957 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3985 msgid "Ratings and Comments" msgstr "Betyg och kommentarer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3988 msgid "Author name required to rate or comment" msgstr "Författarnamn krävs för att betygsätta eller kommentera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3994 msgid "Your author name for published comments and ratings" msgstr "Ditt författarnamn för publicerade kommentarer och betyg" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4008 msgid "Enable viewing and posting comments for this torrent" msgstr "Aktivera visning och inläggning av kommentarer för denna torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4003 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4031 #, java-format msgid "1 star" msgid_plural "{0} stars" msgstr[0] "1 stjärna" msgstr[1] "{0} stjärnor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4005 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4033 msgid "No rating" msgstr "Inget betyg" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4020 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4048 msgid "Rate and Comment" msgstr "Betygsätt och kommentera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4022 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4050 msgid "Rate Torrent" msgstr "Betygsätt torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4052 msgid "Add Comment" msgstr "Lägg till kommentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4036 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4064 msgid "My Rating" msgstr "Mitt betyg" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4049 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4077 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4081 msgid "Average Rating" msgstr "Genomsnittligt betyg" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4054 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4082 msgid "No community ratings currently available" msgstr "Inga gemenskapsbetyg är för närvarande tillgängliga" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4130 msgid "Mark for deletion" msgstr "Markera för borttagning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4143 msgid "Delete Selected" msgstr "Radera Valda" diff -Nru i2p-0.9.49/apps/i2psnark/locale/messages_zh.po i2p-0.9.50/apps/i2psnark/locale/messages_zh.po --- i2p-0.9.49/apps/i2psnark/locale/messages_zh.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/locale/messages_zh.po 2021-05-19 12:11:55.000000000 +0000 @@ -6,7 +6,7 @@ # Translators: # ducki2p , 2011 # foo , 2009 -# Scott Rhodes , 2020 +# Scott Rhodes , 2020-2021 # Tommy Lmath , 2016 # walking , 2013 # wwj402 , 2013 @@ -15,8 +15,8 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-11-16 17:30+0000\n" -"PO-Revision-Date: 2020-11-30 02:15+0000\n" +"POT-Creation-Date: 2021-02-05 14:30+0000\n" +"PO-Revision-Date: 2021-05-08 15:01+0000\n" "Last-Translator: Scott Rhodes \n" "Language-Team: Chinese (China) (http://www.transifex.com/otf/I2P/language/zh_CN/)\n" "MIME-Version: 1.0\n" @@ -30,300 +30,300 @@ msgstr "没有更多种子正在运行。" #: ../java/src/org/klomp/snark/IdleChecker.java:77 -#: ../java/src/org/klomp/snark/SnarkManager.java:3058 -#: ../java/src/org/klomp/snark/SnarkManager.java:3069 +#: ../java/src/org/klomp/snark/SnarkManager.java:3060 +#: ../java/src/org/klomp/snark/SnarkManager.java:3071 msgid "I2P tunnel closed." msgstr "I2P隧道已关闭" #: ../java/src/org/klomp/snark/MagnetURI.java:50 #: ../java/src/org/klomp/snark/MagnetURI.java:60 -#: ../java/src/org/klomp/snark/SnarkManager.java:2705 +#: ../java/src/org/klomp/snark/SnarkManager.java:2707 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:990 -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1070 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1204 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1239 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1347 +#: ../java/src/org/klomp/snark/SnarkManager.java:992 +#: ../java/src/org/klomp/snark/SnarkManager.java:1146 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:736 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1202 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "No write permissions for data directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:993 -#: ../java/src/org/klomp/snark/SnarkManager.java:1137 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:732 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051 +#: ../java/src/org/klomp/snark/SnarkManager.java:995 +#: ../java/src/org/klomp/snark/SnarkManager.java:1139 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:730 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 msgid "Data directory cannot be created" msgstr "无法创建数据目录" -#: ../java/src/org/klomp/snark/SnarkManager.java:1055 +#: ../java/src/org/klomp/snark/SnarkManager.java:1057 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "总上传种子数限制已更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1057 +#: ../java/src/org/klomp/snark/SnarkManager.java:1059 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "最低上传种子数限制为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1069 +#: ../java/src/org/klomp/snark/SnarkManager.java:1071 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "上传带宽限制改为 {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:1071 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "最小上传带宽限制为 {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:1083 +#: ../java/src/org/klomp/snark/SnarkManager.java:1085 #, java-format msgid "Startup delay changed to {0}" msgstr "下载前的延迟已更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1094 +#: ../java/src/org/klomp/snark/SnarkManager.java:1096 #, java-format msgid "Refresh time changed to {0}" msgstr "刷新时间更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1096 +#: ../java/src/org/klomp/snark/SnarkManager.java:1098 msgid "Refresh disabled" msgstr "刷新已禁用" -#: ../java/src/org/klomp/snark/SnarkManager.java:1112 +#: ../java/src/org/klomp/snark/SnarkManager.java:1114 #, java-format msgid "Page size changed to {0}" msgstr "页面容量更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1122 +#: ../java/src/org/klomp/snark/SnarkManager.java:1124 msgid "New files will be publicly readable" msgstr "新文件将对公共可读" -#: ../java/src/org/klomp/snark/SnarkManager.java:1124 +#: ../java/src/org/klomp/snark/SnarkManager.java:1126 msgid "New files will not be publicly readable" msgstr "新文件不会对公共可读" -#: ../java/src/org/klomp/snark/SnarkManager.java:1132 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047 +#: ../java/src/org/klomp/snark/SnarkManager.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1045 msgid "Data directory must be an absolute path" msgstr "数据存放目录必须是绝对路径" -#: ../java/src/org/klomp/snark/SnarkManager.java:1136 +#: ../java/src/org/klomp/snark/SnarkManager.java:1138 msgid "Data directory does not exist" msgstr "数据存放目录不存在" -#: ../java/src/org/klomp/snark/SnarkManager.java:1139 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:732 msgid "Not a directory" msgstr "不是文件夹" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:1143 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 msgid "Unreadable" msgstr "不可读" -#: ../java/src/org/klomp/snark/SnarkManager.java:1148 +#: ../java/src/org/klomp/snark/SnarkManager.java:1150 #, java-format msgid "Data directory changed to {0}" msgstr "数据存放目录更新至{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1229 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP与隧道设置的变化在所有种子停止后才能生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:1233 +#: ../java/src/org/klomp/snark/SnarkManager.java:1235 #, java-format msgid "I2CP options changed to {0}" msgstr "I2CP 选项改为 {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1239 +#: ../java/src/org/klomp/snark/SnarkManager.java:1241 msgid "Disconnecting old I2CP destination" msgstr "正在断开旧的I2CP目标" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1243 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP设置改为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1246 +#: ../java/src/org/klomp/snark/SnarkManager.java:1248 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "无法通过新设置连接,恢复I2CP的旧设置" -#: ../java/src/org/klomp/snark/SnarkManager.java:1250 +#: ../java/src/org/klomp/snark/SnarkManager.java:1252 msgid "Unable to reconnect with the old settings!" msgstr "旧设置也无法连接!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1252 +#: ../java/src/org/klomp/snark/SnarkManager.java:1254 msgid "Reconnected on the new I2CP destination" msgstr "重新连接新I2CP目标" -#: ../java/src/org/klomp/snark/SnarkManager.java:1259 +#: ../java/src/org/klomp/snark/SnarkManager.java:1261 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "\"{0}\"的I2CP监听端口已启动" -#: ../java/src/org/klomp/snark/SnarkManager.java:1272 +#: ../java/src/org/klomp/snark/SnarkManager.java:1274 msgid "Enabled autostart" msgstr "启用自动启动" -#: ../java/src/org/klomp/snark/SnarkManager.java:1274 +#: ../java/src/org/klomp/snark/SnarkManager.java:1276 msgid "Disabled autostart" msgstr "禁用自动启动" -#: ../java/src/org/klomp/snark/SnarkManager.java:1281 +#: ../java/src/org/klomp/snark/SnarkManager.java:1283 msgid "Enabled smart sort" msgstr "已启用智能排序" -#: ../java/src/org/klomp/snark/SnarkManager.java:1283 +#: ../java/src/org/klomp/snark/SnarkManager.java:1285 msgid "Disabled smart sort" msgstr "已禁用智能排序" -#: ../java/src/org/klomp/snark/SnarkManager.java:1290 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "启用OpenTracker-重新启动种子后生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/SnarkManager.java:1294 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "禁用OpenTracker - 重新启动种子后生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:1299 +#: ../java/src/org/klomp/snark/SnarkManager.java:1301 msgid "Enabled DHT." msgstr "DHT 已启用" -#: ../java/src/org/klomp/snark/SnarkManager.java:1301 +#: ../java/src/org/klomp/snark/SnarkManager.java:1303 msgid "Disabled DHT." msgstr "DHT 已禁用" -#: ../java/src/org/klomp/snark/SnarkManager.java:1303 +#: ../java/src/org/klomp/snark/SnarkManager.java:1305 msgid "DHT change requires tunnel shutdown and reopen" msgstr "DHT 修改生效需要关闭或重启。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1310 +#: ../java/src/org/klomp/snark/SnarkManager.java:1312 msgid "Enabled Ratings." msgstr "已允许评分" -#: ../java/src/org/klomp/snark/SnarkManager.java:1312 +#: ../java/src/org/klomp/snark/SnarkManager.java:1314 msgid "Disabled Ratings." msgstr "已禁用评分" -#: ../java/src/org/klomp/snark/SnarkManager.java:1319 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 msgid "Enabled Comments." -msgstr "" +msgstr "已启用评论。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1321 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 msgid "Disabled Comments." -msgstr "" +msgstr "已禁用评论。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1334 +#: ../java/src/org/klomp/snark/SnarkManager.java:1336 #, java-format msgid "Comments name set to {0}." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1343 #, java-format msgid "{0} theme loaded." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1348 +#: ../java/src/org/klomp/snark/SnarkManager.java:1350 msgid "Collapsible panels enabled." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1350 +#: ../java/src/org/klomp/snark/SnarkManager.java:1352 msgid "Collapsible panels disabled." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1360 +#: ../java/src/org/klomp/snark/SnarkManager.java:1362 msgid "Configuration unchanged." msgstr "设置未改变" -#: ../java/src/org/klomp/snark/SnarkManager.java:1392 +#: ../java/src/org/klomp/snark/SnarkManager.java:1394 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "OpenTracker列表已改变 - 重新启动种子后生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:1402 +#: ../java/src/org/klomp/snark/SnarkManager.java:1404 msgid "Private tracker list changed - affects newly created torrents only." msgstr "PT 列表已更改 - 仅对新创建的种子有效" -#: ../java/src/org/klomp/snark/SnarkManager.java:1448 +#: ../java/src/org/klomp/snark/SnarkManager.java:1450 #, java-format msgid "Unable to save the config to {0}" msgstr "无法保存设置到{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1555 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1236 +#: ../java/src/org/klomp/snark/SnarkManager.java:1557 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1234 #, java-format msgid "Torrent file deleted: {0}" msgstr "种子文件已删除:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1558 +#: ../java/src/org/klomp/snark/SnarkManager.java:1560 #, java-format msgid "Torrent file moved from {0} to {1}" msgstr "种子文件已从 {0} 移动到 {1}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1592 -#: ../java/src/org/klomp/snark/SnarkManager.java:2758 -#: ../java/src/org/klomp/snark/SnarkManager.java:2764 -#: ../java/src/org/klomp/snark/SnarkManager.java:2768 +#: ../java/src/org/klomp/snark/SnarkManager.java:1594 +#: ../java/src/org/klomp/snark/SnarkManager.java:2760 +#: ../java/src/org/klomp/snark/SnarkManager.java:2766 +#: ../java/src/org/klomp/snark/SnarkManager.java:2770 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "错误:无法添加种子{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1607 -#: ../java/src/org/klomp/snark/SnarkManager.java:1695 -#: ../java/src/org/klomp/snark/SnarkManager.java:2926 +#: ../java/src/org/klomp/snark/SnarkManager.java:1609 +#: ../java/src/org/klomp/snark/SnarkManager.java:1697 +#: ../java/src/org/klomp/snark/SnarkManager.java:2928 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126 #, java-format msgid "Torrent already running: {0}" msgstr "种子已启动:{0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1617 +#: ../java/src/org/klomp/snark/SnarkManager.java:1619 #, java-format msgid "Cannot open \"{0}\"" msgstr "无法打开 \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1636 -#: ../java/src/org/klomp/snark/SnarkManager.java:1791 -#: ../java/src/org/klomp/snark/SnarkManager.java:1880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1638 +#: ../java/src/org/klomp/snark/SnarkManager.java:1793 +#: ../java/src/org/klomp/snark/SnarkManager.java:1882 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1117 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1115 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "具有相同Hash链接的种子已在下载中:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1642 -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1644 +#: ../java/src/org/klomp/snark/SnarkManager.java:1888 #, java-format msgid "Torrent with the same data location is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1648 +#: ../java/src/org/klomp/snark/SnarkManager.java:1650 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "错误 - 私有种子\"{0}\"中缺少 I2P Tracker" -#: ../java/src/org/klomp/snark/SnarkManager.java:1650 +#: ../java/src/org/klomp/snark/SnarkManager.java:1652 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "警告 - \"{0}\"中缺少 I2P Tracker,程序将仅通过 I2P 中的开放式 Tracker 和 DHT 下载。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1653 +#: ../java/src/org/klomp/snark/SnarkManager.java:1655 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "警告 - \"{0}\"中缺少 I2P Tracker,已禁用 I2P Open Tracker,程序将仅通过 DHT 下载。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1655 +#: ../java/src/org/klomp/snark/SnarkManager.java:1657 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -331,43 +331,43 @@ "torrent." msgstr "警告 - \"{0}\"中缺少 I2P Tracker,已禁用 I2P Open Tracker 和 DHT,下载先您需要先启用 OpenTracker 或 DHT 。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1681 +#: ../java/src/org/klomp/snark/SnarkManager.java:1683 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "无效种子 \"{0}\" " -#: ../java/src/org/klomp/snark/SnarkManager.java:1687 +#: ../java/src/org/klomp/snark/SnarkManager.java:1689 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:195 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "错误: 内存不足,无法为 {0} 创建种子。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1714 +#: ../java/src/org/klomp/snark/SnarkManager.java:1716 msgid "Connecting to I2P" msgstr "正在连接到I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1717 +#: ../java/src/org/klomp/snark/SnarkManager.java:1719 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "连接I2P时发生错误 - 请检查I2CP设置!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1723 +#: ../java/src/org/klomp/snark/SnarkManager.java:1725 #, java-format msgid "Torrent added and started: {0}" msgstr "种子已添加并开始:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1725 +#: ../java/src/org/klomp/snark/SnarkManager.java:1727 #, java-format msgid "Torrent added: {0}" msgstr "种子已添加:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1805 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "正在获取{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1809 +#: ../java/src/org/klomp/snark/SnarkManager.java:1811 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -375,55 +375,55 @@ "DHT." msgstr "OpenTracker被禁用,程序目前没有DHT节点。{0}的下载不会成功,直到您启动另一个种子的下载、重新启用OpenTracker或DHT。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1813 +#: ../java/src/org/klomp/snark/SnarkManager.java:1815 #, java-format msgid "Adding {0}" msgstr "正在添加{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1846 +#: ../java/src/org/klomp/snark/SnarkManager.java:1848 #, java-format msgid "Download already running: {0}" msgstr "已经在下载中:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1896 -#: ../java/src/org/klomp/snark/SnarkManager.java:1906 -#: ../java/src/org/klomp/snark/SnarkManager.java:1932 -#: ../java/src/org/klomp/snark/SnarkManager.java:2634 +#: ../java/src/org/klomp/snark/SnarkManager.java:1898 +#: ../java/src/org/klomp/snark/SnarkManager.java:1908 +#: ../java/src/org/klomp/snark/SnarkManager.java:1934 +#: ../java/src/org/klomp/snark/SnarkManager.java:2636 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "无法复制种子文件到{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2410 +#: ../java/src/org/klomp/snark/SnarkManager.java:2412 #, java-format msgid "Too many files in \"{0}\" ({1})!" msgstr "\"{0}\" ({1}) 含有太多文件!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2412 +#: ../java/src/org/klomp/snark/SnarkManager.java:2414 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" msgstr "种子文件 \"{0}\" 不以 \".torrent\"结尾!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2414 +#: ../java/src/org/klomp/snark/SnarkManager.java:2416 #, java-format msgid "No pieces in \"{0}\"!" msgstr "\"{0}\" 中没有文件分片!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2416 +#: ../java/src/org/klomp/snark/SnarkManager.java:2418 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}!" msgstr "\"{0}\" 中文件分片太多,限额为{1}!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2418 +#: ../java/src/org/klomp/snark/SnarkManager.java:2420 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B)!" msgstr "\"{0}\"({1}B)中分片过大!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2419 +#: ../java/src/org/klomp/snark/SnarkManager.java:2421 #, java-format msgid "Limit is {0}B" msgstr "限额为 {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:2421 +#: ../java/src/org/klomp/snark/SnarkManager.java:2423 #, java-format msgid "Torrent \"{0}\" has no data!" msgstr "种子 \"{0}\" 中无数据!" @@ -433,82 +433,82 @@ #. if (lengths != null) #. for (int i = 0; i < lengths.size(); i++) #. System.out.println("File " + i + " is " + lengths.get(i) + " long."); -#: ../java/src/org/klomp/snark/SnarkManager.java:2430 +#: ../java/src/org/klomp/snark/SnarkManager.java:2432 #, java-format msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" msgstr "目前不支持大于 {0}B 的种子 \"{1}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2447 +#: ../java/src/org/klomp/snark/SnarkManager.java:2449 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "错误:无法删除种子{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2470 -#: ../java/src/org/klomp/snark/SnarkManager.java:2489 +#: ../java/src/org/klomp/snark/SnarkManager.java:2472 +#: ../java/src/org/klomp/snark/SnarkManager.java:2491 #, java-format msgid "Torrent stopped: {0}" msgstr "种子已停止:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2509 +#: ../java/src/org/klomp/snark/SnarkManager.java:2511 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "种子已删除:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:2517 +#: ../java/src/org/klomp/snark/SnarkManager.java:2519 #, java-format msgid "Adding torrents in {0}" msgstr "{0} 分钟内完成添加" -#: ../java/src/org/klomp/snark/SnarkManager.java:2550 +#: ../java/src/org/klomp/snark/SnarkManager.java:2552 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "上传带宽限制为 {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:2575 +#: ../java/src/org/klomp/snark/SnarkManager.java:2577 #, java-format msgid "Download finished: {0}" msgstr "下载已完成: {0}" #. addMessage(_t("Metainfo received for {0}", snark.getName())); -#: ../java/src/org/klomp/snark/SnarkManager.java:2631 -#: ../java/src/org/klomp/snark/SnarkManager.java:2932 +#: ../java/src/org/klomp/snark/SnarkManager.java:2633 +#: ../java/src/org/klomp/snark/SnarkManager.java:2934 #, java-format msgid "Starting up torrent {0}" msgstr "正在启动种子{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2646 +#: ../java/src/org/klomp/snark/SnarkManager.java:2648 #, java-format msgid "Error on torrent {0}" msgstr "种子 {0} 发生错误" -#: ../java/src/org/klomp/snark/SnarkManager.java:2931 +#: ../java/src/org/klomp/snark/SnarkManager.java:2933 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "正在建立 I2P 隧道" -#: ../java/src/org/klomp/snark/SnarkManager.java:2951 +#: ../java/src/org/klomp/snark/SnarkManager.java:2953 msgid "Opening the I2P tunnel and starting all torrents." msgstr "正在打开I2P隧道并启动所有种子" -#: ../java/src/org/klomp/snark/SnarkManager.java:3016 +#: ../java/src/org/klomp/snark/SnarkManager.java:3018 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "正在停用所有种子并关闭I2P隧道。" -#: ../java/src/org/klomp/snark/SnarkManager.java:3043 +#: ../java/src/org/klomp/snark/SnarkManager.java:3045 msgid "Closing I2P tunnel after notifying trackers." msgstr "正在关闭 I2P 隧道,已通知 Tracker。" -#: ../java/src/org/klomp/snark/SnarkManager.java:3113 +#: ../java/src/org/klomp/snark/SnarkManager.java:3115 #, java-format msgid "Finished recheck of torrent {0}, now {1} complete" msgstr "已完成对种子 {0} 的重新检查,现在 {1} 已完成" -#: ../java/src/org/klomp/snark/SnarkManager.java:3115 +#: ../java/src/org/klomp/snark/SnarkManager.java:3117 #, java-format msgid "Finished recheck of torrent {0}, unchanged" msgstr "已完成对种子 {0} 的重新检查,未变更" -#: ../java/src/org/klomp/snark/SnarkManager.java:3119 +#: ../java/src/org/klomp/snark/SnarkManager.java:3121 #, java-format msgid "Error checking the torrent {0}" msgstr "检查种子 {0} 时出错" @@ -544,1201 +544,1205 @@ msgstr "从{0}获取种子成功" #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1130 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128 #, java-format msgid "Torrent already in the queue: {0}" msgstr "种子排队中:{0}" #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1141 #, java-format msgid "Torrent at {0} was not valid" msgstr "{0}的种子中有错误" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:302 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2001 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3079 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:361 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2003 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3082 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2428 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2800 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2803 msgid "Configuration" msgstr "设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 msgid "Anonymous BitTorrent Client" msgstr "匿名的 BitTorrent 客户端" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:321 msgid "I2PSnark has stopped" msgstr "I2PSnark 已停止运行" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:321 msgid "Router is down" msgstr "路由器已关闭" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "你确定你要删除文件 \\“{0} \\” (下载的数据不会被删除)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:335 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "您确定要删除种子“{0}”(下载的数据文件会一并被删除)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349 msgid "Torrents" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:358 msgid "Refresh page" msgstr "刷新页面" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "点击 \"添加种子\" 按钮来获取种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:445 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443 msgid "clear messages" msgstr "清除消息" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:500 msgid "Status" msgstr "状态" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:504 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:556 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3529 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3557 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3569 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3581 #, java-format msgid "Sort by {0}" msgstr "排序按 {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:524 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:522 msgid "Hide Peers" msgstr "隐藏用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528 msgid "Show Peers" msgstr "显示用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3067 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3103 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3409 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3420 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3070 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3437 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3448 msgid "Torrent" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:556 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 msgid "File type" msgstr "文件类型" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 msgid "ETA" msgstr "预计剩余时间" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:573 msgid "Estimated time remaining" msgstr "预计剩余时间" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596 msgid "RX" msgstr "已接收" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:599 msgid "Downloaded" msgstr "已下载" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3293 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3321 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3555 msgid "Size" msgstr "大小" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 msgid "TX" msgstr "已发送" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3328 msgid "Upload ratio" msgstr "上传率" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:632 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 msgid "Uploaded" msgstr "已上传" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 msgid "RX Rate" msgstr "接收速度" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Down Rate" msgstr "下载速度" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 msgid "TX Rate" msgstr "发送速度" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:662 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 msgid "Up Rate" msgstr "上传速度" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Stop all torrents and the I2P tunnel" msgstr "停止全部种子及I2P隧道" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 msgid "Stop All" msgstr "停止全部" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689 msgid "Start all stopped torrents" msgstr "启动所有已停止的种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:693 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:707 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705 msgid "Start All" msgstr "启动全部" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:703 msgid "Start all torrents and the I2P tunnel" msgstr "启动全部种子及I2P隧道" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:740 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738 msgid "No torrents loaded." msgstr "未载入任何种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:746 msgid "Totals" msgstr "总计" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:748 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "{0}个种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "{0}个已连接用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:760 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "{0}个DHT节点" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:768 msgid "Dest" msgstr "目标" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:772 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 msgid "Our destination (identity) for this session" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:797 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:795 msgid "Dht Debug" msgstr "Dht 调试" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 msgid "First" msgstr "首页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 msgid "First page" msgstr "第一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 msgid "Prev" msgstr "前页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 msgid "Previous page" msgstr "上一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:954 msgid "Next" msgstr "下页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:954 msgid "Next page" msgstr "下一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Last" msgstr "末页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Last page" msgstr "最后一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1371 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "无法添加内含另一个种子的种子 {0}:{1}" #. TODO -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 #, java-format msgid "Download from non-I2P location {0} is not supported" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1150 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1148 #, java-format msgid "Invalid URL: Must start with \"{0}\" or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1227 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet 已删除:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1238 #, java-format msgid "Torrent file could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1223 #, java-format msgid "Download deleted: {0}" msgstr "下载已删除: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 #, java-format msgid "Data file deleted: {0}" msgstr "数据文件已删除:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 #, java-format msgid "Data file could not be deleted: {0}" msgstr "无法删除数据文件:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1280 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278 #, java-format msgid "Directory could not be deleted: {0}" msgstr "无法删除目录:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 #, java-format msgid "Directory deleted: {0}" msgstr "目录已经删除: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1352 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "无法添加一个以 \".torrent\" 结尾的种子: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1355 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "此名称的种子已在运行:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1363 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "无法添加包含一个 I2P 目录的种子:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1378 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "无法添加包含另一个种子的种子 {0}:{1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1404 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1402 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "错误 - 缺少主Tracker则无法添加替换Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1417 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1415 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "错误 - PT和公共Tracker无法在同一种子中混用。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437 #, java-format msgid "Torrent created for \"{0}\"" msgstr "种子创建成功\"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1441 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "多数I2PTracker需要用户在做种前注册新种子 - 请在启动 \"{0}\"前到所使用的Tracker进行注册。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1443 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1441 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "创建种子时发生错误 \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1447 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "无法为不存在的数据文件创建种子:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1448 msgid "Error creating torrent - you must enter a file or directory" msgstr "创建种子时发生错误 - 必须指定文件或文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2784 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2787 msgid "Delete selected" msgstr "删除选中项目" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2786 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2789 msgid "Save tracker configuration" msgstr "保存 Tracker 设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1503 msgid "Removed" msgstr "已删除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2783 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2785 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1535 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2786 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2788 msgid "Add tracker" msgstr "添加 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 msgid "Enter valid tracker name and URLs" msgstr "请输入有效的 Tracker 名称与链接" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1565 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2788 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2791 msgid "Restore defaults" msgstr "恢复默认值" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 msgid "Restored default trackers" msgstr "恢复默认 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1681 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1679 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3385 msgid "Checking" msgstr "正在检查" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3364 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1683 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3392 msgid "Allocating" msgstr "正在分配空间" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 msgid "Tracker Error" msgstr "Tracker错误" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1741 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "{0}个用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1713 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3362 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1711 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3390 msgid "Starting" msgstr "正在启动" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 msgid "Seeding" msgstr "正做种" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1722 #, java-format msgid "Seeding to {0} peer" msgid_plural "Seeding to {0} peers" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1744 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1745 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3289 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3643 msgid "Complete" msgstr "完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747 #, java-format msgid "Downloading from {0} of {1} peers in swarm" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 msgid "OK" msgstr "正常" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 #, java-format msgid "Downloading from {0} peer" msgid_plural "Downloading from {0} peers" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 #, java-format msgid "Connected to {0} peer" msgid_plural "Connected to {0} peers" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1765 msgid "Stalled" msgstr "等待" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 #, java-format msgid "Connected to {0} of {1} peers in swarm" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1776 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1773 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1774 msgid "No Peers" msgstr "没有用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1779 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1776 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1777 msgid "Stopped" msgstr "已停用" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1807 msgid "Torrent details" msgstr "种子详情" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1836 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4001 msgid "Comments" msgstr "注释" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1860 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1858 msgid "View files" msgstr "浏览文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1860 msgid "Open file" msgstr "打开文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 msgid "complete" msgstr "完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3656 msgid "remaining" msgstr "剩余" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1888 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1886 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3260 msgid "Completed" msgstr "已完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1926 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1924 msgid "Stop the torrent" msgstr "停止种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1928 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3369 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1926 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3397 msgid "Stop" msgstr "停止" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1939 msgid "Start the torrent" msgstr "启动种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1943 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3371 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3399 msgid "Start" msgstr "启动" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1956 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1954 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "取消下载任务并删除对应种子文件。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 msgid "Remove" msgstr "移除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1973 msgid "Delete the .torrent file and the associated data files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1979 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1977 msgid "Delete" msgstr "删除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1995 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1993 msgid "Peer attached to swarm" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023 msgid "Unknown" msgstr "未知" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2025 msgid "Destination (identity) of peer" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2038 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2041 msgid "Seed" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2064 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2067 msgid "Uninteresting (The peer has no pieces we need)" msgstr "无需要部分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2069 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "拒绝请求" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2086 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2089 msgid "Uninterested (We have no pieces the peer needs)" msgstr "无需要部分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2088 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2091 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "拒绝请求" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207 #, java-format msgid "Details at {0} tracker" msgstr "Tracker {0} 上的详细信息" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2224 msgid "Info" msgstr "信息" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 msgid "Add Torrent" msgstr "添加种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "From URL" msgstr "从URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2310 msgid "" "Enter the torrent file download URL (I2P only), magnet link, or info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315 msgid "Add torrent" msgstr "添加种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2319 msgid "Data dir" msgstr "数据目录" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2319 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2322 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "请输入保存数据的目录(默认 {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "您也可以将.torrent文件复制到: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 msgid "Removing a .torrent will cause it to stop." msgstr "移除一个种子文件 (.torrent) 将导致它中止。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "Create Torrent" msgstr "创建种子" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2344 msgid "Data to seed" msgstr "做种数据" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2345 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2348 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "要做种的文件或目录(完整路径或包含在 {0} 目录中)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351 msgid "Create torrent" msgstr "创建种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2354 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2717 msgid "Trackers" msgstr "Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2356 msgid "Primary" msgstr "主 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2355 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2358 msgid "Alternates" msgstr "备选 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2357 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2360 msgid "Tracker Type" msgstr "Tracker 服务器类型" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2381 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2724 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2384 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2727 msgid "Standard" msgstr "标准" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2383 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2726 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2386 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2729 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3699 msgid "Open" msgstr "打开" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2385 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2731 msgid "Private" msgstr "私有" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2389 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 msgid "none" msgstr "无" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435 msgid "Data directory" msgstr "数据文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2438 msgid "Directory where torrents and downloaded/shared files are stored" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2440 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2443 msgid "Files readable by all" msgstr "文件对所有人可读" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2444 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2447 msgid "" "Set file permissions to allow other local users to access the downloaded " "files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2451 msgid "Auto start torrents" msgstr "自动开始种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2452 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2455 msgid "" "Automatically start torrents when added and restart torrents when I2PSnark " "starts" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2456 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2459 msgid "Smart torrent sorting" msgstr "智能种子排序" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 msgid "Ignore words such as 'a' and 'the' when sorting" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2467 msgid "Collapsible panels" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2469 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 msgid "Your browser does not support this feature." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2475 msgid "" "Allow the 'Add Torrent' and 'Create Torrent' panels to be collapsed, and " "collapse by default in non-embedded mode" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2484 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2487 msgid "Language" msgstr "语言" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2498 msgid "Theme" msgstr "主题" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2499 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2502 msgid "To change themes manually, disable universal theming" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2503 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2506 msgid "Universal theming is enabled." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2505 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2605 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3962 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2608 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3990 msgid "Configure" msgstr "配置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2525 msgid "Refresh time" msgstr "刷新时间" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2525 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2528 msgid "How frequently torrent status is updated on the main page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2538 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2541 msgid "Never" msgstr "从不" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 msgid "Startup delay" msgstr "启动延迟" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2551 msgid "How long before auto-started torrents are loaded when I2PSnark starts" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2553 msgid "minutes" msgstr "分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2558 msgid "Page size" msgstr "页面容量" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2561 msgid "Maximum number of torrents to display per page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2563 msgid "torrents" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2584 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2587 msgid "Total uploader limit" msgstr "限制总上传种子数为" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2588 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2591 msgid "Maximum number of peers for uploading" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2590 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2593 msgid "peers" msgstr "用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2594 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2597 msgid "Up bandwidth limit" msgstr "上传带宽限制" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2601 msgid "Maximum bandwidth allocated for uploading" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2603 msgid "Half available bandwidth recommended." msgstr "推荐设置为可用带宽的一半。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2603 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2606 msgid "View or change router bandwidth" msgstr "浏览或修改路由器带宽" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2609 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2612 msgid "Use open trackers also" msgstr "同时使用OpenTracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2616 msgid "" "Announce torrents to open trackers as well as trackers listed in the torrent" " file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2620 msgid "Enable DHT" msgstr "启用 DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2621 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2624 msgid "Use DHT to find additional peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2625 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2628 msgid "Enable Ratings" msgstr "启用评分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2629 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2632 msgid "Show ratings on torrent pages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2636 msgid "Enable Comments" msgstr "启用评论" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2637 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2640 msgid "Show comments on torrent pages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2639 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2642 msgid "Comment Author" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2645 msgid "Set the author name for your comments and ratings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2658 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2661 msgid "Inbound Settings" msgstr "入站设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2668 msgid "Outbound Settings" msgstr "出站设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2674 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 msgid "I2CP host" msgstr "I2CP主机" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2679 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2682 msgid "I2CP port" msgstr "I2CP端口" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2697 msgid "I2CP options" msgstr "I2CP选项" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2702 msgid "Save configuration" msgstr "保存设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2717 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2720 msgid "Select trackers for removal from I2PSnark's known list" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2720 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2723 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 msgid "Name" msgstr "名称" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2725 msgid "Website URL" msgstr "网站 URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2730 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2733 msgid "Announce URL" msgstr "发布 URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Mark tracker for deletion" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2774 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2777 msgid "Add" msgstr "添加" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2824 #, java-format msgid "Invalid magnet URL {0}" msgstr "磁性链接 {0} 无效" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2829 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2832 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "{0}跳" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2830 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "{0}隧道" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3113 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3116 msgid "Torrent file" msgstr "Torrent文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3121 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3124 msgid "Data location" msgstr "数据位置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3133 msgid "Info hash" msgstr "信息哈希" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3153 msgid "Primary Tracker" msgstr "主 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3169 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Tracker List" msgstr "Tracker 列表" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3192 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3198 +msgid "Web Seeds" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Comment" msgstr "评论" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3202 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3230 msgid "Created" msgstr "已创建" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3241 msgid "Created By" msgstr "创建者" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3223 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3251 msgid "Added" msgstr "已添加" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3243 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3271 msgid "Last activity" msgstr "上次活动" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3256 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3284 msgid "Magnet link" msgstr "Magnet磁性链接" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3271 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3299 msgid "Private torrent" msgstr "私有种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3285 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3313 msgid "Completion" msgstr "完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3569 msgid "Remaining" msgstr "剩余" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3329 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3357 msgid "Skipped" msgstr "已跳过" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3365 msgid "Files" msgstr "文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3343 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3371 msgid "Pieces" msgstr "分块数量" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3376 msgid "Piece size" msgstr "分块大小" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3388 msgid "Refresh page for results" msgstr "刷新页面获取结果" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3400 msgid "Force Recheck" msgstr "强制重新检查" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3403 msgid "Stop the torrent in order to check file integrity" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407 msgid "Check integrity of the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3388 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3416 msgid "Download files in order" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3389 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3417 msgid "Download pieces in order" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3396 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3984 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3424 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4012 msgid "Save Preference" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3406 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3434 msgid "Resource Not found" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3418 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3446 msgid "Resource" msgstr "资源" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3408 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3419 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3436 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3447 msgid "Base" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3417 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3445 msgid "Resource Does Not Exist" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3521 msgid "Directory" msgstr "文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3567 msgid "Download Status" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3579 msgid "Download Priority" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3591 msgid "Up to higher level directory" msgstr "上一层文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3574 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3602 msgid "Audio Playlist" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3606 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3634 msgid "Torrent not found?" msgstr "种子未找到" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3612 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3640 msgid "File not found in torrent?" msgstr "种子中没有发现文件?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3654 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3682 msgid "Preview" msgstr "预览" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3705 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3733 msgid "Download file at high priority" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3710 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3738 msgid "High" msgstr "高" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3741 msgid "Download file at normal priority" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3718 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3746 msgid "Normal" msgstr "普通" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3720 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3748 msgid "Do not download this file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3725 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3753 msgid "Skip" msgstr "跳过" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3737 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3765 msgid "Set all high" msgstr "设置所有为高" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3740 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3768 msgid "Set all normal" msgstr "设置所有为正常" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3742 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3770 msgid "Skip all" msgstr "忽略所有" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3771 msgid "Save priorities" msgstr "保存优先级" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3957 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3985 msgid "Ratings and Comments" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3988 msgid "Author name required to rate or comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3994 msgid "Your author name for published comments and ratings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4008 msgid "Enable viewing and posting comments for this torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4003 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4031 #, java-format msgid "1 star" msgid_plural "{0} stars" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4005 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4033 msgid "No rating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4020 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4048 msgid "Rate and Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4022 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4050 msgid "Rate Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4052 msgid "Add Comment" msgstr "添加评论" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4036 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4064 msgid "My Rating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4049 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4077 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4081 msgid "Average Rating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4054 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4082 msgid "No community ratings currently available" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4130 msgid "Mark for deletion" msgstr "标记为删除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4143 msgid "Delete Selected" msgstr "删除所选" diff -Nru i2p-0.9.49/apps/i2psnark/mime.properties i2p-0.9.50/apps/i2psnark/mime.properties --- i2p-0.9.49/apps/i2psnark/mime.properties 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2psnark/mime.properties 2021-05-19 12:11:55.000000000 +0000 @@ -11,6 +11,7 @@ flac = audio/flac flv = video/x-flv iso = application/x-iso9660-image +jxl = image/jxl m3u = audio/mpegurl m3u8 = audio/mpegurl m4a = audio/mp4a-latm @@ -56,6 +57,7 @@ vtt = text/vtt war = application/java-archive webm = video/webm +webp = image/webp wma = audio/x-ms-wma wmv = video/x-ms-wmv wpl = application/vnd.ms-wpl Binary files /tmp/tmpa2po8ksu/Y97QNf3n1h/i2p-0.9.49/apps/i2psnark/resources/themes/dark/images/dropdown_active.png and /tmp/tmpa2po8ksu/gmqvkxeEbx/i2p-0.9.50/apps/i2psnark/resources/themes/dark/images/dropdown_active.png differ diff -Nru i2p-0.9.49/apps/i2ptunnel/java/build.xml i2p-0.9.50/apps/i2ptunnel/java/build.xml --- i2p-0.9.49/apps/i2ptunnel/java/build.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/java/build.xml 2021-05-19 12:11:55.000000000 +0000 @@ -88,9 +88,17 @@ - + + + + + + diff -Nru i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/GunzipOutputStream.java i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/GunzipOutputStream.java --- i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/GunzipOutputStream.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/GunzipOutputStream.java 2021-05-19 12:11:55.000000000 +0000 @@ -17,9 +17,9 @@ * so we don't have a Reusable version of this. * * Modified from net.i2p.util.ResettableGZIPInputStream to use Java 6 InflaterOutputstream - * @since 0.9.21 + * @since 0.9.21, public since 0.9.50 for LocalHTTPServer */ -class GunzipOutputStream extends InflaterOutputStream { +public class GunzipOutputStream extends InflaterOutputStream { private static final int FOOTER_SIZE = 8; // CRC32 + ISIZE private final CRC32 _crc32; private final byte _buf1[] = new byte[1]; diff -Nru i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java --- i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java 2021-05-19 12:11:55.000000000 +0000 @@ -15,6 +15,7 @@ import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.io.Writer; +import java.net.IDN; import java.net.Socket; import java.net.SocketTimeoutException; import java.net.URI; @@ -144,6 +145,19 @@ // very simple, remember last-failed only private String _lastFailedSSLProxy; + /** available as of Java 6 and Android API 9 */ + private static final boolean _haveIDN; + static { + boolean h; + try { + Class.forName("java.net.IDN", false, ClassLoader.getSystemClassLoader()); + h = true; + } catch (ClassNotFoundException cnfe) { + h = false; + } + _haveIDN = h; + } + protected String getPrefix(long requestId) { return "HTTPClient[" + _clientId + '/' + requestId + "]: "; } @@ -929,7 +943,7 @@ out.write(uri); out.write("\">"); // Long URLs are handled in CSS - out.write(uri); + out.write(decodeIDNURI(uri)); out.write(""); if (usingWWWProxy) { out.write("

"); @@ -997,6 +1011,45 @@ } /** + * Decode the host part of a URI for display. + * Returns original string on any error. + * + * @since 0.9.50 + */ + private static String decodeIDNURI(String uri) { + if (!_haveIDN) + return uri; + if (!uri.contains("xn--")) + return uri; + try { + URI u = new URI(uri); + String h = u.getHost(); + String hu = IDN.toUnicode(h); + if (hu == null || h.equals(hu)) + return uri; + int idx = uri.indexOf(h); + if (idx < 0) + return uri; + return uri.substring(0, idx) + hu + uri.substring(idx + h.length(), uri.length()); + } catch(URISyntaxException use) {} + return uri; + } + + /** + * Decode a hostname for display. + * Returns original string on any error. + * + * @since 0.9.50 + */ + public static String decodeIDNHost(String host) { + if (!_haveIDN) + return host; + if (!host.contains("xn--")) + return host; + return IDN.toUnicode(host); + } + + /** * Flushes. * * Public only for LocalHTTPServer, not for general use diff -Nru i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java --- i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java 2021-05-19 12:11:55.000000000 +0000 @@ -417,6 +417,7 @@ String referer = null; URI origRequestURI = null; boolean preserveConnectionHeader = false; + boolean allowGzip = false; while((line = reader.readLine(method)) != null) { line = line.trim(); if(_log.shouldLog(Log.DEBUG)) { @@ -985,8 +986,9 @@ // strip the accept-blah headers, as they vary dramatically from // browser to browser // But allow Accept-Encoding: gzip, deflate - if(!lowercaseLine.startsWith("accept-encoding: ") && - !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) { + if (lowercaseLine.startsWith("accept-encoding: ")) { + allowGzip = lowercaseLine.contains("gzip"); + } else if (!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) { line = null; continue; } @@ -1163,7 +1165,7 @@ Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER))) { out.write(ERR_HELPER_DISABLED.getBytes("UTF-8")); } else { - LocalHTTPServer.serveLocalFile(_context, sockMgr, out, method, internalPath, internalRawQuery, _proxyNonce); + LocalHTTPServer.serveLocalFile(_context, sockMgr, out, method, internalPath, internalRawQuery, _proxyNonce, allowGzip); } } catch (IOException ioe) { // ignore @@ -1426,16 +1428,20 @@ } } - /** @since 0.8.7 */ + /** + * @param destination the hostname + * @since 0.8.7 + */ private void writeHelperSaveForm(OutputStream outs, String destination, String ahelperKey, String targetRequest, String referer) throws IOException { if(outs == null) return; + String idn = decodeIDNHost(destination); Writer out = new BufferedWriter(new OutputStreamWriter(outs, "UTF-8")); String header = getErrorPage("ahelper-new", ERR_AHELPER_NEW); out.write(header); out.write("\n\n"); + "\n"); try { String b32 = Base32.encode(SHA256Generator.getInstance().calculateHash(Base64.decode(ahelperKey)).getData()); out.write("" + @@ -1447,38 +1453,39 @@ "\n
" + _t("Host") + - "" + destination + "
" + idn + "
" + _t("Base32") + "
\n" + "
\n" + // FIXME if there is a query remaining it is lost - "
\n" + - "

" + _t("Continue to {0} without saving", destination) + "

\n

" + + "\n" + + "

" + "\n
\n" + + "

\n" + "\n\n" + - "
\n" + + "\n" + "\n" + "\n" + - "\n" + + "\n"); - "

" + _t("Save {0} to router address book and continue to website", destination) + "

\n

" + - _t("This address will be saved to your Router address book where your subscription-based addresses are stored.")); - if(_context.namingService().getName().equals("BlockfileNamingService")) { - out.write(" " + _t("If you want to keep track of sites you have added manually, add to your Local or Private address book instead.")); - } // FIXME wasn't escaped String label = _t("Save & continue").replace("&", "&"); - out.write("

\n
\n"); + out.write("
\n"); if(_context.namingService().getName().equals("BlockfileNamingService")) { // only blockfile supports multiple books - out.write("

" + _t("Save {0} to local address book and continue to website", destination) + "

\n

" + + out.write("

\n"); + "

\n\n"); - out.write("

" + _t("Save {0} to private address book and continue to website", destination) + "

\n

" + + out.write("

\n"); + "

\n\n"); } // Firefox (and others?) don't send referer to meta refresh target, which is @@ -1528,7 +1535,7 @@ "

\n" + "

PSK: " + _t("Enter PSK encryption key") + - ": ]

\n" + + ":

\n" + "\n" + "

DH: " + _t("Generate new DH encryption key") + ":

" + diff -Nru i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java --- i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java 2021-05-19 12:11:55.000000000 +0000 @@ -822,7 +822,9 @@ port = isa.getPort(); } } - return getSocket(from, host, port); + // don't do SSL-over-SSL + boolean force = incomingPort == 443 || incomingPort == 22; + return getSocket(from, host, port, force); } /** @@ -833,8 +835,19 @@ * @since 0.9.9 */ protected Socket getSocket(Hash from, InetAddress remoteHost, int remotePort) throws IOException { + return getSocket(from, remoteHost, remotePort, false); + } + + /** + * Get a regular or SSL socket depending on config. + * The SSL config applies to all hosts/ports, unless forced off. + * + * @param forceNonSSL override config + * @since 0.9.50 + */ + private Socket getSocket(Hash from, InetAddress remoteHost, int remotePort, boolean forceNonSSL) throws IOException { String opt = getTunnel().getClientOptions().getProperty(PROP_USE_SSL); - if (Boolean.parseBoolean(opt)) { + if (!forceNonSSL && Boolean.parseBoolean(opt)) { synchronized(sslLock) { if (_sslFactory == null) { try { diff -Nru i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java --- i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java 2021-05-19 12:11:55.000000000 +0000 @@ -28,6 +28,7 @@ import net.i2p.data.PrivateKey; import net.i2p.data.PublicKey; import net.i2p.data.SigningPublicKey; +import net.i2p.i2ptunnel.GunzipOutputStream; import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase; import net.i2p.util.FileUtil; import net.i2p.util.PortMapper; @@ -111,10 +112,11 @@ * @param sockMgr only for /b32, otherwise ignored * @param targetRequest decoded path only, non-null * @param query raw (encoded), may be null + * @param allowGzip may we send a gzipped response? */ public static void serveLocalFile(I2PAppContext context, I2PSocketManager sockMgr, OutputStream out, String method, String targetRequest, - String query, String proxyNonce) throws IOException { + String query, String proxyNonce, boolean allowGzip) throws IOException { //System.err.println("targetRequest: \"" + targetRequest + "\""); // a home page message for the curious... if (targetRequest.equals("/")) { @@ -129,23 +131,34 @@ // theme hack if (filename.startsWith("themes/console/default/")) filename = filename.replaceFirst("default", context.getProperty("routerconsole.theme", "light")); + if (filename.endsWith(".css")) + filename = filename + ".gz"; InputStream in = getResource(filename); if (in != null) { try { String type; - if (filename.endsWith(".css")) - type = "text/css"; + if (filename.endsWith(".css.gz")) + type = "text/css; charset=UTF-8"; else if (filename.endsWith(".ico")) type = "image/x-icon"; else if (filename.endsWith(".png")) type = "image/png"; else if (filename.endsWith(".jpg")) type = "image/jpeg"; - else type = "text/html"; + else type = "text/html; charset=UTF-8"; out.write("HTTP/1.1 200 OK\r\nContent-Type: ".getBytes("UTF-8")); out.write(type.getBytes("UTF-8")); + if (allowGzip && filename.endsWith(".gz")) + out.write("\r\nContent-Encoding: gzip".getBytes("UTF-8")); out.write("\r\nCache-Control: max-age=86400\r\nConnection: close\r\nProxy-Connection: close\r\n\r\n".getBytes("UTF-8")); - DataHelper.copy(in, out); + if (!allowGzip && filename.endsWith(".gz")) { + // gunzip on the fly. should be very rare, all browsers should support gzip + OutputStream out2 = new GunzipOutputStream(out); + DataHelper.copy(in, out2); + out2.flush(); + } else { + DataHelper.copy(in, out); + } } finally { try { in.close(); } catch (IOException ioe) {} } @@ -352,6 +365,7 @@ PortMapper pm = I2PAppContext.getGlobalContext().portMapper(); String conURL = pm.getConsoleURL(); + String idn = I2PTunnelHTTPClientBase.decodeIDNHost(host); out.write(("HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=UTF-8\r\n"+ "Referrer-Policy: no-referrer\r\n"+ @@ -359,7 +373,7 @@ "Proxy-Connection: close\r\n"+ "\r\n"+ ""+ - "" + _t("Redirecting to {0}", host) + "\n" + + "" + _t("Redirecting to {0}", idn) + "\n" + "\n" + "\n" + "\n" + @@ -373,8 +387,8 @@ "
\n" + "

" + (success ? - _t("Saved {0} to the {1} address book, redirecting now.", host, tbook) : - _t("Failed to save {0} to the {1} address book, redirecting now.", host, tbook)) + + _t("Saved {0} to the {1} address book, redirecting now.", idn, tbook) : + _t("Failed to save {0} to the {1} address book, redirecting now.", idn, tbook)) + "

\n

" + _t("Click here if you are not redirected automatically.") + "

").getBytes("UTF-8")); @@ -386,6 +400,7 @@ private static void writeB32RedirectPage(OutputStream out, String host, String url) throws IOException { PortMapper pm = I2PAppContext.getGlobalContext().portMapper(); String conURL = pm.getConsoleURL(); + String idn = I2PTunnelHTTPClientBase.decodeIDNHost(host); out.write(("HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=UTF-8\r\n"+ "Referrer-Policy: no-referrer\r\n"+ @@ -393,7 +408,7 @@ "Proxy-Connection: close\r\n"+ "\r\n"+ ""+ - "" + _t("Redirecting to {0}", host) + "\n" + + "" + _t("Redirecting to {0}", idn) + "\n" + "\n" + "\n" + "\n" + @@ -406,7 +421,7 @@ out.write(("
" + "
\n" + "

" + - _t("Saved the authentication for {0}, redirecting now.", host) + + _t("Saved the authentication for {0}, redirecting now.", idn) + "

\n

" + _t("Click here if you are not redirected automatically.") + "

").getBytes("UTF-8")); diff -Nru i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java --- i2p-0.9.49/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java 2021-05-19 12:11:55.000000000 +0000 @@ -868,7 +868,7 @@ } if (type.equals(TYPE_HTTP_SERVER) || type.equals(TYPE_STREAMR_SERVER)) { String tgzip = _config.getProperty(PROP_TUN_GZIP); - if (tgzip == null || Boolean.valueOf(tgzip)) { + if (tgzip == null || Boolean.parseBoolean(tgzip)) { // Web server will gzip // If web server doesn't gzip, I2PTunnelHTTPServer will. // Streaming will force gzip on first packet for header compression, @@ -933,7 +933,7 @@ } } if (isClient(type) && - (type.equals(TYPE_HTTP_CLIENT) || Boolean.valueOf(_config.getProperty(PROP_SHARED, "false")))) { + (type.equals(TYPE_HTTP_CLIENT) || Boolean.parseBoolean(_config.getProperty(PROP_SHARED)))) { // migration: HTTP proxy and shared clients default to both if (!_config.containsKey(OPT_ENCTYPE)) _config.setProperty(OPT_ENCTYPE, "4,0"); diff -Nru i2p-0.9.49/apps/i2ptunnel/jsp/headers.jsi i2p-0.9.50/apps/i2ptunnel/jsp/headers.jsi --- i2p-0.9.49/apps/i2ptunnel/jsp/headers.jsi 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/jsp/headers.jsi 2021-05-19 12:11:55.000000000 +0000 @@ -6,7 +6,7 @@ request.setCharacterEncoding("UTF-8"); response.setHeader("X-Frame-Options", "SAMEORIGIN"); - response.setHeader("Content-Security-Policy", "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'none'; frame-ancestors 'self'; object-src 'none'; media-src 'none'"); + response.setHeader("Content-Security-Policy", "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; frame-ancestors 'self'; object-src 'none'; media-src 'none'"); response.setHeader("X-XSS-Protection", "1; mode=block"); response.setHeader("X-Content-Type-Options", "nosniff"); response.setHeader("Referrer-Policy", "no-referrer"); diff -Nru i2p-0.9.49/apps/i2ptunnel/jsp/index.jsp i2p-0.9.50/apps/i2ptunnel/jsp/index.jsp --- i2p-0.9.49/apps/i2ptunnel/jsp/index.jsp 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/jsp/index.jsp 2021-05-19 12:11:55.000000000 +0000 @@ -14,6 +14,8 @@ + +

<%=intl._t("Hidden Services Manager")%>

<%=intl._t("These are the local services provided by your router.")%> @@ -177,7 +179,7 @@ } // encName %> - + <% String descr = indexBean.getTunnelDescription(curServer); if (descr != null && descr.length() > 0) { @@ -191,6 +193,38 @@ } // descr %> + +<% + if (("httpserver".equals(indexBean.getInternalType(curServer)) || ("httpbidirserver".equals(indexBean.getInternalType(curServer)))) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) { + if (name != null && !name.equals("") && name.endsWith(".i2p") ) { +%> + +<% + } + } else { + // needed to make the spacing look right + %>  +<% + } +%> + + +<% + if (("httpserver".equals(indexBean.getInternalType(curServer)) || ("httpbidirserver".equals(indexBean.getInternalType(curServer)))) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) { + if (name != null && !name.equals("") && name.endsWith(".i2p") ) { +%> + +<% + } + } else { + // needed to make the spacing look right + %>  +<% + } +%> + + + <% } // for loop diff -Nru i2p-0.9.49/apps/i2ptunnel/jsp/js/copy.js i2p-0.9.50/apps/i2ptunnel/jsp/js/copy.js --- i2p-0.9.49/apps/i2ptunnel/jsp/js/copy.js 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/jsp/js/copy.js 2021-05-19 12:11:55.000000000 +0000 @@ -0,0 +1,37 @@ +/* @license http://www.gnu.org/licenses/gpl-2.0.html GPL-2.0 */ +/* see also licenses/LICENSE-GPLv2.txt */ + +function initCopyLink() { + var buttons = document.getElementsByClassName("tunnelHostnameCopy"); + for (index = 0; index < buttons.length; index++) { + var button = buttons[index]; + addClickHandler(button); + } +} + +function addClickHandler(elem) { + elem.addEventListener("click", function() { + let prevElem = getPreviousHelper(elem).firstElementChild; + prevElem.select(); + document.execCommand("copy"); + alert("Copied the helper to the clipboard", prevElem.value); + }); +} + +document.addEventListener("DOMContentLoaded", function() { + initCopyLink(); +}, true); + +var getPreviousHelper = function (elem) { + var selector = ".tunnelPreview"; + var parent = elem.parentElement + var sibling = parent.previousElementSibling; + while (sibling) { + if (sibling.matches(selector)) return sibling; + sibling = sibling.previousElementSibling; + } + return sibling +}; + + +/* @license-end */ diff -Nru i2p-0.9.49/apps/i2ptunnel/jsp/themes/dark/i2ptunnel.css i2p-0.9.50/apps/i2ptunnel/jsp/themes/dark/i2ptunnel.css --- i2p-0.9.49/apps/i2ptunnel/jsp/themes/dark/i2ptunnel.css 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/jsp/themes/dark/i2ptunnel.css 2021-05-19 12:11:55.000000000 +0000 @@ -430,10 +430,17 @@ } .tunnelPreview, .tunnelPort { - width: 15%; + /*width: 15%;*/ text-align: center; } +.tunnelPreviewHostname { + width: 100%; + height: 1.5em; + overflow: hidden; + background: #332940; +} + .tunnelLocation, .tunnelInterface { width: 20%; } diff -Nru i2p-0.9.49/apps/i2ptunnel/jsp/themes/light/i2ptunnel.css i2p-0.9.50/apps/i2ptunnel/jsp/themes/light/i2ptunnel.css --- i2p-0.9.49/apps/i2ptunnel/jsp/themes/light/i2ptunnel.css 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/jsp/themes/light/i2ptunnel.css 2021-05-19 12:11:55.000000000 +0000 @@ -583,10 +583,21 @@ } .tunnelPreview, .tunnelPort { - width: 15%; + min-width: 15%; text-align: center; } +.tunnelHostnameCopy { + margin-bottom: 1em !important; +} + +.tunnelPreviewHostname { + margin-bottom: 1em !important; + width: 99%; + height: 1.5em; + overflow: hidden; +} + .tunnelLocation, .tunnelInterface { width: 20%; } diff -Nru i2p-0.9.49/apps/i2ptunnel/jsp/wizard.jsp i2p-0.9.50/apps/i2ptunnel/jsp/wizard.jsp --- i2p-0.9.49/apps/i2ptunnel/jsp/wizard.jsp 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/jsp/wizard.jsp 2021-05-19 12:11:55.000000000 +0000 @@ -29,7 +29,7 @@ curPage = 1; } /* Fetch and format a couple of regularly-used values */ - boolean tunnelIsClient = Boolean.valueOf(request.getParameter("isClient")); + boolean tunnelIsClient = Boolean.parseBoolean(request.getParameter("isClient")); String tunnelType = request.getParameter("type"); tunnelType = net.i2p.data.DataHelper.stripHTML(tunnelType); /* Special case - don't display page 4 for server tunnels */ diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_cs.po i2p-0.9.50/apps/i2ptunnel/locale/messages_cs.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_cs.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_cs.po 2021-05-19 12:11:55.000000000 +0000 @@ -5,14 +5,14 @@ # # Translators: # A5h8d0wf0x , 2014 -# trendspotter , 2020 +# trendspotter, 2020-2021 # Waseihou Watashi , 2012 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-12 13:39+0000\n" -"PO-Revision-Date: 2020-08-12 18:50+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 16:05+0000\n" "Last-Translator: zzzi2p\n" "Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n" "MIME-Version: 1.0\n" @@ -66,20 +66,20 @@ msgstr "vyšší šířka pásma a spolehlivost" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:100 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:618 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1096 +#: ../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 "" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:187 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:317 +#: ../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 "Neplatně odeslaný formulář, nejspíše jste použili tlačítka 'Zpět' nebo 'Znovu načíst' ve vašem prohlížeči. Prosím odešlete formulář znovu." #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:189 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:316 msgid "" "If the problem persists, verify that you have cookies enabled in your " "browser." @@ -173,7 +173,7 @@ msgstr "HTTP bidir" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:453 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "Host není nastaven" @@ -181,324 +181,324 @@ msgid "Invalid address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:169 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:154 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:186 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:173 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:172 msgid "Edit Client Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:173 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:172 msgid "Edit Hidden Service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:187 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:184 msgid "Are you sure you want to delete?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:208 msgid "Edit proxy settings" msgstr "Editovat nastavení proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:219 msgid "New proxy settings" msgstr "Nové nastavení proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:263 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1118 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:420 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "Jméno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:265 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1120 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:225 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:422 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "Typ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:267 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1122 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:264 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1119 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:377 msgid "" "Name of tunnel to be displayed on Tunnel Manager home page and the router " "console sidebar" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:273 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1128 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:608 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "Popis" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:275 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1130 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1127 msgid "Auto Start Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:277 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1129 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:383 msgid "Description of tunnel to be displayed on Tunnel Manager home page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:281 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1136 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:583 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1133 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:580 msgid "" "Enable this option to ensure this service is available when the router " "starts" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:285 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1140 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:584 msgid "Automatically start tunnel when router starts" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:289 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:286 msgid "" "The client tunnel and all other shared client tunnels must be stopped to " "change this setting" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:287 msgid "The client tunnel must be stopped to change this setting" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:304 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1156 msgid "Target" msgstr "Cíl" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:306 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1157 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1210 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1154 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1207 msgid "Access Point" msgstr "Přístupové místo (access point)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:309 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1031 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1174 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1212 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2397 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:490 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:513 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:699 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1028 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 +#: ../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 "Port" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:315 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:438 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1179 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1217 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1176 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1289 msgid "required" msgstr "požadováno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:318 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1182 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:512 msgid "Specify the local port this service should be accessible from" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1025 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1166 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2391 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:467 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1022 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:464 msgid "Host" msgstr "Host" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:344 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1168 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:469 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1165 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:466 msgid "Hostname or IP address of the target server" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:347 msgid "Local interface (ip address) the client tunnel will be reachable from" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:354 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1234 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:541 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:707 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1231 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:704 msgid "Reachable by" msgstr "Dosažitelné (kým)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:380 msgid "Use SSL?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:382 msgid "" "If you are accessing a service on a remote I2P router, you may wish to " "connect with SSL to avoid traffic interception. The client application " "should be also be configured to use SSL." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:386 msgid "Clients use SSL to connect to tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:397 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:414 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:394 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:411 msgid "Outproxies" msgstr "Výstupní proxy (Outproxies)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:399 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:411 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:408 msgid "" "Specify the .i2p address or destination (b32 or b64) of the outproxy here." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:398 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:442 msgid "" "For a random selection from a pool, separate with commas e.g. " "server1.i2p,server2.i2p" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:406 msgid "SSL Outproxies" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:418 msgid "Use Outproxy Plugin" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:420 msgid "" "If an outproxy plugin is installed (e.g. Orchid), use this instead of any " "configured outproxies to access websites outside of I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:424 msgid "Use plugin instead of above-listed proxies if available" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:433 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433 msgid "Tunnel Destination" msgstr "Cíl tunelu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:440 msgid "" "Specify the .i2p address or destination (b32 or b64) of the tunnel here." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:449 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:442 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:455 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:452 msgid "b32 not recommended" msgstr "není doporučeno b32" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:468 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:601 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "Sdílený klient" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:473 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:470 msgid "" "Traffic from all clients with this feature enabled will be routed over the " "same set of tunnels. This will make profiling the tunnels by an adversary " "more difficult, but will link the clients together." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:484 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:481 msgid "Share tunnels with other clients?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:499 msgid "Enable DCC" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:501 msgid "Enables direct chat and file transfers, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:505 msgid "" "Enable Direct Client-to-Client protocol. Note that this will compromise your" " anonymity and is not recommended." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:514 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1408 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:511 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1405 msgid "Advanced networking options" msgstr "Rozšířená síťová nastavení" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:522 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:519 msgid "" "Note: When this client proxy is configured to share tunnels, then these " "options are for all the shared proxy clients!" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:528 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1407 msgid "Tunnel Length Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:530 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1421 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1529 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1526 msgid "Length" msgstr "Délka" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:532 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1423 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:529 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1420 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1528 msgid "Variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:534 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1425 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1533 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1422 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1530 msgid "Length of each Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:542 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:547 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:552 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:557 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:565 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:569 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:573 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:577 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:584 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1432 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1437 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1442 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1447 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1455 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1459 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1463 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1467 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1474 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1540 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1544 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1548 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1552 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1556 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1560 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1564 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1568 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:544 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:554 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:562 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:566 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:570 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:574 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:581 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1429 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1439 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1444 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1452 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1464 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1471 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1537 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1545 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1553 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1557 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1561 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1565 #, java-format msgid "{0} hop tunnel" msgid_plural "{0} hop tunnel" @@ -507,135 +507,135 @@ msgstr[2] "" msgstr[3] "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:543 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:540 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1430 msgid "no anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:548 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1438 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1435 msgid "low anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:553 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1443 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:550 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1440 msgid "medium anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:558 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1448 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1445 msgid "high anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:590 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:587 msgid "Level of Randomization for Tunnel Length" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:597 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1486 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1577 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:594 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1483 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1574 msgid "0 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:598 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1487 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:595 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1484 msgid "no randomization, consistent performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:602 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1491 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1581 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1488 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1578 msgid "+ 0-1 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:603 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1492 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:600 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1489 msgid "medium randomization, lower performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:607 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1496 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1585 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:604 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1493 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1582 msgid "+ 0-2 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:608 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1497 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1494 msgid "high randomization, very low performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:612 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1501 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1589 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:609 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1498 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1586 msgid "+/- 0-1 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:613 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:610 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1499 msgid "standard randomization, standard performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:617 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1506 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1593 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:614 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1503 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1590 msgid "+/- 0-2 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:618 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1507 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:615 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1504 msgid "not recommended" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:629 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1518 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1604 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:626 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1601 msgid "hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:634 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1613 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:631 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1610 msgid "Tunnel Quantity Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:636 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1624 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1674 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1621 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1671 msgid "Count" -msgstr "" +msgstr "Počet" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:638 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1626 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1676 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:635 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1623 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1673 msgid "Backup Count" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:640 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1628 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1678 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1625 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1675 msgid "Number of Tunnels in Group" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:644 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1632 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1682 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1629 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1679 msgid "Number of Reserve Tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:652 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:657 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:662 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:667 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:676 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1639 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1644 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1649 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1654 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1663 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1689 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1693 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1697 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1701 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1708 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:649 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:654 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:659 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:664 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:673 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1636 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1641 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1646 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1651 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1660 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1686 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1690 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1694 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1698 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1705 #, java-format msgid "{0} backup tunnel" msgid_plural "{0} backup tunnels" @@ -644,1682 +644,1693 @@ msgstr[2] "" msgstr[3] "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:653 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1640 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:650 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1637 msgid "no redundancy, no added resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:658 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1645 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:655 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1642 msgid "low redundancy, low resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:663 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1650 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:660 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1647 msgid "medium redundancy, medium resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:668 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1655 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:665 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1652 msgid "high redundancy, high resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:682 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:679 msgid "Tunnel Management Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:688 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:685 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2263 msgid "Profile" msgstr "Profil" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:690 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:687 msgid "Delay Connect" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:692 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:689 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2265 msgid "Connection Profile" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:699 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:696 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2272 msgid "interactive connection" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:703 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2271 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:700 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2276 msgid "bulk connection (downloads/websites/BT)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:705 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:702 msgid "Delay Connection" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:709 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:706 msgid "for request/response connections" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:721 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:718 msgid "Delay tunnel open until required" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:723 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:720 msgid "Conserve resources by only creating tunnels when required" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:727 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:724 msgid "" "Delay opening client tunnel until activity is detected on the configured " "tunnel port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:733 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:730 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2282 msgid "Reduce tunnel quantity when idle" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:735 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:732 msgid "" "Reduce tunnel count when idle but keep tunnel open (to ensure immediate " "availability)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:739 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2281 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:736 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2286 msgid "Reduce tunnel quantity when idle to conserve resources" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:741 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:743 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:738 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:740 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2288 msgid "Reduced tunnel count" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:747 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:761 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2289 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:744 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:758 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2294 msgid "Idle period" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:749 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:746 msgid "Reduced Tunnel Idle Time" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:753 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:750 msgid "Close tunnels when idle" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:755 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:752 msgid "To conserve resources, close tunnels when not in use" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:759 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:756 msgid "Close client tunnels after specified idle period" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:763 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:760 msgid "Close Tunnel Idle Time" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:773 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:770 msgid "Change tunnel identity (destination) when tunnels reopen" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:775 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:772 msgid "Retain tunnel identity (destination) when tunnels reopen" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:781 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:778 msgid "New Keys on Reopen" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:787 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:784 msgid "Enable" msgstr "Zapnout" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:793 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1739 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1749 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:790 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1736 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1746 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2184 msgid "Disable" msgstr "Zakázat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:805 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:802 msgid "Persistent private key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:808 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:805 msgid "" "Enabling this feature will ensure your tunnel identity (destination) remains" " static, for services offering features based on destination e.g. IRC user " "authentication" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:810 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1295 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2101 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:807 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2095 msgid "Path to Private Key File" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:819 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:816 msgid "Generate key to enable persistent client tunnel identity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:821 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:818 msgid "File" msgstr "Soubor" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:833 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1275 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:830 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1272 msgid "Local destination" -msgstr "" +msgstr "Místní cíl" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:835 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:832 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1281 msgid "Read Only: Local Destination (if known)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:839 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:836 msgid "Local Base32" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:850 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:847 msgid "Tunnel Filtering Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:852 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:849 msgid "HTTP Filtering" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:854 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:851 msgid "" "When enabled, the user agent of your web browser or http client will not be " "spoofed, potentially reducing your anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:858 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:855 msgid "Do not spoof User-Agent header" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:860 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:857 msgid "" "When enabled, the referer (originating page) of your web requests will not " "be filtered, potentially reducing your anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:864 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:861 msgid "Do not block Referer header" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:866 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:863 msgid "" "When enabled, the accept headers (mime types support) broadcast by your web " "browser will not be filtered, potentially reducing your anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:870 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:867 msgid "Do not block Accept headers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:872 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:869 msgid "Allow SSL to I2P addresses when enabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:876 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:873 msgid "Allow SSL to I2P addresses" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:884 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2019 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:881 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2016 msgid "Configuration cannot be changed after destination is created" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:889 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1724 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:886 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1721 msgid "Tunnel Cryptography Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:893 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2028 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:890 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2025 msgid "Signature type" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:897 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2032 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:894 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2029 msgid "Legacy option (deprecated), provided for backward compatibility" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:926 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2053 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:923 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2050 msgid "This is the default, recommended option" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:941 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2075 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:938 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2072 msgid "Encryption types" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:951 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2085 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:656 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:948 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2082 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:653 msgid "Experts only!" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:957 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2091 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:954 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2088 msgid "Both encryption types" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:963 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:960 msgid "Tunnel Authentication Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:965 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:962 msgid "Local Authorization" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:967 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:964 msgid "" "Enable to require a username and password to access this local service (for " "example if hosting on a LAN)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:971 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:968 msgid "Require local authorization for this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:973 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:989 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:970 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:986 msgid "Username" msgstr "Uživatelské jméno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:975 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:972 msgid "Set username required to access this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:977 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:995 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:974 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:992 msgid "Password" msgstr "Heslo" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:979 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1859 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1046 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:976 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1856 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1043 msgid "Set password required to access this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:981 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:978 msgid "Outproxy Authorization" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:983 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:980 msgid "Enable if the outproxy a username and password to access" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:987 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:984 msgid "Outproxy requires authorization" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:991 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:988 msgid "Enter username required by outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:997 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:994 msgid "Enter password required by outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1007 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1004 msgid "Tunnel Address Lookup Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1009 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1006 msgid "Jump URL List" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1011 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1008 msgid "" "List of helper URLs providing jump links when a host is not found in your " "addressbook" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1023 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2389 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1020 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2394 msgid "Router I2CP Address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1027 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2393 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1024 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2398 msgid "I2CP Hostname or IP" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1033 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1030 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2404 msgid "I2CP Port Number" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1041 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2407 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1038 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2412 msgid "Custom options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1043 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1040 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2414 msgid "Advanced tunnel, streaming, and I2CP options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1047 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:602 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:748 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1044 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:745 msgid "Cancel" msgstr "Zrušit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1049 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1046 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2420 msgid "Delete this Proxy (cannot be undone)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1052 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1049 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2423 msgid "Delete" msgstr "Smazat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1054 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2420 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1051 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2425 msgid "Save" msgstr "Uložit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1067 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1064 msgid "Edit Server Settings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1078 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1075 msgid "New Server Settings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1143 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1140 msgid "The hidden service must be stopped to change this setting" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1183 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:492 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1180 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:489 msgid "Specify the port the server is running on" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1198 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1195 msgid "" "To avoid traffic sniffing if connecting to a remote server, you can enable " "an SSL connection. Note that the target server must be configured to accept " "SSL connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1199 msgid "Use SSL to connect to target" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1217 msgid "" "Port required to access service (this can be a different port to the port " "the service is hosted on)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1237 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1234 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:540 msgid "" "Listening interface (IP address) for client access (normally 127.0.0.1)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1264 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:662 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:659 msgid "Website Hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1266 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1263 msgid "Website Hostname e.g. mysite.i2p" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1270 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1267 msgid "(leave blank for outproxies)" msgstr "(nechejte prázdné pro výstupní proxiny)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1282 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1279 msgid "Private key file" msgstr "Soubor s privátním klíčem" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1341 msgid "Generate a QR Code for this domain" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2140 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2145 msgid "Generate QR Code" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1359 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2147 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1356 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2152 msgid "Add to Private addressbook" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1365 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1362 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2158 msgid "Add to local addressbook" msgstr "Přidat do lokální knihy kontaktů (addressbook)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1371 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1368 msgid "Register, unregister or change details for hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1373 msgid "Registration Authentication" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1382 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1379 msgid "HTTPS configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1387 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1384 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:215 msgid "SSL Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1397 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1394 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2168 msgid "" "Note: In order to enable QR code generation or registration authentication, " "configure the Website Hostname field (for websites) or the Name field " "(everything else) above with an .i2p suffixed hostname e.g. mynewserver.i2p" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1415 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1618 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1615 msgid "Inbound" msgstr "Příchozí" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1479 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1570 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1567 msgid "Level of Randomization for Tunnel Depth" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1527 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1672 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1669 msgid "Outbound" msgstr "Odchozí" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1726 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1723 msgid "Encrypt Leaseset" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1735 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1745 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1732 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1742 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2180 msgid "Allow all clients to connect to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1755 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1785 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1752 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1782 msgid "Send key to all users." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1759 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1789 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "Zašifrováno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1769 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1766 msgid "Prevents server discovery by floodfills" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1773 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1770 msgid "Blinded" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1779 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1804 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1817 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1776 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1801 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1814 msgid "Send password to all users." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1783 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1780 msgid "Blinded with lookup password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1791 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1788 msgid "Send key and password to all users." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1795 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1792 msgid "Encrypted with lookup password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1797 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1803 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1794 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1800 msgid "Send individual key to each user." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1801 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1814 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1798 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1811 msgid "Encrypted with per-user key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1808 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1821 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1805 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1818 msgid "Encrypted with lookup password and per-user key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1810 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1816 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1807 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1813 msgid "Enter key from each user." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1834 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1831 msgid "Optional lookup password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1849 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1846 msgid "Encryption Key" msgstr "Šifrovací klíč" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1877 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1874 msgid "Encryption key required to access this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1891 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1888 msgid "Revoke" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1893 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1930 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1890 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1927 msgid "Client Name" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1895 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1938 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1892 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1935 msgid "Client Key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1912 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1944 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1909 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1941 msgid "Client" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1928 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1925 msgid "Add" msgstr "Přidat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2060 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2057 msgid "Recommended for blinded and encrypted destinations" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2099 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2101 msgid "Alternate private key file" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2110 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2115 msgid "Alternate local destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2112 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2117 msgid "Read Only: Alternate Local Destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2171 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2176 msgid "Tunnel Access Control Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2173 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2178 msgid "Restricted Access List" msgstr "Seznam těch s omezeným přístupem" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2181 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2186 msgid "Prevent listed clients from connecting to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2185 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2190 msgid "Deny List" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2187 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2192 msgid "Only allow listed clients to connect to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2191 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2196 msgid "Allow List" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2193 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2198 msgid "Access List Description" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2195 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2200 msgid "Specify clients, 1 per line" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2197 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2202 msgid "Control access to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2206 msgid "Filter Definition File" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2208 msgid "You can define an advanced filter for this tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2205 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2210 msgid "Format Specification" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2212 msgid "Absolute path to file containing filter definition" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2216 msgid "Server Access Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2217 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2222 msgid "Prevent clients from accessing this service via an inproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2221 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2226 msgid "Block Access via Inproxies" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2225 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2230 msgid "Block Accesses containing Referers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2232 msgid "Deny User-Agents matching these strings (probably from inproxies)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2231 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2236 msgid "Block these User-Agents" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2233 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2238 msgid "comma separated, e.g. Mozilla,Opera (case-sensitive)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2240 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2245 msgid "" "Use unique IP addresses for each connecting client (local non-SSL servers " "only)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2244 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2249 msgid "Unique Local Address per Client" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2246 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2251 msgid "Only enable if you are hosting this service on multiple routers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2250 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2255 msgid "Optimize for Multihoming" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2252 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2257 msgid "Tunnel Performance Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2285 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2290 msgid "Number of tunnels to keep open to maintain availability of service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2291 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2296 msgid "Period of inactivity before tunnel number is reduced" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2295 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2361 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2373 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2381 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2386 msgid "minutes" msgstr "minut" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2297 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2302 msgid "Server Throttling" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2304 msgid "Inbound connection limits (0=unlimited)" msgstr "Limit příchozích spojení (0 = bez omezení)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2306 msgid "Per Minute" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2308 msgid "Per Hour" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2305 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2310 msgid "Per Day" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2351 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2356 msgid "Per Client" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2309 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2314 msgid "" "Maximum number of web page requests per minute for a unique client before " "access to the server is blocked" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2313 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2318 msgid "" "Maximum number of web page requests per hour for a unique client before " "access to the server is blocked" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2317 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2363 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2368 msgid "Total" msgstr "Celkově" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2328 msgid "" "Total number of web page requests per minute before access to the server is " "blocked" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2327 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2331 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2340 msgid "Max concurrent connections (0=unlimited)" msgstr "Maximální počet současných spojení (0 = bez omezení)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2342 msgid "Maximum number of simultaneous client connections" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2350 msgid "POST limits (0=unlimited)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2347 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2352 msgid "Per Period" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2354 msgid "Ban Duration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2353 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2358 msgid "" "Maximum number of post requests permitted for a unique client for the " -"configured timespan" +"configured time span" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2357 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2362 msgid "" "If a client exceeds the maximum number of post requests per allocated " "period, enforce a ban for this number of minutes" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2365 -msgid "Total number of post requests permitted for the configured timespan" +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2369 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2380 msgid "POST limit period" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2377 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2382 msgid "" -"Timespan for the maximum number of post requests to be reached before a ban " -"is triggered" +"Time span for the maximum number of post requests to be reached before a ban" +" is triggered" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2435 msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:164 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" -" the same set of tunnels and be listed as \"Shared Clients\" and \"Shared " -"Clients(DSA)\"." +" the same set of tunnels and be listed as \"Shared Clients\"." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:178 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "Obnovit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:193 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "Smazat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:206 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "Zastavit vše" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "Spustit vše" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "Spustit vše znovu (restartovat)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "Ukazuje na" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "Náhled" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:428 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "Stav" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:233 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "Control" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "Bez náhledu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:308 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "Spouštím" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:310 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:329 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:477 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:317 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:336 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:484 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:501 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "Zastaveno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:511 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "Běží" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "Zastaven" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:530 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:355 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "Zapnout" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "Cíl" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "Hostitelské jméno" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:414 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:635 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:289 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:323 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:347 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:353 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:634 msgid "Standard" msgstr "Standarní" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:416 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "Vytvořit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:424 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "Rozhraní" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:494 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:562 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:581 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "žádný" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:190 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:189 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:210 msgid "Registration Helper" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:240 msgid "" "This service uses encrypted leasesets. Registration is not recommended. " "Registration authentication is disabled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:249 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:246 msgid "" "Please be sure to select, copy, and paste the entire contents of the " "appropriate authentication data into the form of your favorite registration " "site" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:653 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:650 msgid "Tunnel name" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:259 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:256 msgid "Website name" msgstr "Jméno webové stránky" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:264 msgid "Local Destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:275 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:671 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:668 msgid "Local destination is not available. Start the tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:282 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:678 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:279 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:675 msgid "" "To enable registration verification, edit tunnel and set name (or website " -"name) to a valid host name ending in '.i2p'" +"name) to a valid hostname ending in '.i2p'" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:288 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:684 +#: ../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 " -"host name ending in '.i2p'" +"hostname ending in '.i2p'" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:294 msgid "Destination signing key is not available. Start the tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:303 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:310 #, java-format msgid "Authentication for adding host {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:315 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:330 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:368 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:436 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:471 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:544 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:398 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:468 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:541 msgid "Copy and paste this to the registration site" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:317 msgid "Advanced authentication strings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:325 #, java-format msgid "Authentication for removing host {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:356 msgid "Authentication for changing name" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:373 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:370 #, java-format msgid "This will change the name from {0} to {1}, using the same destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:379 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:412 -msgid "This tunnel must be configured with the new host name." +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:381 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:414 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:411 msgid "Enter old hostname below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:392 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:389 msgid "Authentication for adding alias" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:403 #, java-format msgid "This will add an alias {0} for {1}, using the same destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:426 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:423 msgid "Authentication for changing destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:438 #, java-format msgid "This will change the destination for {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:447 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:516 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:444 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:513 msgid "This tunnel must be configured with the new destination." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:449 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:446 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:515 msgid "Enter old destination below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:458 msgid "Authentication for adding alternate destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:476 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:510 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:473 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:507 #, java-format msgid "This will add an alternate destination for {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:533 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:530 msgid "Authentication for adding subdomain" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:546 #, java-format msgid "This will add a subdomain {0} of {1}, with a different destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:552 msgid "This tunnel must be configured with the new subdomain and destination." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:557 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:554 msgid "Enter higher-level domain and destination below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:574 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1086 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:571 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1083 msgid "Go back and edit the tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:585 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:582 msgid "Specify old name and destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:584 msgid "This is only required for advanced authentication." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:589 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:586 msgid "See above for required items." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:596 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:593 msgid "Old hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:600 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:597 msgid "Private Key File for old Destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:604 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:601 msgid "Generate Authentication" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:607 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:604 msgid "Generate" msgstr "Generovat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:183 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:182 msgid "SSL Helper" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:692 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:689 msgid "Base32" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:700 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:697 msgid "Alt Base32" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:709 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:706 msgid "Incoming I2P Port Routing" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:711 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:708 msgid "I2P Port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:713 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:710 msgid "Virtual Host" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:715 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:793 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:712 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:790 msgid "SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:717 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:787 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:714 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:784 msgid "Server" msgstr "Server" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:723 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:720 msgid "Default" msgstr "Výchozí" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:785 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:782 msgid "Jetty Server" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:789 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:786 msgid "Configuration Files" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:791 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:788 msgid "Enabled" msgstr "Povoleno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:846 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:843 msgid "I2P webserver (eepsite)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1028 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1025 msgid "SSL is enabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1030 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1027 msgid "Disable SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1036 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1033 msgid "SSL is disabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1038 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1035 msgid "Enable SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1044 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1041 msgid "New Certificate Password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1052 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1049 msgid "Generate new SSL certificate" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1058 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1055 msgid "Generate SSL certificate and enable" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:191 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:190 msgid "I2P Tunnel Manager - Tunnel Creation Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:205 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:628 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:625 msgid "Server or client tunnel?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:211 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:629 msgid "Tunnel type" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214 msgid "Tunnel name and description" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:664 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:661 msgid "Tunnel destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:229 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226 msgid "Binding address and port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:235 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:714 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:711 msgid "Tunnel auto-start" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238 msgid "Wizard completed" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:255 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252 msgid "" "This wizard will take you through the various options available for creating" " tunnels in I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:257 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:259 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:261 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:263 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260 msgid "Server Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262 msgid "Client Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:280 msgid "There are several types of tunnels to choose from:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:288 msgid "Basic tunnel for connecting to a single service inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:293 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:327 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:295 -msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P." +#: ../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." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:294 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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:296 msgid "" "Websites outside I2P can also be reached if an HTTP proxy within I2P is " "known." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:301 -msgid "Customised client tunnel specific for IRC connections." +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:298 +msgid "Customized client tunnel specific for IRC connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:300 msgid "" "With this tunnel type, your IRC client will be able to connect to an IRC " "network inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:304 msgid "A tunnel that implements the SOCKS protocol." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:306 msgid "" "This enables both TCP and UDP connections to be made through a SOCKS " "outproxy within I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:308 msgid "" -"A client tunnel implementing the SOCKS protocol, which is customised for " +"A client tunnel implementing the SOCKS protocol, which is customized for " "connecting to IRC networks." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:313 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:315 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:317 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:325 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:329 -msgid "A server tunnel that is customised for HTTP connections." +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 +msgid "A server tunnel that is customized for HTTP connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:331 -msgid "Use this tunnel type if you want to host an eepsite." +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:333 -msgid "A customised server tunnel for hosting IRC networks inside 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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:332 msgid "" "Usually, a separate tunnel needs to be created for each IRC server that is " "to be accessible inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:338 msgid "Select tunnel type" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:374 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:371 msgid "Choose a name and description for your tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:373 msgid "" "These can be anything you want - they are just for ease of identifying the " "tunnel in the routerconsole." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:409 msgid "Separate multiple proxies with commas." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:413 msgid "" "List of I2P outproxy destinations, separated with commas (e.g. " "proxy1.i2p,proxy2.i2p)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:432 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:429 msgid "" "Type in the I2P destination of the service that this client tunnel should " "connect to." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431 msgid "" "This could be the full Base64 destination key, or an I2P URL from your " "address book." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:438 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:435 msgid "Enter a b64 or .i2p address here" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:463 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460 msgid "" "This is the IP that your service is running on, this is usually on the same " "machine so 127.0.0.1 is autofilled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:488 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:511 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:534 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:536 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:581 +#: ../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 occassionally it would mean that the I2P " +"but for tunnels that are only used occasionally it would mean that the I2P " "router is creating and maintaining unnecessary tunnels." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:607 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:609 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:614 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:616 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:620 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:622 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:626 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:623 msgid "Below is a summary of the options you chose:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:657 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:654 msgid "Tunnel description" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:680 msgid "Binding address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:688 msgid "Tunnel port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:725 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:722 msgid "" "Alongside these basic settings, there are a number of advanced options for " "tunnel configuration." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:727 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:746 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:743 msgid "Cancel the wizard and return to Tunnel Manager home page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:750 msgid "Return to previous page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:756 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753 msgid "Previous" msgstr "Předchozí" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:764 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:761 msgid "Save tunnel configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:767 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:764 msgid "Save Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:773 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:770 msgid "Finish Wizard and review tunnel settings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:776 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:773 msgid "Finish" msgstr "Dokončit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:782 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:779 msgid "Advance to next page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:785 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:782 msgid "Next" msgstr "Další" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_de.po i2p-0.9.50/apps/i2ptunnel/locale/messages_de.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_de.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_de.po 2021-05-19 12:11:55.000000000 +0000 @@ -15,7 +15,7 @@ # Ettore Atalan , 2014-2015,2017 # Florian Maier , 2017 # foo , 2009 -# Lars Schimmer , 2014-2016,2018-2020 +# Lars Schimmer , 2014-2016,2018-2021 # mixxy, 2011 # nextloop , 2013 # pirr , 2012 @@ -27,9 +27,9 @@ 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: zzzi2p\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-14 16:12+0000\n" +"Last-Translator: Lars Schimmer \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" @@ -183,7 +183,7 @@ msgstr "HTTP Bidir" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "Host nicht gesetzt" @@ -193,7 +193,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" @@ -221,16 +221,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "Name" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "Typ" @@ -244,8 +244,8 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "Beschreibung" @@ -301,7 +301,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -420,7 +420,7 @@ msgstr "B32-Adressen nicht empfohlen" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "mehrere Klienten" @@ -1170,7 +1170,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "Verschlüsselt" @@ -1478,7 +1478,7 @@ msgid "" "Maximum number of post requests permitted for a unique client for the " "configured time span" -msgstr "" +msgstr "Maximale Anzahl an erlaubten POST Anfragen pro Klienten in der konfigurierten Zeitspanne" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2362 msgid "" @@ -1488,7 +1488,7 @@ #: ../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 "Totale Anzahl an erlaubten POST Anfragen pro Klienten in der konfigurierten Zeitspanne" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2374 msgid "" @@ -1504,158 +1504,170 @@ msgid "" "Time span for the maximum number of post requests to be reached before a ban" " is triggered" -msgstr "" +msgstr "Zeitspanne für die maximale Anzahl an erlaubten POST Anfragen pro Klienten, nachem ein Ban gestartet wird." #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2435 msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "Tunnels werden initialisiert; Bitte versuche es in einige Momenten nochmal." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "Dies sind die lokalen Dienste, die vom eigenen Router bereitgestellt werden." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" " the same set of tunnels and be listed as \"Shared Clients\"." -msgstr "" +msgstr "Standardmässig teilen die meisten Ihrer Klient Services (Email, HTTP Proxy, IRC) den selben Set an Tunneln und wird als \"Geteilte Klienten\" angezeigt." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "Statusnachrichten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "Auffrischen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "Löschen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "Globale Tunnel Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "Tunnel Wizard" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "Alle stoppen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "Alle starten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "Alle neustarten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "I2P Versteckte Services" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "Läuft auf" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "Vorschau" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "Status" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "Kontrolle" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "Servertunnel Einstellungen ändern für" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "HTTPS Server testen, I2P umgehen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "HTTP Server testen, I2P umgehen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "HTTP Server via I2P testen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "Keine Vorschau" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "Starte ..." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "Diesen Tunnel stoppen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "Stopp" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "Aktiv" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "Gestoppt" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "Diesen Tunnel starten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "Start" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "Ziel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "Hostname" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "Veröffentlichen Sie Ihre seite unter dem Hostnamen" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "Kopiere den Hostname in die Zwischenablage" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "Kopiere Hostname" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "Neuer Versteckter Service" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1664,41 +1676,41 @@ msgid "Standard" msgstr "Standard" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "Erstellen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "I2P-Klienten-Tunnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "Interface" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "Tunnel Einstellungen ändern für" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "Wartestellung" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "Ausgangsproxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "internes Zusatzprogramm" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "Keiner" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "Neuer Kliententunnel" @@ -1743,14 +1755,14 @@ msgid "" "To enable registration verification, edit tunnel and set name (or website " "name) to a valid hostname ending in '.i2p'" -msgstr "" +msgstr "Um die Registrierungs Verifikation zu aktivieren, editieren Sie den Tunnel und setzen Sie den Namen (oder den Websitenamen) zu einen validen Hostnamen mit der Endung '.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 "Um die Registrierungs Verifikation zu aktivieren, editieren Sie den Tunnel und setzen Sie den Namen auf einen validen Hostnamen mit der Endung '.i2p'" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:294 msgid "Destination signing key is not available. Start the tunnel." @@ -1798,7 +1810,7 @@ #: ../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 "Dieser Tunnel muss mit dem neuen Hostnamen konfiguriert werden." #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:378 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:411 @@ -2060,7 +2072,7 @@ #: ../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." -msgstr "" +msgstr "Dieser Tunnel agiert als ein HTTP Proxy um I2P Seiten in I2P zu erreichen." #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:294 msgid "" @@ -2077,7 +2089,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:298 msgid "Customized client tunnel specific for IRC connections." -msgstr "" +msgstr "Angepasster Kliententunnel spezifisch für IRC Verbindungen." #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:300 msgid "" @@ -2105,7 +2117,7 @@ msgid "" "A client tunnel implementing the SOCKS protocol, which is customized for " "connecting to IRC networks." -msgstr "" +msgstr "Ein Kliententunnel mit der SOCKS Protokollimplementierung, welcher angepasst ist zum Verbinden mit IRC Netzwerken." #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310 msgid "" @@ -2133,15 +2145,15 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 msgid "A server tunnel that is customized for HTTP connections." -msgstr "" +msgstr "Ein angepasster Servertunnel für HTTP Verbindungen." #: ../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 "Benutzen Sie diesen Tunneltypus zum Betreiben einer I2P Seiite." #: ../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 "Ein speziell angepasster Servertunnel zum Hosten von IRC Netzwerken innerhalb von I2P." #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:332 msgid "" @@ -2230,7 +2242,7 @@ "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 "Dieses kann für oft genutzte Tunnel hilfreich sein (besonders Servertunnel), jedoch für wenig genutzte Tunnel wird der I2P Router unnötige Tunnel aubauen und aktiv halten." #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604 msgid "The wizard has now collected enough information to create your tunnel." diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_en.po i2p-0.9.50/apps/i2ptunnel/locale/messages_en.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_en.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_en.po 2021-05-19 12:11:55.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: I2P i2ptunnel\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-02-05 14:31+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" "PO-Revision-Date: 2010-06-15 14:09+0100\n" "Last-Translator: duck \n" "Language-Team: duck \n" @@ -164,7 +164,7 @@ msgstr "" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "" @@ -174,7 +174,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" @@ -202,16 +202,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "" @@ -225,8 +225,8 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "" @@ -281,7 +281,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -400,7 +400,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "" @@ -1149,7 +1149,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "" @@ -1489,152 +1489,164 @@ msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share " "the same set of tunnels and be listed as \"Shared Clients\"." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1643,41 +1655,41 @@ msgid "Standard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_fr.po i2p-0.9.50/apps/i2ptunnel/locale/messages_fr.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_fr.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_fr.po 2021-05-19 12:11:55.000000000 +0000 @@ -20,8 +20,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 20:08+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 16:50+0000\n" "Last-Translator: AO \n" "Language-Team: French (http://www.transifex.com/otf/I2P/language/fr/)\n" "MIME-Version: 1.0\n" @@ -176,7 +176,7 @@ msgstr "HTTP bidir." #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "L’hôte n’est pas défini" @@ -186,7 +186,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" @@ -214,16 +214,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "Nom" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "Type" @@ -237,8 +237,8 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "Description" @@ -294,7 +294,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -413,7 +413,7 @@ msgstr "b32 n’est pas recommandé" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "Client partagé" @@ -1163,7 +1163,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "Chiffré" @@ -1503,152 +1503,164 @@ msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "Les tunnels ne sont pas encore initialisés. Veuillez réessayer dans un moment." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "Les services locaux offerts par votre routeur." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" " the same set of tunnels and be listed as \"Shared Clients\"." msgstr "Par défaut, la plupart de vos services client (courriel, mandataire HTTP, IRC) partageront le même ensemble de tunnels et apparaîtront en tant que « Clients partagés »." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "Messages d’état" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "Actualiser" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "Effacer" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "Contrôle global des tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "Assistant de configuration de tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "Arrêter tout" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "Démarrer tout" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "Redémarrer tout" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "Services cachés I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "Pointe vers" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "Aperçu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "État" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "Contrôle" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "Modifier les paramètres de tunnels serveur pour" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "Tester le serveur HTTPS sans passer par I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "Tester le serveur HTTP sans passer par I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "Tester le serveur HTTP par I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "Aucun aperçu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "Démarrage…" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "Arrêter ce tunnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "Arrêter" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "En cours" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "Arrêté" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "Démarrer ce tunnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "Démarrer" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "Destination" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "Nom d’hôte" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "Partager votre site en utilisant le nom d’hôte" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "Copier le nom de l’hôte dans le presse-papiers" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "Copier le nom de l’hôte" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "Nouveau service caché" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1657,41 +1669,41 @@ msgid "Standard" msgstr "Normal" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "Créer" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "Tunnels client d’I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "Interface" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "Modifier les paramètres de tunnel pour" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "En attente" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "Mandataire sortant" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "greffon interne" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "aucun" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "Nouveau tunnel client" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_ja.po i2p-0.9.50/apps/i2ptunnel/locale/messages_ja.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_ja.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_ja.po 2021-05-19 12:11:55.000000000 +0000 @@ -6,14 +6,15 @@ # Translators: # タカハシ, 2013-2014 # heizi , 2016 -# riopfga caetocla, 2020-2021 +# XMPPはいいぞ, 2020-2021 +# XMPPはいいぞ, 2021 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-05 15:27+0000\n" -"Last-Translator: zzzi2p\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-14 07:13+0000\n" +"Last-Translator: XMPPはいいぞ\n" "Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -164,7 +165,7 @@ msgstr "HTTP 双方向" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "ホスト未設定" @@ -174,15 +175,15 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" -msgstr "秘匿サービスマネージャー" +msgstr "秘匿サービスマネージャ" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:172 msgid "Edit Client Tunnel" -msgstr "クライアントトンネルの編集" +msgstr "クライアントトンネルを編集" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:172 msgid "Edit Hidden Service" @@ -202,16 +203,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "名前" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "種類" @@ -221,12 +222,12 @@ msgid "" "Name of tunnel to be displayed on Tunnel Manager home page and the router " "console sidebar" -msgstr "トンネルマネージャーのホームページとルーターコンソールに表示するトンネルの名前" +msgstr "トンネルマネージャーのホームページとルータコンソールに表示するトンネルの名前" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "説明" @@ -240,7 +241,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1129 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:383 msgid "Description of tunnel to be displayed on Tunnel Manager home page" -msgstr "トンネルマネージャーのホームページに表示するトンネルの説明" +msgstr "トンネルマネージャのホームページに表示するトンネルの説明" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:278 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1133 @@ -248,19 +249,19 @@ msgid "" "Enable this option to ensure this service is available when the router " "starts" -msgstr "この設定を有効にすると、ルーターの起動時にこのサービスが利用可能になります" +msgstr "この設定を有効にすると、ルータの起動時にこのサービスが利用可能になります" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:282 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1137 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:584 msgid "Automatically start tunnel when router starts" -msgstr "ルーターが起動したときにトンネルを自動で開始" +msgstr "ルータが起動したときにトンネルを自動で開始" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:286 msgid "" "The client tunnel and all other shared client tunnels must be stopped to " "change this setting" -msgstr "この設定を変更するには、そのクライアントトンネルと他のすべての共有クライアントトンネルを停止する必要があります。" +msgstr "この設定を変更するには、そのクライアントトンネルと他のすべての共有されたクライアントトンネルを停止する必要があります。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:287 msgid "The client tunnel must be stopped to change this setting" @@ -282,7 +283,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -316,11 +317,11 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1165 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:466 msgid "Hostname or IP address of the target server" -msgstr "" +msgstr "ターゲットサーバーのホスト名またはIPアドレス" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:347 msgid "Local interface (ip address) the client tunnel will be reachable from" -msgstr "" +msgstr "クライアントのトンネルが到達可能なローカルのインターフェース(IPアドレス)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:351 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1231 @@ -338,11 +339,11 @@ "If you are accessing a service on a remote I2P router, you may wish to " "connect with SSL to avoid traffic interception. The client application " "should be also be configured to use SSL." -msgstr "もし遠隔のI2Pルーターサービスにアクセスしているなら、トラフィックの傍受を避けるためにSSLを使って接続することをお勧めします。クライアントアプリケーションもSSLを使う設定をする必要があります。" +msgstr "もし遠隔のI2Pルータサービスにアクセスしているなら、トラフィックの傍受を避けるためにSSLを使って接続することをお勧めします。クライアントアプリケーションもSSLを使う設定をする必要があります。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:386 msgid "Clients use SSL to connect to tunnel" -msgstr "クライエントでトンネル接続にSSLを使う" +msgstr "クライアントでトンネル接続にSSLを使う" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:394 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:411 @@ -384,33 +385,33 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:430 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433 msgid "Tunnel Destination" -msgstr "トンネル送信先" +msgstr "トンネルの宛先" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:440 msgid "" "Specify the .i2p address or destination (b32 or b64) of the tunnel here." -msgstr "" +msgstr "ここでは、トンネルの .i2p アドレスまたは宛先(b32 または b64)を指定します。" #: ../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 "名前、名前:ポート番号または宛先" +msgstr "名前、名前:ポート番号、または宛先" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:452 msgid "b32 not recommended" msgstr "b32 は非推奨です" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" -msgstr "共有クライアント" +msgstr "共有されたクライアント" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:470 msgid "" "Traffic from all clients with this feature enabled will be routed over the " "same set of tunnels. This will make profiling the tunnels by an adversary " "more difficult, but will link the clients together." -msgstr "" +msgstr "この機能を有効にした全てのクライアントからのトラフィックは、同じトンネルの組み合わせを介してルーティングされます。これにより、敵対者によるトンネルのプロファイリングがより困難になりますが、クライアントを一緒に結ぶことができます。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:481 msgid "Share tunnels with other clients?" @@ -439,7 +440,7 @@ msgid "" "Note: When this client proxy is configured to share tunnels, then these " "options are for all the shared proxy clients!" -msgstr "" +msgstr "注意: このクライアントプロキシがトンネルを共有する設定の場合、これらの設定はすべての共有されたクライアントプロキシ用です!" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:525 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1407 @@ -493,7 +494,7 @@ #, java-format msgid "{0} hop tunnel" msgid_plural "{0} hop tunnel" -msgstr[0] "{0}ホップトンネル" +msgstr[0] "{0}ホップのトンネル" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:540 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1430 @@ -683,21 +684,21 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:706 msgid "for request/response connections" -msgstr "" +msgstr "要求/応答 接続用" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:718 msgid "Delay tunnel open until required" -msgstr "要求されるまでトンネルのオープンを遅らせる" +msgstr "要求されるまでトンネルの開放を遅らせる" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:720 msgid "Conserve resources by only creating tunnels when required" -msgstr "" +msgstr "必要な時だけトンネルを作成することでリソースを節約する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:724 msgid "" "Delay opening client tunnel until activity is detected on the configured " "tunnel port" -msgstr "" +msgstr "設定されたトンネルのポートで活動が検出されるまでクライアントトンネルが開くのを遅らせる" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:730 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2282 @@ -708,12 +709,12 @@ msgid "" "Reduce tunnel count when idle but keep tunnel open (to ensure immediate " "availability)" -msgstr "" +msgstr "アイドル時にトンネルの数を減らすが、トンネルを開放したままにする(即利用可能にするため)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:736 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2286 msgid "Reduce tunnel quantity when idle to conserve resources" -msgstr "" +msgstr "リソースを節約するため、アイドル時にトンネルの数を減らす" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:738 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:740 @@ -725,11 +726,11 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:758 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2294 msgid "Idle period" -msgstr "" +msgstr "アイドル期間" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:746 msgid "Reduced Tunnel Idle Time" -msgstr "" +msgstr "トンネルを減らすアイドル時" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:750 msgid "Close tunnels when idle" @@ -737,27 +738,27 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:752 msgid "To conserve resources, close tunnels when not in use" -msgstr "" +msgstr "リソースを節約するため、使われてないときにトンネルを閉じる" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:756 msgid "Close client tunnels after specified idle period" -msgstr "" +msgstr "指定したアイドル期間後にクライアントトンネルを閉じる" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:760 msgid "Close Tunnel Idle Time" -msgstr "" +msgstr "トンネルを閉じるアイドル時" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:770 msgid "Change tunnel identity (destination) when tunnels reopen" -msgstr "" +msgstr "トンネルを再開放したとき、トンネルの同一性(宛先)を変更する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:772 msgid "Retain tunnel identity (destination) when tunnels reopen" -msgstr "" +msgstr "トンネルを再開放したとき、トンネルの同一性(宛先)を保持する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:778 msgid "New Keys on Reopen" -msgstr "再オープンで新しいキーにする" +msgstr "再開放で新しいキーにする" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:784 msgid "Enable" @@ -772,14 +773,14 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:802 msgid "Persistent private key" -msgstr "プライベートキーの持続" +msgstr "持続的なプライベートキー" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:805 msgid "" "Enabling this feature will ensure your tunnel identity (destination) remains" " static, for services offering features based on destination e.g. IRC user " "authentication" -msgstr "" +msgstr "この機能を有効にすると、例えばIRCユーザ認証のような宛先に基づく機能を提供するサービスでは、トンネル同一性(宛先) が静的なままであることが保証されます。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:807 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1292 @@ -789,7 +790,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:816 msgid "Generate key to enable persistent client tunnel identity" -msgstr "" +msgstr "持続的なクライアントトンネルの同一性を有効にするために、キーを生成する。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:818 msgid "File" @@ -858,7 +859,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:881 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2016 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:1721 @@ -971,7 +972,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1020 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2394 msgid "Router I2CP Address" -msgstr "ルーターのI2CPアドレス" +msgstr "ルータのI2CPアドレス" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1024 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2398 @@ -1037,7 +1038,7 @@ "To avoid traffic sniffing if connecting to a remote server, you can enable " "an SSL connection. Note that the target server must be configured to accept " "SSL connections." -msgstr "" +msgstr "遠隔サーバーに接続している場合にトラフィックの盗聴を避けるために、SSL 接続を有効にすることができます。ターゲットサーバーが SSL 接続を受け入れるように設定されている必要があることに注意してください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1199 msgid "Use SSL to connect to target" @@ -1047,22 +1048,22 @@ msgid "" "Port required to access service (this can be a different port to the port " "the service is hosted on)" -msgstr "" +msgstr "サービスにアクセスするために要求されるポート(これは、サービスがホストされているポートとは異なるポートである場合があります。)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1234 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:540 msgid "" "Listening interface (IP address) for client access (normally 127.0.0.1)" -msgstr "" +msgstr "クライアントのアクセス(通常 127.0.0.1)用のリスニングインターフェース(IPアドレス)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1261 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:659 msgid "Website Hostname" -msgstr "ウェブサイトホスト名" +msgstr "ウェブサイトのホスト名" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1263 msgid "Website Hostname e.g. mysite.i2p" -msgstr "ウェブサイトホスト名 例. mysite.i2p" +msgstr "ウェブサイトのホスト名 例. mysite.i2p" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1267 msgid "(leave blank for outproxies)" @@ -1102,12 +1103,12 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1379 msgid "HTTPS configuration" -msgstr "" +msgstr "HTTPS設定" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1384 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:215 msgid "SSL Wizard" -msgstr "" +msgstr "SSLウィザード" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1394 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2168 @@ -1115,7 +1116,7 @@ "Note: In order to enable QR code generation or registration authentication, " "configure the Website Hostname field (for websites) or the Name field " "(everything else) above with an .i2p suffixed hostname e.g. mynewserver.i2p" -msgstr "" +msgstr "注意: QRコードの生成や登録認証を有効にするには、Webサイトのホスト名フィールド(Webサイトの場合)または上記の名前フィールド(その他のすべての場合)に .i2p の接尾を付けたホスト名を設定します。 例. mynewserver.i2p" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1412 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1615 @@ -1134,7 +1135,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1723 msgid "Encrypt Leaseset" -msgstr "リーズセット情報を暗号化する" +msgstr "リースセット情報を暗号化する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1732 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1742 @@ -1149,13 +1150,13 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "暗号化済" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1766 msgid "Prevents server discovery by floodfills" -msgstr "" +msgstr "floodfillによるサーバー発見を防ぐ" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1770 msgid "Blinded" @@ -1165,7 +1166,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1801 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1814 msgid "Send password to all users." -msgstr "" +msgstr "全ユーザーへパスワードを送信する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1780 msgid "Blinded with lookup password" @@ -1244,63 +1245,63 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2115 msgid "Alternate local destination" -msgstr "" +msgstr "代替のローカルの宛先" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2117 msgid "Read Only: Alternate Local Destination" -msgstr "" +msgstr "読み取り専用: 代替のローカルの宛先" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2176 msgid "Tunnel Access Control Options" -msgstr "" +msgstr "トンネルアクセス制御設定" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2178 msgid "Restricted Access List" -msgstr "制限されたアクセスリスト" +msgstr "制限されたアクセス一覧" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2186 msgid "Prevent listed clients from connecting to this service" -msgstr "" +msgstr "このサービスへの接続に、一覧に記載されたクライアントを阻む" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2190 msgid "Deny List" -msgstr "" +msgstr "拒否一覧" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2192 msgid "Only allow listed clients to connect to this service" -msgstr "" +msgstr "一覧に記載されたクライアントのみがこのサービスに接続することを許可する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2196 msgid "Allow List" -msgstr "" +msgstr "許可一覧" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2198 msgid "Access List Description" -msgstr "" +msgstr "アクセス一覧説明" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2200 msgid "Specify clients, 1 per line" -msgstr "" +msgstr "クライアント指定、一行につき1個" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2202 msgid "Control access to this service" -msgstr "" +msgstr "このサービスへのアクセスを制御" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2206 msgid "Filter Definition File" -msgstr "" +msgstr "フィルタ定義ファイル" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2208 msgid "You can define an advanced filter for this tunnel." -msgstr "" +msgstr "このトンネルの為に高度なフィルタを定義可能です。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2210 msgid "Format Specification" -msgstr "" +msgstr "書式仕様" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2212 msgid "Absolute path to file containing filter definition" -msgstr "" +msgstr "フィルタ定義を含むファイルへの絶対パス" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2216 msgid "Server Access Options" @@ -1308,7 +1309,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2222 msgid "Prevent clients from accessing this service via an inproxy" -msgstr "" +msgstr "インプロキシを通した、このサービスのアクセスから阻むクライアント" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2226 msgid "Block Access via Inproxies" @@ -1334,7 +1335,7 @@ msgid "" "Use unique IP addresses for each connecting client (local non-SSL servers " "only)" -msgstr "" +msgstr "接続しているクライアント(ローカルの非 SSL サーバーのみ)ごとに固有の IP アドレスを使ってください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2249 msgid "Unique Local Address per Client" @@ -1342,7 +1343,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2251 msgid "Only enable if you are hosting this service on multiple routers" -msgstr "" +msgstr "複数のルータでこのサービスをホストしている場合のみ有効にしてください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2255 msgid "Optimize for Multihoming" @@ -1354,11 +1355,11 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2290 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:2296 msgid "Period of inactivity before tunnel number is reduced" -msgstr "" +msgstr "トンネル数が減少するまでの休止期間" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2366 @@ -1369,7 +1370,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2302 msgid "Server Throttling" -msgstr "" +msgstr "サーバースロットリング" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2304 msgid "Inbound connection limits (0=unlimited)" @@ -1396,19 +1397,19 @@ msgid "" "Maximum number of web page requests per minute for a unique client before " "access to the server is blocked" -msgstr "" +msgstr "サーバーへのアクセスが塞がれるまでの、固有のクライアントの1分毎のウェブページ要求の最大数。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2318 msgid "" "Maximum number of web page requests per hour for a unique client before " "access to the server is blocked" -msgstr "" +msgstr "サーバーへのアクセスが塞がれるまでの、固有のクライアントの1時間毎のウェブページ要求の最大数。" #: ../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 "サーバーへのアクセスが塞がれるまでの、固有のクライアントの1日毎のウェブページ要求の最大数。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2326 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2368 @@ -1419,19 +1420,19 @@ msgid "" "Total number of web page requests per minute before access to the server is " "blocked" -msgstr "" +msgstr "そのサーバーへアクセスが塞がれるまでの、1分毎のウェブページ要求の合計数" #: ../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 "そのサーバーへアクセスが塞がれるまでの、1時間毎のウェブページ要求の合計数" #: ../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 "そのサーバーへアクセスが塞がれるまでの、1日毎のウェブページ要求の合計数" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2340 msgid "Max concurrent connections (0=unlimited)" @@ -1439,7 +1440,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2342 msgid "Maximum number of simultaneous client connections" -msgstr "" +msgstr "同時クライアント接続数の最大数" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2350 msgid "POST limits (0=unlimited)" @@ -1457,184 +1458,196 @@ msgid "" "Maximum number of post requests permitted for a unique client for the " "configured time span" -msgstr "" +msgstr "設定された時間範囲で、1つのクライアントに対して許可される post の要求最大数" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2362 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 要求の最大数を超えた場合、この数分の間、包括的なアクセス禁止を実施する。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2380 msgid "POST limit period" -msgstr "" +msgstr "POST 制限期間" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2382 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." -msgstr "" +msgstr "トンネルはまだ初期化されていませんので、数分後に再試行してください。" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." -msgstr "" +msgstr "これらはルータが提供するローカルサービスです。" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" " the same set of tunnels and be listed as \"Shared Clients\"." -msgstr "" +msgstr "規定では、たいていのあなたのクライアントのサービス(Eメール、HTTPプロキシ、IRC)トンネルのいくつかの組み合わせと共有し、\"共有されたクライアント\"であると一覧に記載されます。" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" -msgstr "状態メッセージ" +msgstr "状態通知" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "更新" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "消去" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" -msgstr "" +msgstr "包括的トンネル操作" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "トンネルウィザード" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "全て停止" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "全て開始" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "全て再起動" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "I2P秘匿サービス" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "プレビュー" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "状態" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "操作" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" -msgstr "" +msgstr "I2P を迂回して、 HTTPS サーバーをテスト" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" -msgstr "" +msgstr "I2P を迂回して、 HTTP サーバーをテスト" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" -msgstr "" +msgstr "I2P 経由で HTTP サーバーをテスト" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." -msgstr "開始しています..." +msgstr "起動中..." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "このトンネルを停止" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "停止" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "稼働中" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "停止しました" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "このトンネルを開始" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "開始" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "宛先" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "ホスト名" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "ホスト名でサイトを共有" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "ホスト名をクリップボードへコピー" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "ホスト名をコピー" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" -msgstr "新しいHiddenService" +msgstr "新しい秘匿サービス" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1643,61 +1656,61 @@ msgid "Standard" msgstr "標準" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "作成" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "I2Pクライアントトンネル" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "インタフェース" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "アウトプロキシ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "内部プラグイン" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "なし" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "新しいクライアントトンネル" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:189 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:210 msgid "Registration Helper" -msgstr "" +msgstr "登録ヘルパー" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:240 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 "" "Please be sure to select, copy, and paste the entire contents of the " "appropriate authentication data into the form of your favorite registration " "site" -msgstr "" +msgstr "必ず、適切な認証データの内容を全部選択してコピーし、お気に入りの登録サイトのフォームに貼り付けてください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:248 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:650 @@ -1706,44 +1719,44 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:256 msgid "Website name" -msgstr "ウェブサイトの名前" +msgstr "ウェブサイト名" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:264 msgid "Local Destination" -msgstr "" +msgstr "ローカルの宛先" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:272 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:668 msgid "Local destination is not available. Start the tunnel." -msgstr "" +msgstr "ローカルの宛先は利用不可能です。そのトンネルを開始してください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:279 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:675 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." -msgstr "" +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 @@ -1754,107 +1767,107 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:502 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:541 msgid "Copy and paste this to the registration site" -msgstr "" +msgstr "登録サイトへこれをコピーと貼り付けする" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:317 msgid "Advanced authentication strings" -msgstr "" +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" -msgstr "" +msgstr "名前変更用認証" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:370 #, java-format msgid "This will change the name from {0} to {1}, using the same destination" -msgstr "" +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 msgid "Enter old hostname below." -msgstr "" +msgstr "古いホスト名を以下に入力。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:389 msgid "Authentication for adding alias" -msgstr "" +msgstr "追加する別名用の認証" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:403 #, java-format msgid "This will add an alias {0} for {1}, using the same destination" -msgstr "" +msgstr "これは、 {1} 用のエリアス {0} を追加すると、同じ宛先を使います" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:423 msgid "Authentication for changing destination" -msgstr "" +msgstr "宛先変更用認証" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:438 #, java-format msgid "This will change the destination for {0}" -msgstr "" +msgstr "これは、{0} に宛先が変更されます。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:444 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:513 msgid "This tunnel must be configured with the new destination." -msgstr "" +msgstr "このトンネルは新たな宛先と設定しなければなりません。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:446 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:515 msgid "Enter old destination below." -msgstr "" +msgstr "古い宛先を以下に入力。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:458 msgid "Authentication for adding alternate destination" -msgstr "" +msgstr "追加した代替の宛先用の認証" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:473 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:507 #, java-format msgid "This will add an alternate destination for {0}" -msgstr "" +msgstr "これは、{0} に代替の宛先が追加されます" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:530 msgid "Authentication for adding subdomain" -msgstr "" +msgstr "追加したサブドメイン用の認証" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:546 #, java-format msgid "This will add a subdomain {0} of {1}, with a different destination" -msgstr "" +msgstr "これは、{1} のサブドメイン {0} を追加すると、異なる宛先を伴う" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:552 msgid "This tunnel must be configured with the new subdomain and destination." -msgstr "" +msgstr "このトンネルは新たなサブドメインと宛先と設定しなければなりません。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:554 msgid "Enter higher-level domain and destination below." -msgstr "" +msgstr "高いレベルのドメインと宛先をいかに入力。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:571 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1083 msgid "Go back and edit the tunnel" -msgstr "" +msgstr "戻ってトンネルを編集する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:582 msgid "Specify old name and destination" -msgstr "" +msgstr "古い名前と宛先を指定する" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:584 msgid "This is only required for advanced authentication." -msgstr "" +msgstr "これは、高度な認証にのみ要求されます。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:586 msgid "See above for required items." -msgstr "" +msgstr "必須項目は上記を参照してください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:593 msgid "Old hostname" @@ -1862,11 +1875,11 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:597 msgid "Private Key File for old Destination" -msgstr "" +msgstr "古い宛先用のプライベートキーファイル" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:601 msgid "Generate Authentication" -msgstr "" +msgstr "認証を生成" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:604 msgid "Generate" @@ -1874,32 +1887,32 @@ #: ../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:689 msgid "Base32" -msgstr "" +msgstr "Base32" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:697 msgid "Alt Base32" -msgstr "" +msgstr "代替 Base32" #: ../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" -msgstr "" +msgstr "I2P ポート" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:710 msgid "Virtual Host" -msgstr "" +msgstr "仮想ホスト" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:712 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:790 msgid "SSL" -msgstr "" +msgstr "SSL" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:714 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:784 @@ -1908,15 +1921,15 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:720 msgid "Default" -msgstr "デフォルト" +msgstr "規定" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:782 msgid "Jetty Server" -msgstr "" +msgstr "Jetty サーバー" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:786 msgid "Configuration Files" -msgstr "" +msgstr "設定ファイル" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:788 msgid "Enabled" @@ -1928,40 +1941,40 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1025 msgid "SSL is enabled" -msgstr "" +msgstr "SSLは有効です" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1027 msgid "Disable SSL" -msgstr "" +msgstr "SSLを無効化" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1033 msgid "SSL is disabled" -msgstr "" +msgstr "SSLは無効です" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1035 msgid "Enable SSL" -msgstr "" +msgstr "SSLを有効化" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1041 msgid "New Certificate Password" -msgstr "" +msgstr "新しい証明書パスワード" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1049 msgid "Generate new SSL certificate" -msgstr "" +msgstr "新しいSSL証明書を生成" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1055 msgid "Generate SSL certificate and enable" -msgstr "" +msgstr "新しいSSL証明書を生成し有効化" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:190 msgid "I2P Tunnel Manager - Tunnel Creation Wizard" -msgstr "" +msgstr "I2P トンネルマネージャ - トンネル作成ウィザード" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:202 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:625 msgid "Server or client tunnel?" -msgstr "サーバートンネルそれともクライアントトンネル?" +msgstr "サーバートンネル、それともクライアントトンネル?" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:629 @@ -1988,13 +2001,13 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238 msgid "Wizard completed" -msgstr "" +msgstr "ウィザード完了" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252 msgid "" "This wizard will take you through the various options available for creating" " tunnels in I2P." -msgstr "" +msgstr "このウィザードは、I2P でトンネルを作成するために利用可能な様々な設定を説明します。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254 msgid "" @@ -2006,13 +2019,13 @@ 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 "もしもリモートサービスに接続する必要があるならばI2P内のIRCサーバーまたはコードリポジトリのようにクライアントトンネルが必要になります。" +msgstr "もしも遠隔サービスに接続する必要があるならば、I2P内のIRCサーバーまたはコードリポジトリのようにクライアントトンネルが必要になります。" #: ../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 "一方で、他の人が接続できるサービスをホストしたい場合は、サーバートンネルを作成する必要があります。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260 msgid "Server Tunnel" @@ -2028,105 +2041,105 @@ #: ../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 "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 "以下のトンネルの種類がどれもあなたの要件に当てはまらない場合、またはどの種類のトンネルが必要かわからない場合は、これを試してみてください。" #: ../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." -msgstr "" +msgstr "I2P 内の I2P サイトに到達するための HTTP プロキシとして振る舞うトンネル。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:294 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 "このトンネルを http プロキシとして使うようにブラウザを設定するか、GNU/Linux のコマンドラインアプリケーション用に \"http_proxy\" 環境変数を設定してください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:296 msgid "" "Websites outside I2P can also be reached if an HTTP proxy within I2P is " "known." -msgstr "" +msgstr "I2P 外のウェブサイトも、 I2P 内の HTTP プロキシが既知ならば到達できます。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:298 msgid "Customized client tunnel specific for IRC connections." -msgstr "" +msgstr "IRC 接続に特化したカスタマイズされたクライアントトンネル。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:300 msgid "" "With this tunnel type, your IRC client will be able to connect to an IRC " "network inside I2P." -msgstr "" +msgstr "このトンネルの種類では、IRC クライアントは I2P 内の IRC ネットワークに接続することができます。" #: ../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 "接続したい I2P の各 IRC ネットワークごとに、それ自身のトンネルが必要です。(SOCKS IRC も参照)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:304 msgid "A tunnel that implements the SOCKS protocol." -msgstr "" +msgstr "SOCKS プロトコル実装トンネル" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:306 msgid "" "This enables both TCP and UDP connections to be made through a SOCKS " "outproxy within I2P." -msgstr "" +msgstr "これを有効にすると、 I2P 内の SOCKS アウトプロキシを経由で TCP と UDP の両方の接続が可能になります。" #: ../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 "SOCKS プロトコルを実装するクライアントトンネルで、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 "このトンネルの種類では、IRC クライアントに I2P アドレスを入力し、IRC クライアントがこの SOCKS トンネルを使用するように設定することで、I2P の IRC ネットワークに到達することができます。" #: ../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 "これは、IRCネットワークごとに別個のトンネルではなく、1つのI2Pトンネルだけが必要であることを意味します。" #: ../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 "I2P外のIRCネットワークも、I2P内のSOCKSアウトプロキシがわかっていれば到達できますが、そのアウトプロキシが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 "I2P 内の汎用サービスをホスティングするための基本的なサーバトンネル。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 msgid "A server tunnel that is customized for HTTP connections." -msgstr "" +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 "" "Usually, a separate tunnel needs to be created for each IRC server that is " "to be accessible inside I2P." -msgstr "" +msgstr "通常、I2P内でアクセスできるIRCサーバごとに別のトンネルを作成する必要があります。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:338 msgid "Select tunnel type" @@ -2140,13 +2153,13 @@ msgid "" "These can be anything you want - they are just for ease of identifying the " "tunnel in the routerconsole." -msgstr "" +msgstr "これらは、あなたが望む何でも構いません - これらは、単にルータコンソールでトンネルを識別するためのを簡単にするためだけです。" #: ../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 "この種類のトンネル(HTTPまたはSOCKS)のアウトプロキシをご存知であれば、以下にご記入ください。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:409 msgid "Separate multiple proxies with commas." @@ -2156,19 +2169,19 @@ msgid "" "List of I2P outproxy destinations, separated with commas (e.g. " "proxy1.i2p,proxy2.i2p)" -msgstr "" +msgstr "I2Pアウトプロキシの宛先の一覧は、カンマで区切ってください(例. proxy1.i2p,proxy2.i2p)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:429 msgid "" "Type in the I2P destination of the service that this client tunnel should " "connect to." -msgstr "" +msgstr "このクライアントトンネルが接続するサービスの I2P の宛先を入力します。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431 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" @@ -2192,7 +2205,7 @@ msgid "" "How do you want this tunnel to be accessed? By just this machine, your " "entire subnet, or external internet?" -msgstr "" +msgstr "このトンネルにはどのようにアクセスしますか?このマシンだけで、あるいはサブネット全体で、あるいは外部インターネットで?" #: ../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" @@ -2202,14 +2215,14 @@ msgid "" "The I2P router can automatically start this tunnel for you when the router " "is started." -msgstr "I2Pルーターが起動すると自動的にこのトンネルを開始できます" +msgstr "I2Pルータが起動すると自動的にこのトンネルを開始できます" #: ../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 "これは頻繁に使われるトンネル(特にサーバートンネル)には便利ですが、たまにしか使われないトンネルには、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." @@ -2219,33 +2232,33 @@ 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 "下の保存ボタンをクリックすると、ウィザードがトンネルを設定し、メインの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 "ルータ起動時にトンネルを自動的に開始するよう選んでいるため、他に何かする必要はありません。" #: ../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 "ルータが起動したらトンネルを開始します。" #: ../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 "トンネルを自動で起動しないように選択したため、手動でトンネルを起動する必要があります。" #: ../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 "これは、新しいトンネルに対応するメインページの開始ボタンをクリックすることで行うことができます。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:623 msgid "Below is a summary of the options you chose:" -msgstr "" +msgstr "以下は、あなたが選択した選択の概要です:" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:654 msgid "Tunnel description" @@ -2257,24 +2270,24 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:688 msgid "Tunnel port" -msgstr "" +msgstr "トンネルのポート" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:722 msgid "" "Alongside these basic settings, there are a number of advanced options for " "tunnel configuration." -msgstr "" +msgstr "これらの基本的な設定に平行して、トンネル設定にはいくつかの高度な選択肢があります。" #: ../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 "ウィザードはこれらの初期値を常識的に設定しますが、メインのI2Pトンネルページでトンネルの名前をクリックすることで、これらを表示したり編集したりすることができます。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:743 msgid "Cancel the wizard and return to Tunnel Manager home page" -msgstr "" +msgstr "ウィザードをキャンセルし、トンネルマネージャホームページへ戻る" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:750 msgid "Return to previous page" @@ -2294,7 +2307,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:770 msgid "Finish Wizard and review tunnel settings" -msgstr "" +msgstr "ウィザード終了とトンネル設定の振り返り" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:773 msgid "Finish" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_pl.po i2p-0.9.50/apps/i2ptunnel/locale/messages_pl.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_pl.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_pl.po 2021-05-19 12:11:56.000000000 +0000 @@ -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-07 22:18+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-13 23:06+0000\n" "Last-Translator: ☆Verdulo\n" "Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" @@ -179,7 +179,7 @@ msgstr "HTTP bidir" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "Nie ustawiono hosta" @@ -189,7 +189,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" @@ -217,16 +217,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "Nazwa" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "Typ" @@ -240,8 +240,8 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "Opis" @@ -297,7 +297,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -416,7 +416,7 @@ msgstr "b32 niezalecane" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "Klient współdzielony" @@ -1170,7 +1170,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "Szyfrowane" @@ -1510,152 +1510,164 @@ msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "Tunele nie są jeszcze zainicjowane, proszę spróbować ponownie za chwilę." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "To są lokalne usługi dostarczane przez Twój węzeł." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" " the same set of tunnels and be listed as \"Shared Clients\"." msgstr "Domyślnie większość usług klienckich (el‑poczta, proxy HTTP, IRC) dzieli wspólny zestaw tuneli wyświetlany jako „współdzielone klienty”." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "Wiadomości o Statusie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "Odśwież" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "Wyczyść" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "Globalne zarządzanie tunelami" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "Kreator Tunelu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "Zatrzymaj wszystkie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "Uruchom wszystkie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "Restartuj wszystkie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "Ukryte usługi I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "Wskazuje na" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "Podgląd" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "Status" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "Zarządzaj" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "Edytuj ustawienia tunelu serwera dla" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "Sprawdź serwer HTTPS pomijając I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "Sprawdź serwer HTTP pomijając I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "Sprawdź serwer HTTP przez I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "Brak podglądu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "Rozpoczynam..." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "Zatrzymaj ten tunel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "Zatrzymaj" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "Uruchomiony" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "Zatrzymany" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "Uruchom ten tunel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "Uruchom" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "Cel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "Nazwa hosta" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "Udostępnij stronę korzystając z nazwy hosta" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "Skopiuj nazwę hosta do schowka" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "Skopiuj nazwę hosta" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "Nowa ukryta usługa" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1664,41 +1676,41 @@ msgid "Standard" msgstr "Standard" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "Utwórz" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "Tunele klienckie I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "Interfejs" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "Edytuj ustawienia tunelu dla" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "Uśpiony" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "Outproxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "wewnętrzna wtyczka" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "żadne" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "Nowy tunel kliencki" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_pt_BR.po i2p-0.9.50/apps/i2ptunnel/locale/messages_pt_BR.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_pt_BR.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_pt_BR.po 2021-05-19 12:11:56.000000000 +0000 @@ -5,6 +5,7 @@ # # Translators: # testsubject67 , 2014 +# Eduardo Rodrigues, 2021 # blueboy, 2013 # blueboy, 2015-2016,2020 # blueboy, 2013-2014 @@ -12,9 +13,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-12 13:39+0000\n" -"PO-Revision-Date: 2020-08-12 18:50+0000\n" -"Last-Translator: zzzi2p\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-08 04:50+0000\n" +"Last-Translator: Eduardo Rodrigues\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" @@ -61,20 +62,20 @@ msgstr "banda-larga com taxa de dados maior e confiabilidade" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:100 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:618 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1096 +#: ../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 "Os túneis não foram inicializados ainda, por favor, recarregue em dois minutos." #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:187 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:317 +#: ../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 "Envio de formulário inválido, provavelmente por você ter usado o botão \"voltar\" ou \"recarregar\" no seu navegador. Por favor, reenvie." #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:189 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:316 msgid "" "If the problem persists, verify that you have cookies enabled in your " "browser." @@ -168,7 +169,7 @@ msgstr "HTTP bidir" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:453 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "Host não especificado" @@ -176,2141 +177,2152 @@ msgid "Invalid address" msgstr "Endereço inválido" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:169 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:154 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:186 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" msgstr "Gerenciador de Serviços Ocultos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:173 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:172 msgid "Edit Client Tunnel" msgstr "Editar Túnel de Cliente" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:173 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:172 msgid "Edit Hidden Service" msgstr "Editar Serviço Oculto" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:187 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:184 msgid "Are you sure you want to delete?" msgstr "Tem certeza de que deseja excluir?" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:208 msgid "Edit proxy settings" msgstr "Editar especificações de proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:219 msgid "New proxy settings" msgstr "Novas especificações de proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:263 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1118 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:420 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "Nome" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:265 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1120 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:225 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:422 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "Tipo" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:267 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1122 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:264 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1119 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:377 msgid "" "Name of tunnel to be displayed on Tunnel Manager home page and the router " "console sidebar" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:273 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1128 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:608 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "Descrição" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:275 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1130 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1127 msgid "Auto Start Tunnel" msgstr "Iniciar túnel automaticamente" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:277 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1129 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:383 msgid "Description of tunnel to be displayed on Tunnel Manager home page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:281 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1136 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:583 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1133 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:580 msgid "" "Enable this option to ensure this service is available when the router " "starts" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:285 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1140 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:584 msgid "Automatically start tunnel when router starts" msgstr "Iniciar túnel automaticamente quando o roteador iniciar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:289 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:286 msgid "" "The client tunnel and all other shared client tunnels must be stopped to " "change this setting" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:287 msgid "The client tunnel must be stopped to change this setting" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:304 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1156 msgid "Target" msgstr "Alvo" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:306 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1157 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1210 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1154 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1207 msgid "Access Point" msgstr "Ponto de acesso" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:309 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1031 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1174 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1212 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2397 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:490 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:513 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:699 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1028 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 +#: ../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 "Porta" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:315 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:438 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1179 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1217 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1176 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1289 msgid "required" msgstr "necessário" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:318 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1182 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:512 msgid "Specify the local port this service should be accessible from" 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:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1025 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1166 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2391 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:467 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1022 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:464 msgid "Host" msgstr "Host" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:344 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1168 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:469 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1165 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:466 msgid "Hostname or IP address of the target server" msgstr "Nome do host ou endereço IP do servidor-alvo" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:347 msgid "Local interface (ip address) the client tunnel will be reachable from" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:354 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1234 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:541 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:707 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1231 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:704 msgid "Reachable by" msgstr "Ao alcance de" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:380 msgid "Use SSL?" msgstr "Usar SSL?" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:382 msgid "" "If you are accessing a service on a remote I2P router, you may wish to " "connect with SSL to avoid traffic interception. The client application " "should be also be configured to use SSL." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:386 msgid "Clients use SSL to connect to tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:397 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:414 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:394 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:411 msgid "Outproxies" msgstr "Proxies de saída" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:399 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:411 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:408 msgid "" "Specify the .i2p address or destination (b32 or b64) of the outproxy here." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:398 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:442 msgid "" "For a random selection from a pool, separate with commas e.g. " "server1.i2p,server2.i2p" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:406 msgid "SSL Outproxies" msgstr "Proxies de saída SSL" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:418 msgid "Use Outproxy Plugin" msgstr "Usar extensão de proxy de saída" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:420 msgid "" "If an outproxy plugin is installed (e.g. Orchid), use this instead of any " "configured outproxies to access websites outside of I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:424 msgid "Use plugin instead of above-listed proxies if available" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:433 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433 msgid "Tunnel Destination" msgstr "Destino do túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:440 msgid "" "Specify the .i2p address or destination (b32 or b64) of the tunnel here." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:449 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:442 +#: ../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 "nome, nome:porta ou destino" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:455 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:452 msgid "b32 not recommended" msgstr "b32 não recomendado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:468 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:601 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "Cliente compartilhado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:473 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:470 msgid "" "Traffic from all clients with this feature enabled will be routed over the " "same set of tunnels. This will make profiling the tunnels by an adversary " "more difficult, but will link the clients together." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:484 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:481 msgid "Share tunnels with other clients?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:499 msgid "Enable DCC" msgstr "Permitir DCC" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:501 msgid "Enables direct chat and file transfers, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:505 msgid "" "Enable Direct Client-to-Client protocol. Note that this will compromise your" " anonymity and is not recommended." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:514 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1408 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:511 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1405 msgid "Advanced networking options" msgstr "Opções de rede avançadas" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:522 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:519 msgid "" "Note: When this client proxy is configured to share tunnels, then these " "options are for all the shared proxy clients!" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:528 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1407 msgid "Tunnel Length Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:530 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1421 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1529 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1526 msgid "Length" msgstr "Comprimento" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:532 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1423 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:529 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1420 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1528 msgid "Variance" msgstr "Variação" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:534 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1425 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1533 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1422 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1530 msgid "Length of each Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:542 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:547 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:552 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:557 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:565 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:569 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:573 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:577 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:584 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1432 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1437 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1442 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1447 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1455 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1459 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1463 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1467 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1474 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1540 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1544 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1548 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1552 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1556 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1560 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1564 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1568 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:544 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:554 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:562 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:566 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:570 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:574 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:581 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1429 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1439 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1444 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1452 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1464 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1471 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1537 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1545 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1553 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1557 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1561 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1565 #, java-format msgid "{0} hop tunnel" msgid_plural "{0} hop tunnel" msgstr[0] "" msgstr[1] "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:543 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:540 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1430 msgid "no anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:548 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1438 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1435 msgid "low anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:553 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1443 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:550 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1440 msgid "medium anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:558 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1448 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1445 msgid "high anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:590 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:587 msgid "Level of Randomization for Tunnel Length" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:597 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1486 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1577 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:594 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1483 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1574 msgid "0 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:598 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1487 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:595 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1484 msgid "no randomization, consistent performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:602 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1491 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1581 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1488 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1578 msgid "+ 0-1 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:603 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1492 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:600 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1489 msgid "medium randomization, lower performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:607 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1496 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1585 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:604 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1493 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1582 msgid "+ 0-2 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:608 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1497 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1494 msgid "high randomization, very low performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:612 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1501 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1589 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:609 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1498 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1586 msgid "+/- 0-1 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:613 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:610 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1499 msgid "standard randomization, standard performance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:617 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1506 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1593 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:614 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1503 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1590 msgid "+/- 0-2 hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:618 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1507 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:615 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1504 msgid "not recommended" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:629 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1518 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1604 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:626 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1601 msgid "hop variance" -msgstr "Variação de hop" +msgstr "Variação do salto" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:634 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1613 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:631 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1610 msgid "Tunnel Quantity Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:636 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1624 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1674 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1621 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1671 msgid "Count" msgstr "Contagem" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:638 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1626 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1676 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:635 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1623 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1673 msgid "Backup Count" msgstr "Contagem de backup" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:640 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1628 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1678 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1625 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1675 msgid "Number of Tunnels in Group" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:644 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1632 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1682 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1629 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1679 msgid "Number of Reserve Tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:652 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:657 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:662 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:667 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:676 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1639 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1644 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1649 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1654 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1663 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1689 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1693 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1697 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1701 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1708 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:649 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:654 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:659 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:664 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:673 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1636 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1641 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1646 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1651 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1660 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1686 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1690 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1694 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1698 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1705 #, java-format msgid "{0} backup tunnel" msgid_plural "{0} backup tunnels" msgstr[0] "" msgstr[1] "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:653 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1640 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:650 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1637 msgid "no redundancy, no added resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:658 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1645 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:655 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1642 msgid "low redundancy, low resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:663 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1650 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:660 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1647 msgid "medium redundancy, medium resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:668 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1655 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:665 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1652 msgid "high redundancy, high resource usage" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:682 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:679 msgid "Tunnel Management Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:688 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:685 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2263 msgid "Profile" msgstr "Perfil" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:690 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:687 msgid "Delay Connect" msgstr "Atrasar Conexão" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:692 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:689 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2265 msgid "Connection Profile" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:699 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:696 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2272 msgid "interactive connection" msgstr "conexão interativa" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:703 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2271 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:700 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2276 msgid "bulk connection (downloads/websites/BT)" msgstr "conexão em massa (downloads/websites/BT)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:705 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:702 msgid "Delay Connection" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:709 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:706 msgid "for request/response connections" msgstr "para conexões de pedidos/respostas" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:721 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:718 msgid "Delay tunnel open until required" msgstr "Túnel atrasado aberto até ser requerido" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:723 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:720 msgid "Conserve resources by only creating tunnels when required" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:727 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:724 msgid "" "Delay opening client tunnel until activity is detected on the configured " "tunnel port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:733 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:730 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2282 msgid "Reduce tunnel quantity when idle" msgstr "Reduzir quantidade de túneis quando inativo" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:735 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:732 msgid "" "Reduce tunnel count when idle but keep tunnel open (to ensure immediate " "availability)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:739 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2281 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:736 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2286 msgid "Reduce tunnel quantity when idle to conserve resources" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:741 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:743 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:738 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:740 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2288 msgid "Reduced tunnel count" msgstr "Contagem de túneis reduzidos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:747 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:761 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2289 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:744 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:758 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2294 msgid "Idle period" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:749 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:746 msgid "Reduced Tunnel Idle Time" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:753 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:750 msgid "Close tunnels when idle" msgstr "Fechar os túneis que estiverem inativos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:755 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:752 msgid "To conserve resources, close tunnels when not in use" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:759 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:756 msgid "Close client tunnels after specified idle period" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:763 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:760 msgid "Close Tunnel Idle Time" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:773 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:770 msgid "Change tunnel identity (destination) when tunnels reopen" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:775 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:772 msgid "Retain tunnel identity (destination) when tunnels reopen" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:781 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:778 msgid "New Keys on Reopen" msgstr "Novas Chaves em Reabrir" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:787 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:784 msgid "Enable" msgstr "Permitir" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:793 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1739 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1749 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:790 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1736 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1746 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2184 msgid "Disable" msgstr "Desabilitar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:805 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:802 msgid "Persistent private key" msgstr "Chave privada persistente" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:808 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:805 msgid "" "Enabling this feature will ensure your tunnel identity (destination) remains" " static, for services offering features based on destination e.g. IRC user " "authentication" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:810 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1295 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2101 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:807 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2095 msgid "Path to Private Key File" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:819 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:816 msgid "Generate key to enable persistent client tunnel identity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:821 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:818 msgid "File" msgstr "Arquivo" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:833 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1275 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:830 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1272 msgid "Local destination" msgstr "Destino local" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:835 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:832 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1281 msgid "Read Only: Local Destination (if known)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:839 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:836 msgid "Local Base32" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:850 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:847 msgid "Tunnel Filtering Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:852 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:849 msgid "HTTP Filtering" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:854 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:851 msgid "" "When enabled, the user agent of your web browser or http client will not be " "spoofed, potentially reducing your anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:858 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:855 msgid "Do not spoof User-Agent header" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:860 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:857 msgid "" "When enabled, the referer (originating page) of your web requests will not " "be filtered, potentially reducing your anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:864 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:861 msgid "Do not block Referer header" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:866 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:863 msgid "" "When enabled, the accept headers (mime types support) broadcast by your web " "browser will not be filtered, potentially reducing your anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:870 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:867 msgid "Do not block Accept headers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:872 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:869 msgid "Allow SSL to I2P addresses when enabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:876 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:873 msgid "Allow SSL to I2P addresses" msgstr "Permitir SSL para endereços I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:884 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2019 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:881 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2016 msgid "Configuration cannot be changed after destination is created" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:889 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1724 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:886 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1721 msgid "Tunnel Cryptography Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:893 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2028 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:890 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2025 msgid "Signature type" msgstr "Tipo de assinatura" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:897 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2032 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:894 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2029 msgid "Legacy option (deprecated), provided for backward compatibility" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:926 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2053 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:923 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2050 msgid "This is the default, recommended option" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:941 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2075 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:938 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2072 msgid "Encryption types" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:951 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2085 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:656 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:948 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2082 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:653 msgid "Experts only!" msgstr "Especialistas apenas!" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:957 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2091 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:954 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2088 msgid "Both encryption types" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:963 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:960 msgid "Tunnel Authentication Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:965 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:962 msgid "Local Authorization" msgstr "Autorização local" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:967 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:964 msgid "" "Enable to require a username and password to access this local service (for " "example if hosting on a LAN)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:971 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:968 msgid "Require local authorization for this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:973 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:989 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:970 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:986 msgid "Username" msgstr "Nome de usuário" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:975 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:972 msgid "Set username required to access this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:977 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:995 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:974 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:992 msgid "Password" msgstr "Senha" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:979 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1859 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1046 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:976 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1856 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1043 msgid "Set password required to access this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:981 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:978 msgid "Outproxy Authorization" msgstr "Autorização de proxy de saída" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:983 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:980 msgid "Enable if the outproxy a username and password to access" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:987 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:984 msgid "Outproxy requires authorization" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:991 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:988 msgid "Enter username required by outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:997 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:994 msgid "Enter password required by outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1007 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1004 msgid "Tunnel Address Lookup Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1009 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1006 msgid "Jump URL List" msgstr "Pular lista de URLs" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1011 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1008 msgid "" "List of helper URLs providing jump links when a host is not found in your " "addressbook" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1023 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2389 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1020 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2394 msgid "Router I2CP Address" msgstr "Endereço I2CP do roteador" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1027 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2393 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1024 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2398 msgid "I2CP Hostname or IP" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1033 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1030 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2404 msgid "I2CP Port Number" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1041 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2407 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1038 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2412 msgid "Custom options" msgstr "Opções personalizadas" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1043 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1040 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2414 msgid "Advanced tunnel, streaming, and I2CP options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1047 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:602 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:748 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1044 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:745 msgid "Cancel" msgstr "Cancelar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1049 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1046 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2420 msgid "Delete this Proxy (cannot be undone)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1052 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1049 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2423 msgid "Delete" msgstr "Deletar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1054 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2420 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1051 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2425 msgid "Save" msgstr "Salvar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1067 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1064 msgid "Edit Server Settings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1078 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1075 msgid "New Server Settings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1143 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1140 msgid "The hidden service must be stopped to change this setting" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1183 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:492 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1180 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:489 msgid "Specify the port the server is running on" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1198 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1195 msgid "" "To avoid traffic sniffing if connecting to a remote server, you can enable " "an SSL connection. Note that the target server must be configured to accept " "SSL connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1199 msgid "Use SSL to connect to target" msgstr "Usar SSL para conectar-se ao alvo" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1217 msgid "" "Port required to access service (this can be a different port to the port " "the service is hosted on)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1237 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1234 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:540 msgid "" "Listening interface (IP address) for client access (normally 127.0.0.1)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1264 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:662 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:659 msgid "Website Hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1266 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1263 msgid "Website Hostname e.g. mysite.i2p" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1270 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1267 msgid "(leave blank for outproxies)" msgstr "(deixar em branco para proxies de saída)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1282 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1279 msgid "Private key file" msgstr "Arquivo de chave privada" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1341 msgid "Generate a QR Code for this domain" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2140 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2145 msgid "Generate QR Code" msgstr "Gerar Código QR" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1359 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2147 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1356 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2152 msgid "Add to Private addressbook" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1365 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1362 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2158 msgid "Add to local addressbook" msgstr "Adicionar ao livro de endereços local" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1371 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1368 msgid "Register, unregister or change details for hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1373 msgid "Registration Authentication" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1382 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1379 msgid "HTTPS configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1387 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1384 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:215 msgid "SSL Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1397 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1394 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2168 msgid "" "Note: In order to enable QR code generation or registration authentication, " "configure the Website Hostname field (for websites) or the Name field " "(everything else) above with an .i2p suffixed hostname e.g. mynewserver.i2p" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1415 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1618 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1615 msgid "Inbound" msgstr "Entrante" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1479 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1570 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1567 msgid "Level of Randomization for Tunnel Depth" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1527 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1672 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1669 msgid "Outbound" msgstr "Saída" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1726 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1723 msgid "Encrypt Leaseset" msgstr "Criptografar Leaseset" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1735 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1745 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1732 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1742 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2180 msgid "Allow all clients to connect to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1755 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1785 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1752 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1782 msgid "Send key to all users." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1759 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1789 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "Encriptado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1769 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1766 msgid "Prevents server discovery by floodfills" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1773 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1770 msgid "Blinded" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1779 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1804 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1817 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1776 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1801 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1814 msgid "Send password to all users." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1783 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1780 msgid "Blinded with lookup password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1791 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1788 msgid "Send key and password to all users." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1795 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1792 msgid "Encrypted with lookup password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1797 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1803 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1794 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1800 msgid "Send individual key to each user." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1801 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1814 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1798 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1811 msgid "Encrypted with per-user key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1808 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1821 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1805 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1818 msgid "Encrypted with lookup password and per-user key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1810 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1816 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1807 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1813 msgid "Enter key from each user." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1834 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1831 msgid "Optional lookup password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1849 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1846 msgid "Encryption Key" msgstr "Chave criptográfica" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1877 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1874 msgid "Encryption key required to access this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1891 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1888 msgid "Revoke" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1893 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1930 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1890 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1927 msgid "Client Name" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1895 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1938 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1892 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1935 msgid "Client Key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1912 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1944 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1909 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1941 msgid "Client" msgstr "Cliente" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1928 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1925 msgid "Add" msgstr "Adicionar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2060 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2057 msgid "Recommended for blinded and encrypted destinations" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2099 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2101 msgid "Alternate private key file" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2110 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2115 msgid "Alternate local destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2112 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2117 msgid "Read Only: Alternate Local Destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2171 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2176 msgid "Tunnel Access Control Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2173 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2178 msgid "Restricted Access List" msgstr "Liste de acessos restritos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2181 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2186 msgid "Prevent listed clients from connecting to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2185 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2190 msgid "Deny List" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2187 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2192 msgid "Only allow listed clients to connect to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2191 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2196 msgid "Allow List" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2193 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2198 msgid "Access List Description" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2195 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2200 msgid "Specify clients, 1 per line" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2197 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2202 msgid "Control access to this service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2206 msgid "Filter Definition File" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2208 msgid "You can define an advanced filter for this tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2205 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2210 msgid "Format Specification" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2212 msgid "Absolute path to file containing filter definition" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2216 msgid "Server Access Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2217 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2222 msgid "Prevent clients from accessing this service via an inproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2221 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2226 msgid "Block Access via Inproxies" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2225 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2230 msgid "Block Accesses containing Referers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2232 msgid "Deny User-Agents matching these strings (probably from inproxies)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2231 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2236 msgid "Block these User-Agents" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2233 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2238 msgid "comma separated, e.g. Mozilla,Opera (case-sensitive)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2240 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2245 msgid "" "Use unique IP addresses for each connecting client (local non-SSL servers " "only)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2244 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2249 msgid "Unique Local Address per Client" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2246 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2251 msgid "Only enable if you are hosting this service on multiple routers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2250 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2255 msgid "Optimize for Multihoming" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2252 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2257 msgid "Tunnel Performance Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2285 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2290 msgid "Number of tunnels to keep open to maintain availability of service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2291 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2296 msgid "Period of inactivity before tunnel number is reduced" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2295 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2361 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2373 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2381 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2386 msgid "minutes" msgstr "minutos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2297 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2302 msgid "Server Throttling" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2304 msgid "Inbound connection limits (0=unlimited)" msgstr "Limites da conexão entrante (0=ilimitado)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2306 msgid "Per Minute" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2308 msgid "Per Hour" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2305 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2310 msgid "Per Day" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2351 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2356 msgid "Per Client" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2309 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2314 msgid "" "Maximum number of web page requests per minute for a unique client before " "access to the server is blocked" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2313 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2318 msgid "" "Maximum number of web page requests per hour for a unique client before " "access to the server is blocked" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2317 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2363 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2368 msgid "Total" msgstr "Total" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2328 msgid "" "Total number of web page requests per minute before access to the server is " "blocked" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2327 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2331 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2340 msgid "Max concurrent connections (0=unlimited)" msgstr "Máximo de conexões concorrentes (0=ilimitado)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2342 msgid "Maximum number of simultaneous client connections" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2350 msgid "POST limits (0=unlimited)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2347 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2352 msgid "Per Period" msgstr "Por período" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2354 msgid "Ban Duration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2353 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2358 msgid "" "Maximum number of post requests permitted for a unique client for the " -"configured timespan" +"configured time span" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2357 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2362 msgid "" "If a client exceeds the maximum number of post requests per allocated " "period, enforce a ban for this number of minutes" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2365 -msgid "Total number of post requests permitted for the configured timespan" +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2369 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2380 msgid "POST limit period" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2377 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2382 msgid "" -"Timespan for the maximum number of post requests to be reached before a ban " -"is triggered" +"Time span for the maximum number of post requests to be reached before a ban" +" is triggered" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2435 msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:164 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" -" the same set of tunnels and be listed as \"Shared Clients\" and \"Shared " -"Clients(DSA)\"." +" the same set of tunnels and be listed as \"Shared Clients\"." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:178 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "Mensagens de Estado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "Recarregar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:193 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "Limpar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "Controle de túnel global" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:206 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "Assistente de túneis" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "Interromper todos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "Inicializar todos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "Reinicializar todos" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "Serviços ocultos da I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "Aponta para" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "Mostrar previsão" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:428 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "Estado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:233 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "Controle" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "Nenhuma visualização" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:308 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "Inicializando..." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:310 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:329 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:477 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "Interromper esse túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:317 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:336 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:484 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:501 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "Parar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:511 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "Em funcionamento" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "Parado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:530 +#: ../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 "Iniciar esse túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:355 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "Inicializar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "Destino" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "Servidor" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "Novo serviço oculto" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:414 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:635 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:289 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:323 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:347 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:353 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:634 msgid "Standard" msgstr "Padrão" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:416 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "Criar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:418 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "Túneis de cliente I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:424 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "Interface" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "Editar as configurações de túnel para" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:494 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "Em prontidão" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "Proxy de saída" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:562 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "extensão interna" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:581 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "nenhum" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "Novo túnel de cliente" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:190 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:189 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:210 msgid "Registration Helper" msgstr "Auxiliar de registro" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:240 msgid "" "This service uses encrypted leasesets. Registration is not recommended. " "Registration authentication is disabled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:249 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:246 msgid "" "Please be sure to select, copy, and paste the entire contents of the " "appropriate authentication data into the form of your favorite registration " "site" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:653 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:650 msgid "Tunnel name" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:259 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:256 msgid "Website name" msgstr "Nome do website" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:267 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:264 msgid "Local Destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:275 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:671 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:668 msgid "Local destination is not available. Start the tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:282 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:678 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:279 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:675 msgid "" "To enable registration verification, edit tunnel and set name (or website " -"name) to a valid host name ending in '.i2p'" +"name) to a valid hostname ending in '.i2p'" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:288 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:684 +#: ../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 " -"host name ending in '.i2p'" +"hostname ending in '.i2p'" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:294 msgid "Destination signing key is not available. Start the tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:303 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:310 #, java-format msgid "Authentication for adding host {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:315 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:330 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:368 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:436 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:471 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:544 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:398 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:468 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:541 msgid "Copy and paste this to the registration site" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:317 msgid "Advanced authentication strings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:325 #, java-format msgid "Authentication for removing host {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:356 msgid "Authentication for changing name" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:373 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:370 #, java-format msgid "This will change the name from {0} to {1}, using the same destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:379 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:412 -msgid "This tunnel must be configured with the new host name." +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:381 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:414 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:411 msgid "Enter old hostname below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:392 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:389 msgid "Authentication for adding alias" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:403 #, java-format msgid "This will add an alias {0} for {1}, using the same destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:426 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:423 msgid "Authentication for changing destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:438 #, java-format msgid "This will change the destination for {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:447 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:516 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:444 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:513 msgid "This tunnel must be configured with the new destination." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:449 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:446 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:515 msgid "Enter old destination below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:458 msgid "Authentication for adding alternate destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:476 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:510 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:473 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:507 #, java-format msgid "This will add an alternate destination for {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:533 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:530 msgid "Authentication for adding subdomain" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:546 #, java-format msgid "This will add a subdomain {0} of {1}, with a different destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:552 msgid "This tunnel must be configured with the new subdomain and destination." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:557 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:554 msgid "Enter higher-level domain and destination below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:574 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1086 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:571 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1083 msgid "Go back and edit the tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:585 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:582 msgid "Specify old name and destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:584 msgid "This is only required for advanced authentication." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:589 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:586 msgid "See above for required items." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:596 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:593 msgid "Old hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:600 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:597 msgid "Private Key File for old Destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:604 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:601 msgid "Generate Authentication" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:607 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:604 msgid "Generate" msgstr "Gerar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:183 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:182 msgid "SSL Helper" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:692 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:689 msgid "Base32" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:700 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:697 msgid "Alt Base32" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:709 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:706 msgid "Incoming I2P Port Routing" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:711 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:708 msgid "I2P Port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:713 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:710 msgid "Virtual Host" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:715 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:793 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:712 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:790 msgid "SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:717 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:787 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:714 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:784 msgid "Server" msgstr "Servidor" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:723 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:720 msgid "Default" msgstr "Padrão" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:785 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:782 msgid "Jetty Server" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:789 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:786 msgid "Configuration Files" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:791 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:788 msgid "Enabled" msgstr "Ativado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:846 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:843 msgid "I2P webserver (eepsite)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1028 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1025 msgid "SSL is enabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1030 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1027 msgid "Disable SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1036 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1033 msgid "SSL is disabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1038 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1035 msgid "Enable SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1044 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1041 msgid "New Certificate Password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1052 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1049 msgid "Generate new SSL certificate" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1058 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1055 msgid "Generate SSL certificate and enable" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:191 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:190 msgid "I2P Tunnel Manager - Tunnel Creation Wizard" msgstr "Gerenciador de túneis I2P - Assistente de criação de túneis" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:205 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:628 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:625 msgid "Server or client tunnel?" msgstr "Túnel cliente ou servidor?" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:211 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:629 msgid "Tunnel type" msgstr "Tipo de túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214 msgid "Tunnel name and description" msgstr "Nome e descrição do túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:664 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:661 msgid "Tunnel destination" msgstr "Destino do túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:229 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226 msgid "Binding address and port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:235 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:714 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:711 msgid "Tunnel auto-start" msgstr "Inicialização automática do túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238 msgid "Wizard completed" msgstr "Assistente completado" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:255 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252 msgid "" "This wizard will take you through the various options available for creating" " tunnels in I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:257 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:259 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:261 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:263 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260 msgid "Server Tunnel" msgstr "Túnel servidor" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262 msgid "Client Tunnel" msgstr "Túnel cliente" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:280 msgid "There are several types of tunnels to choose from:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:288 msgid "Basic tunnel for connecting to a single service inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:293 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:327 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:295 -msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P." +#: ../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." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:294 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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:296 msgid "" "Websites outside I2P can also be reached if an HTTP proxy within I2P is " "known." msgstr "Sites web externos a I2P também pode ser alcançados desde que um proxy HTTP dentro da I2P seja conhecido." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:301 -msgid "Customised client tunnel specific for IRC connections." +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:298 +msgid "Customized client tunnel specific for IRC connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:300 msgid "" "With this tunnel type, your IRC client will be able to connect to an IRC " "network inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:304 msgid "A tunnel that implements the SOCKS protocol." msgstr "Um túnel que implementa o protocolo SOCKS." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:306 msgid "" "This enables both TCP and UDP connections to be made through a SOCKS " "outproxy within I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:308 msgid "" -"A client tunnel implementing the SOCKS protocol, which is customised for " +"A client tunnel implementing the SOCKS protocol, which is customized for " "connecting to IRC networks." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:313 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:315 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:317 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:325 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:329 -msgid "A server tunnel that is customised for HTTP connections." +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 +msgid "A server tunnel that is customized for HTTP connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:331 -msgid "Use this tunnel type if you want to host an eepsite." +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:333 -msgid "A customised server tunnel for hosting IRC networks inside 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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:332 msgid "" "Usually, a separate tunnel needs to be created for each IRC server that is " "to be accessible inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:338 msgid "Select tunnel type" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:374 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:371 msgid "Choose a name and description for your tunnel." msgstr "Escolha um nome e uma descrição para o seu túnel." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:373 msgid "" "These can be anything you want - they are just for ease of identifying the " "tunnel in the routerconsole." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:409 msgid "Separate multiple proxies with commas." msgstr "Separar os múltiplos proxies com vírgulas." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:413 msgid "" "List of I2P outproxy destinations, separated with commas (e.g. " "proxy1.i2p,proxy2.i2p)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:432 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:429 msgid "" "Type in the I2P destination of the service that this client tunnel should " "connect to." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431 msgid "" "This could be the full Base64 destination key, or an I2P URL from your " "address book." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:438 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:435 msgid "Enter a b64 or .i2p address here" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:463 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460 msgid "" "This is the IP that your service is running on, this is usually on the same " "machine so 127.0.0.1 is autofilled." msgstr "Esse é o IP no qual o serviço está rodando, isto está geralmente na mesma maquina então 127.0.0.1 é autopreenchido." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:488 +#: ../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 "Essa é a porta pela qual o serviço está aceitando conexões." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:511 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:534 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:536 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:581 +#: ../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 occassionally it would mean that the I2P " +"but for tunnels that are only used occasionally it would mean that the I2P " "router is creating and maintaining unnecessary tunnels." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:607 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:609 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:614 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:616 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:620 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:622 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:626 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:623 msgid "Below is a summary of the options you chose:" msgstr "Abaixo um resumo das opções que você escolheu:" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:657 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:654 msgid "Tunnel description" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:680 msgid "Binding address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:688 msgid "Tunnel port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:725 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:722 msgid "" "Alongside these basic settings, there are a number of advanced options for " "tunnel configuration." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:727 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:746 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:743 msgid "Cancel the wizard and return to Tunnel Manager home page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:750 msgid "Return to previous page" msgstr "Retornar para a página anterior" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:756 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753 msgid "Previous" msgstr "Anterior" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:764 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:761 msgid "Save tunnel configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:767 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:764 msgid "Save Tunnel" msgstr "Salvar túnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:773 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:770 msgid "Finish Wizard and review tunnel settings" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:776 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:773 msgid "Finish" msgstr "Terminar" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:782 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:779 msgid "Advance to next page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:785 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:782 msgid "Next" msgstr "Próximo" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_sq.po i2p-0.9.50/apps/i2ptunnel/locale/messages_sq.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_sq.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_sq.po 2021-05-19 12:11:56.000000000 +0000 @@ -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" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 16:05+0000\n" "Last-Translator: zzzi2p\n" "Language-Team: Albanian (http://www.transifex.com/otf/I2P/language/sq/)\n" "MIME-Version: 1.0\n" @@ -167,7 +167,7 @@ msgstr "" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "Strehë e paujdisur" @@ -177,7 +177,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" @@ -205,16 +205,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "Emër" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "Lloj" @@ -228,8 +228,8 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "Përshkrim" @@ -285,7 +285,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -404,7 +404,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "" @@ -1154,7 +1154,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "I fshehtëzuar" @@ -1494,152 +1494,164 @@ msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" " the same set of tunnels and be listed as \"Shared Clients\"." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "Rifreskoje" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "Spastroje" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "Paraparje" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "Gjendje" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "Ndale" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "Në funksion" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "Nisje" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "Vendmbërritje" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" +msgstr "Emri i nikoqirit" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1648,41 +1660,41 @@ msgid "Standard" msgstr "Standard" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "Krijoje" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "asnjë" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_tr.po i2p-0.9.50/apps/i2ptunnel/locale/messages_tr.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_tr.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_tr.po 2021-05-19 12:11:56.000000000 +0000 @@ -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-15 04:52+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 17:35+0000\n" "Last-Translator: Kaya Zeren \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n" "MIME-Version: 1.0\n" @@ -167,7 +167,7 @@ msgstr "HTTP bidir" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "Sunucu ayarlanmamış" @@ -177,7 +177,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" @@ -205,16 +205,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "Ad" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "Tür" @@ -228,8 +228,8 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "Açıklama" @@ -285,7 +285,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -404,7 +404,7 @@ msgstr "b32 önerilmez" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "Paylaşılmış İstemci" @@ -1154,7 +1154,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "Şifrelenmiş" @@ -1494,152 +1494,164 @@ msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "Henüz tüneller oluşturulmamış. Lütfen kısa süre sonra yeniden deneyin." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "Yönelticiniz tarafından sağlanan yerel hizmetler." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" " the same set of tunnels and be listed as \"Shared Clients\"." msgstr "Varsayılan olarak istemci hizmetlerinizin çoğu (e-posta, HTTP vekil sunucu, IRC) \"Paylaşılmış İstemciler\" ve \"Paylaşılmış İstemciler\" altında görülebilecek aynı tünel kümesini kullanır." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "Durum İletileri" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "Yenile" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "Temizle" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "Genel Tünel Denetimi" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "Tünel Yardımcısı" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "Tümünü Durdur" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "Tümünü Başlat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "Tümünü Yeniden Başlat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "I2P Gizli Hizmetleri" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "Şurayı gösteren" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "Önizleme" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "Duru" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "Denetim" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "Şunun İçin Sunucu Tünel Ayarlarını Düzenle" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "I2P üzerinden geçmeden HTTPS sunucuyu sına" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "I2P üzerinden geçmeden HTTP sunucuyu sına" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "I2P üzerinden HTTP sunucuyu sına" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "Önizleme Yok" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "Başlatılıyor..." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "Bu Tüneli Durdur" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "Durdur" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "Çalışıyor" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "Durduruldu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "Bu Tüneli Başlat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "Başlat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "Hedef" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "Sunucu Adı" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "Sitenizi sunucu adını kullanarak paylaşın" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "Sunucu adını panoya kopyalar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "Sunucu Adını Kopyala" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "Yeni gizli hizmet" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1648,41 +1660,41 @@ msgid "Standard" msgstr "Standart" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "Oluştur" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "I2P İstemci Tünelleri" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "Arabirim" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "Şunun İçin Tünel Ayarlarını Düzenle" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "Hazırda Bekle" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "Giden Vekil Sunucusu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "iç uygulama eki" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "yok" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "Yeni istemci tüneli" diff -Nru i2p-0.9.49/apps/i2ptunnel/locale/messages_zh.po i2p-0.9.50/apps/i2ptunnel/locale/messages_zh.po --- i2p-0.9.49/apps/i2ptunnel/locale/messages_zh.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale/messages_zh.po 2021-05-19 12:11:56.000000000 +0000 @@ -11,7 +11,7 @@ # xkimo_daeee , 2014 # nobody , 2017 # 黃彥儒 , 2014 -# Scott Rhodes , 2020 +# Scott Rhodes , 2020-2021 # SF W, 2019 # uzmintid Xun <1109673069@qq.com>, 2017 # walking , 2011 @@ -26,9 +26,9 @@ 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: zzzi2p\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 16:49+0000\n" +"Last-Translator: Scott Rhodes \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" @@ -179,7 +179,7 @@ msgstr "双向 HTTP" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493 msgid "Host not set" msgstr "主机未设置" @@ -189,7 +189,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178 msgid "Hidden Services Manager" @@ -217,16 +217,16 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375 msgid "Name" msgstr "名称" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462 msgid "Type" msgstr "类型" @@ -240,8 +240,8 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381 msgid "Description" msgstr "描述" @@ -297,7 +297,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696 @@ -416,7 +416,7 @@ msgstr "不推荐 b32 地址。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641 msgid "Shared Client" msgstr "共享客户端" @@ -508,27 +508,27 @@ #, java-format msgid "{0} hop tunnel" msgid_plural "{0} hop tunnel" -msgstr[0] "" +msgstr[0] "{0} 跳隧道" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:540 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1430 msgid "no anonymity" -msgstr "" +msgstr "无匿名性" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:545 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1435 msgid "low anonymity" -msgstr "" +msgstr "低匿名性" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:550 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1440 msgid "medium anonymity" -msgstr "" +msgstr "中匿名性" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:555 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1445 msgid "high anonymity" -msgstr "" +msgstr "高匿名性" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:587 msgid "Level of Randomization for Tunnel Length" @@ -538,12 +538,12 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1483 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1574 msgid "0 hop variance" -msgstr "" +msgstr "0 跳点变化幅度" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:595 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1484 msgid "no randomization, consistent performance" -msgstr "" +msgstr "无随机性,恒定性能" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:599 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1488 @@ -642,7 +642,7 @@ #, java-format msgid "{0} backup tunnel" msgid_plural "{0} backup tunnels" -msgstr[0] "" +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:1637 @@ -1164,7 +1164,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382 msgid "Encrypted" msgstr "已加密" @@ -1228,7 +1228,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1888 msgid "Revoke" -msgstr "" +msgstr "撤销" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1890 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1927 @@ -1279,7 +1279,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2190 msgid "Deny List" -msgstr "" +msgstr "拒绝列表" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2192 msgid "Only allow listed clients to connect to this service" @@ -1287,7 +1287,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2196 msgid "Allow List" -msgstr "" +msgstr "允许列表" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2198 msgid "Access List Description" @@ -1343,7 +1343,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2238 msgid "comma separated, e.g. Mozilla,Opera (case-sensitive)" -msgstr "" +msgstr "以逗号分隔,例:Mozilla,Opera(大小写敏感)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2245 msgid "" @@ -1365,7 +1365,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2257 msgid "Tunnel Performance Options" -msgstr "" +msgstr "隧道性能选项" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2290 msgid "Number of tunnels to keep open to maintain availability of service" @@ -1472,7 +1472,7 @@ msgid "" "Maximum number of post requests permitted for a unique client for the " "configured time span" -msgstr "" +msgstr "配置的时间跨度中用于唯一客户端的最大网页请求数" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2362 msgid "" @@ -1504,152 +1504,164 @@ msgid "Tunnels not initialized yet; please retry in a few moments." msgstr "隧道尚未初始化;请稍后重试。" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 msgid "These are the local services provided by your router." msgstr "这些是您的路由提供的本地服务。" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165 msgid "" "By default, most of your client services (email, HTTP proxy, IRC) will share" " the same set of tunnels and be listed as \"Shared Clients\"." -msgstr "" +msgstr "默认情况下,您的大多数客户端服务(电子邮件,HTTP 代理,IRC)会共享同一组隧道并列为“共享客户端”。" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638 msgid "Status Messages" msgstr "状态信息" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181 msgid "Refresh" msgstr "刷新" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 msgid "Clear" msgstr "清除" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 msgid "Global Tunnel Control" msgstr "全局隧道控制" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205 msgid "Tunnel Wizard" msgstr "隧道向导" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209 msgid "Stop All" msgstr "全部停止" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 msgid "Start All" msgstr "全部启动" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 msgid "Restart All" msgstr "全部重启" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 msgid "I2P Hidden Services" msgstr "I2P 隐身服务" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 msgid "Points at" msgstr "指向" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289 msgid "Preview" msgstr "预览" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468 msgid "Status" msgstr "状态" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470 msgid "Control" msgstr "控制项" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 msgid "Edit Server Tunnel Settings for" msgstr "编辑服务器隧道设置 - " -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256 msgid "Test HTTPS server, bypassing I2P" msgstr "测试 HTTPS 服务器,绕过 I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264 msgid "Test HTTP server, bypassing I2P" msgstr "测试 HTTP 服务器,绕过 I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 msgid "Test HTTP server through I2P" msgstr "测试 HTTP 服务器,通过 I2P" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "No Preview" msgstr "无预览" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 msgid "Starting..." msgstr "正在启动..." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../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 "停止这个隧道" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558 msgid "Stop" msgstr "停止" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551 msgid "Running" msgstr "运行中" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568 msgid "Stopped" msgstr "已停止" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527 +#: ../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 "启动这个隧道" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577 msgid "Start" msgstr "启动" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595 msgid "Destination" msgstr "目标" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371 msgid "Hostname" msgstr "主机名" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412 +msgid "Share your site using the hostname" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433 +msgid "Copy the hostname to the clipboard" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +msgid "Copy Hostname" +msgstr "复制主机名称" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452 msgid "New hidden service" msgstr "新建隐身服务" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344 @@ -1658,41 +1670,41 @@ msgid "Standard" msgstr "标准" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677 msgid "Create" msgstr "创建" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458 msgid "I2P Client Tunnels" msgstr "I2P 客户端隧道" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464 msgid "Interface" msgstr "网络接口" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479 msgid "Edit Tunnel Settings for" msgstr "编辑隧道设置 - " -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534 msgid "Standby" msgstr "等待" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589 msgid "Outproxy" msgstr "出口代理" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602 msgid "internal plugin" msgstr "内部插件" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621 msgid "none" msgstr "无" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673 msgid "New client tunnel" msgstr "新建客户隧道" @@ -1909,12 +1921,12 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:710 msgid "Virtual Host" -msgstr "" +msgstr "虚拟主机" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:712 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:790 msgid "SSL" -msgstr "" +msgstr "SSL" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:714 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:784 @@ -2054,7 +2066,7 @@ #: ../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." -msgstr "" +msgstr "访问HTTP代理的隧道,用来访问I2P中的站点。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:294 msgid "" @@ -2071,7 +2083,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:298 msgid "Customized client tunnel specific for IRC connections." -msgstr "" +msgstr "自定义客户端隧道,专为 IRC 连接设置。" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:300 msgid "" @@ -2099,7 +2111,7 @@ 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 "" @@ -2127,7 +2139,7 @@ #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 msgid "A server tunnel that is customized for HTTP connections." -msgstr "" +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." diff -Nru i2p-0.9.49/apps/i2ptunnel/locale-proxy/messages_de.po i2p-0.9.50/apps/i2ptunnel/locale-proxy/messages_de.po --- i2p-0.9.49/apps/i2ptunnel/locale-proxy/messages_de.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale-proxy/messages_de.po 2021-05-19 12:11:55.000000000 +0000 @@ -12,7 +12,7 @@ # Ettore Atalan , 2014-2015,2017 # Florian Maier , 2017 # foo , 2009 -# Lars Schimmer , 2014-2017,2020 +# Lars Schimmer , 2014-2017,2020-2021 # Max Muster , 2014 # mixxy, 2011 # nextloop , 2013 @@ -24,8 +24,8 @@ "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: Ettore Atalan \n" +"PO-Revision-Date: 2021-05-05 16:56+0000\n" +"Last-Translator: Lars Schimmer \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" @@ -697,12 +697,12 @@ #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:376 #, java-format msgid "Saved {0} to the {1} address book, redirecting now." -msgstr "" +msgstr "{0} in das {1} Adressbuch gesichert, leite nun weiter." #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:377 #, java-format msgid "Failed to save {0} to the {1} address book, redirecting now." -msgstr "" +msgstr "Fehler beim Speichern von {0} in das {1} Adressbuch, leite nun weiter." #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:379 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:411 diff -Nru i2p-0.9.49/apps/i2ptunnel/locale-proxy/messages_ja.po i2p-0.9.50/apps/i2ptunnel/locale-proxy/messages_ja.po --- i2p-0.9.49/apps/i2ptunnel/locale-proxy/messages_ja.po 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/locale-proxy/messages_ja.po 2021-05-19 12:11:55.000000000 +0000 @@ -5,14 +5,15 @@ # # Translators: # Masayuki Hatta , 2018 -# riopfga caetocla, 2021 +# XMPPはいいぞ, 2021 +# XMPPはいいぞ, 2021 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-05 15:27+0000\n" -"Last-Translator: g3600303 \n" +"PO-Revision-Date: 2021-05-14 01:18+0000\n" +"Last-Translator: XMPPはいいぞ\n" "Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -103,7 +104,7 @@ #: ../java/build/Proxy.java:12 msgid "The website was not reachable." -msgstr "ウェブサイトに到達できません" +msgstr "ウェブサイトに到達できません。" #: ../java/build/Proxy.java:13 msgid "" @@ -115,7 +116,7 @@ #: ../java/build/Proxy.java:109 ../java/build/Proxy.java:129 #, java-format msgid "You may want to {0}retry{1}." -msgstr " {0}リトライ{1}するとよいかもしれません。" +msgstr " {0}再試行{1}するとよいかもしれません。" #: ../java/build/Proxy.java:15 ../java/build/Proxy.java:27 #: ../java/build/Proxy.java:48 ../java/build/Proxy.java:59 @@ -146,7 +147,7 @@ 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 "(複数のアウトプロキシが設定されている場合は){2}ここ{3}で定義したプールから無作為にアウトプロキシが再選択されるので、{0}リトライ{1}することをお勧めします。" +msgstr "(複数のアウトプロキシが設定されている場合は){2}ここ{3}で定義したプールから無作為にアウトプロキシが再選択されるので、{0}再試行{1}することをお勧めします。" #: ../java/build/Proxy.java:26 ../java/build/Proxy.java:170 #: ../java/build/Proxy.java:195 ../java/build/Proxy.java:216 @@ -183,7 +184,7 @@ msgid "" "If you do not save it, the host name will be forgotten after the next router" " restart." -msgstr "保存しなければ、ホスト名はルーターを再起動すると忘れられます。" +msgstr "保存しなければ、ホスト名はルータを再起動すると忘れられます。" #: ../java/build/Proxy.java:39 msgid "" @@ -239,11 +240,11 @@ msgid "" "Do not use the proxy to access the router console, localhost, or local LAN " "destinations." -msgstr "ルーターコンソール、ローカルホスト、またはローカルLANの宛先へアクセスするのにプロキシを使わないでください。" +msgstr "ルータコンソール、ローカルホスト、またはローカルLANの宛先へアクセスするのにプロキシを使わないでください。" #: ../java/build/Proxy.java:78 msgid "Website Unknown" -msgstr "ウェブサイトは未知です" +msgstr "未知のウェブサイト" #: ../java/build/Proxy.java:84 msgid "Website Not Found in Addressbook" @@ -251,7 +252,7 @@ #: ../java/build/Proxy.java:85 msgid "The website was not found in your router's addressbook." -msgstr "あなたのルーターのアドレス帳にウェブサイトが見つかりませんでした。" +msgstr "あなたのルータのアドレス帳にウェブサイトが見つかりませんでした。" #: ../java/build/Proxy.java:86 msgid "Check the link or find a Base 32 or Base 64 address." @@ -260,7 +261,7 @@ #: ../java/build/Proxy.java:87 #, java-format msgid "If you have the Base 64 address, {0}add it to your addressbook{1}." -msgstr "あなたが Base 64 のアドレスを持っている場合は、あなたのアドレス帳{1} へ {0}追加してください。" +msgstr "あなたが Base 64 のアドレスを持っている場合は、{0}あなたのアドレス帳へ追加してください{1}。" #: ../java/build/Proxy.java:88 msgid "" @@ -273,7 +274,7 @@ msgid "" "Seeing this page often? See {0}the FAQ{1} for help in {2}adding some " "subscriptions{3} to your addressbook." -msgstr "" +msgstr "このページを頻繁に見ますか? あなたのアドレス帳へ{2}購読を追加{3}にある{0}よくある質問{1}を、ヘルプのために見てください。" #: ../java/build/Proxy.java:98 msgid "" @@ -283,7 +284,7 @@ #: ../java/build/Proxy.java:99 ../java/build/Proxy.java:217 msgid "Could not connect to the following destination:" -msgstr "" +msgstr "以下の宛先に接続できませんでした:" #: ../java/build/Proxy.java:100 ../java/build/Proxy.java:106 #: ../java/build/Proxy.java:185 ../java/build/Proxy.java:191 @@ -308,13 +309,13 @@ msgid "" "The website destination specified was not valid, or was otherwise " "unreachable." -msgstr "" +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 "" +msgstr "おそらく、間違ったBase 64の文字列を貼り付けたか、以下のリンクが悪いのでしょう。" #: ../java/build/Proxy.java:128 msgid "The I2P host could also be offline." @@ -342,20 +343,20 @@ msgid "" "The address helper link you followed specifies a different destination key " "than the entry in your address book." -msgstr "" +msgstr "辿ったアドレスヘルパーのリンクは、あなたのアドレス帳のエントリとは異なる宛先キーを指定します。" #: ../java/build/Proxy.java:148 msgid "" "Someone could be trying to impersonate another website, or people have given" " two websites identical names." -msgstr "" +msgstr "誰かが別のウェブサイトに成りすまそうとしている可能性、または人々が2つのウェブサイトに同じ名前を付けている可能性があります。" #: ../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 "" +msgstr "信頼できるキーを決定し、アドレスヘルパーリンクを無視するか、アドレス帳からホストエントリを削除してアドレスヘルパーリンクを再度クリックすることで、競合を解決します。" #: ../java/build/Proxy.java:150 ../java/build/Proxy.java:156 msgid "Warning: Bad Address Helper" @@ -368,13 +369,13 @@ #: ../java/build/Proxy.java:158 msgid "It seems to be garbage data, or a mistyped Base 32 address." -msgstr "" +msgstr "それはゴミデータになっている、またはBase 32 アドレスを誤記しています。" #: ../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 "" +msgstr "URLを確認して、ヘルパーキーが有効なBase 32ホスト名またはBase 64キーになるように修正を試みてください。" #: ../java/build/Proxy.java:167 msgid "The HTTP Outproxy was not found." @@ -392,7 +393,7 @@ #: ../java/build/Proxy.java:179 msgid "You attempted to connect to a non-I2P website or location." -msgstr "" +msgstr "非I2Pのウェブサイトまたは場所へ接続を試みました。" #: ../java/build/Proxy.java:180 msgid "Proxy Authorization Required" @@ -412,7 +413,7 @@ msgid "" "Please enter your username and password, or check your {0}router " "configuration{1} or {2}I2PTunnel configuration{3}." -msgstr "" +msgstr "ユーザー名とパスワードを入力、または{0}ルータ設定{1}または{2}I2Pトンネル設定{3}を確認してください。" #: ../java/build/Proxy.java:184 #, java-format @@ -420,7 +421,7 @@ "To disable authorization, remove the configuration " "{0}i2ptunnel.proxy.auth=basic{1}, then stop and restart the HTTP Proxy " "tunnel." -msgstr "" +msgstr "認証を無効化し、設定 {0}i2ptunnel.proxy.auth=basic{1} を削除し、そしてHTTPプロキシのトンネルを停止と再起動してください。" #: ../java/build/Proxy.java:192 msgid "The connection to the proxy was reset." @@ -460,11 +461,11 @@ #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:692 msgid "This seems to be a bad destination:" -msgstr "" +msgstr "これは悪い宛先であると思われる:" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:693 msgid "i2paddresshelper cannot help you with a destination like that!" -msgstr "" +msgstr "I2Pアドレスヘルパーでは、そのような宛先では役立ちません!" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:765 #, java-format @@ -472,20 +473,20 @@ "To visit the destination in your address book, click here. To visit the conflicting addresshelper destination, " "click here." -msgstr "" +msgstr "あなたのアドレス帳にある宛先に訪れるには、ここをクリックしてください。衝突するアドレスヘルパーの宛先を訪れるには、ここをくりっくしてください。" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:774 #, java-format msgid "Destination for {0} in address book" -msgstr "" +msgstr "アドレス帳にある {0} 用の宛先" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:777 msgid "Conflicting address helper destination" -msgstr "" +msgstr "不正なアドレスヘルパーの宛先" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1224 msgid "Corrupt Base32 address" -msgstr "" +msgstr "不正な Base32 アドレス" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304 msgid "Destination lease set not found" @@ -498,7 +499,7 @@ #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1441 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1502 msgid "Base32" -msgstr "" +msgstr "Base32" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1445 msgid "Destination" @@ -513,7 +514,7 @@ 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ルーターを再起動するまで記憶されます。" +msgstr "アドレス帳に保存しなくても閲覧できます。アドレスはI2Pルータを再起動するまで記憶されます。" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1453 msgid "Continue without saving" @@ -522,7 +523,7 @@ #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1460 #, java-format msgid "Save {0} to router address book and continue to website" -msgstr "ルーターのアドレス帳に {0} を保存し、ウェブサイトを続行" +msgstr "ルータのアドレス帳に {0} を保存し、ウェブサイトを続行" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1461 msgid "" @@ -594,11 +595,11 @@ 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 "" +msgstr "サーバーのオペレータによって提供されるPSK暗号化鍵を入力するか、またはDH暗号化鍵を生成し、それをサーバーのオペレータへ送信するか、どちらかしなければなりません。" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1527 msgid "Ask the server operator for help." -msgstr "" +msgstr "ヘルプのためにサーバーのオペレータを尋ねてください。" #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1530 msgid "Enter PSK encryption key" @@ -614,16 +615,16 @@ #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1542 msgid "You must enter the password provided by the server operator." -msgstr "" +msgstr "サーバーのオペレータによって提供されるパスワードを入力しなければなりません。" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:196 #, java-format msgid "Added via address helper from {0}" -msgstr "" +msgstr "{0} からアドレスヘルパー経由で追加" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198 msgid "Added via address helper" -msgstr "" +msgstr "アドレスヘルパー経由で追加" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:235 msgid "Missing lookup password" @@ -648,15 +649,15 @@ #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:311 msgid "Copy the key and send it to the server operator." -msgstr "" +msgstr "そのキーをコピーして、サーバーのオペレータへ送信してください。" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:313 msgid "After you are granted permission, you may proceed to the website." -msgstr "" +msgstr "許諾を得た後は、ホームページに進むことができます。" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:334 msgid "Go back and fix the error" -msgstr "" +msgstr "戻ってエラーを修正" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:345 msgid "router" @@ -664,7 +665,7 @@ #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:347 msgid "local" -msgstr "" +msgstr "ローカル" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:349 msgid "private" @@ -684,19 +685,19 @@ #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:376 #, java-format msgid "Saved {0} to the {1} address book, redirecting now." -msgstr "" +msgstr "{1} のアドレス帳に {0} を保存し、転送中。" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:377 #, java-format msgid "Failed to save {0} to the {1} address book, redirecting now." -msgstr "" +msgstr "{1} のアドレス帳に {0} を保存失敗し、転送中。" #: ../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 "" +msgstr "自動で転送されなければ、ここをクリックしてください。" #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:409 #, java-format msgid "Saved the authentication for {0}, redirecting now." -msgstr "" +msgstr "{0} のための認証を保存し、転送中。" diff -Nru i2p-0.9.49/apps/i2ptunnel/resources/proxy/b32-auth-header.ht i2p-0.9.50/apps/i2ptunnel/resources/proxy/b32-auth-header.ht --- i2p-0.9.49/apps/i2ptunnel/resources/proxy/b32-auth-header.ht 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/i2ptunnel/resources/proxy/b32-auth-header.ht 2021-05-19 12:11:56.000000000 +0000 @@ -10,7 +10,7 @@ -_("Website Unreachable") +_("Warning: Authorization Required") diff -Nru i2p-0.9.49/apps/jetty/build.xml i2p-0.9.50/apps/jetty/build.xml --- i2p-0.9.49/apps/jetty/build.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/jetty/build.xml 2021-05-19 12:11:56.000000000 +0000 @@ -169,7 +169,14 @@ + + + + + + @@ -486,11 +493,25 @@ classpath="" > + + + + + + + + - - + + @@ -499,6 +520,7 @@ + @@ -545,7 +567,7 @@ - + @@ -609,7 +631,7 @@ - + @@ -626,7 +648,7 @@ - + diff -Nru i2p-0.9.49/apps/jetty/java/src/net/i2p/jetty/JettyStart.java i2p-0.9.50/apps/jetty/java/src/net/i2p/jetty/JettyStart.java --- i2p-0.9.49/apps/jetty/java/src/net/i2p/jetty/JettyStart.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/jetty/java/src/net/i2p/jetty/JettyStart.java 2021-05-19 12:11:56.000000000 +0000 @@ -38,6 +38,7 @@ import org.eclipse.jetty.server.AbstractNetworkConnector; import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.xml.XmlConfiguration; @@ -196,8 +197,16 @@ host = "127.0.0.1"; else if (host.equals("::")) host = "::1"; - // see ConnectionFactory javadoc, but from testing, it ends with /1.1 - boolean isSSL = nconn.getConnectionFactory("SSL-http/1.1") != null; + // at some point this changed from "SSL-http/1.1" to "SSL" and "HTTP/1.1" ? + boolean isSSL = false; + //System.out.println("Found connector: " + nconn); + for (ConnectionFactory fact : nconn.getConnectionFactories()) { + //System.out.println(" Factory: " + fact + " protocol: " + fact.getProtocol()); + if (fact.getProtocol().startsWith("SSL")) { + isSSL = true; + break; + } + } String svc; if (isSSL) { _sslPort = port; @@ -206,8 +215,7 @@ _port = port; svc = PortMapper.SVC_EEPSITE; } - if (pm.getPort(svc) <= 0) - pm.register(svc, host, port); + pm.register(svc, host, port); } } } @@ -253,13 +261,13 @@ } if (_context != null) { PortMapper pm = _context.portMapper(); - if (_port > 0 && pm.getPort(PortMapper.SVC_EEPSITE) == _port) { + if (_port > 0) { + pm.unregister(PortMapper.SVC_EEPSITE, _port); _port = 0; - pm.unregister(PortMapper.SVC_EEPSITE); } - if (_sslPort > 0 && pm.getPort(PortMapper.SVC_HTTPS_EEPSITE) == _sslPort) { + if (_sslPort > 0) { + pm.unregister(PortMapper.SVC_HTTPS_EEPSITE, _sslPort); _sslPort = 0; - pm.unregister(PortMapper.SVC_HTTPS_EEPSITE); } } changeState(STOPPED); diff -Nru i2p-0.9.49/apps/jetty/java/src/net/i2p/servlet/ErrorServlet.java i2p-0.9.50/apps/jetty/java/src/net/i2p/servlet/ErrorServlet.java --- i2p-0.9.49/apps/jetty/java/src/net/i2p/servlet/ErrorServlet.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/jetty/java/src/net/i2p/servlet/ErrorServlet.java 2021-05-19 12:11:56.000000000 +0000 @@ -180,8 +180,8 @@ out.println("


"); out.println("

"); out.println(_t("Please report bugs on {0} or {1}.", - "trac.i2p2.i2p", - "trac.i2p2.de")); + "git.idk.i2p", + "i2pgit.org")); out.println("

"); out.println(_t("Please include this information in bug reports") + ':'); out.print("

"); diff -Nru i2p-0.9.49/apps/jetty/java/src/net/i2p/servlet/util/JspC.java i2p-0.9.50/apps/jetty/java/src/net/i2p/servlet/util/JspC.java --- i2p-0.9.49/apps/jetty/java/src/net/i2p/servlet/util/JspC.java 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/jetty/java/src/net/i2p/servlet/util/JspC.java 2021-05-19 12:11:56.000000000 +0000 @@ -42,10 +42,10 @@ private static final String THREADS_VERSION_8 = "8.5.33"; private static final String THREADS_VERSION_9 = "9.0.11"; // if true, try to make web.xml reproducible - private static final boolean REPRODUCIBLE = Boolean.valueOf(System.getProperty("build.reproducible")); + private static final boolean REPRODUCIBLE = Boolean.parseBoolean(System.getProperty("build.reproducible")); // if true, we must get the Tomcat version out of the jasper jar's manifest - private static final boolean SYSTEM_TOMCAT = Boolean.valueOf(System.getProperty("with-libtomcat8-java")) || - Boolean.valueOf(System.getProperty("with-libtomcat9-java")); + private static final boolean SYSTEM_TOMCAT = Boolean.parseBoolean(System.getProperty("with-libtomcat8-java")) || + Boolean.parseBoolean(System.getProperty("with-libtomcat9-java")); // path to the jasper jar private static final String JASPER_JAR = System.getProperty("jasper.jar"); diff -Nru i2p-0.9.49/apps/jetty/patches/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java i2p-0.9.50/apps/jetty/patches/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java --- i2p-0.9.49/apps/jetty/patches/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/apps/jetty/patches/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java 2021-05-19 12:11:56.000000000 +0000 @@ -0,0 +1,1336 @@ +// +// ======================================================================== +// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.io.ssl; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.function.ToIntFunction; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLEngineResult; +import javax.net.ssl.SSLEngineResult.HandshakeStatus; +import javax.net.ssl.SSLEngineResult.Status; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLHandshakeException; +import javax.net.ssl.SSLSession; + +import org.eclipse.jetty.io.AbstractConnection; +import org.eclipse.jetty.io.AbstractEndPoint; +import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.io.Connection; +import org.eclipse.jetty.io.EndPoint; +import org.eclipse.jetty.io.EofException; +import org.eclipse.jetty.io.RuntimeIOException; +import org.eclipse.jetty.io.SelectChannelEndPoint; +import org.eclipse.jetty.io.WriteFlusher; +import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; + +/** + * A Connection that acts as an interceptor between an EndPoint providing SSL encrypted data + * and another consumer of an EndPoint (typically an {@link Connection} like HttpConnection) that + * wants unencrypted data. + *

+ * The connector uses an {@link EndPoint} (typically {@link SelectChannelEndPoint}) as + * it's source/sink of encrypted data. It then provides an endpoint via {@link #getDecryptedEndPoint()} to + * expose a source/sink of unencrypted data to another connection (eg HttpConnection). + *

+ * The design of this class is based on a clear separation between the passive methods, which do not block nor schedule any + * asynchronous callbacks, and active methods that do schedule asynchronous callbacks. + *

+ * The passive methods are {@link DecryptedEndPoint#fill(ByteBuffer)} and {@link DecryptedEndPoint#flush(ByteBuffer...)}. They make best + * effort attempts to progress the connection using only calls to the encrypted {@link EndPoint#fill(ByteBuffer)} and {@link EndPoint#flush(ByteBuffer...)} + * methods. They will never block nor schedule any readInterest or write callbacks. If a fill/flush cannot progress either because + * of network congestion or waiting for an SSL handshake message, then the fill/flush will simply return with zero bytes filled/flushed. + * Specifically, if a flush cannot proceed because it needs to receive a handshake message, then the flush will attempt to fill bytes from the + * encrypted endpoint, but if insufficient bytes are read it will NOT call {@link EndPoint#fillInterested(Callback)}. + *

+ * It is only the active methods : {@link DecryptedEndPoint#fillInterested(Callback)} and + * {@link DecryptedEndPoint#write(Callback, ByteBuffer...)} that may schedule callbacks by calling the encrypted + * {@link EndPoint#fillInterested(Callback)} and {@link EndPoint#write(Callback, ByteBuffer...)} + * methods. For normal data handling, the decrypted fillInterest method will result in an encrypted fillInterest and a decrypted + * write will result in an encrypted write. However, due to SSL handshaking requirements, it is also possible for a decrypted fill + * to call the encrypted write and for the decrypted flush to call the encrypted fillInterested methods. + *

+ * MOST IMPORTANTLY, the encrypted callbacks from the active methods (#onFillable() and WriteFlusher#completeWrite()) do no filling or flushing + * themselves. Instead they simple make the callbacks to the decrypted callbacks, so that the passive encrypted fill/flush will + * be called again and make another best effort attempt to progress the connection. + * + */ +public class SslConnection extends AbstractConnection +{ + private static final Logger LOG = Log.getLogger(SslConnection.class); + + private final List handshakeListeners = new ArrayList<>(); + private final ByteBufferPool _bufferPool; + private final SSLEngine _sslEngine; + private final DecryptedEndPoint _decryptedEndPoint; + private ByteBuffer _decryptedInput; + private ByteBuffer _encryptedInput; + private ByteBuffer _encryptedOutput; + private final boolean _encryptedDirectBuffers; + private final boolean _decryptedDirectBuffers; + private boolean _renegotiationAllowed; + private int _renegotiationLimit = -1; + private boolean _closedOutbound; + private boolean _allowMissingCloseMessage = true; + private final Runnable _runCompletWrite = new Runnable() + { + @Override + public void run() + { + _decryptedEndPoint.getWriteFlusher().completeWrite(); + } + }; + private final Runnable _runFillable = new Runnable() + { + @Override + public void run() + { + _decryptedEndPoint.getFillInterest().fillable(); + } + }; + private final Callback _nonBlockingReadCallback = new Callback.NonBlocking() + { + @Override + public void succeeded() + { + onFillable(); + } + + @Override + public void failed(final Throwable x) + { + onFillInterestedFailed(x); + } + + @Override + public String toString() + { + return String.format("SSLC.NBReadCB@%x{%s}", SslConnection.this.hashCode(),SslConnection.this); + } + }; + + public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine) + { + this(byteBufferPool, executor, endPoint, sslEngine, false, false); + } + + public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine, + boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption) + { + // This connection does not execute calls to onFillable(), so they will be called by the selector thread. + // onFillable() does not block and will only wakeup another thread to do the actual reading and handling. + super(endPoint, executor); + this._bufferPool = byteBufferPool; + this._sslEngine = sslEngine; + this._decryptedEndPoint = newDecryptedEndPoint(); + this._encryptedDirectBuffers = useDirectBuffersForEncryption; + this._decryptedDirectBuffers = useDirectBuffersForDecryption; + } + + public void addHandshakeListener(SslHandshakeListener listener) + { + handshakeListeners.add(listener); + } + + public boolean removeHandshakeListener(SslHandshakeListener listener) + { + return handshakeListeners.remove(listener); + } + + protected DecryptedEndPoint newDecryptedEndPoint() + { + return new DecryptedEndPoint(); + } + + public SSLEngine getSSLEngine() + { + return _sslEngine; + } + + public DecryptedEndPoint getDecryptedEndPoint() + { + return _decryptedEndPoint; + } + + public boolean isRenegotiationAllowed() + { + return _renegotiationAllowed; + } + + public void setRenegotiationAllowed(boolean renegotiationAllowed) + { + _renegotiationAllowed = renegotiationAllowed; + } + + /** + * @return The number of renegotions allowed for this connection. When the limit + * is 0 renegotiation will be denied. If the limit is less than 0 then no limit is applied. + */ + public int getRenegotiationLimit() + { + return _renegotiationLimit; + } + + /** + * @param renegotiationLimit The number of renegotions allowed for this connection. + * When the limit is 0 renegotiation will be denied. If the limit is less than 0 then no limit is applied. + * Default -1. + */ + public void setRenegotiationLimit(int renegotiationLimit) + { + _renegotiationLimit = renegotiationLimit; + } + + public boolean isAllowMissingCloseMessage() + { + return _allowMissingCloseMessage; + } + + public void setAllowMissingCloseMessage(boolean allowMissingCloseMessage) + { + this._allowMissingCloseMessage = allowMissingCloseMessage; + } + + private int getApplicationBufferSize() + { + return getBufferSize(SSLSession::getApplicationBufferSize); + } + + private int getPacketBufferSize() + { + return getBufferSize(SSLSession::getPacketBufferSize); + } + + private int getBufferSize(ToIntFunction bufferSizeFn) + { + SSLSession hsSession = _sslEngine.getHandshakeSession(); + SSLSession session = _sslEngine.getSession(); + int size = bufferSizeFn.applyAsInt(session); + if (hsSession == null || hsSession == session) + return size; + int hsSize = bufferSizeFn.applyAsInt(hsSession); + return Math.max(hsSize, size); + } + + private void acquireEncryptedInput() + { + if (_encryptedInput == null) + _encryptedInput = _bufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers); + } + + private void acquireEncryptedOutput() + { + if (_encryptedOutput == null) + _encryptedOutput = _bufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers); + } + + private void releaseEncryptedInputBuffer() + { + if (_encryptedInput != null && !_encryptedInput.hasRemaining()) + { + _bufferPool.release(_encryptedInput); + _encryptedInput = null; + } + } + + protected void releaseDecryptedInputBuffer() + { + if (_decryptedInput != null && !_decryptedInput.hasRemaining()) + { + _bufferPool.release(_decryptedInput); + _decryptedInput = null; + } + } + + @Override + public void onOpen() + { + super.onOpen(); + getDecryptedEndPoint().getConnection().onOpen(); + } + + @Override + public void onClose() + { + _decryptedEndPoint.getConnection().onClose(); + super.onClose(); + } + + @Override + public void close() + { + getDecryptedEndPoint().getConnection().close(); + } + + @Override + public boolean onIdleExpired() + { + return getDecryptedEndPoint().getConnection().onIdleExpired(); + } + + @Override + public void onFillable() + { + // onFillable means that there are encrypted bytes ready to be filled. + // however we do not fill them here on this callback, but instead wakeup + // the decrypted readInterest and/or writeFlusher so that they will attempt + // to do the fill and/or flush again and these calls will do the actually + // filling. + + if (LOG.isDebugEnabled()) + LOG.debug("onFillable enter {}", _decryptedEndPoint); + + // We have received a close handshake, close the end point to send FIN. + if (_decryptedEndPoint.isInputShutdown()) + _decryptedEndPoint.close(); + + // wake up whoever is doing the fill or the flush so they can + // do all the filling, unwrapping, wrapping and flushing + _decryptedEndPoint.getFillInterest().fillable(); + + // If we are handshaking, then wake up any waiting write as well as it may have been blocked on the read + boolean runComplete = false; + synchronized(_decryptedEndPoint) + { + if (_decryptedEndPoint._flushRequiresFillToProgress) + { + _decryptedEndPoint._flushRequiresFillToProgress = false; + runComplete = true; + } + } + if (runComplete) + _runCompletWrite.run(); + + if (LOG.isDebugEnabled()) + LOG.debug("onFillable exit {}", _decryptedEndPoint); + } + + @Override + public void onFillInterestedFailed(Throwable cause) + { + // this means that the fill interest in encrypted bytes has failed. + // However we do not handle that here on this callback, but instead wakeup + // the decrypted readInterest and/or writeFlusher so that they will attempt + // to do the fill and/or flush again and these calls will do the actually + // handle the cause. + _decryptedEndPoint.getFillInterest().onFail(cause); + + boolean failFlusher = false; + synchronized(_decryptedEndPoint) + { + if (_decryptedEndPoint._flushRequiresFillToProgress) + { + _decryptedEndPoint._flushRequiresFillToProgress = false; + failFlusher = true; + } + } + if (failFlusher) + _decryptedEndPoint.getWriteFlusher().onFail(cause); + } + + protected SSLEngineResult wrap(SSLEngine sslEngine, ByteBuffer[] input, ByteBuffer output) throws SSLException + { + return sslEngine.wrap(input, output); + } + + protected SSLEngineResult unwrap(SSLEngine sslEngine, ByteBuffer input, ByteBuffer output) throws SSLException + { + // CVE-2021-28165 - Jetty #6072 + // https://github.com/eclipse/jetty.project/security/advisories/GHSA-26vr-8j45-3r4w + SSLEngineResult results = sslEngine.unwrap(input, output); + if ((results.getStatus() == SSLEngineResult.Status.BUFFER_UNDERFLOW || + results.getStatus() == SSLEngineResult.Status.OK && results.bytesConsumed() == 0 && results.bytesProduced() == 0) && + BufferUtil.space(input) == 0) + { + BufferUtil.clear(input); + throw new SSLHandshakeException("Encrypted buffer max length exceeded"); + } + return results; + } + + @Override + public String toString() + { + ByteBuffer b = _encryptedInput; + int ei=b==null?-1:b.remaining(); + b = _encryptedOutput; + int eo=b==null?-1:b.remaining(); + b = _decryptedInput; + int di=b==null?-1:b.remaining(); + + return String.format("SslConnection@%x{%s,eio=%d/%d,di=%d} -> %s", + hashCode(), + _sslEngine.getHandshakeStatus(), + ei,eo,di, + _decryptedEndPoint.getConnection()); + } + + public class DecryptedEndPoint extends AbstractEndPoint + { + private boolean _fillRequiresFlushToProgress; + private boolean _flushRequiresFillToProgress; + private boolean _cannotAcceptMoreAppDataToFlush; + private boolean _handshaken; + private boolean _underFlown; + + private final Callback _writeCallback = new Callback() + { + @Override + public void succeeded() + { + // This means that a write of encrypted data has completed. Writes are done + // only if there is a pending writeflusher or a read needed to write + // data. In either case the appropriate callback is passed on. + boolean fillable = false; + synchronized (DecryptedEndPoint.this) + { + if (LOG.isDebugEnabled()) + LOG.debug("write.complete {}", SslConnection.this.getEndPoint()); + + releaseEncryptedOutputBuffer(); + + _cannotAcceptMoreAppDataToFlush = false; + + if (_fillRequiresFlushToProgress) + { + _fillRequiresFlushToProgress = false; + fillable = true; + } + } + if (fillable) + getFillInterest().fillable(); + _runCompletWrite.run(); + } + + @Override + public void failed(final Throwable x) + { + // This means that a write of data has failed. Writes are done + // only if there is an active writeflusher or a read needed to write + // data. In either case the appropriate callback is passed on. + boolean fail_filler; + synchronized (DecryptedEndPoint.this) + { + if (LOG.isDebugEnabled()) + LOG.debug("write failed {}", SslConnection.this, x); + + BufferUtil.clear(_encryptedOutput); + releaseEncryptedOutputBuffer(); + + _cannotAcceptMoreAppDataToFlush = false; + fail_filler = _fillRequiresFlushToProgress; + if (_fillRequiresFlushToProgress) + _fillRequiresFlushToProgress = false; + } + + failedCallback(new Callback() + { + @Override + public void failed(Throwable x) + { + if (fail_filler) + getFillInterest().onFail(x); + getWriteFlusher().onFail(x); + } + }, x); + } + + @Override + public boolean isNonBlocking() + { + return getWriteFlusher().isCallbackNonBlocking(); + } + }; + + public DecryptedEndPoint() + { + // Disable idle timeout checking: no scheduler and -1 timeout for this instance. + super(null, getEndPoint().getLocalAddress(), getEndPoint().getRemoteAddress()); + super.setIdleTimeout(-1); + } + + @Override + public long getIdleTimeout() + { + return getEndPoint().getIdleTimeout(); + } + + @Override + public void setIdleTimeout(long idleTimeout) + { + getEndPoint().setIdleTimeout(idleTimeout); + } + + @Override + public boolean isOpen() + { + return getEndPoint().isOpen(); + } + + @Override + protected WriteFlusher getWriteFlusher() + { + return super.getWriteFlusher(); + } + + @Override + protected void onIncompleteFlush() + { + // This means that the decrypted endpoint write method was called and not + // all data could be wrapped. So either we need to write some encrypted data, + // OR if we are handshaking we need to read some encrypted data OR + // if neither then we should just try the flush again. + boolean try_again = false; + boolean write = false; + boolean need_fill_interest = false; + synchronized (DecryptedEndPoint.this) + { + if (LOG.isDebugEnabled()) + LOG.debug("onIncompleteFlush {}", SslConnection.this); + // If we have pending output data, + if (BufferUtil.hasContent(_encryptedOutput)) + { + // write it + _cannotAcceptMoreAppDataToFlush = true; + write = true; + } + // If we are handshaking and need to read, + else if (_sslEngine.getHandshakeStatus() == HandshakeStatus.NEED_UNWRAP) + { + // check if we are actually read blocked in order to write + _flushRequiresFillToProgress = true; + need_fill_interest = !SslConnection.this.isFillInterested(); + } + else + { + // We can get here because the WriteFlusher might not see progress + // when it has just flushed the encrypted data, but not consumed anymore + // of the application buffers. This is mostly avoided by another iteration + // within DecryptedEndPoint flush(), but I cannot convince myself that + // this is never ever the case. + try_again = true; + } + } + + if (write) + getEndPoint().write(_writeCallback, _encryptedOutput); + else if (need_fill_interest) + ensureFillInterested(); + else if (try_again) + { + // If the output is closed, + if (isOutputShutdown()) + { + // don't bother writing, just notify of close + getWriteFlusher().onClose(); + } + // Else, + else + { + // try to flush what is pending + // execute to avoid recursion + getExecutor().execute(_runCompletWrite); + } + } + } + + @Override + protected void needsFillInterest() throws IOException + { + // This means that the decrypted data consumer has called the fillInterested + // method on the DecryptedEndPoint, so we have to work out if there is + // decrypted data to be filled or what callbacks to setup to be told when there + // might be more encrypted data available to attempt another call to fill + boolean fillable; + boolean write = false; + synchronized (DecryptedEndPoint.this) + { + // Do we already have some app data, then app can fill now so return true + fillable = (BufferUtil.hasContent(_decryptedInput)) + // or if we have encryptedInput and have not underflowed yet, the it is worth trying a fill + || BufferUtil.hasContent(_encryptedInput) && !_underFlown; + + // If we have no encrypted data to decrypt OR we have some, but it is not enough + if (!fillable) + { + // We are not ready to read data + + // Are we actually write blocked? + if (_fillRequiresFlushToProgress) + { + // we must be blocked trying to write before we can read + + // Do we have data to write + if (BufferUtil.hasContent(_encryptedOutput)) + { + // write it + _cannotAcceptMoreAppDataToFlush = true; + write = true; + } + else + { + // we have already written the net data + // pretend we are readable so the wrap is done by next readable callback + _fillRequiresFlushToProgress = false; + fillable=true; + } + } + } + } + if (write) + getEndPoint().write(_writeCallback, _encryptedOutput); + else if (fillable) + getExecutor().execute(_runFillable); + else + ensureFillInterested(); + } + + @Override + public void setConnection(Connection connection) + { + if (connection instanceof AbstractConnection) + { + // This is an optimization to avoid that upper layer connections use small + // buffers and we need to copy decrypted data rather than decrypting in place. + AbstractConnection c = (AbstractConnection)connection; + int appBufferSize = getApplicationBufferSize(); + if (c.getInputBufferSize() < appBufferSize) + c.setInputBufferSize(appBufferSize); + } + super.setConnection(connection); + } + + public SslConnection getSslConnection() + { + return SslConnection.this; + } + + @Override + public int fill(ByteBuffer buffer) throws IOException + { + try + { + synchronized (this) + { + Throwable failure = null; + try + { + // Do we already have some decrypted data? + if (BufferUtil.hasContent(_decryptedInput)) + return BufferUtil.append(buffer,_decryptedInput); + + // We will need a network buffer + if (_encryptedInput == null) + _encryptedInput = _bufferPool.acquire(_sslEngine.getSession().getPacketBufferSize(), _encryptedDirectBuffers); + else + BufferUtil.compact(_encryptedInput); + + + // loop filling and unwrapping until we have something + while (true) + { + // We also need an app buffer, but can use the passed buffer if it is big enough + ByteBuffer app_in; + int appBufferSize = getApplicationBufferSize(); + + if (BufferUtil.space(buffer) > appBufferSize) + app_in = buffer; + else if (_decryptedInput == null) + app_in = _decryptedInput = _bufferPool.acquire(appBufferSize, _decryptedDirectBuffers); + else + app_in = _decryptedInput; + + acquireEncryptedInput(); + + // Let's try reading some encrypted data... even if we have some already. + int net_filled = getEndPoint().fill(_encryptedInput); + + if (net_filled > 0 && !_handshaken && isOutboundDone()) + throw new SSLHandshakeException("Closed during handshake"); + + decryption: while (true) + { + // Let's unwrap even if we have no net data because in that + // case we want to fall through to the handshake handling + int pos = BufferUtil.flipToFill(app_in); + SSLEngineResult unwrapResult; + try + { + unwrapResult = unwrap(_sslEngine, _encryptedInput, app_in); + } + finally + { + BufferUtil.flipToFlush(app_in, pos); + } + + if (LOG.isDebugEnabled()) + LOG.debug("unwrap net_filled={} {} encryptedBuffer={} unwrapBuffer={} appBuffer={}", + net_filled, + unwrapResult.toString().replace('\n',' '), + BufferUtil.toSummaryString(_encryptedInput), + BufferUtil.toDetailString(app_in), + BufferUtil.toDetailString(buffer)); + + HandshakeStatus handshakeStatus = _sslEngine.getHandshakeStatus(); + HandshakeStatus unwrapHandshakeStatus = unwrapResult.getHandshakeStatus(); + Status unwrapResultStatus = unwrapResult.getStatus(); + + // Extra check on unwrapResultStatus == OK with zero bytes consumed + // or produced is due to an SSL client on Android (see bug #454773). + _underFlown = unwrapResultStatus == Status.BUFFER_UNDERFLOW || + unwrapResultStatus == Status.OK && unwrapResult.bytesConsumed() == 0 && unwrapResult.bytesProduced() == 0; + + if (_underFlown) + { + if (net_filled < 0 && _sslEngine.getUseClientMode()) + closeInbound(); + if (net_filled <= 0) + return net_filled; + } + + switch (unwrapResultStatus) + { + case CLOSED: + { + switch (handshakeStatus) + { + case NOT_HANDSHAKING: + // We were not handshaking, so just tell the app we are closed + return -1; + case NEED_TASK: + _sslEngine.getDelegatedTask().run(); + continue; + case NEED_WRAP: + // We need to send some handshake data (probably the close handshake). + // We return -1 so that the application can drive the close by flushing + // or shutting down the output. + return -1; + case NEED_UNWRAP: + // We expected to read more, but we got closed. + // Return -1 to indicate to the application to drive the close. + return -1; + default: + throw new IllegalStateException(); + } + } + case BUFFER_OVERFLOW: + // It's possible that SSLSession.applicationBufferSize has been expanded + // by the SSLEngine implementation. Unwrapping a large encrypted buffer + // causes BUFFER_OVERFLOW because the (old) applicationBufferSize is + // too small. Release the decrypted input buffer so it will be re-acquired + // with the larger capacity. + // See also system property "jsse.SSLEngine.acceptLargeFragments". + if (BufferUtil.isEmpty(_decryptedInput) && appBufferSize < getApplicationBufferSize()) + { + releaseDecryptedInputBuffer(); + break decryption; + } + throw new IllegalStateException("Unexpected unwrap result " + unwrapResultStatus); + + case BUFFER_UNDERFLOW: + case OK: + { + if (unwrapHandshakeStatus == HandshakeStatus.FINISHED) + handshakeFinished(); + + // Check whether re-negotiation is allowed + if (!allowRenegotiate(handshakeStatus)) + return -1; + + // If bytes were produced, don't bother with the handshake status; + // pass the decrypted data to the application, which will perform + // another call to fill() or flush(). + if (unwrapResult.bytesProduced() > 0) + { + if (app_in == buffer) + return unwrapResult.bytesProduced(); + return BufferUtil.append(buffer,_decryptedInput); + } + + switch (handshakeStatus) + { + case NOT_HANDSHAKING: + { + if (_underFlown) + break decryption; + continue; + } + case NEED_TASK: + { + _sslEngine.getDelegatedTask().run(); + continue; + } + case NEED_WRAP: + { + // If we are called from flush() + // return to let it do the wrapping. + if (_flushRequiresFillToProgress) + return 0; + + _fillRequiresFlushToProgress = true; + flush(BufferUtil.EMPTY_BUFFER); + if (BufferUtil.isEmpty(_encryptedOutput)) + { + // The flush wrote all the encrypted bytes so continue to fill. + _fillRequiresFlushToProgress = false; + if (_underFlown) + break decryption; + continue; + } + else + { + // The flush did not complete, return from fill() + // and let the write completion mechanism to kick in. + return 0; + } + } + case NEED_UNWRAP: + { + if (_underFlown) + break decryption; + continue; + } + default: + { + throw new IllegalStateException(); + } + } + } + default: + { + throw new IllegalStateException(); + } + } + } + } + } + catch (SSLHandshakeException x) + { + notifyHandshakeFailed(_sslEngine, x); + failure = x; + throw x; + } + catch (SSLException x) + { + if (!_handshaken) + { + x = (SSLException)new SSLHandshakeException(x.getMessage()).initCause(x); + notifyHandshakeFailed(_sslEngine, x); + } + failure = x; + throw x; + } + catch (Throwable x) + { + failure = x; + throw x; + } + finally + { + // If we are handshaking, then wake up any waiting write as well as it may have been blocked on the read + if (_flushRequiresFillToProgress) + { + _flushRequiresFillToProgress = false; + getExecutor().execute(failure == null ? _runCompletWrite : new FailWrite(failure)); + } + + releaseEncryptedInputBuffer(); + releaseDecryptedInputBuffer(); + } + } + } + catch (Throwable x) + { + close(x); + if(x instanceof IOException) + throw (IOException) x; + throw new RuntimeIOException(x); + } + } + + private void handshakeFinished() + { + if (_handshaken) + { + if (LOG.isDebugEnabled()) + LOG.debug("Renegotiated {}", SslConnection.this); + if (_renegotiationLimit>0) + _renegotiationLimit--; + } + else + { + _handshaken = true; + if (LOG.isDebugEnabled()) + LOG.debug("{} handshake succeeded {}/{} {}", + _sslEngine.getUseClientMode() ? "client" : "resumed server", + _sslEngine.getSession().getProtocol(),_sslEngine.getSession().getCipherSuite(), + SslConnection.this); + notifyHandshakeSucceeded(_sslEngine); + } + } + + private boolean allowRenegotiate(HandshakeStatus handshakeStatus) + { + if (!_handshaken || handshakeStatus == HandshakeStatus.NOT_HANDSHAKING) + return true; + + if (!isRenegotiationAllowed()) + { + if (LOG.isDebugEnabled()) + LOG.debug("Renegotiation denied {}", SslConnection.this); + shutdownInput(); + return false; + } + + if (getRenegotiationLimit()==0) + { + if (LOG.isDebugEnabled()) + LOG.debug("Renegotiation limit exceeded {}", SslConnection.this); + shutdownInput(); + return false; + } + + return true; + } + + private void shutdownInput() + { + try + { + _sslEngine.closeInbound(); + } + catch (Throwable x) + { + LOG.ignore(x); + } + } + + private void closeInbound() throws SSLException + { + HandshakeStatus handshakeStatus = _sslEngine.getHandshakeStatus(); + try + { + _sslEngine.closeInbound(); + } + catch (SSLException x) + { + if (handshakeStatus == HandshakeStatus.NOT_HANDSHAKING && !isAllowMissingCloseMessage()) + throw x; + else + LOG.ignore(x); + } + catch (Throwable x) + { + LOG.ignore(x); + } + } + + @Override + public boolean flush(ByteBuffer... appOuts) throws IOException + { + // The contract for flush does not require that all appOuts bytes are written + // or even that any appOut bytes are written! If the connection is write block + // or busy handshaking, then zero bytes may be taken from appOuts and this method + // will return 0 (even if some handshake bytes were flushed and filled). + // it is the applications responsibility to call flush again - either in a busy loop + // or better yet by using EndPoint#write to do the flushing. + + if (LOG.isDebugEnabled()) + { + for (ByteBuffer b : appOuts) + LOG.debug("flush {} {}", BufferUtil.toHexSummary(b), SslConnection.this); + } + + try + { + synchronized (this) + { + try + { + if (_cannotAcceptMoreAppDataToFlush) + { + if (isOutboundDone()) + throw new EofException(new ClosedChannelException()); + return false; + } + + while (true) + { + int packetBufferSize = getPacketBufferSize(); + acquireEncryptedOutput(); + + // We call sslEngine.wrap to try to take bytes from appOuts + // buffers and encrypt them into the _encryptedOutput buffer. + BufferUtil.compact(_encryptedOutput); + int pos = BufferUtil.flipToFill(_encryptedOutput); + SSLEngineResult wrapResult; + try + { + wrapResult = wrap(_sslEngine, appOuts,_encryptedOutput); + } + finally + { + BufferUtil.flipToFlush(_encryptedOutput, pos); + } + if (LOG.isDebugEnabled()) + LOG.debug("wrap {} {}", wrapResult.toString().replace('\n',' '), SslConnection.this); + + Status wrapResultStatus = wrapResult.getStatus(); + + boolean allConsumed=true; + for (ByteBuffer b : appOuts) + if (BufferUtil.hasContent(b)) + allConsumed=false; + + // and deal with the results returned from the sslEngineWrap + switch (wrapResultStatus) + { + case CLOSED: + { + // The SSL engine has close, but there may be close handshake that needs to be written + if (BufferUtil.hasContent(_encryptedOutput)) + { + _cannotAcceptMoreAppDataToFlush = true; + getEndPoint().flush(_encryptedOutput); + getEndPoint().shutdownOutput(); + // If we failed to flush the close handshake then we will just pretend that + // the write has progressed normally and let a subsequent call to flush + // (or WriteFlusher#onIncompleteFlushed) to finish writing the close handshake. + // The caller will find out about the close on a subsequent flush or fill. + if (BufferUtil.hasContent(_encryptedOutput)) + return false; + } + // otherwise we have written, and the caller will close the underlying connection + else + { + getEndPoint().shutdownOutput(); + } + return allConsumed; + } + case BUFFER_UNDERFLOW: + { + throw new IllegalStateException(); + } + case BUFFER_OVERFLOW: + { + // It's possible that SSLSession.packetBufferSize has been expanded + // by the SSLEngine implementation. Wrapping a large application buffer + // causes BUFFER_OVERFLOW because the (old) packetBufferSize is + // too small. Release the encrypted output buffer so that it will + // be re-acquired with the larger capacity. + // See also system property "jsse.SSLEngine.acceptLargeFragments". + if (packetBufferSize < getPacketBufferSize()) + { + releaseEncryptedOutputBuffer(); + continue; + } + if (BufferUtil.isEmpty(_encryptedOutput)) + { + throw new IllegalStateException("Unexpected wrap result " + wrapResultStatus); + } + // fall-through default case to flush() + } + default: + { + if (LOG.isDebugEnabled()) + LOG.debug("wrap {} {} {}", wrapResultStatus, BufferUtil.toHexSummary(_encryptedOutput), SslConnection.this); + + if (wrapResult.getHandshakeStatus() == HandshakeStatus.FINISHED) + handshakeFinished(); + + HandshakeStatus handshakeStatus = _sslEngine.getHandshakeStatus(); + + // Check whether re-negotiation is allowed + if (!allowRenegotiate(handshakeStatus)) + { + getEndPoint().shutdownOutput(); + return allConsumed; + } + + // if we have net bytes, let's try to flush them + if (BufferUtil.hasContent(_encryptedOutput)) + if (!getEndPoint().flush(_encryptedOutput)) + getEndPoint().flush(_encryptedOutput); // one retry + + // But we also might have more to do for the handshaking state. + switch (handshakeStatus) + { + case NOT_HANDSHAKING: + // If we have not consumed all and had just finished handshaking, then we may + // have just flushed the last handshake in the encrypted buffers, so we should + // try again. + if (!allConsumed && wrapResult.getHandshakeStatus()==HandshakeStatus.FINISHED && BufferUtil.isEmpty(_encryptedOutput)) + continue; + + // Return true if we consumed all the bytes and encrypted are all flushed + return allConsumed && BufferUtil.isEmpty(_encryptedOutput); + + case NEED_TASK: + // run the task and continue + _sslEngine.getDelegatedTask().run(); + continue; + + case NEED_WRAP: + // Hey we just wrapped! Oh well who knows what the sslEngine is thinking, so continue and we will wrap again + continue; + + case NEED_UNWRAP: + // Ah we need to fill some data so we can write. + // So if we were not called from fill and the app is not reading anyway + if (!_fillRequiresFlushToProgress && !getFillInterest().isInterested()) + { + // Tell the onFillable method that there might be a write to complete + _flushRequiresFillToProgress = true; + fill(BufferUtil.EMPTY_BUFFER); + // Check if after the fill() we need to wrap again + if (_sslEngine.getHandshakeStatus() == HandshakeStatus.NEED_WRAP) + continue; + } + return allConsumed && BufferUtil.isEmpty(_encryptedOutput); + + case FINISHED: + throw new IllegalStateException(); + } + } + } + } + } + catch (SSLHandshakeException x) + { + notifyHandshakeFailed(_sslEngine, x); + throw x; + } + finally + { + releaseEncryptedOutputBuffer(); + } + } + } + catch (Throwable x) + { + close(x); + throw x; + } + } + + private void releaseEncryptedOutputBuffer() + { + if (!Thread.holdsLock(DecryptedEndPoint.this)) + throw new IllegalStateException(); + if (_encryptedOutput != null && !_encryptedOutput.hasRemaining()) + { + _bufferPool.release(_encryptedOutput); + _encryptedOutput = null; + } + } + + @Override + public void shutdownOutput() + { + try + { + boolean flush = false; + boolean close = false; + synchronized (_decryptedEndPoint) + { + boolean ishut = isInputShutdown(); + boolean oshut = isOutputShutdown(); + if (LOG.isDebugEnabled()) + LOG.debug("shutdownOutput: oshut={}, ishut={} {}", oshut, ishut, SslConnection.this); + + if (oshut) + return; + + if (!_closedOutbound) + { + _closedOutbound=true; // Only attempt this once + closeOutbound(); + flush = true; + } + + // TODO review close logic here + if (ishut) + close = true; + } + + if (flush) + flush(BufferUtil.EMPTY_BUFFER); // Send the TLS close message. + if (close) + getEndPoint().close(); + else + ensureFillInterested(); + } + catch (Throwable x) + { + LOG.ignore(x); + getEndPoint().close(); + } + } + + private void closeOutbound() + { + try + { + _sslEngine.closeOutbound(); + } + catch (Throwable x) + { + LOG.ignore(x); + } + } + + private void ensureFillInterested() + { + if (getFillInterest().isCallbackNonBlocking()) + { + SslConnection.this.tryFillInterested(_nonBlockingReadCallback); + } + else + { + SslConnection.this.tryFillInterested(); + } + } + + @Override + public boolean isOutputShutdown() + { + return isOutboundDone() || getEndPoint().isOutputShutdown(); + } + + private boolean isOutboundDone() + { + try + { + return _sslEngine.isOutboundDone(); + } + catch (Throwable x) + { + LOG.ignore(x); + return true; + } + } + + @Override + public void close() + { + // First send the TLS Close Alert, then the FIN. + shutdownOutput(); + getEndPoint().close(); + super.close(); + } + + protected void close(Throwable failure) + { + // First send the TLS Close Alert, then the FIN. + shutdownOutput(); + getEndPoint().close(); + super.close(failure); + } + + @Override + public Object getTransport() + { + return getEndPoint(); + } + + @Override + public boolean isInputShutdown() + { + return getEndPoint().isInputShutdown() || isInboundDone(); + } + + private boolean isInboundDone() + { + try + { + return _sslEngine.isInboundDone(); + } + catch (Throwable x) + { + LOG.ignore(x); + return true; + } + } + + private void notifyHandshakeSucceeded(SSLEngine sslEngine) + { + SslHandshakeListener.Event event = null; + for (SslHandshakeListener listener : handshakeListeners) + { + if (event == null) + event = new SslHandshakeListener.Event(sslEngine); + try + { + listener.handshakeSucceeded(event); + } + catch (Throwable x) + { + LOG.info("Exception while notifying listener " + listener, x); + } + } + } + + private void notifyHandshakeFailed(SSLEngine sslEngine, Throwable failure) + { + SslHandshakeListener.Event event = null; + for (SslHandshakeListener listener : handshakeListeners) + { + if (event == null) + event = new SslHandshakeListener.Event(sslEngine); + try + { + listener.handshakeFailed(event, failure); + } + catch (Throwable x) + { + LOG.info("Exception while notifying listener " + listener, x); + } + } + } + + @Override + public String toString() + { + return super.toString()+"->"+getEndPoint().toString(); + } + + private class FailWrite implements Runnable + { + private final Throwable failure; + + private FailWrite(Throwable failure) + { + this.failure = failure; + } + + @Override + public void run() + { + getWriteFlusher().onFail(failure); + } + } + } +} diff -Nru i2p-0.9.49/apps/ministreaming/java/build.xml i2p-0.9.50/apps/ministreaming/java/build.xml --- i2p-0.9.49/apps/ministreaming/java/build.xml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/apps/ministreaming/java/build.xml 2021-05-19 12:11:56.000000000 +0000 @@ -84,7 +84,7 @@ - + @@ -193,7 +193,7 @@ - + @@ -209,7 +209,7 @@ - + diff -Nru i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java --- i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java 2021-05-19 12:11:56.000000000 +0000 @@ -20,6 +20,7 @@ import net.i2p.util.FileUtil; import net.i2p.util.Log; import net.i2p.util.SystemVersion; +import net.i2p.util.Translate; import net.i2p.util.TranslateReader; import org.cybergarage.xml.Node; @@ -48,6 +49,7 @@ public static final String APP_NAME = "news"; private static final String BUNDLE_NAME = "net.i2p.router.news.messages"; + private static final String WELCOME_AUTHOR = "I2P Development Team"; /** * @param args ignored @@ -209,6 +211,8 @@ if (!rv.isEmpty()) { //rv.get(0).updated = RFC3339Date.parse3339Date("2015-01-01"); rv.get(0).updated = _context.clock().now(); + // Tagged in initialNews.xml inside a comment + rv.get(0).authorName = Translate.getString(WELCOME_AUTHOR, _context, BUNDLE_NAME); } else { if (_log.shouldWarn()) _log.warn("failed to load initial news"); diff -Nru i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java --- i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java 2021-05-19 12:11:56.000000000 +0000 @@ -1678,6 +1678,11 @@ @Override public String toString() { + if (version.length() == 13) { + try { + return "Version " + version + " (" + DataHelper.formatTime(Long.parseLong(version)) + ')'; + } catch (NumberFormatException nfe) {} + } return "Version " + version; } } diff -Nru i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java --- i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java 2021-05-19 12:11:56.000000000 +0000 @@ -441,7 +441,7 @@ boolean wasRunning = false; File destDir = new SecureDirectory(appDir, appName); if (destDir.exists()) { - if (Boolean.valueOf(props.getProperty("install-only")).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty("install-only"))) { to.delete(); statusDone("" + _t("Downloaded plugin is for new installs only, but the plugin is already installed", url) + ""); return; @@ -517,7 +517,7 @@ return; } // do we defer extraction and installation? - if (Boolean.valueOf(props.getProperty("router-restart-required")).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty("router-restart-required"))) { // Yup! try { if(!FileUtil.copy(to, (new SecureFile( new SecureFile(appDir.getCanonicalPath() +"/" + appName +"/"+ ZIP).getCanonicalPath())) , true, true)) { @@ -548,7 +548,7 @@ } update = true; } else { - if (Boolean.valueOf(props.getProperty("update-only")).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty("update-only"))) { to.delete(); statusDone("" + _t("Plugin is for upgrades only, but the plugin is not installed") + ". " + appName + ' ' + version + ""); return; @@ -569,7 +569,7 @@ _updated = true; to.delete(); // install != update. Changing the user's settings like this is probabbly a bad idea. - if (Boolean.valueOf( props.getProperty("dont-start-at-install")).booleanValue()) { + if (Boolean.parseBoolean( props.getProperty("dont-start-at-install"))) { statusDone("" + _t("Plugin {0} installed", appName + ' ' + version) + ""); if(!update) { Properties pluginProps = PluginStarter.pluginProperties(); diff -Nru i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java --- i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java 2021-05-19 12:11:56.000000000 +0000 @@ -389,7 +389,7 @@ } } else if (enable) { // already set to true, GraphicsEnvironment initialized, can't change it now - if (Boolean.valueOf(System.getProperty("java.awt.headless"))) { + if (Boolean.parseBoolean(System.getProperty("java.awt.headless"))) { addFormError(_t("Restart required to take effect")); } else { dtg = new net.i2p.desktopgui.Main(_context, mgr, null); diff -Nru i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/web/helpers/BanlistRenderer.java i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/web/helpers/BanlistRenderer.java --- i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/web/helpers/BanlistRenderer.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/web/helpers/BanlistRenderer.java 2021-05-19 12:11:56.000000000 +0000 @@ -56,6 +56,7 @@ buf.append("

    "); + String unban = _t("unban now"); for (Map.Entry e : entries.entrySet()) { Hash key = e.getKey(); Banlist.Entry entry = e.getValue(); @@ -82,8 +83,9 @@ buf.append(_t(entry.cause)); } if (!key.equals(Hash.FAKE_HASH)) { + // note: CSS hides anchor text buf.append(" [").append(_t("unban now")).append("]"); + .append("#unsh\" title=\"").append(unban).append("\">[").append(unban).append("]"); } buf.append("\n"); } diff -Nru i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigNetHelper.java i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigNetHelper.java --- i2p-0.9.49/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigNetHelper.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigNetHelper.java 2021-05-19 12:11:56.000000000 +0000 @@ -41,9 +41,18 @@ /** @return host or "unknown" */ public String getUdpIP() { - String rv = _context.getProperty(UDPTransport.PROP_IP); - if (rv != null) - return rv; + String s = _context.getProperty(TransportUtil.SSU_IPV6_CONFIG); + String rv; + if (!"only".equals(s)) { + rv = _context.getProperty(UDPTransport.PROP_IP); + if (rv != null) + return rv; + } + if (!"false".equals(s)) { + rv = _context.getProperty(UDPTransport.PROP_IPV6); + if (rv != null) + return rv; + } RouterAddress addr = _context.router().getRouterInfo().getTargetAddress("SSU"); if (addr != null) { rv = addr.getHost(); @@ -349,7 +358,7 @@ StringBuilder buf = new StringBuilder(256); buf.append(" @@ -57,10 +58,13 @@ <% } else { // family is configured + family = net.i2p.data.DataHelper.escapeHTML(family); String keypw = familyHelper.getKeyPW(); if (keypw.length() > 0) { // family is active %> +<%=intl._t("The current router family is {0}.", '"' + family + '"')%>

    +
    diff -Nru i2p-0.9.49/apps/routerconsole/jsp/configpeer.jsp i2p-0.9.50/apps/routerconsole/jsp/configpeer.jsp --- i2p-0.9.49/apps/routerconsole/jsp/configpeer.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/configpeer.jsp 2021-05-19 12:11:56.000000000 +0000 @@ -15,8 +15,23 @@ <% String peer = ""; - if (request.getParameter("peer") != null) - peer = net.i2p.data.DataHelper.stripHTML(request.getParameter("peer")); // XSS + net.i2p.data.Hash peerHash = null; + boolean isBanned = false; + if (request.getParameter("peer") != null) { + // don't redisplay after POST, we don't do P-R-G + if (!"POST".equals(request.getMethod())) { + peer = net.i2p.data.DataHelper.stripHTML(request.getParameter("peer")); // XSS + if (peer.length() == 44) { + byte[] h = net.i2p.data.Base64.decode(peer); + if (h != null) { + try { + peerHash = net.i2p.data.Hash.create(h); + isBanned = peerhelper.isBanned(peerHash); + } catch (Exception e) {} + } + } + } + } %> @@ -25,16 +40,23 @@

    <%=intl._t("Manual Peer Controls")%>

    <%=intl._t("Export Family Key")%>
    - + diff -Nru i2p-0.9.49/apps/routerconsole/jsp/error500.jsp i2p-0.9.50/apps/routerconsole/jsp/error500.jsp --- i2p-0.9.49/apps/routerconsole/jsp/error500.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/error500.jsp 2021-05-19 12:11:56.000000000 +0000 @@ -39,8 +39,8 @@

    <% /* note to translators - both parameters are URLs */ %><%=intl._t("Please report bugs on {0} or {1}.", - "trac.i2p2.i2p", - "trac.i2p2.de")%> + "git.idk.i2p", + "i2pgit.org")%>

    <%=intl._t("Please include this information in bug reports")%>:

    <%=intl._t("Error Details")%>

    @@ -63,6 +63,7 @@

    <%=intl._t("I2P Version and Running Environment")%>

    I2P version: <%=net.i2p.router.RouterVersion.FULL_VERSION%>
    +API version: <%=net.i2p.CoreVersion.PUBLISHED_VERSION%>
    Java version: <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)
    diff -Nru i2p-0.9.49/apps/routerconsole/jsp/help-faq.jsi i2p-0.9.50/apps/routerconsole/jsp/help-faq.jsi --- i2p-0.9.49/apps/routerconsole/jsp/help-faq.jsi 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/help-faq.jsi 2021-05-19 12:11:56.000000000 +0000 @@ -23,8 +23,7 @@ <%=intl._t("You may wish to add one or two to your subscription list.")%>

    • http://stats.i2p/cgi-bin/newhosts.txt
    • -
    • http://no.i2p/export/alive-hosts.txt
    • -
    • http://identiguy.i2p/hosts.txt
    • +
    • http://notbob.i2p/hosts.txt

    <%=intl._t("Note that subscribing to a hosts.txt service is an act of trust, as a malicious subscription could give you incorrect addresses, so be careful subscribing to lists from unknown sources.")%> diff -Nru i2p-0.9.49/apps/routerconsole/jsp/help.jsp i2p-0.9.50/apps/routerconsole/jsp/help.jsp --- i2p-0.9.49/apps/routerconsole/jsp/help.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/help.jsp 2021-05-19 12:11:56.000000000 +0000 @@ -1,5 +1,4 @@ <%@page contentType="text/html"%> -<%@page trimDirectiveWhitespaces="true"%> <%@page pageEncoding="UTF-8"%> @@ -12,9 +11,9 @@

    <%@include file="help.jsi" %>
    diff -Nru i2p-0.9.49/apps/routerconsole/jsp/help-reachability.jsi i2p-0.9.50/apps/routerconsole/jsp/help-reachability.jsi --- i2p-0.9.49/apps/routerconsole/jsp/help-reachability.jsi 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/help-reachability.jsi 2021-05-19 12:11:56.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%=intl._t("Reachability Help")%>

    +

    <%=intl._t("Network Help")%>

    <%=intl._t("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%>  <%=intl._t("If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers.")%>  diff -Nru i2p-0.9.49/apps/routerconsole/jsp/logs.jsp i2p-0.9.50/apps/routerconsole/jsp/logs.jsp --- i2p-0.9.49/apps/routerconsole/jsp/logs.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/logs.jsp 2021-05-19 12:11:56.000000000 +0000 @@ -16,8 +16,8 @@ <%=intl._t("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%> <% /* note to translators - both parameters are URLs */ %><%=intl._t("Please report bugs on {0} or {1}.", - "trac.i2p2.i2p", - "trac.i2p2.de")%> + "git.idk.i2p", + "i2pgit.org")%>

    <%=intl._t("Router Hash")%>:
    <%=intl._t("Router Hash")%>:
    <%=intl._t("Manually Ban / Unban a Peer")%>
    <%=intl._t("Banning will prevent the participation of this peer in tunnels you create.")%>
    +<% + if (peerHash == null || !isBanned) { + %> " /> +<% + } + if (peerHash == null || isBanned) { + %> " /> - <% if (! "".equals(peer)) { %> - - <% } %> +<% + } + %>
    <%=intl._t("Adjust Profile Bonuses")%>
    @@ -25,6 +25,7 @@ + diff -Nru i2p-0.9.49/apps/routerconsole/jsp/themes/console/dark/console.css i2p-0.9.50/apps/routerconsole/jsp/themes/console/dark/console.css --- i2p-0.9.49/apps/routerconsole/jsp/themes/console/dark/console.css 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/themes/console/dark/console.css 2021-05-19 12:11:56.000000000 +0000 @@ -263,6 +263,30 @@ padding: 0; } +.hostaddform { + display: inline-block; + width: 45%; + vertical-align: top; +} + +.hostadd { + min-height: 20%; + width: 100%; +} + +.unicodeicon { + font-size: 2rem; + vertical-align: middle; +} + +.hostaddaction { + background: transparent !important; + border: none !important; + padding-bottom: 15px !important; + padding-top: 0px !important; +} + + /* end proxy errors */ /* sidebar */ @@ -3131,6 +3155,7 @@ position: absolute; background: none !important; box-shadow: none !important; + line-height: normal; z-index: 999; } Binary files /tmp/tmpa2po8ksu/Y97QNf3n1h/i2p-0.9.49/apps/routerconsole/jsp/themes/console/dark/images/dropdown_active.png and /tmp/tmpa2po8ksu/gmqvkxeEbx/i2p-0.9.50/apps/routerconsole/jsp/themes/console/dark/images/dropdown_active.png differ diff -Nru i2p-0.9.49/apps/routerconsole/jsp/themes/console/light/console.css i2p-0.9.50/apps/routerconsole/jsp/themes/console/light/console.css --- i2p-0.9.49/apps/routerconsole/jsp/themes/console/light/console.css 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/themes/console/light/console.css 2021-05-19 12:11:57.000000000 +0000 @@ -1176,6 +1176,30 @@ box-shadow: none; } +.hostaddform { + display: inline-block; + width: 45%; + vertical-align: top; +} + +.hostadd { + min-height: 20%; + width: 100%; + background: #fafaff !important; +} + +.unicodeicon { + font-size: 2rem; + vertical-align: middle; +} + +.hostaddaction { + background: transparent !important; + border: none !important; + padding-bottom: 15px !important; + padding-top: 0px !important; +} + /* end proxy error messages */ /* console error messages */ @@ -1320,7 +1344,7 @@ #susidnsframe { margin: 0 0 -2px; - height: 100%; + min-height: 100vh !important; width: 100%; overflow: hidden; } @@ -1328,7 +1352,6 @@ .main#tunnelmgr { padding: 0 10px; min-width: 556px; - height: 150%; } #i2ptunnelframe { @@ -1807,8 +1830,8 @@ .mlabtable { width: 30%; + top: 150px; position: absolute; - top: 17%; font-size: 10pt !important; } @@ -2197,9 +2220,9 @@ .wizardnotice { position: absolute; - top: 75%; - left: 5%; + left: 75%; width: 22%; + top: 75%; } #bandwidthconfig .configtable tr:last-child td { @@ -2498,28 +2521,29 @@ #wizardheading { border: none; - width: 100%; padding: 2%; margin: auto; - top: 1%; + margin-left: 40%; + margin-top: -1%; font-size: xx-large; letter-spacing: 0.08em; word-spacing: 0.1em; color: #41465f; - position: absolute; + line-height: normal; background: none !important; box-shadow: none !important; } .clickableProgression { - color: #327bbf; + color: #327bbf; + margin-left: 47%; } #infodiv { position: absolute; - left: 32%; - width: 35%; - top: 50%; + left: 33%; + width: 31%; + top: 25%; box-shadow: inset 0 0 0 1px #fff; background: rgba(255,255,255,0.7); font-size: larger; @@ -2530,10 +2554,8 @@ } #bandwidthconfig.configtable.wizardtable { - width: 35%; - top: 17%; - left: 32%; - position: absolute; + width: 31%; + margin-left: 65%; background: none; font-size: 10pt !important; } @@ -2542,7 +2564,6 @@ bottom: 10%; right: 10%; width: max-content; - position: absolute; box-shadow: none !important; white-space: normal; background: none; @@ -2571,23 +2592,20 @@ } #xhr.notification { - width: 30%; - position: absolute; - left: 30%; - top: 38%; + width: 20%; + position: relative; + left: 70%; + top: 30%; font-size: larger; - background: #eef; - box-shadow: inset 0 0 0 1px #fff; + background-size: auto; } #xhr2.notification { - width: 20%; - position: absolute; - left: 70%; - top: 30%; + width: 20%; + position: relative; + left: 70%; + top: 30%; font-size: larger; - background: #eef; - background: linear-gradient(to right, #fafaff, #eef); background-size: auto 100%, 100% 100%; box-shadow: inset 0 0 0 1px #fff; } @@ -3418,7 +3436,6 @@ h3 { padding: 7px 5px 6px 7px; - margin: 12px 0 0 0; border-radius: 0 2px 2px 0; font-size: 11pt; letter-spacing: 0.08em; @@ -3768,7 +3785,7 @@ transition: ease box-shadow 0.05s; } -input.wizardbutton, button.wizardbutton { +input.wizardbuttons, button.wizardbuttons { font-size: large; } @@ -4146,6 +4163,7 @@ .routersummary .cancel { margin-top: 10px; + padding: 5px 7px 1px 24px !important; } /* Show text on context specific buttons (eg deferred shutdown) */ @@ -4156,13 +4174,17 @@ text-indent: 0; text-align: left; min-width: 0 !important; - padding: 5px 7px 1px 22px !important; text-transform: capitalize; } -.routersummary .cancel { - text-transform: capitalize; - padding: 5px 7px 1px 22px !important; +.routersummary .cancel[value="cancelShutdown"] { + background: url(/themes/console/images/buttons/no.png) center left 6px no-repeat, linear-gradient(to bottom, #fff, #efefff) !important; + background-size: 14px 14px, 100% 100% !important; +} + +.routersummary .cancel[value="cancelShutdown"]:hover, .routersummary .cancel[value="cancelShutdown"]:focus, .routersummary .cancel[value="cancelShutdown"]:active { + background: url(/themes/console/images/buttons/no.png) center left 6px no-repeat, linear-gradient(to bottom, #eee, #fff) !important; + background-size: 14px 14px, 100% 100% !important; } .routersummary .reload[value="restartImmediate"] { @@ -4799,9 +4821,7 @@ } div#wizlangsettings.wizard { - position: absolute; - left: 15%; - top: 50%; + margin-left: 40%; } #themesettings hr, #langsettings hr { @@ -4809,12 +4829,11 @@ } img.wizard.progress { + mix-blend-mode: multiply; position: absolute; - top: 6%; + top: 1%; left: 1%; - max-height: 10%; - max-width: 30%; - mix-blend-mode: multiply; + max-width: 40%; } .overlay { @@ -4834,20 +4853,23 @@ .wizardtext { width: 25%; - position: absolute; - top: 17%; - left: 5%; font-size: larger; + margin-top: -20%; + margin-left: 10%; +} + +.wizardbuttons { + margin-left: 10%; } #wizard { z-index: 0; - position: absolute; left: 0px; top: 0px; height: 100%; width: 100%; background-color: #f8f9fa; + text-align: start; } .langselect { /* containing box for lang selection */ @@ -4862,16 +4884,17 @@ float: left; margin-left: 15%; transition: transform 0.3s ease 0s; + } .wizardimg { - max-width: 75%; + max-width: 50%; max-height: 100%; margin: auto; mix-blend-mode: multiply; - position: absolute; - z-index: 0; - right: 0%; + margin-left: 40%; + margin-top: -10%; + position: relative; } .langselect:hover { @@ -5379,13 +5402,24 @@ margin-top: 10px; } -#netdboverview th, #netdblookup th { +#netdboverview th { + text-transform: uppercase; + font-size: 11pt !important; + letter-spacing: 0.08em; + word-spacing: 0.1em; + background: #f6f6ff url(/themes/console/images/buttons/floodfill.png) 8px center no-repeat !important; + background: url(/themes/console/images/buttons/floodfill.png) 8px center no-repeat, linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(to right, #fcfcff 5%, rgba(231, 231, 255, 0.8) 25%) !important; + background-size: 18px 18px, 100% 100%, 100% 100% !important; + padding: 8px 5px 8px 32px; +} + +#netdblookup th { text-transform: uppercase; font-size: 11pt !important; letter-spacing: 0.08em; word-spacing: 0.1em; - background: #f6f6ff url(/themes/console/images/info/launch_browser.png) 8px center no-repeat !important; - background: url(/themes/console/images/info/launch_browser.png) 8px center no-repeat, linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(to right, #fcfcff 5%, rgba(231, 231, 255, 0.8) 25%) !important; + background: #f6f6ff url(/themes/console/images/buttons/search.png) 8px center no-repeat !important; + background: url(/themes/console/images/buttons/search.png) 8px center no-repeat, linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(to right, #fcfcff 5%, rgba(231, 231, 255, 0.8) 25%) !important; background-size: 18px 18px, 100% 100%, 100% 100% !important; padding: 8px 5px 8px 32px; } Binary files /tmp/tmpa2po8ksu/Y97QNf3n1h/i2p-0.9.49/apps/routerconsole/jsp/themes/console/light/images/dropdown_active.png and /tmp/tmpa2po8ksu/gmqvkxeEbx/i2p-0.9.50/apps/routerconsole/jsp/themes/console/light/images/dropdown_active.png differ diff -Nru i2p-0.9.49/apps/routerconsole/jsp/welcome.jsp i2p-0.9.50/apps/routerconsole/jsp/welcome.jsp --- i2p-0.9.49/apps/routerconsole/jsp/welcome.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/routerconsole/jsp/welcome.jsp 2021-05-19 12:11:57.000000000 +0000 @@ -111,9 +111,6 @@ <%-- needed for CSS: --%>
    <%-- needed for lang setting in css.jsi: --%> - -

    <%=uihelper._t("Select Language")%>

    -
    @@ -122,6 +119,9 @@
    + +

    <%=uihelper._t("Select Language")%>

    +
    @@ -143,9 +143,6 @@ } else if (ipg == 2) { // Overview of bandwidth test %> - -

    <%=intl._t("Bandwidth Test")%>

    -
    @@ -154,6 +151,9 @@
    + +

    <%=intl._t("Bandwidth Test")%>

    +

    <%=intl._t("Let's check your internet connection!")%> @@ -179,9 +179,6 @@ } else if (ipg == 3) { // Bandwidth test in progress (w/ AJAX) %> - -

    <%=intl._t("Bandwidth Test in Progress")%>

    -
    @@ -190,7 +187,10 @@
    -
    + +

    <%=intl._t("Bandwidth Test in Progress")%>

    + +
    <%=intl._t("Javascript is disabled - wait 60 seconds for the bandwidth test to complete and then click Next")%>
    @@ -219,8 +219,6 @@ if (request.getParameter("skipbw") == null) { // don't display this if we skipped the test %> - -

    <%=intl._t("Bandwidth Test Results")%>

    @@ -229,6 +227,8 @@
    + +

    <%=intl._t("Bandwidth Test Results")%>

    I2P version:<%=net.i2p.router.RouterVersion.FULL_VERSION%>
    API version:<%=net.i2p.CoreVersion.PUBLISHED_VERSION%>
    Java version:<%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)
    @@ -249,7 +249,6 @@ %>

    <%=intl._t("Bandwidth Configuration")%>

    - - - - -

    Eeproxy

    From Python-I2P. - - -

    -The Eeproxy is run by the I2P router. The proxy is normally used for web browsers, as a means of accessing eepsites. - - -

    -The eeproxy is usually available at http://127.0.0.1:4444/. - -

    -

    -

    - - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.BaseHTTPServer.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.BaseHTTPServer.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.BaseHTTPServer.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.BaseHTTPServer.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ - -User's Guide:i2p.BaseHTTPServer - Wikipedia - - - - - - - -

    User's Guide:i2p.BaseHTTPServer

    From Python-I2P. - - -

    -Emulates Python BaseHTTPServer module using I2P sockets. - - -

    - -

    Overview

    - -

    -The Python module is described at http://www.python.org/doc/current/lib/module-BaseHTTPServer.html - -

    -To get a server going, use: - -

    -

      ->>> from i2p import BaseHTTPServer
      ->>> BaseHTTPServer.test().
      -
      -
    - -

    -Consult the documentation for function test() to change basic server settings, such as the session name. - -

    -A fully customizable example: - -

    -

      ->>> from i2p import BaseHTTPServer
      ->>> session = "mytestxxx.i2p"      # SAM session name
      ->>> class MyServer(BaseHTTPServer.HTTPServer): pass
      ->>> class MyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): pass
      ->>> httpd = MyServer(session, MyRequestHandler)
      ->>> httpd.socket.dest
      -(Base64 Destination of server)
      ->>> httpd.serve_forever()
      -
      -
    - -

    - -

    Classes

    - -

    -class BaseHTTPRequestHandler -

      -Same interface as Python class BaseHTTPServer.BaseHTTPRequestHandler.
      -
      -
    -class HTTPServer -
      -Same interface as Python class BaseHTTPServer.HTTPServer.
      -
      -
    - -

    - -

    Functions

    - -

    -test(HandlerClass=BaseHTTPRequestHandler, ServerClass=HTTPServer, protocol='HTTP/1.0', session='mytestxxx.i2p') -

      -Test the HTTP request handler class.
      -This runs an I2P TCP server under SAM session 'session'. If a single command 
      -line argument is given, the argument is used instead as the SAM session name.
      -
      -
    - -

    -

    - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.CGIHTTPServer.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.CGIHTTPServer.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.CGIHTTPServer.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.CGIHTTPServer.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ - -User's Guide:i2p.CGIHTTPServer - Wikipedia - - - - - - - -

    User's Guide:i2p.CGIHTTPServer

    From Python-I2P. - - -

    -Module i2p.CGIHTTPServer emulates the Python CGIHTTPServer module using I2P sockets. - - -

    - -

    Overview

    - -

    -The Python module is described at http://www.python.org/doc/current/lib/module-CGIHTTPServer.html - -

    -To get a server going, use: - -

    -

      ->>> from i2p import CGIHTTPServer
      ->>> CGIHTTPServer.test().
      -
      -
    - -

    -Consult the documentation for function test() to change basic server settings, such as the session name. - -

    -A fully customizable example: - -

    -

      ->>> from i2p import BaseHTTPServer, CGIHTTPServer
      ->>> session = "mytestxxx.i2p"      # SAM session name
      ->>> class MyServer(BaseHTTPServer.HTTPServer): pass
      ->>> class MyRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): pass
      ->>> httpd = MyServer(session, MyRequestHandler)
      ->>> httpd.socket.dest
      -(Base64 Destination of server)
      ->>> httpd.serve_forever()
      -
      -
    - -

    - -

    Classes

    - -

    -class CGIHTTPRequestHandler -

      -Same interface as Python class CGIHTTPServer.CGIHTTPRequestHandler.
      -
      -
    - -

    - -

    Functions

    - -

    - -test(HandlerClass=CGIHTTPRequestHandler, -ServerClass=i2p.BaseHTTPServer.HTTPServer, -session='mytestxxx.i2p') -

      -Test the HTTP CGI request handler class.
      -This runs an I2P TCP server under SAM session 'session'. If a single
      -command line argument is given, the argument is used instead as the SAM session
      -name.
      -
      -
    - -

    -

    - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.eep.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.eep.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.eep.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.eep.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ - -User's Guide:i2p.eep - Wikipedia - - - - - - - -

    User's Guide:i2p.eep

    From Python-I2P. - - -

    -Module i2p.eep allows Python programs to access the Eeproxy. - - -

    -With this module, a program can easily download eepsites. - -

    - -

    Functions

    - -

    -urlopen(url, eepaddr='127.0.0.1:4444') -

    -urlget(url, eepaddr='127.0.0.1:4444') - - -

    -

    -

    - - - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ - -User's Guide:i2p - Wikipedia - - - - - - - -

    User's Guide:i2p

    From Python-I2P. - - -

    -Package i2p is a container package for more specific modules. - - -

    -It contains the following modules: - -

    -

    -class Error(Exception): -
      - -
       Base class for all I2P errors.
      -
      -
    - -

    -class RouterError(Error): -

      - -
       Could not connect to router.
      -
      -
    - -

    -

    - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.router.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.router.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.router.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.router.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ - -User's Guide:i2p.router - Wikipedia - - - - - - - -

    User's Guide:i2p.router

    From Python-I2P. - - -

    -Module i2p.router allows Python programs to control the I2P router. - - -

    - -

    Functions

    - -

    -check(dir=None) -

      - Checks whether a locally installed router is running.  Does
      - nothing if successful, otherwise raises i2p.RouterError.
      -     
      - An I2P installation is located by using find(dir).
      - The router.config file is parsed for 'router.adminPort'.
      - This port is queried to determine whether the router is
      - running.
      -
      -
    -find(dir=None) -
      -
      - Find the absolute path to a locally installed I2P router.
      -     
      - An I2P installation is located by looking in the
      - dir argument given to the function, then in the environment
      - I2P, then in PATH.  It looks for startRouter.sh or
      - startRouter.bat.  Raises ValueError if an I2P installation
      - could not be located.
      -
      -
    -start(dir=None, hidden=False) -
      - Start a locally installed I2P router.  Does nothing if
      - the router has already been started.
      - 
      - An I2P installation is located by using find(dir).
      - 
      - If hidden is True, do not show a terminal for the router.
      -
      -
    -stop(dir=None, force=False) -
      - Stop a locally installed I2P router, if it was started by
      - the current Python program.  If force is True, stop the
      - router even if it was started by another process.  Do nothing
      - if force is False and the router was started by another program.
      - 
      - The file 'router.config' is located using the same search
      - process used for find(dir).  It is parsed for
      - 'router.shutdownPassword' and 'router.adminPort'.  The
      - router is shut down through the admin port.
      - 
      - Raises i2p.RouterError if the I2P router is running but cannot
      - be stopped.  You must uncomment the
      - 'router.shutdownPassword' line for this command to work.
      -
      - -
    - -

    -

    -

    - - diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.select.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.select.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.select.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.select.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ - -User's Guide:i2p.select - Wikipedia - - - - - - - -

    User's Guide:i2p.select

    From Python-I2P. - - -

    -Module i2p.select emulates the Python module select. - - -

    -With this module, a program can perform select and poll commands on traditional and I2P sockets. - -

    -poll() -

      - -
       Returns a polling object.  Works on SAM sockets and Python sockets.
      - See select.poll() in the Python library for more information.
      -
      -
    - -

    -select(readlist, writelist, errlist, timeout=None) -

      - -
       Performs a select call.  Works on SAM sockets and Python sockets.
      - See select.select() in the Python library for more information.
      -
      -
    - -

    -Polling flags - -

      - POLLIN = 1
      - POLLOUT = 4
      - POLLERR = 8
      - POLLHUP = 16
      - POLLNVAL = 32
      - POLLPRI = 1
      -
      -
    - -

    -

    - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.SimpleHTTPServer.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.SimpleHTTPServer.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.SimpleHTTPServer.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.SimpleHTTPServer.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ - -User's Guide:i2p.SimpleHTTPServer - Wikipedia - - - - - - - -

    User's Guide:i2p.SimpleHTTPServer

    From Python-I2P. - - -

    -Emulates Python SimpleHTTPServer module using I2P sockets. - - -

    - -

    Overview

    - -

    -The Python module is described at http://www.python.org/doc/current/lib/module-SimpleHTTPServer.html - -

    -To get a server going, use: - -

    -

      ->>> from i2p import SimpleHTTPServer
      ->>> SimpleHTTPServer.test().
      -
      -
    - -

    -Consult the documentation for function test() to change basic server settings, such as the session name. - -

    -A fully customizable example: - -

    -

      ->>> from i2p import BaseHTTPServer, SimpleHTTPServer
      ->>> session = "mytestxxx.i2p"      # SAM session name
      ->>> class MyServer(BaseHTTPServer.HTTPServer): pass
      ->>> class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): pass
      ->>> httpd = MyServer(session, MyRequestHandler)
      ->>> httpd.socket.dest
      -(Base64 Destination of server)
      ->>> httpd.serve_forever()
      -
      -
    - -

    - -

    Classes

    - -

    -class SimpleHTTPRequestHandler -

      -Same interface as Python class SimpleHTTPServer.SimpleHTTPRequestHandler.
      -
      -
    - -

    - -

    Functions

    - -

    - -test(HandlerClass=SimpleHTTPRequestHandler, ServerClass= i2p.BaseHTTPServer.HTTPServer, session='mytestxxx.i2p') -

      -Test the HTTP simple request handler class.
      -This runs an I2P TCP server under SAM session 'session'. If a single command 
      -line argument is given, the argument is used instead as the SAM session name.
      -
      -
    - -

    -

    - - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.socket.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.socket.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.socket.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.socket.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,376 +0,0 @@ - -User's Guide:i2p.socket - Wikipedia - - - - - - - -

    User's Guide:i2p.socket

    From Python-I2P. - - -

    -Module i2p.socket allows Python programs to access the SAM proxy. It emulates the Python module socket. - - -

    -With this module, a program can send stream data, datagrams, and raw packets across the I2P network. - -

    - -

    <%=intl._t("Test server location")%><%=wizhelper.getServerLocation()%>
    <%=intl._t("Completion status")%><%=wizhelper.getCompletionStatus()%>
    -Table of contents
    - - -
    -3 Errors
    - -
    - -

    -

    Sockets

    - -

    -class socket(session, type, samaddr='127.0.0.1:7656', **kwargs) -

      - Create a new socket.  Argument session should be a session
      - name -- if the name has not yet been used, an I2P
      - Destination will be created for it, otherwise, the
      - existing Destination will be re-used.  An empty session
      - string causes a transient session to be created.  Argument
      - type is one of SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW.
      - 
      - I2P configuration keyword arguments:
      - 
      -   - in_depth  - depth of incoming tunnel (default 2)
      -   - out_depth - depth of outgoing tunnel (default 2)
      - 
      - A single session may be shared by more than one socket, if
      - the sockets are the same type, and if the sockets are
      - created within the same Python process.  The socket
      - objects are multithread-safe.
      - 
      - Examples:
      -   >>> a = i2p.socket('Alice', i2p.SOCK_STREAM)
      -   >>> b = i2p.socket('Bob',   i2p.SOCK_DGRAM, 
      -                      in_depth=2, out_depth=5)
      - 
      - The created object behaves identically to a socket from
      - module socket, with the following exceptions:
      - 
      -   * I2P Destinations are used as address arguments [1].
      -   * bind is a no-op: sockets are always bound.
      -   * send* methods send all data and are non-blocking.
      - 
      - A given session name can only be open in a single Python
      - program at a time.  If you need to overcome this
      - limitation, consider patching I2P.
      - 
      - [1]. Alternatively, a host name can be used as an address.
      -      It will be resolved using hosts.txt.
      -
      -
      - - -
       For details on how to use socket objects, see
      - http://www.python.org/doc/current/lib/socket-objects.html  
      -
      -

      - -

       See the examples directory for code examples.
      -
      -
    -The class socket defines the following properties: - -
      - -
       dest    - Local I2P Destination of socket
      - session - Session name
      - type    - Socket type: SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW.
      -
      -
    - -

    -The class socket defines the following methods: - -

    -accept(self) -

      - Accept an incoming connection. The socket must be type SOCK_STREAM, and 
      - listen() must be called prior to this command. The return value is (conn, 
      - remotedest), where conn is a new socket object made for the connection, and 
      - remotedest is the remote Destination from which the connection was made.
      -
      - Example:
      -
      -  >>> from i2p import socket
      -  >>> s = socket.socket('Alice', socket.SOCK_STREAM)
      -  >>> s.listen(10)
      -
      - This prepares the server. Now accept an incoming connection:
      -
      -  >>> c, remotedest = s.accept()
      -  >>> c.send('hello world!')
      -
      - If accept() is called on a socket that is in non-blocking mode or has a  
      - timeout, i2p.socket.BlockError or i2p.socket.Timeout may be raised. This 
      - indicates that no incoming connection is currently available.
      -
      -
      -
    -bind(self, address) -
      - Does nothing. Provided for compatibility with the Python socket command
      - bind(), which binds a server to a port.
      -
      -
    -close(self) -
      - Closes the socket. It is an error to call any method other than recv() or
      - recvfrom() on a closed socket. For streams, the receive methods return data
      - that was received prior to the closing of the socket. For datagram and raw
      - sockets, the receive methods cannot be used on a closed socket.
      -
      -
    -connect(self, address) - -
      - Connect to a remote dest, identified in local SAM bridge's hosts file as host 
      - 'address'.
      -
      - For example:
      -
      - >>> s.connect('duck.i2p')
      -
      - Alternatively, you can use a full base64 Destination:
      - Example:
      -
      - >>> s.connect('238797sdfh2k34kjh....AAAA')
      -
      - If connect() is called on a socket that is in non-blocking mode or has a
      - timeout, i2p.socket.BlockError or i2p.socket.Timeout may be raised. This
      - indicates that the connection is still being initiated. Use i2p.select.select()
      - to determine when the connection is ready.
      -
      -
    -connect_ex(self, address) -
      - Like connect(), but return any error that is raised. Returns None if no error
      - is raised.
      -
      -
    -getpeername(self) - -
      - Get the remote Destination associated with the socket. This is equivalent to 
      - s.remotedest, and is provided for compatibility with the Python socket module.
      -
      -
    -getsockname(self) -
      - Get the local Destination associated with the socket. This is equivalent to
      - s.dest, and is provided for compatibility with the Python socket module.
      -
      -
    -gettimeout(self) -
      - Get the timeout value.
      -
      -
      -
    -listen(self, backlog) -
      - Listen for connections made to the socket. This method must be called before 
      - accept(). The backlog argument specifies the maximum number of queued incoming 
      - connections.
      -
      -
    -makefile(self, mode='r', bufsize=-1) -
      - Return a file object for the socket. See socket.makefile() in the Python 
      - documentation for more information.
      -
      -
    -recv(self, bufsize, flags=0) - -
      - Receive string data from the socket.
      -
      - The maximum amount of data to be received is given by bufsize. If bufsize is 
      - zero, this function returns an empty string immediately. If bufsize is nonzero,
      - this function blocks until at least one character is available for reading. If 
      - the socket has been closed, an empty string is returned as an end of file  
      - indicator.
      -
      - If recv() is called on a socket that is in non-blocking mode or has a timeout, 
      - i2p.socket.BlockError or i2p.socket.Timeout will be raised if data is not 
      - available within the given timeframe.
      -
      - For a datagram or raw socket, the first bufsize characters of the packet are 
      - read, and the remainder of the packet is discarded. To read the entire packet, 
      - use bufsize = -1.
      -
      - For datagram and raw sockets, the packet may originate from any Destination. 
      - Use recvfrom() with datagrams to determine the Destination from which the 
      - packet was received.
      -
      - The flags argument can be a bitwise OR of MSG_PEEK, MSG_WAITALL, and/or 
      - MSG_DONTWAIT. MSG_PEEK indicates that any data read should not be removed from 
      - the socket's incoming buffer. MSG_WAITALL indicates to wait for exactly bufsize
      - characters or an error. MSG_DONTWAIT indicates that the recv() command should 
      - not block execution.
      -
      -
    -recvfrom(self, bufsize, flags=0) -
      - Like recv(), but returns a tuple (data, remoteaddr), where data is the string 
      - data received, and remoteaddr is the remote Destination.
      -
      -
    -send(self, string, flags=0) -
      - Sends string data to a remote Destination.
      -
      - For a stream, connect() must be called prior to send(). Once close() is called, 
      - no further data can be sent, and the stream cannot be re-opened.
      -
      - For datagram and raw sockets, connect() only specifies a Destination to which 
      - packets are sent to. send() will then send a packet to the given Destination. 
      - connect() can be used multiple times.
      -
      - The send() command never blocks execution. The flags argument is ignored.
      -
      -
      -
    -sendall(self, string, flags=0) -
      - Identical to send().
      -
      -
    -sendto(self, string, flags, address) -
      - Send a packet to the given Destination.
      -
      - Only valid for datagram and raw sockets. The address argument should be either 
      - a name from the hosts file, or a base64 Destination.
      -
      - The sendto() command never blocks execution. The flags argument is ignored.
      -
      -
    -setblocking(self, flag) - -
      - Set blocking or non-blocking mode for the socket.
      -
      - If flag is True, any method called on the socket will hang until the method has
      - completed. If flag is False, all methods will raise i2p.socket.BlockError() if
      - they cannot complete instantly.
      -
      - s.setblocking(False) is equivalent to s.settimeout(0); s.setblocking(True) is 
      - equivalent to s.settimeout(None).
      -
      -
    -settimeout(self, value) -
      - Set a timeout for the socket.
      -
      - The value argument should be a timeout value in seconds, or None. None is 
      - equivalent to an infinite timeout.
      -
      - A socket operation will raise a i2p.socket.Timeout if the operation cannot 
      - complete within in the specified time limit.
      -
      -
    - -

    - -

    Functions

    - -

    -Functions defined in module i2p.socket: - -

    -resolve(host, samaddr='127.0.0.1:7656') -

      - -
       Resolve I2P host name --> I2P Destination.
      - Returns the same string if host is already a Destination.
      -
      -
    - -

    - -

    Errors

    - -

    -class Error(i2p.Error) -

      - Base class for all SAM errors.
      -
      -
    -class BlockError(Error) - -
      - Socket call would have blocked.
      -
      -
    -class ClosedError(Error) -
      - A command was used on a socket that closed gracefully.
      -
      -
    -class NetworkError(Error) -
      -
      - Network error occurred within I2P.
      -
      - The error object is a 2-tuple: (errtag, errdesc).
      - errtag is a SAM error string,
      - errdesc is a human readable error description. 
      -
      -
    - -

    - -

    Constants

    - -

    -Socket types -

      - SOCK_STREAM = 1
      - SOCK_DGRAM = 2
      - SOCK_RAW = 3
      -
      -
      -
    -Packet sizes -
      - MAX_DGRAM = 31744        # Maximum size for datagram packet
      - MAX_RAW = 32768          # Maximum size for raw packet
      -
      -
    -Flags for recv() -
      - MSG_DONTWAIT = 128       # Don't block 
      - MSG_PEEK = 2             # Peek at incoming data
      - MSG_WAITALL = 64         # Wait for all data or error
      -
      -
    - -

    -

- \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.SocketServer.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.SocketServer.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.SocketServer.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.SocketServer.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ - -User's Guide:i2p.SocketServer - Wikipedia - - - - - - - -

User's Guide:i2p.SocketServer

From Python-I2P. - - -

-Emulates Python SocketServer module using I2P sockets. - - -

-The Python module is described at http://www.python.org/doc/current/lib/module-SocketServer.html - -

- -

Classes

- -

-

    -BaseRequestHandler  	 
    -BaseServer 	 
    -DatagramRequestHandler 	 
    -ForkingMixIn 	 
    -ForkingTCPServer 	 
    -ForkingUDPServer 	 
    -StreamRequestHandler 	 
    -TCPServer 	 
    -ThreadingMixIn 	 
    -ThreadingTCPServer 	 
    -ThreadingUDPServer 	 
    -UDPServer
    -
    -
- -

-

- \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/i2p.tunnel.html i2p-0.9.50/apps/sam/python/doc/guide/i2p.tunnel.html --- i2p-0.9.49/apps/sam/python/doc/guide/i2p.tunnel.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/i2p.tunnel.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ - -User's Guide:i2p.tunnel - Wikipedia - - - - - - - -

User's Guide:i2p.tunnel

From Python-I2P. - - -

-Module i2p.tunnel allows data to be exchanged between traditional TCP sockets and I2P sockets. - - -

- -

Tunnels

- -

-Tunnels allow stream sockets to be joined, so that connections to a listening socket are relayed to one or more sending sockets. This allows an ordinary web server to be exposed as an I2P Destination, or an I2P Destination to be bound as a local port, and so on. - -

-class Tunnel(self, receive, make_send, nconnect=-1, timeout=60.0) -

    - A Tunnel relays connections from a 'receive' socket to one
    - or more 'send' sockets.  The receive socket must be bound
    - and listening.  For each incoming connection, a new send
    - socket is created by calling make_send().  Data is then
    - exchanged between the created streams until one socket is
    - closed.  nconnect is the maximum number of simultaneous
    - connections (-1 for infinite), and timeout is the time that
    - a single connection can last for (None allows a connection
    - to last forever).
    - 
    - Sockets must accept stream traffic and support the Python
    - socket interface.  A separate daemonic thread is created to
    - manage the tunnel.  For high performance, make_send() should
    - make a socket and connect in non-blocking mode (you should
    - catch and discard the i2p.socket.BlockError or socket.error
    - due to executing connect on a non-blocking socket).
    - 
    - Security Note:
    - A firewall is needed to maintain the end user's anonymity.
    - An attacker could keep a tunnel socket open by pinging it
    - regularly.  The accepted sockets from 'receive' must prevent
    - this by closing down eventually.
    - 
    - Socket errors do not cause the Tunnel to shut down.
    -
    -
- -

-close() -

    - -
     Close all connections made for this tunnel.
    -
    -
- -

- -

Tunnel Server

- -

-class TunnelServer(session, port, samaddr='127.0.0.1:7656', nconnect=-1, timeout=None, **kwargs) -

    - Tunnels incoming SAM streams --> localhost:port.
    - 
    - nconnect and timeout are the maximum number of connections
    - and maximum time per connection.  All other arguments are
    - passed to i2p.socket.socket().  This call blocks until the
    - tunnel is ready.
    -
    -
- -

-TunnelServer properties: -

    -
    - dest       - I2P Destination of server. 
    - session    - Session name for server.
    -
    -
- -

- -

Tunnel Client

- -

-class TunnelClient(session, port, dest, samaddr='127.0.0.1:7656', nconnect=-1, timeout=None, **kwargs) -

    - Derived from Tunnel.
    - Tunnels localhost:port --> I2P Destination dest.
    - 
    - A session named 'session' is created locally, for purposes
    - of routing to 'dest'.  nconnect and timeout are the maximum
    - number of connections and maximum time per connection.  All
    - other arguments are passed to i2p.socket.socket().  This call
    - blocks until the tunnel is ready.
    -
    -
    -
- -

-TunnelClient properties: -

    - dest       - Local Destination used for routing.
    - remotedest - Remote Destination.
    - session    - Session name for local Destination.
    -
    -
- -

-

- \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/index.html i2p-0.9.50/apps/sam/python/doc/guide/index.html --- i2p-0.9.49/apps/sam/python/doc/guide/index.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/index.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ - -Main Page - Wikipedia - - - - - - - -

Main Page

From Python-I2P. - - -

-Python-I2P is a Python interface to I2P. - - -

- -

Quick Start

- -

-Install: - -

-

    -python setup.py install
    -
    -
- -

-Use: - -

- -

    ->>> from i2p import socket
    ->>> s = socket.socket('Alice', socket.SOCK_STREAM)
    ->>> s.connect('duck.i2p')
    ->>> s.send('GET / HTTP/1.0\r\n\r\n')
    ->>> s.recv(1000)
    -(HTTP response from duck.i2p)
    -
    -
- -

- -See the src/examples/ directory for more code examples. - -

- -

User's Guide

- -

-The following modules are available: - -

-

- -

-

- \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/samproxy.html i2p-0.9.50/apps/sam/python/doc/guide/samproxy.html --- i2p-0.9.49/apps/sam/python/doc/guide/samproxy.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/samproxy.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - -SAM proxy - Wikipedia - - - - - - - -

SAM proxy

From Python-I2P. - - -

-A SAM proxy is run by the I2P router. The proxy allows streams, datagrams, and raw packets to be sent through the I2P network. A client application uses a telnet-like session to communicate with the proxy. In this way, the core features of the I2P library can be used by any language. - - -

-The protocol used for SAM is described in SAM 1.0. - -

-In practice, a SAM library is usually written, so that client applications do not need to use the low-level SAM commands. - -

-

-

- - - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/eeproxy.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/eeproxy.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/eeproxy.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/eeproxy.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -Title: Eeproxy - -The '''Eeproxy''' is run by the I2P router. The proxy is normally used for web browsers, as a means of accessing eepsites. - -The eeproxy is usually available at http://127.0.0.1:4444/. diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.BaseHTTPServer.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.BaseHTTPServer.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.BaseHTTPServer.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.BaseHTTPServer.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -Title: User's Guide:i2p.BaseHTTPServer - -Emulates Python BaseHTTPServer module using I2P sockets. - -== Overview == - -The Python module is described at http://www.python.org/doc/current/lib/module-BaseHTTPServer.html - -To get a server going, use: - -

    ->>> from i2p import BaseHTTPServer
    ->>> BaseHTTPServer.test().
    -
- -Consult the documentation for function test() to change basic server settings, such as the session name. - -A fully customizable example: - -
    ->>> from i2p import BaseHTTPServer
    ->>> session = "mytestxxx.i2p"      # SAM session name
    ->>> class MyServer(BaseHTTPServer.HTTPServer): pass
    ->>> class MyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): pass
    ->>> httpd = MyServer(session, MyRequestHandler)
    ->>> httpd.socket.dest
    -(Base64 Destination of server)
    ->>> httpd.serve_forever()
    -
- -== Classes == - -class '''BaseHTTPRequestHandler''' -
    -Same interface as Python class BaseHTTPServer.BaseHTTPRequestHandler.
    -
-class '''HTTPServer''' -
    -Same interface as Python class BaseHTTPServer.HTTPServer.
    -
- -== Functions == - -'''test'''(HandlerClass=BaseHTTPRequestHandler, ServerClass=HTTPServer, protocol='HTTP/1.0', session='mytestxxx.i2p') -
    -Test the HTTP request handler class.
    -This runs an I2P TCP server under SAM session 'session'. If a single command 
    -line argument is given, the argument is used instead as the SAM session name.
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.CGIHTTPServer.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.CGIHTTPServer.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.CGIHTTPServer.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.CGIHTTPServer.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -Title: User's Guide:i2p.CGIHTTPServer - -Module i2p.CGIHTTPServer emulates the Python CGIHTTPServer module using I2P sockets. - -== Overview == - -The Python module is described at http://www.python.org/doc/current/lib/module-CGIHTTPServer.html - -To get a server going, use: - -
    ->>> from i2p import CGIHTTPServer
    ->>> CGIHTTPServer.test().
    -
- -Consult the documentation for function test() to change basic server settings, such as the session name. - -A fully customizable example: - -
    ->>> from i2p import BaseHTTPServer, CGIHTTPServer
    ->>> session = "mytestxxx.i2p"      # SAM session name
    ->>> class MyServer(BaseHTTPServer.HTTPServer): pass
    ->>> class MyRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): pass
    ->>> httpd = MyServer(session, MyRequestHandler)
    ->>> httpd.socket.dest
    -(Base64 Destination of server)
    ->>> httpd.serve_forever()
    -
- -== Classes == - -class '''CGIHTTPRequestHandler''' -
    -Same interface as Python class CGIHTTPServer.CGIHTTPRequestHandler.
    -
- -== Functions == - -'''test'''(HandlerClass=CGIHTTPRequestHandler, -ServerClass=i2p.BaseHTTPServer.HTTPServer, -session='mytestxxx.i2p') -
    -Test the HTTP CGI request handler class.
    -This runs an I2P TCP server under SAM session 'session'. If a single
    -command line argument is given, the argument is used instead as the SAM session
    -name.
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.eep.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.eep.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.eep.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.eep.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -Title: User's Guide:i2p.eep - -Module i2p.eep allows Python programs to access the [[Eeproxy]]. - -With this module, a program can easily download eepsites. - -== Functions == - -'''urlopen'''(url, eepaddr='127.0.0.1:4444') -
    - Like urllib2.urlopen(url), but only works for eep-sites. - Example: f = urlopen('http://duck.i2p/index.html') -
-'''urlget'''(url, eepaddr='127.0.0.1:4444') -
    - Get contents of an eepsite. - Example: urlget('http://duck.i2p/'). -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.router.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.router.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.router.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.router.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -Title: User's Guide:i2p.router - -Module i2p.router allows Python programs to control the I2P router. - -== Functions == - -'''check'''(dir=None) -
    - Checks whether a locally installed router is running.  Does
    - nothing if successful, otherwise raises i2p.RouterError.
    -     
    - An I2P installation is located by using find(dir).
    - The router.config file is parsed for 'router.adminPort'.
    - This port is queried to determine whether the router is
    - running.
    -
-'''find'''(dir=None) -
    - Find the absolute path to a locally installed I2P router.
    -     
    - An I2P installation is located by looking in the
    - dir argument given to the function, then in the environment
    - I2P, then in PATH.  It looks for startRouter.sh or
    - startRouter.bat.  Raises ValueError if an I2P installation
    - could not be located.
    -
-'''start'''(dir=None, hidden=False) -
    - Start a locally installed I2P router.  Does nothing if
    - the router has already been started.
    - 
    - An I2P installation is located by using find(dir).
    - 
    - If hidden is True, do not show a terminal for the router.
    -
-'''stop'''(dir=None, force=False) -
    - Stop a locally installed I2P router, if it was started by
    - the current Python program.  If force is True, stop the
    - router even if it was started by another process.  Do nothing
    - if force is False and the router was started by another program.
    - 
    - The file 'router.config' is located using the same search
    - process used for find(dir).  It is parsed for
    - 'router.shutdownPassword' and 'router.adminPort'.  The
    - router is shut down through the admin port.
    - 
    - Raises i2p.RouterError if the I2P router is running but cannot
    - be stopped.  You must uncomment the
    - 'router.shutdownPassword' line for this command to work.
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.sam.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.sam.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.sam.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.sam.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ -Title: User's Guide:i2p.sam - -Module i2p.sam allows Python programs to access the [[SAM proxy]]. - -With this module, a program can send stream data, datagrams, and raw packets across the I2P network. - -== Sockets == - -'''socket'''(session, type, samaddr='127.0.0.1:7656', **kwargs) -
    - Create a new socket.  Argument session should be a session
    - name -- if the name has not yet been used, an I2P
    - Destination will be created for it, otherwise, the
    - existing Destination will be re-used.  An empty session
    - string causes a transient session to be created.  Argument
    - type is one of SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW.
    - 
    - I2P configuration keyword arguments:
    - 
    -   * in_depth  - depth of incoming tunnel (default 2)
    -   * out_depth - depth of outgoing tunnel (default 2)
    - 
    - A single session may be shared by more than one socket, if
    - the sockets are the same type, and if the sockets are
    - created within the same Python process.  The socket
    - objects are multithread-safe.
    - 
    - Examples:
    -   a = i2p.socket('Alice', i2p.SOCK_STREAM)
    -   b = i2p.socket('Bob',   i2p.SOCK_DGRAM, 
    -                  in_depth=2, out_depth=5)
    - 
    - The created object behaves identically to a socket from
    - module socket, with the following exceptions:
    - 
    -   * I2P Destinations are used as address arguments [1].
    -   * bind is a no-op: sockets are always bound.
    -   * send* methods send all data and are non-blocking.
    - 
    - A given session name can only be open in a single Python
    - program at a time.  If you need to overcome this
    - limitation, consider patching I2P.
    - 
    - [1]. Alternatively, a host name can be used as an address.
    -      It will be resolved using hosts.txt.
    - 
    - For details on how to use socket objects, see
    - http://www.python.org/doc/current/lib/socket-objects.html
    - 
    - See the examples directory for code examples.
    -
-'''socket()''' object properties: -
    - dest - Local I2P Destination of socket - session - Session name - type - Socket type: SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW. -
-'''poll'''() -
    - Returns a polling object. Works on SAM sockets and Python sockets. - See [http://www.python.org/doc/current/lib/module-select.html select.poll()] in the Python library for more information. -
- -'''resolve'''(host, samaddr='127.0.0.1:7656') -
    - Resolve I2P host name --> I2P Destination. - Returns the same string if host is already a Destination. -
- -'''select'''(readlist, writelist, errlist, timeout=None) -
    - Performs a select call. Works on SAM sockets and Python sockets. - See [http://www.python.org/doc/current/lib/module-select.html select.select()] in the Python library for more information. -
- -== Tunnels == - -Tunnels allow stream sockets to be joined, so that connections to a listening socket are relayed to one or more sending sockets. This allows an ordinary web server to be exposed as an I2P Destination, or an I2P Destination to be bound as a local port, and so on. - -class '''Tunnel'''(self, receive, make_send, nconnect=-1, timeout=60.0) -
    - A Tunnel relays connections from a 'receive' socket to one
    - or more 'send' sockets.  The receive socket must be bound
    - and listening.  For each incoming connection, a new send
    - socket is created by calling make_send().  Data is then
    - exchanged between the created streams until one socket is
    - closed.  nconnect is the maximum number of simultaneous
    - connections (-1 for infinite), and timeout is the time that
    - a single connection can last for (None allows a connection
    - to last forever).
    - 
    - Sockets must accept stream traffic and support the Python
    - socket interface.  A separate daemonic thread is created to
    - manage the tunnel.  For high performance, make_send() should
    - make a socket and connect in non-blocking mode (you should
    - catch and discard the sam.BlockError or socket.error due to
    - executing connect on a non-blocking socket).
    - 
    - Security Note:
    - A firewall is needed to maintain the end user's anonymity.
    - An attacker could keep a tunnel socket open by pinging it
    - regularly.  The accepted sockets from 'receive' must prevent
    - this by closing down eventually.
    - 
    - Socket errors do not cause the Tunnel to shut down.
    -
- -'''close'''() -
    - Close all connections made for this tunnel. -
- -=== Tunnel Server === - -class '''TunnelServer'''(session, port, samaddr='127.0.0.1:7656', nconnect=-1, timeout=None, **kwargs) -
    - Tunnels incoming SAM streams --> localhost:port.
    - 
    - nconnect and timeout are the maximum number of connections
    - and maximum time per connection.  All other arguments are
    - passed to sam.socket().  This call blocks until the tunnel
    - is ready.
    -
- -'''TunnelServer''' properties: -
    - dest       - I2P Destination of server. 
    - session    - Session name for server.
    -
- -=== Tunnel Client === - -class '''TunnelClient'''(session, port, dest, samaddr='127.0.0.1:7656', nconnect=-1, timeout=None, **kwargs) -
    - Derived from Tunnel.
    - Tunnels localhost:port --> I2P Destination dest.
    - 
    - A session named 'session' is created locally, for purposes
    - of routing to 'dest'.  nconnect and timeout are the maximum
    - number of connections and maximum time per connection.  All
    - other arguments are passed to sam.socket().  This call blocks
    - until the tunnel is ready.
    -
- -'''TunnelClient''' properties: -
    - dest       - Local Destination used for routing.
    - remotedest - Remote Destination.
    - session    - Session name for local Destination.
    -
- -== Errors == - -class '''Error'''(i2p.Error) -
    - Base class for all SAM errors.
    -
-class '''BlockError'''(Error) -
    - Socket call would have blocked.
    -
-class '''ClosedError'''(Error) -
    - A command was used on a socket that closed gracefully.
    -
-class '''NetworkError'''(Error) -
    - Network error occurred within I2P.
    -
    - The error object is a 2-tuple: (errtag, errdesc).
    - errtag is a SAM error string,
    - errdesc is a human readable error description. 
    -
- -== Constants == - -'''Socket types''' -
    - SOCK_STREAM = 1
    - SOCK_DGRAM = 2
    - SOCK_RAW = 3
    -
-'''Packet sizes''' -
    - MAX_DGRAM = 31744        # Maximum size for datagram packet
    - MAX_RAW = 32768          # Maximum size for raw packet
    -
-'''Flags for recv()''' -
    - MSG_DONTWAIT = 128       # Don't block 
    - MSG_PEEK = 2             # Peek at incoming data
    - MSG_WAITALL = 64         # Wait for all data or error
    -
-'''Polling flags''' -
    - POLLIN = 1
    - POLLOUT = 4
    - POLLERR = 8
    - POLLHUP = 16
    - POLLNVAL = 32
    - POLLPRI = 1
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.select.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.select.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.select.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.select.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Title: User's Guide:i2p.select - -Module i2p.select emulates the Python module select. - -With this module, a program can perform select and poll commands on traditional and I2P sockets. - -'''poll'''() -
    - Returns a polling object. Works on SAM sockets and Python sockets. - See [http://www.python.org/doc/current/lib/module-select.html select.poll()] in the Python library for more information. -
- -'''select'''(readlist, writelist, errlist, timeout=None) -
    - Performs a select call. Works on SAM sockets and Python sockets. - See [http://www.python.org/doc/current/lib/module-select.html select.select()] in the Python library for more information. -
- -'''Polling flags''' -
    - POLLIN = 1
    - POLLOUT = 4
    - POLLERR = 8
    - POLLHUP = 16
    - POLLNVAL = 32
    - POLLPRI = 1
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.SimpleHTTPServer.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.SimpleHTTPServer.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.SimpleHTTPServer.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.SimpleHTTPServer.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -Title: User's Guide:i2p.SimpleHTTPServer - -Emulates Python SimpleHTTPServer module using I2P sockets. - -== Overview == - -The Python module is described at http://www.python.org/doc/current/lib/module-SimpleHTTPServer.html - -To get a server going, use: - -
    ->>> from i2p import SimpleHTTPServer
    ->>> SimpleHTTPServer.test().
    -
- -Consult the documentation for function test() to change basic server settings, such as the session name. - -A fully customizable example: - -
    ->>> from i2p import BaseHTTPServer, SimpleHTTPServer
    ->>> session = "mytestxxx.i2p"      # SAM session name
    ->>> class MyServer(BaseHTTPServer.HTTPServer): pass
    ->>> class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): pass
    ->>> httpd = MyServer(session, MyRequestHandler)
    ->>> httpd.socket.dest
    -(Base64 Destination of server)
    ->>> httpd.serve_forever()
    -
- -== Classes == - -class '''SimpleHTTPRequestHandler''' -
    -Same interface as Python class SimpleHTTPServer.SimpleHTTPRequestHandler.
    -
- -== Functions == - -'''test'''(HandlerClass=SimpleHTTPRequestHandler, ServerClass= i2p.BaseHTTPServer.HTTPServer, session='mytestxxx.i2p') -
    -Test the HTTP simple request handler class.
    -This runs an I2P TCP server under SAM session 'session'. If a single command 
    -line argument is given, the argument is used instead as the SAM session name.
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.SocketServer.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.SocketServer.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.SocketServer.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.SocketServer.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -Title: User's Guide:i2p.SocketServer - -Emulates Python SocketServer module using I2P sockets. - -The Python module is described at http://www.python.org/doc/current/lib/module-SocketServer.html - -== Classes == - -
    -BaseRequestHandler  	 
    -BaseServer 	 
    -DatagramRequestHandler 	 
    -ForkingMixIn 	 
    -ForkingTCPServer 	 
    -ForkingUDPServer 	 
    -StreamRequestHandler 	 
    -TCPServer 	 
    -ThreadingMixIn 	 
    -ThreadingTCPServer 	 
    -ThreadingUDPServer 	 
    -UDPServer
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.socket.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.socket.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.socket.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.socket.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,276 +0,0 @@ -Title: User's Guide:i2p.socket - -Module i2p.socket allows Python programs to access the [[SAM proxy]]. It emulates the Python module socket. - -With this module, a program can send stream data, datagrams, and raw packets across the I2P network. - -== Sockets == - -class '''socket'''(session, type, samaddr='127.0.0.1:7656', **kwargs) -
    - Create a new socket.  Argument session should be a session
    - name -- if the name has not yet been used, an I2P
    - Destination will be created for it, otherwise, the
    - existing Destination will be re-used.  An empty session
    - string causes a transient session to be created.  Argument
    - type is one of SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW.
    - 
    - I2P configuration keyword arguments:
    - 
    -   - in_depth  - depth of incoming tunnel (default 2)
    -   - out_depth - depth of outgoing tunnel (default 2)
    - 
    - A single session may be shared by more than one socket, if
    - the sockets are the same type, and if the sockets are
    - created within the same Python process.  The socket
    - objects are multithread-safe.
    - 
    - Examples:
    -   >>> a = i2p.socket('Alice', i2p.SOCK_STREAM)
    -   >>> b = i2p.socket('Bob',   i2p.SOCK_DGRAM, 
    -                      in_depth=2, out_depth=5)
    - 
    - The created object behaves identically to a socket from
    - module socket, with the following exceptions:
    - 
    -   * I2P Destinations are used as address arguments [1].
    -   * bind is a no-op: sockets are always bound.
    -   * send* methods send all data and are non-blocking.
    - 
    - A given session name can only be open in a single Python
    - program at a time.  If you need to overcome this
    - limitation, consider patching I2P.
    - 
    - [1]. Alternatively, a host name can be used as an address.
    -      It will be resolved using hosts.txt.
    -
    - For details on how to use socket objects, see - http://www.python.org/doc/current/lib/socket-objects.html - - See the examples directory for code examples. -
-The class socket defines the following properties: -
    - dest - Local I2P Destination of socket - session - Session name - type - Socket type: SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW. -
- -The class socket defines the following methods: - -'''accept'''(self) -
    - Accept an incoming connection. The socket must be type SOCK_STREAM, and 
    - listen() must be called prior to this command. The return value is (conn, 
    - remotedest), where conn is a new socket object made for the connection, and 
    - remotedest is the remote Destination from which the connection was made.
    -
    - Example:
    -
    -  >>> from i2p import socket
    -  >>> s = socket.socket('Alice', socket.SOCK_STREAM)
    -  >>> s.listen(10)
    -
    - This prepares the server. Now accept an incoming connection:
    -
    -  >>> c, remotedest = s.accept()
    -  >>> c.send('hello world!')
    -
    - If accept() is called on a socket that is in non-blocking mode or has a  
    - timeout, i2p.socket.BlockError or i2p.socket.Timeout may be raised. This 
    - indicates that no incoming connection is currently available.
    -
-'''bind'''(self, address) -
    - Does nothing. Provided for compatibility with the Python socket command
    - bind(), which binds a server to a port.
    -
-'''close'''(self) -
    - Closes the socket. It is an error to call any method other than recv() or
    - recvfrom() on a closed socket. For streams, the receive methods return data
    - that was received prior to the closing of the socket. For datagram and raw
    - sockets, the receive methods cannot be used on a closed socket.
    -
-'''connect'''(self, address) -
    - Connect to a remote dest, identified in local SAM bridge's hosts file as host 
    - 'address'.
    -
    - For example:
    -
    - >>> s.connect('duck.i2p')
    -
    - Alternatively, you can use a full base64 Destination:
    - Example:
    -
    - >>> s.connect('238797sdfh2k34kjh....AAAA')
    -
    - If connect() is called on a socket that is in non-blocking mode or has a
    - timeout, i2p.socket.BlockError or i2p.socket.Timeout may be raised. This
    - indicates that the connection is still being initiated. Use i2p.select.select()
    - to determine when the connection is ready.
    -
-'''connect_ex'''(self, address) -
    - Like connect(), but return any error that is raised. Returns None if no error
    - is raised.
    -
-'''getpeername'''(self) -
    - Get the remote Destination associated with the socket. This is equivalent to 
    - s.remotedest, and is provided for compatibility with the Python socket module.
    -
-'''getsockname'''(self) -
    - Get the local Destination associated with the socket. This is equivalent to
    - s.dest, and is provided for compatibility with the Python socket module.
    -
-'''gettimeout'''(self) -
    - Get the timeout value.
    -
-'''listen'''(self, backlog) -
    - Listen for connections made to the socket. This method must be called before 
    - accept(). The backlog argument specifies the maximum number of queued incoming 
    - connections.
    -
-'''makefile'''(self, mode='r', bufsize=-1) -
    - Return a file object for the socket. See socket.makefile() in the Python 
    - documentation for more information.
    -
-'''recv'''(self, bufsize, flags=0) -
    - Receive string data from the socket.
    -
    - The maximum amount of data to be received is given by bufsize. If bufsize is 
    - zero, this function returns an empty string immediately. If bufsize is nonzero,
    - this function blocks until at least one character is available for reading. If 
    - the socket has been closed, an empty string is returned as an end of file  
    - indicator.
    -
    - If recv() is called on a socket that is in non-blocking mode or has a timeout, 
    - i2p.socket.BlockError or i2p.socket.Timeout will be raised if data is not 
    - available within the given timeframe.
    -
    - For a datagram or raw socket, the first bufsize characters of the packet are 
    - read, and the remainder of the packet is discarded. To read the entire packet, 
    - use bufsize = -1.
    -
    - For datagram and raw sockets, the packet may originate from any Destination. 
    - Use recvfrom() with datagrams to determine the Destination from which the 
    - packet was received.
    -
    - The flags argument can be a bitwise OR of MSG_PEEK, MSG_WAITALL, and/or 
    - MSG_DONTWAIT. MSG_PEEK indicates that any data read should not be removed from 
    - the socket's incoming buffer. MSG_WAITALL indicates to wait for exactly bufsize
    - characters or an error. MSG_DONTWAIT indicates that the recv() command should 
    - not block execution.
    -
-'''recvfrom'''(self, bufsize, flags=0) -
    - Like recv(), but returns a tuple (data, remoteaddr), where data is the string 
    - data received, and remoteaddr is the remote Destination.
    -
-'''send'''(self, string, flags=0) -
    - Sends string data to a remote Destination.
    -
    - For a stream, connect() must be called prior to send(). Once close() is called, 
    - no further data can be sent, and the stream cannot be re-opened.
    -
    - For datagram and raw sockets, connect() only specifies a Destination to which 
    - packets are sent to. send() will then send a packet to the given Destination. 
    - connect() can be used multiple times.
    -
    - The send() command never blocks execution. The flags argument is ignored.
    -
-'''sendall'''(self, string, flags=0) -
    - Identical to send().
    -
-'''sendto'''(self, string, flags, address) -
    - Send a packet to the given Destination.
    -
    - Only valid for datagram and raw sockets. The address argument should be either 
    - a name from the hosts file, or a base64 Destination.
    -
    - The sendto() command never blocks execution. The flags argument is ignored.
    -
-'''setblocking'''(self, flag) -
    - Set blocking or non-blocking mode for the socket.
    -
    - If flag is True, any method called on the socket will hang until the method has
    - completed. If flag is False, all methods will raise i2p.socket.BlockError() if
    - they cannot complete instantly.
    -
    - s.setblocking(False) is equivalent to s.settimeout(0); s.setblocking(True) is 
    - equivalent to s.settimeout(None).
    -
-'''settimeout'''(self, value) -
    - Set a timeout for the socket.
    -
    - The value argument should be a timeout value in seconds, or None. None is 
    - equivalent to an infinite timeout.
    -
    - A socket operation will raise a i2p.socket.Timeout if the operation cannot 
    - complete within in the specified time limit.
    -
- -== Functions == - -Functions defined in module i2p.socket: - -'''resolve'''(host, samaddr='127.0.0.1:7656') -
    - Resolve I2P host name --> I2P Destination. - Returns the same string if host is already a Destination. -
- -== Errors == - -class '''Error'''(i2p.Error) -
    - Base class for all SAM errors.
    -
-class '''BlockError'''(Error) -
    - Socket call would have blocked.
    -
-class '''ClosedError'''(Error) -
    - A command was used on a socket that closed gracefully.
    -
-class '''NetworkError'''(Error) -
    - Network error occurred within I2P.
    -
    - The error object is a 2-tuple: (errtag, errdesc).
    - errtag is a SAM error string,
    - errdesc is a human readable error description. 
    -
- -== Constants == - -'''Socket types''' -
    - SOCK_STREAM = 1
    - SOCK_DGRAM = 2
    - SOCK_RAW = 3
    -
-'''Packet sizes''' -
    - MAX_DGRAM = 31744        # Maximum size for datagram packet
    - MAX_RAW = 32768          # Maximum size for raw packet
    -
-'''Flags for recv()''' -
    - MSG_DONTWAIT = 128       # Don't block 
    - MSG_PEEK = 2             # Peek at incoming data
    - MSG_WAITALL = 64         # Wait for all data or error
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.tunnel.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.tunnel.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.tunnel.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.tunnel.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -Title: User's Guide:i2p.tunnel - -Module i2p.tunnel allows data to be exchanged between traditional TCP sockets and I2P sockets. - -== Tunnels == - -Tunnels allow stream sockets to be joined, so that connections to a listening socket are relayed to one or more sending sockets. This allows an ordinary web server to be exposed as an I2P Destination, or an I2P Destination to be bound as a local port, and so on. - -class '''Tunnel'''(self, receive, make_send, nconnect=-1, timeout=60.0) -
    - A Tunnel relays connections from a 'receive' socket to one
    - or more 'send' sockets.  The receive socket must be bound
    - and listening.  For each incoming connection, a new send
    - socket is created by calling make_send().  Data is then
    - exchanged between the created streams until one socket is
    - closed.  nconnect is the maximum number of simultaneous
    - connections (-1 for infinite), and timeout is the time that
    - a single connection can last for (None allows a connection
    - to last forever).
    - 
    - Sockets must accept stream traffic and support the Python
    - socket interface.  A separate daemonic thread is created to
    - manage the tunnel.  For high performance, make_send() should
    - make a socket and connect in non-blocking mode (you should
    - catch and discard the i2p.socket.BlockError or socket.error due to
    - executing connect on a non-blocking socket).
    - 
    - Security Note:
    - A firewall is needed to maintain the end user's anonymity.
    - An attacker could keep a tunnel socket open by pinging it
    - regularly.  The accepted sockets from 'receive' must prevent
    - this by closing down eventually.
    - 
    - Socket errors do not cause the Tunnel to shut down.
    -
- -'''close'''() -
    - Close all connections made for this tunnel. -
- -=== Tunnel Server === - -class '''TunnelServer'''(session, port, samaddr='127.0.0.1:7656', nconnect=-1, timeout=None, **kwargs) -
    - Tunnels incoming SAM streams --> localhost:port.
    - 
    - nconnect and timeout are the maximum number of connections
    - and maximum time per connection.  All other arguments are
    - passed to i2p.socket.socket().  This call blocks until the
    - tunnel is ready.
    -
- -'''TunnelServer''' properties: -
    - dest       - I2P Destination of server. 
    - session    - Session name for server.
    -
- -=== Tunnel Client === - -class '''TunnelClient'''(session, port, dest, samaddr='127.0.0.1:7656', nconnect=-1, timeout=None, **kwargs) -
    - Derived from Tunnel.
    - Tunnels localhost:port --> I2P Destination dest.
    - 
    - A session named 'session' is created locally, for purposes
    - of routing to 'dest'.  nconnect and timeout are the maximum
    - number of connections and maximum time per connection.  All
    - other arguments are passed to i2p.socket.socket().  This call
    - blocks until the tunnel is ready.
    -
- -'''TunnelClient''' properties: -
    - dest       - Local Destination used for routing.
    - remotedest - Remote Destination.
    - session    - Session name for local Destination.
    -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/i2p.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/i2p.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -Title: User's Guide:i2p - -Package i2p is a container package for more specific modules. - -It contains the following modules: - -
    - [[:User's Guide:i2p.BaseHTTPServer|i2p.BaseHTTPServer]] (Emulate Python BaseHTTPServer module) - [[:User's Guide:i2p.CGIHTTPServer|i2p.CGIHTTPServer]] (Emulate Python CGIHTTPServer module) - [[:User's Guide:i2p.eep|i2p.eep]] (Retrieve eepsites) - [[:User's Guide:i2p.router|i2p.router]] (Manage the I2P router) - [[:User's Guide:i2p.select|i2p.select]] (Emulate Python select module) - [[:User's Guide:i2p.SimpleHTTPServer|i2p.SimpleHTTPServer]] (Emulate Python SimpleHTTPServer module) - [[:User's Guide:i2p.socket|i2p.socket]] (Send and receive across the I2P network) - [[:User's Guide:i2p.SocketServer|i2p.SocketServer]] (Emulate Python SocketServer module) - [[:User's Guide:i2p.tunnel|i2p.tunnel]] (Exchange data between I2P and regular sockets) -
-class '''Error'''(Exception): -
    - Base class for all I2P errors. -
- -class '''RouterError'''(Error): -
    - Could not connect to router. -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/index.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/index.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/index.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/index.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -Title: Main Page - -'''Python-I2P''' is a Python interface to [http://www.i2p.net I2P]. - -== Quick Start == - -Install: - -
    -python setup.py install
    -
- -Use: - -
    ->>> from i2p import socket
    ->>> s = socket.socket('Alice', socket.SOCK_STREAM)
    ->>> s.connect('duck.i2p')
    ->>> s.send('GET / HTTP/1.0\r\n\r\n')
    ->>> s.recv(1000)
    -(HTTP response from duck.i2p)
    -
- -See the src/examples/ directory for more code examples. - -== User's Guide == - -The following modules are available: - -
    - [[:User's Guide:i2p|i2p]] (Container package) - [[:User's Guide:i2p.BaseHTTPServer|i2p.BaseHTTPServer]] (Emulate Python BaseHTTPServer module) - [[:User's Guide:i2p.CGIHTTPServer|i2p.CGIHTTPServer]] (Emulate Python CGIHTTPServer module) - [[:User's Guide:i2p.eep|i2p.eep]] (Retrieve eepsites) - [[:User's Guide:i2p.router|i2p.router]] (Manage the I2P router) - [[:User's Guide:i2p.select|i2p.select]] (Emulate Python select module) - [[:User's Guide:i2p.SimpleHTTPServer|i2p.SimpleHTTPServer]] (Emulate Python SimpleHTTPServer module) - [[:User's Guide:i2p.socket|i2p.socket]] (Send and receive across the I2P network) - [[:User's Guide:i2p.SocketServer|i2p.SocketServer]] (Emulate Python SocketServer module) - [[:User's Guide:i2p.tunnel|i2p.tunnel]] (Exchange data between I2P and regular sockets) -
diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/readme.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/readme.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/readme.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/readme.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ - -The documentation was created by using MediaWiki software. - -This directory houses the wiki text sources. - -Feel free to move to any other documentation system, if -it is efficient and easy to maintain. - -Do not use the Monobook skin, as it is Copyrighted. - -------------------------------------------------------- - -The documentation made by epydoc is pretty nice. - -Ideally, one could patch epydoc to use a more condensed -2-column format (where there are fewer pages, and it is -easier to read). - -With a little work on the output, epydoc could then be -used solely for documenting this project. - -Note that the docs produced by epydoc are huge. diff -Nru i2p-0.9.49/apps/sam/python/doc/guide/wiki/samproxy.txt i2p-0.9.50/apps/sam/python/doc/guide/wiki/samproxy.txt --- i2p-0.9.49/apps/sam/python/doc/guide/wiki/samproxy.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/guide/wiki/samproxy.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -Title: SAM proxy - -A '''SAM proxy''' is run by the I2P router. The proxy allows streams, datagrams, and raw packets to be sent through the I2P network. A client application uses a telnet-like session to communicate with the proxy. In this way, the core features of the I2P library can be used by any language. - -The protocol used for SAM is described in [http://dev.i2p.net/pipermail/i2p/2004-July/000353.html SAM 1.0]. - -In practice, a ''SAM library'' is usually written, so that client applications do not need to use the low-level SAM commands. diff -Nru i2p-0.9.49/apps/sam/python/doc/index.html i2p-0.9.50/apps/sam/python/doc/index.html --- i2p-0.9.49/apps/sam/python/doc/index.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/doc/index.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ - - - -

Python-I2P

- -Documentation: - - - -How to build epydoc documentation: - -
    -
  • Install epydoc. -
  • Run makedoc.py in apps/sam/python/doc/epydoc/ -
- - - \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/readme.txt i2p-0.9.50/apps/sam/python/readme.txt --- i2p-0.9.49/apps/sam/python/readme.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/readme.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ - ----------------------------------------- -Python-I2P v0.91 ----------------------------------------- - -Python-I2P is a Python interface to I2P. - -All files in this directory and subdirectories -have been placed in the public domain. - ----------------------------------------- -Quick Start ----------------------------------------- - -Install: - - python setup.py install - -Use: - - >>> from i2p import socket - >>> s = socket.socket('Alice', socket.SOCK_STREAM) - >>> s.connect('duck.i2p') - >>> s.send('GET / HTTP/1.0\r\n\r\n') - >>> s.recv(1000) - (Response from duck.i2p) - -See the src/examples/ directory for more code examples. - ----------------------------------------- -Full Start ----------------------------------------- - -See the docs directory for HTML documentation. diff -Nru i2p-0.9.49/apps/sam/python/setup.py i2p-0.9.50/apps/sam/python/setup.py --- i2p-0.9.49/apps/sam/python/setup.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/setup.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#! /usr/bin/env python - -from distutils.core import setup -import os, sys - -os.chdir('./src') - -setup(name="Python I2P API", - version="0.91", - description="Python Interface to I2P", - author="Connelly Barnes", - author_email="'Y29ubmVsbHliYXJuZXNAeWFob28uY29t\n'.decode('base64')", - url="http://www.i2p.net/", - packages=['i2p', 'i2p.pylib'], - ) diff -Nru i2p-0.9.49/apps/sam/python/src/examples/cgi_server.py i2p-0.9.50/apps/sam/python/src/examples/cgi_server.py --- i2p-0.9.49/apps/sam/python/src/examples/cgi_server.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/cgi_server.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# cgi_server.py: Simple CGI server -# ----------------------------------------------- - -myServerSession = "mytestxxx.i2p" - -from i2p import BaseHTTPServer, CGIHTTPServer - -class MyServer(BaseHTTPServer.HTTPServer): - pass - -class MyRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): - pass - -def runServer(): - - httpd = MyServer(myServerSession, MyRequestHandler) - print "MyServer: local SAM session = %s" % myServerSession - print "MyServer: dest = %s" % httpd.socket.dest - httpd.serve_forever() - -if __name__ == '__main__': - runServer() - diff -Nru i2p-0.9.49/apps/sam/python/src/examples/datagram_noblock.py i2p-0.9.50/apps/sam/python/src/examples/datagram_noblock.py --- i2p-0.9.49/apps/sam/python/src/examples/datagram_noblock.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/datagram_noblock.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#! /usr/bin/env python - -# --------------------------------------------------- -# datagram_noblock.py: Non-blocking datagram server -# --------------------------------------------------- - -from i2p import socket -import time - -S = socket.socket('Eve', socket.SOCK_DGRAM) -print 'Serving at:', S.dest -S.setblocking(False) - -while True: - try: - (data, dest) = S.recvfrom(1000) # Read packet - print 'Got', data, 'from', dest - S.sendto('Hi client!', 0, dest) - except socket.BlockError: # No data available - pass - time.sleep(0.01) # Reduce CPU usage diff -Nru i2p-0.9.49/apps/sam/python/src/examples/datagram.py i2p-0.9.50/apps/sam/python/src/examples/datagram.py --- i2p-0.9.49/apps/sam/python/src/examples/datagram.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/datagram.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# datagram.py: Datagram client -# ----------------------------------------------- - -from i2p import socket - -print 'Sending a packet to yourserver.i2p...' - -dest = socket.resolve('yourserver.i2p') -S = socket.socket('Bob', socket.SOCK_DGRAM) -S.sendto('Hello packet', 0, dest) - -# Get packet up to 1000 bytes -- the rest is discarded. -(data, dest) = S.recvfrom(1000) - -print data diff -Nru i2p-0.9.49/apps/sam/python/src/examples/datagram_server.py i2p-0.9.50/apps/sam/python/src/examples/datagram_server.py --- i2p-0.9.49/apps/sam/python/src/examples/datagram_server.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/datagram_server.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# datagram_server.py: Datagram server -# ----------------------------------------------- - -from i2p import socket - -S = socket.socket('Eve', socket.SOCK_DGRAM) -print 'Serving at:', S.dest - -while True: - (data, dest) = S.recvfrom(1000) # Read packet - print 'Got', data, 'from', dest - S.sendto('Hi client!', 0, dest) diff -Nru i2p-0.9.49/apps/sam/python/src/examples/dos.py i2p-0.9.50/apps/sam/python/src/examples/dos.py --- i2p-0.9.49/apps/sam/python/src/examples/dos.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/dos.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# dos.py: Noneffective denial of service tool -# ----------------------------------------------- - -from i2p import socket -import threading, sys - -def dos_stream(dest): - """Perform a DOS attack on a stream server.""" - dest = socket.resolve(dest) - - # DOS code, runs in n separate threads. - def f(): - while True: - S = socket.socket(dest, socket.SOCK_STREAM) - S.connect(dest) - S.send('GET / HTTP/1.0\r\n\r\n') - S.close() - - # Start up the threads. - for i in range(128): - T = threading.Thread(target=f) - T.start() - -def syntax(): - print "Usage: python dos.py Destination" - -if __name__ == '__main__': - if len(sys.argv) == 2: - dos_stream(sys.argv[1]) - else: - syntax() diff -Nru i2p-0.9.49/apps/sam/python/src/examples/examples.txt i2p-0.9.50/apps/sam/python/src/examples/examples.txt --- i2p-0.9.49/apps/sam/python/src/examples/examples.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/examples.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - -Examples: - -cgi_server.py - Example of CGIHTTPServer -datagram.py - Datagram client -datagram_noblock.py - Non-blocking datagram server -datagram_server.py - Blocking datagram server -dos.py - Denial of service tool -raw.py - Raw client -raw_noblock.py - Non-blocking raw server -raw_server.py - Raw server -stream.py - Stream client -stream_eepget.py - Get an eepsite using sockets -stream_noblock.py - Non-blocking stream server -stream_server.py - Blocking stream server diff -Nru i2p-0.9.49/apps/sam/python/src/examples/raw_noblock.py i2p-0.9.50/apps/sam/python/src/examples/raw_noblock.py --- i2p-0.9.49/apps/sam/python/src/examples/raw_noblock.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/raw_noblock.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -#! /usr/bin/env python - -# --------------------------------------------------- -# raw_noblock.py: Non-blocking raw server -# --------------------------------------------------- - -from i2p import socket -import time - -S = socket.socket('Eve', socket.SOCK_RAW) -print 'Serving at:', S.dest -S.setblocking(False) - -while True: - try: - data = S.recv(1000) # Read packet - print 'Got', data - except socket.BlockError: # No data available - pass - time.sleep(0.01) # Reduce CPU usage \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/src/examples/raw.py i2p-0.9.50/apps/sam/python/src/examples/raw.py --- i2p-0.9.49/apps/sam/python/src/examples/raw.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/raw.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# raw.py: Raw client -# ----------------------------------------------- - -from i2p import socket - -dest = socket.resolve('yourserver.i2p') # Send to dest -S = socket.socket('Carol', socket.SOCK_RAW) -S.sendto('Hello packet', 0, dest) diff -Nru i2p-0.9.49/apps/sam/python/src/examples/raw_server.py i2p-0.9.50/apps/sam/python/src/examples/raw_server.py --- i2p-0.9.49/apps/sam/python/src/examples/raw_server.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/raw_server.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# raw_server.py: Raw server -# ----------------------------------------------- - -from i2p import socket - -S = socket.socket('Eve', socket.SOCK_RAW) -print 'Serving at:', S.dest - -while True: - data = S.recv(1000) # Read packet - print 'Got', data diff -Nru i2p-0.9.49/apps/sam/python/src/examples/stream_eepget.py i2p-0.9.50/apps/sam/python/src/examples/stream_eepget.py --- i2p-0.9.49/apps/sam/python/src/examples/stream_eepget.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/stream_eepget.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# stream_eepget.py: Get an eepsite using sockets -# ----------------------------------------------- - -from i2p import socket - -S = socket.socket('Alice', socket.SOCK_STREAM) -S.connect('duck.i2p') -S.send('GET / HTTP/1.0\r\n\r\n') # Send request -f = S.makefile() # File object - -while True: # Read header - line = f.readline().strip() # Read a line - if line == '': break # Content begins - -print f.read() # Read file object diff -Nru i2p-0.9.49/apps/sam/python/src/examples/stream_noblock.py i2p-0.9.50/apps/sam/python/src/examples/stream_noblock.py --- i2p-0.9.49/apps/sam/python/src/examples/stream_noblock.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/stream_noblock.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# stream_noblock.py: Non-blocking stream server -# ----------------------------------------------- - -import i2p -from i2p import socket -import thread, time - -S = socket.socket('Dave', socket.SOCK_STREAM) -S.listen(10) # Queue up to 10 connections -S.setblocking(False) # Non-blocking -print 'Serving at:', S.dest - -def handle_connection(C): - """Handle a single connection in a thread of its own.""" - try: - f = C.makefile() # File object - req = f.readline() # Read HTTP request - - s = '

Hello!

' # String to send back - - f.write('HTTP/1.0 200 OK\r\nContent-Type: text/html' + - '\r\nContent-Length: ' + str(int(len(s))) + '\r\n\r\n' + s) - - f.close() # Close file - C.close() # Close connection - except socket.Error, e: - # Recover from socket errors - print 'Warning:', str(e) - -while True: - try: - (C, remotedest) = S.accept() # Get a connection - thread.start_new_thread(handle_connection, (C,)) - except socket.BlockError: - # Ignore 'command would have blocked' errors - pass - time.sleep(0.01) # Reduce CPU usage \ No newline at end of file diff -Nru i2p-0.9.49/apps/sam/python/src/examples/stream.py i2p-0.9.50/apps/sam/python/src/examples/stream.py --- i2p-0.9.49/apps/sam/python/src/examples/stream.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/stream.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# stream.py: Simple stream client -# ----------------------------------------------- - -from i2p import socket - -S = socket.socket('Alice', socket.SOCK_STREAM) -S.connect('duck.i2p') -S.send('GET / HTTP/1.0\r\n\r\n') # Send request -print S.recv(1000) # Read up to 1000 bytes diff -Nru i2p-0.9.49/apps/sam/python/src/examples/stream_server.py i2p-0.9.50/apps/sam/python/src/examples/stream_server.py --- i2p-0.9.49/apps/sam/python/src/examples/stream_server.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/stream_server.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -#! /usr/bin/env python - -# ----------------------------------------------- -# stream_server.py: Simple stream server -# ----------------------------------------------- - -import i2p -from i2p import socket - -S = socket.socket('Dave', socket.SOCK_STREAM) -S.listen(10) # Queue up to 10 connections -print 'Serving at:', S.dest - -while True: - try: - (C, remotedest) = S.accept() # Get a connection - f = C.makefile() # File object - req = f.readline() # Read HTTP request - - s = '

Hello!

' # String to send back - - f.write('HTTP/1.0 200 OK\r\nContent-Type: text/html' + - '\r\nContent-Length: ' + str(int(len(s))) + '\r\n\r\n' + s) - - f.close() # Close file - C.close() # Close connection - except socket.Error, e: - # Recover from socket errors - print 'Warning:', str(e) diff -Nru i2p-0.9.49/apps/sam/python/src/examples/win32/py2exe_demo.py i2p-0.9.50/apps/sam/python/src/examples/win32/py2exe_demo.py --- i2p-0.9.49/apps/sam/python/src/examples/win32/py2exe_demo.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/examples/win32/py2exe_demo.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -#! /usr/bin/env python - -# -------------------------------------------------- -# py2exe_demo.py: Sample setup script for py2exe -# -------------------------------------------------- - -""" -Sample setup script for py2exe. - -Use 'python py2exe_demo.py install' to build an exe. - -A zip archive of the distribution is about 630 KB -(Delete _ssl.pyd to save space). -""" - -from distutils.core import setup -import py2exe - -setup(console=["../stream_eepget.py"]) diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/BaseHTTPServer.py i2p-0.9.50/apps/sam/python/src/i2p/BaseHTTPServer.py --- i2p-0.9.49/apps/sam/python/src/i2p/BaseHTTPServer.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/BaseHTTPServer.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -#! /usr/bin/env python - -""" -Emulation of Python BaseHTTPServer module using I2P sockets. - -The Python module is described at -http://www.python.org/doc/current/lib/module-BaseHTTPServer.html - -To get a server going, use: - - >>> from i2p import BaseHTTPServer - >>> BaseHTTPServer.test(). - -Consult the documentation for function test() to change basic -server settings, such as the session name. - -A fully customizable example: - - >>> from i2p import BaseHTTPServer - >>> session = "mytestxxx.i2p" # SAM session name - >>> class MyServer(BaseHTTPServer.HTTPServer): pass - >>> class MyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): pass - >>> httpd = MyServer(session, MyRequestHandler) - >>> httpd.socket.dest - (Base64 Destination of server) - >>> httpd.serve_forever() - -""" - -# By aum. - -# Hack to keep Python from importing from current directory: -# Use pylib package, then use = signs instead of from x import y. -import pylib -BaseHTTPServer = pylib.BaseHTTPServer - -import sys -import i2p.SocketServer - -__version__ = "0.3" - -__all__ = ["HTTPServer", "BaseHTTPRequestHandler", "test"] - -DEFAULT_ERROR_MESSAGE = BaseHTTPServer.DEFAULT_ERROR_MESSAGE - -class HTTPServer(i2p.SocketServer.TCPServer, BaseHTTPServer.HTTPServer): - """ - Same interface as Python class - BaseHTTPServer.HTTPServer. - """ - -class BaseHTTPRequestHandler( - i2p.SocketServer.StreamRequestHandler, - BaseHTTPServer.BaseHTTPRequestHandler): - """ - Same interface as Python class - BaseHTTPServer.BaseHTTPRequestHandler. - """ - -def test(HandlerClass = BaseHTTPRequestHandler, - ServerClass = HTTPServer, protocol="HTTP/1.0", - session = "mytestxxx.i2p"): - """ - Test the HTTP request handler class. - - This runs an I2P TCP server under SAM session 'session'. - If a single command line argument is given, the argument is used - instead as the SAM session name. - """ - - if sys.argv[1:] and __name__ == '__main__': - session = sys.argv[1] - - HandlerClass.protocol_version = protocol - httpd = ServerClass(session, HandlerClass) - - print "Serving HTTP on", session, "..." - print "Destination follows:" - print httpd.socket.dest - httpd.serve_forever() - -if __name__ == '__main__': - test() diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/CGIHTTPServer.py i2p-0.9.50/apps/sam/python/src/i2p/CGIHTTPServer.py --- i2p-0.9.49/apps/sam/python/src/i2p/CGIHTTPServer.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/CGIHTTPServer.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -#! /usr/bin/env python - -""" -Emulation of Python CGIHTTPServer module using I2P sockets. - -The Python module is described at -http://www.python.org/doc/current/lib/module-CGIHTTPServer.html - -To get a server going, use: - - >>> from i2p import CGIHTTPServer - >>> CGIHTTPServer.test(). - -Consult the documentation for function test() to change basic -server settings, such as the session name. - -A fully customizable example: - - >>> from i2p import BaseHTTPServer, CGIHTTPServer - >>> session = "mytestxxx.i2p" # SAM session name - >>> class MyServer(BaseHTTPServer.HTTPServer): pass - >>> class MyRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): pass - >>> httpd = MyServer(session, MyRequestHandler) - >>> httpd.socket.dest - (Base64 Destination of server) - >>> httpd.serve_forever() - -""" - -# By aum. -__all__ = ["CGIHTTPRequestHandler", "test"] - -# Hack to keep Python from importing from current directory: -# Use pylib package, then use = signs instead of from x import y. -import pylib -CGIHTTPServer = pylib.CGIHTTPServer -nobody_uid = CGIHTTPServer.nobody_uid -executable = CGIHTTPServer.executable - -import sys -import i2p.BaseHTTPServer -import i2p.SimpleHTTPServer - -HTTPServer = i2p.BaseHTTPServer.HTTPServer -class CGIHTTPRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): - """ - Same interface as Python class - CGIHTTPServer.CGIHTTPRequestHandler. - """ - -def test(HandlerClass = CGIHTTPRequestHandler, - ServerClass = i2p.BaseHTTPServer.HTTPServer, - session = "mytestxxx.i2p"): - """ - Test the HTTP CGI request handler class. - - This runs an I2P TCP server under SAM session 'session'. - If a single command line argument is given, the argument is used - instead as the SAM session name. - """ - if sys.argv[1:] and __name__ == '__main__': - session = sys.argv[1] - - i2p.SimpleHTTPServer.test(HandlerClass, ServerClass, - session=session) - -if __name__ == '__main__': - test() - diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/eep.py i2p-0.9.50/apps/sam/python/src/i2p/eep.py --- i2p-0.9.49/apps/sam/python/src/i2p/eep.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/eep.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ - -# ------------------------------------------------------------- -# eep.py: Eeproxy access module -# ------------------------------------------------------------- - -""" -Eeproxy access module -""" - -import urllib2 - -eepaddr = '127.0.0.1:4444' # Default port for eeproxy - -# -------------------------------------------------- -# Functions -# -------------------------------------------------- - -def urlopen(url, eepaddr=eepaddr): - """Like urllib2.urlopen(url), but only works for eep-sites. - Example: f = urlopen('http://duck.i2p/index.html')""" - if url.find('http://') != 0: url = 'http://' + url - - # Handle I2P Destination - if len(url) >= 256: - suffix = url[len('http://'):] - if suffix[:4] != 'i2p/': url = 'http://i2p/' + suffix - - # Add trailing slash - if url.find('/', len('http://')) < 0: url = url + '/' - - # Remove http:// and trailing slash from eepaddr. - if eepaddr.find('http://') == 0: eepaddr = eepaddr[len('http://'):] - eepaddr = eepaddr.rstrip('/') - - proxy = urllib2.ProxyHandler( \ - {'http': 'http://' + eepaddr}) - opener = urllib2.build_opener(proxy, urllib2.HTTPHandler) - return opener.open(url) - -def urlget(url, eepaddr=eepaddr): - """Get contents of an eepsite. - Example: urlget('http://duck.i2p/').""" - f = urlopen(url, eepaddr=eepaddr) - ans = f.read() - f.close() - return ans diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/__init__.py i2p-0.9.50/apps/sam/python/src/i2p/__init__.py --- i2p-0.9.49/apps/sam/python/src/i2p/__init__.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -""" -i2p -- I2P Python interface -""" - -__all__ = [ - 'BaseHTTPServer', - 'CGIHTTPServer', - 'eep', - 'router', - 'select', - 'SimpleHTTPServer', - 'socket', - 'SocketServer', - 'tunnel', -] - -class Error(Exception): - """Base class for all I2P errors.""" - -class RouterError(Error): - """Could not connect to router.""" - diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/pylib/__init__.py i2p-0.9.50/apps/sam/python/src/i2p/pylib/__init__.py --- i2p-0.9.49/apps/sam/python/src/i2p/pylib/__init__.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/pylib/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ - -# ------------------------------------------------ -# Hack to import the Python library modules -# when names conflict in our package. -# ------------------------------------------------ - -import sys -sys.path.reverse() - -import socket -import select -import BaseHTTPServer -import SocketServer -import CGIHTTPServer -import SimpleHTTPServer - -sys.path.reverse() diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/router.py i2p-0.9.50/apps/sam/python/src/i2p/router.py --- i2p-0.9.49/apps/sam/python/src/i2p/router.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/router.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,185 +0,0 @@ - -# ------------------------------------------------------------- -# router.py: Router control module -# ------------------------------------------------------------- - -""" -Router control module -""" - -import i2p -import i2p.socket -import i2p.eep -from i2p.pylib import socket as pysocket # Import Python socket - -import os, sys -import os.path -import time -import threading -import urllib2 - -check_addrlist = [i2p.socket.samaddr, i2p.eep.eepaddr] - -router_config = 'router.config' # Router config filename - -# True if our Python program started the router -our_router = False -our_router_lock = threading.Lock() - - -def find(dir=None): - """Find the absolute path to a locally installed I2P router. - - An I2P installation is located by looking in the - the dir argument given to the function, then in the - environment I2P, then in PATH. It looks for startRouter.sh - or startRouter.bat. Raises ValueError if an I2P installation - could not be located. - """ - sep = os.pathsep # Path separator - L = [] - if dir != None and dir != '': L += dir.split(sep) - if 'I2P' in os.environ: L += os.environ['I2P'].split(sep) - if 'PATH' in os.environ: L += os.environ['PATH'].split(sep) - for dirname in L: - filename = os.path.join(dirname, 'startRouter.bat') - if os.path.exists(filename): - return dirname - filename = os.path.join(dirname, 'startRouter.sh') - if os.path.exists(filename): - return dirname - raise ValueError('I2P installation not found') - - -def check(dir=None): - """Checks whether a locally installed router is running. Does - nothing if successful, otherwise raises i2p.RouterError. - - An I2P installation is located by using find(dir). - The router.config file is parsed for 'router.adminPort'. - This port is queried to determine whether the router is - running. - """ - config = _parse_config(os.path.join(find(dir), router_config)) - port = config.get('router.adminPort', '') - try: - port = int(port) - except: - raise ValueError('router.adminPort missing or bad in ' + - router_config) - - try: - s = pysocket.socket(pysocket.AF_INET, pysocket.SOCK_STREAM) - s.connect(('127.0.0.1', port)) - s.close() - except pysocket.error: - raise i2p.RouterError('could not contact 127.0.0.1:' + str(port)) - -def _run_program(filename): - """Runs the given program in a new process and new terminal.""" - if sys.platform[:3] == 'win': - os.startfile(filename) - global our_router - our_router = True - else: - # Linux possibilities: - # sh -c command - # xterm -e command - # bash -c command - # Try os.spawnl() with the above. - raise ValueError('unimplemented') - -def start(dir=None, hidden=False): - """Start a locally installed I2P router. Does nothing if - the router has already been started. - - An I2P installation is located by using find(dir). - - If hidden is True, do not show a terminal for the router. - """ - routerdir = find(dir) - router = os.path.join(routerdir, 'startRouter.bat') - try: - check(dir) - return # Already running - except: - pass # Not yet running - - olddir = os.getcwd() - - if hidden: - raise ValueError('unimplemented') - - our_router_lock.acquire() - try: - os.chdir(routerdir) - try: - _run_program(router) - finally: - os.chdir(olddir) - finally: - our_router_lock.release() - - # Ideas for hidden=True: - # Parse startRouter.bat, and run same command with javaw - # on Windows to hide command box. - # Perhaps use javaw (?) or javaws (j2sdk1.4.2/jre/javaws/javaws) - # Perhaps /path-to/program 2>/dev/null 1>/dev/null& - -def _parse_config(filename): - """Return a dict with (name, value) items for the given I2P configuration file.""" - f = open(filename, 'r') - s = f.read() - f.close() - ans = {} - for line in s.split('\n'): - line = line.strip() - if '#' in line: line = line[:line.find('#')] - pair = line.split('=') - if len(pair) == 2: - ans[pair[0].strip()] = pair[1].strip() - return ans - -def stop(dir=None, force=False): - """Stop a locally installed I2P router, if it was started by - the current Python program. If force is True, stop the - router even if it was started by another process. Do nothing - if force is False and the router was started by another program. - - The file 'router.config' is located using the same search - process used for find(dir). It is parsed for - 'router.shutdownPassword' and 'router.adminPort'. The - router is shut down through the admin port. - - Raises i2p.RouterError if the I2P router is running but cannot - be stopped. You must uncomment the - 'router.shutdownPassword' line for this command to work. - """ - if force == False and our_router == False: - return - - config = _parse_config(os.path.join(find(dir), router_config)) - - password = config.get('router.shutdownPassword', '') - if password == '': - raise ValueError('router.shutdownPassword not found in ' + - router_config) - admin_port = config.get('router.adminPort', '') - if admin_port == '': - raise ValueError('router.adminPort not found in ' + router_config) - - try: - admin_port = int(admin_port) - except: - raise ValueError('invalid router.adminPort in ' + router_config) - - try: - sock = pysocket.socket(pysocket.AF_INET, pysocket.SOCK_STREAM) - sock.connect(('127.0.0.1', admin_port)) - sock.send('GET /shutdown?password=' + password + ' HTTP/1.0\r\n\r\n') - time.sleep(0.01) - sock.close() - except: - raise i2p.RouterError('router shutdown failed') - - # Assume shutdown succeeded (it will take 30 seconds). diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/samclasses.py i2p-0.9.50/apps/sam/python/src/i2p/samclasses.py --- i2p-0.9.49/apps/sam/python/src/i2p/samclasses.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/samclasses.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,773 +0,0 @@ - -# ------------------------------------------------------------- -# samclasses.py: Lower-level SAM classes, for internal use. -# ------------------------------------------------------------- - -""" -Lower-level SAM API, interfaces with SAM Bridge. - -For internal use only. - -Use the higher level i2p.socket module for your own programs. - -For details on SAM, see "Simple Anonymous Messaging (SAM) v1.0," -as published by jrandom. - -Class Overview: - - - SAMTerminal: Message sender/reader, talks to SAM Bridge. - - StringBuffer: Queue for character data. - - BaseSession: SAM session classes are derived from this. - - StreamSession: SAM stream session class, threadsafe, high level. - - DatagramSession: SAM datagram session, threadsafe, high level. - - RawSession: SAM raw session, threadsafe, high level. - -Note that a 'None' timeout is an infinite timeout: it -blocks forever if necessary. - -Todo: - - Error handling is a huge mess. Neaten it up. - Subclass a ErrorMixin class, then use set_error(e), - check_error(), get_error(). - - Streams are a huge mess. Neaten them up. - - This whole interface is a tad confusing. Neaten it up. -""" - -# --------------------------------------------------------- -# Imports -# --------------------------------------------------------- - -import Queue, traceback, random, sys, shlex -import thread, threading, time, string - -# --------------------------------------------------------- -# Import i2p and i2p.socket (for defaults and errors) -# --------------------------------------------------------- - -import i2p -import i2p.socket -from i2p.pylib import socket as pysocket # Import Python socket - -# --------------------------------------------------------- -# Functions -# --------------------------------------------------------- - -def sleep(): time.sleep(0.01) # Sleep between thread polls -def timer(): return time.time() # High resolution timer - # Do NOT use time.clock() as it - # drops sleep() time on Linux. - -log = False # Logging flag. Logs to ./log.txt. - -# ----------------------------------------------------- -# SAMTerminal -# ----------------------------------------------------- - -class SAMTerminal: - """Message-by-message communication with SAM through a single - pysocket. _on_* messages are dispatched to msgobj.""" - - def __init__(self, addr, msgobj): - try: self.host, self.port = addr.split(':') - except: raise ValueError('sam port required') - self.port = int(self.port) - self.sock=pysocket.socket(pysocket.AF_INET,pysocket.SOCK_STREAM) - self.msgobj = msgobj - try: - self.sock.connect((self.host, self.port)) - except: - raise i2p.RouterError('could not contact SAM bridge on ' + - self.host + ':' + str(self.port)) - thread.start_new_thread(self._poll_loop, ()) - self.error = None - self.lost_error = i2p.RouterError('SAM bridge connection lost') - - def _poll_loop(self): - """Polling loop for incoming messages.""" - try: - while True: - # Read until newline - line = [] - while True: - try: c = self.sock.recv(1) - except pysocket.error, ex: self.error = self.lost_error - if c == '': self.error = self.lost_error - if self.error != None: return - if c == '\n': break - if c != '': line += [c] - line = ''.join(line) - if log: - logf = open('log.txt', 'a') - logf.write('\n' + line + '\n') - logf.close() - (msg, kwargs) = self._samdecode(line) - # Read N bytes if SIZE=N is present. - if 'SIZE' in kwargs: - data = [] - remain = int(kwargs['SIZE']) - while True: - try: s = self.sock.recv(remain) - except pysocket.error, ex: self.error = self.lost_error - if s == '': self.error = self.lost_error - if self.error != None: return - if s != '': data += [s] - remain -= len(s) - if remain <= 0: break - data = ''.join(data) - # Store the read data in kwargs['DATA']. - kwargs['DATA'] = data - del kwargs['SIZE'] - # Dispatch the message - try: self.on_message(msg, kwargs) - except Exception, e: - # On exception in on_message, print a warning, keep going. - print 'Unhandled exception in polling thread.' - traceback.print_exc() - - # Don't need to sleep since recv() blocks. - # End of while loop - except Exception, e: - # For other exceptions, print a fatal error and stop polling. - print 'Fatal exception in polling thread' - traceback.print_exc(); sys.exit() - - def _samdecode(self, s): - """Given a SAM command, returns (a, b), where a is the string at - the beginning of the command, and b is a dictionary of name, - value pairs for the command.""" - (args, kwargs) = ([], {}) - for w in shlex.split(s): - if '=' in w: kwargs[w.split('=')[0]] = w.split('=')[1] - else: args += [w] - return (' '.join(args), kwargs) - - def check_message(self, kwargs): - """Raises an error if kwargs['RESULT'] != 'OK'.""" - if not kwargs.get('RESULT', '') in ['OK', '']: - raise i2p.socket.NetworkError((kwargs['RESULT'], - kwargs.get('MESSAGE', ''))) - - def on_message(self, msg, kwargs): - """Process a SAM message that was received. Dispatch to - self._on_MESSAGE_NAME(**kwargs).""" - name = '_on_' + msg.upper().replace(' ', '_') - getattr(self.msgobj, name)(**kwargs) - - def send_message(self, msg): - """Send a message to the SAM bridge. A newline will be - automatically added if none is present.""" - self.check() - if not '\n' in msg: msg = msg + '\n' - if log: - logf = open('log.txt', 'a') - logf.write('\n' + msg) - logf.close() - try: self.sock.sendall(msg) - except pysocket.error: self.error = self.lost_error - self.check() - - def check(self): - """Raise an error if terminal was closed, otherwise do - nothing.""" - if self.error != None: raise self.error - - def close(self): - """Close the SAM terminal.""" - # If data is sent via STREAM SEND, and the socket is closed - # immediately, the data will be lost. Delay 0.01 s to fix this - # bug (tested Windows, Linux). - time.sleep(0.01) - self.error = i2p.socket.ClosedError() - self.sock.close() - - def queue_get(self, q): - """Identical to q.get() unless a call to self.check() fails, - in which case the waiting is cut short with an error.""" - while True: - try: return q.get_nowait() - except Queue.Empty: pass - self.check() - sleep() - - -# ------------------------------------------------------- -# StringBuffer: A FIFO for string data. -# ------------------------------------------------------- - -class Deque: - """A double-ended queue.""" - def __init__(self): - self.a = [] - self.b = [] - def push_last(self, obj): - """Append obj to the end of the deque.""" - self.b.append(obj) - def push_first(self, obj): - """Prepend obj to the beginning of the deque.""" - self.a.append(obj) - def _partition(self): - if len(self) > 1: - self.a.reverse() - all = self.a + self.b - n = len(all) / 2 - self.a = all[:n] - self.b = all[n:] - self.a.reverse() - def pop_last(self): - """Pop an item off the end of the deque, and return it.""" - if not self.b: self._partition() - try: return self.b.pop() - except: return self.a.pop() - def pop_first(self): - """Pop an item off the beginning of the deque, and return it.""" - if not self.a: self._partition() - try: return self.a.pop() - except: return self.b.pop() - def __len__(self): - """Number of items in the deque.""" - return len(self.b) + len(self.a) - -class StringBuffer(Deque): - """A FIFO for characters. Strings can be efficiently - appended to the end, and read from the beginning. - - Example: - >>> B = StringBuffer('Hello W') - >>> B.append('orld!') - >>> B.read(5) - 'Hello' - >>> B.read() - 'World!' - """ - def __init__(self, s=''): - Deque.__init__(self) - self.length = 0 - self.append(s) - def append(self, s): - """Append string data to the end of the buffer.""" - n = 128 - for block in [s[i:i+n] for i in range(0,len(s),n)]: - self.push_last(block) - self.length += len(s) - def prepend(self, s): - """Prepend string data to the beginning of the buffer.""" - n = 128 - blocks = [s[i:i+n] for i in range(0,len(s),n)] - blocks.reverse() - for block in blocks: - self.push_first(block) - self.length += len(s) - def read(self, n=None): - """Read n bytes of data (or less if less data available) from the - beginning of the buffer. The data is removed. If n is - omitted, read the entire buffer.""" - if n == None or n > len(self): n = len(self) - destlen = len(self) - n - ans = [] - while len(self) > destlen: - ans += [self.pop_first()] - self.length -= len(ans[-1]) - ans = ''.join(ans) - self.prepend(ans[n:]) - ans = ans[:n] - return ans - def peek(self, n=None): - """Like read(), but do not remove the data that is returned.""" - ans = self.read(n) - self.prepend(ans) - return ans - def __len__(self): return self.length - def __str__(self): return self.peek() - def __repr__(self): return 'StringBuffer(' + str(self) + ')' - -# ----------------------------------------------------- -# BaseSession -# ----------------------------------------------------- - -class BaseSession: - """Base session, from which StreamSession, DatagramSession, - and RawSession are derived.""" - - def __init__(self, addr=''): - if addr == '': addr = i2p.socket.samaddr - self.term = SAMTerminal(addr=addr, msgobj=self) - self.lock = threading.Lock() # Data lock. - self.closed = False - self.qhello = Queue.Queue() # Thread messaging, HELLO REPLY. - self.qnaming = Queue.Queue() # Thread messaging, NAMING REPLY. - self.qsession = Queue.Queue() # Thread messaging, SESSION STATUS. - self._hello() # Do handshake with SAM bridge. - - def _hello(self): - """Internal command, handshake with SAM terminal.""" - self.term.send_message('HELLO VERSION MIN=' + - str(i2p.socket.samver) + ' MAX=' + str(i2p.socket.samver)) - self.term.check_message(self.term.queue_get(self.qhello)) - - def _on_HELLO_REPLY(self, **kwargs): - """Internal command, got HELLO REPLY.""" - self.qhello.put(kwargs) # Pass kwargs back to _hello. - - def _on_SESSION_STATUS(self, **kwargs): - """Internal command, got SESSION STATUS.""" - self.qsession.put(kwargs) # Pass kwargs back to main thread. - - def _namelookup(self, name): - """Internal command, does a NAMING LOOKUP query.""" - self.term.send_message('NAMING LOOKUP NAME=' + name) - # Read back response, check it, and return X in VALUE=X. - kwargs = self.term.queue_get(self.qnaming) - self.term.check_message(kwargs) - return kwargs['VALUE'] - - def _on_NAMING_REPLY(self, **kwargs): - """Internal command, got NAMING REPLY.""" - self.qnaming.put(kwargs) # Pass kwargs back to _namelookup. - - def _set_properties(self): - """Internal command, call at end of __init__ to set up - properties.""" - self.dest = self._namelookup('ME') - - def close(self): - """Close the session.""" - # Synchronize - self.lock.acquire() - try: - # Close the terminal if we're not already closed. - if not self.closed: self.term.close() - self.closed = True - finally: self.lock.release() - - def _encode_kwargs(self, **kwargs): - """Internal command, encode extra kwargs for passing to - SESSION CREATE.""" - ans = '' - for k in kwargs: - if k == 'in_depth': - ans += ' tunnels.depthInbound=' + \ - str(int(kwargs['in_depth'])) - elif k == 'out_depth': - ans += ' tunnels.depthOutbound=' + \ - str(int(kwargs['out_depth'])) - else: - raise ValueError('unexpected keyword argument ' + repr(k)) - return ans - -# ----------------------------------------------------- -# StreamSession -# ----------------------------------------------------- - -class StreamSession(BaseSession): - """Stream session. All methods are blocking and threadsafe.""" - - def __init__(self, name, addr='', **kwargs): - if addr == '': addr = i2p.socket.samaddr - BaseSession.__init__(self, addr) - self.idmap = {} # Maps id to Stream object. - self.qaccept = Queue.Queue() # Thread messaging, accept. - self.name = name - self.max_accept = 0 # Max queued incoming connections. - - # Create stream session. - if name == '': - name = 'TRANSIENT' - - # DIRECTION=BOTH (the default) is used because we can't know in - # advance whether a session will call listen(). - - self.term.send_message('SESSION CREATE STYLE=STREAM' + - ' DESTINATION=' + name + self._encode_kwargs(**kwargs)) - self.term.check_message(self.term.queue_get(self.qsession)) - - self._set_properties() - - def connect(self, dest, timeout=None): - """Create a stream connected to remote destination 'dest'. The - id is random. If the timeout is exceeded, do NOT raise an - error; rather, return a Stream object with .didconnect set - to False.""" - if not isinstance(dest, type('')): raise TypeError - # Synchronize - self.lock.acquire() - try: - # Pick a positive stream id at random. - while True: - # 9/10 probability of success per iteration - id = random.randrange(1, len(self.idmap) * 10 + 2) - if not id in self.idmap: - ans = Stream(self, dest, id, didconnect=False) - self.idmap[id] = ans - break - finally: self.lock.release() - # Send STREAM CONNECT and wait for reply. - self.term.send_message('STREAM CONNECT ID=' + str(id) + - ' DESTINATION=' + str(dest)) - - # Now wait until the stream's .didconnect flag is set to True. - if timeout != None: end = timer() + timeout - while True: - self.term.check() - if ans.didconnect: break - if timeout != None and timer() >= end: break - sleep() - - return ans - - def _on_STREAM_STATUS(self, **kwargs): - """Internal command, got STREAM STATUS. Unblocks connect.""" - # Store error is needed - try: self.term.check_message(kwargs) - except Exception, e: - try: self.idmap[int(kwargs['ID'])].err = e - except: pass # Closed too quickly - - # Now set .didconnect flag to True. - try: self.idmap[int(kwargs['ID'])].didconnect = True - except: pass # Closed too quickly - - def accept(self, timeout=None): - """Wait for incoming connection, and return a Stream object - for it.""" - if self.max_accept <= 0: - raise i2p.Error('listen(n) must be called before accept ' + - '(n>=1)') - if timeout != None: end = timer() + timeout - while True: - self.term.check() - # Synchronized - self.lock.acquire() - try: - # Get Stream object if available. - if self.qaccept.qsize() > 0: - return self.term.queue_get(self.qaccept) - finally: self.lock.release() - if timeout != None and timer() >= end: break - sleep() - - # Handle timeout and blocking errors - if timeout == 0.0: - raise i2p.socket.BlockError('command would have blocked') - else: - raise i2p.socket.Timeout('timed out') - - def listen(self, backlog): - """Set maximum number of queued connections.""" - if self.closed: raise sam.ClosedError() - self.max_accept = backlog - - def _on_STREAM_CONNECTED(self, **kwargs): - """Got STREAM CONNECTED command. This is what accept() commands - wait for.""" - # Synchronize - self.lock.acquire() - try: - # Drop connection if over maximum size. - if self.qaccept.qsize() >= self.max_accept: - self.term.send_message('STREAM CLOSE ID=' + - str(int(kwargs['ID']))) - return - - # Parse, create Stream, and place on self.qaccept. - self.term.check_message(kwargs) - # A negative id is chosen for us - id = int(kwargs['ID']) - self.idmap[id] = Stream(self, kwargs['DESTINATION'], id) - # Pass Stream object back to accept. - self.qaccept.put(self.idmap[id]) - finally: self.lock.release() - - def _send_stream(self, id, data): - """Internal command, send data to stream id. Use Stream.send - in your code.""" - self.term.send_message('STREAM SEND ID=' + str(id) + ' SIZE=' + - str(len(data)) + '\n' + data) - - def _on_STREAM_CLOSED(self, **kwargs): - """Got STREAM CLOSED command. Call idmap[id].on_close(e) and - delete idmap[id].""" - id = int(kwargs['ID']) - - # No error is produced for a graceful remote close. - e = None - try: self.term.check_message(kwargs) - except i2p.Error, err: e = err - - # Synchronize - self.lock.acquire() - try: - # Sent STREAM CLOSE, SAM didn't hear us in time. - if not id in self.idmap: return - # Pop id from self.idmap, if available. - obj = self.idmap[id] - del self.idmap[id] - finally: self.lock.release() - - # Process on_close message. - obj.on_close(None) - - def _on_STREAM_RECEIVED(self, **kwargs): - """Got STREAM RECEIVED command. Dispatch to - idmap[id].on_receive(s).""" - id = int(kwargs['ID']) - if not id in self.idmap: - # _on_STREAM_CONNECTED blocks until self.idmap[id] is properly - # set up. Therefore, we have received a stream packet despite - # closing the stream immediately after _on_STREAM_CONNECTED - # (SAM ignored us). So ignore it. - return - self.idmap[id].on_receive(kwargs['DATA']) - - def __len__(self): - """Unconnected session; has no read data available.""" - return 0 - - -class Stream: - """Receives and sends data for an individual stream.""" - - def __init__(self, parent, remotedest, id, didconnect=True): - self.parent = parent - self.buf = StringBuffer() - self.localdest = parent.dest - self.remotedest = remotedest - self.id = id - # Data lock. Allow multiple acquire()s by same thread - self.lock = threading.RLock() - self.closed = False - # Error message, on STREAM STATUS, or on STREAM CLOSED. - self.err = None - # Whether stream got a STREAM CONNECTED message - self.didconnect = didconnect - - def send(self, s): - """Sends the string s, blocking if necessary.""" - id = self.id - if self.closed or id == None: - if self.err != None: raise self.err - raise i2p.socket.ClosedError('stream closed') - if len(s) == 0: return - nmax = 32768 - for block in [s[i:i+nmax] for i in range(0,len(s),nmax)]: - self.parent._send_stream(id, block) - - def recv(self, n, timeout=None, peek=False, waitall=False): - """Reads up to n bytes in a manner identical to socket.recv. - Blocks for up to timeout seconds if n > 0 and no data is - available (timeout=None means wait forever). If still no data - is available, raises BlockError or Timeout. For a closed - stream, recv will read the data stored in the buffer until - EOF, at which point the read data will be truncated. If peek - is True, the data is not removed. If waitall is True, reads - exactly n bytes, or raises BlockError or Timeout as - appropriate. Returns data.""" - - if n < 0: raise ValueError - if n == 0: return '' - - minlen = 1 - if waitall: minlen = n - - if timeout != None: end = timer() + timeout - while True: - # Synchronized check and read until data available. - self.parent.term.check() - self.lock.acquire() - try: - if len(self.buf) >= minlen: - if peek: return self.buf.peek(n) - else: return self.buf.read(n) - # Graceful close: return as much data as possible - # (up to n bytes). - if self.closed and self.err == None: return self.buf.read(n) - # Ungraceful close: raise an error. - if self.err != None: raise self.err - finally: self.lock.release() - if timeout != None and timer() >= end: break - sleep() - - # Handle timeout and blocking error - if timeout == 0.0: - raise i2p.socket.BlockError('command would have blocked') - else: - raise i2p.socket.Timeout('timed out') - - def __len__(self): - """Current length of read buffer.""" - return len(self.buf) - - def close(self): - """Close the stream. Threadsafe.""" - # Synchronize self.parent. - self.parent.lock.acquire() - try: - if not self.closed: - self.closed = True - id = self.id - # Set self.id to None, so we don't close a new stream by - # accident. - self.id = None - if not id in self.parent.idmap: return - self.parent.term.send_message('STREAM CLOSE ID=' + str(id)) - # No error is produced for a locally closed stream - self.on_close(None) - del self.parent.idmap[id] - finally: self.parent.lock.release() - - def on_receive(self, s): - # Synchronize - self.lock.acquire() - try: - self.buf.append(s) - finally: self.lock.release() - - def on_close(self, e): - self.closed = True - self.err = e - - def __del__(self): - self.close() - -# ----------------------------------------------------- -# DatagramSession -# ----------------------------------------------------- - -class DatagramSession(BaseSession): - """Datagram session. All methods are blocking and threadsafe.""" - - def __init__(self, name, addr='', **kwargs): - if addr == '': addr = i2p.socket.samaddr - BaseSession.__init__(self, addr) - self.buf = Deque() # FIFO of incoming packets. - self.name = name - - # Create datagram session - if name == '': name = 'TRANSIENT' - self.term.send_message('SESSION CREATE STYLE=DATAGRAM ' + - 'DESTINATION=' + name + self._encode_kwargs(**kwargs)) - self.term.check_message(self.term.queue_get(self.qsession)) - - self._set_properties() - - def _on_DATAGRAM_RECEIVED(self, **kwargs): - """Internal method, got DATAGRAM RECEIVED.""" - # Synchronized - self.lock.acquire() - try: - self.buf.push_last((kwargs['DATA'], kwargs['DESTINATION'])) - finally: self.lock.release() - - def send(self, s, dest): - """Send packet with contents s to given destination.""" - # Raise error if packet is too large. - if len(s) > i2p.socket.MAX_DGRAM: - raise ValueError('packets must have length <= ' + - str(i2p.socket.MAX_DGRAM) + ' bytes') - self.term.send_message('DATAGRAM SEND DESTINATION=' + dest + - ' SIZE=' + str(len(s)) + '\n' + s) - - def recv(self, timeout=None, peek=False): - """Get a single packet. Blocks for up to timeout seconds if - n > 0 and no packet is available (timeout=None means wait - forever). If still no packet is available, raises BlockError - or Timeout. Returns the pair (data, address). If peek is - True, the data is not removed.""" - if timeout != None: end = timer() + timeout - while True: - self.term.check() - # Synchronized check and read until data available. - self.lock.acquire() - try: - if len(self.buf) > 0: - if peek: - ans = self.buf.pop_first() - self.buf.push_first(ans) - return ans - else: - return self.buf.pop_first() - finally: self.lock.release() - if timeout != None and timer() >= end: break - sleep() - - # Handle timeout and blocking error - if timeout == 0.0: - raise i2p.socket.BlockError('command would have blocked') - else: - raise i2p.socket.Timeout('timed out') - - def __len__(self): - """Number of packets in read buffer.""" - return len(self.buf) - -# ----------------------------------------------------- -# RawSession -# ----------------------------------------------------- - -class RawSession(BaseSession): - """Raw session. All methods are blocking and threadsafe.""" - - def __init__(self, name, addr='', **kwargs): - if addr == '': addr = i2p.socket.samaddr - BaseSession.__init__(self, addr) - self.buf = Deque() # FIFO of incoming packets. - self.name = name - - # Create raw session - if name == '': name = 'TRANSIENT' - self.term.send_message('SESSION CREATE STYLE=RAW DESTINATION=' + - name + self._encode_kwargs(**kwargs)) - self.term.check_message(self.term.queue_get(self.qsession)) - - self._set_properties() - - def _on_RAW_RECEIVED(self, **kwargs): - """Internal method, got RAW RECEIVED.""" - # Synchronized - self.lock.acquire() - try: - self.buf.push_last((kwargs['DATA'], '')) - finally: self.lock.release() - - def send(self, s, dest): - """Send packet with contents s to given destination.""" - # Raise error if packet is too big - if len(s) > i2p.socket.MAX_RAW: - raise ValueError('packets must have length <= ' + - str(i2p.socket.MAX_RAW) + ' bytes') - self.term.send_message('RAW SEND DESTINATION=' + dest + - ' SIZE=' + str(len(s)) + '\n' + s) - - def recv(self, timeout=None, peek=False): - """Identical to DatagramSocket.recv. The from address is an - empty string.""" - if timeout != None: end = timer() + timeout - while True: - self.term.check() - # Synchronized check and read until data available. - self.lock.acquire() - try: - if len(self.buf) > 0: - if peek: - ans = self.buf.pop_first() - self.buf.push_first(ans) - return ans - else: - return self.buf.pop_first() - finally: self.lock.release() - if timeout != None and timer() >= end: break - sleep() - - # Handle timeout and blocking error - if timeout == 0.0: - raise i2p.socket.BlockError('command would have blocked') - else: - raise i2p.socket.Timeout('timed out') - - def __len__(self): - """Number of packets in read buffer.""" - return len(self.buf) - - -# ----------------------------------------------------- -# End of file -# ----------------------------------------------------- diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/select.py i2p-0.9.50/apps/sam/python/src/i2p/select.py --- i2p-0.9.49/apps/sam/python/src/i2p/select.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/select.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,166 +0,0 @@ - -# ------------------------------------------------------------- -# select.py: Emulation of Python select module. -# ------------------------------------------------------------- - -""" -I2P Python API - Emulation of Python select module. -""" - -import time - -import i2p.socket -from i2p.pylib import select as pyselect # Import Python select - -# -------------------------------------------------- -# Poll and select -# -------------------------------------------------- - -POLLIN = 1 # There is data to read -POLLPRI = 1 # Same as POLLIN -POLLOUT = 4 # Ready for output -POLLERR = 8 # Wait for error condition -POLLHUP = 16 # Not implemented -POLLNVAL = 32 # Not implemented - -class Poll: - """Class implementing poll interface. Works for Python sockets - and SAM sockets.""" - def __init__(self): - self.fds = {} # Maps _hash() -> (socket, mask) - def _hash(self, fd): - """Get a unique number for each object.""" - if isinstance(fd, int): - return fd # Use the fd itself if integer. - else: - return id(fd) # Use object address (no copies!) - def register(self, fd, eventmask=POLLIN|POLLOUT|POLLERR): - self.fds[self._hash(fd)] = (fd, eventmask) - def unregister(self, fd): - del self.fds[self._hash(fd)] - def poll(self, timeout=None): - readlist, writelist, errlist = [], [], [] - for F, mask in self.fds.values(): - if mask & POLLIN: readlist += [F] - if mask & POLLOUT: writelist += [F] - if mask & POLLERR: errlist += [F] - (Rs, Ws, Es) = select(readlist, writelist, errlist, - timeout=timeout) - ans = [] - for R in Rs: ans.append((R, POLLIN)) - for W in Ws: ans.append((W, POLLOUT)) - for E in Es: ans.append((E, POLLERR)) - return ans - -def poll(): - """Returns a polling object. Works on SAM sockets and Python - sockets. See select.poll() in the Python library for more - information. - - Polling flags specified in this module: - - POLLIN - - POLLOUT - - POLLERR - - POLLHUP - - POLLNVAL - - POLLPRI -""" - return Poll() - -def _has_data(S): - """True if the given I2P socket has data waiting.""" - try: - S.recv(1, i2p.socket.MSG_PEEK | i2p.socket.MSG_DONTWAIT) - return True - except: - return False - -def _noblock_select(readlist, writelist, errlist): - """Makes a single query of the given sockets, like - select() with timeout 0.0.""" - Rans = [] - Wans = [] - Eans = [] - - # Check for read availability. - for R in readlist: - if isinstance(R, int) or hasattr(R, 'fileno'): - # Python socket - if len(pyselect.select([R], [], [], 0.0)[0]) > 0: - Rans.append(R) - else: - # SAM Socket - if _has_data(R): - Rans.append(R) -# if R.type == i2p.socket.SOCK_STREAM: -# try: -# R._verify_connected() -# Rans.append(R) -# except: -# pass -# else: -# if len(R.sessobj) > 0: Rans.append(R) - - # Check for write availability. - for W in writelist: - if isinstance(W, int) or hasattr(W, 'fileno'): - # Python socket - if len(pyselect.select([], [W], [], 0.0)[1]) > 0: - Wans.append(W) - else: - # SAM Socket - if W.type == i2p.socket.SOCK_STREAM: - try: - W._verify_connected() - Wans.append(W) - except: - pass - else: - Wans.append(W) - - # Check for error conditions. - # These can only be stream errors. - for E in errlist: - if isinstance(E, int) or hasattr(E, 'fileno'): - # Python socket - if len(pyselect.select([], [], [E], 0.0)[2]) > 0: - Eans.append(E) - else: - if E.type == i2p.socket.SOCK_STREAM: - try: - # FIXME: Use a ._get_error() function for errors. - # Socket can only have an error if it connected. - E._verify_connected() - if E.sessobj.err != None: - Eans.append(E) - except: - pass - - return (Rans, Wans, Eans) - - -def select(readlist, writelist, errlist, timeout=None): - """Performs a select call. Works on SAM sockets and Python - sockets. See select.select() in the Python library for more - information.""" - - if timeout != None: end = time.time() + timeout - while True: - # FIXME: Check performance. - # Use pyselect.poll for Python sockets, if needed for speed. - (Rans, Wans, Eans) = _noblock_select(readlist,writelist,errlist) - - if timeout != None and time.time() >= end: break - if len(Rans) != 0 or len(Wans) != 0 or len(Eans) != 0: - # One or more sockets are ready. - if timeout != 0.0: - # Check again, because sockets may have changed state while - # we did _noblock_select (it's safer to check twice, since - # they usually go from no data => data ready, and so forth). - (Rans, Wans, Eans) = _noblock_select(readlist, writelist, - errlist) - return (Rans, Wans, Eans) - - time.sleep(0.01) - - return (Rans, Wans, Eans) diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/SimpleHTTPServer.py i2p-0.9.50/apps/sam/python/src/i2p/SimpleHTTPServer.py --- i2p-0.9.49/apps/sam/python/src/i2p/SimpleHTTPServer.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/SimpleHTTPServer.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -#! /usr/bin/env python - -""" -Emulation of Python SimpleHTTPServer module using I2P sockets. - -The Python module is described at -http://www.python.org/doc/current/lib/module-SimpleHTTPServer.html - -To get a server going, use: - - >>> from i2p import SimpleHTTPServer - >>> SimpleHTTPServer.test(). - -Consult the documentation for function test() to change basic -server settings, such as the session name. - -A fully customizable example: - - >>> from i2p import BaseHTTPServer, SimpleHTTPServer - >>> session = "mytestxxx.i2p" # SAM session name - >>> class MyServer(BaseHTTPServer.HTTPServer): pass - >>> class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): pass - >>> httpd = MyServer(session, MyRequestHandler) - >>> httpd.socket.dest - (Base64 Destination of server) - >>> httpd.serve_forever() - -""" - -# By aum. - -# Hack to keep Python from importing from current directory: -# Use pylib package, then use = signs instead of from x import y. -import pylib -SimpleHTTPServer = pylib.SimpleHTTPServer - -import sys -import i2p.BaseHTTPServer - -__version__ = "0.1.0" - -__all__ = ["SimpleHTTPRequestHandler", "test"] - -HTTPServer = i2p.BaseHTTPServer.HTTPServer -class SimpleHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): - """ - Same interface as Python class - SimpleHTTPServer.SimpleHTTPRequestHandler. - """ - -def test(HandlerClass = SimpleHTTPRequestHandler, - ServerClass = i2p.BaseHTTPServer.HTTPServer, - session = "mytestxxx.i2p"): - """ - Test the HTTP simple request handler class. - - This runs an I2P TCP server under SAM session 'session'. - If a single command line argument is given, the argument is used - instead as the SAM session name. - """ - if sys.argv[1:] and __name__ == '__main__': - session = sys.argv[1] - - i2p.BaseHTTPServer.test(HandlerClass, ServerClass, - session=session) - -if __name__ == '__main__': - test() diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/socket.py i2p-0.9.50/apps/sam/python/src/i2p/socket.py --- i2p-0.9.49/apps/sam/python/src/i2p/socket.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/socket.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,535 +0,0 @@ - -# ------------------------------------------------------------- -# socket.py: Emulation of Python socket module. -# ------------------------------------------------------------- - -""" -Emulation of Python socket module using SAM. -""" - -import i2p - -import samclasses, threading, time, copy, Queue, thread -from i2p.pylib import socket as pysocket # Import Python socket -from i2p.pylib import select as pyselect # Import Python select - -# -------------------------------------------------- -# Global variables -# -------------------------------------------------- - -# Ports -samaddr = '127.0.0.1:7656' # Default port for SAM Bridge - -# Flags for recv, recvfrom. -MSG_PEEK = 2 # Peek at incoming message -MSG_WAITALL = 64 # Wait for data or error -MSG_DONTWAIT = 128 # Nonblocking - -# Packet sizes -MAX_DGRAM = 31744 # Max size of datagram packet -MAX_RAW = 32768 # Max size of raw packet - -# Socket types -SOCK_STREAM = 1 # Stream socket -SOCK_DGRAM = 2 # Datagram socket -SOCK_RAW = 3 # Raw socket - -# Miscellaneous -samver = 1.0 # SAM version implemented - -# -------------------------------------------------- -# Errors -# -------------------------------------------------- - -class Error(i2p.Error): - """Base class for all SAM errors.""" - -class NetworkError(Error): - """Network error occurred within I2P. - The error object is a 2-tuple: (errtag, errdesc). - errtag is a SAM error string, - errdesc is a human readable error description. - """ - -class ClosedError(Error): - """A command was used on a socket that closed gracefully.""" - -class BlockError(Error): - """Socket call would have blocked.""" - -class Timeout(Error): - """Time out occurred for a socket which had timeouts enabled - via a prior call to settimeout().""" - -# -------------------------------------------------- -# Sockets -# -------------------------------------------------- - -# Note: socket(), __make_session() and Socket() should have same args -def socket(session, type, samaddr=samaddr, **kwargs): - r"""Create a new socket. Argument session should be a session - name -- if the name has not yet been used, an I2P - Destination will be created for it, otherwise, the - existing Destination will be re-used. An empty session - string causes a transient session to be created. Argument - type is one of SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW. - - I2P configuration keyword arguments: - - - in_depth - depth of incoming tunnel (default 2) - - out_depth - depth of outgoing tunnel (default 2) - - A single session may be shared by more than one socket, if - the sockets are the same type, and if the sockets are - created within the same Python process. The socket - objects are multithread-safe. - - Examples: - >>> a = i2p.socket('Alice', i2p.SOCK_STREAM) - >>> b = i2p.socket('Bob', i2p.SOCK_DGRAM, - in_depth=2, out_depth=5) - - The created object behaves identically to a socket from - module socket, with the following exceptions: - - - I2P Destinations are used as address arguments [1]. - - bind is a no-op: sockets are always bound. - - send* methods send all data and are non-blocking. - - A given session name can only be open in a single Python - program at a time. If you need to overcome this - limitation, consider patching I2P. - - [1]. - Alternatively, a host name can be used as an address. - It will be resolved using hosts.txt. - - For details on how to use socket objects, see - http://www.python.org/doc/current/lib/socket-objects.html - - See the examples directory for code examples. - """ - - return Socket(session, type, samaddr, **kwargs) - - -# -------------------------------------------------- -# Socket session objects -# -------------------------------------------------- - -# Global list of session objects. -_sessions = {} -_session_lock = threading.Lock() - -def _make_session(session, type, samaddr, **kwargs): - """Make a session object (eg samclasses.StreamSession). Same - arguments as socket(). Return an existing session object - if one has been previously created under the given name. - """ - # Synchronize - _session_lock.acquire() - try: - if type == SOCK_STREAM: C = samclasses.StreamSession - elif type == SOCK_DGRAM: C = samclasses.DatagramSession - elif type == SOCK_RAW: C = samclasses.RawSession - else: raise ValueError('bad socket type') - # Get existing session, if available - if session != '' and _sessions.has_key(session): - if _sessions[session].__class__ != C: - raise ValueError('session ' + repr(session) + ' was ' + - 'created with a different session type.') - return _sessions[session] - # Create new session - if type == SOCK_STREAM: ans = C(session, samaddr, **kwargs) - elif type == SOCK_DGRAM: ans = C(session, samaddr, **kwargs) - elif type == SOCK_RAW: ans = C(session, samaddr, **kwargs) - if session != '': _sessions[session] = ans - return ans - finally: _session_lock.release() - -def _wrap_stream(stream, parent_socket): - """Wraps a Socket object around a samclasses.Stream object.""" - s = Socket('', 0, dummy_socket=True) - s.sessobj = stream - s.remotedest = stream.remotedest - s.dest = parent_socket.dest - s.session = parent_socket.session - s.type = parent_socket.type - s.timeout = None - s.samaddr = parent_socket.samaddr - s.closed = False - return s - -# -------------------------------------------------- -# Socket class -# -------------------------------------------------- - -class Socket: - """A socket object.""" - - # Docstrings for pydoc. These variables will be overwritten. - dest = property(doc='Local I2P Destination of socket') - session = property(doc='Session name') - type = property(doc='Socket type: SOCK_STREAM, SOCK_DGRAM,' + - ' or SOCK_RAW.') - # FIXME: Use getsockopt to detect errors. - - def __init__(self, session, type, samaddr=samaddr, **kwargs): - """Equivalent to socket().""" - if kwargs.has_key('dummy_socket'): return - self.sessobj = _make_session(session, type, samaddr, **kwargs) - self.dest = self.sessobj.dest - self.session = session - self.type = type - self.timeout = None # None indicates blocking mode - self.samaddr = samaddr - self.closed = False # Was current object closed? - self.lock = threading.Lock() - - def _verify_open(self): - """Verify that the socket has not been closed.""" - if self.closed == True: - raise ClosedError('socket closed') - - def _verify_stream(self): - """Raise an error if socket is not a SOCK_STREAM.""" - if self.type != SOCK_STREAM: - raise i2p.Error('operation not supported') - # FIXME: Check for errors also. - - def _verify_connected(self, needs_to_be_connected=True): - """Raise an error if socket is not a connected stream socket.""" - self._verify_stream() - if not hasattr(self.sessobj, 'remotedest'): - raise i2p.Error('socket is not connected') - if needs_to_be_connected and not self.sessobj.didconnect: - raise i2p.Error('socket is in the process of connecting') - # FIXME: Check for errors also. - - def _verify_not_connected(self): - """Verify that the socket is not currently connected, and is not - in the process of connecting.""" - self._verify_stream() - if hasattr(self.sessobj, 'remotedest'): - raise i2p.Error('socket is already connected') - # FIXME: Check for errors also. - - def accept(self): - """Accept an incoming connection. The socket must be type - SOCK_STREAM, and listen() must be called prior to this - command. The return value is (conn, remotedest), where - conn is a new socket object made for the connection, and - remotedest is the remote Destination from which the - connection was made. - - Example: - - >>> from i2p import socket - >>> s = socket.socket('Alice', socket.SOCK_STREAM) - >>> s.listen(10) - - This prepares the server. Now accept an incoming connection: - - >>> c, remotedest = s.accept() - >>> c.send('hello world!') - - If accept() is called on a socket that is in non-blocking - mode or has a timeout, i2p.socket.BlockError or - i2p.socket.Timeout may be raised. This indicates that no - incoming connection is currently available.""" - - self._verify_open() - self._verify_not_connected() - # Raises BlockError or Timeout if not ready. - C = _wrap_stream(self.sessobj.accept(self.timeout), self) - return (C, C.remotedest) - - def bind(self, address): - """Does nothing. Provided for compatibility with the Python - socket command bind(), which binds a server to a port.""" - self._verify_open() - self._verify_not_connected() - - def close(self): - """Closes the socket. It is an error to call any method - other than recv() or recvfrom() on a closed socket. - For streams, the receive methods return data that was - received prior to the closing of the socket. For - datagram and raw sockets, the receive methods cannot - be used on a closed socket.""" - try: - self._verify_connected() - connected = True - except i2p.Error: - connected = False - if connected: - # Close the Stream object. - self.sessobj.close() - else: - # Never close a session object. - pass - self.closed = True - - def connect(self, address): - """ - Connect to a remote dest, identified in local SAM bridge's hosts - file as host 'address'. - - For example: - >>> s.connect('duck.i2p') - - Alternatively, you can use a full base64 Destination: - - Example: - >>> s.connect('238797sdfh2k34kjh....AAAA') - - If connect() is called on a socket that is in non-blocking - mode or has a timeout, i2p.socket.BlockError or - i2p.socket.Timeout may be raised. This indicates that the - connection is still being initiated. Use i2p.select.select() - to determine when the connection is ready. - """ - # Synchronized. Lock prevents two connects from occurring at the - # same time in different threads. - self.lock.acquire() - try: - self._verify_open() - if self.type == SOCK_DGRAM or self.type == SOCK_RAW: - self.packet_dest = address - return - - self._verify_not_connected() - - address = resolve(address, self.samaddr) - - timeout = self.timeout - unwrap = self.sessobj.connect(address, timeout=timeout) - w = _wrap_stream(unwrap, self) - self.sessobj = w.sessobj - self.remotedest = w.remotedest - - if self.sessobj.err != None: - raise self.sessobj.err - - # Raise error if not yet connected - if not self.sessobj.didconnect: - if timeout == 0.0: - raise BlockError('command would have blocked. use ' + - 'i2p.select.select() to find when socket is connected') - else: raise Timeout('timed out. use i2p.select.select()' + - ' to find when socket is connected') - - finally: self.lock.release() - - def connect_ex(self, address): - """Like connect(), but return any error that is raised. - Returns None if no error is raised.""" - try: self.connect(address) - except i2p.Error, e: return e - - # Don't implement fileno(), as we don't have a real file handle. - - def getpeername(self): - """Get the remote Destination associated with the socket. - This is equivalent to s.remotedest, and is provided for - compatibility with the Python socket module.""" - self._verify_connected() - return self.remotedest - - def getsockname(self): - """Get the local Destination associated with the socket. - This is equivalent to s.dest, and is provided for - compatibility with the Python socket module.""" - return self.dest - - def listen(self, backlog): - """Listen for connections made to the socket. - This method must be called before accept(). - The backlog argument specifies the maximum number of - queued incoming connections.""" - self._verify_open() - self._verify_not_connected() - self.sessobj.listen(backlog) - - def makefile(self, mode='r', bufsize=-1): - """Return a file object for the socket. - See socket.makefile() in the Python documentation for - more information.""" - self._verify_open() - self._verify_connected() - return pysocket._fileobject(self, mode, bufsize) - - def recv(self, bufsize, flags=0): - """Receive string data from the socket. - - The maximum amount of data to be received is given by - bufsize. If bufsize is zero, this function returns - an empty string immediately. If bufsize is nonzero, - this function blocks until at least one character is - available for reading. If the socket has been closed, - an empty string is returned as an end of file indicator. - - If recv() is called on a socket that is in non-blocking - mode or has a timeout, i2p.socket.BlockError or - i2p.socket.Timeout will be raised if data is not available - within the given timeframe. - - For a datagram or raw socket, the first bufsize characters - of the packet are read, and the remainder of the packet is - discarded. To read the entire packet, use bufsize = -1. - - For datagram and raw sockets, the packet may originate from - any Destination. Use recvfrom() with datagrams to determine - the Destination from which the packet was received. - - The flags argument can be a bitwise OR of MSG_PEEK, - MSG_WAITALL, and/or MSG_DONTWAIT. MSG_PEEK indicates that - any data read should not be removed from the socket's - incoming buffer. MSG_WAITALL indicates to wait for exactly - bufsize characters or an error. MSG_DONTWAIT indicates - that the recv() command should not block execution. - """ - - # FIXME: What about recv'ing if connected in asynchronous mode? - # It is acceptable to call recv() after a stream has closed - # gracefully. It is an error to call recv() after a stream has - # closed due to an I2P network error. - timeout = self.timeout - (peek, waitall, dontwait) = \ - (flags & MSG_PEEK, flags & MSG_WAITALL, flags & MSG_DONTWAIT) - if dontwait: timeout = 0.0 - - if self.type == SOCK_STREAM: - self._verify_connected() - return self.sessobj.recv(bufsize, timeout, peek, waitall) - else: - return self.recvfrom(bufsize, flags)[0] - - def recvfrom(self, bufsize, flags=0): - """Like recv(), but returns a tuple (data, remoteaddr), where - data is the string data received, and remoteaddr is the - remote Destination.""" - timeout = self.timeout - (peek, waitall, dontwait) = \ - (flags & MSG_PEEK, flags & MSG_WAITALL, flags & MSG_DONTWAIT) - if dontwait: timeout = 0.0 - - if self.type == SOCK_STREAM: - self._verify_connected() - if bufsize < 0: raise ValueError('bufsize must be >= 0 for streams') - return (self.sessobj.recv(bufsize, timeout, peek, waitall), \ - self.remotedest) - else: - if bufsize < -1: - raise ValueError('bufsize must be >= -1 for packets') - (data, addr) = self.sessobj.recv(timeout, peek) - if bufsize == -1: - return (data, addr) - else: - return (data[:bufsize], addr) - - def send(self, string, flags=0): - """Sends string data to a remote Destination. - - For a stream, connect() must be called prior to send(). - Once close() is called, no further data can be sent, and - the stream cannot be re-opened. - - For datagram and raw sockets, connect() only specifies - a Destination to which packets are sent to. send() will - then send a packet to the given Destination. connect() - can be used multiple times. - - The send() command never blocks execution. The flags - argument is ignored. - """ - - self._verify_open() - if self.type == SOCK_DGRAM or self.type == SOCK_RAW: - if not hasattr(self, 'packet_dest'): - raise i2p.Error('use connect or sendto to specify a ' + - 'Destination') - self.sendto(string, flags, self.packet_dest) - return - - self._verify_connected() - if self.closed: - raise i2p.Error('send operation on closed socket') - # FIXME: What about send'ing if connected in asynchronous mode? - self.sessobj.send(string) - - def sendall(self, string, flags=0): - """Identical to send().""" - self.send(string) - - def sendto(self, string, flags, address): - """Send a packet to the given Destination. - - Only valid for datagram and raw sockets. The address - argument should be either a name from the hosts file, - or a base64 Destination. - - The sendto() command never blocks execution. The flags - argument is ignored. - """ - - self._verify_open() - if not self.type in [SOCK_DGRAM, SOCK_RAW]: - raise i2p.Error('operation not supported') - if self.closed: - raise i2p.Error('sendto operation on closed socket') - address = resolve(address, self.samaddr) - self.sessobj.send(string, address) - - def setblocking(self, flag): - """Set blocking or non-blocking mode for the socket. - - If flag is True, any method called on the socket will - hang until the method has completed. If flag is False, - all methods will raise i2p.socket.BlockError() if they - cannot complete instantly. - - s.setblocking(False) is equivalent to s.settimeout(0); - s.setblocking(True) is equivalent to s.settimeout(None). - """ - if flag: self.timeout = None - else: self.timeout = 0.0 - - def settimeout(self, value): - """Set a timeout for the socket. - - The value argument should be a timeout value in seconds, - or None. None is equivalent to an infinite timeout. - - A socket operation will raise a i2p.socket.Timeout if - the operation cannot complete within in the specified - time limit. - """ - self.timeout = value - - def gettimeout(self): - """Get the timeout value.""" - return self.timeout - - def __copy__(self): - """Returns the original object.""" - return self - - def __deepcopy__(self, memo): - """Returns the original object.""" - return self - -def resolve(host, samaddr=samaddr): - """Resolve I2P host name --> I2P Destination. - Returns the same string if host is already a Destination.""" - if host.find('http://') == 0: host = host[len('http://'):] - host = host.rstrip('/') - if len(host) >= 256: return host - S = samclasses.BaseSession(samaddr) - ans = S._namelookup(host) - S.close() - return ans - -# -------------------------------------------------- -# End of File -# -------------------------------------------------- diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/SocketServer.py i2p-0.9.50/apps/sam/python/src/i2p/SocketServer.py --- i2p-0.9.49/apps/sam/python/src/i2p/SocketServer.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/SocketServer.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ - -""" -Emulation of Python SocketServer module using I2P sockets. - -The Python module is described at -http://www.python.org/doc/current/lib/module-SocketServer.html - -""" - -# By aum. - -# Hack to keep Python from importing from current directory: -# Use pylib package, then use = signs instead of from x import y. -import pylib -SocketServer = pylib.SocketServer - -import i2p.socket -class BaseServer(SocketServer.BaseServer): - pass -class TCPServer(SocketServer.TCPServer, BaseServer): - - socket_type = i2p.socket.SOCK_STREAM - - def __init__(self, session, RequestHandlerClass): - """ - Constructor. May be extended, do not override. - - The 'session' argument indicates the SAM session - name that should be used for the server. See module - i2p.socket for details on SAM sessions. - """ - BaseServer.__init__(self, session, RequestHandlerClass) - - #self.socket = socket.socket(self.address_family, - # self.socket_type) - self.session = session - self.socket = i2p.socket.socket(session, self.socket_type) - - self.server_bind() - self.server_activate() - -class UDPServer(TCPServer, SocketServer.UDPServer): - pass - -class ForkingMixIn(SocketServer.ForkingMixIn): - pass - -class ThreadingMixIn(SocketServer.ThreadingMixIn): - pass - -class ForkingUDPServer(ForkingMixIn, UDPServer): - pass - -class ForkingTCPServer(ForkingMixIn, TCPServer): - pass - -class ThreadingUDPServer(ThreadingMixIn, UDPServer): - pass - -class ThreadingTCPServer(ThreadingMixIn, TCPServer): - pass - -class BaseRequestHandler(SocketServer.BaseRequestHandler): - pass - -class StreamRequestHandler(SocketServer.StreamRequestHandler): - pass - -class DatagramRequestHandler(SocketServer.DatagramRequestHandler): - pass - - diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/test/readme.txt i2p-0.9.50/apps/sam/python/src/i2p/test/readme.txt --- i2p-0.9.49/apps/sam/python/src/i2p/test/readme.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/test/readme.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - -Unit tests for I2P Python interface. - -Note that these aren't all unit tests yet. - -Some are demos, some require manual intervention. diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/test/test_eep.py i2p-0.9.50/apps/sam/python/src/i2p/test/test_eep.py --- i2p-0.9.49/apps/sam/python/src/i2p/test/test_eep.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/test/test_eep.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ - -# ----------------------------------------------------- -# test_eep.py: Unit tests for eep.py. -# ----------------------------------------------------- - -# Make sure we can import i2p -import sys; sys.path += ['../../'] - -import traceback, sys -from i2p import eep - -def verify_html(s): - """Raise an error if s does not end with """ - assert s.strip().lower()[-7:] == '' - -def eepget_test(): - try: - verify_html(eep.urlget('http://duck.i2p/index.html')) - verify_html(eep.urlget('http://duck.i2p/')) - verify_html(eep.urlget('http://duck.i2p')) - verify_html(eep.urlget('duck.i2p/')) - verify_html(eep.urlget('duck.i2p')) - except Exception, e: - print 'Unit test failed for eepget' - print "Note that urllib2.urlopen uses IE's proxy settings " + \ - "in Windows." - print "This may cause " + \ - "urllib2.urlopen('http://www.google.com/') to fail." - traceback.print_exc(); sys.exit() - print 'eepget: OK' - -def test(): - eepget_test() - -if __name__ == '__main__': - print 'Testing:' - test() diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/test/test_samclasses.py i2p-0.9.50/apps/sam/python/src/i2p/test/test_samclasses.py --- i2p-0.9.49/apps/sam/python/src/i2p/test/test_samclasses.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/test/test_samclasses.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,433 +0,0 @@ - -# ----------------------------------------------------- -# test_samclasses.py: Unit tests for samclasses.py. -# ----------------------------------------------------- - -# Make sure we can import i2p -import sys; sys.path += ['../../'] - -import traceback, time, thread, threading, random -from i2p import eep, socket, samclasses - -def test_passed(s, msg='OK'): - """Notify user that the given unit test passed.""" - print ' ' + (s + ':').ljust(50) + msg - -def verify_html(s): - """Raise an error if s does not end with """ - assert s.strip().lower()[-7:] == '' - -def raw_test1(): - """Unit test for samclasses.RawSession.""" - - try: - C = samclasses.RawSession('Carol') - D = samclasses.RawSession('Dave') - - C.send('Hello!', D.dest) - D.send('Hi C!', C.dest) - - (packet, addr) = C.recv(1000) - assert packet == 'Hi C!' - (packet, addr) = D.recv(1000) - assert packet == 'Hello!' - C.close() - D.close() - except: - print 'Unit test failed for samclasses.RawSession' - traceback.print_exc(); sys.exit() - test_passed('samclasses.RawSession') - -def datagram_test1(): - """Unit test for samclasses.DatagramSession.""" - - try: - C = samclasses.DatagramSession('Carol') - D = samclasses.DatagramSession('Dave') - - C.send('Hello!', D.dest) - D.send('Hi C!', C.dest) - - (packet, remotedest) = C.recv(1000) - assert str(packet) == 'Hi C!' and remotedest == D.dest - (packet, remotedest) = D.recv(1000) - assert str(packet) == 'Hello!' and remotedest == C.dest - C.close() - D.close() - except: - print 'Unit test failed for samclasses.DatagramSession' - traceback.print_exc(); sys.exit() - test_passed('samclasses.DatagramSession') - -def stream_readline(S): - """Read a line, with a \r\n newline, including trailing \r\n.""" - ans = [] - while True: - c = S.recv(1) - if c == '': break - if c == '\n': break - ans += [c] - return ''.join(ans) - -def stream_http_get(S, dest): - """Get contents of http://dest/ via HTTP/1.0 and - samclasses.StreamSession S.""" - C = S.connect(dest) - - C.send('GET / HTTP/1.0\r\n\r\n') - - while True: - line = stream_readline(C).strip() - if line.find('Content-Length: ') == 0: - clen = int(line.split()[1]) - if line == '': break - - s = C.recv(clen, timeout=None) - time.sleep(2.0) - C.close() - return s - -def stream_test1(): - """Unit test for samclasses.StreamSession.connect.""" - - try: - dest = socket.resolve('duck.i2p') - S = samclasses.StreamSession('Bob') - verify_html(stream_http_get(S, dest)) - verify_html(stream_http_get(S, dest)) - verify_html(stream_http_get(S, dest)) - S.close() - - except: - print 'Unit test failed for samclasses.StreamSession' - traceback.print_exc(); sys.exit() - test_passed('samclasses.StreamSession.connect') - -def stream_test2(): - """Unit test for samclasses.StreamSession.accept.""" - global __server_done, __client_done, __err - __server_done = False - __client_done = False - __err = None - - S = samclasses.StreamSession('Bob') - S.listen(10) - msg = '

Hello!

' - - def serve(): - try: - # Serve 3 connections, then quit. - for i in range(3): - C = S.accept() # Get a connection. - req = stream_readline(C) # Read HTTP request. - - s = msg # Message to send back - - C.send('HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n' + - 'Content-Length: ' + str(int(len(s))) + '\r\n\r\n' + s) - - if i % 2 == 0: C.close() # Close connection - S.close() - except Exception, e: - global __err - __err = e - global __server_done - __server_done = True - - thread.start_new_thread(serve, ()) - # Wait for accept to kick in (should work without). - time.sleep(2.0) - - def client(): - try: - S2 = samclasses.StreamSession('Carol') - # Get / on server three times. - assert stream_http_get(S2, S.dest) == msg - assert stream_http_get(S2, S.dest) == msg - assert stream_http_get(S2, S.dest) == msg - S2.close() - except Exception, e: - global __err - __err = e - global __client_done - __client_done = True - - thread.start_new_thread(client, ()) - - while not (__client_done and __server_done): time.sleep(0.01) - - if __err != None: - print 'Unit test failed for samclasses.StreamSession.accept' - raise __err - test_passed('samclasses.StreamSession.accept') - -def multithread_packet_test(raw=True): - """If raw: Multithreaded unit test for samclasses.RawSession. - Not raw: Multithreaded unit test for samclasses.DatagramSession. - """ - - try: - multithread_wait_time = 200.0 - may_need_increase = False - - if raw: - C = samclasses.RawSession('Carol', in_depth=0, out_depth=0) - D = samclasses.RawSession('Dave', in_depth=0, out_depth=0) - else: - C = samclasses.DatagramSession('Carol',in_depth=0,out_depth=0) - D = samclasses.DatagramSession('Dave',in_depth=0,out_depth=0) - - global C_recv, D_recv, C_got, D_got, __lock - C_recv = [] # Packets C *should* receive - D_recv = [] # Packets D *should* receive - C_got = [] # Packets C actually got - D_got = [] # Packets D actually got - - n = 50 # Create n threads - m = 40 # Each thread sends m packets - - global __done_count - __done_count = 0 - __lock = threading.Lock() - - # Use C and D to send and read in many different threads. - def f(): - # This code is run in each separate thread - global C_recv, D_recv, C_got, D_got, __lock, __done_count - for i in range(m): - # Random binary string of length 2-80. - index_list = range(random.randrange(2, 80)) - s = ''.join([chr(random.randrange(256)) for j in index_list]) - if random.randrange(2) == 0: - # Send packet from C to D, and log it. - C.send(s, D.dest) - __lock.acquire() - D_recv += [s] - __lock.release() - else: - # Send packet from D to C, and log it. - D.send(s, C.dest) - __lock.acquire() - C_recv += [s] - __lock.release() - time.sleep(0.01*random.uniform(0.0,1.0)) - # Read any available packets. - try: (p, fromaddr) = C.recv(timeout=0.0) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == D.dest - - __lock.acquire() - if p != None: C_got += [p] - __lock.release() - - try: (p, fromaddr) = D.recv(timeout=0.0) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == C.dest - - __lock.acquire() - if p != None: D_got += [p] - __lock.release() - - __lock.acquire() - __done_count += 1 - __lock.release() - - # Create n threads. - for i in range(n): - threading.Thread(target=f).start() - - # Wait for them to finish. - while __done_count < n: time.sleep(0.01) - - # Read any left-over received packets. - end_time = time.time() + multithread_wait_time - while time.time() < end_time: - # Read any available packets. - try: (p, fromaddr) = C.recv(timeout=0.0) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == D.dest - - if p != None: C_got += [p] - - try: (p, fromaddr) = D.recv(timeout=0.0) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == C.dest - - if p != None: D_got += [p] - if len(C_got) == len(C_recv) and len(D_got) == len(D_recv): - break - - if time.time() >= end_time: - may_need_increase = True - - C_got.sort() - D_got.sort() - C_recv.sort() - D_recv.sort() - assert C_got == C_recv - assert D_got == D_recv - - C.close() - D.close() - except: - if raw: - print 'Unit test failed for samclasses.RawSession ' + \ - '(multithreaded).' - print 'Raw packets are not reliable.' - else: - print 'Unit test failed for samclasses.DatagramSession ' + \ - '(multithreaded).' - print 'Datagram packets are not reliable.' - - if may_need_increase: - print 'Try increasing multithread_wait_time.' - - traceback.print_exc(); sys.exit() - if raw: - test_passed('samclasses.RawSession (multithreaded)') - else: - test_passed('samclasses.DatagramSession (multithreaded)') - - - -def multithread_stream_test(): - """Multithreaded unit test for samclasses.StreamSession.""" - - try: - multithread_wait_time = 200.0 - may_need_increase = False - - C = samclasses.StreamSession('Carol', in_depth=0, out_depth=0) - D = samclasses.StreamSession('Dave', in_depth=0, out_depth=0) - C.listen(10) - D.listen(10) - - Cout = C.connect(D.dest) - Dout = D.connect(C.dest) - Cin = C.accept() - Din = D.accept() - - global C_recv, D_recv, C_got, D_got, __lock - C_recv = [] # String data C *should* receive - D_recv = [] # String data D *should* receive - C_got = [] # String data C actually got - D_got = [] # String data D actually got - - n = 50 # Create n threads - m = 40 # Each thread sends m strings - - global __done_count - __done_count = 0 - __lock = threading.Lock() - - # Use C and D to send and read in many different threads. - def f(): - # This code is run in each separate thread - global C_recv, D_recv, C_got, D_got, __lock, __done_count - for i in range(m): - # Random binary string of length 2-80. - index_list = range(random.randrange(2, 80)) - s = ''.join([chr(random.randrange(256)) for j in index_list]) - if random.randrange(2) == 0: - # Send packet from C to D, and log it. - __lock.acquire() - Cout.send(s) - D_recv += [s] - __lock.release() - else: - # Send packet from D to C, and log it. - __lock.acquire() - Dout.send(s) - C_recv += [s] - __lock.release() - time.sleep(0.01*random.uniform(0.0,1.0)) - # Read any available string data, non-blocking. - - __lock.acquire() - try: p = Cin.recv(100000, timeout=0.0) - except socket.BlockError: p = None - if p != None: C_got += [p] - __lock.release() - - __lock.acquire() - try: p = Din.recv(100000, timeout=0.0) - except socket.BlockError: p = None - if p != None: D_got += [p] - __lock.release() - - __lock.acquire() - __done_count += 1 - __lock.release() - - # Create n threads. - for i in range(n): - threading.Thread(target=f).start() - - # Wait for them to finish. - while __done_count < n: time.sleep(0.01) - - # Read any left-over received string data. - end_time = time.time() + multithread_wait_time - while time.time() < end_time: - # Read any available string data, non-blocking. - try: p = Cin.recv(100000, timeout=0.0) - except socket.BlockError: p = None - if p != None: C_got += [p] - - try: p = Din.recv(100000, timeout=0.0) - except socket.BlockError: p = None - if p != None: D_got += [p] - - if len(''.join(C_got)) == len(''.join(C_recv)) and \ - len(''.join(D_got)) == len(''.join(D_recv)): - break - - if time.time() >= end_time: - may_need_increase = True - - C_got = ''.join(C_got) - D_got = ''.join(D_got) - C_recv = ''.join(C_recv) - D_recv = ''.join(D_recv) - assert C_got == C_recv - assert D_got == D_recv - - Cin.close() - Din.close() - Cout.close() - Dout.close() - C.close() - D.close() - except: - print 'Unit test failed for samclasses.StreamSession ' + \ - '(multithreaded).' - - if may_need_increase: - print 'Try increasing multithread_wait_time.' - - traceback.print_exc(); sys.exit() - test_passed('samclasses.StreamSession (multithreaded)') - - -def test(): - print 'Tests may take several minutes each.' - print 'If the network is unreliable, tests will fail.' - print 'A test only needs to pass once to be considered successful.' - print - print 'Testing:' - - raw_test1() - datagram_test1() - stream_test1() - stream_test2() - multithread_packet_test(raw=True) - multithread_stream_test() - - # Note: The datagram unit test fails, but it's apparently I2P's - # fault (the code is the same as for raw packets, and the SAM - # bridge is sent all the relevant data). - # Code: multithread_packet_test(raw=False) - -if __name__ == '__main__': - test() - diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/test/test_select.py i2p-0.9.50/apps/sam/python/src/i2p/test/test_select.py --- i2p-0.9.49/apps/sam/python/src/i2p/test/test_select.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/test/test_select.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ - -# ----------------------------------------------------- -# test_select.py: Unit tests for select.py. -# ----------------------------------------------------- - -# Make sure we can import i2p -import sys; sys.path += ['../../'] - -import time - -import traceback, sys -from i2p import socket, select -import i2p.socket -import socket as pysocket - -def minitest_select(rans, wans, eans, timeout, - f1=None, f4=None, c1=None, c4=None): - """Mini-unit test for select (Python and I2P sockets). - Calls f1() on socket S1, f4() on socket S4, uses select() - timeout 'timeout'. rans, wans, and eans should be lists - containing indexes 1...6 of the sockets defined below. The - result of i2p.select.select() will be verified against these - lists. After this, calls c1() on S1, and c4() on S4.""" - S1 = pysocket.socket(pysocket.AF_INET, pysocket.SOCK_STREAM) - S2 = pysocket.socket(pysocket.AF_INET, pysocket.SOCK_DGRAM) - S3 = pysocket.socket(pysocket.AF_INET, pysocket.SOCK_RAW) - - kw = {'in_depth':0, 'out_depth':0} - S4 = socket.socket('Fella', socket.SOCK_STREAM, **kw) - S5 = socket.socket('Boar', socket.SOCK_DGRAM, **kw) - S6 = socket.socket('Gehka', socket.SOCK_RAW, **kw) - - if f1: f1(S1) - if f4: f4(S4) - - L = [S1, S2, S3, S4, S5, S6] - - start = time.time() - ans = select.select(L, L, L, timeout) - ans1 = select.select(L, [], [], timeout) - ans2 = select.select([], L, [], timeout) - ans3 = select.select([], [], L, timeout) - end = time.time() - T = end - start - - ans = [[L.index(x) + 1 for x in ans [i]] for i in range(3)] - ans1 = [[L.index(x) + 1 for x in ans1[i]] for i in range(3)] - ans2 = [[L.index(x) + 1 for x in ans2[i]] for i in range(3)] - ans3 = [[L.index(x) + 1 for x in ans3[i]] for i in range(3)] - - assert ans1[0] == rans - assert ans2[1] == wans - assert ans3[2] == eans - assert ans == [rans, wans, eans] - assert T < 4 * timeout + 0.1 - - if c1: c1(S1) - if c4: c4(S4) - -def test_select(): - """Unit test for select (Python and I2P sockets).""" - - def connect1(S): - """Connect regular Python socket to Google.""" - ip = pysocket.gethostbyname('www.google.com') - S.connect((ip, 80)) - - def connect4(S): - """Connect I2P Python socket to duck.i2p.""" - S.connect('duck.i2p') - - def full1(S): - """Connect regular Python socket to Google, and send.""" - connect1(S) - S.sendall('GET / HTTP/1.0\r\n\r\n') - S.recv(1) - - def full4(S): - """Connect I2P Python socket to duck.i2p, and send.""" - connect4(S) - S.sendall('GET / HTTP/1.0\r\n\r\n') - S.recv(1) - # Peek twice (make sure peek code isn't causing problems). - S.recv(1, i2p.socket.MSG_PEEK | i2p.socket.MSG_DONTWAIT) - S.recv(1, i2p.socket.MSG_PEEK | i2p.socket.MSG_DONTWAIT) - - def check(S): - """Verify that three chars recv()d are 'TTP'.""" - assert S.recv(3) == 'TTP' - - try: - for t in [0.0, 1.0]: - minitest_select([], [2, 3, 5, 6], [], t) - minitest_select([], [1, 2, 3, 4, 5, 6], [], t, - f1=connect1, f4=connect4) - minitest_select([], [1, 2, 3, 5, 6], [], t, - f1=connect1) - minitest_select([], [2, 3, 4, 5, 6], [], t, - f4=connect4) - minitest_select([1, 4], [1, 2, 3, 4, 5, 6], [], t, - f1=full1, f4=full4, c1=check, c4=check) - except: - print 'Unit test failed for i2p.select.select().' - traceback.print_exc(); sys.exit() - print 'i2p.select.select(): OK' - - -if __name__ == '__main__': - test_select() diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/test/test_socket.py i2p-0.9.50/apps/sam/python/src/i2p/test/test_socket.py --- i2p-0.9.49/apps/sam/python/src/i2p/test/test_socket.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/test/test_socket.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,427 +0,0 @@ - -# -------------------------------------------------------- -# test_socket.py: Unit tests for socket, select. -# -------------------------------------------------------- - -# Make sure we can import i2p -import sys; sys.path += ['../../'] - -import traceback, time, thread, threading, random, copy -from i2p import socket, select - -def test_passed(s, msg='OK'): - """Notify user that the given unit test passed.""" - print ' ' + (s + ':').ljust(50) + msg - -def verify_html(s): - """Raise an error if s does not end with """ - assert s.strip().lower()[-7:] == '' - -def resolve_test(name='duck.i2p'): - """Unit test for resolve.""" - try: - rname = socket.resolve(name) - except: - print 'Unit test failed for socket.resolve' - traceback.print_exc(); sys.exit() - - test_passed('socket.resolve', 'See below') - print ' Use hosts.txt to verify that ' + name + '=' + \ - rname[:15] + '...' - -def stream_client(dest): - """Sub-unit test for socket.socket in SOCK_STREAM mode.""" - S = socket.socket('Alice', socket.SOCK_STREAM) - S.connect(dest) - S.send('GET / HTTP/1.0\r\n\r\n') # Send request - f = S.makefile() # File object - - while True: # Read header - line = f.readline().strip() # Read a line - if line == '': break # Content begins - - s = f.read() # Get content - f.close() - S.close() - -def stream_client_test(): - """Unit test for socket.socket in SOCK_STREAM mode.""" - url = 'duck.i2p' - stream_client('http://' + url + '/') - stream_client(url) - stream_client(url + '/') - stream_client('http://' + url) - stream_client(socket.resolve('http://' + url + '/')) - test_passed('socket.socket stream client') - -def packet_test(raw=True): - """Unit test for socket.socket in SOCK_DGRAM or SOCK_RAW modes.""" - - try: - multithread_wait_time = 500.0 - may_need_increase = False - - kwargs = {'in_depth': 0, 'out_depth': 0} - if raw: - C = socket.socket('Carola', socket.SOCK_RAW, **kwargs) - D = socket.socket('Davey', socket.SOCK_RAW, **kwargs) - else: - C = socket.socket('Carol', socket.SOCK_DGRAM, **kwargs) - D = socket.socket('Dave', socket.SOCK_DGRAM, **kwargs) - - global C_recv, D_recv, C_got, D_got, __lock - C_recv = [] # Packets C *should* receive - D_recv = [] # Packets D *should* receive - C_got = [] # Packets C actually got - D_got = [] # Packets D actually got - - n = 50 # Create n threads - m = 40 # Each thread sends m packets - - global __done_count - __done_count = 0 - __lock = threading.Lock() - - # Use C and D to send and read in many different threads. - def f(): - # This code is run in each separate thread - global C_recv, D_recv, C_got, D_got, __lock, __done_count - for i in range(m): - # Random binary string of length 2-80. - index_list = range(random.randrange(2, 80)) - s = ''.join([chr(random.randrange(256)) for j in index_list]) - if random.randrange(2) == 0: - # Send packet from C to D, and log it. - C.sendto(s, 0, D.dest) - __lock.acquire() - D_recv += [s] - __lock.release() - else: - # Send packet from D to C, and log it. - D.sendto(s, 0, C.dest) - __lock.acquire() - C_recv += [s] - __lock.release() - time.sleep(0.01*random.uniform(0.0,1.0)) - # Read any available packets. - try: (p, fromaddr) = C.recvfrom(1000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == D.dest - - __lock.acquire() - if p != None: C_got += [p] - __lock.release() - - try: (p, fromaddr) = D.recvfrom(1000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == C.dest - - __lock.acquire() - if p != None: D_got += [p] - __lock.release() - - __lock.acquire() - __done_count += 1 - __lock.release() - - # Create n threads. - for i in range(n): - threading.Thread(target=f).start() - - # Wait for them to finish. - while __done_count < n: time.sleep(0.01) - - # Read any left-over received packets. - end_time = time.time() + multithread_wait_time - while time.time() < end_time: - # Read any available packets. - try: (p, fromaddr) = C.recvfrom(1000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == D.dest - - if p != None: C_got += [p] - - try: (p, fromaddr) = D.recvfrom(1000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None and not raw: assert fromaddr == C.dest - - if p != None: D_got += [p] - if len(C_got) == len(C_recv) and len(D_got) == len(D_recv): - break - - if time.time() >= end_time: - may_need_increase = True - - C_got.sort() - D_got.sort() - C_recv.sort() - D_recv.sort() - - assert C_got == C_recv - assert D_got == D_recv - - C.close() - D.close() - except: - if raw: - print 'Unit test failed for socket.socket (SOCK_RAW).' - print 'Raw packets are not reliable.' - else: - print 'Unit test failed for socket.socket (SOCK_DGRAM).' - print 'Datagram packets are not reliable.' - - if may_need_increase: - print 'Try increasing multithread_wait_time.' - - traceback.print_exc(); sys.exit() - - if raw: - test_passed('socket.socket (SOCK_RAW)') - else: - test_passed('socket.socket (SOCK_DGRAM)') - -def stream_test(): - """Multithreaded unit test for socket.socket (SOCK_STREAM).""" - - try: - multithread_wait_time = 200.0 - may_need_increase = False - - kwargs = {'in_depth':0, 'out_depth':0} - C = socket.socket('Carolic', socket.SOCK_STREAM, **kwargs) - D = socket.socket('David', socket.SOCK_STREAM, **kwargs) - Cout = socket.socket('Carolic', socket.SOCK_STREAM, **kwargs) - Dout = socket.socket('David', socket.SOCK_STREAM, **kwargs) - - assert C.dest == Cout.dest - assert D.dest == Dout.dest - - C.listen(5) - D.listen(5) - Cout.connect(D.dest) - Dout.connect(C.dest) - (Cin, ignoredest) = C.accept() - (Din, ignoredest) = D.accept() - - global C_recv, D_recv, C_got, D_got, __lock - C_recv = [] # String data C *should* receive - D_recv = [] # String data D *should* receive - C_got = [] # String data C actually got - D_got = [] # String data D actually got - - n = 50 # Create n threads - m = 40 # Each thread sends m strings - - global __done_count - __done_count = 0 - __lock = threading.Lock() - - # Use C and D to send and read in many different threads. - def f(): - # This code is run in each separate thread - global C_recv, D_recv, C_got, D_got, __lock, __done_count - for i in range(m): - # Random binary string of length 2-80. - index_list = range(random.randrange(2, 80)) - s = ''.join([chr(random.randrange(256)) for j in index_list]) - if random.randrange(2) == 0: - # Send packet from C to D, and log it. - __lock.acquire() - Cout.send(s) - D_recv += [s] - __lock.release() - else: - # Send packet from D to C, and log it. - __lock.acquire() - Dout.send(s) - C_recv += [s] - __lock.release() - time.sleep(0.01*random.uniform(0.0,1.0)) - # Read any available string data, non-blocking. - - __lock.acquire() - try: p = Cin.recv(100000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None: C_got += [p] - __lock.release() - - __lock.acquire() - try: p = Din.recv(100000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None: D_got += [p] - __lock.release() - - __lock.acquire() - __done_count += 1 - __lock.release() - - # Create n threads. - for i in range(n): - threading.Thread(target=f).start() - - # Wait for them to finish. - while __done_count < n: time.sleep(0.01) - - # Read any left-over received string data. - end_time = time.time() + multithread_wait_time - while time.time() < end_time: - # Read any available string data, non-blocking. - try: p = Cin.recv(100000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None: C_got += [p] - - try: p = Din.recv(100000, socket.MSG_DONTWAIT) - except socket.BlockError: p = None - if p != None: D_got += [p] - - if len(''.join(C_got)) == len(''.join(C_recv)) and \ - len(''.join(D_got)) == len(''.join(D_recv)): - break - - if time.time() >= end_time: - may_need_increase = True - - C_got = ''.join(C_got) - D_got = ''.join(D_got) - C_recv = ''.join(C_recv) - D_recv = ''.join(D_recv) - assert C_got == C_recv - assert D_got == D_recv - - Cin.close() - Din.close() - Cout.close() - Dout.close() - C.close() - D.close() - except: - print 'Unit test failed for socket.socket ' + \ - '(SOCK_STREAM, multithreaded).' - - if may_need_increase: - print 'Try increasing multithread_wait_time.' - - traceback.print_exc(); sys.exit() - - test_passed('socket.socket (SOCK_STREAM, multithreaded)') - - -def noblock_stream_test(): - """Unit test for non-blocking stream commands and listen.""" - - kwargs = {'in_depth': 0, 'out_depth': 0} - serv = socket.socket('Allison',socket.SOCK_STREAM,**kwargs) - serv.setblocking(False) - serv.listen(100) - assert serv.gettimeout() == 0.0 - - msg_to_client = 'Hi, client!!!!' - msg_to_server = 'Hi, server!' - - nconnects = 5 - - global server_done, client_count, client_lock - server_done = False - client_count = 0 - client_lock = threading.Lock() - - def serv_func(n = nconnects): - while True: - try: - (C, ignoredest) = serv.accept() - C.send(msg_to_client) - rmsg = C.recv(len(msg_to_server), socket.MSG_WAITALL) - if rmsg != msg_to_server: - raise ValueError('message should have been: ' + - repr(msg_to_server) + ' was: ' + repr(rmsg)) - C.close() - n -= 1 - if n == 0: break - except socket.BlockError: - pass - time.sleep(0.01) - global server_done - server_done = True - - def client_func(): - # FIXME: i2p.socket.NetworkError('TIMEOUT', '') errors are produced - # for our streams if we use '' for all clients. Why? - C = socket.socket('Bobb', socket.SOCK_STREAM, **kwargs) - C.setblocking(False) - try: - C.connect(serv.dest) - except socket.BlockError: - # One could also use timeout=0.1 and loop - (Rlist, Wlist, Elist) = select.select([C], [C], [C]) - if len(Elist) > 0: - assert Elist[0] == C - raise Elist[0].sessobj.err - C.send(msg_to_server) - C.setblocking(True) - rmsg = C.recv(len(msg_to_client), socket.MSG_WAITALL) - if rmsg != msg_to_client: - raise ValueError('message should have been: ' + - repr(msg_to_client) + ' was: ' + repr(rmsg)) - C.close() - global client_count, client_lock - - # Synchronized - client_lock.acquire() - try: client_count += 1 - finally: client_lock.release() - - - thread.start_new_thread(serv_func, ()) - - for i in range(nconnects): - thread.start_new_thread(client_func, ()) - - while True: - if server_done and client_count == nconnects: break - time.sleep(0.01) - - test_passed('socket.listen (SOCK_STREAM), and non-blocking IO') - -def multi_stream_test(n): - """See if we can have n streams open at once.""" - server = None - client = [None] * n - - kwargs = {'in_depth': 0, 'out_depth': 0} - server = socket.socket('Aligi',socket.SOCK_STREAM,**kwargs) - server.listen(n) - - for i in range(n): - client[i] = socket.socket('Bobo', socket.SOCK_STREAM, \ - in_depth=0, out_depth=0) - - for i in range(n): - client[i].connect(server.dest) - client[i].send('Hi') - - for i in range(n): - client[i].close() - server.close() - - test_passed(str(n) + ' streams open at once') - - -# Todo: -# select, poll -# More nonblocking unit tests - - -def test(): - print 'Testing:' - print "Comment and uncomment tests manually, if they don't finish." - - resolve_test() - noblock_stream_test() - stream_client_test() - packet_test(raw=True) - packet_test(raw=False) - stream_test() - multi_stream_test(200) - -if __name__ == '__main__': - test() diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/test/test_tunnel.py i2p-0.9.50/apps/sam/python/src/i2p/test/test_tunnel.py --- i2p-0.9.49/apps/sam/python/src/i2p/test/test_tunnel.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/test/test_tunnel.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ - -# -------------------------------------------------------- -# test_tunnel.py: Demos for tunnel (unit tests needed). -# -------------------------------------------------------- - -# Make sure we can import i2p -import sys; sys.path += ['../../'] - -import time -from i2p import tunnel - -def tunnel_server_demo(): - """Demo for tunnel.TunnelServer.""" - - T = tunnel.TunnelServer('Alisick', 8080, in_depth=0, out_depth=0) - - print 'Server ready at:' - print T.dest - while True: - time.sleep(0.01) - -def tunnel_client_demo(): - """Demo for tunnel.TunnelClient.""" - - T = tunnel.TunnelClient('Alliaha', 8001, 'duck.i2p', \ - in_depth=0, out_depth=0) - - print 'Serving up duck.i2p at http://127.0.0.1:8001/' - while True: - time.sleep(0.01) - - - -def test(): - print 'Demo:' - -# Demos: -# tunnel_server_demo() - tunnel_client_demo() - -if __name__ == '__main__': - test() diff -Nru i2p-0.9.49/apps/sam/python/src/i2p/tunnel.py i2p-0.9.50/apps/sam/python/src/i2p/tunnel.py --- i2p-0.9.49/apps/sam/python/src/i2p/tunnel.py 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/src/i2p/tunnel.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,228 +0,0 @@ - -# ------------------------------------------------------------- -# tunnel.py: Python SAM Tunnel classes -# ------------------------------------------------------------- - -"""Exchange data between I2P and regular TCP sockets.""" - -import time, threading, sys - -import i2p -import i2p.socket -import i2p.select -from i2p.pylib import socket as pysocket # Import Python socket - -def _exchange_data(A, B): - """Exchanges data A <-> B between open stream sockets A and B.""" - # FIXME: There's recv errors that we should be shutting - # down sockets for, but this seems to work OK. - err = None - try: - # Send data from A -> B while available. - while True: - # A -> B. - A.setblocking(False) - try: s = A.recv(1024) - except Exception, e: s = None - if s == '': raise i2p.socket.ClosedError - if s == None: - # No data available. Stop sending A -> B. - break - else: - B.setblocking(True) - B.sendall(s) - except Exception, e: - err = e - - try: - # Send data from B -> A while available. - while True: - # B -> A. - B.setblocking(False) - try: s = B.recv(1024) - except Exception, e: s = None - if s == '': raise i2p.socket.ClosedError - if s == None: - # No data available. Stop sending B -> A. - break - else: - A.setblocking(True) - A.sendall(s) - except Exception, e: - err = e - - # Re-raise error after finishing communications both ways. - if err != None: raise err - -def _test_connected(B): - """Raises an error if socket B is not yet connected.""" - [Rlist, Wlist, Elist] = i2p.select.select([B], [B], [B], 0.0) - if len(Wlist) == 0: - raise ValueError('socket not yet connected') - -class Tunnel: - def __init__(self, receive, make_send, nconnect=-1, timeout=60.0): - """A Tunnel relays connections from a 'receive' socket to one - or more 'send' sockets. The receive socket must be bound - and listening. For each incoming connection, a new send - socket is created by calling make_send(). Data is then - exchanged between the created streams until one socket is - closed. nconnect is the maximum number of simultaneous - connections (-1 for infinite), and timeout is the time that - a single connection can last for (None allows a connection - to last forever). - - Sockets must accept stream traffic and support the Python - socket interface. A separate daemonic thread is created to - manage the tunnel. For high performance, make_send() should - make a socket and connect in non-blocking mode (you should - catch and discard the i2p.socket.BlockError or socket.error - due to executing connect on a non-blocking socket). - - Security Note: - A firewall is needed to maintain the end user's anonymity. - An attacker could keep a tunnel socket open by pinging it - regularly. The accepted sockets from 'receive' must prevent - this by closing down eventually. - - Socket errors do not cause the Tunnel to shut down. - """ - - self.receive = receive - self.make_send = make_send - self.receive.setblocking(False) - self.alive = True - self.nconnect = nconnect - self.timeout = timeout - T = threading.Thread(target=self._run, args=()) - T.setDaemon(True) - T.start() - - def _run(self): - """Manage the tunnel in a separate thread.""" - tunnels = [] - - while True: - # Look for a new connection - if self.nconnect < 0 or len(tunnels) < self.nconnect: - (A, B) = (None, None) - try: - (A, ignoredest) = self.receive.accept() - A.setblocking(False) - B = self.make_send() - B.setblocking(False) - if self.timeout != None: t = time.time() + self.timeout - else: t = None - tunnels.append((A, B, t)) - except Exception, e: - try: - if A != None: - A.setblocking(False); A.close() - except Exception, e: pass - try: - if B != None: - B.setblocking(False); B.close() - except Exception, e: pass - - # Send data between existing connections - new_tunnels = [] - for (A, B, t) in tunnels: - # For each connection pair, send data. - try: - if t != None: assert time.time() <= t - # Test whether B is successfully connected - _test_connected(B) - - # Send A <-> B. - _exchange_data(A, B) - - if self.timeout != None: t = time.time() + self.timeout - else: t = None - new_tunnels.append((A, B, t)) - except Exception, e: - # Catch errors. Kill the connection if it's been at - # least timeout seconds since last non-erroneous call - # to _exchange_data, or if stream was closed. This - # allows stream-not-finished-connecting errors to be - # dropped within the timeout. - time_ok = True - if self.timeout != None: - if time.time() > t: time_ok = False - if time_ok and not isinstance(e, i2p.socket.ClosedError): - # Don't kill connection yet - new_tunnels.append((A, B, t)) - else: - # We've only gotten errors for 'timeout' s. - # Drop the connection. - try: A.setblocking(False); A.close() - except Exception, e: pass - try: B.setblocking(False); B.close() - except Exception, e: pass - tunnels = new_tunnels - time.sleep(0.01) - - # Shut down all connections if self.close() was called. - if not self.alive: - for (A, B, t) in tunnels: - try: A.setblocking(False); A.close() - except: pass - try: B.setblocking(False); B.close() - except: pass - break - - def close(self): - """Close all connections made for this tunnel.""" - self.alive = False - -class TunnelServer(Tunnel): - dest = property(doc='I2P Destination of server.') - session = property(doc='Session name for server.') - def __init__(self, session, port, samaddr=i2p.socket.samaddr, - nconnect=-1, timeout=None, **kwargs): - """Tunnels incoming SAM streams --> localhost:port. - - nconnect and timeout are the maximum number of connections - and maximum time per connection. All other arguments are - passed to i2p.socket.socket(). This call blocks until the - tunnel is ready.""" - S = i2p.socket.socket(session, i2p.socket.SOCK_STREAM, samaddr, - **kwargs) - S.listen(64) - self.session = session - self.dest = S.dest - def make_send(): - C = pysocket.socket(pysocket.AF_INET, pysocket.SOCK_STREAM) - C.setblocking(False) - try: C.connect(('127.0.0.1', port)) - except: pass # Ignore 'would have blocked' error - return C - Tunnel.__init__(self, S, make_send, nconnect, timeout) - -class TunnelClient(Tunnel): - remotedest = property(doc='Remote Destination.') - dest = property('Local Destination used for routing.') - session = property('Session name for local Destination.') - def __init__(self, session, port, dest, samaddr=i2p.socket.samaddr, - nconnect=-1, timeout=None, **kwargs): - """Tunnels localhost:port --> I2P Destination dest. - - A session named 'session' is created locally, for purposes - of routing to 'dest'. nconnect and timeout are the maximum - number of connections and maximum time per connection. All - other arguments are passed to i2p.socket.socket(). This call - blocks until the tunnel is ready.""" - S = pysocket.socket(pysocket.AF_INET, pysocket.SOCK_STREAM) - S.bind(('', port)) - S.listen(4) - obj = i2p.socket.socket(session, i2p.socket.SOCK_STREAM, samaddr, - **kwargs) - self.session = session - self.dest = obj.dest - def make_send(): - C = i2p.socket.socket(session, i2p.socket.SOCK_STREAM, samaddr, - **kwargs) - C.setblocking(False) - try: C.connect(dest) - except: pass # Ignore 'would have blocked' error - return C - Tunnel.__init__(self, S, make_send, nconnect, timeout) diff -Nru i2p-0.9.49/apps/sam/python/todo.txt i2p-0.9.50/apps/sam/python/todo.txt --- i2p-0.9.49/apps/sam/python/todo.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/sam/python/todo.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - -Todo: - -* Deal with known bugs (see bugs.txt). -* Clean up code. - See the comments at the top of samclasses.py. -* Use a logger framework (perhaps Python module logging). -* Deal with FIXME comments. -* Unit tests for close then do something errors. - Try closing a stream at one end, and make sure the other - end gets all the data sent before closing. -* Make an event-based socket class. - (eg asyncore). diff -Nru i2p-0.9.49/apps/streaming/java/build.xml i2p-0.9.50/apps/streaming/java/build.xml --- i2p-0.9.49/apps/streaming/java/build.xml 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/streaming/java/build.xml 2021-05-19 12:11:57.000000000 +0000 @@ -210,7 +210,7 @@ - + @@ -282,7 +282,7 @@ - + @@ -299,7 +299,7 @@ - + diff -Nru i2p-0.9.49/apps/streaming/java/src/net/i2p/client/streaming/impl/BandwidthEstimator.java i2p-0.9.50/apps/streaming/java/src/net/i2p/client/streaming/impl/BandwidthEstimator.java --- i2p-0.9.49/apps/streaming/java/src/net/i2p/client/streaming/impl/BandwidthEstimator.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/streaming/java/src/net/i2p/client/streaming/impl/BandwidthEstimator.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -package net.i2p.client.streaming.impl; - -/** - * A Westwood bandwidth estimator - * - * @since 0.9.46 - */ -interface BandwidthEstimator { - - /** - * Records an arriving ack. - * @param acked how many packets were acked with this ack - */ - public void addSample(int acked); - - /** - * @return the current bandwidth estimate in packets/ms. - */ - public float getBandwidthEstimate(); -} diff -Nru i2p-0.9.49/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java i2p-0.9.50/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java --- i2p-0.9.49/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java 2021-05-19 12:11:57.000000000 +0000 @@ -17,6 +17,7 @@ import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.SigningPublicKey; +import net.i2p.util.BandwidthEstimator; import net.i2p.util.Log; import net.i2p.util.SimpleTimer; import net.i2p.util.SimpleTimer2; diff -Nru i2p-0.9.49/apps/streaming/java/src/net/i2p/client/streaming/impl/SimpleBandwidthEstimator.java i2p-0.9.50/apps/streaming/java/src/net/i2p/client/streaming/impl/SimpleBandwidthEstimator.java --- i2p-0.9.49/apps/streaming/java/src/net/i2p/client/streaming/impl/SimpleBandwidthEstimator.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/streaming/java/src/net/i2p/client/streaming/impl/SimpleBandwidthEstimator.java 2021-05-19 12:11:58.000000000 +0000 @@ -2,6 +2,7 @@ import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; +import net.i2p.util.BandwidthEstimator; import net.i2p.util.Log; /** diff -Nru i2p-0.9.49/apps/susidns/locale/messages_en.po i2p-0.9.50/apps/susidns/locale/messages_en.po --- i2p-0.9.49/apps/susidns/locale/messages_en.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/locale/messages_en.po 2021-05-19 12:11:58.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: I2P susidns\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-02-05 14:31+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" "PO-Revision-Date: 2010-06-15 14:09+0100\n" "Last-Translator: duck \n" "Language-Team: duck \n" @@ -116,14 +116,14 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:658 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:691 msgid "Add" msgstr "" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:262 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:650 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:683 msgid "Replace" msgstr "" @@ -198,7 +198,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:349 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:572 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:605 msgid "Delete Selected" msgstr "" @@ -229,7 +229,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:296 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:317 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:654 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:687 msgid "Add Alternate" msgstr "" @@ -360,7 +360,7 @@ msgstr "" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:200 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:672 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:705 msgid "Import" msgstr "" @@ -437,100 +437,129 @@ msgid "Storage" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:287 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:256 +msgid "" +"Addresses in the Private Address Book are not shared with anyone else unless " +"you copy them by hand." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:263 +msgid "" +"The Published Address Book is used for sharing addresses using your I2P Site." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:265 +msgid "Sites in the Private Address Book are not published here." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:272 +msgid "This is the Local Address Book." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:275 +msgid "Use it for sites that you host on this computer." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:282 +msgid "" +"The Router Address Book is automatically generated by combining the " +"Subscriptions, Local, Private, and Published address books." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "Export in hosts.txt format" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:336 msgid "Current filter" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:340 msgid "clear filter" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:335 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Filter" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:352 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:385 msgid "other" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:354 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:387 msgid "all" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:360 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:393 msgid "Search" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:402 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:640 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:435 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:673 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:268 msgid "Hostname" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:437 msgid "Link (b32)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:406 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:439 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:374 msgid "Destination" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:420 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:453 msgid "Select hosts for deletion from address book" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:468 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:501 msgid "View larger version of identicon for this hostname" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:482 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:515 msgid "Base 32 address" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:488 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:521 msgid "Helper link to share host address with option to add to address book" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:494 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:527 msgid "More information on this entry" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:497 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:530 msgid "details" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:517 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:550 msgid "Mark for deletion" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:570 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:648 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:670 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:603 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:681 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:703 msgid "Cancel" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:618 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:651 msgid "This address book is empty." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:638 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:671 msgid "Add new destination" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:644 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:677 msgid "Destination or Base 32 Address" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:666 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:699 msgid "Import from hosts.txt file" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:668 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:701 msgid "File" msgstr "" @@ -730,64 +759,70 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:208 msgid "" +"You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P " +"Destinations." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 msgid "" "For more information on naming in I2P, see the overview." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 msgid "How does the address book application work?" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 msgid "" "The address book application regularly polls your subscriptions and merges " "their content into your \"router\" address book." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 msgid "" "Then it merges your \"local\" address book into the router address book as " "well." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an I2P " "Site." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 msgid "" "The router also uses a private address book, which is not merged or " "published." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 msgid "" "Hosts in the private address book can be accessed by you but their addresses " "are never distributed to others." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:230 msgid "" "The private address book can also be used for aliases of hosts in your other " "address books." diff -Nru i2p-0.9.49/apps/susidns/locale/messages_fr.po i2p-0.9.50/apps/susidns/locale/messages_fr.po --- i2p-0.9.49/apps/susidns/locale/messages_fr.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/locale/messages_fr.po 2021-05-19 12:11:58.000000000 +0000 @@ -21,8 +21,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 20:09+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 17:06+0000\n" "Last-Translator: AO \n" "Language-Team: French (http://www.transifex.com/otf/I2P/language/fr/)\n" "MIME-Version: 1.0\n" @@ -129,14 +129,14 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:658 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:691 msgid "Add" msgstr "Ajouter" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:262 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:650 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:683 msgid "Replace" msgstr "Remplacer" @@ -211,7 +211,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:349 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:572 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:605 msgid "Delete Selected" msgstr "Supprimer les éléments sélectionnés" @@ -242,7 +242,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:296 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:317 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:654 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:687 msgid "Add Alternate" msgstr "Ajouter un substitut" @@ -373,7 +373,7 @@ msgstr "Les abonnements ont été rechargés." #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:200 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:672 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:705 msgid "Import" msgstr "Importer" @@ -450,100 +450,130 @@ msgid "Storage" msgstr "Stockage" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:287 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:256 +msgid "" +"Addresses in the Private Address Book are not shared with anyone else unless" +" you copy them by hand." +msgstr "Les adresses du carnet d’adresses privé ne sont partagées avec personne d’autre, à moins que vous ne les copiiez manuellement." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:263 +msgid "" +"The Published Address Book is used for sharing addresses using your I2P " +"Site." +msgstr "Le carnet d’adresses publié est utilisé pour partager les adresses qui utilisent votre site I2P." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:265 +msgid "Sites in the Private Address Book are not published here." +msgstr "Les sites qui se trouvent dans le carnet d’adresses privé ne sont pas publiés ici." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:272 +msgid "This is the Local Address Book." +msgstr "Ceci est le carnet d’adresses local." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:275 +msgid "Use it for sites that you host on this computer." +msgstr "Utilisez-le pour les sites que vous hébergez sur votre ordinateur." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:282 +msgid "" +"The Router Address Book is automatically generated by combining the " +"Subscriptions, Local, Private, and Published address books." +msgstr "Le carnet d’adresses du routeur est généré automatiquement en combinant les carnets d’adresses Abonnements, Local, Privé, et Publié." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "Export in hosts.txt format" msgstr "Exporter au format hosts.txt" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:336 msgid "Current filter" msgstr "Filtre actuel" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:340 msgid "clear filter" msgstr "effacer le filtre" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:335 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Filter" msgstr "Filtrer" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:352 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:385 msgid "other" msgstr "autre" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:354 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:387 msgid "all" msgstr "tout" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:360 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:393 msgid "Search" msgstr "Chercher" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:402 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:640 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:435 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:673 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:268 msgid "Hostname" msgstr "Nom d’hôte" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:437 msgid "Link (b32)" msgstr "Lien (b32)" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:406 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:439 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:374 msgid "Destination" msgstr "Destination" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:420 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:453 msgid "Select hosts for deletion from address book" msgstr "Sélectionner les hôtes à supprimer du carnet d’adresses" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:468 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:501 msgid "View larger version of identicon for this hostname" msgstr "Voir une version plus grande de l’identicône pour ce nom d’hôte" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:482 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:515 msgid "Base 32 address" msgstr "Adresse Base32" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:488 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:521 msgid "Helper link to share host address with option to add to address book" msgstr "Lien d’aide pour partager une adresse d’hôte, avec l’option de l’ajouter au carnet d’adresses" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:494 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:527 msgid "More information on this entry" msgstr "Plus d’informations sur cette entrée" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:497 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:530 msgid "details" msgstr "détails" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:517 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:550 msgid "Mark for deletion" msgstr "Marquer pour suppression" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:570 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:648 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:670 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:603 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:681 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:703 msgid "Cancel" msgstr "Annuler" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:618 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:651 msgid "This address book is empty." msgstr "Ce carnet d’adresses est vide." -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:638 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:671 msgid "Add new destination" msgstr "Ajouter une nouvelle destination" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:644 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:677 msgid "Destination or Base 32 Address" msgstr "Destination ou adresse Base32" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:666 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:699 msgid "Import from hosts.txt file" msgstr "Importer du fichier hosts.txt" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:668 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:701 msgid "File" msgstr "Fichier" @@ -743,64 +773,70 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:208 msgid "" +"You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P" +" Destinations." +msgstr "Vous pouvez l’utiliser pour connecter des noms lisibles par l’utilisateur, tels que i2p-projekt.i2p, à des destinations I2P." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "Actualise régulièrement votre fichier hosts.txt à partir de sources distribuées ou « abonnements »." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." msgstr "Dans la configuration par défaut, le carnet d’adresses n’est qu’abonné à {0}." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." msgstr "Il est facile de s’abonner à des sites supplémentaires. Il vous suffit de les ajouter à votre fichier d’abonnements." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 msgid "" "For more information on naming in I2P, see the overview." msgstr "Pour plus d’informations sur le nommage dans I2P, consulter la vue d’ensemble." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 msgid "How does the address book application work?" msgstr "Comment l’application de carnet d’adresses fonctionne-t-elle ?" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 msgid "" "The address book application regularly polls your subscriptions and merges " "their content into your \"router\" address book." msgstr "L’application de carnet d’adresses interroge régulièrement vos abonnements et fusionne leur contenu dans le carnet d’adresses de votre routeur." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 msgid "" "Then it merges your \"local\" address book into the router address book as " "well." msgstr "Puis elle fusionne aussi votre carnet d’adresses « local » au carnet d’adresses du routeur. " -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an I2P " "Site." msgstr "Si configuré ainsi, le carnet d’adresses du routeur est alors écrit vers le carnet d’adresses « publié » qui sera proposé publiquement si vous gérez un site I2P." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 msgid "" "The router also uses a private address book, which is not merged or " "published." msgstr "Le routeur utilise aussi un carnet d’adresses privé qui n’est ni fusionné ni publié" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 msgid "" "Hosts in the private address book can be accessed by you but their addresses" " are never distributed to others." msgstr "Vous pouvez accéder aux hôtes du carnet d’adresses privé, mais leurs adresses ne sont distribuées à personne." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:230 msgid "" "The private address book can also be used for aliases of hosts in your other" " address books." diff -Nru i2p-0.9.49/apps/susidns/locale/messages_ja.po i2p-0.9.50/apps/susidns/locale/messages_ja.po --- i2p-0.9.49/apps/susidns/locale/messages_ja.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/locale/messages_ja.po 2021-05-19 12:11:58.000000000 +0000 @@ -7,14 +7,15 @@ # タカハシ, 2013-2014 # タカハシ, 2015 # rafe , 2015 -# riopfga caetocla, 2020-2021 +# XMPPはいいぞ, 2020-2021 +# XMPPはいいぞ, 2021 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-05 15:27+0000\n" -"Last-Translator: zzzi2p\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-14 01:18+0000\n" +"Last-Translator: XMPPはいいぞ\n" "Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -76,7 +77,7 @@ #: ../src/java/src/i2p/susi/dns/AddressBean.java:265 #, java-format msgid "Type {0}" -msgstr "タイプ {0}" +msgstr "種類 {0}" #: ../src/java/src/i2p/susi/dns/AddressBean.java:252 #: ../src/java/src/i2p/susi/dns/AddressBean.java:259 @@ -94,7 +95,7 @@ #, java-format msgid "Filtered list contains 1 entry." msgid_plural "Filtered list contains {0} entries." -msgstr[0] "フィルターされたリストは {0} エントリを含みます。" +msgstr[0] "フィルターされたリストは{0}項目を含みます。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204 #, java-format @@ -106,7 +107,7 @@ #, java-format msgid "Address book contains 1 entry." msgid_plural "Address book contains {0} entries." -msgstr[0] "アドレス帳には {0} エントリが含まれます。" +msgstr[0] "アドレス帳には{0}項目が含まれます。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229 #, java-format @@ -116,14 +117,14 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:658 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:691 msgid "Add" msgstr "追加" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:262 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:650 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:683 msgid "Replace" msgstr "置き換える" @@ -163,12 +164,12 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:322 msgid "Warning - hostname does not end with \".i2p\"" -msgstr "" +msgstr "警告 - ホスト名は\".i2p\"で終わりません" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:320 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:334 msgid "Invalid Base 32 hostname." -msgstr "" +msgstr "無効な Base 32 のホスト名。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:322 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:336 @@ -179,12 +180,12 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:342 #, java-format msgid "Invalid hostname \"{0}\"." -msgstr "" +msgstr "無効なホスト名 \"{0}\" 。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:332 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:345 msgid "Please enter a hostname and destination" -msgstr "" +msgstr "ホスト名と宛先を入力してください" #. clear search when deleting #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 @@ -194,11 +195,11 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:387 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:402 msgid "Delete Entry" -msgstr "エントリを削除" +msgstr "項目を削除" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:349 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:572 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:605 msgid "Delete Selected" msgstr "選択したものを削除" @@ -220,7 +221,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:355 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:384 msgid "No entries selected to delete." -msgstr "削除すると選択されたエントリなし。" +msgstr "削除すると選択された項目なし。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:359 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 @@ -228,9 +229,9 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:296 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:317 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:654 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:687 msgid "Add Alternate" -msgstr "" +msgstr "代替を追加" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:366 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:391 @@ -239,7 +240,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:369 msgid "ERROR: Could not write address book file." -msgstr "" +msgstr "エラー: アドレス帳ファイルは書き込めません。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:374 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:108 @@ -316,7 +317,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:571 msgid "No entries found in file" -msgstr "ファイルにはエントリを見つけられません" +msgstr "ファイルに項目を見つけられません" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:581 #, java-format @@ -331,13 +332,13 @@ #, java-format msgid "Loaded {0} entry from file" msgid_plural "Loaded {0} entries from file" -msgstr[0] "ファイルから{0}のエントリを読み込みました" +msgstr[0] "ファイルから{0}の項目を読み込みました" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:599 #, java-format msgid "Skipped {0} duplicate entry from file" msgid_plural "Skipped {0} duplicate entries from file" -msgstr[0] "ファイルから{0}の重複したエントリをスキップしました" +msgstr[0] "ファイルから{0}の重複した項目をスキップしました" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:605 msgid "Import from file failed" @@ -346,7 +347,7 @@ #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:148 msgid "" "Subscriptions saved, updating address book from subscription sources now." -msgstr "" +msgstr "購読が保存されました、現在は購読ソースからアドレス帳を更新します。" #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 msgid "Subscriptions saved." @@ -357,7 +358,7 @@ msgstr "購読が再読込されました。" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:200 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:672 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:705 msgid "Import" msgstr "インポート" @@ -396,7 +397,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:196 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:205 msgid "Router" -msgstr "ルーター" +msgstr "ルータ" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:235 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:216 @@ -434,100 +435,130 @@ msgid "Storage" msgstr "ストレージ" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:287 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:256 +msgid "" +"Addresses in the Private Address Book are not shared with anyone else unless" +" you copy them by hand." +msgstr "プライベートアドレス帳のアドレスは、あなたが手でコピーしない限り、他の人と共有されることはありません。" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:263 +msgid "" +"The Published Address Book is used for sharing addresses using your I2P " +"Site." +msgstr "公開アドレス帳は、I2Pサイトでアドレスを共有する際に使用します。" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:265 +msgid "Sites in the Private Address Book are not published here." +msgstr "プライベートアドレス帳のサイトはここでは公開されません。" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:272 +msgid "This is the Local Address Book." +msgstr "これはローカルのアドレス帳です。" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:275 +msgid "Use it for sites that you host on this computer." +msgstr "このコンピュータでホストするサイトに使用してください。" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:282 +msgid "" +"The Router Address Book is automatically generated by combining the " +"Subscriptions, Local, Private, and Published address books." +msgstr "ルータのアドレス帳は、購読、ローカル、プライペート、及び公開の各アドレス帳を組み合わせて自動的に生成されます。" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "Export in hosts.txt format" msgstr "hosts.txt 形式でエクスポート" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:336 msgid "Current filter" msgstr "現在のフィルター" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:340 msgid "clear filter" -msgstr "フィルターをクリア" +msgstr "フィルターを消去" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:335 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Filter" msgstr "フィルター" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:352 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:385 msgid "other" msgstr "その他" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:354 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:387 msgid "all" msgstr "全て" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:360 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:393 msgid "Search" msgstr "検索" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:402 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:640 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:435 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:673 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:268 msgid "Hostname" msgstr "ホスト名" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:437 msgid "Link (b32)" msgstr "リンク(b32)" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:406 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:439 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:374 msgid "Destination" msgstr "宛先" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:420 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:453 msgid "Select hosts for deletion from address book" -msgstr "" +msgstr "アドレス帳から削除するhostsを選択" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:468 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:501 msgid "View larger version of identicon for this hostname" -msgstr "" +msgstr "このホスト名用の大きい版のidenticonを見る" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:482 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:515 msgid "Base 32 address" msgstr "Base 32 アドレス" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:488 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:521 msgid "Helper link to share host address with option to add to address book" -msgstr "" +msgstr "アドレス帳へ追加する設定でホストアドレスを共有するためのヘルパーリンク" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:494 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:527 msgid "More information on this entry" -msgstr "このエントリに関する詳細" +msgstr "この項目に関する詳細" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:497 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:530 msgid "details" msgstr "詳細" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:517 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:550 msgid "Mark for deletion" msgstr "削除にマーク" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:570 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:648 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:670 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:603 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:681 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:703 msgid "Cancel" msgstr "キャンセル" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:618 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:651 msgid "This address book is empty." msgstr "アドレス帳" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:638 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:671 msgid "Add new destination" msgstr "新しい宛先を追加" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:644 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:677 msgid "Destination or Base 32 Address" msgstr "宛先またはBase 32 アドレス" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:666 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:699 msgid "Import from hosts.txt file" msgstr "hosts.txt ファイルからインポート" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:668 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:701 msgid "File" msgstr "ファイル" @@ -538,7 +569,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:224 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:215 msgid "File location" -msgstr "ファイル位置" +msgstr "ファイルの位置" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:239 msgid "Hints" @@ -549,31 +580,31 @@ "File and directory paths here are relative to the address book's working " "directory, which is normally ~/.i2p/addressbook/ (Linux) or " "%LOCALAPPDATA%\\I2P\\addressbook\\ (Windows)." -msgstr "" +msgstr "ここのファイルとディレクトリのパスはアドレス帳が動作するディレクトリに関連しており、通常は ~/.i2p/addressbook/ (Linux) または %LOCALAPPDATA%\\I2P\\addressbook\\ (Windows) です。" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:243 msgid "" "If you want to manually add lines to an address book, add them to the " "private or local address books." -msgstr "" +msgstr "アドレス帳に手動で行を追加したい場合は、プライベートまたはローカルのアドレス帳に追加してください。" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:245 msgid "" "The router address book and the published address book are updated by the " "address book application." -msgstr "" +msgstr "ルータのアドレス帳と公開アドレス帳は、アドレス帳アプリケーションから更新されます。" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:247 msgid "" "When you publish your address book, ALL destinations from the local and " "router address books appear there." -msgstr "" +msgstr "アドレス帳を公開するとき、ローカルとルータのアドレス帳の全ての宛先がそこに現れます。" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:249 msgid "" "Use the private address book for private destinations, these are not " "published." -msgstr "" +msgstr "プライベートな宛先のためにプライベートなアドレス帳を使用すると、公開されません。" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:251 msgid "Options" @@ -585,7 +616,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:255 msgid "Update interval in hours" -msgstr "数時間の更新間隔" +msgstr "アップデートの更新間隔" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:257 msgid "" @@ -599,11 +630,11 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:261 msgid "Your personal address book, these hosts will be published" -msgstr "" +msgstr "あなたの個人用アドレス帳、これらのホストは公開されます" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:263 msgid "Your private address book, it is never published" -msgstr "" +msgstr "あなたのプライベートアドレス帳、決して公開されません" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:265 msgid "Port for your eepProxy (no need to change)" @@ -615,7 +646,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:269 msgid "Whether to update the published address book" -msgstr "" +msgstr "公開アドレス帳を更新するかどうか" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:271 msgid "" @@ -635,7 +666,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:277 msgid "Name of the theme to use (defaults to 'light')" -msgstr "使用するテーマの名前 (デフォルトでは'ライト')" +msgstr "使用するテーマの名前 (初期設定では'ライト')" #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:282 msgid "Encoded Name" @@ -719,76 +750,82 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:204 msgid "What is the address book?" -msgstr "" +msgstr "アドレス帳とは?" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:206 msgid "The address book application is part of your I2P installation." -msgstr "" +msgstr "アドレス帳アプリケーションは、あなたの I2P のインストールの一部です。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:208 msgid "" +"You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P" +" Destinations." +msgstr "I2Pの宛先に、 i2p-projekt.i2p のような、人間に読める名前を接続するために使用することができます。" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "定期的に配布されているソース、あるいは「購読」から hosts.txt ファイルを更新します。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." msgstr "初期設定では、アドレス帳は{0}に設定されています。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." msgstr "追加サイトへの購読は簡単です、購読ファイルに追加するだけです。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 msgid "" "For more information on naming in I2P, see the overview." -msgstr "" +msgstr "I2P における名付けに関する詳細については、概観をご覧ください。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 msgid "How does the address book application work?" -msgstr "" +msgstr "アドレス帳アプリケーションはどのように動作するのか?" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 msgid "" "The address book application regularly polls your subscriptions and merges " "their content into your \"router\" address book." -msgstr "" +msgstr "アドレス帳アプリケーションは定期的に購読を調査し、「ルータ」アドレス帳内に内容を統合します。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 msgid "" "Then it merges your \"local\" address book into the router address book as " "well." -msgstr "" +msgstr "その後、あなたの「マスター」アドレス帳も同様に、ルータアドレス帳に統合します。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an I2P " "Site." -msgstr "" +msgstr "設定している場合、ルータアドレス帳は、 I2P サイトを運用している場合、一般に公表される「公開」アドレス帳に書き込まれています。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 msgid "" "The router also uses a private address book, which is not merged or " "published." -msgstr "" +msgstr "ルータは、統合または公開されないプライベートアドレス帳も使います。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 msgid "" "Hosts in the private address book can be accessed by you but their addresses" " are never distributed to others." msgstr "プライベートアドレス帳のホストは、あなたがアクセスすることはできますが、アドレスが他者に配布されることはありません。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:230 msgid "" "The private address book can also be used for aliases of hosts in your other" " address books." -msgstr "プライベートアドレス帳は他のアドレス帳内のホストのエイリアスに対しても使用できます。" +msgstr "プライベートアドレス帳は、他のアドレス帳内のホストのエイリアスに対しても使用できます。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:191 msgid "subscriptions" @@ -801,7 +838,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:232 msgid "" "The address book application regularly checks this list for new I2P Sites." -msgstr "" +msgstr "アドレス帳アプリケーションは定期的にこの新しいI2P サイト のリストを確認します。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:234 msgid "Those URLs refer to published hosts.txt files." @@ -812,7 +849,7 @@ msgid "" "The default subscription is the hosts.txt from {0}, which is updated " "infrequently." -msgstr "初期購読には{0}と設定されているhosts.txtしか存在しません。加えてこの状態ではアップデートはほとんど行われません。" +msgstr "初期購読には{0}と設定されているhosts.txtしか存在しません。加えてこの状態では更新はほとんど行われません。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:238 msgid "" @@ -822,40 +859,40 @@ #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:240 msgid "See the FAQ for a list of subscription URLs." -msgstr "購読 URL の一覧については、 FAQ をご覧ください。" +msgstr "購読 URL の一覧については、よくある質問をご覧ください。" #: build/HowSVG.java:5 msgid "" "If SusiDNS is configured to publish your Router address book, the entries " "will appear in your Published address book and saved to a hosts.txt file for" " sharing." -msgstr "" +msgstr "SusiDNSがあなたのルータアドレス帳を公開する設定のとき、項目ーは公開アドレス帳に表示され、共有用に hosts.txt ファイルに保存されます。" #: build/HowSVG.java:6 msgid "Published Addressbook" -msgstr "" +msgstr "公開アドレス帳" #: build/HowSVG.java:7 msgid "" "To configure SusiDNS to push your Router address book to your Published " "address book, set 'should_publish=true' on the configuration page." -msgstr "" +msgstr "ルータアドレス帳を公開アドレス帳にプッシュするように SusiDNS を設定するには、設定ページで'should_publish=true'を設定します。" #: build/HowSVG.java:8 msgid "" "All hosts derived from subscriptions will appear in this address book, in " "addition to any you manually add here or to your Local address book." -msgstr "" +msgstr "購読から派生したすべてのホストは、ここまたはローカルアドレス帳で手動で追加したものに加えて、このアドレス帳に表示されます。" #: build/HowSVG.java:9 msgid "Router Addressbook" -msgstr "ルーターのアドレス帳" +msgstr "ルータのアドレス帳" #: build/HowSVG.java:10 msgid "" "Hosts you manually add here will never be published. You can also add " "aliases to hosts in other address books here." -msgstr "" +msgstr "ここで手動で追加したホストが公開されることはありません。他のアドレス帳のホストにエイリアスを追加することもできます。" #: build/HowSVG.java:11 msgid "Private Addressbook" @@ -869,19 +906,19 @@ msgid "" "I2P applications (including the HTTP proxy) use the hosts in your local " "address books to resolve .i2p hostnames." -msgstr "" +msgstr "I2Pアプリケーション (HTTPプロキシを含む) は、ローカルのアドレス帳のホストを使用して .i2p ホスト名を解決します。" #: build/HowSVG.java:14 msgid "" "Additional subscriptions can be found in the FAQ section of the Router help " "page." -msgstr "" +msgstr "追加の購読はルータヘルプページのよくある質問の節で見つけられます。" #: build/HowSVG.java:16 msgid "" "Hosts sourced from your subscriptions are added to your Router address book," " and are automatically synced (by default every 12 hours)." -msgstr "" +msgstr "購読からのホストの情報はルータのアドレス帳に追加され、自動で同期されます(初期設定では12時間毎)" #: build/HowSVG.java:17 msgid "Configure Subscriptions" @@ -891,11 +928,11 @@ msgid "" "If you manually add hosts here, they will be included your Published address" " book (if configured)." -msgstr "" +msgstr "ホストをここへ手動で追加した場合、それらはあなたの公開アドレス帳に含まれています(設定されている場合)。" #: build/HowSVG.java:19 msgid "Local Addressbook" -msgstr "" +msgstr "ローカルのアドレス帳" #: build/HowSVG.java:20 msgid "Searchable by" @@ -909,7 +946,7 @@ msgid "" "The Local, Router and Private address books collectively serve as the DNS " "authority for I2P applications." -msgstr "" +msgstr "ローカル、ルータ、及びプライベートのアドレス帳は、I2PアプリケーションのDNS権威としてまとめて機能します。" #: build/HowSVG.java:23 msgid "Optional," @@ -917,23 +954,23 @@ #: build/HowSVG.java:24 msgid "for websites" -msgstr "" +msgstr "ウェブサイト用" #: build/HowSVG.java:25 msgid "" "If you configure SusiDNS to publish your Router address book, it will export" " a hosts.txt file containing all the hosts (by default to the root of your " "eepsite)." -msgstr "" +msgstr "ルータのアドレス帳を公開するように SusiDNS を設定すると、全てのホストを含む hosts.txt ファイルをエクスポートします (初期設定では、あなたの eepsite のルートへ)。" #: build/HowSVG.java:26 msgid "" "Addresses manually added to your Local address book will merge with your " "Router address book." -msgstr "" +msgstr "ローカルのアドレス帳へ手動でアドレスを追加すると、あなたのルータアドレス帳と統合されます" #: build/HowSVG.java:27 msgid "" "Hosts you receive from your subscriptions will merge with your Router " "address book." -msgstr "" +msgstr "購読から受信するホストは、あなたのルータアドレス帳と統合されます。" diff -Nru i2p-0.9.49/apps/susidns/locale/messages_pl.po i2p-0.9.50/apps/susidns/locale/messages_pl.po --- i2p-0.9.49/apps/susidns/locale/messages_pl.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/locale/messages_pl.po 2021-05-19 12:11:58.000000000 +0000 @@ -15,8 +15,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-07 19:43+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-13 23:02+0000\n" "Last-Translator: ☆Verdulo\n" "Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" @@ -131,14 +131,14 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:658 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:691 msgid "Add" msgstr "Dodaj" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:262 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:650 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:683 msgid "Replace" msgstr "Zastąp" @@ -213,7 +213,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:349 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:572 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:605 msgid "Delete Selected" msgstr "Usuń zaznaczone" @@ -246,7 +246,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:296 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:317 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:654 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:687 msgid "Add Alternate" msgstr "Dodaj alternatywny" @@ -381,7 +381,7 @@ msgstr "Subskrypcje przeładowane." #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:200 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:672 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:705 msgid "Import" msgstr "Zaimportuj" @@ -458,100 +458,130 @@ msgid "Storage" msgstr "Pamięć" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:287 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:256 +msgid "" +"Addresses in the Private Address Book are not shared with anyone else unless" +" you copy them by hand." +msgstr "Adresy w prywatnej książce adresowej nie zostaną komukolwiek udostępnione, chyba że ręcznie je komuś udostępnisz." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:263 +msgid "" +"The Published Address Book is used for sharing addresses using your I2P " +"Site." +msgstr "Opublikowana książka adresowa jest wykorzystywana do dzielenia się adresami witryn .i2p poprzez własną stronę www." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:265 +msgid "Sites in the Private Address Book are not published here." +msgstr "Strony w prywatnej książce adresowej nie będą tu publikowane." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:272 +msgid "This is the Local Address Book." +msgstr "To jest lokalna książka adresowa." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:275 +msgid "Use it for sites that you host on this computer." +msgstr "Jest ona przeznaczona dla stron hostowanych na tym komputerze." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:282 +msgid "" +"The Router Address Book is automatically generated by combining the " +"Subscriptions, Local, Private, and Published address books." +msgstr "Książka adresowa węzła jest tworzona poprzez łączenie subskrypcji, i książek adresowych: lokalnej, prywatnej i opublikowanej." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "Export in hosts.txt format" msgstr "Eksportuj w formacie hosts.txt" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:336 msgid "Current filter" msgstr "Obecny filtr" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:340 msgid "clear filter" msgstr "wyczyść filtr" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:335 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Filter" msgstr "Filtr" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:352 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:385 msgid "other" msgstr "inne" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:354 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:387 msgid "all" msgstr "wszystkie" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:360 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:393 msgid "Search" msgstr "Szukaj" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:402 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:640 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:435 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:673 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:268 msgid "Hostname" msgstr "Nazwa hosta" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:437 msgid "Link (b32)" msgstr "Odnośnik (b32)" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:406 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:439 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:374 msgid "Destination" msgstr "Miejsce przeznaczenia" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:420 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:453 msgid "Select hosts for deletion from address book" msgstr "Wybierz hosty do usunięcia z książki adresowej" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:468 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:501 msgid "View larger version of identicon for this hostname" msgstr "Pokaż większą identikonę dla tej nazwy hosta" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:482 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:515 msgid "Base 32 address" msgstr "Adres Base 32" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:488 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:521 msgid "Helper link to share host address with option to add to address book" msgstr "Odnośnik pomocniczy do dzielenia się adresem hosta z opcją dodania do książki adresowej" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:494 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:527 msgid "More information on this entry" msgstr "Więcej informacji na temat tego wpisu" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:497 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:530 msgid "details" msgstr "szczegóły" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:517 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:550 msgid "Mark for deletion" msgstr "Zaznacz do usunięcia" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:570 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:648 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:670 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:603 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:681 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:703 msgid "Cancel" msgstr "Anuluj" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:618 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:651 msgid "This address book is empty." msgstr "Ta książka adresowa jest pusta." -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:638 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:671 msgid "Add new destination" msgstr "Dodaj nowe miejsce przeznaczenia" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:644 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:677 msgid "Destination or Base 32 Address" msgstr "Adres przeznaczenia lub Base32" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:666 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:699 msgid "Import from hosts.txt file" msgstr "Import z pliku hosts.txt" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:668 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:701 msgid "File" msgstr "Plik" @@ -751,64 +781,70 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:208 msgid "" +"You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P" +" Destinations." +msgstr "Jej zadaniem jest tłumaczenie adresów docelowych I2P na łatwo zapamiętywalne domeny, np. i2p-projekt.i2p." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "Regularnie aktualizuje twoj plik hosts.txt z rozproszonych źródeł lub \"subskrypcji\"." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." msgstr "W domyślnej konfiguracji, książka adresowa jest subskrybowana tylko do {0}." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." msgstr "Zapisywanie się do innych witryn jest proste, wystarczy dodać je do pliku subskrypcje." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 msgid "" "For more information on naming in I2P, see the overview." msgstr "Aby dowiedzieć się więcej na temat nazewnictwa w I2P, przeczytaj ten artykuł." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 msgid "How does the address book application work?" msgstr "Jak działa aplikacja książki adresowej?" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 msgid "" "The address book application regularly polls your subscriptions and merges " "their content into your \"router\" address book." msgstr "Aplikacja książki adresowej regularnie pobiera Twoje subskrypcje i łączy ich zawartość w książkę adresową „węzła”." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 msgid "" "Then it merges your \"local\" address book into the router address book as " "well." msgstr "Następnie dodaje wpisy z „lokalnej” książki adresowej do Twojej książki adresowej węzła." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an I2P " "Site." msgstr "Jeżeli skonfigurowana, książka adresowa węzła jest teraz zapisana do „opublikowanej” książki adresowej, która będzie publicznie dostępna jeżeli masz swoją ukrytą stronę w sieci I2P." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 msgid "" "The router also uses a private address book, which is not merged or " "published." msgstr "Ten węzeł także używa prywatnej książki adresowej, która nie jest scalana bądź publikowana." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 msgid "" "Hosts in the private address book can be accessed by you but their addresses" " are never distributed to others." msgstr "Nazwy hostów w prywatnej książce adresowej mogą być dostępne dla ciebie ale ich adresy nie są nigdy rozpowszechniane dla innych." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:230 msgid "" "The private address book can also be used for aliases of hosts in your other" " address books." diff -Nru i2p-0.9.49/apps/susidns/locale/messages_sv.po i2p-0.9.50/apps/susidns/locale/messages_sv.po --- i2p-0.9.49/apps/susidns/locale/messages_sv.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/locale/messages_sv.po 2021-05-19 12:11:58.000000000 +0000 @@ -10,16 +10,16 @@ # hottuna , 2013 # hottuna , 2012 # efef6ec5b435a041fce803c7f8af77d2_2341d43, 2017 -# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2019-2021 +# Jonatan Nyberg , 2019-2021 # efef6ec5b435a041fce803c7f8af77d2_2341d43, 2017 # Martin Svensson , 2011, 2012 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-05 15:27+0000\n" -"Last-Translator: zzzi2p\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-09 10:53+0000\n" +"Last-Translator: Jonatan Nyberg \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" @@ -125,14 +125,14 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:658 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:691 msgid "Add" msgstr "Lägg till" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:262 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:650 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:683 msgid "Replace" msgstr "Ersätt " @@ -207,7 +207,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:349 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:572 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:605 msgid "Delete Selected" msgstr "Radera Valda" @@ -238,7 +238,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:296 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:317 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:654 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:687 msgid "Add Alternate" msgstr "Lägg till alternativ" @@ -294,7 +294,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:117 #, java-format msgid "{0} address book in {1} database" -msgstr "{0} adressboken i {1} databas" +msgstr "adressboken {0} i databasen {1}" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:258 #, java-format @@ -369,7 +369,7 @@ msgstr "Prenumerationer laddade igen." #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:200 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:672 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:705 msgid "Import" msgstr "Importera" @@ -446,100 +446,130 @@ msgid "Storage" msgstr "Förvaring" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:287 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:256 +msgid "" +"Addresses in the Private Address Book are not shared with anyone else unless" +" you copy them by hand." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:263 +msgid "" +"The Published Address Book is used for sharing addresses using your I2P " +"Site." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:265 +msgid "Sites in the Private Address Book are not published here." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:272 +msgid "This is the Local Address Book." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:275 +msgid "Use it for sites that you host on this computer." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:282 +msgid "" +"The Router Address Book is automatically generated by combining the " +"Subscriptions, Local, Private, and Published address books." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "Export in hosts.txt format" msgstr "Exportera till hosts.txt format" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:336 msgid "Current filter" msgstr "Nuvarande filter" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:340 msgid "clear filter" msgstr "rensa filter" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:335 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Filter" msgstr "Filter" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:352 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:385 msgid "other" msgstr "andra" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:354 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:387 msgid "all" msgstr "alla" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:360 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:393 msgid "Search" msgstr "Sök" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:402 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:640 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:435 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:673 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:268 msgid "Hostname" msgstr "Värdnamn" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:437 msgid "Link (b32)" msgstr "Länk (b32)" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:406 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:439 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:374 msgid "Destination" msgstr "Mål" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:420 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:453 msgid "Select hosts for deletion from address book" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:468 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:501 msgid "View larger version of identicon for this hostname" msgstr "Visa större version av identicon för detta värdnamn" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:482 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:515 msgid "Base 32 address" msgstr "Base32 adress" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:488 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:521 msgid "Helper link to share host address with option to add to address book" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:494 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:527 msgid "More information on this entry" msgstr "Mer information om den här posten" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:497 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:530 msgid "details" msgstr "detaljer" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:517 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:550 msgid "Mark for deletion" msgstr "Markera för borttagning" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:570 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:648 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:670 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:603 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:681 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:703 msgid "Cancel" msgstr "Avbryt" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:618 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:651 msgid "This address book is empty." msgstr "Denna adressboken är tom." -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:638 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:671 msgid "Add new destination" msgstr "Lägg till nytt mål" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:644 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:677 msgid "Destination or Base 32 Address" msgstr "Destination eller Base 32-adress" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:666 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:699 msgid "Import from hosts.txt file" msgstr "Importera från filen hosts.txt" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:668 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:701 msgid "File" msgstr "Arkiv" @@ -550,7 +580,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:224 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:215 msgid "File location" -msgstr "Filposition" +msgstr "Filplats" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:239 msgid "Hints" @@ -643,11 +673,11 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:275 msgid "File to log activity to (change to /dev/null if you like)" -msgstr "Fil där loggaktivitet sparas till (ändra till / dev / null om du vill)" +msgstr "Fil att logga aktivitet till (ändra till /dev/null om du vill)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:277 msgid "Name of the theme to use (defaults to 'light')" -msgstr "Namnet på temat som ska användas (standard är \"ljust\")" +msgstr "Namnet på temat som ska användas (standard är \"light\")" #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:282 msgid "Encoded Name" @@ -739,64 +769,70 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:208 msgid "" +"You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P" +" Destinations." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "Den uppdaterar din hosts.txt fil från distribuerade källor eller \"prenumerationer\"." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." msgstr "I den förvalda konfigurationen, är adressboken endast abonnerad till {0}" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." msgstr "Att prenumerera på ytterligare siter är enkelt, lägg bara till dem i din subscriptions fil. " -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 msgid "" "For more information on naming in I2P, see the overview." -msgstr "" +msgstr "Mer information om namngivning i I2P finns i översikten." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 msgid "How does the address book application work?" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 msgid "" "The address book application regularly polls your subscriptions and merges " "their content into your \"router\" address book." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 msgid "" "Then it merges your \"local\" address book into the router address book as " "well." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an I2P " "Site." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 msgid "" "The router also uses a private address book, which is not merged or " "published." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 msgid "" "Hosts in the private address book can be accessed by you but their addresses" " are never distributed to others." msgstr "Värdar i den privata adressboken kan nås av dig, men adresserna delas aldrig ut till andra." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:230 msgid "" "The private address book can also be used for aliases of hosts in your other" " address books." diff -Nru i2p-0.9.49/apps/susidns/locale/messages_tr.po i2p-0.9.50/apps/susidns/locale/messages_tr.po --- i2p-0.9.49/apps/susidns/locale/messages_tr.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/locale/messages_tr.po 2021-05-19 12:11:58.000000000 +0000 @@ -9,8 +9,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-15 04:41+0000\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 17:43+0000\n" "Last-Translator: Kaya Zeren \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n" "MIME-Version: 1.0\n" @@ -117,14 +117,14 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:658 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:691 msgid "Add" msgstr "Ekleyin" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:262 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:650 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:683 msgid "Replace" msgstr "Değiştirin" @@ -199,7 +199,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:349 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:572 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:605 msgid "Delete Selected" msgstr "Seçileri Silin" @@ -230,7 +230,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:296 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:317 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:654 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:687 msgid "Add Alternate" msgstr "Alternatif Ekle" @@ -361,7 +361,7 @@ msgstr "Abonelikler yeniden yüklendi" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:200 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:672 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:705 msgid "Import" msgstr "İçe Aktar" @@ -438,100 +438,130 @@ msgid "Storage" msgstr "Kayıt yeri" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:287 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:256 +msgid "" +"Addresses in the Private Address Book are not shared with anyone else unless" +" you copy them by hand." +msgstr "Kişisel Adres Defterindeki adresler el ile kopyalanmadıkça kimse ile paylaşılmaz." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:263 +msgid "" +"The Published Address Book is used for sharing addresses using your I2P " +"Site." +msgstr "Yayınlanmış Adres Defteri ISP sitenizi kullanarak adresleri paylaşmak için kullanılır." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:265 +msgid "Sites in the Private Address Book are not published here." +msgstr "Kişisel Adres Defterindeki siteler burada yayınlanmaz." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:272 +msgid "This is the Local Address Book." +msgstr "Yerel Adres Defteriniz." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:275 +msgid "Use it for sites that you host on this computer." +msgstr "Bu bilgisayar üzerinde barındırdığınız siteler için kullanın." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:282 +msgid "" +"The Router Address Book is automatically generated by combining the " +"Subscriptions, Local, Private, and Published address books." +msgstr "Yöneltici Adres Defteri, Abonelik, Yerel, Kişisel ve Yayınlanmış Adres Defterlerinin otomatik olarak bir araya getirilmesiyle oluşturulur." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "Export in hosts.txt format" msgstr "hosts.txt biçiminde dışa aktar" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:336 msgid "Current filter" msgstr "Geçerli süzgeç" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:340 msgid "clear filter" msgstr "süzgeci temizleyin" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:335 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Filter" msgstr "Süzgeç" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:352 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:385 msgid "other" msgstr "diğer" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:354 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:387 msgid "all" msgstr "tümü" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:360 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:393 msgid "Search" msgstr "Arayın" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:402 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:640 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:435 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:673 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:268 msgid "Hostname" msgstr "Sunucu Adı" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:437 msgid "Link (b32)" msgstr "Bağlantı (b32)" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:406 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:439 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:374 msgid "Destination" msgstr "Hedef" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:420 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:453 msgid "Select hosts for deletion from address book" msgstr "Adres defterinden silinecek sunucuları işaretleyin" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:468 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:501 msgid "View larger version of identicon for this hostname" msgstr "Bu sunucu adı için daha büyük simge görüntülensin" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:482 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:515 msgid "Base 32 address" msgstr "Base 32 adresi" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:488 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:521 msgid "Helper link to share host address with option to add to address book" msgstr "Adres defterine ekleme seçeneği ile sunucu adresini paylaşmaya yardımcı olan bağlantı." -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:494 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:527 msgid "More information on this entry" msgstr "Kayıtla ilgili diğer bilgiler" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:497 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:530 msgid "details" msgstr "ayrıntılar" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:517 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:550 msgid "Mark for deletion" msgstr "Silmek üzere işaretleyin" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:570 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:648 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:670 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:603 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:681 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:703 msgid "Cancel" msgstr "İptal" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:618 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:651 msgid "This address book is empty." msgstr "Bu adres defteri boş." -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:638 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:671 msgid "Add new destination" msgstr "Yeni hedef ekleyin" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:644 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:677 msgid "Destination or Base 32 Address" msgstr "Hedef ya da Base 32 Adresi" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:666 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:699 msgid "Import from hosts.txt file" msgstr "hosts.txt dosyasından içe aktar" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:668 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:701 msgid "File" msgstr "Dosya" @@ -731,64 +761,70 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:208 msgid "" +"You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P" +" Destinations." +msgstr "I2P hedefleri ile i2p-projekt.i2p gibi insanlar tarafından okunabilen adlarla bağlantı kurmak için kullanabilirsiniz." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "hosts.txt dosyanızı düzenli olarak dağıtılmışkaynaklar ya da \"aboneliklerden\" günceller." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." msgstr "Varsayılan yapılandırmada, adres defteri yalnız {0} üzerine abonedir." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." msgstr "Ek sitelere kolayca abone olabilirsiniz. Yalnızca siteleri subscriptions dosyasına ekleyin." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 msgid "" "For more information on naming in I2P, see the overview." msgstr "I2P adlandırmaları hakkında ayrıntılı bilgi almak için özet bölümüne bakabilirsiniz." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 msgid "How does the address book application work?" msgstr "Adres defteri uygulaması nasıl çalışır?" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 msgid "" "The address book application regularly polls your subscriptions and merges " "their content into your \"router\" address book." msgstr "Adres defteri uygulaması düzenli olarak aboneliklerinizi denetleyerek içeriklerini \"yöneltici\" adres defterinize aktarır." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 msgid "" "Then it merges your \"local\" address book into the router address book as " "well." msgstr "Ardından \"yerel\" adres defteriniz yönelticinin adres defterine aktarılır." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an I2P " "Site." msgstr "Bir I2P sitesi işletiyorsanız ve uygun seçeneği etkinleştirdiyseniz, yöneltici adres defteri herkes tarafından görülebilecek \"yayınlanmış\" adres defterine yazılır." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 msgid "" "The router also uses a private address book, which is not merged or " "published." msgstr "Yöneltici ayrıca aktarılmayan ya da yayınlanmayan bir kişisel adres defteri kullanır." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 msgid "" "Hosts in the private address book can be accessed by you but their addresses" " are never distributed to others." msgstr "Kişisel adres defterindeki sunuculara yalnız siz erişebilirsiniz. Bu adresler asla diğer kişiler ile paylaşılmaz." -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:230 msgid "" "The private address book can also be used for aliases of hosts in your other" " address books." diff -Nru i2p-0.9.49/apps/susidns/locale/messages_zh.po i2p-0.9.50/apps/susidns/locale/messages_zh.po --- i2p-0.9.49/apps/susidns/locale/messages_zh.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/locale/messages_zh.po 2021-05-19 12:11:58.000000000 +0000 @@ -11,7 +11,7 @@ # ducki2p , 2011 # K , 2017 # xkimo_daeee , 2014 -# Scott Rhodes , 2020 +# Scott Rhodes , 2020-2021 # walking , 2011 # walking , 2013 # walking , 2011 @@ -20,9 +20,9 @@ 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: zzzi2p\n" +"POT-Creation-Date: 2021-05-05 15:14+0000\n" +"PO-Revision-Date: 2021-05-05 16:40+0000\n" +"Last-Translator: Scott Rhodes \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" @@ -124,14 +124,14 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:658 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:691 msgid "Add" msgstr "添加" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:262 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:650 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:683 msgid "Replace" msgstr "替换" @@ -171,12 +171,12 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:322 msgid "Warning - hostname does not end with \".i2p\"" -msgstr "" +msgstr "警告 - 主机名未以\".i2p\"结尾。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:320 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:334 msgid "Invalid Base 32 hostname." -msgstr "" +msgstr "无效 b32 主机名。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:322 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:336 @@ -187,12 +187,12 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:342 #, java-format msgid "Invalid hostname \"{0}\"." -msgstr "" +msgstr "无效的主机名 “{0}”。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:332 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:345 msgid "Please enter a hostname and destination" -msgstr "" +msgstr "请输入主机名称与目标" #. clear search when deleting #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 @@ -206,7 +206,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:336 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:349 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:572 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:605 msgid "Delete Selected" msgstr "删除选中项" @@ -236,7 +236,7 @@ #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:296 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:317 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:654 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:687 msgid "Add Alternate" msgstr "添加备用" @@ -247,7 +247,7 @@ #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:369 msgid "ERROR: Could not write address book file." -msgstr "" +msgstr "错误:无法写入地址簿文件" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:374 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:108 @@ -354,7 +354,7 @@ #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:148 msgid "" "Subscriptions saved, updating address book from subscription sources now." -msgstr "" +msgstr "订阅已保存,正在通过订阅地址更新地址簿。" #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 msgid "Subscriptions saved." @@ -365,7 +365,7 @@ msgstr "订阅设置已重新载入。" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:200 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:672 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:705 msgid "Import" msgstr "导入" @@ -442,100 +442,130 @@ msgid "Storage" msgstr "存储" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:287 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:256 +msgid "" +"Addresses in the Private Address Book are not shared with anyone else unless" +" you copy them by hand." +msgstr "在私有地址簿中的网址不会被分享给任何人,除非你手动复制。" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:263 +msgid "" +"The Published Address Book is used for sharing addresses using your I2P " +"Site." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:265 +msgid "Sites in the Private Address Book are not published here." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:272 +msgid "This is the Local Address Book." +msgstr "这是本地地址簿" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:275 +msgid "Use it for sites that you host on this computer." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:282 +msgid "" +"The Router Address Book is automatically generated by combining the " +"Subscriptions, Local, Private, and Published address books." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "Export in hosts.txt format" msgstr "导出 hosts.txt 格式" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:336 msgid "Current filter" msgstr "当前过滤器" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:340 msgid "clear filter" msgstr "清除过滤器" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:335 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Filter" msgstr "过滤器" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:352 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:385 msgid "other" msgstr "其他" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:354 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:387 msgid "all" msgstr "全部" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:360 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:393 msgid "Search" msgstr "搜索" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:402 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:640 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:435 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:673 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:268 msgid "Hostname" msgstr "主机名" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:437 msgid "Link (b32)" msgstr "链接 (b32)" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:406 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:439 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:374 msgid "Destination" msgstr "目标" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:420 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:453 msgid "Select hosts for deletion from address book" -msgstr "" +msgstr "选择要从地址簿中删除的主机" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:468 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:501 msgid "View larger version of identicon for this hostname" msgstr "查看此主机名的identicon的较大版本" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:482 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:515 msgid "Base 32 address" msgstr "Base 32 地址" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:488 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:521 msgid "Helper link to share host address with option to add to address book" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:494 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:527 msgid "More information on this entry" msgstr "此记录的更多信息" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:497 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:530 msgid "details" msgstr "详情" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:517 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:550 msgid "Mark for deletion" msgstr "标记为删除" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:570 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:648 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:670 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:603 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:681 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:703 msgid "Cancel" msgstr "取消" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:618 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:651 msgid "This address book is empty." msgstr "此地址簿为空。" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:638 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:671 msgid "Add new destination" msgstr "添加新目标" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:644 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:677 msgid "Destination or Base 32 Address" msgstr "目标或32位地址" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:666 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:699 msgid "Import from hosts.txt file" msgstr "从 hosts.txt 文件导入" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:668 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:701 msgid "File" msgstr "文件" @@ -607,11 +637,11 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:261 msgid "Your personal address book, these hosts will be published" -msgstr "" +msgstr "你的个人地址簿,这些主机会被发布" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:263 msgid "Your private address book, it is never published" -msgstr "" +msgstr "您的私有地址簿,其中的地址不会被发布。" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:265 msgid "Port for your eepProxy (no need to change)" @@ -623,7 +653,7 @@ #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:269 msgid "Whether to update the published address book" -msgstr "" +msgstr "是否更新发布地址簿" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:271 msgid "" @@ -727,72 +757,78 @@ #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:204 msgid "What is the address book?" -msgstr "" +msgstr "什么是地址簿?" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:206 msgid "The address book application is part of your I2P installation." -msgstr "" +msgstr "地址簿应用是 I2P 安装的一部分。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:208 msgid "" +"You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P" +" Destinations." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "它定期从分布式来源或“订阅”更新您的 hosts.txt 文件。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." msgstr "在默认配置中,地址簿只订阅 {0}。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:212 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." msgstr "要订阅其他站点很容易,只需将它们加入您的订阅文件。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 msgid "" "For more information on naming in I2P, see the overview." msgstr "更多关于 I2P 中命名的信息,请参见概述。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 msgid "How does the address book application work?" -msgstr "" +msgstr "地址簿应用如何工作?" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:218 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 msgid "" "The address book application regularly polls your subscriptions and merges " "their content into your \"router\" address book." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 msgid "" "Then it merges your \"local\" address book into the router address book as " "well." msgstr "接着它也会把你的“本地”地址簿合并到路由地址簿" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:222 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an I2P " "Site." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:224 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 msgid "" "The router also uses a private address book, which is not merged or " "published." msgstr "路由也使用私有地址簿,既不合并也不发布。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 msgid "" "Hosts in the private address book can be accessed by you but their addresses" " are never distributed to others." msgstr "您可以访问“私有”地址簿中的主机名,但它们的实际地址不会发布给其他人。" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:228 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:230 msgid "" "The private address book can also be used for aliases of hosts in your other" " address books." diff -Nru i2p-0.9.49/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java i2p-0.9.50/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java --- i2p-0.9.49/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java 2021-05-19 12:11:58.000000000 +0000 @@ -205,7 +205,7 @@ /** @since 0.9.26 */ public boolean isValidated() { - return Boolean.valueOf(getProp("v")); + return Boolean.parseBoolean(getProp("v")); } /** @since 0.8.7 */ diff -Nru i2p-0.9.49/apps/susidns/src/java/src/i2p/susi/dns/BaseBean.java i2p-0.9.50/apps/susidns/src/java/src/i2p/susi/dns/BaseBean.java --- i2p-0.9.49/apps/susidns/src/java/src/i2p/susi/dns/BaseBean.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/java/src/i2p/susi/dns/BaseBean.java 2021-05-19 12:11:58.000000000 +0000 @@ -30,6 +30,7 @@ private static final String PROP_THEME_NAME = "theme"; private static final String DEFAULT_THEME = "light"; private static final String BASE_THEME_PATH = "themes/"; + private static final String[] THEMES = new String[] { "dark", "light"}; /** From CSSHelper */ private static final String PROP_DISABLE_OLD = "routerconsole.disableOldThemes"; private static final boolean DEFAULT_DISABLE_OLD = true; @@ -103,8 +104,10 @@ // Fetch routerconsole theme (or use our default if it doesn't exist) String theme = _context.getProperty(RC_PROP_THEME_NAME, DEFAULT_THEME); // Apply any override + debug("Theme test 1: " + theme); theme = properties.getProperty(PROP_THEME_NAME, theme); // remap deprecated themes + debug("Theme test 2: " + theme); if (theme.equals("midnight")) { if (_context.getProperty(PROP_DISABLE_OLD, DEFAULT_DISABLE_OLD)) theme = "dark"; @@ -112,6 +115,7 @@ if (_context.getProperty(PROP_DISABLE_OLD, DEFAULT_DISABLE_OLD)) theme = "light"; } + debug("Theme test 3: " + theme); // Ensure that theme exists String[] themes = getThemes(); boolean themeExists = false; @@ -121,8 +125,10 @@ break; } } - if (!themeExists) + if (!themeExists) { + debug("Theme did not exist:" + theme); theme = DEFAULT_THEME; + } url += theme + "/"; return url; } @@ -133,24 +139,7 @@ * @since 0.9.2 */ public String[] getThemes() { - String[] themes; - File dir = new File(_context.getBaseDir(), "docs/themes/susidns"); - FileFilter fileFilter = new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }; - File[] dirnames = dir.listFiles(fileFilter); - if (dirnames != null) { - List th = new ArrayList(dirnames.length); - boolean skipOld = _context.getProperty(PROP_DISABLE_OLD, DEFAULT_DISABLE_OLD); - for (int i = 0; i < dirnames.length; i++) { - String name = dirnames[i].getName(); - if (skipOld && (name.equals("midnight") || name.equals("classic"))) - continue; - th.add(name); - } - themes = th.toArray(new String[th.size()]); - } else { - themes = new String[0]; - } - return themes; + return THEMES; } /** diff -Nru i2p-0.9.49/apps/susidns/src/js/messages.js i2p-0.9.50/apps/susidns/src/js/messages.js --- i2p-0.9.49/apps/susidns/src/js/messages.js 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/js/messages.js 2021-05-19 12:11:58.000000000 +0000 @@ -16,8 +16,131 @@ } } +function ToggleStoragePathView() { + var storagePathView = document.getElementById("storagepath"); + if (storagePathView != null) { + storagePathView.classList.toggle("invisible"); + } + clickableHeadline = document.getElementById("addrtitle"); + if (clickableHeadline != null) { + clickableHeadline.classList.toggle("expanded"); + } + +} + +function ToggleAddFormTableView() { + var buttonView = document.getElementById("addnewaddrbutton"); + if (buttonView != null) { + buttonView.classList.toggle("invisible"); + } + var tableView = document.getElementById("addnewaddrtable"); + if (tableView != null) { + tableView.classList.toggle("invisible"); + } + clickableForm = document.getElementById("addnewaddr"); + if (clickableForm != null) { + clickableForm.classList.toggle("expanded"); + } +} + +function ToggleImportFormTableView() { + var buttonView = document.getElementById("importhostsform"); + if (buttonView != null) { + buttonView.classList.toggle("invisible"); + } + var tableView = document.getElementById("importhostsbuttons"); + if (tableView != null) { + tableView.classList.toggle("invisible"); + } + clickableForm2 = document.getElementById("importhosts"); + if (clickableForm2 != null) { + clickableForm2.classList.toggle("expanded"); + } +} + +function ToggleHowView(){ + var pHow = document.getElementsByClassName("howitworks"); + var i; + for (i = 0; i < pHow.length; i++) { + pHow[i].classList.toggle("invisible"); + } + var idHow = document.getElementById("howitworks"); + if (idHow != null) { + idHow.classList.toggle("expanded"); + } +} + +function ToggleWhatView(){ + var pWhat = document.getElementsByClassName("whatitis"); + var i; + for (i = 0; i < pWhat.length; i++) { + pWhat[i].classList.toggle("invisible"); + } + var idWhat = document.getElementById("whatitis"); + if (idWhat != null) { + idWhat.classList.toggle("expanded"); + } +} + +function initClickables() { + + /*Hide the storage path by default, show it if someone clicks on the header*/ + var storagePathView = document.getElementById("storagepath"); + if (storagePathView != null) { + storagePathView.classList.add("invisible"); + } + clickableHeadline = document.getElementById("addrtitle"); + if (clickableHeadline != null) { + clickableHeadline.addEventListener('click', ToggleStoragePathView, true); + } + + /*If the hostname field is empty, hide the add host form and show it when + the user clicks on the form header.*/ + var d = document.getElementById("emptybook"); + if (d == null) { + var x = document.getElementsByName("hostname"); + var i; + for (i = 0; i < x.length; i++) { + if (x[i].value == "") { + var buttonView = document.getElementById("addnewaddrbutton"); + if (buttonView != null) { + buttonView.classList.add("invisible"); + } + var tableView = document.getElementById("addnewaddrtable"); + if (tableView != null) { + tableView.classList.add("invisible"); + } + } + } + clickableForm = document.getElementById("addnewaddr"); + if (clickableForm != null) { + clickableForm.addEventListener('click', ToggleAddFormTableView, true); + } + }else{ + clickableForm = document.getElementById("addnewaddr"); + if (clickableForm != null) { + clickableForm.classList.toggle("expanded"); + } + } + + /* Set up the Import Hosts form to be collapsible.*/ + var ibuttonView = document.getElementById("importhostsform"); + if (ibuttonView != null) { + ibuttonView.classList.add("invisible"); + } + var itableView = document.getElementById("importhostsbuttons"); + if (itableView != null) { + itableView.classList.add("invisible"); + } + clickableForm2 = document.getElementById("importhosts"); + if (clickableForm2 != null) { + clickableForm2.addEventListener('click', ToggleImportFormTableView, true); + } +} + document.addEventListener("DOMContentLoaded", function() { document.body.addEventListener('click', HideMessages, true); + initClickables(); }, true); /* @license-end */ diff -Nru i2p-0.9.49/apps/susidns/src/jsp/addressbook.jsp i2p-0.9.50/apps/susidns/src/jsp/addressbook.jsp --- i2p-0.9.49/apps/susidns/src/jsp/addressbook.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/jsp/addressbook.jsp 2021-05-19 12:11:58.000000000 +0000 @@ -74,17 +74,44 @@
-

<%=intl._t("Address book")%>: <%=intl._t(book.getBook())%>

-

<%=intl._t("Storage")%>: ${book.displayName}

+

<%=intl._t("Address book")%>: <%=intl._t(book.getBook())%>

+

<%=intl._t("Storage")%>: ${book.displayName}

+ +${book.loadBookMessages} + +<% if (book.getBook().equals("private")) { %> +
+

+<%=intl._t("Addresses in the Private Address Book are not shared with anyone else unless you copy them by hand.")%> +

+<% } %> -
${book.messages}<% - if (importMessages != null) { - %><%=importMessages%><% - } -%>
+<% if (book.getBook().equals("published")) { %> +
+

+<%=intl._t("The Published Address Book is used for sharing addresses using your I2P Site.")%> +<%=intl._t("Sites in the Private Address Book are not published here.")%> +

+
+<% } %> -${book.loadBookMessages} +<% if (book.getBook().equals("local")) { %> +
+

+<%=intl._t("This is the Local Address Book.")%> +<%=intl._t("Use it for sites that you host on this computer.")%> +

+
+<% } %> + +<% if (book.getBook().equals("router")) { %> +
+

+<%=intl._t("The Router Address Book is automatically generated by combining the Subscriptions, Local, Private, and Published address books.")%> +

+
+<% } %> <% if (book.getEntries().length > 0) { /* Don't show if no results. Can't figure out how to do this with c:if */ %> @@ -102,6 +129,14 @@ <% } /* book.getEntries().length() > 0 */ %> +
+ +
${book.messages}<% + if (importMessages != null) { + %><%=importMessages%><% + } +%>
+
<%=intl._t("Current filter")%>: ${book.filter} @@ -239,8 +274,8 @@
-

<%=intl._t("Add new destination")%>

- +

<%=intl._t("Add new destination")%>

+
@@ -250,7 +285,7 @@
<%=intl._t("Hostname")%>
-

+

" > " > <% if (!book.getBook().equals("published")) { %> @@ -268,14 +303,14 @@

-

<%=intl._t("Import from hosts.txt file")%>

- +

<%=intl._t("Import from hosts.txt file")%>

+
<%=intl._t("File")%>
-

+

" > " >

diff -Nru i2p-0.9.49/apps/susidns/src/jsp/details.jsp i2p-0.9.50/apps/susidns/src/jsp/details.jsp --- i2p-0.9.49/apps/susidns/src/jsp/details.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/jsp/details.jsp 2021-05-19 12:11:58.000000000 +0000 @@ -49,9 +49,9 @@ <%=intl._t("Configuration")%>

-
+

<%=intl._t("Address book")%>: <%=intl._t(book.getBook())%>

-

<%=intl._t("Storage")%>: ${book.displayName}

+

<%=intl._t("Storage")%>: ${book.displayName}

<% diff -Nru i2p-0.9.49/apps/susidns/src/jsp/index.jsp i2p-0.9.50/apps/susidns/src/jsp/index.jsp --- i2p-0.9.49/apps/susidns/src/jsp/index.jsp 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/jsp/index.jsp 2021-05-19 12:11:58.000000000 +0000 @@ -62,29 +62,29 @@

-

<%=intl._t("What is the address book?")%>

-

+

<%=intl._t("What is the address book?")%>

+

<%=intl._t("The address book application is part of your I2P installation.")%> +<%=intl._t("You can use it to connect human-readable names, like i2p-projekt.i2p, to I2P Destinations.")%> +

<%=intl._t("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%> -

-

<%=intl._t("In the default configuration, the address book is only subscribed to {0}.", "i2p-projekt.i2p")%> <%=intl._t("Subscribing to additional sites is easy, just add them to your subscriptions file.")%>

-

+

<%=intl._t("For more information on naming in I2P, see the overview.")%>

-

<%=intl._t("How does the address book application work?")%>

-

+

<%=intl._t("How does the address book application work?")%>

+

<%=intl._t("The address book application regularly polls your subscriptions and merges their content into your \"router\" address book.")%> <%=intl._t("Then it merges your \"local\" address book into the router address book as well.")%> <%=intl._t("If configured, the router address book is now written to the \"published\" address book, which will be publicly available if you are running an I2P Site.")%> -

+

<%=intl._t("The router also uses a private address book, which is not merged or published.")%> <%=intl._t("Hosts in the private address book can be accessed by you but their addresses are never distributed to others.")%> <%=intl._t("The private address book can also be used for aliases of hosts in your other address books.")%>

-
+
address book working scheme diff -Nru i2p-0.9.49/apps/susidns/src/themes/dark/susidns.css i2p-0.9.50/apps/susidns/src/themes/dark/susidns.css --- i2p-0.9.49/apps/susidns/src/themes/dark/susidns.css 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/themes/dark/susidns.css 2021-05-19 12:11:58.000000000 +0000 @@ -100,6 +100,8 @@ position: relative; text-shadow: 0 1px 1px #000; border-radius: 12px; + background-color: #2c4e8f; + color: #7b7; } #navi a:hover, #navi a:focus { @@ -109,6 +111,11 @@ z-index: 10; } +.invisible { + visibility: hidden; + display: none; +} + #navi a:active { border: 1px solid #da736b; box-shadow: inset 3px 3px 3px #000; @@ -564,6 +571,16 @@ margin: 10px -31px; } +.expanded { + background: url(/themes/console/light/images/dropdown_active.png) #f8f8ff !important; + background-repeat: no-repeat !important; + background-position: .5%, 15% !important; +} + +#addrtitle.expanded { + background: url(../images/addressbook.png) 6px center no-repeat #fcfcff !important; +} + .help h3:first-child { margin-top: -21px; } @@ -607,6 +624,11 @@ color: #990; } +#helpconfig h3 { + background-image: none; + padding: 6px 16px; +} + div#content p { padding: 0 10px; } diff -Nru i2p-0.9.49/apps/susidns/src/themes/light/susidns.css i2p-0.9.50/apps/susidns/src/themes/light/susidns.css --- i2p-0.9.49/apps/susidns/src/themes/light/susidns.css 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susidns/src/themes/light/susidns.css 2021-05-19 12:11:58.000000000 +0000 @@ -12,7 +12,7 @@ body.iframed { background: transparent !important; margin: 0; - overflow: hidden; + /*overflow: hidden;*/ } ::selection { @@ -119,13 +119,17 @@ border: 1px solid #dee2e6; transition: ease border 0.7s } + +.invisible { + visibility: hidden; + display: none; +} + .headline { border: 1px solid #dee2e6; margin: -1px 0 -2px; padding: 8px 5px; background: #f6f6fa; - background: #f6f6fa; - background: #f6f6fa; } .iframed .headline { @@ -144,13 +148,13 @@ .headline h3 { font-size: 11.5pt !important; background: url(../images/addressbook.png) 6px center no-repeat #fcfcff; - background: url(../images/addressbook.png) 6px center no-repeat, linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(135deg, #fcfcff 5%, rgba(231, 231, 255, 0.8) 15%); + /*background: url(../images/addressbook.png) 6px center no-repeat, linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(135deg, #fcfcff 5%, rgba(231, 231, 255, 0.8) 15%);*/ background-size: 22px 22px, 100% 100%, 100% 100%; } .headline#subscriptions h3 { background: url(../images/subs_24.png) 6px center no-repeat #fcfcff; - background: url(../images/subs_24.png) 6px center no-repeat, linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(135deg, #fcfcff 5%, rgba(231, 231, 255, 0.8) 15%); + /*background: url(../images/subs_24.png) 6px center no-repeat, linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(135deg, #fcfcff 5%, rgba(231, 231, 255, 0.8) 15%);*/ background-size: 22px 22px, 100% 100%, 100% 100%; } @@ -161,7 +165,7 @@ } .headline#subscriptions h3, .headline#configure h3, .headline#addressbook h3, .headline h3 { - margin: -8px -5px -5px; + /*margin: -8px -5px -5px;*/ padding: 9px 5px 8px 32px; text-transform: capitalize; } @@ -286,10 +290,34 @@ div.help h3, #add h3, #import h3 { border: 1px solid #dee2e6; - padding: 5px 10px; - margin: -1px -16px 0; - background: #fcfcff; - background: linear-gradient(to bottom, #fcfcff 50%, rgba(255,255,255,0.6) 50%, rgba(240,240,255,0.4)), linear-gradient(135deg, #fcfcff 5%, rgba(231, 231, 255, 0.8) 15%); + padding: 5px 32px; + background: url(/themes/console/light/images/dropdown.png) #f8f8ff; + background-repeat: no-repeat !important; + background-position: .5%, 15% !important; +} + +#howitworks { + padding: 5px 32px; + background: url(/themes/console/light/images/dropdown.png) #f8f8ff; + background-repeat: no-repeat !important; + background-position: .5%, 15% !important; +} + +#whatitis { + padding: 5px 32px; + background: url(/themes/console/light/images/dropdown.png) #f8f8ff; + background-repeat: no-repeat !important; + background-position: .5%, 15% !important; +} + +.expanded { + background: url(/themes/console/light/images/dropdown_active.png) #f8f8ff !important; + background-repeat: no-repeat !important; + background-position: .5%, 15% !important; +} + +#addrtitle.expanded { + background: url(../images/addressbook.png) 6px center no-repeat #fcfcff !important; } p#help { @@ -324,6 +352,11 @@ -webkit-break-inside: avoid; } +#helpconfig h3 { + background-image: none; + padding: 6px 16px; +} + span.addrhlpr { font-size: 9pt; } @@ -623,7 +656,6 @@ min-width: 300px; margin: -1px 10%; box-shadow: inset 0 0 0 1px #fff; - background: linear-gradient(to bottom, #fcfcff 50%, #eef 50%); } #filter span a { @@ -663,7 +695,6 @@ } th { - background: linear-gradient(to bottom, #fcfcff 50%, #eef 50%); font-size: 9pt; } @@ -1391,7 +1422,7 @@ } input.export { - margin-top: 8px; + margin-top: -6px; } #host_list th:nth-child(2), #host_list td:nth-child(2), diff -Nru i2p-0.9.49/apps/susimail/build.xml i2p-0.9.50/apps/susimail/build.xml --- i2p-0.9.49/apps/susimail/build.xml 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/build.xml 2021-05-19 12:11:58.000000000 +0000 @@ -65,6 +65,7 @@ + diff -Nru i2p-0.9.49/apps/susimail/locale/messages_de.po i2p-0.9.50/apps/susimail/locale/messages_de.po --- i2p-0.9.49/apps/susimail/locale/messages_de.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/locale/messages_de.po 2021-05-19 12:11:58.000000000 +0000 @@ -11,15 +11,15 @@ # ducki2p , 2011 # Ettore Atalan , 2017 # foo , 2009 -# Lars Schimmer , 2014-2018 +# Lars Schimmer , 2014-2018,2021 # mixxy, 2011 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-05 15:27+0000\n" -"Last-Translator: zzzi2p\n" +"PO-Revision-Date: 2021-05-05 16:53+0000\n" +"Last-Translator: Lars Schimmer \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" @@ -235,7 +235,7 @@ #: src/src/i2p/susi/webmail/WebMail.java:1808 #, java-format msgid "Host unchanged. Edit configuration file {0} to change host." -msgstr "" +msgstr "Server nicht geändert. Bearbeiten Sie die Konfigurationsdatei {0} um den Server zu ändern." #: src/src/i2p/susi/webmail/WebMail.java:1828 msgid "Configuration saved" diff -Nru i2p-0.9.49/apps/susimail/locale/messages_ja.po i2p-0.9.50/apps/susimail/locale/messages_ja.po --- i2p-0.9.49/apps/susimail/locale/messages_ja.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/locale/messages_ja.po 2021-05-19 12:11:58.000000000 +0000 @@ -6,15 +6,16 @@ # Translators: # タカハシ, 2014 # rafe , 2015 -# riopfga caetocla, 2021 +# XMPPはいいぞ, 2021 # 432cfded806ff6b7fe5774185a19126f_b5bc177, 2013 +# XMPPはいいぞ, 2021 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-05 15:27+0000\n" -"Last-Translator: zzzi2p\n" +"PO-Revision-Date: 2021-04-09 08:17+0000\n" +"Last-Translator: XMPPはいいぞ\n" "Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -58,7 +59,7 @@ #. MailDir-like #: src/src/i2p/susi/webmail/WebMail.java:217 msgid "Bulk Mail" -msgstr "" +msgstr "迷惑メール" #. untranslated, translate on use #: src/src/i2p/susi/webmail/WebMail.java:221 @@ -229,7 +230,7 @@ #: src/src/i2p/susi/webmail/WebMail.java:1808 #, java-format msgid "Host unchanged. Edit configuration file {0} to change host." -msgstr "" +msgstr "ホストは変更されていません。ホストを変更するために、設定ファイル {0} を編集してください。" #: src/src/i2p/susi/webmail/WebMail.java:1828 msgid "Configuration saved" @@ -556,7 +557,7 @@ #. can't move from drafts #: src/src/i2p/susi/webmail/WebMail.java:3425 msgid "Move to Folder" -msgstr "" +msgstr "フォルダーへ移動" #: src/src/i2p/susi/webmail/WebMail.java:3445 msgid "Back to Folder" diff -Nru i2p-0.9.49/apps/susimail/locale/messages_pl.po i2p-0.9.50/apps/susimail/locale/messages_pl.po --- i2p-0.9.49/apps/susimail/locale/messages_pl.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/locale/messages_pl.po 2021-05-19 12:11:58.000000000 +0000 @@ -7,6 +7,7 @@ # PolishAnon , 2011 # Warton , 2011 # polacco , 2014-2015 +# Przemyslaw Ka. , 2021 # ☆Verdulo, 2016-2017 # ☆Verdulo, 2018 msgid "" @@ -14,8 +15,8 @@ "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: zzzi2p\n" +"PO-Revision-Date: 2021-03-12 13:19+0000\n" +"Last-Translator: Przemyslaw Ka. \n" "Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -233,7 +234,7 @@ #: src/src/i2p/susi/webmail/WebMail.java:1808 #, java-format msgid "Host unchanged. Edit configuration file {0} to change host." -msgstr "" +msgstr "Host niezmieniony. Edytuj plik konfiguracyjny {0} aby zmienić hosta." #: src/src/i2p/susi/webmail/WebMail.java:1828 msgid "Configuration saved" diff -Nru i2p-0.9.49/apps/susimail/locale/messages_pt_BR.po i2p-0.9.50/apps/susimail/locale/messages_pt_BR.po --- i2p-0.9.49/apps/susimail/locale/messages_pt_BR.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/locale/messages_pt_BR.po 2021-05-19 12:11:58.000000000 +0000 @@ -4,6 +4,7 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: +# Eduardo Rodrigues, 2021 # Gabriel Rodrigues de Moura , 2017 # Gutem , 2015 # blueboy, 2013 @@ -15,8 +16,8 @@ "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: zzzi2p\n" +"PO-Revision-Date: 2021-05-08 04:07+0000\n" +"Last-Translator: Eduardo Rodrigues\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" @@ -158,14 +159,14 @@ #: src/src/i2p/susi/webmail/WebMail.java:1041 msgid "Draft saved." -msgstr "" +msgstr "Rascunho salvo." #: src/src/i2p/susi/webmail/WebMail.java:1051 #: src/src/i2p/susi/webmail/WebMail.java:1292 #: src/src/i2p/susi/webmail/WebMail.java:2728 #: src/src/i2p/susi/webmail/WebMail.java:2909 msgid "Unable to save mail." -msgstr "" +msgstr "Incapaz de salvar o correio." #: src/src/i2p/susi/webmail/WebMail.java:1181 #, java-format @@ -180,11 +181,11 @@ #: src/src/i2p/susi/webmail/WebMail.java:1270 msgid "begin forwarded mail" -msgstr "ínicio do email encaminhado" +msgstr "inicio do correio encaminhado" #: src/src/i2p/susi/webmail/WebMail.java:1280 msgid "end forwarded mail" -msgstr "fim" +msgstr "fim do correio encaminhado" #: src/src/i2p/susi/webmail/WebMail.java:1298 #: src/src/i2p/susi/webmail/WebMail.java:3491 @@ -232,7 +233,7 @@ #: src/src/i2p/susi/webmail/WebMail.java:1808 #, java-format msgid "Host unchanged. Edit configuration file {0} to change host." -msgstr "" +msgstr "Host inalterado. Edite o arquivo de configuração {0} para mudar o host." #: src/src/i2p/susi/webmail/WebMail.java:1828 msgid "Configuration saved" @@ -251,7 +252,7 @@ #: src/src/i2p/susi/webmail/WebMail.java:2427 #: src/src/i2p/susi/webmail/WebMail.java:3124 msgid "Loading emails, please wait..." -msgstr "" +msgstr "Carregando correio eletrônico, por favor aguarde..." #: src/src/i2p/susi/webmail/WebMail.java:2308 #, java-format @@ -279,27 +280,27 @@ #: src/src/i2p/susi/webmail/WebMail.java:2336 msgid "Email" -msgstr "E-mail" +msgstr "Correio Eletrônico" #: src/src/i2p/susi/webmail/WebMail.java:2413 #, java-format msgid "{0} new message" msgid_plural "{0} new messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} nova mensagem" +msgstr[1] "{0} novas mensagens" #: src/src/i2p/susi/webmail/WebMail.java:2416 msgid "No new messages" -msgstr "" +msgstr "Nenhuma mensagem nova" #: src/src/i2p/susi/webmail/WebMail.java:2429 msgid "Checking for new emails on server" -msgstr "" +msgstr "Verificando por novos correios eletrônicos no servidor" #: src/src/i2p/susi/webmail/WebMail.java:2431 #: src/src/i2p/susi/webmail/WebMail.java:3126 msgid "Refresh the page for updates" -msgstr "" +msgstr "Recarregue a página para atualizações" #: src/src/i2p/susi/webmail/WebMail.java:2636 #: src/src/i2p/susi/webmail/WebMail.java:3226 @@ -324,19 +325,19 @@ #: src/src/i2p/susi/webmail/smtp/SMTPClient.java:302 #, java-format msgid "Email is too large, max is {0}" -msgstr "" +msgstr "O correio eletrônico é muito grande, o máximo é {0}" #: src/src/i2p/susi/webmail/WebMail.java:2841 #: src/src/i2p/susi/webmail/WebMail.java:2922 msgid "Sending mail." -msgstr "" +msgstr "Enviando correspondência." #: src/src/i2p/susi/webmail/WebMail.java:2846 #: src/src/i2p/susi/webmail/smtp/SMTPClient.java:254 #: src/src/i2p/susi/webmail/smtp/SMTPClient.java:346 #: src/src/i2p/susi/webmail/smtp/SMTPClient.java:351 msgid "Error sending mail" -msgstr "Erro ao enviar e-mail" +msgstr "Erro ao enviar correspondência" #: src/src/i2p/susi/webmail/WebMail.java:2880 msgid "Mail sent." @@ -348,7 +349,7 @@ #: src/src/i2p/susi/webmail/WebMail.java:2973 msgid "Save as Draft" -msgstr "" +msgstr "Salvar como Rascunho" #: src/src/i2p/susi/webmail/WebMail.java:2974 #: src/src/i2p/susi/webmail/WebMail.java:3282 @@ -503,7 +504,7 @@ #. TODO css to center it #: src/src/i2p/susi/webmail/WebMail.java:3314 msgid "Change to Folder" -msgstr "" +msgstr "Mudar para Pasta" #: src/src/i2p/susi/webmail/WebMail.java:3320 msgid "First" @@ -561,11 +562,11 @@ #. can't move from drafts #: src/src/i2p/susi/webmail/WebMail.java:3425 msgid "Move to Folder" -msgstr "" +msgstr "Mover para Pasta" #: src/src/i2p/susi/webmail/WebMail.java:3445 msgid "Back to Folder" -msgstr "Voltar para pasta" +msgstr "Voltar para Pasta" #: src/src/i2p/susi/webmail/WebMail.java:3530 msgid "Folder Page Size" @@ -595,11 +596,11 @@ #: src/src/i2p/susi/webmail/pop3/POP3MailBox.java:747 msgid "Mail server login failed, wrong username or password." -msgstr "" +msgstr "Falha ao entrar no servidor, nome de usuário ou senha errados." #: src/src/i2p/susi/webmail/pop3/POP3MailBox.java:749 msgid "Logout and then login again with the correct username and password." -msgstr "" +msgstr "Saia e, em seguida, entre novamente com o nome de usuário e senha corretos." #: src/src/i2p/susi/webmail/pop3/POP3MailBox.java:1238 #: src/src/i2p/susi/webmail/pop3/POP3MailBox.java:1240 diff -Nru i2p-0.9.49/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java i2p-0.9.50/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java --- i2p-0.9.49/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/src/src/i2p/susi/util/DecodingOutputStream.java 2021-05-19 12:11:58.000000000 +0000 @@ -60,6 +60,7 @@ int toWrite = Math.min(len, _bb.remaining()); _bb.put(buf, off, toWrite); len -= toWrite; + off += toWrite; } flush(); } @@ -84,10 +85,17 @@ // So just check if we got a character back in the buffer. if (result == null || (result.isError() && !_cb.hasRemaining())) { _out.write(REPLACEMENT); + // need to do this or we will infinite loop + ((Buffer)_bb).clear(); } else { ((Buffer)_cb).flip(); _out.append(_cb); ((Buffer)_cb).clear(); + if (result.isError()) { + _out.write(REPLACEMENT); + // need to do this or we will infinite loop + ((Buffer)_bb).clear(); + } } } @@ -106,24 +114,34 @@ public static void main(String[] args) { try { String s = "Consider the encoding of the Euro sign, €." + - " The Unicode code point for \"€\" is U+20AC."; + " The Unicode code point for \"€\" is U+20AC.\n"; + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < 100; i++) { + buf.append(s); + } + s = buf.toString(); byte[] test = s.getBytes("UTF-8"); - InputStream bais = new java.io.ByteArrayInputStream(test); - DecodingOutputStream r = new DecodingOutputStream(bais); + java.io.InputStream bais = new java.io.ByteArrayInputStream(test); + Writer w = new StringBuilderWriter(); + DecodingOutputStream r = new DecodingOutputStream(w, "UTF-8"); int b; - StringBuilder buf = new StringBuilder(128); - while ((b = r.write()) >= 0) { - buf.append((char) b); + byte[] bf = new byte[256]; + int rand = 1 + net.i2p.I2PAppContext.getGlobalContext().random().nextInt(256); + while ((b = bais.read(bf, 0, rand)) >= 0) { + r.write(bf, 0, b); + rand = 1 + net.i2p.I2PAppContext.getGlobalContext().random().nextInt(256); } - System.out.println("Received: " + buf); - System.out.println("Test passed? " + buf.toString().equals(s)); - buf.setLength(0); + r.close(); + System.out.println("Received: \"" + w.toString() + '"'); + System.out.println("Test passed? " + w.toString().equals(s)); bais = new java.io.ByteArrayInputStream(new byte[] { 'x', (byte) 0xcc, 'x' } ); - r = new DecodingOutputStream(bais); - while ((b = r.write()) >= 0) { - buf.append((char) b); + w = new StringBuilderWriter(); + r = new DecodingOutputStream(w, "UTF-8"); + while ((b = bais.read()) >= 0) { + r.write(b); } - System.out.println("Received: " + buf); + r.close(); + System.out.println("Received: \"" + w.toString() + '"'); } catch (IOException ioe) { ioe.printStackTrace(); } diff -Nru i2p-0.9.49/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java i2p-0.9.50/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java --- i2p-0.9.49/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/src/src/i2p/susi/util/StringBuilderWriter.java 2021-05-19 12:11:58.000000000 +0000 @@ -47,7 +47,7 @@ @Override public void write(int c) { - buf.append(c); + buf.append((char) c); } @Override diff -Nru i2p-0.9.49/apps/susimail/src/src/i2p/susi/webmail/PersistentMailCache.java i2p-0.9.50/apps/susimail/src/src/i2p/susi/webmail/PersistentMailCache.java --- i2p-0.9.49/apps/susimail/src/src/i2p/susi/webmail/PersistentMailCache.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/src/src/i2p/susi/webmail/PersistentMailCache.java 2021-05-19 12:11:58.000000000 +0000 @@ -356,9 +356,11 @@ GzipFileBuffer gb = new GzipFileBuffer(f); out = gb.getOutputStream(); DataHelper.copy(in, out); + rb.readComplete(true); return true; } catch (IOException ioe) { _log.error("Error writing: " + f + ": " + ioe); + rb.readComplete(false); return false; } finally { if (in != null) diff -Nru i2p-0.9.49/apps/susimail/src/src/i2p/susi/webmail/WebMail.java i2p-0.9.50/apps/susimail/src/src/i2p/susi/webmail/WebMail.java --- i2p-0.9.49/apps/susimail/src/src/i2p/susi/webmail/WebMail.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/susimail/src/src/i2p/susi/webmail/WebMail.java 2021-05-19 12:11:58.000000000 +0000 @@ -253,6 +253,7 @@ private static final String RC_PROP_FORCE_MOBILE_CONSOLE = "routerconsole.forceMobileConsole"; private static final String CONFIG_THEME = "theme"; private static final String DEFAULT_THEME = "light"; + private static final String[] THEMES = new String[] { "dark", "light"}; /** From CSSHelper */ private static final String PROP_DISABLE_OLD = "routerconsole.disableOldThemes"; private static final boolean DEFAULT_DISABLE_OLD = true; @@ -3580,23 +3581,6 @@ * @return String[] -- Array of all the themes found. */ private static String[] getThemes(I2PAppContext ctx) { - String[] themes; - File dir = new File(ctx.getBaseDir(), "docs/themes/susimail"); - FileFilter fileFilter = new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }; - File[] dirnames = dir.listFiles(fileFilter); - if (dirnames != null) { - List th = new ArrayList(dirnames.length); - boolean skipOld = ctx.getProperty(PROP_DISABLE_OLD, DEFAULT_DISABLE_OLD); - for (int i = 0; i < dirnames.length; i++) { - String name = dirnames[i].getName(); - if (skipOld && (name.equals("midnight") || name.equals("classic"))) - continue; - th.add(name); - } - themes = th.toArray(new String[th.size()]); - } else { - themes = new String[0]; - } - return themes; + return THEMES; } } diff -Nru i2p-0.9.49/apps/systray/doc/README.txt i2p-0.9.50/apps/systray/doc/README.txt --- i2p-0.9.49/apps/systray/doc/README.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/systray/doc/README.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -Bundled in ../java/lib/ are the binaries for systray4j version 2.4.1 2004-03-28, -which is still the latest. - -Files are from systray4j-2.4.1-win32.zip. - -SHA1Sums: - 28acaea97816f53d188d01fd88b72e670e67286b systray4j-2.4.1-win32.zip - a7f5e02c3652f3f1a72559e54ee69226b8b97859 systray4j.dll - 947bd91c483494256cf48ad87c211e8701b4f85b systray4j.jar - - -systray4j.dll is LGPLv2.1, see ../../../licenses/LICENSE-LGPLv2.1.txt -systray4j.jar for Windows is LGPLv2.1, see ../../../licenses/LICENSE-LGPLv2.1.txt -Reference: http://systray.sourceforge.net/ -I2P systray code in ../java/src is public domain. - -SysTray is really obsolete. It supports Windows and kde3 only. -We only instantiate it on Windows. - -The java.awt.SystemTray classes added in Java 6 -(and used by apps/desktopgui) are the way to go now. - -We could either rewrite this to use SystemTray, or switch to desktopgui. diff -Nru i2p-0.9.49/apps/systray/java/build.xml i2p-0.9.50/apps/systray/java/build.xml --- i2p-0.9.49/apps/systray/java/build.xml 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/apps/systray/java/build.xml 2021-05-19 12:11:58.000000000 +0000 @@ -20,9 +20,11 @@ + + @@ -62,7 +64,7 @@ - + diff -Nru i2p-0.9.49/build.xml i2p-0.9.50/build.xml --- i2p-0.9.49/build.xml 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/build.xml 2021-05-19 12:11:58.000000000 +0000 @@ -15,7 +15,7 @@ and versions in apps/jetty/build.gradle --> - + @@ -31,8 +31,6 @@ - - @@ -313,28 +311,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -455,7 +431,7 @@ - + @@ -497,86 +473,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -649,14 +545,13 @@ - + - @@ -664,7 +559,7 @@ - + @@ -672,7 +567,7 @@ - + @@ -687,10 +582,10 @@ - + - + @@ -756,14 +651,14 @@ - + - + @@ -977,7 +872,6 @@ - @@ -1004,8 +898,6 @@ - - @@ -1088,6 +980,7 @@ + @@ -1101,8 +994,41 @@ + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + @@ -1192,9 +1118,6 @@ - - - @@ -1453,8 +1376,11 @@ + + + @@ -1896,14 +1822,14 @@ - - + + - + @@ -2310,8 +2236,17 @@ since preppkg puts too much stuff in pkg-temp --> + + + + + + + + + - + @@ -2406,6 +2341,7 @@ + @@ -2763,7 +2699,6 @@ - @@ -2840,7 +2775,6 @@ - @@ -2920,7 +2854,6 @@ - @@ -2987,7 +2920,6 @@ - diff -Nru i2p-0.9.49/core/java/build.xml i2p-0.9.50/core/java/build.xml --- i2p-0.9.49/core/java/build.xml 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/build.xml 2021-05-19 12:11:58.000000000 +0000 @@ -120,7 +120,7 @@ - + @@ -228,7 +228,7 @@ - + @@ -245,7 +245,7 @@ - + @@ -342,7 +342,7 @@ - + @@ -368,7 +368,7 @@ - + diff -Nru i2p-0.9.49/core/java/src/net/i2p/client/impl/I2PSessionImpl.java i2p-0.9.50/core/java/src/net/i2p/client/impl/I2PSessionImpl.java --- i2p-0.9.49/core/java/src/net/i2p/client/impl/I2PSessionImpl.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/client/impl/I2PSessionImpl.java 2021-05-19 12:11:58.000000000 +0000 @@ -769,7 +769,7 @@ auth.setProperty(I2PClient.PROP_USER, _options.getProperty(I2PClient.PROP_USER)); auth.setProperty(I2PClient.PROP_PW, _options.getProperty(I2PClient.PROP_PW)); } - sendMessage_unchecked(new GetDateMessage(CoreVersion.VERSION, auth)); + sendMessage_unchecked(new GetDateMessage(CoreVersion.PUBLISHED_VERSION, auth)); waitForDate(); if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "Before producer.connect()"); @@ -1880,7 +1880,7 @@ */ public String getRouterVersion() { if (_context.isRouterContext()) - return CoreVersion.VERSION; + return CoreVersion.PUBLISHED_VERSION; return _routerVersion; } diff -Nru i2p-0.9.49/core/java/src/net/i2p/client/impl/I2PSimpleSession.java i2p-0.9.50/core/java/src/net/i2p/client/impl/I2PSimpleSession.java --- i2p-0.9.49/core/java/src/net/i2p/client/impl/I2PSimpleSession.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/client/impl/I2PSimpleSession.java 2021-05-19 12:11:58.000000000 +0000 @@ -123,11 +123,11 @@ Properties auth = new OrderedProperties(); auth.setProperty(I2PClient.PROP_USER, opts.getProperty(I2PClient.PROP_USER)); auth.setProperty(I2PClient.PROP_PW, opts.getProperty(I2PClient.PROP_PW)); - sendMessage_unchecked(new GetDateMessage(CoreVersion.VERSION, auth)); + sendMessage_unchecked(new GetDateMessage(CoreVersion.PUBLISHED_VERSION, auth)); } else { // we must now send a GetDate even in SimpleSession, or we won't know // what version we are talking with and cannot use HostLookup - sendMessage_unchecked(new GetDateMessage(CoreVersion.VERSION)); + sendMessage_unchecked(new GetDateMessage(CoreVersion.PUBLISHED_VERSION)); } waitForDate(); } diff -Nru i2p-0.9.49/core/java/src/net/i2p/CoreVersion.java i2p-0.9.50/core/java/src/net/i2p/CoreVersion.java --- i2p-0.9.49/core/java/src/net/i2p/CoreVersion.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/CoreVersion.java 2021-05-19 12:11:58.000000000 +0000 @@ -18,21 +18,28 @@ public class CoreVersion { /** deprecated */ - public final static String ID = "Monotone"; + public final static String ID = "Git"; /** * The version used when checking for router updates, * and exchanged between router and client over I2CP. + * This is the marketing and user-visible version. + * * If we ever need a point release for a specific * architecture only, append ".1" to VERSION * and leave PUBLISHED_VERSION unchanged. * Otherwise, the same as PUBLISHED_VERSION. * RouterVersion.FULL_VERSION is suggested for display to the user. */ - public final static String VERSION = "0.9.49"; + public final static String VERSION = "0.9.50"; /** * The version published in the netdb via StatisticsManager. + * This is the API version. + * It must not go to 1.x for several years, because through + * 0.9.49, the Sybil analyzer blocked releases that didn't + * start with "0.9." + * * If we ever need a point release for a specific * architecture only, append ".1" to VERSION * and leave PUBLISHED_VERSION unchanged. @@ -41,7 +48,7 @@ * * @since 0.9.46 */ - public final static String PUBLISHED_VERSION = VERSION; + public final static String PUBLISHED_VERSION = "0.9.50"; /** * For Vuze. @@ -54,6 +61,7 @@ public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); + System.out.println("I2P API version: " + PUBLISHED_VERSION); System.out.println("ID: " + ID); } } diff -Nru i2p-0.9.49/core/java/src/net/i2p/data/DataHelper.java i2p-0.9.50/core/java/src/net/i2p/data/DataHelper.java --- i2p-0.9.49/core/java/src/net/i2p/data/DataHelper.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/data/DataHelper.java 2021-05-19 12:11:58.000000000 +0000 @@ -2101,7 +2101,7 @@ Pattern p = patterns.get(regex); if (p == null) { // catches easy mistake, and also swapping the args by mistake - if (regex.length() > 1 && !regex.startsWith("[") && !regex.equals("\r\n")) { + if (regex.length() > 1 && !regex.startsWith("[") && !regex.equals("\r\n") && !regex.startsWith("\\")) { //(new Exception("Warning: Split on regex: \"" + regex + "\" should probably be enclosed with []")).printStackTrace(); System.out.println("Warning: Split on regex: \"" + regex + "\" should probably be enclosed with []"); } diff -Nru i2p-0.9.49/core/java/src/net/i2p/data/KeyCertificate.java i2p-0.9.50/core/java/src/net/i2p/data/KeyCertificate.java --- i2p-0.9.49/core/java/src/net/i2p/data/KeyCertificate.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/data/KeyCertificate.java 2021-05-19 12:11:58.000000000 +0000 @@ -259,7 +259,7 @@ buf.append(" null payload"); } else { buf.append("\n\tCrypto type: ").append(getCryptoTypeCode()) - .append(" (").append(getSigType()).append(')'); + .append(" (").append(getEncType()).append(')'); buf.append("\n\tSig type: ").append(getSigTypeCode()) .append(" (").append(getSigType()).append(')'); if (_payload.length > HEADER_LENGTH) diff -Nru i2p-0.9.49/core/java/src/net/i2p/data/LeaseSet.java i2p-0.9.50/core/java/src/net/i2p/data/LeaseSet.java --- i2p-0.9.49/core/java/src/net/i2p/data/LeaseSet.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/data/LeaseSet.java 2021-05-19 12:11:58.000000000 +0000 @@ -118,6 +118,11 @@ return KEY_TYPE_LEASESET; } + /** + * Warning - will be null for LS2 EncryptedLeaseSets if not decrypted + * + * @return Destination or null + */ public Destination getDestination() { return _destination; } diff -Nru i2p-0.9.49/core/java/src/net/i2p/time/BuildTime.java i2p-0.9.50/core/java/src/net/i2p/time/BuildTime.java --- i2p-0.9.49/core/java/src/net/i2p/time/BuildTime.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/time/BuildTime.java 2021-05-19 12:11:58.000000000 +0000 @@ -34,10 +34,10 @@ private static final long _latestTime; private static final long YEARS_25 = 25L*365*24*60*60*1000; /** update this periodically */ - private static final String EARLIEST = "2021-02-12 12:00:00 UTC"; + private static final String EARLIEST = "2021-05-12 12:00:00 UTC"; // fallback if parse fails ticket #1976 // date -d 202x-xx-xx +%s - private static final long EARLIEST_LONG = 1613106000 * 1000L; + private static final long EARLIEST_LONG = 1620792000 * 1000L; static { // this is the standard format of build.timestamp as set in the top-level build.xml diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/Addresses.java i2p-0.9.50/core/java/src/net/i2p/util/Addresses.java --- i2p-0.9.49/core/java/src/net/i2p/util/Addresses.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/Addresses.java 2021-05-19 12:11:58.000000000 +0000 @@ -122,7 +122,8 @@ * * Warning, very slow on Windows, appx. 200ms + 50ms/interface * - * @param includeLocal whether to include local + * @param includeLocal whether to include local addresses + * and deprecated IPv6 addresses * @param includeIPv6 whether to include IPV6 * @return a sorted set of all addresses including wildcard * @since 0.8.3 @@ -141,6 +142,7 @@ * Warning, very slow on Windows, appx. 200ms + 50ms/interface * * @param includeSiteLocal whether to include private like 192.168.x.x + * and deprecated IPv6 addresses * @param includeLoopbackAndWildcard whether to include 127.x.x.x and 0.0.0.0 * @param includeIPv6 whether to include IPV6 * @return a sorted set of all addresses @@ -162,6 +164,7 @@ * Warning, very slow on Windows, appx. 200ms + 50ms/interface * * @param includeSiteLocal whether to include private like 192.168.x.x + * and deprecated IPv6 addresses * @param includeLoopbackAndWildcard whether to include 127.x.x.x and 0.0.0.0 * @param includeIPv6 whether to include IPV6 * @param includeIPv6Temporary whether to include IPV6 temporary addresses @@ -478,12 +481,15 @@ * Unlike InetAddress.getByName(), we do NOT allow numeric IPs * of the form d.d.d, d.d, or d, as these are almost certainly mistakes. * + * InetAddress.getByName() also returns 127.0.0.1 for a host "", + * but this is undocumented; as of 0.9.50, here we return null. + * * @param host literal IPv4 or IPv6 address; if null returns null * @return IP or null * @since 0.9.32 */ public static byte[] getIPOnly(String host) { - if (host == null) + if (host == null || host.isEmpty()) return null; byte[] rv; synchronized (_IPAddress) { @@ -492,7 +498,17 @@ if (rv == null) { if (isIPAddress(host)) { try { - rv = InetAddress.getByName(host).getAddress(); + if (host.contains(".")) { + rv = getIPv4(host); + if (rv == null) + return null; + } else if (host.contains(":") && !host.contains("::")) { + rv = getIPv6(host); + if (rv == null) + return null; + } else { + rv = InetAddress.getByName(host).getAddress(); + } synchronized (_IPAddress) { _IPAddress.put(host, rv); } @@ -510,12 +526,15 @@ * else the other type if available. * Will resolve but not cache DNS hostnames. * + * InetAddress.getByName() also returns 127.0.0.1 for a host "", + * but this is undocumented; as of 0.9.50, here we return null. + * * @param host DNS or IPv4 or IPv6 address; if null returns null * @return IP or null * @since 0.9.28 */ public static byte[] getIP(String host, boolean preferIPv6) { - if (host == null) + if (host == null || host.isEmpty()) return null; if (isIPAddress(host)) return getIP(host); @@ -563,12 +582,15 @@ * Number of results may also change based on caching at various layers, * even if the ultimate name server results did not change. * + * InetAddress.getByName() also returns 127.0.0.1 for a host "", + * but this is undocumented; as of 0.9.50, here we return null. + * * @param host DNS or IPv4 or IPv6 address; if null returns null * @return non-empty list IPs, or null if none * @since 0.9.28 */ public static List getIPs(String host) { - if (host == null) + if (host == null || host.isEmpty()) return null; if (isIPAddress(host)) { byte[] brv = getIP(host); @@ -623,8 +645,57 @@ return InetAddressUtils.isIPv4Address(host) || InetAddressUtils.isIPv6Address(host); } + /** + * Because InetAddress.getByName() is slow, esp. on Windows + * + * @param host w.x.y.z only + * @return 4 bytes or null + * @since 0.9.50 + */ + private static byte[] getIPv4(String host) { + String[] s = DataHelper.split(host, "\\.", 4); + if (s.length != 4) + return null; + byte[] rv = new byte[4]; + try { + for (int i = 0; i < 4; i++) { + int b = Integer.parseInt(s[i]); + if (b < 0 || b > 255) + return null; + rv[i] = (byte) b; + } + } catch (NumberFormatException nfe) { + return null; + } + return rv; + } - + /** + * Because InetAddress.getByName() is slow, esp. on Windows + * + * @param host full 0:1:2:3:4:5:6:7 only, no :: + * @return 16 bytes or null + * @since 0.9.50 + */ + private static byte[] getIPv6(String host) { + String[] s = DataHelper.split(host, ":", 8); + if (s.length != 8) + return null; + byte[] rv = new byte[16]; + try { + int j = 0; + for (int i = 0; i < 8; i++) { + int b = Integer.parseInt(s[i], 16); + if (b < 0 || b > 65535) + return null; + rv[j++] = (byte) (b >> 8); + rv[j++] = (byte) b; + } + } catch (NumberFormatException nfe) { + return null; + } + return rv; + } //////// IPv6 Cache Utils /////// @@ -816,7 +887,7 @@ System.out.println("\nExternal and Local IPv4 Addresses:"); a = getAddresses(true, false, false); print(a); - System.out.println("\nAll External Addresses:"); + System.out.println("\nAll External Addresses (except deprecated IPv6):"); a = getAddresses(false, false, true); print(a); byte[] ygg = getYggdrasilAddress(); @@ -824,7 +895,7 @@ System.out.println("\nYggdrasil Address:"); System.out.println(toString(ygg)); } - System.out.println("\nAll External and Local Addresses:"); + System.out.println("\nAll External and Local Addresses (may include deprecated IPv6):"); a = getAddresses(true, false, true); print(a); System.out.println("\nAll addresses:"); @@ -878,8 +949,8 @@ macs.add(buf.toString()); } print(macs); - System.out.println("\nIs connected? " + isConnected() + - "\nIs conn IPv6? " + isConnectedIPv6()); + System.out.println("\nHas IPv4? " + isConnected() + + "\nHas IPv6? " + isConnectedIPv6()); System.out.println("Has v6 flags? " + INET6_CACHE_ENABLED); System.out.println("Uses v6 temp? " + getPrivacyStatus()); // Windows 8.1 Java 1.8.0_66 netbook appx. 200ms + 50ms/interface @@ -898,17 +969,15 @@ } /** - * RFC 4941 - * @since 0.9.34 + * @return "true", "false", or "unknown" + * @since 0.9.50 */ - private static String getPrivacyStatus() { + public static String useIPv6TempAddresses() { // Windows: netsh interface ipv6 show privacy // Mac: sysctl net.inet6.ip6.use_tempaddr (1 is enabled) if (SystemVersion.isMac() || SystemVersion.isWindows()) return "unknown"; long t = getLong("/proc/sys/net/ipv6/conf/all/use_tempaddr"); - if (t < 0) - return "unknown"; String rv; if (t == 0) rv = "false"; @@ -916,7 +985,16 @@ rv = "true"; else rv = "unknown"; - if (t == 2) { + return rv; + } + + /** + * RFC 4941 + * @since 0.9.34 + */ + private static String getPrivacyStatus() { + String rv = useIPv6TempAddresses(); + if (Boolean.parseBoolean(rv)) { long pref = getLong("/proc/sys/net/ipv6/conf/all/temp_prefered_lft"); if (pref > 0) rv += ", preferred lifetime " + DataHelper.formatDuration(pref * 1000); diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/BandwidthEstimator.java i2p-0.9.50/core/java/src/net/i2p/util/BandwidthEstimator.java --- i2p-0.9.49/core/java/src/net/i2p/util/BandwidthEstimator.java 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/BandwidthEstimator.java 2021-05-19 12:11:58.000000000 +0000 @@ -0,0 +1,20 @@ +package net.i2p.util; + +/** + * A Westwood bandwidth estimator + * + * @since 0.9.46 consolidated from streaming and udp in 0.9.50 + */ +public interface BandwidthEstimator { + + /** + * Records an arriving ack. + * @param acked how many bytes or packets were acked with this ack + */ + public void addSample(int acked); + + /** + * @return the current bandwidth estimate in bytes/ms or packets/ms. + */ + public float getBandwidthEstimate(); +} diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/DNSOverHTTPS.java i2p-0.9.50/core/java/src/net/i2p/util/DNSOverHTTPS.java --- i2p-0.9.49/core/java/src/net/i2p/util/DNSOverHTTPS.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/DNSOverHTTPS.java 2021-05-19 12:11:58.000000000 +0000 @@ -249,11 +249,12 @@ */ private String query(String host, Type type, String url) { List toQuery; - if (url != null) + if (url != null) { toQuery = Collections.singletonList(url); - else + } else { toQuery = new ArrayList((type == Type.V6_ONLY) ? v6urls : v4urls); - Collections.shuffle(toQuery); + Collections.shuffle(toQuery); + } final long timeout = System.currentTimeMillis() + OVERALL_TIMEOUT; if (type == Type.V4_ONLY || type == Type.V4_PREFERRED) { // v4 query @@ -444,7 +445,7 @@ // We do this more than once, because // the first SSL handshake may take a while, and it may take the server // a while to render the index page. - if (gotDate < MAX_DATE_SETS && "Date".equals(key)) { + if (gotDate < MAX_DATE_SETS && "date".equals(key.toLowerCase(Locale.US))) { long timeRcvd = System.currentTimeMillis(); long serverTime = RFC822Date.parse822Date(val); if (serverTime > 0) { diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/EepGet.java i2p-0.9.50/core/java/src/net/i2p/util/EepGet.java --- i2p-0.9.49/core/java/src/net/i2p/util/EepGet.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/EepGet.java 2021-05-19 12:11:58.000000000 +0000 @@ -83,9 +83,9 @@ protected boolean _notModified; protected String _contentType; protected boolean _transferFailed; - protected boolean _aborted; + protected volatile boolean _aborted; protected int _fetchHeaderTimeout; - private long _fetchEndTime; + protected int _fetchTotalTimeout; protected int _fetchInactivityTimeout; protected int _redirects; protected String _redirectLocation; @@ -476,6 +476,7 @@ public void attempting(String url); } + protected class CLIStatusListener implements StatusListener { private final int _markSize; private final int _lineSize; @@ -657,8 +658,11 @@ * @return success */ public boolean fetch(long fetchHeaderTimeout, long totalTimeout, long inactivityTimeout) { + // we need a SocketTimeout if we have a totalTimeout + if (totalTimeout > 0 && fetchHeaderTimeout <= 0) + fetchHeaderTimeout = totalTimeout; _fetchHeaderTimeout = (int) Math.min(fetchHeaderTimeout, Integer.MAX_VALUE); - _fetchEndTime = (totalTimeout > 0 ? System.currentTimeMillis() + totalTimeout : -1); + _fetchTotalTimeout = (int) Math.min(totalTimeout, Integer.MAX_VALUE); _fetchInactivityTimeout = (int) Math.min(inactivityTimeout, Integer.MAX_VALUE); _keepFetching = true; @@ -667,16 +671,21 @@ while (_keepFetching) { SocketTimeout timeout = null; if (_fetchHeaderTimeout > 0) { + // We create the SocketTimeout with an inactivity time of the header timeout. + // After fetchHeaders(), we must call either resetTimer() or cancel() timeout = new SocketTimeout(_fetchHeaderTimeout); - final SocketTimeout stimeout = timeout; // ugly - why not use sotimeout? + final SocketTimeout stimeout = timeout; + final Thread thread = Thread.currentThread(); timeout.setTimeoutCommand(new Runnable() { public void run() { if (_log.shouldLog(Log.DEBUG)) _log.debug("timeout reached on " + _url + ": " + stimeout); _aborted = true; + thread.interrupt(); } }); - timeout.setTotalTimeoutPeriod(_fetchEndTime); + if (_fetchTotalTimeout > 0) + timeout.setTotalTimeoutPeriod(_fetchTotalTimeout); } try { for (int i = 0; i < _listeners.size(); i++) @@ -685,14 +694,10 @@ if (timeout != null) timeout.resetTimer(); doFetch(timeout); - if (timeout != null) - timeout.cancel(); if (!_transferFailed) return true; break; } catch (IOException ioe) { - if (timeout != null) - timeout.cancel(); for (int i = 0; i < _listeners.size(); i++) _listeners.get(i).attemptFailed(_url, _bytesTransferred, _bytesRemaining, _currentAttempt, _numRetries, ioe); if (_log.shouldLog(Log.WARN)) @@ -702,6 +707,8 @@ ioe instanceof ConnectException) // proxy or nonproxied host Connection Refused _keepFetching = false; } finally { + if (timeout != null) + timeout.cancel(); if (_out != null) { try { _out.close(); @@ -736,7 +743,8 @@ } /** - * single fetch + * This reads the response to a single fetch. + * Call after sendRequest() * @param timeout may be null */ protected void doFetch(SocketTimeout timeout) throws IOException { @@ -745,20 +753,28 @@ if (_aborted) throw new IOException("Timed out reading the HTTP headers"); - if (timeout != null) { - timeout.resetTimer(); - if (_fetchInactivityTimeout > 0) - timeout.setInactivityTimeout(_fetchInactivityTimeout); - else - timeout.setInactivityTimeout(INACTIVITY_TIMEOUT); - } // _proxy is null when extended by I2PSocketEepGet - if (_proxy != null && !_shouldProxy) { + if (_proxy != null) { + if (timeout != null) { + if (_fetchTotalTimeout > 0) { + timeout.resetTimer(); + } else { + // we don't need the timeout any more, we'll use soTimeout + timeout.cancel(); + timeout = null; + } + } // we only set the soTimeout before the headers if not proxied if (_fetchInactivityTimeout > 0) _proxy.setSoTimeout(_fetchInactivityTimeout); else _proxy.setSoTimeout(INACTIVITY_TIMEOUT); + } else if (timeout != null) { + timeout.resetTimer(); + if (_fetchInactivityTimeout > 0) + timeout.setInactivityTimeout(_fetchInactivityTimeout); + else + timeout.setInactivityTimeout(INACTIVITY_TIMEOUT); } if (_redirectLocation != null) { @@ -1238,7 +1254,17 @@ throw new IOException("Header line too long: " + buf.toString()); } } - + + /** + * Should we read the body of the response? + * @return true always, overridden in EepHead + * @since 0.9.50 + */ + protected boolean shouldReadBody() { return true; } + + /** + * TODO this does not skip over chunk extensions (RFC 2616 sec. 3.6.1) + */ protected long readChunkLength() throws IOException { StringBuilder buf = new StringBuilder(8); int nl = 0; @@ -1322,7 +1348,8 @@ } else if (key.equals("last-modified")) { _lastModified = val; } else if (key.equals("transfer-encoding")) { - _encodingChunked = val.toLowerCase(Locale.US).contains("chunked"); + // don't read chunk header in readHeaders() for EepHead + _encodingChunked = shouldReadBody() && val.toLowerCase(Locale.US).contains("chunked"); } else if (key.equals("content-encoding")) { // This is kindof a hack, but if we are downloading a gzip file // we don't want to transparently gunzip it and save it as a .gz file. @@ -1382,7 +1409,7 @@ if ("http".equals(url.getScheme())) { String host = url.getHost(); if (host == null) - throw new MalformedURLException("URL is not supported:" + _actualURL); + throw new MalformedURLException("URL is not supported: " + _actualURL); String hostlc = host.toLowerCase(Locale.US); if (hostlc.endsWith(".i2p")) throw new UnknownHostException("I2P addresses must be proxied"); @@ -1399,7 +1426,7 @@ _proxy = new Socket(host, port); } } else { - throw new MalformedURLException("URL is not supported:" + _actualURL); + throw new MalformedURLException("URL is not supported: " + _actualURL); } } catch (URISyntaxException use) { IOException ioe = new MalformedURLException("Request URL is invalid"); diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/EepHead.java i2p-0.9.50/core/java/src/net/i2p/util/EepHead.java --- i2p-0.9.49/core/java/src/net/i2p/util/EepHead.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/EepHead.java 2021-05-19 12:11:58.000000000 +0000 @@ -37,7 +37,7 @@ */ public class EepHead extends EepGet { /** EepGet needs either a non-null file or a stream... shouldn't actually be written to... */ - static final OutputStream _dummyStream = new ByteArrayOutputStream(0); + private static final OutputStream _dummyStream = new ByteArrayOutputStream(0); public EepHead(I2PAppContext ctx, String proxyHost, int proxyPort, int numRetries, String url) { // we're using this constructor: @@ -178,7 +178,7 @@ if (_fetchInactivityTimeout > 0) timeout.setInactivityTimeout(_fetchInactivityTimeout); else - timeout.setInactivityTimeout(60*1000); + timeout.setInactivityTimeout(INACTIVITY_TIMEOUT); } // Should we even follow redirects for HEAD? @@ -239,6 +239,8 @@ doFetch(timeout); return; } + if (timeout != null) + timeout.cancel(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Headers read completely"); @@ -250,8 +252,6 @@ if (_aborted) throw new IOException("Timed out reading the HTTP data"); - timeout.cancel(); - if (_transferFailed) { // 404, etc - transferFailed is called after all attempts fail, by fetch() above for (int i = 0; i < _listeners.size(); i++) @@ -263,6 +263,14 @@ } } + /** + * Should we read the body of the response? + * @return false always + * @since 0.9.50 + */ + @Override + protected boolean shouldReadBody() { return false; } + @Override protected String getRequest() throws IOException { StringBuilder buf = new StringBuilder(512); diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/PortMapper.java i2p-0.9.50/core/java/src/net/i2p/util/PortMapper.java --- i2p-0.9.49/core/java/src/net/i2p/util/PortMapper.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/PortMapper.java 2021-05-19 12:11:58.000000000 +0000 @@ -6,6 +6,7 @@ import java.text.Collator; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -20,6 +21,8 @@ */ public class PortMapper { private final ConcurrentHashMap _dir; + private final Set _eepsites; + public static final String PROP_PREFER_HTTPS = "routerconsole.preferHTTPS"; public static final String SVC_CONSOLE = "console"; @@ -98,6 +101,7 @@ */ public PortMapper(I2PAppContext context) { _dir = new ConcurrentHashMap(8); + _eepsites = new ConcurrentHashSet(4); } /** @@ -110,7 +114,10 @@ } /** - * Add the service + * Add the service. + * If service is SVC_EEPSITE or SVC_HTTPS_EEPSITE, + * the URL will be included in getEepsites() + * * @param port > 0 * @return success, false if already registered * @since 0.9.21 @@ -118,7 +125,10 @@ public boolean register(String service, String host, int port) { if (port <= 0 || port > 65535) return false; - return _dir.putIfAbsent(service, InetSocketAddress.createUnresolved(host, port)) == null; + boolean rv = _dir.putIfAbsent(service, InetSocketAddress.createUnresolved(host, port)) == null; + if (service.equals(SVC_EEPSITE) || service.equals(SVC_HTTPS_EEPSITE)) + rv = _eepsites.add(toURL(service, host, port)); + return rv; } /** @@ -140,10 +150,19 @@ /** * Remove the service, * only if it is registered with the supplied port. + * If service is SVC_EEPSITE or SVC_HTTPS_EEPSITE, + * the URL will be removed from getEepsites() * * @since 0.9.34 */ public void unregister(String service, int port) { + if (service.equals(SVC_EEPSITE) || service.equals(SVC_HTTPS_EEPSITE)) { + String end = ":" + port + '/'; + for (Iterator iter = _eepsites.iterator(); iter.hasNext(); ) { + if (iter.next().endsWith(end)) + iter.remove(); + } + } // not synched if (getPort(service) == port) _dir.remove(service); @@ -316,6 +335,34 @@ } /** + * @return unsorted, non-empty, or null if none + * @since 0.9.50 + */ + public List getEepsiteURLs() { + if (_eepsites.isEmpty()) + return null; + return new ArrayList(_eepsites); + } + + /** + * @since 0.9.50 from SummaryBarRenderer + */ + private static String toURL(String svc, String host, int port) { + StringBuilder buf = new StringBuilder(64); + buf.append(svc.equals(SVC_HTTPS_EEPSITE) ? "https://" : "http://"); + host = convertWildcard(host, "127.0.0.1"); + if (host.contains(":")) + buf.append('['); + buf.append(host); + if (host.contains(":")) + buf.append(']'); + buf.append(':') + .append(port) + .append('/'); + return buf.toString(); + } + + /** * For debugging only * @since 0.9.20 */ @@ -329,6 +376,13 @@ continue; out.write("" + s + "" + convertWildcard(ia.getHostName(), DEFAULT_HOST) + "" + ia.getPort() + '\n'); } + if (!_eepsites.isEmpty()) { + out.write(" EepsiteURL\n"); + for (String url : _eepsites) { + String s = url.startsWith("https://") ? SVC_HTTPS_EEPSITE : SVC_EEPSITE; + out.write("" + s + "" + url + "\n"); + } + } out.write("\n"); } } diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/SimpleTimer2.java i2p-0.9.50/core/java/src/net/i2p/util/SimpleTimer2.java --- i2p-0.9.49/core/java/src/net/i2p/util/SimpleTimer2.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/SimpleTimer2.java 2021-05-19 12:11:58.000000000 +0000 @@ -397,10 +397,12 @@ // The result (if rescheduled) is a dup on the queue, see tickets 1694, 1705 // Mitigated by close-to-execution check in reschedule() boolean cancelled = _future.cancel(true); - if (cancelled) + if (cancelled) { _state = TimedEventState.CANCELLED; - else - _log.error("could not cancel " + this + " to run in " + (_nextRun - System.currentTimeMillis()), new Exception()); + } else { + if (_log.shouldWarn()) + _log.warn("could not cancel " + this + " to run in " + (_nextRun - System.currentTimeMillis()), new Exception()); + } return cancelled; } return false; diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/SocketTimeout.java i2p-0.9.50/core/java/src/net/i2p/util/SocketTimeout.java --- i2p-0.9.49/core/java/src/net/i2p/util/SocketTimeout.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/SocketTimeout.java 2021-05-19 12:11:58.000000000 +0000 @@ -31,7 +31,7 @@ private volatile Runnable _command; /** - * @param delay greater than zero + * @param delay The inactivity delay, greater than zero */ public SocketTimeout(long delay) { this(null, delay); } @@ -40,7 +40,7 @@ * it will be closed when the timer expires. * * @param socket may be null - * @param delay greater than zero + * @param delay The inactivity delay, greater than zero */ public SocketTimeout(Socket socket, long delay) { super(SimpleTimer2.getInstance()); diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/SSLEepGet.java i2p-0.9.50/core/java/src/net/i2p/util/SSLEepGet.java --- i2p-0.9.49/core/java/src/net/i2p/util/SSLEepGet.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/SSLEepGet.java 2021-05-19 12:11:58.000000000 +0000 @@ -103,7 +103,7 @@ private static final String CERT_DIR = "certificates/ssl"; private static final String PROP_USE_DNS_OVER_HTTPS = "eepget.useDNSOverHTTPS"; - private static final boolean DEFAULT_USE_DNS_OVER_HTTPS = false; + private static final boolean DEFAULT_USE_DNS_OVER_HTTPS = true; /** * Not all may be supported. @@ -586,12 +586,16 @@ if (_aborted) throw new IOException("Timed out reading the HTTP headers"); + // _proxy is the socket, even if not proxied. + // We never use the timeout inactivity timer; only socket SoTimeout. if (timeout != null) { - timeout.resetTimer(); - if (_fetchInactivityTimeout > 0) - timeout.setInactivityTimeout(_fetchInactivityTimeout); - else - timeout.setInactivityTimeout(60*1000); + if (_fetchTotalTimeout > 0) { + timeout.resetTimer(); + } else { + // we don't need the timeout any more, we'll use soTimeout + timeout.cancel(); + timeout = null; + } } if (_fetchInactivityTimeout > 0) _proxy.setSoTimeout(_fetchInactivityTimeout); @@ -762,19 +766,26 @@ String originalHost = host; boolean useDNSOverHTTPS; - if (_forceDoH == 2) - useDNSOverHTTPS = true; - else if (_forceDoH == 1) + if (_forceDoH == 1 || _shouldProxy) useDNSOverHTTPS = false; + else if (_forceDoH == 2) + useDNSOverHTTPS = true; else useDNSOverHTTPS = _context.getProperty(PROP_USE_DNS_OVER_HTTPS, DEFAULT_USE_DNS_OVER_HTTPS); // This duplicates checks in DNSOverHTTPS.lookup() but do it here too so // we don't even construct it if we don't need it + String ip = null; if (useDNSOverHTTPS && !host.equals("dns.google") && !Addresses.isIPAddress(host)) { DNSOverHTTPS doh = new DNSOverHTTPS(_context, getSSLState()); - String ip = doh.lookup(host); - if (ip != null) - host = ip; + ip = doh.lookup(host); + if (ip != null) { + // will be used below + if (_log.shouldDebug()) + _log.debug("DoH success: " + host + ' ' + ip); + } else { + if (_log.shouldWarn()) + _log.debug("DoH fail: " + host); + } } if (_shouldProxy) { @@ -810,6 +821,20 @@ _proxy = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(_proxy, host, port, true); if (_log.shouldLog(Log.DEBUG)) _log.debug(_proxyType + " proxy headers read completely"); + } else if (ip != null) { + // DoH, create the socket with the IP, then create the SSL socket with the host + // So that SNI and cert validation works + if (_fetchHeaderTimeout > 0) { + _proxy = new Socket(); + _proxy.setSoTimeout(_fetchHeaderTimeout); + _proxy.connect(new InetSocketAddress(ip, port), _fetchHeaderTimeout); + } else { + _proxy = new Socket(ip, port); + } + if (_sslContext != null) + _proxy = _sslContext.getSocketFactory().createSocket(_proxy, host, port, true); + else + _proxy = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(_proxy, host, port, true); } else { // Warning, createSocket() followed by connect(InetSocketAddress) // disables SNI, at least on Java 7. @@ -823,6 +848,8 @@ _proxy.setSoTimeout(_fetchHeaderTimeout); } } + if (timeout != null) + timeout.setSocket(_proxy); SSLSocket socket = (SSLSocket) _proxy; I2PSSLSocketFactory.setProtocolsAndCiphers(socket); diff -Nru i2p-0.9.49/core/java/src/net/i2p/util/SystemVersion.java i2p-0.9.50/core/java/src/net/i2p/util/SystemVersion.java --- i2p-0.9.49/core/java/src/net/i2p/util/SystemVersion.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/java/src/net/i2p/util/SystemVersion.java 2021-05-19 12:11:58.000000000 +0000 @@ -44,7 +44,7 @@ private static final boolean _hasWrapper = System.getProperty("wrapper.version") != null; private static final boolean _isLinuxService; // found in Tanuki WrapperManager source so we don't need the WrapperManager class here - private static final boolean _isWindowsService = _isWin && _hasWrapper && Boolean.valueOf(System.getProperty("wrapper.service")); + private static final boolean _isWindowsService = _isWin && _hasWrapper && Boolean.parseBoolean(System.getProperty("wrapper.service")); private static final boolean _isService; private static final boolean _isSlow; @@ -80,7 +80,8 @@ (DAEMON_USER.equals(System.getProperty("user.name")) || (_isGentoo && GENTOO_USER.equals(System.getProperty("user.name")))); _isService = _isLinuxService || _isWindowsService; - _isSlow = _isAndroid || _isApache || _isArm || _isGNU || _isZero || getMaxMemory() < 48*1024*1024L; + // we assume the Apple M1 is not slow, however isSlow() below will still return true until we have a jbigi + _isSlow = _isAndroid || _isApache || (_isArm && !_isMac) || _isGNU || _isZero || getMaxMemory() < 48*1024*1024L; int sdk = 0; if (_isAndroid) { diff -Nru i2p-0.9.49/core/locale/messages_it.po i2p-0.9.50/core/locale/messages_it.po --- i2p-0.9.49/core/locale/messages_it.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/locale/messages_it.po 2021-05-19 12:11:58.000000000 +0000 @@ -8,6 +8,7 @@ # Leelium , 2019 # zzzi2p, 2019 # ironbishop , 2019 +# SebastianoPistore , 2021 # msgid "" msgstr "" @@ -15,7 +16,7 @@ "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-12-17 18:42+0000\n" "PO-Revision-Date: 2019-12-17 17:16+0000\n" -"Last-Translator: ironbishop , 2019\n" +"Last-Translator: SebastianoPistore , 2021\n" "Language-Team: Italian (https://www.transifex.com/otf/teams/12694/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -133,5 +134,5 @@ #, java-format msgid "{0} similar message omitted" msgid_plural "{0} similar messages omitted" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} messaggio simile omesso" +msgstr[1] "{0} messaggi simili omessi" diff -Nru i2p-0.9.49/core/resources/dohservers.txt i2p-0.9.50/core/resources/dohservers.txt --- i2p-0.9.49/core/resources/dohservers.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/core/resources/dohservers.txt 2021-05-19 12:11:58.000000000 +0000 @@ -26,8 +26,7 @@ # https://dnses.alekberg.net/dns-query # -# 400 -#https://dnsnl.alekberg.net/dns-query +https://dnsnl.alekberg.net/dns-query # 400 #https://dnsse.alekberg.net/dns-query # down, see https://www.armadillodns.net/ for status @@ -52,8 +51,7 @@ # https://dnsforge.de/dns-query # -# not found -#https://doh.dnslify.com/dns-query +https://doh.dnslify.com/dns-query # https://doh.li/dns-query # @@ -66,18 +64,24 @@ # https://dns.hostux.net/dns-query # +https://ordns.he.net/dns-query +# # not found #https://jcdns.fun/dns-query # https://jp.tiar.app/dns-query https://jp.tiarap.org/dns-query # -# timeout -#https://resolver-eu.lelux.fi/dns-query +https://resolver-eu.lelux.fi/dns-query # https://doh.libredns.gr/dns-query # -https://fi.doh.dns.snopyta.org/dns-query +https://dns.moulticast.net/dns-query +# +https://doh.post-factum.tk/dns-query +# +# timeout, no results +#https://fi.doh.dns.snopyta.org/dns-query # https://dns.twnic.tw/dns-query # @@ -85,14 +89,15 @@ #https://dns.wugui.zone/dns-query #https://dns-asia.wugui.zone/dns-query # -https://dns.dnsoverhttps.net/dns-query +# cert expired +#https://dns.dnsoverhttps.net/dns-query # -https://ibksturm.synology.me/dns-query +# host not found +#https://ibksturm.synology.me/dns-query # https://ibuki.cgnat.net/dns-query # -# timeout -#https://doh-2.seby.io/dns-query +https://doh-2.seby.io/dns-query https://doh.seby.io:8443/dns-query # # diff -Nru i2p-0.9.49/debian/apparmor/i2p i2p-0.9.50/debian/apparmor/i2p --- i2p-0.9.49/debian/apparmor/i2p 2021-02-17 12:12:12.000000000 +0000 +++ i2p-0.9.50/debian/apparmor/i2p 2021-05-19 12:11:58.000000000 +0000 @@ -50,6 +50,8 @@ /usr/share/i2p/** r, # Used by some plugins + /usr/share/java/ecj.jar r, + /usr/share/java/eclipse-ecj.jar r, /usr/share/java/eclipse-ecj-*.jar r, # Tanuki java wrapper @@ -81,6 +83,9 @@ # Other /proc @{PROC}/cpuinfo r, @{PROC}/net/if_inet6 r, + @{PROC}/sys/net/ipv6/conf/all/temp_prefered_lft r, + @{PROC}/sys/net/ipv6/conf/all/temp_valid_lft r, + @{PROC}/sys/net/ipv6/conf/all/use_tempaddr r, # 'm' is needed by the I2P-Bote plugin /{,lib/live/mount/overlay/}tmp/ rwm, diff -Nru i2p-0.9.49/debian/changelog i2p-0.9.50/debian/changelog --- i2p-0.9.49/debian/changelog 2021-02-17 12:12:12.000000000 +0000 +++ i2p-0.9.50/debian/changelog 2021-05-19 12:12:12.000000000 +0000 @@ -1,3 +1,9 @@ +i2p (0.9.50-1ubuntu1) focal; urgency=medium + + * New upstream version 0.9.50 + + -- zzz on i2p (key signing) Wed, 19 May 2021 12:12:12 +0000 + i2p (0.9.49-1ubuntu1) focal; urgency=medium * New upstream version 0.9.49 diff -Nru i2p-0.9.49/debian/copyright i2p-0.9.50/debian/copyright --- i2p-0.9.49/debian/copyright 2021-02-17 12:12:12.000000000 +0000 +++ i2p-0.9.50/debian/copyright 2021-05-19 12:12:12.000000000 +0000 @@ -350,7 +350,7 @@ Systray (systray.jar): Public domain. - Tomcat 9.0.40 (jasper-runtime.jar): + Tomcat 9.0.45 (jasper-runtime.jar): (not included in most distribution packages) Copyright 1999-2020 The Apache Software Foundation See licenses/LICENSE-Apache2.0.txt @@ -366,27 +366,10 @@ Admin Manager: Public domain - BOB Demos: - Copyright (C) sponge - DWTFYWTPL - - Gradle wrapper: + Gradle wrapper 5.2.1: + (not included in most distribution packages) Copyright (c) 2017 the original author or authors. See licenses/LICENSE-Apache2.0.txt - SAM C Library: - Copyright (c) 2004, Matthew P. Cashdollar - See apps/sam/c/doc/license.txt - - SAM C# Library: - Public domain. - See apps/sam/csharp/README - - SAM Perl Library: - See licenses/LICENSE-GPLv2.txt - - SAM Python Library: - Public domain. - The debian packaging has been released into the public domain. diff -Nru i2p-0.9.49/debian/i2p-router.links i2p-0.9.50/debian/i2p-router.links --- i2p-0.9.49/debian/i2p-router.links 2021-02-17 12:12:12.000000000 +0000 +++ i2p-0.9.50/debian/i2p-router.links 2021-05-19 12:11:58.000000000 +0000 @@ -1,3 +1,7 @@ +# +# Note: Update apparmor/i2p after any changes +# + usr/share/common-licenses/GPL-2 usr/share/doc/i2p-router/licenses/LICENSE-GPLv2.txt usr/share/common-licenses/LGPL-2.1 usr/share/doc/i2p-router/licenses/LICENSE-LGPLv2.1.txt usr/share/common-licenses/Apache-2.0 usr/share/doc/i2p-router/licenses/LICENSE-Apache2.0.txt @@ -48,8 +52,8 @@ usr/share/java/tomcat9-jasper-el.jar usr/share/i2p/lib/jasper-el.jar # legacy name in lib/ usr/share/java/tomcat9-el-api.jar usr/share/i2p/lib/commons-el.jar -# tomcat pulls in ecj, link to it for eepsite webapps needing a compiler -usr/share/java/ecj.jar usr/share/i2p/lib/ecj.jar +# tomcat9 pulls in libeclipse-jdk-core-java, link to it for eepsite webapps needing a compiler +usr/share/java/eclipse-jdt-core.jar usr/share/i2p/lib/ecj.jar # comment out if not building with libtaglibs-standard diff -Nru i2p-0.9.49/debian/po/pl.po i2p-0.9.50/debian/po/pl.po --- i2p-0.9.49/debian/po/pl.po 2021-02-17 12:12:12.000000000 +0000 +++ i2p-0.9.50/debian/po/pl.po 2021-05-19 12:12:12.000000000 +0000 @@ -1,17 +1,18 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the i2p package. # # Translators: # PolishAnon , 2011, 2012 +# Przemyslaw Ka. , 2021 # sebx, 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: i2p@packages.debian.org\n" "POT-Creation-Date: 2017-11-12 14:01+0000\n" -"PO-Revision-Date: 2017-06-30 21:32+0000\n" -"Last-Translator: sebx\n" +"PO-Revision-Date: 2021-03-12 13:17+0000\n" +"Last-Translator: Przemyslaw Ka. \n" "Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -92,10 +93,8 @@ #. Type: boolean #. Description #: ../i2p.templates:5001 -#, fuzzy -#| msgid "Run I2P daemon confined with AppArmor" msgid "Should the I2P daemon be confined with AppArmor?" -msgstr "Uruchom I2P deamon ograniczony przez AppArmor" +msgstr "Czy demon I2P powinien być ograniczony przez AppArmor?" #. Type: boolean #. Description diff -Nru i2p-0.9.49/docker/clients.config i2p-0.9.50/docker/clients.config --- i2p-0.9.49/docker/clients.config 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/docker/clients.config 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -# NOTE: This I2P config file must use UTF-8 encoding -# -# If you have a 'split' directory installation, with configuration -# files in ~/.i2p (Linux), %LOCALAPPDATA%\I2P (Windows), -# or /Users/(user)/Library/Application Support/i2p (Mac), be sure to -# edit the file in the configuration directory, NOT the install directory. -# When running as a Linux daemon, the configuration directory is /var/lib/i2p -# and the install directory is /usr/share/i2p . -# When running as a Windows service, the configuration directory is \ProgramData\i2p -# and the install directory is \Program Files\i2p . -# -# On first run, this file will be split into individual config files -# in clients.config.d/ in the configuration directory. -# Look in that directory for the file to edit. -# - -# fire up the web console -## There are several choices, here are some examples: -## non-SSL, bind to local IPv4 only -#clientApp.0.args=7657 127.0.0.1 ./webapps/ -## non-SSL, bind to local IPv6 only -#clientApp.0.args=7657 ::1 ./webapps/ -## non-SSL, bind to all IPv4 addresses -#clientApp.0.args=7657 0.0.0.0 ./webapps/ -## non-SSL, bind to all IPv6 addresses -#clientApp.0.args=7657 :: ./webapps/ -## For SSL only, change clientApp.4.args below to https:// -## SSL only -#clientApp.0.args=-s 7657 ::1,127.0.0.1 ./webapps/ -## non-SSL and SSL -#clientApp.0.args=7657 ::1,127.0.0.1 -s 7667 ::1,127.0.0.1 ./webapps/ -## non-SSL only, both IPv6 and IPv4 local interfaces -clientApp.0.args=7657 0.0.0.0 ./webapps/ -clientApp.0.main=net.i2p.router.web.RouterConsoleRunner -clientApp.0.name=webConsole -clientApp.0.onBoot=true - -# start up the SAM bridge so other client apps can connect -clientApp.1.main=net.i2p.sam.SAMBridge -clientApp.1.name=SAMBridge -clientApp.1.args=sam.keys 0.0.0.0 7656 i2cp.tcp.host=localhost i2cp.tcp.port=7654 -clientApp.1.startOnLoad=false - -# poke the i2ptunnels defined in i2ptunnel.config -clientApp.2.main=net.i2p.i2ptunnel.TunnelControllerGroup -clientApp.2.name=Tunnels -clientApp.2.args=i2ptunnel.config - -# run our own eepsite with a seperate jetty instance -clientApp.3.main=org.mortbay.jetty.Server -clientApp.3.name=eepsite -clientApp.3.args=eepsite/jetty.xml -clientApp.3.delay=30 -clientApp.3.startOnLoad=false - -# load a browser pointing at the web console whenever we start up -clientApp.4.main=net.i2p.apps.systray.UrlLauncher -clientApp.4.name=consoleBrowser -clientApp.4.args=http://localhost:7657/ -clientApp.4.delay=5 -clientApp.4.startOnLoad=false diff -Nru i2p-0.9.49/docker/i2ptunnel.config i2p-0.9.50/docker/i2ptunnel.config --- i2p-0.9.49/docker/i2ptunnel.config 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/docker/i2ptunnel.config 1970-01-01 00:00:00.000000000 +0000 @@ -1,187 +0,0 @@ -# NOTE: This I2P config file must use UTF-8 encoding -# -# If you have a 'split' directory installation, with configuration -# files in ~/.i2p (Linux), %LOCALAPPDATA%\I2P (Windows), -# or /Users/(user)/Library/Application Support/i2p (Mac), be sure to -# edit the file in the configuration directory, NOT the install directory. -# When running as a Linux daemon, the configuration directory is /var/lib/i2p -# and the install directory is /usr/share/i2p . -# When running as a Windows service, the configuration directory is \ProgramData\i2p -# and the install directory is \Program Files\i2p . -# -# On first run, this file will be split into individual config files -# in i2ptunnel.config.d/ in the configuration directory. -# Look in that directory for the file to edit. -# - -# eepproxy -tunnel.0.name=I2P HTTP Proxy -tunnel.0.description=HTTP proxy for browsing eepsites and the web -tunnel.0.type=httpclient -tunnel.0.sharedClient=true -tunnel.0.interface=0.0.0.0 -tunnel.0.listenPort=4444 -tunnel.0.proxyList=false.i2p -tunnel.0.i2cpHost=127.0.0.1 -tunnel.0.i2cpPort=7654 -tunnel.0.option.inbound.nickname=shared clients -tunnel.0.option.outbound.nickname=shared clients -tunnel.0.option.i2cp.leaseSetEncType=4,0 -tunnel.0.option.i2cp.reduceIdleTime=900000 -tunnel.0.option.i2cp.reduceOnIdle=true -tunnel.0.option.i2cp.reduceQuantity=1 -tunnel.0.option.i2p.streaming.connectDelay=1000 -tunnel.0.option.i2ptunnel.httpclient.SSLOutproxies=false.i2p -tunnel.0.option.inbound.length=3 -tunnel.0.option.inbound.lengthVariance=0 -tunnel.0.option.outbound.length=3 -tunnel.0.option.outbound.lengthVariance=0 -tunnel.0.option.outbound.priority=10 -tunnel.0.startOnLoad=true - -# irc -tunnel.1.name=Irc2P -tunnel.1.description=IRC tunnel to access the Irc2P network -tunnel.1.type=ircclient -tunnel.1.sharedClient=false -tunnel.1.interface=0.0.0.0 -tunnel.1.listenPort=6668 -tunnel.1.targetDestination=irc.postman.i2p:6667,irc.echelon.i2p:6667 -tunnel.1.i2cpHost=127.0.0.1 -tunnel.1.i2cpPort=7654 -tunnel.1.option.inbound.nickname=Irc2P -tunnel.1.option.outbound.nickname=Irc2P -tunnel.1.option.i2cp.closeIdleTime=1200000 -tunnel.1.option.i2cp.closeOnIdle=true -tunnel.1.option.i2cp.delayOpen=true -tunnel.1.option.i2cp.destination.sigType=7 -tunnel.1.option.i2cp.leaseSetEncType=4,0 -tunnel.1.option.i2cp.newDestOnResume=false -tunnel.1.option.i2cp.reduceIdleTime=600000 -tunnel.1.option.i2cp.reduceOnIdle=true -tunnel.1.option.i2cp.reduceQuantity=1 -tunnel.1.option.i2p.streaming.connectDelay=1000 -tunnel.1.option.i2p.streaming.maxWindowSize=16 -tunnel.1.option.inbound.length=3 -tunnel.1.option.inbound.lengthVariance=0 -tunnel.1.option.outbound.length=3 -tunnel.1.option.outbound.lengthVariance=0 -tunnel.1.option.outbound.priority=15 -tunnel.1.startOnLoad=true - -# local eepserver -tunnel.3.name=I2P webserver -tunnel.3.description=My eepsite -tunnel.3.type=httpserver -tunnel.3.targetHost=127.0.0.1 -tunnel.3.targetPort=7658 -tunnel.3.spoofedHost=mysite.i2p -tunnel.3.privKeyFile=eepsite/eepPriv.dat -tunnel.3.i2cpHost=127.0.0.1 -tunnel.3.i2cpPort=7654 -tunnel.3.option.inbound.nickname=eepsite -tunnel.3.option.outbound.nickname=eepsite -tunnel.3.option.i2cp.destination.sigType=7 -tunnel.3.option.i2cp.leaseSetEncType=4,0 -tunnel.3.option.inbound.length=3 -tunnel.3.option.inbound.lengthVariance=0 -tunnel.3.option.outbound.length=3 -tunnel.3.option.outbound.lengthVariance=0 -# uncomment for HTTPS to port 7668 -#tunnel.3.option.targetForPort.443=127.0.0.1:7668 -tunnel.3.startOnLoad=false - -# postman's SMTP server - see hq.postman.i2p -tunnel.4.description=smtp server -tunnel.4.i2cpHost=127.0.0.1 -tunnel.4.i2cpPort=7654 -tunnel.4.interface=127.0.0.1 -tunnel.4.listenPort=7659 -tunnel.4.name=smtp.postman.i2p -tunnel.4.option.inbound.nickname=shared clients -tunnel.4.option.outbound.nickname=shared clients -tunnel.4.option.i2cp.leaseSetEncType=4,0 -tunnel.4.option.i2cp.reduceIdleTime=900000 -tunnel.4.option.i2cp.reduceOnIdle=true -tunnel.4.option.i2cp.reduceQuantity=1 -tunnel.4.option.inbound.length=3 -tunnel.4.option.inbound.lengthVariance=0 -tunnel.4.option.outbound.length=3 -tunnel.4.option.outbound.lengthVariance=0 -tunnel.4.startOnLoad=true -tunnel.4.targetDestination=smtp.postman.i2p:25 -tunnel.4.type=client -tunnel.4.sharedClient=true - -# postman's POP3 server - see hq.postman.i2p -tunnel.2.name=pop3.postman.i2p -tunnel.2.description=pop3 server -tunnel.2.i2cpHost=127.0.0.1 -tunnel.2.i2cpPort=7654 -tunnel.2.interface=127.0.0.1 -tunnel.2.listenPort=7660 -tunnel.2.option.inbound.nickname=shared clients -tunnel.2.option.outbound.nickname=shared clients -tunnel.2.option.i2cp.leaseSetEncType=4,0 -tunnel.2.option.i2cp.reduceIdleTime=900000 -tunnel.2.option.i2cp.reduceOnIdle=true -tunnel.2.option.i2cp.reduceQuantity=1 -tunnel.2.option.i2p.streaming.connectDelay=1000 -tunnel.2.option.inbound.length=3 -tunnel.2.option.inbound.lengthVariance=0 -tunnel.2.option.outbound.length=3 -tunnel.2.option.outbound.lengthVariance=0 -tunnel.2.startOnLoad=true -tunnel.2.targetDestination=pop.postman.i2p:110 -tunnel.2.type=client -tunnel.2.sharedClient=true - -# HTTPS (CONNECT) outproxy -tunnel.5.name=I2P HTTPS Proxy -tunnel.5.description=HTTPS proxy for browsing eepsites and the web -tunnel.5.type=connectclient -tunnel.5.sharedClient=true -tunnel.5.interface=127.0.0.1 -tunnel.5.listenPort=4445 -tunnel.5.proxyList=outproxy-tor.meeh.i2p -tunnel.5.i2cpHost=127.0.0.1 -tunnel.5.i2cpPort=7654 -tunnel.5.option.inbound.nickname=shared clients -tunnel.5.option.outbound.nickname=shared clients -tunnel.5.option.i2cp.leaseSetEncType=4,0 -tunnel.5.option.i2cp.reduceIdleTime=900000 -tunnel.5.option.i2cp.reduceOnIdle=true -tunnel.5.option.i2cp.reduceQuantity=1 -tunnel.5.option.i2p.streaming.connectDelay=1000 -tunnel.5.option.inbound.length=3 -tunnel.5.option.inbound.lengthVariance=0 -tunnel.5.option.outbound.length=3 -tunnel.5.option.outbound.lengthVariance=0 -tunnel.5.startOnLoad=true - -# I2P Git Repositories SSH Access -tunnel.6.description=I2P Git Repositories SSH Access -tunnel.6.interface=127.0.0.1 -tunnel.6.listenPort=7670 -tunnel.6.name=gitssh.idk.i2p -tunnel.6.option.i2cp.closeIdleTime=1800000 -tunnel.6.option.i2cp.closeOnIdle=false -tunnel.6.option.i2cp.delayOpen=true -tunnel.6.option.i2cp.destination.sigType=7 -tunnel.6.option.i2cp.newDestOnResume=false -tunnel.6.option.i2cp.reduceIdleTime=1200000 -tunnel.6.option.i2cp.reduceOnIdle=true -tunnel.6.option.i2cp.reduceQuantity=1 -tunnel.6.option.inbound.backupQuantity=1 -tunnel.6.option.inbound.length=3 -tunnel.6.option.inbound.nickname=gitssh.idk.i2p -tunnel.6.option.inbound.quantity=3 -tunnel.6.option.outbound.backupQuantity=1 -tunnel.6.option.outbound.length=3 -tunnel.6.option.outbound.nickname=gitssh.idk.i2p -tunnel.6.option.outbound.quantity=3 -tunnel.6.sharedClient=false -tunnel.6.startOnLoad=false -tunnel.6.targetDestination=gitssh.idk.i2p -tunnel.6.type=client - diff -Nru i2p-0.9.49/docker/rootfs/etc/cont-init.d/00-app-user-map.sh i2p-0.9.50/docker/rootfs/etc/cont-init.d/00-app-user-map.sh --- i2p-0.9.49/docker/rootfs/etc/cont-init.d/00-app-user-map.sh 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/docker/rootfs/etc/cont-init.d/00-app-user-map.sh 2021-05-19 12:11:59.000000000 +0000 @@ -0,0 +1,27 @@ +#!/usr/bin/with-contenv sh + +# +# Add the app user to the password and group databases. This is needed just to +# make sure that mapping between the user/group ID and its name is possible. +# + +set -e # Exit immediately if a command exits with a non-zero status. +set -u # Treat unset variables as an error. + +cp /defaults/passwd /etc/passwd +cp /defaults/group /etc/group +cp /defaults/shadow /etc/shadow +chown root:shadow /etc/shadow +chmod 640 /etc/shadow + +echo "$APP_USER:x:$USER_ID:$GROUP_ID::${APP_HOME:-/dev/null}:/sbin/nologin" >> /etc/passwd +echo "$APP_USER:x:$GROUP_ID:" >> /etc/group + +# Make sure APP_HOME is editable by the user +if [[ -n "$APP_HOME" ]] ; then + chown -R "$APP_USER" "$APP_HOME" + chmod -R u+rw "$APP_HOME" +fi + +# vim:ft=sh:ts=4:sw=4:et:sts=4 + diff -Nru i2p-0.9.49/docker/rootfs/i2p/clients.config i2p-0.9.50/docker/rootfs/i2p/clients.config --- i2p-0.9.49/docker/rootfs/i2p/clients.config 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/docker/rootfs/i2p/clients.config 2021-05-19 12:11:59.000000000 +0000 @@ -0,0 +1,61 @@ +# NOTE: This I2P config file must use UTF-8 encoding +# +# If you have a 'split' directory installation, with configuration +# files in ~/.i2p (Linux), %LOCALAPPDATA%\I2P (Windows), +# or /Users/(user)/Library/Application Support/i2p (Mac), be sure to +# edit the file in the configuration directory, NOT the install directory. +# When running as a Linux daemon, the configuration directory is /var/lib/i2p +# and the install directory is /usr/share/i2p . +# When running as a Windows service, the configuration directory is \ProgramData\i2p +# and the install directory is \Program Files\i2p . +# +# On first run, this file will be split into individual config files +# in clients.config.d/ in the configuration directory. +# Look in that directory for the file to edit. +# + +# fire up the web console +## There are several choices, here are some examples: +## non-SSL, bind to local IPv4 only +#clientApp.0.args=7657 127.0.0.1 ./webapps/ +## non-SSL, bind to local IPv6 only +#clientApp.0.args=7657 ::1 ./webapps/ +## non-SSL, bind to all IPv4 addresses +#clientApp.0.args=7657 0.0.0.0 ./webapps/ +## non-SSL, bind to all IPv6 addresses +#clientApp.0.args=7657 :: ./webapps/ +## For SSL only, change clientApp.4.args below to https:// +## SSL only +#clientApp.0.args=-s 7657 ::1,127.0.0.1 ./webapps/ +## non-SSL and SSL +#clientApp.0.args=7657 ::1,127.0.0.1 -s 7667 ::1,127.0.0.1 ./webapps/ +## non-SSL only, both IPv6 and IPv4 local interfaces +clientApp.0.args=7657 0.0.0.0 ./webapps/ +clientApp.0.main=net.i2p.router.web.RouterConsoleRunner +clientApp.0.name=webConsole +clientApp.0.onBoot=true + +# start up the SAM bridge so other client apps can connect +clientApp.1.main=net.i2p.sam.SAMBridge +clientApp.1.name=SAMBridge +clientApp.1.args=sam.keys 0.0.0.0 7656 i2cp.tcp.host=localhost i2cp.tcp.port=7654 +clientApp.1.startOnLoad=false + +# poke the i2ptunnels defined in i2ptunnel.config +clientApp.2.main=net.i2p.i2ptunnel.TunnelControllerGroup +clientApp.2.name=Tunnels +clientApp.2.args=i2ptunnel.config + +# run our own eepsite with a seperate jetty instance +clientApp.3.main=org.mortbay.jetty.Server +clientApp.3.name=eepsite +clientApp.3.args=eepsite/jetty.xml +clientApp.3.delay=30 +clientApp.3.startOnLoad=false + +# load a browser pointing at the web console whenever we start up +clientApp.4.main=net.i2p.apps.systray.UrlLauncher +clientApp.4.name=consoleBrowser +clientApp.4.args=http://localhost:7657/ +clientApp.4.delay=5 +clientApp.4.startOnLoad=false diff -Nru i2p-0.9.49/docker/rootfs/i2p/i2psnark.config i2p-0.9.50/docker/rootfs/i2p/i2psnark.config --- i2p-0.9.49/docker/rootfs/i2p/i2psnark.config 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/docker/rootfs/i2p/i2psnark.config 2021-05-19 12:11:59.000000000 +0000 @@ -0,0 +1,12 @@ +# NOTE: This I2P config file must use UTF-8 encoding +# +# If you have a 'split' directory installation, with configuration +# files in ~/.i2p (Linux), %LOCALAPPDATA%\I2P (Windows), +# or /Users/(user)/Library/Application Support/i2p (Mac), be sure to +# edit the file in the configuration directory, NOT the install directory. +# When running as a Linux daemon, the configuration directory is /var/lib/i2p +# and the install directory is /usr/share/i2p . +# When running as a Windows service, the configuration directory is \ProgramData\i2p +# and the install directory is \Program Files\i2p . +# +i2psnark.dir=/i2psnark diff -Nru i2p-0.9.49/docker/rootfs/i2p/i2ptunnel.config i2p-0.9.50/docker/rootfs/i2p/i2ptunnel.config --- i2p-0.9.49/docker/rootfs/i2p/i2ptunnel.config 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/docker/rootfs/i2p/i2ptunnel.config 2021-05-19 12:11:59.000000000 +0000 @@ -0,0 +1,187 @@ +# NOTE: This I2P config file must use UTF-8 encoding +# +# If you have a 'split' directory installation, with configuration +# files in ~/.i2p (Linux), %LOCALAPPDATA%\I2P (Windows), +# or /Users/(user)/Library/Application Support/i2p (Mac), be sure to +# edit the file in the configuration directory, NOT the install directory. +# When running as a Linux daemon, the configuration directory is /var/lib/i2p +# and the install directory is /usr/share/i2p . +# When running as a Windows service, the configuration directory is \ProgramData\i2p +# and the install directory is \Program Files\i2p . +# +# On first run, this file will be split into individual config files +# in i2ptunnel.config.d/ in the configuration directory. +# Look in that directory for the file to edit. +# + +# eepproxy +tunnel.0.name=I2P HTTP Proxy +tunnel.0.description=HTTP proxy for browsing eepsites and the web +tunnel.0.type=httpclient +tunnel.0.sharedClient=true +tunnel.0.interface=0.0.0.0 +tunnel.0.listenPort=4444 +tunnel.0.proxyList=false.i2p +tunnel.0.i2cpHost=127.0.0.1 +tunnel.0.i2cpPort=7654 +tunnel.0.option.inbound.nickname=shared clients +tunnel.0.option.outbound.nickname=shared clients +tunnel.0.option.i2cp.leaseSetEncType=4,0 +tunnel.0.option.i2cp.reduceIdleTime=900000 +tunnel.0.option.i2cp.reduceOnIdle=true +tunnel.0.option.i2cp.reduceQuantity=1 +tunnel.0.option.i2p.streaming.connectDelay=1000 +tunnel.0.option.i2ptunnel.httpclient.SSLOutproxies=false.i2p +tunnel.0.option.inbound.length=3 +tunnel.0.option.inbound.lengthVariance=0 +tunnel.0.option.outbound.length=3 +tunnel.0.option.outbound.lengthVariance=0 +tunnel.0.option.outbound.priority=10 +tunnel.0.startOnLoad=true + +# irc +tunnel.1.name=Irc2P +tunnel.1.description=IRC tunnel to access the Irc2P network +tunnel.1.type=ircclient +tunnel.1.sharedClient=false +tunnel.1.interface=0.0.0.0 +tunnel.1.listenPort=6668 +tunnel.1.targetDestination=irc.postman.i2p:6667,irc.echelon.i2p:6667 +tunnel.1.i2cpHost=127.0.0.1 +tunnel.1.i2cpPort=7654 +tunnel.1.option.inbound.nickname=Irc2P +tunnel.1.option.outbound.nickname=Irc2P +tunnel.1.option.i2cp.closeIdleTime=1200000 +tunnel.1.option.i2cp.closeOnIdle=true +tunnel.1.option.i2cp.delayOpen=true +tunnel.1.option.i2cp.destination.sigType=7 +tunnel.1.option.i2cp.leaseSetEncType=4,0 +tunnel.1.option.i2cp.newDestOnResume=false +tunnel.1.option.i2cp.reduceIdleTime=600000 +tunnel.1.option.i2cp.reduceOnIdle=true +tunnel.1.option.i2cp.reduceQuantity=1 +tunnel.1.option.i2p.streaming.connectDelay=1000 +tunnel.1.option.i2p.streaming.maxWindowSize=16 +tunnel.1.option.inbound.length=3 +tunnel.1.option.inbound.lengthVariance=0 +tunnel.1.option.outbound.length=3 +tunnel.1.option.outbound.lengthVariance=0 +tunnel.1.option.outbound.priority=15 +tunnel.1.startOnLoad=true + +# local eepserver +tunnel.3.name=I2P webserver +tunnel.3.description=My eepsite +tunnel.3.type=httpserver +tunnel.3.targetHost=127.0.0.1 +tunnel.3.targetPort=7658 +tunnel.3.spoofedHost=mysite.i2p +tunnel.3.privKeyFile=eepsite/eepPriv.dat +tunnel.3.i2cpHost=127.0.0.1 +tunnel.3.i2cpPort=7654 +tunnel.3.option.inbound.nickname=eepsite +tunnel.3.option.outbound.nickname=eepsite +tunnel.3.option.i2cp.destination.sigType=7 +tunnel.3.option.i2cp.leaseSetEncType=4,0 +tunnel.3.option.inbound.length=3 +tunnel.3.option.inbound.lengthVariance=0 +tunnel.3.option.outbound.length=3 +tunnel.3.option.outbound.lengthVariance=0 +# uncomment for HTTPS to port 7668 +#tunnel.3.option.targetForPort.443=127.0.0.1:7668 +tunnel.3.startOnLoad=false + +# postman's SMTP server - see hq.postman.i2p +tunnel.4.description=smtp server +tunnel.4.i2cpHost=127.0.0.1 +tunnel.4.i2cpPort=7654 +tunnel.4.interface=127.0.0.1 +tunnel.4.listenPort=7659 +tunnel.4.name=smtp.postman.i2p +tunnel.4.option.inbound.nickname=shared clients +tunnel.4.option.outbound.nickname=shared clients +tunnel.4.option.i2cp.leaseSetEncType=4,0 +tunnel.4.option.i2cp.reduceIdleTime=900000 +tunnel.4.option.i2cp.reduceOnIdle=true +tunnel.4.option.i2cp.reduceQuantity=1 +tunnel.4.option.inbound.length=3 +tunnel.4.option.inbound.lengthVariance=0 +tunnel.4.option.outbound.length=3 +tunnel.4.option.outbound.lengthVariance=0 +tunnel.4.startOnLoad=true +tunnel.4.targetDestination=smtp.postman.i2p:25 +tunnel.4.type=client +tunnel.4.sharedClient=true + +# postman's POP3 server - see hq.postman.i2p +tunnel.2.name=pop3.postman.i2p +tunnel.2.description=pop3 server +tunnel.2.i2cpHost=127.0.0.1 +tunnel.2.i2cpPort=7654 +tunnel.2.interface=127.0.0.1 +tunnel.2.listenPort=7660 +tunnel.2.option.inbound.nickname=shared clients +tunnel.2.option.outbound.nickname=shared clients +tunnel.2.option.i2cp.leaseSetEncType=4,0 +tunnel.2.option.i2cp.reduceIdleTime=900000 +tunnel.2.option.i2cp.reduceOnIdle=true +tunnel.2.option.i2cp.reduceQuantity=1 +tunnel.2.option.i2p.streaming.connectDelay=1000 +tunnel.2.option.inbound.length=3 +tunnel.2.option.inbound.lengthVariance=0 +tunnel.2.option.outbound.length=3 +tunnel.2.option.outbound.lengthVariance=0 +tunnel.2.startOnLoad=true +tunnel.2.targetDestination=pop.postman.i2p:110 +tunnel.2.type=client +tunnel.2.sharedClient=true + +# HTTPS (CONNECT) outproxy +tunnel.5.name=I2P HTTPS Proxy +tunnel.5.description=HTTPS proxy for browsing eepsites and the web +tunnel.5.type=connectclient +tunnel.5.sharedClient=true +tunnel.5.interface=127.0.0.1 +tunnel.5.listenPort=4445 +tunnel.5.proxyList=outproxy-tor.meeh.i2p +tunnel.5.i2cpHost=127.0.0.1 +tunnel.5.i2cpPort=7654 +tunnel.5.option.inbound.nickname=shared clients +tunnel.5.option.outbound.nickname=shared clients +tunnel.5.option.i2cp.leaseSetEncType=4,0 +tunnel.5.option.i2cp.reduceIdleTime=900000 +tunnel.5.option.i2cp.reduceOnIdle=true +tunnel.5.option.i2cp.reduceQuantity=1 +tunnel.5.option.i2p.streaming.connectDelay=1000 +tunnel.5.option.inbound.length=3 +tunnel.5.option.inbound.lengthVariance=0 +tunnel.5.option.outbound.length=3 +tunnel.5.option.outbound.lengthVariance=0 +tunnel.5.startOnLoad=true + +# I2P Git Repositories SSH Access +tunnel.6.description=I2P Git Repositories SSH Access +tunnel.6.interface=127.0.0.1 +tunnel.6.listenPort=7670 +tunnel.6.name=gitssh.idk.i2p +tunnel.6.option.i2cp.closeIdleTime=1800000 +tunnel.6.option.i2cp.closeOnIdle=false +tunnel.6.option.i2cp.delayOpen=true +tunnel.6.option.i2cp.destination.sigType=7 +tunnel.6.option.i2cp.newDestOnResume=false +tunnel.6.option.i2cp.reduceIdleTime=1200000 +tunnel.6.option.i2cp.reduceOnIdle=true +tunnel.6.option.i2cp.reduceQuantity=1 +tunnel.6.option.inbound.backupQuantity=1 +tunnel.6.option.inbound.length=3 +tunnel.6.option.inbound.nickname=gitssh.idk.i2p +tunnel.6.option.inbound.quantity=3 +tunnel.6.option.outbound.backupQuantity=1 +tunnel.6.option.outbound.length=3 +tunnel.6.option.outbound.nickname=gitssh.idk.i2p +tunnel.6.option.outbound.quantity=3 +tunnel.6.sharedClient=false +tunnel.6.startOnLoad=false +tunnel.6.targetDestination=gitssh.idk.i2p +tunnel.6.type=client + diff -Nru i2p-0.9.49/docker/rootfs/i2p/router.config i2p-0.9.50/docker/rootfs/i2p/router.config --- i2p-0.9.49/docker/rootfs/i2p/router.config 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/docker/rootfs/i2p/router.config 2021-05-19 12:11:59.000000000 +0000 @@ -0,0 +1,4 @@ +router.updateDisabled=true +i2np.ntcp.port=12345 +i2np.udp.port=12345 +i2np.udp.internalPort=12345 diff -Nru i2p-0.9.49/docker/rootfs/startapp.sh i2p-0.9.50/docker/rootfs/startapp.sh --- i2p-0.9.49/docker/rootfs/startapp.sh 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/docker/rootfs/startapp.sh 2021-05-19 12:11:59.000000000 +0000 @@ -0,0 +1,28 @@ +#!/bin/sh +set -e + +if [ -z $JVM_XMX ]; then + echo "*** Defaulting to 512MB JVM heap limit" + echo "*** You can override that value with the JVM_XMX variable" + echo "*** (for example JVM_XMX=256m)" + JVM_XMX=512m +fi + +# Explicitly define HOME otherwise it might not have been set +export HOME=/i2p + +export I2P=${HOME}/i2p + +echo "Starting I2P" + +cd $HOME +export CLASSPATH=. + +for jar in `ls lib/*.jar`; do + CLASSPATH=${CLASSPATH}:${jar} +done + +JAVAOPTS="-Djava.net.preferIPv4Stack=false -Djava.library.path=${I2P}:${I2P}/lib -Di2p.dir.base=${I2P} -Di2p.dir.config=${HOME}/.i2p -DloggerFilenameOverride=logs/log-router-@.txt -Xmx$JVM_XMX" + +java -cp "${CLASSPATH}" ${JAVA_OPTS} net.i2p.router.RouterLaunch + diff -Nru i2p-0.9.49/.gitlab-ci.yml i2p-0.9.50/.gitlab-ci.yml --- i2p-0.9.49/.gitlab-ci.yml 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/.gitlab-ci.yml 2021-05-19 12:11:54.000000000 +0000 @@ -4,14 +4,7 @@ - test - build -cache: - key: ${CI_COMMIT_REF_SLUG} - paths: - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ - - .gradle - -test: +test:gradle: stage: test coverage: '/Total.*?([0-9]{1,3})%/' before_script: @@ -20,6 +13,47 @@ - ./gradlew codeCoverageReport # The actual output that will be parsed by the code coverage - grep -oP "Total.*?%" build/reports/jacoco/html/index.html + cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ + - .gradle + only: + - master + - merge_requests + - tags + +test:ant: + stage: test + image: debian:buster-slim + variables: + SCALA: https://downloads.lightbend.com/scala/2.12.13/scala-2.12.13.deb + LIBPREFIX: /usr/share/scala/lib + LIB_SCALATEST: https://repo1.maven.org/maven2/org/scalatest/scalatest_2.12/3.0.4/scalatest_2.12-3.0.4.jar + LIB_SCALACTIC: https://repo1.maven.org/maven2/org/scalactic/scalactic_2.12/3.0.4/scalactic_2.12-3.0.4.jar + before_script: + # Fix bug installing openjdk-11-jdk-headless's manuals + - mkdir -p /usr/share/man/man1/ + - apt-get update -q + - apt-get install -y wget gettext + ant default-jdk-headless + libmockito-java libhamcrest-java junit4 + # Install specific version of scala + - wget -qO scala.deb "${SCALA}" + - dpkg -i scala.deb + # link to the scala libs with the name `ant test` expects + - ln -s "${LIBPREFIX}/scala-xml_2.12-1.0.6.jar" "${LIBPREFIX}/scala-xml.jar" + # Download required scala libs + - wget -qO "${LIBPREFIX}/scalactic.jar" "${LIB_SCALACTIC}" + - wget -qO "${LIBPREFIX}/scalatest.jar" "${LIB_SCALATEST}" + # Point ant to the right directories + - echo scalatest.libs=/usr/share/scala/lib > override.properties + - echo junit.home=/usr/share/java >> override.properties + - echo hamcrest.home=/usr/share/java >> override.properties + - echo mockito.home=/usr/share/java >> override.properties + script: + - ant test only: - master - merge_requests diff -Nru i2p-0.9.49/history.txt i2p-0.9.50/history.txt --- i2p-0.9.49/history.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/history.txt 2021-05-19 12:11:59.000000000 +0000 @@ -1,3 +1,216 @@ +* 2021-05-18 0.9.50 released + +2021-05-14 zzz + * SAM: Remove ancient client demo code + * Update Translations + +2021-05-10 zzz + * Sybil: Fix retention of analysis files when configured + to never delete + +2021-05-07 zzz + * Console: /configpeer improvements + +2021-05-04 zzz + * GeoIP 2021-05 + +2021-05-02 zzz + * Console: Update bug report URLs + +2021-04-25 zzz + * Console: Add author for initial news + +2021-04-24 zzz + * Jetty: Patch for CVE-2021-28165 Jetty #6072 - + Jetty server high CPU when client send data length > 17408 + * SusiMail: Fix infinite loop in decoder on malformed input + +2021-04-24 zlatinb + * SusiMail: + - Fix stream closed exception reading new mail + (trac ticket #2202, gitlab ticket #17) + - Fix corruption of large messages (ticket #2765) + +2021-04-23 idk + * Router: Fix update on Windows from very old versions (gitlab ticket #16) + +2021-04-20 zzz + * NTCP: + - Set outbound addresses at startup when force-firewalled + - More NTCP1 removal cleanup + * SSU: + - Fix setting addresses from interfaces at startup + - Don't start peer test when shutting down + +2021-04-18 zzz + * Proxy: Decode IDN hostnames in error pages + +2021-04-17 zzz + * Transport: IPv6 state transition fixes + +2021-04-12 zzz + * SSU: Fix peer test getting stuck + +2021-04-11 zzz + * Proxy: Precompress error page CSS + * SSU: IPv6-only fixes + +2021-04-09 zzz + * Router: Fixes for setting up config dir in embedded applications + +2021-04-08 zzz + * Debian: Fix link to compiler jar (Debian ticket #986474) + * SSU: IPv6 introducer fixes + +2021-04-05 zzz + * Build: Remove launcher code + * Console: Convert update versions to times for debug page + * Sybil: Register blocklist version with update manager + +2021-04-04 zzz + * Tunnels: Fix timestamp checking for ECIES records + +2021-04-03 zzz + * SAM: Remove subsessions when primary session closes + * SSU: Remove restrictions on IPv6 introducers (prop. 158) + +2021-04-02 zzz + * SSU: Fix dup IPv6 introducers + +2021-04-01 zzz + * NetDB: Negative cache LS received with zero leases + +2021-03-31 zzz + * SSU: Update address when IPv6 introducers change (prop. 158) + +2021-03-30 zzz + * Transport: Fix NTCP removing IPv4 address when SSU removes IPv6 address + +2021-03-29 zzz + * SSU: Don't request introducers when hidden + * Transport: Don't open UPnP ports when hidden or force-firewalled + +2021-03-27 zzz + * Router: Fix decryption of blinded leasesets + +2021-03-25 zzz + * i2ptunnel: Force non-SSL socket to local target for SSL ports + * SSU: Implement IPv6 introductions (proposal 158) + * Transports: Don't open UPnP ports for disabled IPv4/v6 + +2021-03-23 zzz + * NetDB: Sort published addresses for consistency + * SSU: Fix IPv6 transition from firewalled to non-firewalled + +2021-03-22 zzz + * Sybil: Persist blocklist + * Tunnels: Don't count established routers as new in OBEP throttle (ticket #2245) + +2021-03-20 zzz + * Tunnels: Fix RED dropping for part. tunnels (Gitlab MR #24) + +2021-03-18 zzz + * Util: + - DoH: Update server list + - EepGet timeout fixes + - EepHead: Fix failure if headers specify chunked + - SSLEepGet: Specify hostname for SSL socket when using DoH + - SSLEepGet: Use DoH by default (reseeding) (ticket #2201) + +2021-03-16 zzz + * Console: Fix netdb SSU caps search + * Transports: Enable 4/6 caps + +2021-03-15 zzz + * SSU: Fix IPv6 addresses not being removed on some state transitions + * Util: Don't call out to InetAddress for IP parsing + +2021-03-13 zzz + * Console: Limit share to 90% max + +2021-03-11 zzz + * NetDB: Queue RI file deletion and delete in a single thread + * SSU: Limit port changes + +2021-03-09 zzz + * Throttle: Don't do exponential calculation unless necessary + * Util: Consolidate dup BandwidthEstimator interfaces + +2021-03-08 zzz + * NTCP: Remove NTCP 1 suppport + * SSU: Increase CoDel drop threshold at UDPSender queue + +2021-03-06 zzz + * SSU: Require confirmation for IPv6 firewalled state transitions + +2021-03-04 zzz + * I2CP: More prep for different release and API versions + * i2ptunnel: Add missing button icons for proxy forms + * Router: Increase rekey probability + * Transports: Prefer IPv6 temporary addresses if the kernel does + +2021-03-03 zzz + * NTCP: Fix reachability status when force-firewalled + * SSU: + - Only advertise 'C' cap if we can really introduce + - Only ask for relay tag if we don't have enough + - Fix transition out of IPv4 firewalled after UPnP success + - Fix validation of current introducers + - Don't publish IPv4 address at startup when force-firewalled + - Publish empty '4' address if firewalled and no introducers + - Publish empty '6' address if firewalled + - 4/6 caps fixes + - Increase hole punch rate limit + * UPnP: Fix retention of deprecated addresses + +2021-03-02 zzz + * UPnP: + - Limit event subscription time + - Subscribe to IPv6 service also + +2021-03-01 zzz + * UPnP: + - Fix mappings not being renewed before expiration + - IPv6 port forwarding fixes + - Continue to forward deprecated addresses for a while + +2021-02-28 zzz + * SSU: Fix set of states requiring address confirmation + * UPnP: + - Add support for IPv6 firewall addresses + - Add support for forwarding IPv6 addresses + +2021-02-27 zzz + * UPnP: Move IPv6 checks from Parser to ControlPoint + +2021-02-25 zzz + * NetDB: Fix NPE validating expired blinded LS2 + * NTCP: Don't publish IP at startup when configured as firewalled + * SSU: Enable RelayRequest over IPv6 + * Transports: Adjust conn limits for some platforms + +2021-02-24 zzz + * Jetty: Fix detection of SSL connector + * SSU: Avoid outbound connections to buggy routers + +2021-02-23 zzz + * Build: Prep for different release and API versions + * Transports: Add 4/6 transport caps + +2021-02-21 zzz + * Console: List all Jetty servers in sidebar + * Profiles: Disable peer test (ticket #2456) and tunnel test response time stat + +2021-02-20 zzz + * Router: Don't rekey previous ECIES every restart on ARM + +2021-02-19 zzz + * i2psnark: Fix theme selection + +2021-02-18 zzz + * Build: Remove empty jars and wars from installers + * NTP: Year 2036 fixes (gitlab ticket #12) + * 2021-02-17 0.9.49 released 2021-02-15 zzz diff -Nru i2p-0.9.49/installer/resources/blocklist.txt i2p-0.9.50/installer/resources/blocklist.txt --- i2p-0.9.49/installer/resources/blocklist.txt 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/installer/resources/blocklist.txt 2021-05-19 12:12:00.000000000 +0000 @@ -97,6 +97,11 @@ Sybil:47.90.1.26 Sybil:47.90.120.30 Sybil:47.208.97.112 +Sybil:51.211.161.115 +Sybil:95.47.57.0/24 +Sybil:95.85.100.0/22 +Sybil:95.85.104.0/22 +Sybil:103.149.170.0/23 Sybil:104.156.254.54 Sybil:104.207.153.96 Sybil:108.61.251.143 @@ -108,6 +113,11 @@ Sybil:150.95.153.220 Sybil:160.36.130.0/24 Sybil:163.44.149.31 +Sybil:178.21.164.0/24 +Sybil:185.69.185.0/24 +Sybil:185.69.186.0/24 +Sybil:213.142.149.0/24 +Sybil:213.238.166.0/24 Sybil:2001;df6;b800;1128;a163;44;149;310 Sybil:2001;19f0;4400;4376;5400;ff;fe47;bcbd Sybil:2001;19f0;5801;1d4;5400;ff;fe38;a26e diff -Nru i2p-0.9.49/installer/resources/eepsite/docroot/help/index_de.html i2p-0.9.50/installer/resources/eepsite/docroot/help/index_de.html --- i2p-0.9.49/installer/resources/eepsite/docroot/help/index_de.html 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/installer/resources/eepsite/docroot/help/index_de.html 2021-05-19 12:12:00.000000000 +0000 @@ -45,8 +45,8 @@
  • Linux
    - Standard install: ~/.i2p/eepsite/docroot/
    - Package install, running as a service: /var/lib/i2p/i2p-config/eepsite/docroot/ + Standard Installation: ~/.i2p/eepsite/docroot/
    + Paketinstallation, gestartet als Service: /var/lib/i2p/i2p-config/eepsite/docroot/
  • Windows
    %LOCALAPPDATA%\I2P\eepsite\docroot\ @@ -55,20 +55,20 @@ Mac
    /Users/(user)/Library/Application Support/i2p
-

In I2P, hidden services are addressed using a Base32 address ending in ".b32.i2p", or a Destination represented as a long Base64 string. - The Base32 address may be used as a hostname, until you register a name following the instructions below. - The Destination is somewhat like an IP address, and is shown on the Hidden Service Configuration page.

+

Basis32 AdresseIn I2P werden die Versteckte Services mit einem Basis2 String mit der Endung ".b32.i2p" oder als Destination mit einem langen Basis64 String addressiert. +Die Basis32 Adresse kann auch als Hostname genutzt werden bis Sie einen Namen wie unten beschrieben registriert haben. +Die Destination ist etwa so etwas wie eine IP Adresse und wird auf der Konfigurationsseite Versteckte Services angezeigt.

Die unteren Anleitungen erklären im Detail, wie sie eine Adresse wie "mysite.i2p" zu Ihrer Webseite registrieren und diese für andere erreichbar schalten. Sie erreichen Ihre Webseite lokal unter http://127.0.0.1:7658/.

Wie Sie einen versteckten Service einrichten und veröffentlichen

-

Your webserver is running by default, but is not accessible by others until you start the hidden service tunnel. - After you start your I2P Webserver tunnel, it will be difficult for other people to find. - It can only be accessed with the long Destination or with the shorter Base32 address (.b32.i2p), which is a hash of the Destination. - You could just tell people the Destnation or the Base32 address, but thankfully I2P has an address book and several easy ways to tell people about your website. - Here are detailed instructions.

+

Ihr Webserver wird automatisch gestartet, ist aber nicht erreichbar bevor Sie nicht den Versteckte Services Tunnel starten. +Nach dem Start des I2P Webserver Tunnels wird es für andere Personen schwer diesen zu finden. +Dieser kann nur mit der langen Destination oder mit der kurzen Basis32 Adresse (.b32.i2p), welche ein Hashwert der Destination ist, erreicht werden. +Sie können den Personen einfach die Destination oder die Basis32 Adresse mitteilen, aber dankenswerterweise hat I2P ein Adressbuch und mehrere Wege um den Personen von Ihrer Webseite zu erzählen. +Hier sind detaillierte Informationen.

  • Wählen Sie einen Namen für Ihre Webseite (einname.i2p) ohne Großbuchstaben. @@ -138,10 +138,10 @@
  • http://no.i2p/export/alive-hosts.txt (no.i2p)
-

If you are in a hurry and can't wait a few hours, you can tell people to use a "jump" address helper redirection service. - This will work within a few minutes of your registering your hostname on the same site. - Test it yourself first by entering http://stats.i2p/cgi-bin/jump.cgi?a=something.i2p into your browser. - Once it is working, you can tell others to use it.

+

Falls Sie in EIle sind und nicht ein paar Stunden warten können, teilen Sie den Personen mit, bitte den "Jump" Adress-Helfer Redirektions Service zu nutzen. +Dieses wird innerhalb weniger Minuten nach der Registration Ihres Hostnamens auf der Selben Seite funktionieren. +Bitte testen Sie es zuerst unter http://stats.i2p/cgi-bin/jump.cgi?a=irgendwas.i2p selber in Ihrem Webbrowser. +Sobald dieses funktioniert, können Sie dieses anderen mitteilen.

Einige Leute beobachten Webseitenlisten wie z.B. Identiguy's Eepsite Status Liste oder no.i2p's Active Services Listet um neue Webseiten zu finden, somit kann Ihre Webseite so mehr Besucher bekommen. Es gibt mehrere Methoden, anderen von Ihrer Webseite mitzuteilen. Hier sind ein paar Ideen:

@@ -168,10 +168,10 @@ Stellen Sie sicher, das Ihr Webserver gesichert ist, bevor Sie ihn online bringen. Es gibt viele Anleitungen im Internet, z.B. können Sie nach "nginx sicherheit abhärten" suchen und eine Liste von Anleitungen mit guten Hinweisen finden.

-

There is one important issue with the Apache web server. - The mod_status and mod_info Apache modules are enabled by default on some operating systems. - These modules expose internal data which can lead to serious compromise of anonymity when used on an anonymous network. - Removing the lines in the configuration file where these modules are loaded is the easiest way to prevent these issues.

+

Es gibt ein wichtiges Problem mit dem Apache Webserver +Die mod_status und mod_info Apache Module sind auf einigen Betriebssystemen standardmässig aktiviert +Diese Module geben interne Daten preis, welches zu einer schwerwiegenden Kompromisierung Ihrere Anonnymität im anonymen Netzwerk führen kann. +Das Entfernen der entsprechenden Zeilen in der Konfigurationsdatei zum Laden dieser Module ist der einfachste Weg um dieses Problem zu vermeiden.

Weitergehende Assistenz

diff -Nru i2p-0.9.49/installer/resources/locale-man/man_pt_BR.po i2p-0.9.50/installer/resources/locale-man/man_pt_BR.po --- i2p-0.9.49/installer/resources/locale-man/man_pt_BR.po 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/installer/resources/locale-man/man_pt_BR.po 2021-05-19 12:12:00.000000000 +0000 @@ -7,14 +7,14 @@ # Translators: # blueboy, 2017 # Eduardo Addad de Oliveira , 2019 -# Eduardo Rodrigues, 2020 +# Eduardo Rodrigues, 2021 # msgid "" msgstr "" "Project-Id-Version: I2P man pages\n" "POT-Creation-Date: 2017-01-26 15:24+0000\n" "PO-Revision-Date: 2017-01-26 15:31+0000\n" -"Last-Translator: Eduardo Rodrigues, 2020\n" +"Last-Translator: Eduardo Rodrigues, 2021\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/otf/teams/12694/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -116,7 +116,7 @@ #. type: Plain text #: man/eepget.1:37 msgid "B<-h> name=value" -msgstr "" +msgstr "B<-h> nome=valor" #. type: TP #: man/eepget.1:37 @@ -166,7 +166,7 @@ #. type: Plain text #: man/eepget.1:61 msgid "B<-o> file" -msgstr "" +msgstr "B<-o> arquivo" #. type: TP #: man/eepget.1:61 @@ -193,7 +193,7 @@ #. type: Plain text #: man/eepget.1:73 msgid "B<-t> seconds" -msgstr "" +msgstr "B<-t> segundos" #. type: TP #: man/eepget.1:73 @@ -212,7 +212,7 @@ #: man/eepget.1:79 #, no-wrap msgid "Sets the username for proxy authorization, if required." -msgstr "" +msgstr "Defina o nome de usuário para a autorização do proxy, se necessário." #. type: Plain text #: man/eepget.1:85 @@ -353,7 +353,7 @@ #. type: Plain text #: man/i2prouter.1:37 msgid "Stop I2P gracefully (may take up to 11 minutes)" -msgstr "" +msgstr "Parar a I2P graciosamente (pode demorar até 11 minutos)" #. type: IP #: man/i2prouter.1:39 diff -Nru i2p-0.9.49/installer/resources/man/eepget.pt_BR.1 i2p-0.9.50/installer/resources/man/eepget.pt_BR.1 --- i2p-0.9.49/installer/resources/man/eepget.pt_BR.1 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/installer/resources/man/eepget.pt_BR.1 2021-05-19 12:12:00.000000000 +0000 @@ -34,7 +34,7 @@ Sets the etag value in the request headers. .TP -\fB\-h\fP name=value +\fB\-h\fP nome=valor .TP Adds an arbitrary request header with the given name and value. .TP @@ -54,7 +54,7 @@ Specify the number of times to retry downloading if the download isn't successful. If this option is not specified, eepget will not retry. .TP -\fB\-o\fP file +\fB\-o\fP arquivo .TP Sets the output file to write to. If this option is not given, the output filename will be determined by the URL. .TP @@ -64,14 +64,14 @@ Specify an I2P proxy server (eeproxy) to use. If the port is not specified, eepget will use 4444. If this option is not specified, eepget will use 127.0.0.1:4444. Specify \fB\-c\fP or \fB\-p\fP :0 to disable the eeproxy. .TP -\fB\-t\fP seconds +\fB\-t\fP segundos .TP Especifique o intervalo de tempo de espera. O valor padrão, por omissão, é de 60 segundos. .TP \fB\-u\fP nome de usuário .TP -Sets the username for proxy authorization, if required. +Defina o nome de usuário para a autorização do proxy, se necessário. .TP \fB\-x\fP senha diff -Nru i2p-0.9.49/installer/resources/man/i2prouter.pt_BR.1 i2p-0.9.50/installer/resources/man/i2prouter.pt_BR.1 --- i2p-0.9.49/installer/resources/man/i2prouter.pt_BR.1 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/installer/resources/man/i2prouter.pt_BR.1 2021-05-19 12:12:00.000000000 +0000 @@ -32,7 +32,7 @@ Reiniciar o serviço I2P apenas se estiver em execução. .IP \fBgraceful\fP -Stop I2P gracefully (may take up to 11 minutes) +Parar a I2P graciosamente (pode demorar até 11 minutos) .IP \fBinstall\fP Install initscript to start I2P automatically when the system boots. diff -Nru i2p-0.9.49/LICENSE.txt i2p-0.9.50/LICENSE.txt --- i2p-0.9.49/LICENSE.txt 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/LICENSE.txt 2021-05-19 12:11:54.000000000 +0000 @@ -339,7 +339,7 @@ Systray (systray.jar): Public domain. - Tomcat 9.0.40 (jasper-runtime.jar): + Tomcat 9.0.45 (jasper-runtime.jar): (not included in most distribution packages) Copyright 1999-2020 The Apache Software Foundation See licenses/LICENSE-Apache2.0.txt @@ -355,24 +355,7 @@ Admin Manager: Public domain - BOB Demos: - Copyright (C) sponge - DWTFYWTPL - - Gradle wrapper: + Gradle wrapper 5.2.1: + (not included in most distribution packages) Copyright (c) 2017 the original author or authors. See licenses/LICENSE-Apache2.0.txt - - SAM C Library: - Copyright (c) 2004, Matthew P. Cashdollar - See apps/sam/c/doc/license.txt - - SAM C# Library: - Public domain. - See apps/sam/csharp/README - - SAM Perl Library: - See licenses/LICENSE-GPLv2.txt - - SAM Python Library: - Public domain. diff -Nru i2p-0.9.49/README.md i2p-0.9.50/README.md --- i2p-0.9.49/README.md 2021-02-17 19:22:19.000000000 +0000 +++ i2p-0.9.50/README.md 2021-05-19 12:11:54.000000000 +0000 @@ -64,6 +64,8 @@ systemProp.socksProxyHost=localhost systemProp.socksProxyPort=9150 +### Docker +For more information how to run I2P in Docker, see [Docker.md](Docker.md) ## Contact info Need help? See the IRC channel #i2p on irc.freenode.net diff -Nru i2p-0.9.49/router/java/build.xml i2p-0.9.50/router/java/build.xml --- i2p-0.9.49/router/java/build.xml 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/build.xml 2021-05-19 12:12:00.000000000 +0000 @@ -79,7 +79,7 @@ - + @@ -189,7 +189,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -300,7 +300,7 @@ - + @@ -320,7 +320,7 @@ - + diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java i2p-0.9.50/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java --- i2p-0.9.49/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java 2021-05-19 12:12:00.000000000 +0000 @@ -550,12 +550,13 @@ buf.append(_key.toBase32()); else buf.append(_key); - if (_replyKey != null) + if (_replyTunnel != null) buf.append("\n\tReply GW: "); else buf.append("\n\tFrom: "); - buf.append(_fromHash); - buf.append("\n\tReply Tunnel: ").append(_replyTunnel); + buf.append(_fromHash.toBase64()); + if (_replyTunnel != null) + buf.append("\n\tReply Tunnel: ").append(_replyTunnel); if (_replyKey != null) buf.append("\n\tReply Key: ").append(_replyKey); if (_replyTag != null) diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/i2np/InboundTunnelBuildMessage.java i2p-0.9.50/router/java/src/net/i2p/data/i2np/InboundTunnelBuildMessage.java --- i2p-0.9.49/router/java/src/net/i2p/data/i2np/InboundTunnelBuildMessage.java 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/i2np/InboundTunnelBuildMessage.java 2021-05-19 12:12:00.000000000 +0000 @@ -0,0 +1,128 @@ +package net.i2p.data.i2np; + +import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; + +/** + * Sent from the tunnel creator to the IBGW via an outbound tunnel. + * Contains one plaintext variable-sized request record for the IBGW + * and a variable number of encrypted records for the following hops. + * This message must be garlic-encrypted to hide the contents from the OBEP. + * + * Preliminary, see proposal 157. + * + * @since 0.9.50 + */ +public class InboundTunnelBuildMessage extends TunnelBuildMessage { + public static final int MESSAGE_TYPE = 27; + public static final int SHORT_RECORD_SIZE = ShortTunnelBuildMessage.SHORT_RECORD_SIZE; + public static final int MAX_PLAINTEXT_RECORD_SIZE = OutboundTunnelBuildReplyMessage.MAX_PLAINTEXT_RECORD_SIZE; + + private int _plaintextSlot; + private byte[] _plaintextRecord; + + /** zero record count, will be set with readMessage() */ + public InboundTunnelBuildMessage(I2PAppContext context) { + super(context, 0); + } + + public InboundTunnelBuildMessage(I2PAppContext context, int records) { + super(context, records); + } + + /** + * Set the slot and data for the plaintext record. + * @throws IllegalArgumentException on bad slot or data length. + */ + public void setPlaintextRecord(int slot, byte[] data) { + if (slot < 0 || slot >= RECORD_COUNT || data.length == 0 || data.length > MAX_PLAINTEXT_RECORD_SIZE) + throw new IllegalArgumentException(); + _plaintextSlot = slot; + _plaintextRecord = data; + } + + /** + * Get the slot for the plaintext record. + * getRecord() for this slot will return null. + */ + public int getPlaintextSlot() { + return _plaintextSlot; + } + + /** + * Get the data for the plaintext record. + */ + public byte[] getPlaintextRecord() { + return _plaintextRecord; + } + + @Override + protected int calculateWrittenLength() { return 4 + _plaintextRecord.length + ((RECORD_COUNT - 1) * SHORT_RECORD_SIZE); } + + @Override + public int getType() { return MESSAGE_TYPE; } + + @Override + public void readMessage(byte[] data, int offset, int dataSize, int type) throws I2NPMessageException { + if (type != MESSAGE_TYPE) + throw new I2NPMessageException("Message type is incorrect for this message"); + int r = data[offset++] & 0xff; + if (r <= 0 || r > MAX_RECORD_COUNT) + throw new I2NPMessageException("Bad record count " + r); + RECORD_COUNT = r; + int _plaintextSlot = data[offset++] & 0xff; + if (_plaintextSlot < 0 || _plaintextSlot >= r) + throw new I2NPMessageException("Bad slot " + _plaintextSlot); + int size = (int) DataHelper.fromLong(data, offset, 2); + if (size <= 0 || size > MAX_PLAINTEXT_RECORD_SIZE) + throw new I2NPMessageException("Bad size " + size); + offset += 2; + _plaintextRecord = new byte[size]; + System.arraycopy(data, offset, _plaintextRecord, 0, size); + offset += size; + + if (dataSize != calculateWrittenLength()) + throw new I2NPMessageException("Wrong length (expects " + calculateWrittenLength() + ", recv " + dataSize + ")"); + _records = new EncryptedBuildRecord[RECORD_COUNT]; + for (int i = 0; i < RECORD_COUNT; i++) { + if (i == _plaintextSlot) + continue; + byte rec[] = new byte[SHORT_RECORD_SIZE]; + System.arraycopy(data, offset, rec, 0, SHORT_RECORD_SIZE); + setRecord(i, new ShortEncryptedBuildRecord(rec)); + offset += SHORT_RECORD_SIZE; + } + } + + @Override + protected int writeMessageBody(byte[] out, int curIndex) throws I2NPMessageException { + int remaining = out.length - (curIndex + calculateWrittenLength()); + if (remaining < 0) + throw new I2NPMessageException("Not large enough (too short by " + remaining + ")"); + if (RECORD_COUNT <= 0 || RECORD_COUNT > MAX_RECORD_COUNT) + throw new I2NPMessageException("Bad record count " + RECORD_COUNT); + out[curIndex++] = (byte) RECORD_COUNT; + out[curIndex++] = (byte) _plaintextSlot; + DataHelper.toLong(out, curIndex, 2, _plaintextRecord.length); + curIndex += 2; + System.arraycopy(_plaintextRecord, 0, out, curIndex, _plaintextRecord.length); + curIndex += _plaintextRecord.length; + for (int i = 0; i < RECORD_COUNT; i++) { + if (i == _plaintextSlot) + continue; + System.arraycopy(_records[i].getData(), 0, out, curIndex, SHORT_RECORD_SIZE); + curIndex += SHORT_RECORD_SIZE; + } + return curIndex; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(64); + buf.append("[InboundTunnelBuildMessage: " + + "\n\tID: ").append(getUniqueId()) + .append("\n\tRecords: ").append(getRecordCount()) + .append(']'); + return buf.toString(); + } +} diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/i2np/OutboundTunnelBuildReplyMessage.java i2p-0.9.50/router/java/src/net/i2p/data/i2np/OutboundTunnelBuildReplyMessage.java --- i2p-0.9.49/router/java/src/net/i2p/data/i2np/OutboundTunnelBuildReplyMessage.java 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/i2np/OutboundTunnelBuildReplyMessage.java 2021-05-19 12:12:00.000000000 +0000 @@ -0,0 +1,128 @@ +package net.i2p.data.i2np; + +import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; + +/** + * Sent from the OBEP to the tunnel creator via an inbound tunnel. + * Contains one plaintext variable-sized reply record for the creator + * and a variable number of encrypted records for the following hops. + * This message must be garlic-encrypted to hide the contents from the OBGW. + * + * Preliminary, see proposal 157. + * + * @since 0.9.50 + */ +public class OutboundTunnelBuildReplyMessage extends TunnelBuildReplyMessage { + public static final int MESSAGE_TYPE = 26; + public static final int SHORT_RECORD_SIZE = ShortTunnelBuildMessage.SHORT_RECORD_SIZE; + public static final int MAX_PLAINTEXT_RECORD_SIZE = 172; + + private int _plaintextSlot; + private byte[] _plaintextRecord; + + /** zero record count, will be set with readMessage() */ + public OutboundTunnelBuildReplyMessage(I2PAppContext context) { + super(context, 0); + } + + public OutboundTunnelBuildReplyMessage(I2PAppContext context, int records) { + super(context, records); + } + + /** + * Set the slot and data for the plaintext record. + * @throws IllegalArgumentException on bad slot or data length. + */ + public void setPlaintextRecord(int slot, byte[] data) { + if (slot < 0 || slot >= RECORD_COUNT || data.length == 0 || data.length > MAX_PLAINTEXT_RECORD_SIZE) + throw new IllegalArgumentException(); + _plaintextSlot = slot; + _plaintextRecord = data; + } + + /** + * Get the slot for the plaintext record. + * getRecord() for this slot will return null. + */ + public int getPlaintextSlot() { + return _plaintextSlot; + } + + /** + * Get the data for the plaintext record. + */ + public byte[] getPlaintextRecord() { + return _plaintextRecord; + } + + @Override + protected int calculateWrittenLength() { return 4 + _plaintextRecord.length + ((RECORD_COUNT - 1) * SHORT_RECORD_SIZE); } + + @Override + public int getType() { return MESSAGE_TYPE; } + + @Override + public void readMessage(byte[] data, int offset, int dataSize, int type) throws I2NPMessageException { + if (type != MESSAGE_TYPE) + throw new I2NPMessageException("Message type is incorrect for this message"); + int r = data[offset++] & 0xff; + if (r <= 0 || r > MAX_RECORD_COUNT) + throw new I2NPMessageException("Bad record count " + r); + RECORD_COUNT = r; + _plaintextSlot = data[offset++] & 0xff; + if (_plaintextSlot < 0 || _plaintextSlot >= r) + throw new I2NPMessageException("Bad slot " + _plaintextSlot); + int size = (int) DataHelper.fromLong(data, offset, 2); + if (size <= 0 || size > MAX_PLAINTEXT_RECORD_SIZE) + throw new I2NPMessageException("Bad size " + size); + offset += 2; + _plaintextRecord = new byte[size]; + System.arraycopy(data, offset, _plaintextRecord, 0, size); + offset += size; + + if (dataSize != calculateWrittenLength()) + throw new I2NPMessageException("Wrong length (expects " + calculateWrittenLength() + ", recv " + dataSize + ")"); + _records = new EncryptedBuildRecord[RECORD_COUNT]; + for (int i = 0; i < RECORD_COUNT; i++) { + if (i == _plaintextSlot) + continue; + byte rec[] = new byte[SHORT_RECORD_SIZE]; + System.arraycopy(data, offset, rec, 0, SHORT_RECORD_SIZE); + setRecord(i, new ShortEncryptedBuildRecord(rec)); + offset += SHORT_RECORD_SIZE; + } + } + + @Override + protected int writeMessageBody(byte[] out, int curIndex) throws I2NPMessageException { + int remaining = out.length - (curIndex + calculateWrittenLength()); + if (remaining < 0) + throw new I2NPMessageException("Not large enough (too short by " + remaining + ")"); + if (RECORD_COUNT <= 0 || RECORD_COUNT > MAX_RECORD_COUNT) + throw new I2NPMessageException("Bad record count " + RECORD_COUNT); + out[curIndex++] = (byte) RECORD_COUNT; + out[curIndex++] = (byte) _plaintextSlot; + DataHelper.toLong(out, curIndex, 2, _plaintextRecord.length); + curIndex += 2; + System.arraycopy(_plaintextRecord, 0, out, curIndex, _plaintextRecord.length); + curIndex += _plaintextRecord.length; + for (int i = 0; i < RECORD_COUNT; i++) { + if (i == _plaintextSlot) + continue; + System.arraycopy(_records[i].getData(), 0, out, curIndex, SHORT_RECORD_SIZE); + curIndex += SHORT_RECORD_SIZE; + } + return curIndex; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(64); + buf.append("[OutboundTunnelBuildReplyMessage: " + + "\n\tID: ").append(getUniqueId()) + .append("\n\tRecords: ").append(getRecordCount()) + .append(']'); + return buf.toString(); + } +} diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/i2np/ShortTunnelBuildMessage.java i2p-0.9.50/router/java/src/net/i2p/data/i2np/ShortTunnelBuildMessage.java --- i2p-0.9.49/router/java/src/net/i2p/data/i2np/ShortTunnelBuildMessage.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/i2np/ShortTunnelBuildMessage.java 2021-05-19 12:12:00.000000000 +0000 @@ -22,7 +22,7 @@ } @Override - protected int calculateWrittenLength() { return 1 + super.calculateWrittenLength(); } + protected int calculateWrittenLength() { return 1 + (RECORD_COUNT * SHORT_RECORD_SIZE); } @Override public int getType() { return MESSAGE_TYPE; } @@ -66,7 +66,8 @@ public String toString() { StringBuilder buf = new StringBuilder(64); buf.append("[ShortTunnelBuildMessage: " + - "\n\tRecords: ").append(getRecordCount()) + "\n\tID: ").append(getUniqueId()) + .append("\n\tRecords: ").append(getRecordCount()) .append(']'); return buf.toString(); } diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/i2np/ShortTunnelBuildReplyMessage.java i2p-0.9.50/router/java/src/net/i2p/data/i2np/ShortTunnelBuildReplyMessage.java --- i2p-0.9.49/router/java/src/net/i2p/data/i2np/ShortTunnelBuildReplyMessage.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/i2np/ShortTunnelBuildReplyMessage.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -package net.i2p.data.i2np; - -import net.i2p.I2PAppContext; -import net.i2p.data.DataHelper; - -/** - * Transmitted from the new outbound endpoint to the creator through a - * reply tunnel. - * Variable size, small records. - * Preliminary, see proposal 157. - * - * @since 0.9.49 - */ -public class ShortTunnelBuildReplyMessage extends TunnelBuildReplyMessage { - public static final int MESSAGE_TYPE = 26; - public static final int SHORT_RECORD_SIZE = ShortTunnelBuildMessage.SHORT_RECORD_SIZE; - - /** zero record count, will be set with readMessage() */ - public ShortTunnelBuildReplyMessage(I2PAppContext context) { - super(context, 0); - } - - public ShortTunnelBuildReplyMessage(I2PAppContext context, int records) { - super(context, records); - } - - @Override - protected int calculateWrittenLength() { return 1 + super.calculateWrittenLength(); } - - @Override - public int getType() { return MESSAGE_TYPE; } - - @Override - public void readMessage(byte[] data, int offset, int dataSize, int type) throws I2NPMessageException { - if (type != MESSAGE_TYPE) - throw new I2NPMessageException("Message type is incorrect for this message"); - int r = data[offset] & 0xff; - if (r <= 0 || r > MAX_RECORD_COUNT) - throw new I2NPMessageException("Bad record count " + r); - RECORD_COUNT = r; - if (dataSize != calculateWrittenLength()) - throw new I2NPMessageException("Wrong length (expects " + calculateWrittenLength() + ", recv " + dataSize + ")"); - _records = new EncryptedBuildRecord[RECORD_COUNT]; - offset++; - for (int i = 0; i < RECORD_COUNT; i++) { - byte rec[] = new byte[SHORT_RECORD_SIZE]; - System.arraycopy(data, offset, rec, 0, SHORT_RECORD_SIZE); - setRecord(i, new ShortEncryptedBuildRecord(rec)); - offset += SHORT_RECORD_SIZE; - } - } - - @Override - protected int writeMessageBody(byte[] out, int curIndex) throws I2NPMessageException { - int remaining = out.length - (curIndex + calculateWrittenLength()); - if (remaining < 0) - throw new I2NPMessageException("Not large enough (too short by " + remaining + ")"); - if (RECORD_COUNT <= 0 || RECORD_COUNT > MAX_RECORD_COUNT) - throw new I2NPMessageException("Bad record count " + RECORD_COUNT); - out[curIndex++] = (byte) RECORD_COUNT; - for (int i = 0; i < RECORD_COUNT; i++) { - System.arraycopy(_records[i].getData(), 0, out, curIndex, SHORT_RECORD_SIZE); - curIndex += SHORT_RECORD_SIZE; - } - return curIndex; - } - - @Override - public String toString() { - StringBuilder buf = new StringBuilder(64); - buf.append("[ShortTunnelBuildReplyMessage: " + - "\n\tRecords: ").append(getRecordCount()) - .append(']'); - return buf.toString(); - } -} diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java i2p-0.9.50/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java --- i2p-0.9.49/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java 2021-05-19 12:12:00.000000000 +0000 @@ -59,7 +59,8 @@ public String toString() { StringBuilder buf = new StringBuilder(64); buf.append("[VariableTunnelBuildMessage: " + - "\n\tRecords: ").append(getRecordCount()) + "\n\tID: ").append(getUniqueId()) + .append("\n\tRecords: ").append(getRecordCount()) .append(']'); return buf.toString(); } diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java i2p-0.9.50/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java --- i2p-0.9.49/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java 2021-05-19 12:12:00.000000000 +0000 @@ -62,7 +62,8 @@ public String toString() { StringBuilder buf = new StringBuilder(64); buf.append("[VariableTunnelBuildReplyMessage: " + - "\n\tRecords: ").append(getRecordCount()) + "\n\tID: ").append(getUniqueId()) + .append("\n\tRecords: ").append(getRecordCount()) .append(']'); return buf.toString(); } diff -Nru i2p-0.9.49/router/java/src/net/i2p/data/router/RouterAddress.java i2p-0.9.50/router/java/src/net/i2p/data/router/RouterAddress.java --- i2p-0.9.49/router/java/src/net/i2p/data/router/RouterAddress.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/data/router/RouterAddress.java 2021-05-19 12:12:00.000000000 +0000 @@ -315,12 +315,16 @@ if (object == this) return true; if ((object == null) || !(object instanceof RouterAddress)) return false; RouterAddress addr = (RouterAddress) object; - return + boolean rv = getPort() == addr.getPort() && DataHelper.eq(getHost(), addr.getHost()) && DataHelper.eq(_transportStyle, addr._transportStyle); //DataHelper.eq(_options, addr._options) && //DataHelper.eq(_expiration, addr._expiration); + if (!rv || !_transportStyle.equals("SSU")) + return rv; + // SSU 4/6 caps + return DataHelper.eq(_options.getProperty("caps"), addr._options.getProperty("caps")); } /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/Blocklist.java i2p-0.9.50/router/java/src/net/i2p/router/Blocklist.java --- i2p-0.9.49/router/java/src/net/i2p/router/Blocklist.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/Blocklist.java 2021-05-19 12:12:00.000000000 +0000 @@ -117,6 +117,7 @@ private static final String ID_LOCAL = "local"; private static final String ID_COUNTRY = "country"; private static final String ID_USER = "user"; + public static final String ID_SYBIL = "sybil"; /** @@ -913,10 +914,12 @@ return match(ip, blocklist[cur]); } +/* // Is the IP included in the entry _blocklist[cur] ? private boolean match(int ip, int cur) { return match(ip, _blocklist[cur]); } +*/ // Is the IP included in the compressed entry? private static boolean match(int ip, long entry) { diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/client/ClientManager.java i2p-0.9.50/router/java/src/net/i2p/router/client/ClientManager.java --- i2p-0.9.49/router/java/src/net/i2p/router/client/ClientManager.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/client/ClientManager.java 2021-05-19 12:12:00.000000000 +0000 @@ -835,7 +835,7 @@ try { // only send version if the client can handle it (0.8.7 or greater) runner.doSend(new SetDateMessage(runner.getClientVersion() != null ? - CoreVersion.VERSION : null)); + CoreVersion.PUBLISHED_VERSION : null)); } catch (I2CPMessageException ime) {} } if (_isStarted) diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/client/ClientMessageEventListener.java i2p-0.9.50/router/java/src/net/i2p/router/client/ClientMessageEventListener.java --- i2p-0.9.49/router/java/src/net/i2p/router/client/ClientMessageEventListener.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/client/ClientMessageEventListener.java 2021-05-19 12:12:00.000000000 +0000 @@ -199,7 +199,7 @@ return; try { // only send version if the client can handle it (0.8.7 or greater) - _runner.doSend(new SetDateMessage(clientVersion != null ? CoreVersion.VERSION : null)); + _runner.doSend(new SetDateMessage(clientVersion != null ? CoreVersion.PUBLISHED_VERSION : null)); } catch (I2CPMessageException ime) { if (_log.shouldLog(Log.ERROR)) _log.error("Error writing out the setDate message", ime); @@ -328,6 +328,15 @@ // force type 3 props.setProperty("i2cp.leaseSetType", "3"); } + // Ensure we have the nickname properties set + String name = props.getProperty("inbound.nickname"); + if (name == null || name.trim().isEmpty()) { + name = dest.toBase32(); + props.setProperty("inbound.nickname", name); + } + String name2 = props.getProperty("outbound.nickname"); + if (name2 == null || name2.trim().isEmpty()) + props.setProperty("outbound.nickname", name); cfg.setOptions(props); // this sets the session id int status = _runner.sessionEstablished(cfg); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java i2p-0.9.50/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java --- i2p-0.9.49/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java 2021-05-19 12:12:00.000000000 +0000 @@ -78,11 +78,11 @@ /** * The client version. - * @return CoreVersion.VERSION + * @return CoreVersion.PUBLISHED_VERSION * @since 0.9.7 */ @Override public String getClientVersion() { - return CoreVersion.VERSION; + return CoreVersion.PUBLISHED_VERSION; } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/CommSystemFacade.java i2p-0.9.50/router/java/src/net/i2p/router/CommSystemFacade.java --- i2p-0.9.49/router/java/src/net/i2p/router/CommSystemFacade.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/CommSystemFacade.java 2021-05-19 12:12:00.000000000 +0000 @@ -539,14 +539,13 @@ case REJECT_UNSOLICITED: case IPV4_FIREWALLED_IPV6_OK: - case IPV4_DISABLED_IPV6_FIREWALLED: return REJECT_UNSOLICITED; case IPV4_DISABLED_IPV6_OK: return IPV4_DISABLED_IPV6_FIREWALLED; case DIFFERENT: - case IPV4_SNAT_IPV6_OK: + case IPV4_DISABLED_IPV6_FIREWALLED: return oldStatus; // cases where we already knew the IPv6 state only @@ -565,6 +564,7 @@ return IPV4_DISABLED_IPV6_FIREWALLED; case IPV4_SNAT_IPV6_UNKNOWN: + case IPV4_SNAT_IPV6_OK: return DIFFERENT; default: diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java i2p-0.9.50/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java --- i2p-0.9.49/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java 2021-05-19 12:12:00.000000000 +0000 @@ -1479,6 +1479,9 @@ if (entry.getType() != DatabaseEntry.KEY_TYPE_LS2) continue; LeaseSet2 ls2 = (LeaseSet2) entry; + // i2pd bug? + if (ls2.getLeaseCount() == 0) + return; if (!ls2.isCurrent(Router.CLOCK_FUDGE_FACTOR)) continue; PublicKey pk = ls2.getEncryptionKey(LeaseSetKeys.SET_EC); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/NetworkDatabaseFacade.java i2p-0.9.50/router/java/src/net/i2p/router/NetworkDatabaseFacade.java --- i2p-0.9.49/router/java/src/net/i2p/router/NetworkDatabaseFacade.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/NetworkDatabaseFacade.java 2021-05-19 12:12:00.000000000 +0000 @@ -207,4 +207,11 @@ public boolean removeBlindData(SigningPublicKey spk) { return false; } + + /** + * Notify the netDB that the routing key changed at midnight UTC + * + * @since 0.9.50 + */ + public void routingKeyChanged() {} } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java 2021-05-19 12:12:00.000000000 +0000 @@ -57,7 +57,10 @@ _facade.setFloodfillEnabledFromMonitor(ff); if (ff != wasFF) { if (ff) { - getContext().router().eventLog().addEvent(EventLog.BECAME_FLOODFILL); + if (!(getContext().getBooleanProperty(PROP_FLOODFILL_PARTICIPANT) && + getContext().router().getUptime() < 3*60*1000)) { + getContext().router().eventLog().addEvent(EventLog.BECAME_FLOODFILL); + } } else { getContext().router().eventLog().addEvent(EventLog.NOT_FLOODFILL); } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java 2021-05-19 12:12:00.000000000 +0000 @@ -498,6 +498,7 @@ * For console ConfigKeyringHelper * @since 0.9.41 */ + @Override public List getBlindData() { return _blindCache.getData(); } @@ -508,9 +509,22 @@ * @return true if removed * @since 0.9.41 */ + @Override public boolean removeBlindData(SigningPublicKey spk) { return _blindCache.removeBlindData(spk); } + + /** + * Notify the netDB that the routing key changed at midnight UTC + * + * @since 0.9.50 + */ + @Override + public void routingKeyChanged() { + _blindCache.rollover(); + if (_log.shouldInfo()) + _log.info("UTC rollover, blind cache updated"); + } /** * @return RouterInfo, LeaseSet, or null, validated @@ -913,13 +927,22 @@ // lookupLeaseSetLocally() latest <= now - Router.CLOCK_FUDGE_FACTOR) { long age = now - earliest; - if (_log.shouldLog(Log.WARN)) + Destination dest = leaseSet.getDestination(); + String id = dest != null ? dest.toBase32() : leaseSet.getHash().toBase32(); + if (_log.shouldWarn()) _log.warn("Old leaseSet! not storing it: " - + leaseSet.getDestination().toBase32() + + id + " first exp. " + new Date(earliest) - + " last exp. " + new Date(latest), + + " last exp. " + new Date(latest) + '\n' + leaseSet, new Exception("Rejecting store")); - return "Expired leaseSet for " + leaseSet.getDestination().toBase32() + // i2pd bug? + // So we don't immediately go try to fetch it for a reply + if (leaseSet.getLeaseCount() == 0) { + for (int i = 0; i < NegativeLookupCache.MAX_FAILS; i++) { + lookupFailed(key); + } + } + return "Expired leaseSet for " + id + " expired " + DataHelper.formatDuration(age) + " ago"; } if (latest > now + (Router.CLOCK_FUDGE_FACTOR + MAX_LEASE_FUTURE) && @@ -927,11 +950,13 @@ latest > now + (Router.CLOCK_FUDGE_FACTOR + MAX_META_LEASE_FUTURE))) { long age = latest - now; // let's not make this an error, it happens when peers have bad clocks + Destination dest = leaseSet.getDestination(); + String id = dest != null ? dest.toBase32() : leaseSet.getHash().toBase32(); if (_log.shouldLog(Log.WARN)) _log.warn("LeaseSet expires too far in the future: " - + leaseSet.getDestination().toBase32() + + id + " expires " + DataHelper.formatDuration(age) + " from now"); - return "Future expiring leaseSet for " + leaseSet.getDestination().toBase32() + return "Future expiring leaseSet for " + id + " expiring in " + DataHelper.formatDuration(age); } return null; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/MessageWrapper.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/MessageWrapper.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/MessageWrapper.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/MessageWrapper.java 2021-05-19 12:12:00.000000000 +0000 @@ -132,9 +132,9 @@ * * @param to must be ELGAMAL_2048 or ECIES_X25519 EncType * @return null on encrypt failure - * @since 0.9.5 + * @since 0.9.5, public since 0.9.50 for BuildRequestor */ - static GarlicMessage wrap(RouterContext ctx, I2NPMessage m, RouterInfo to) { + public static GarlicMessage wrap(RouterContext ctx, I2NPMessage m, RouterInfo to) { PayloadGarlicConfig payload = new PayloadGarlicConfig(Certificate.NULL_CERT, ctx.random().nextLong(I2NPMessage.MAX_ID_VALUE), diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java 2021-05-19 12:12:00.000000000 +0000 @@ -20,7 +20,7 @@ private final Map badDests; private final int _maxFails; - private static final int MAX_FAILS = 3; + static final int MAX_FAILS = 3; private static final int MAX_BAD_DESTS = 128; private static final long CLEAN_TIME = 2*60*1000; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java 2021-05-19 12:12:00.000000000 +0000 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.NoSuchElementException; import java.util.concurrent.ConcurrentHashMap; @@ -34,6 +35,7 @@ import net.i2p.router.JobImpl; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.util.ConcurrentHashSet; import net.i2p.util.FileSuffixFilter; import net.i2p.util.FileUtil; import net.i2p.util.I2PThread; @@ -144,7 +146,6 @@ public DatabaseEntry remove(Hash key, boolean persist) { if (persist) { _writer.remove(key); - _context.jobQueue().addJob(new RemoveJob(key)); } return super.remove(key); } @@ -168,24 +169,6 @@ return rv; } - private class RemoveJob extends JobImpl { - private final Hash _key; - public RemoveJob(Hash key) { - super(PersistentDataStore.this._context); - _key = key; - } - public String getName() { return "Delete RI file"; } - public void runJob() { - if (_log.shouldLog(Log.INFO)) - _log.info("Removing key " + _key /* , getAddedBy() */); - try { - removeFile(_key, _dbDir); - } catch (IOException ioe) { - _log.error("Error removing key " + _key, ioe); - } - } - } - /** How many files to write every 10 minutes. Doesn't make sense to limit it, * they just back up in the queue hogging memory. */ @@ -202,16 +185,19 @@ */ private class Writer implements Runnable, Flushable { private final Map_keys; + private final Set _keysToRemove; private final Object _waitLock; private volatile boolean _quit; public Writer() { _keys = new ConcurrentHashMap(64); + _keysToRemove = new ConcurrentHashSet(); _waitLock = new Object(); } public void queue(Hash key, DatabaseEntry data) { int pending = _keys.size(); + _keysToRemove.remove(key); boolean exists = (null != _keys.put(key, data)); if (exists) _context.statManager().addRateData("netDb.writeClobber", pending); @@ -220,6 +206,25 @@ public void remove(Hash key) { _keys.remove(key); + _keysToRemove.add(key); + } + + /* + * @since 0.9.50 was in separate RemoveJob + */ + private void removeQueued() { + if (_keysToRemove.isEmpty()) + return; + for (Iterator iter = _keysToRemove.iterator(); iter.hasNext(); ) { + Hash key = iter.next(); + iter.remove(); + try { + removeFile(key, _dbDir); + } catch (IOException ioe) { + if (_log.shouldWarn()) + _log.warn("Error removing key " + key, ioe); + } + } } public void run() { @@ -260,6 +265,7 @@ if (count >= WRITE_LIMIT) count = 0; if (count == 0) { + removeQueued(); if (lastCount > 0) { long time = _context.clock().now() - startTime; if (_log.shouldLog(Log.INFO)) diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java 2021-05-19 12:12:00.000000000 +0000 @@ -136,8 +136,8 @@ _log.info("Almost clobbered an old router! " + key + ": [old published on " + new Date(ori.getPublished()) + " new on " + new Date(ri.getPublished()) + ']'); } else if (ri.getPublished() == ori.getPublished()) { - if (_log.shouldLog(Log.INFO)) - _log.info("Duplicate " + key); + if (_log.shouldDebug()) + _log.debug("Duplicate " + key); } else { if (_log.shouldLog(Log.INFO)) _log.info("Updated the old router for " + key + ": [old published on " + new Date(ori.getPublished()) + diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java 2021-05-19 12:12:00.000000000 +0000 @@ -75,8 +75,10 @@ s = "Only " + x + " peers remaining but reseed disabled by configuration"; else s = "No peers remaining but reseed disabled by configuration"; - _lastError = s; - _log.logAlways(Log.WARN, s); + if (!s.equals(_lastError)) { + _lastError = s; + _log.logAlways(Log.WARN, s); + } return false; } @@ -88,8 +90,10 @@ s = "Only " + x + " peers remaining but reseed disabled by shutdown in progress"; else s = "No peers remaining but reseed disabled by shutdown in progress"; - _lastError = s; - _log.logAlways(Log.WARN, s); + if (!s.equals(_lastError)) { + _lastError = s; + _log.logAlways(Log.WARN, s); + } return false; } @@ -122,8 +126,10 @@ s = "Only " + x + " peers remaining but reseed disabled by config file"; else s = "No peers remaining but reseed disabled by config file"; - _lastError = s; - _log.logAlways(Log.WARN, s); + if (!s.equals(_lastError)) { + _lastError = s; + _log.logAlways(Log.WARN, s); + } return false; } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java i2p-0.9.50/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java --- i2p-0.9.49/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java 2021-05-19 12:12:00.000000000 +0000 @@ -228,7 +228,8 @@ _checker.setStatus( _t("Reseeding: got router info from file ({0} successful, {1} errors).", fetched, errors)); System.err.println("Reseed got " + fetched + " router infos from file with " + errors + " errors"); - _context.router().eventLog().addEvent(EventLog.RESEED, fetched + " from file"); + if (fetched > 0) + _context.router().eventLog().addEvent(EventLog.RESEED, fetched + " from file"); return fetched; } finally { try { in.close(); } catch (IOException ioe) {} @@ -392,7 +393,8 @@ _isRunning = false; // ReseedChecker will set timer to clean up //_checker.setStatus(""); - _context.router().eventLog().addEvent(EventLog.RESEED, Integer.toString(total)); + if (total > 0) + _context.router().eventLog().addEvent(EventLog.RESEED, Integer.toString(total)); } /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java i2p-0.9.50/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java --- i2p-0.9.49/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/peermanager/PeerManagerFacadeImpl.java 2021-05-19 12:12:00.000000000 +0000 @@ -29,24 +29,28 @@ private final RouterContext _context; private final ProfilePersistenceHelper _persistenceHelper; private final PeerTestJob _testJob; + + private static final boolean ENABLE_PEER_TEST = false; public PeerManagerFacadeImpl(RouterContext ctx) { _context = ctx; _log = ctx.logManager().getLog(PeerManagerFacadeImpl.class); _persistenceHelper = new ProfilePersistenceHelper(ctx); - _testJob = new PeerTestJob(_context); + _testJob = ENABLE_PEER_TEST ? new PeerTestJob(_context) : null; } public synchronized void startup() { _log.info("Starting up the peer manager"); _manager = new PeerManager(_context); _persistenceHelper.setUs(_context.routerHash()); - _testJob.startTesting(_manager); + if (_testJob != null) + _testJob.startTesting(_manager); } public synchronized void shutdown() { _log.info("Shutting down the peer manager"); - _testJob.stopTesting(); + if (_testJob != null) + _testJob.stopTesting(); if (_manager != null) { _manager.storeProfiles(); _manager.clearProfiles(); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/peermanager/PeerProfile.java i2p-0.9.50/router/java/src/net/i2p/router/peermanager/PeerProfile.java --- i2p-0.9.49/router/java/src/net/i2p/router/peermanager/PeerProfile.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/peermanager/PeerProfile.java 2021-05-19 12:12:00.000000000 +0000 @@ -41,12 +41,14 @@ private long _lastSentToSuccessfully; private long _lastFailedSend; private long _lastHeardFrom; + // unused private float _tunnelTestResponseTimeAvg; // periodic rates //private RateStat _sendSuccessSize = null; //private RateStat _receiveSize = null; private RateStat _dbResponseTime; private RateStat _tunnelCreateResponseTime; + // unused private RateStat _tunnelTestResponseTime; private RateStat _dbIntroduction; // calculation bonuses @@ -95,6 +97,7 @@ // x**4 = .5; x = 4th root of .5, x = .5**(1/4), x ~= 0.84 private static final float DEGRADE_FACTOR = (float) Math.pow(TOTAL_DEGRADE_PER_DAY, 1.0d / DEGRADES_PER_DAY); //static { System.out.println("Degrade factor is " + DEGRADE_FACTOR); } + static final boolean ENABLE_TUNNEL_TEST_RESPONSE_TIME = false; private long _lastCoalesceDate = System.currentTimeMillis(); @@ -301,9 +304,18 @@ /** how long it takes to get a tunnel create response from the peer (in milliseconds), calculated over a 1 minute, 1 hour, and 1 day period Warning - may return null if !getIsExpanded() */ public RateStat getTunnelCreateResponseTime() { return _tunnelCreateResponseTime; } - /** how long it takes to successfully test a tunnel this peer participates in (in milliseconds), calculated over a 10 minute, 1 hour, and 1 day period - Warning - may return null if !getIsExpanded() */ + + /** + * How long it takes to successfully test a tunnel this peer participates in (in milliseconds), + * calculated over a 10 minute, 1 hour, and 1 day period + * Warning - may return null if !getIsExpanded() + * + * @deprecated unused + * @return null always + */ + @Deprecated public RateStat getTunnelTestResponseTime() { return _tunnelTestResponseTime; } + /** how many new peers we get from dbSearchReplyMessages or dbStore messages, calculated over a 1 hour, 1 day, and 1 week period Warning - may return null if !getIsExpandedDB() */ public RateStat getDbIntroduction() { return _dbIntroduction; } @@ -356,10 +368,25 @@ */ public boolean getIsFailing() { return false; } + /** + * @deprecated unused + * @return 0 always + */ + @Deprecated public float getTunnelTestTimeAverage() { return _tunnelTestResponseTimeAvg; } - void setTunnelTestTimeAverage(float avg) { _tunnelTestResponseTimeAvg = avg; } + + /** + * @deprecated unused + */ + @Deprecated + void setTunnelTestTimeAverage(float avg) { /* _tunnelTestResponseTimeAvg = avg; */ } + /** + * @deprecated unused + */ + @Deprecated void updateTunnelTestTimeAverage(long ms) { +/* if (_tunnelTestResponseTimeAvg <= 0) _tunnelTestResponseTimeAvg = 30*1000; // should we instead start at $ms? @@ -372,6 +399,7 @@ if (_log.shouldLog(Log.INFO)) _log.info("Updating tunnel test time for " + _peer.toBase64().substring(0,6) + " to " + _tunnelTestResponseTimeAvg + " via " + ms); +*/ } public float getPeakThroughputKBps() { @@ -520,7 +548,8 @@ // _receiveSize = new RateStat("receiveSize", "How large received messages are", group, new long[] { 5*60*1000l, 60*60*1000l } ); if (_tunnelCreateResponseTime == null) _tunnelCreateResponseTime = new RateStat("tunnelCreateResponseTime", "how long it takes to get a tunnel create response from the peer (in milliseconds)", group, new long[] { 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000 } ); - if (_tunnelTestResponseTime == null) + + if (ENABLE_TUNNEL_TEST_RESPONSE_TIME && _tunnelTestResponseTime == null) _tunnelTestResponseTime = new RateStat("tunnelTestResponseTime", "how long it takes to successfully test a tunnel this peer participates in (in milliseconds)", group, new long[] { 10*60*1000l, 30*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 } ); if (_tunnelHistory == null) @@ -605,7 +634,8 @@ //_receiveSize.coalesceStats(); //_sendSuccessSize.coalesceStats(); _tunnelCreateResponseTime.coalesceStats(); - _tunnelTestResponseTime.coalesceStats(); + if (_tunnelTestResponseTime != null) + _tunnelTestResponseTime.coalesceStats(); _tunnelHistory.coalesceStats(); if (_expandedDB) { _dbIntroduction.coalesceStats(); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java i2p-0.9.50/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java --- i2p-0.9.49/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java 2021-05-19 12:12:00.000000000 +0000 @@ -114,11 +114,14 @@ * * Non-blocking. Will not update the profile if we can't get the lock. */ + @SuppressWarnings("deprecation") public void tunnelTestSucceeded(Hash peer, long responseTimeMs) { - PeerProfile data = getProfileNonblocking(peer); - if (data == null) return; - data.updateTunnelTestTimeAverage(responseTimeMs); - data.getTunnelTestResponseTime().addData(responseTimeMs, responseTimeMs); + if (PeerProfile.ENABLE_TUNNEL_TEST_RESPONSE_TIME) { + PeerProfile data = getProfileNonblocking(peer); + if (data == null) return; + data.updateTunnelTestTimeAverage(responseTimeMs); + data.getTunnelTestResponseTime().addData(responseTimeMs, responseTimeMs); + } } /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java i2p-0.9.50/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java --- i2p-0.9.49/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java 2021-05-19 12:12:00.000000000 +0000 @@ -111,6 +111,7 @@ * @param addComments add comment lines to the output * @since 0.9.41 */ + @SuppressWarnings("deprecation") public void writeProfile(PeerProfile profile, OutputStream out, boolean addComments) throws IOException { String groups = null; if (_context.profileOrganizer().isFailing(profile.getPeer())) { @@ -150,7 +151,8 @@ addDate(buf, addComments, "lastHeardFrom", profile.getLastHeardFrom(), "When did we last get a message from the peer?"); addDate(buf, addComments, "lastSentToSuccessfully", profile.getLastSendSuccessful(), "When did we last send the peer a message successfully?"); addDate(buf, addComments, "lastFailedSend", profile.getLastSendFailed(), "When did we last fail to send a message to the peer?"); - add(buf, addComments, "tunnelTestTimeAverage", profile.getTunnelTestTimeAverage(), "Moving average as to how fast the peer replies"); + if (PeerProfile.ENABLE_TUNNEL_TEST_RESPONSE_TIME) + add(buf, addComments, "tunnelTestTimeAverage", profile.getTunnelTestTimeAverage(), "Moving average as to how fast the peer replies"); add(buf, addComments, "tunnelPeakThroughput", profile.getPeakThroughputKBps(), "KBytes/sec"); add(buf, addComments, "tunnelPeakTunnelThroughput", profile.getPeakTunnelThroughputKBps(), "KBytes/sec"); add(buf, addComments, "tunnelPeakTunnel1mThroughput", profile.getPeakTunnel1mThroughputKBps(), "KBytes/sec"); @@ -165,7 +167,8 @@ //profile.getReceiveSize().store(out, "receiveSize"); //profile.getSendSuccessSize().store(out, "sendSuccessSize"); profile.getTunnelCreateResponseTime().store(out, "tunnelCreateResponseTime", addComments); - profile.getTunnelTestResponseTime().store(out, "tunnelTestResponseTime", addComments); + if (PeerProfile.ENABLE_TUNNEL_TEST_RESPONSE_TIME) + profile.getTunnelTestResponseTime().store(out, "tunnelTestResponseTime", addComments); } if (profile.getIsExpandedDB()) { @@ -283,6 +286,7 @@ return (timeSince > EXPIRE_AGE); } + @SuppressWarnings("deprecation") public PeerProfile readProfile(File file) { Hash peer = getHash(file.getName()); try { @@ -321,7 +325,10 @@ profile.setLastSendSuccessful(getLong(props, "lastSentToSuccessfully")); profile.setLastSendFailed(getLong(props, "lastFailedSend")); profile.setLastHeardFrom(getLong(props, "lastHeardFrom")); - profile.setTunnelTestTimeAverage(getFloat(props, "tunnelTestTimeAverage")); + + if (PeerProfile.ENABLE_TUNNEL_TEST_RESPONSE_TIME) + profile.setTunnelTestTimeAverage(getFloat(props, "tunnelTestTimeAverage")); + profile.setPeakThroughputKBps(getFloat(props, "tunnelPeakThroughput")); profile.setPeakTunnelThroughputKBps(getFloat(props, "tunnelPeakTunnelThroughput")); profile.setPeakTunnel1mThroughputKBps(getFloat(props, "tunnelPeakTunnel1mThroughput")); @@ -344,7 +351,9 @@ //profile.getReceiveSize().load(props, "receiveSize", true); //profile.getSendSuccessSize().load(props, "sendSuccessSize", true); profile.getTunnelCreateResponseTime().load(props, "tunnelCreateResponseTime", true); - profile.getTunnelTestResponseTime().load(props, "tunnelTestResponseTime", true); + + if (PeerProfile.ENABLE_TUNNEL_TEST_RESPONSE_TIME) + profile.getTunnelTestResponseTime().load(props, "tunnelTestResponseTime", true); if (_log.shouldLog(Log.DEBUG)) _log.debug("Loaded the profile for " + peer.toBase64() + " from " + file.getName()); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/RouterThrottleImpl.java i2p-0.9.50/router/java/src/net/i2p/router/RouterThrottleImpl.java --- i2p-0.9.49/router/java/src/net/i2p/router/RouterThrottleImpl.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/RouterThrottleImpl.java 2021-05-19 12:12:00.000000000 +0000 @@ -363,8 +363,6 @@ int usedIn = Math.min(_context.router().get1sRateIn(), _context.router().get15sRateIn()); int usedOut = Math.min(_context.router().get1sRate(true), _context.router().get15sRate(true)); int used = Math.max(usedIn, usedOut); - int used1mIn = _context.router().get1mRateIn(); - int used1mOut = _context.router().get1mRate(true); // Check the inbound and outbound total bw available (separately) // We block all tunnels when share bw is over (max * 0.9) - 4KB @@ -391,6 +389,8 @@ _context.statManager().addRateData("router.throttleTunnelBytesAllowed", availBps, (long)bytesAllocated); // Now see if 1m rates are too high + int used1mIn = _context.router().get1mRateIn(); + int used1mOut = _context.router().get1mRate(true); long overage = Math.max(used1mIn - (maxKBpsIn*1024), used1mOut - (maxKBpsOut*1024)); if ( (overage > 0) && ((overage/(maxKBps*1024f)) > _context.random().nextFloat()) ) { @@ -399,20 +399,42 @@ return false; } + double probReject; + boolean reject; + if (availBps <= 0) { + probReject = 1; + reject = true; + if (_log.shouldWarn()) + _log.warn("Reject avail/maxK/used " + availBps + "/" + maxKBps + "/" + + used + " pReject = 1 numTunnels = " + numTunnels + + " est = " + bytesAllocated); + } else { // limit at 90% - 4KBps (see above) float maxBps = (maxKBps * 1024f * 0.9f) - MIN_AVAILABLE_BPS; float pctFull = (maxBps - availBps) / (maxBps); - double probReject = Math.pow(pctFull, 16); // steep curve - double rand = _context.random().nextFloat(); - boolean reject = rand <= probReject; - if (reject && _log.shouldLog(Log.WARN)) - _log.warn("Reject avail/maxK/used " + availBps + "/" + maxKBps + "/" + if (pctFull < 0.83f) { + // probReject < ~5% + probReject = 0; + reject = false; + if (_log.shouldDebug()) + _log.debug("Accept avail/maxK/used " + availBps + "/" + maxKBps + "/" + + used + " pReject = 0 numTunnels = " + numTunnels + + " est = " + bytesAllocated); + } else { + probReject = Math.pow(pctFull, 16); // steep curve + double rand = _context.random().nextFloat(); + reject = rand <= probReject; + if (reject && _log.shouldWarn()) + _log.warn("Reject avail/maxK/used " + availBps + "/" + maxKBps + "/" + used + " pReject = " + probReject + " pFull = " + pctFull + " numTunnels = " + numTunnels + " rand = " + rand + " est = " + bytesAllocated); - else if (_log.shouldLog(Log.DEBUG)) - _log.debug("Accept avail/maxK/used " + availBps + "/" + maxKBps + "/" + else if (_log.shouldDebug()) + _log.debug("Accept avail/maxK/used " + availBps + "/" + maxKBps + "/" + used + " pReject = " + probReject + " pFull = " + pctFull + " numTunnels = " + numTunnels + " rand = " + rand + " est = " + bytesAllocated); + } + } + if (probReject >= 0.9) setTunnelStatus(LIMIT_STR); else if (probReject >= 0.5) diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java i2p-0.9.50/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java --- i2p-0.9.49/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java 2021-05-19 12:12:00.000000000 +0000 @@ -45,7 +45,7 @@ private RouterInfo _us; private static final AtomicBoolean _keyLengthChecked = new AtomicBoolean(); // 1 chance in this many to rekey if the defaults changed - private static final int REKEY_PROBABILITY = 128; + private static final int REKEY_PROBABILITY = 16; public LoadRouterInfoJob(RouterContext ctx) { super(ctx); @@ -193,11 +193,13 @@ } /** - * Does our RI private key length match the configuration? + * Does our RI ElGamal private key length match the configuration? * If not, return true. * @since 0.9.8 */ private boolean shouldRebuild(PrivateKey privkey) { + if (privkey.getType() != EncType.ELGAMAL_2048) + return false; // Prevent returning true more than once, ever. // If we are called a second time, it's probably because we failed // to delete router.keys for some reason. diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/startup/WorkingDir.java i2p-0.9.50/router/java/src/net/i2p/router/startup/WorkingDir.java --- i2p-0.9.49/router/java/src/net/i2p/router/startup/WorkingDir.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/startup/WorkingDir.java 2021-05-19 12:12:00.000000000 +0000 @@ -99,8 +99,13 @@ // then attempt to use, resulting in a router with no client applications. Checking // for clients.config.d determines if the directory is "Real" or not. File clientAppsConfig = new File(checkOld.getAbsolutePath(), "clients.config.d"); - if (routerConfig.exists() && clientAppsConfig.exists() && clientAppsConfig.isDirectory()) + if (routerConfig.exists() && clientAppsConfig.exists() && clientAppsConfig.isDirectory()) { home = appdata; + } else { + clientAppsConfig = new File(checkOld.getAbsolutePath(), "clients.config"); + if (routerConfig.exists() && clientAppsConfig.exists()) + home = appdata; + } } } dirf = new SecureDirectory(home, WORKING_DIR_DEFAULT_WINDOWS); @@ -361,6 +366,8 @@ */ private static boolean migrateClientsConfig(File olddir, File todir) { File oldFile = new File(olddir, "clients.config"); + if (!oldFile.exists()) + return true; File newFile = new File(todir, "clients.config"); FileInputStream in = null; PrintWriter out = null; @@ -389,9 +396,7 @@ throw new IOException("Failed write to " + newFile); return true; } catch (IOException ioe) { - if (in != null) { - System.err.println("FAILED copy " + oldFile + ": " + ioe); - } + System.err.println("FAILED copy " + oldFile + ": " + ioe); return false; } finally { if (in != null) try { in.close(); } catch (IOException ioe) {} @@ -406,6 +411,8 @@ */ static boolean migrateJettyXml(File olddir, File todir, String filename, String oldString, String newString) { File oldFile = new File(olddir, filename); + if (!oldFile.exists()) + return true; File newFile = new File(todir, filename); FileInputStream in = null; PrintWriter out = null; @@ -426,9 +433,7 @@ System.err.println("Copied " + oldFile + " with modifications"); return true; } catch (IOException ioe) { - if (in != null) { - System.err.println("FAILED copy " + oldFile + ": " + ioe); - } + System.err.println("FAILED copy " + oldFile + ": " + ioe); return false; } finally { if (in != null) try { in.close(); } catch (IOException ioe) {} diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/sybil/Analysis.java i2p-0.9.50/router/java/src/net/i2p/router/sybil/Analysis.java --- i2p-0.9.49/router/java/src/net/i2p/router/sybil/Analysis.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/sybil/Analysis.java 2021-05-19 12:12:00.000000000 +0000 @@ -8,6 +8,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -16,6 +17,7 @@ import net.i2p.app.ClientAppManager; import net.i2p.app.ClientAppState; import static net.i2p.app.ClientAppState.*; +import net.i2p.data.Base64; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -24,6 +26,7 @@ import net.i2p.data.router.RouterInfo; import net.i2p.data.router.RouterKeyGenerator; import net.i2p.router.Banlist; +import net.i2p.router.Blocklist; import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; import net.i2p.router.TunnelPoolSettings; @@ -89,10 +92,12 @@ private static final double PAIR_DISTANCE_FACTOR = 2.0; private static final double OUR_KEY_FACTOR = 4.0; private static final double VERSION_FACTOR = 1.0; - private static final double POINTS_BAD_VERSION = 50.0; + private static final double POINTS_BAD_VERSION = 20.0; private static final double POINTS_UNREACHABLE = 4.0; private static final double POINTS_NEW = 4.0; - private static final double POINTS_BANLIST = 25.0; + // since we're blocking by default now, don't make this too high, + // so we don't always turn a temporary block into a permanent one. + private static final double POINTS_BANLIST = 10.0; public static final boolean DEFAULT_BLOCK = true; public static final double DEFAULT_BLOCK_THRESHOLD = 50.0; public static final long DEFAULT_BLOCK_TIME = 7*24*60*60*1000L; @@ -127,6 +132,38 @@ public PersistSybil getPersister() { return _persister; } + /** + * Load the persisted blocklist and tell the router + * + * @since 0.9.50 + */ + private class InitJob extends JobImpl { + public InitJob() { super(_context); } + + public String getName() { return "Load Sybil Blocklist"; } + + public void runJob() { + Map map = _persister.readBlocklist(); + if (map == null || map.isEmpty()) + return; + Blocklist bl = _context.blocklist(); + Banlist ban = _context.banlist(); + for (Map.Entry e : map.entrySet()) { + String s = e.getKey(); + if (s.contains(".") || s.contains(":")) { + bl.add(s); + } else { + byte[] b = Base64.decode(s); + if (b != null && b.length == Hash.HASH_LENGTH) { + Hash h = Hash.create(b); + long until = e.getValue().longValue(); + ban.banlistRouter(h, "Sybil analysis", null, null, until); + } + } + } + } + } + /////// begin Job methods public void runJob() { @@ -157,6 +194,10 @@ changeState(RUNNING); _cmgr.register(this); _persister.removeOld(); + InitJob init = new InitJob(); + long start = _context.clock().now() + 5*1000; + init.getTiming().setStartAfter(start); + _context.jobQueue().addJob(init); schedule(); } @@ -393,16 +434,21 @@ threshold = MIN_BLOCK_POINTS; } catch (NumberFormatException nfe) {} String day = DataHelper.formatTime(now); + Set blocks = new HashSet(); for (Map.Entry e : points.entrySet()) { double p = e.getValue().getPoints(); if (p >= threshold) { Hash h = e.getKey(); + blocks.add(h.toBase64()); RouterInfo ri = _context.netDb().lookupRouterInfoLocally(h); if (ri != null) { for (RouterAddress ra : ri.getAddresses()) { byte[] ip = ra.getIP(); if (ip != null) - _context.blocklist().add(ip); + _context.blocklist().add(ip); + String host = ra.getHost(); + if (host != null) + blocks.add(host); } } String reason = "Sybil analysis " + day + " with " + fmt.format(p) + " threat points"; @@ -415,6 +461,8 @@ _context.banlist().banlistRouter(h, reason, null, null, blockUntil); } } + if (!blocks.isEmpty()) + _persister.storeBlocklist(blocks, blockUntil); } /** @@ -451,6 +499,7 @@ } double avg = total / (sz * sz / 2d); + String other = _context.getBooleanProperty(PROP_NONFF) ? "router" : "floodfill"; for (Pair p : pairs) { double distance = biLog2(p.dist); double point = MIN_CLOSE - distance; @@ -459,10 +508,10 @@ point *= PAIR_DISTANCE_FACTOR; String b2 = p.r2.getHash().toBase64(); addPoints(points, p.r1.getHash(), point, "Very close (" + fmt.format(distance) + - ") to other floodfill " + b2 + ""); + ") to other " + other + " " + b2 + ""); String b1 = p.r1.getHash().toBase64(); addPoints(points, p.r2.getHash(), point, "Very close (" + fmt.format(distance) + - ") to other floodfill " + b1 + ""); + ") to other " + other + " " + b1 + ""); } return avg; } @@ -775,6 +824,7 @@ RouterInfo us = _context.router().getRouterInfo(); if (us == null) return; String ourVer = us.getVersion(); + // TODO do the math once we hit version 1.0.0 if (!ourVer.startsWith("0.9.")) return; ourVer = ourVer.substring(4); int dot = ourVer.indexOf('.'); @@ -793,7 +843,9 @@ addPoints(points, h, POINTS_NONFF, "Non-floodfill"); String hisFullVer = info.getVersion(); if (!hisFullVer.startsWith("0.9.")) { - addPoints(points, h, POINTS_BAD_VERSION, "Strange version " + DataHelper.escapeHTML(hisFullVer)); + if (!hisFullVer.startsWith("1.")) + addPoints(points, h, POINTS_BAD_VERSION, "Strange version " + DataHelper.escapeHTML(hisFullVer)); + // TODO do the math once we hit version 1.0.0 continue; } String hisVer = hisFullVer.substring(4); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/sybil/PersistSybil.java i2p-0.9.50/router/java/src/net/i2p/router/sybil/PersistSybil.java --- i2p-0.9.49/router/java/src/net/i2p/router/sybil/PersistSybil.java 2021-02-17 19:22:20.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/sybil/PersistSybil.java 2021-05-19 12:12:00.000000000 +0000 @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -25,6 +26,9 @@ import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.Hash; +import net.i2p.router.Blocklist; +import net.i2p.update.UpdateManager; +import net.i2p.update.UpdateType; import net.i2p.util.Log; import net.i2p.util.FileSuffixFilter; import net.i2p.util.SecureDirectory; @@ -41,9 +45,11 @@ private final I2PAppContext _context; private final Log _log; - private static final String DIR = "sybil-analysis/results"; + private static final String SDIR = "sybil-analysis"; + private static final String DIR = SDIR + "/results"; private static final String PFX = "sybil-"; private static final String SFX = ".txt.gz"; + private static final String BLOCKLIST_SYBIL_FILE = "blocklist-sybil.txt"; /** access via Analysis.getPersister() */ PersistSybil(I2PAppContext ctx) { @@ -190,6 +196,9 @@ removeTime = Analysis.DEFAULT_REMOVE_TIME; } long age = _context.getProperty(Analysis.PROP_REMOVETIME, removeTime); + // 0 means never delete + if (age <= 0) + return; long freq2 = 2 * _context.getProperty(Analysis.PROP_FREQUENCY, Analysis.DEFAULT_FREQUENCY); if (age < freq2) age = freq2; @@ -229,6 +238,117 @@ return file.delete(); } + /** + * Read the blocklist + * + * @return map of ip or hash to expiration (ms), or null on failure + * @since 0.9.50 + */ + Map readBlocklist() { + File f = new File(_context.getConfigDir(), SDIR); + f = new File(f, BLOCKLIST_SYBIL_FILE); + Map rv = readBlocklist(f); + if (rv != null) + notifyVersion(f.lastModified()); + return rv; + } + + /** + * Read the blocklist + * + * @return map of ip or hash to expiration (ms), or null on failure + * @since 0.9.50 + */ + private synchronized Map readBlocklist(File blFile) { + Map rv = null; + if (blFile.exists()) { + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader( + new FileInputStream(blFile), "UTF-8")); + rv = new HashMap(); + String buf = null; + long now = _context.clock().now() + 5*60*1000L; + while ((buf = br.readLine()) != null) { + int index = buf.indexOf('#'); + if (index == 0) + continue; + String[] ss = DataHelper.split(buf, ",", 2); + if (ss.length != 2) + continue; + try { + long exp = Long.parseLong(ss[1]); + if (exp < now) + continue; + rv.put(ss[0], Long.valueOf(exp)); + } catch (NumberFormatException nfe) {} + } + } catch (IOException ioe) { + if (_log.shouldWarn()) + _log.warn("Error reading the blocklist file", ioe); + } finally { + if (br != null) try { br.close(); } catch (IOException ioe) {} + } + } + return rv; + } + + /** + * Write the blocklist. + * The format is different than other blocklists because we include an expiration. + * Format: One per line: ip or hash,expiration time (ms) + * + * @param blocks non-empty, will be merged with existing entries + * @since 0.9.50 + */ + synchronized void storeBlocklist(Set blocks, long blockUntil) { + File dir = new SecureDirectory(_context.getConfigDir(), SDIR); + if (!dir.exists()) + dir.mkdirs(); + File blFile = new File(dir, BLOCKLIST_SYBIL_FILE); + Map map = readBlocklist(blFile); + if (map == null) + map = new HashMap(); + Long until = Long.valueOf(blockUntil); + for (String s : blocks) { + Long old = map.put(s, until); + if (old != null && old.longValue() > blockUntil) { + // unlikely + map.put(s, old); + } + } + Writer out = null; + try { + out = new OutputStreamWriter(new SecureFileOutputStream(blFile)); + out.write("# Format (one per line)\n"); + out.write("# IP or Base64 router hash,expiration (ms)\n"); + for (Map.Entry e : map.entrySet()) { + out.write(e.getKey()); + out.write(','); + out.write(e.getValue().toString()); + out.write('\n'); + } + notifyVersion(_context.clock().now()); + } catch (IOException ioe) { + if (_log.shouldWarn()) + _log.warn("Error writing the blocklist file", ioe); + } finally { + if (out != null) try { out.close(); } catch (IOException ioe) {} + } + } + + /** + * @since 0.9.50 + */ + private void notifyVersion(long v) { + ClientAppManager cmgr = _context.clientAppManager(); + if (cmgr != null) { + UpdateManager umgr = (UpdateManager) cmgr.getRegisteredApp(UpdateManager.APP_NAME); + if (umgr != null) + umgr.notifyInstalled(UpdateType.BLOCKLIST, Blocklist.ID_SYBIL, Long.toString(v)); + } + } + /**** public static void main(String[] args) { I2PAppContext ctx = I2PAppContext.getGlobalContext(); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tasks/UpdateRoutingKeyModifierJob.java i2p-0.9.50/router/java/src/net/i2p/router/tasks/UpdateRoutingKeyModifierJob.java --- i2p-0.9.49/router/java/src/net/i2p/router/tasks/UpdateRoutingKeyModifierJob.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tasks/UpdateRoutingKeyModifierJob.java 2021-05-19 12:12:00.000000000 +0000 @@ -36,8 +36,10 @@ RouterKeyGenerator gen = getContext().routerKeyGenerator(); // make sure we requeue quickly if just before midnight long delay = Math.max(5, Math.min(MAX_DELAY_FAILSAFE, gen.getTimeTillMidnight())); - // TODO tell netdb if mod data changed? - gen.generateDateBasedModData(); + // tell netdb if mod data changed + boolean changed = gen.generateDateBasedModData(); + if (changed) + getContext().netDb().routingKeyChanged(); requeue(delay); } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/time/NtpClient.java i2p-0.9.50/router/java/src/net/i2p/router/time/NtpClient.java --- i2p-0.9.49/router/java/src/net/i2p/router/time/NtpClient.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/time/NtpClient.java 2021-05-19 12:12:00.000000000 +0000 @@ -60,7 +60,7 @@ * * Public only for main(), not a public API, not for external use. * - * TODO NOT 2036-compliant, see RFC 4330 + * 2036-compliant as of 0.9.50, see NtpMessage. * * @author Adam Buckley * (minor refactoring by jrandom) diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/time/NtpMessage.java i2p-0.9.50/router/java/src/net/i2p/router/time/NtpMessage.java --- i2p-0.9.49/router/java/src/net/i2p/router/time/NtpMessage.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/time/NtpMessage.java 2021-05-19 12:12:00.000000000 +0000 @@ -72,12 +72,36 @@ * inspired by http://www.pps.jussieu.fr/~jch/enseignement/reseaux/ * NTPMessage.java which is copyright (c) 2003 by Juliusz Chroboczek * - * TODO NOT 2036-compliant, see RFC 4330 + *

Year 2036 compliance

+ * + * Prior to 0.9.50, this supported years 1900-2035. + * As of 0.9.50, this supports years 1968-2104 and is year-2036 compliant. + * All double timestamps are the actual seconds since 1900. + * We use a "pivot" of January 1968. + * NTP-format dates before 1968 are coverted to 2036+. + * So this code handles the last half of era 0 and the first half of era 1, + * i.e. 1968-2104. + * All math and comparisons on timestamps must be on the double values, + * never on the raw NTP-format byte arrays. + * + * refs: + * https://docs.ntpsec.org/latest/rollover.html + * https://www.eecis.udel.edu/~mills/y2k.html + * https://www.eecis.udel.edu/~mills/time.html + * https://tools.ietf.org/html/rfc4330 sec. 3 * * @author Adam Buckley * @since 0.9.1 moved from net.i2p.time */ class NtpMessage { + + // Jan. 19, 1968, halfway through era 0, the earliest date we can handle + private static final double SECONDS_PIVOT = 1L << 31; + // Feb. 8, 2036, the start of era 1 + private static final double SECONDS_ERA = 1L << 32; + // Feb. 26, 2104, halfway through era 1, the latest date we can handle + private static final double SECONDS_END = 3L << 31; + /** * This is a two-bit code warning of an impending leap second to be * inserted/deleted in the last minute of the current day. Its values @@ -376,6 +400,8 @@ * and return it as a double, according to the NTP 64-bit timestamp * format. * + * 2036-compliant as of 0.9.50 + * * @param array 8 bytes starting at pointer * @param pointer the offset * @return the time since 1900 (NOT Java time) @@ -386,14 +412,20 @@ for(int i=0; i<8; i++) { r += unsignedByteToShort(array[pointer+i]) * Math.pow(2, (3-i)*8); } - + // 2036-compliance + if (r < SECONDS_PIVOT && r > 0d) + r += SECONDS_ERA; return r; } /** - * Encodes a timestamp in the specified position in the message + * Encodes a timestamp in the specified position in the message. + * + * 2036-compliant as of 0.9.50. + * Timestamps before 1968 will be encoded as Jan. 1968. + * Timestamps after Feb. 2104 will be encoded as Feb. 2104. * * @param array output 8 bytes starting at pointer * @param pointer the offset @@ -405,6 +437,19 @@ Arrays.fill(array, pointer, pointer + 8, (byte) 0); return; } + // 2036-compliance + if (timestamp < SECONDS_PIVOT) { + // very borked + timestamp = SECONDS_PIVOT; + } else if (timestamp >= SECONDS_END) { + // very borked + timestamp = SECONDS_END - 1; + } else if (timestamp >= SECONDS_ERA) { + timestamp -= SECONDS_ERA; + // 0 is special, don't send 0 + if (timestamp == 0d) + timestamp = .001d; + } // Converts a double into a 64-bit fixed point // 6 bytes of real data @@ -505,4 +550,42 @@ return ""; } + +/* + // Test 2036 rollover + public static void main(String[] args) { + byte[] x = new byte[8]; + byte[] y = new byte[8]; + test(x, y); + x[0] = (byte) 0x80; + test(x, y); + x[0] = (byte) 0x81; + test(x, y); + x[0] = (byte) 0xff; + test(x, y); + Arrays.fill(x, 1, 6, (byte) 0xff); + test(x, y); + x[0] = 0x40; + Arrays.fill(x, 1, 6, (byte) 0); + test(x, y); + x[0] = 0x7f; + test(x, y); + Arrays.fill(x, 1, 6, (byte) 0xff); + test(x, y); + } + + private static void test(byte[] x, byte[] y) { + double d = decodeTimestamp(x, 0); + encodeTimestamp(y, 0, d); + System.out.println(net.i2p.util.HexDump.dump(x)); + System.out.println(net.i2p.util.HexDump.dump(y)); + System.out.println("Date: " + timestampToString(d)); + // skip 2 random bytes at end + if (net.i2p.data.DataHelper.eq(x, 0, y, 0, 6)) + System.out.println("PASS\n"); + else + System.out.println("FAIL\n"); + + } +*/ } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java i2p-0.9.50/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java 2021-05-19 12:12:00.000000000 +0000 @@ -9,9 +9,11 @@ */ import java.io.IOException; +import java.io.Serializable; import java.io.Writer; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Set; @@ -268,10 +270,32 @@ //if (_context.router().isHidden()) // return Collections.EMPTY_SET; List addresses = new ArrayList(_manager.getAddresses()); + if (addresses.size() > 1) + Collections.sort(addresses, new AddrComparator()); if (_log.shouldLog(Log.INFO)) _log.info("Creating addresses: " + addresses, new Exception("creator")); return addresses; } + + /** + * Arbitrary sort for consistency. + * Note that the console UI has its own sorter. + * @since 0.9.50 + */ + private static class AddrComparator implements Comparator, Serializable { + public int compare(RouterAddress l, RouterAddress r) { + int rv = l.getCost() - r.getCost(); + if (rv != 0) + return rv; + int lh = l.hashCode(); + int rh = l.hashCode(); + if (lh > rh) + return 1; + if (lh < rh) + return -1; + return 0; + } + } /** * UDP changed addresses, tell NTCP and restart @@ -299,21 +323,19 @@ if (ip != null || port > 0) _manager.externalAddressReceived(Transport.AddressSource.SOURCE_SSU, ip, port); else - notifyRemoveAddress(false); + notifyRemoveAddress(udpAddr); } /** * Tell other transports our address changed * - * @param address non-null; but address's host/IP may be null + * @param address may be null; or address's host/IP may be null * @since 0.9.20 */ @Override public void notifyRemoveAddress(RouterAddress address) { // just keep this simple for now, multiple v4 or v6 addresses not yet supported - notifyRemoveAddress(address != null && - address.getIP() != null && - address.getIP().length == 16); + notifyRemoveAddress(address != null && TransportUtil.isIPv6(address)); } /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java i2p-0.9.50/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java 2021-05-19 12:12:00.000000000 +0000 @@ -7,7 +7,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import net.i2p.I2PAppContext; +import net.i2p.router.RouterContext; import net.i2p.router.util.PQEntry; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -33,7 +33,7 @@ */ public class FIFOBandwidthLimiter { private final Log _log; - private final I2PAppContext _context; + private final RouterContext _context; private final List _pendingInboundRequests; private final List _pendingOutboundRequests; /** how many bytes we can consume for inbound transmission immediately */ @@ -84,7 +84,7 @@ return System.currentTimeMillis(); } - public FIFOBandwidthLimiter(I2PAppContext context) { + public FIFOBandwidthLimiter(RouterContext context) { _context = context; _log = context.logManager().getLog(FIFOBandwidthLimiter.class); _context.statManager().createRateStat("bwLimiter.pendingOutboundRequests", "How many outbound requests are ahead of the current one (ignoring ones with 0)?", "BandwidthLimiter", new long[] { 5*60*1000l, 60*60*1000l }); @@ -187,13 +187,18 @@ } /** - * We sent a message. + * We intend to send traffic for a participating tunnel + * with the given size and adjustment factor. + * Returns true if the message can be sent within the current + * share bandwidth limits, or false if it should be dropped. * * @param size bytes + * @param factor multiplier of size for the drop calculation, 1 for no adjustment + * @return true for accepted, false for drop * @since 0.8.12 */ - public void sentParticipatingMessage(int size) { - _refiller.incrementParticipatingMessageBytes(size); + public boolean sentParticipatingMessage(int size, float factor) { + return _refiller.incrementParticipatingMessageBytes(size, factor); } /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java i2p-0.9.50/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java 2021-05-19 12:12:00.000000000 +0000 @@ -5,8 +5,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; -import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; +import net.i2p.router.RouterContext; import net.i2p.router.transport.FIFOBandwidthLimiter.Request; import net.i2p.util.Log; @@ -22,8 +22,11 @@ */ public class FIFOBandwidthRefiller implements Runnable { private final Log _log; - private final I2PAppContext _context; + private final RouterContext _context; private final FIFOBandwidthLimiter _limiter; + // This is only changed if the config changes + private volatile SyntheticREDQueue _partBWE; + /** how many KBps do we want to allow? */ private int _inboundKBytesPerSecond; /** how many KBps do we want to allow? */ @@ -76,6 +79,9 @@ * See util/DecayingBloomFilter and tunnel/BloomFilterIVValidator. */ public static final int MAX_OUTBOUND_BANDWIDTH = 16384; + + private static final float MAX_SHARE_PERCENTAGE = 0.90f; + private static final float SHARE_LIMIT_FACTOR = 0.95f; /** * how often we replenish the queues. @@ -83,10 +89,11 @@ */ private static final long REPLENISH_FREQUENCY = 40; - FIFOBandwidthRefiller(I2PAppContext context, FIFOBandwidthLimiter limiter) { + FIFOBandwidthRefiller(RouterContext context, FIFOBandwidthLimiter limiter) { _limiter = limiter; _context = context; _log = context.logManager().getLog(FIFOBandwidthRefiller.class); + _context.statManager().createRateStat("bwLimiter.participatingBandwidthQueue", "size in bytes", "BandwidthLimiter", new long[] { 5*60*1000l, 60*60*1000l }); reinitialize(); _isRunning = true; } @@ -100,6 +107,7 @@ // bootstrap 'em with nothing _lastRefillTime = _limiter.now(); List buffer = new ArrayList(2); + byte i = 0; while (_isRunning) { long now = _limiter.now(); if (now >= _lastCheckConfigTime + _configCheckPeriodMs) { @@ -107,8 +115,10 @@ now = _limiter.now(); _lastCheckConfigTime = now; } + // just for the stats + if ((++i) == 0) + updateParticipating(now); - updateParticipating(now); boolean updated = updateQueues(buffer, now); if (updated) { _lastRefillTime = now; @@ -171,6 +181,16 @@ return false; } } + + /** + * In Bytes per second + */ + private int getShareBandwidth() { + int maxKBps = Math.min(_inboundKBytesPerSecond, _outboundKBytesPerSecond); + // limit to 90% so it doesn't clog up at the transport bandwidth limiter + float share = Math.min((float) _context.router().getSharePercentage(), MAX_SHARE_PERCENTAGE); + return (int) (maxKBps * share * 1024f * SHARE_LIMIT_FACTOR); + } private void checkConfig() { updateInboundRate(); @@ -179,7 +199,13 @@ updateOutboundBurstRate(); updateInboundPeak(); updateOutboundPeak(); - + + // if share bandwidth config changed, throw out the SyntheticREDQueue and make a new one + int maxBps = getShareBandwidth(); + if (_partBWE == null || maxBps != _partBWE.getMaxBandwidth()) { + _partBWE = new SyntheticREDQueue(_context, maxBps); + } + // We are always limited for now //_limiter.setInboundUnlimited(_inboundKBytesPerSecond <= 0); //_limiter.setOutboundUnlimited(_outboundKBytesPerSecond <= 0); @@ -300,33 +326,18 @@ int getInboundBurstKBytesPerSecond() { return _inboundBurstKBytesPerSecond; } /** - * Participating counter stuff below here - * TOTAL_TIME needs to be high enough to get a burst without dropping - * @since 0.8.12 - */ - private static final int TOTAL_TIME = 4000; - private static final int PERIODS = TOTAL_TIME / (int) REPLENISH_FREQUENCY; - /** count in current replenish period */ - private final AtomicInteger _currentParticipating = new AtomicInteger(); - private long _lastPartUpdateTime; - private int _lastTotal; - /** the actual length of last total period as coalesced (nominally TOTAL_TIME) */ - private long _lastTotalTime; - private int _lastIndex; - /** buffer of count per replenish period, last is at _lastIndex, older at higher indexes (wraps) */ - private final int[] _counts = new int[PERIODS]; - /** the actual length of the period (nominally REPLENISH_FREQUENCY) */ - private final long[] _times = new long[PERIODS]; - private final ReentrantReadWriteLock _updateLock = new ReentrantReadWriteLock(false); - - /** - * We sent a message. + * We intend to send traffic for a participating tunnel + * with the given size and adjustment factor. + * Returns true if the message can be sent within the current + * share bandwidth limits, or false if it should be dropped. * * @param size bytes + * @param factor multiplier of size for the drop calculation, 1 for no adjustment + * @return true for accepted, false for drop * @since 0.8.12 */ - void incrementParticipatingMessageBytes(int size) { - _currentParticipating.addAndGet(size); + boolean incrementParticipatingMessageBytes(int size, float factor) { + return _partBWE.offer(size, factor); } /** @@ -336,68 +347,18 @@ * @since 0.8.12 */ int getCurrentParticipatingBandwidth() { - _updateLock.readLock().lock(); - try { - return locked_getCurrentParticipatingBandwidth(); - } finally { - _updateLock.readLock().unlock(); - } - } - - private int locked_getCurrentParticipatingBandwidth() { - int current = _currentParticipating.get(); - long totalTime = (_limiter.now() - _lastPartUpdateTime) + _lastTotalTime; - if (totalTime <= 0) - return 0; - // 1000 for ms->seconds in denominator - long bw = 1000l * (current + _lastTotal) / totalTime; - if (bw > Integer.MAX_VALUE) - return 0; - return (int) bw; + return (int) (_partBWE.getBandwidthEstimate() * 1000f); } /** - * Run once every replenish period + * Call a few times a minute to update the stats * * @since 0.8.12 */ private void updateParticipating(long now) { - _updateLock.writeLock().lock(); - try { - locked_updateParticipating(now); - } finally { - _updateLock.writeLock().unlock(); - } - } - - private void locked_updateParticipating(long now) { - long elapsed = now - _lastPartUpdateTime; - if (elapsed <= 0) { - // glitch in the matrix - _lastPartUpdateTime = now; - return; - } - _lastPartUpdateTime = now; - if (--_lastIndex < 0) - _lastIndex = PERIODS - 1; - _counts[_lastIndex] = _currentParticipating.getAndSet(0); - _times[_lastIndex] = elapsed; - _lastTotal = 0; - _lastTotalTime = 0; - // add up total counts and times - for (int i = 0; i < PERIODS; i++) { - int idx = (_lastIndex + i) % PERIODS; - _lastTotal += _counts[idx]; - _lastTotalTime += _times[idx]; - if (_lastTotalTime >= TOTAL_TIME) - break; - } - if (_lastIndex == 0 && _lastTotalTime > 0) { - long bw = 1000l * _lastTotal / _lastTotalTime; - _context.statManager().addRateData("tunnel.participatingBandwidthOut", bw); - if (_lastTotal > 0 && _log.shouldLog(Log.INFO)) - _log.info(DataHelper.formatSize(_lastTotal) + " bytes out part. tunnels in last " + _lastTotalTime + " ms: " + - DataHelper.formatSize(bw) + " Bps"); - } + _context.statManager().addRateData("tunnel.participatingBandwidthOut", getCurrentParticipatingBandwidth()); + // this one is not a required stat + if (_context.getBooleanProperty("stat.full")) + _context.statManager().addRateData("bwLimiter.participatingBandwidthQueue", (long) _partBWE.getQueueSizeEstimate()); } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/EstablishBase.java i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/EstablishBase.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/EstablishBase.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/EstablishBase.java 2021-05-19 12:12:00.000000000 +0000 @@ -7,54 +7,13 @@ import net.i2p.router.Router; import net.i2p.router.RouterContext; -import net.i2p.router.transport.crypto.DHSessionKeyBuilder; import net.i2p.util.Log; import net.i2p.util.SimpleByteCache; /** - * Inbound NTCP 1 or 2. Outbound NTCP 1 only. + * Inbound NTCP 2 only. * OutboundNTCP2State does not extend this. * - * NTCP 1 establishement overview: - * - * Handle the 4-phase establishment, which is as follows: - * - *
- *
- * Alice                   contacts                      Bob
- * =========================================================
- *
- * Message 1 (Session Request):
- *  X+(H(X) xor Bob.identHash)----------------------------->
- *
- * Message 2 (Session Created):
- *  <----------------------------------------Y+E(H(X+Y)+tsB, sk, Y[239:255])
- *
- * Message 3 (Session Confirm A):
- *  E(sz+Alice.identity+tsA+padding+S(X+Y+Bob.identHash+tsA+tsB), sk, hX_xor_Bob.identHash[16:31])--->
- *
- * Message 4 (Session Confirm B):
- *  <----------------------E(S(X+Y+Alice.identHash+tsA+tsB)+padding, sk, prev)
- *
- *  Key:
- *
- *    X, Y: 256 byte DH keys
- *    H(): 32 byte SHA256 Hash
- *    E(data, session key, IV): AES256 Encrypt
- *    S(): 40 byte DSA Signature, or length as implied by sig type
- *    tsA, tsB: timestamps (4 bytes, seconds since epoch)
- *    sk: 32 byte Session key
- *    sz: 2 byte size of Alice identity to follow
- *
- * 
- * - * - * Alternately, when Bob receives a connection, it could be a - * check connection (perhaps prompted by Bob asking for someone - * to verify his listener). check connections are formatted per - * isCheckInfo() - * NOTE: Check info is unused. - * * @since 0.9.35 pulled out of EstablishState */ abstract class EstablishBase implements EstablishState { @@ -94,8 +53,6 @@ /** bytes received so far */ protected int _received; - protected final DHSessionKeyBuilder _dh; - protected final NTCPTransport _transport; protected final NTCPConnection _con; @@ -114,28 +71,7 @@ protected enum State { OB_INIT, - /** sent 1 */ - OB_SENT_X, - /** sent 1, got 2 partial */ - OB_GOT_Y, - /** sent 1, got 2 */ - OB_GOT_HXY, - /** sent 1, got 2, sent 3 */ - OB_SENT_RI, - /** sent 1, got 2, sent 3, got 4 */ - OB_GOT_SIG, - IB_INIT, - /** got 1 partial */ - IB_GOT_X, - /** got 1 */ - IB_GOT_HX, - /** got 1, sent 2 */ - IB_SENT_Y, - /** got 1, sent 2, got partial 3 */ - IB_GOT_RI_SIZE, - /** got 1, sent 2, got 3 */ - IB_GOT_RI, /** * Next state IB_NTCP2_GOT_X @@ -187,7 +123,6 @@ _Y = null; _hX_xor_bobIdentHash = null; _curDecrypted = null; - _dh = null; _transport = null; _con = null; _e_hXY_tsB = null; @@ -198,19 +133,13 @@ _log = ctx.logManager().getLog(getClass()); _transport = transport; _con = con; - // null if NTCP1 disabled - _dh = _transport.getDHBuilder(); _hX_xor_bobIdentHash = SimpleByteCache.acquire(HXY_SIZE); if (_con.isInbound()) { _X = SimpleByteCache.acquire(XY_SIZE); - _Y = (_dh != null) ?_dh.getMyPublicValueBytes() : null; + _Y = null; } else { // OutboundNTCP2State does not extend this, - // can't get here with NTCP1 disabled - if (_dh == null) throw new IllegalStateException(); - _X = _dh.getMyPublicValueBytes(); - _Y = SimpleByteCache.acquire(XY_SIZE); } _e_hXY_tsB = new byte[HXY_TSB_PAD_SIZE]; @@ -314,8 +243,6 @@ SimpleByteCache.release(_prevEncrypted); SimpleByteCache.release(_curDecrypted); SimpleByteCache.release(_hX_xor_bobIdentHash); - if (_dh != null && _dh.getPeerPublicValue() == null) - _transport.returnUnused(_dh); } /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java 2021-05-19 12:12:00.000000000 +0000 @@ -40,7 +40,7 @@ /** * - * NTCP 1 or 2. We are Bob. + * NTCP 2. We are Bob. * * @since 0.9.35 pulled out of EstablishState */ @@ -74,7 +74,6 @@ private static final int MAX_DATA_READ_BUFS = 32; private static final ByteCache _dataReadBufs = ByteCache.getInstance(MAX_DATA_READ_BUFS, BUFFER_SIZE); - private static final int NTCP1_MSG1_SIZE = XY_SIZE + HXY_SIZE; // 287 - 64 = 223 private static final int PADDING1_MAX = TOTAL1_MAX - MSG1_SIZE; private static final int PADDING1_FAIL_MAX = 128; @@ -89,7 +88,6 @@ private static final Set STATES_NTCP2 = EnumSet.of(State.IB_NTCP2_INIT, State.IB_NTCP2_GOT_X, State.IB_NTCP2_GOT_PADDING, State.IB_NTCP2_SENT_Y, State.IB_NTCP2_GOT_RI, State.IB_NTCP2_READ_RANDOM); - private static final Set STATES_MSG3 = EnumSet.of(State.IB_SENT_Y, State.IB_GOT_RI_SIZE, State.IB_GOT_RI); public InboundEstablishState(RouterContext ctx, NTCPTransport transport, NTCPConnection con) { @@ -123,17 +121,7 @@ * @since 0.9.35 */ public int getVersion() { - if (!_transport.isNTCP2Enabled()) - return 1; - if (!_transport.isNTCP1Enabled()) return 2; - synchronized (_stateLock) { - if (_state == State.IB_INIT) - return 0; - if (STATES_NTCP2.contains(_state)) - return 2; - return 1; - } } /** @@ -153,7 +141,7 @@ } if (_state == State.IB_INIT && src.hasRemaining()) { int remaining = src.remaining(); - if (_transport.isNTCP2Enabled()) { + if (remaining + _received < MSG1_SIZE) { // Less than 64 total received, so we defer the NTCP 1 or 2 decision. // Buffer in _X. @@ -164,8 +152,8 @@ _log.warn("Short buffer got " + remaining + " total now " + _received + " on " + this); return; } - if (remaining + _received < NTCP1_MSG1_SIZE || - !_transport.isNTCP1Enabled()) { + //if (remaining + _received < NTCP1_MSG1_SIZE || + // !_transport.isNTCP1Enabled()) { // Less than 288 total received, assume NTCP2 // TODO can't change our mind later if we get more than 287 _con.setVersion(2); @@ -173,343 +161,8 @@ receiveInboundNTCP2(src); // releaseBufs() will return the unused DH return; - } - } - int toGet = Math.min(remaining, XY_SIZE - _received); - src.get(_X, _received, toGet); - _received += toGet; - if (_received < XY_SIZE) - return; - changeState(State.IB_GOT_X); - _received = 0; - } - - if (_state == State.IB_GOT_X && src.hasRemaining()) { - int toGet = Math.min(src.remaining(), HXY_SIZE - _received); - src.get(_hX_xor_bobIdentHash, _received, toGet); - _received += toGet; - if (_received < HXY_SIZE) - return; - changeState(State.IB_GOT_HX); - _received = 0; - } - - if (_state == State.IB_GOT_HX) { - - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"Enough data for a DH received"); - - // first verify that Alice knows who she is trying to talk with and that the X - // isn't corrupt - byte[] realXor = SimpleByteCache.acquire(HXY_SIZE); - _context.sha().calculateHash(_X, 0, XY_SIZE, realXor, 0); - xor32(_context.routerHash().getData(), realXor); - if (!DataHelper.eq(realXor, _hX_xor_bobIdentHash)) { - SimpleByteCache.release(realXor); - _context.statManager().addRateData("ntcp.invalidHXxorBIH", 1); - fail("Invalid hX_xor"); - return; - } - SimpleByteCache.release(realXor); - if (!_transport.isHXHIValid(_hX_xor_bobIdentHash)) { - // blocklist source? but spoofed IPs could DoS us - _context.statManager().addRateData("ntcp.replayHXxorBIH", 1); - fail("Replay hX_xor"); - return; - } - - try { - // ok, they're actually trying to talk to us, and we got their (unauthenticated) X - _dh.setPeerPublicValue(_X); - _dh.getSessionKey(); // force the calc - System.arraycopy(_hX_xor_bobIdentHash, AES_SIZE, _prevEncrypted, 0, AES_SIZE); - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"DH session key calculated (" + _dh.getSessionKey().toBase64() + ")"); - - // now prepare our response: Y+E(H(X+Y)+tsB+padding, sk, Y[239:255]) - byte xy[] = new byte[XY_SIZE + XY_SIZE]; - System.arraycopy(_X, 0, xy, 0, XY_SIZE); - System.arraycopy(_Y, 0, xy, XY_SIZE, XY_SIZE); - byte[] hxy = SimpleByteCache.acquire(HXY_SIZE); - _context.sha().calculateHash(xy, 0, XY_SIZE + XY_SIZE, hxy, 0); - // our (Bob's) timestamp in seconds - _tsB = (_context.clock().now() + 500) / 1000l; - byte toEncrypt[] = new byte[HXY_TSB_PAD_SIZE]; // 48 - System.arraycopy(hxy, 0, toEncrypt, 0, HXY_SIZE); - byte tsB[] = DataHelper.toLong(4, _tsB); - System.arraycopy(tsB, 0, toEncrypt, HXY_SIZE, tsB.length); - _context.random().nextBytes(toEncrypt, HXY_SIZE + 4, 12); - if (_log.shouldLog(Log.DEBUG)) { - _log.debug(prefix()+"h(x+y)="+Base64.encode(hxy)); - _log.debug(prefix() + "tsb = " + _tsB); - _log.debug(prefix()+"unencrypted H(X+Y)+tsB+padding: " + Base64.encode(toEncrypt)); - _log.debug(prefix()+"encryption iv= " + Base64.encode(_Y, XY_SIZE-AES_SIZE, AES_SIZE)); - _log.debug(prefix()+"encryption key= " + _dh.getSessionKey().toBase64()); - } - SimpleByteCache.release(hxy); - _context.aes().encrypt(toEncrypt, 0, _e_hXY_tsB, 0, _dh.getSessionKey(), - _Y, XY_SIZE-AES_SIZE, HXY_TSB_PAD_SIZE); - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"encrypted H(X+Y)+tsB+padding: " + Base64.encode(_e_hXY_tsB)); - byte write[] = new byte[XY_SIZE + HXY_TSB_PAD_SIZE]; - System.arraycopy(_Y, 0, write, 0, XY_SIZE); - System.arraycopy(_e_hXY_tsB, 0, write, XY_SIZE, HXY_TSB_PAD_SIZE); - - // ok, now that is prepared, we want to actually send it, so make sure we are up for writing - changeState(State.IB_SENT_Y); - _transport.getPumper().wantsWrite(_con, write); - if (!src.hasRemaining()) return; - } catch (DHSessionKeyBuilder.InvalidPublicParameterException e) { - _context.statManager().addRateData("ntcp.invalidDH", 1); - fail("Invalid X", e); - return; - } catch (IllegalStateException ise) { - // setPeerPublicValue() - fail("reused keys?", ise); - return; - } - - } - - // ok, we are onto the encrypted area, i.e. Message #3 - while (STATES_MSG3.contains(_state) && src.hasRemaining()) { - - // Collect a 16-byte block - if (_received < AES_SIZE && src.hasRemaining()) { - int toGet = Math.min(src.remaining(), AES_SIZE - _received); - src.get(_curEncrypted, _received, toGet); - _received += toGet; - if (_received < AES_SIZE) { - // no more bytes available in the buffer, and only a partial - // block was read, so we can't decrypt it. - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "end of available data with only a partial block read (" + - + _received + ")"); - return; - } - } - // Decrypt the 16-byte block - if (_received >= AES_SIZE) { - _context.aes().decrypt(_curEncrypted, 0, _curDecrypted, 0, _dh.getSessionKey(), - _prevEncrypted, 0, AES_SIZE); - - byte swap[] = _prevEncrypted; - _prevEncrypted = _curEncrypted; - _curEncrypted = swap; - _received = 0; - - if (_state == State.IB_SENT_Y) { // we are on the first decrypted block - int sz = (int)DataHelper.fromLong(_curDecrypted, 0, 2); - if (sz < MIN_RI_SIZE || sz > MAX_RI_SIZE) { - _context.statManager().addRateData("ntcp.invalidInboundSize", sz); - fail("size is invalid", new Exception("size is " + sz)); - return; - } - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "got the RI size: " + sz); - _aliceIdentSize = sz; - changeState(State.IB_GOT_RI_SIZE); - - // We must defer the calculations for total size of the message until - // we get the full alice ident so - // we can determine how long the signature is. - // See below - - } - try { - _sz_aliceIdent_tsA_padding_aliceSig.write(_curDecrypted); - } catch (IOException ioe) { - if (_log.shouldLog(Log.ERROR)) _log.error(prefix()+"Error writing to the baos?", ioe); - } - - if (_state == State.IB_GOT_RI_SIZE && - _sz_aliceIdent_tsA_padding_aliceSig.size() >= 2 + _aliceIdentSize) { - // we have enough to get Alice's RI and determine the sig+padding length - readAliceRouterIdentity(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "got the RI"); - if (_aliceIdent == null) { - // readAliceRouterIdentity already called fail - return; - } - SigType type = _aliceIdent.getSigningPublicKey().getType(); - if (type == null) { - fail("Unsupported sig type"); - return; - } - changeState(State.IB_GOT_RI); - // handle variable signature size - _sz_aliceIdent_tsA_padding_aliceSigSize = 2 + _aliceIdentSize + 4 + type.getSigLen(); - int rem = (_sz_aliceIdent_tsA_padding_aliceSigSize % AES_SIZE); - int padding = 0; - if (rem > 0) - padding = AES_SIZE-rem; - _sz_aliceIdent_tsA_padding_aliceSigSize += padding; - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "alice ident size decrypted as " + _aliceIdentSize + - ", making the padding at " + padding + " and total size at " + - _sz_aliceIdent_tsA_padding_aliceSigSize); - } - - if (_state == State.IB_GOT_RI && - _sz_aliceIdent_tsA_padding_aliceSig.size() >= _sz_aliceIdent_tsA_padding_aliceSigSize) { - // we have the remainder of Message #3, i.e. the padding+signature - // Time to verify. - - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "got the sig"); - verifyInbound(src); - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"verifying size (sz=" + _sz_aliceIdent_tsA_padding_aliceSig.size() - + " expected=" + _sz_aliceIdent_tsA_padding_aliceSigSize - + ' ' + _state - + ')'); - return; - } - } - } + //} - // check for remaining data - if (STATES_DONE.contains(_state) && src.hasRemaining()) { - if (_log.shouldWarn()) - _log.warn("Received unexpected " + src.remaining() + " on " + this, new Exception()); - } - - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"done with the data, not yet complete or corrupt"); - } - - /** - * We are Bob. We have received enough of message #3 from Alice - * to get Alice's RouterIdentity. - * - * _aliceIdentSize must be set. - * _sz_aliceIdent_tsA_padding_aliceSig must contain at least 2 + _aliceIdentSize bytes. - * - * Sets _aliceIdent so that we - * may determine the signature and padding sizes. - * - * After all of message #3 is received including the signature and - * padding, verifyIdentity() must be called. - * - * State must be IB_GOT_RI_SIZE. - * Caller must synch. - * - * @since 0.9.16 pulled out of verifyInbound() - */ - private void readAliceRouterIdentity() { - byte b[] = _sz_aliceIdent_tsA_padding_aliceSig.toByteArray(); - - try { - int sz = _aliceIdentSize; - if (sz < MIN_RI_SIZE || sz > MAX_RI_SIZE || - sz > b.length-2) { - _context.statManager().addRateData("ntcp.invalidInboundSize", sz); - fail("size is invalid", new Exception("size is " + sz)); - return; - } - RouterIdentity alice = new RouterIdentity(); - ByteArrayInputStream bais = new ByteArrayInputStream(b, 2, sz); - alice.readBytes(bais); - _aliceIdent = alice; - } catch (IOException ioe) { - _context.statManager().addRateData("ntcp.invalidInboundIOE", 1); - fail("Error verifying peer", ioe); - } catch (DataFormatException dfe) { - _context.statManager().addRateData("ntcp.invalidInboundDFE", 1); - fail("Error verifying peer", dfe); - } - } - - /** - * We are Bob. Verify message #3 from Alice, then send message #4 to Alice. - * NTCP 1 only. - * - * _aliceIdentSize and _aliceIdent must be set. - * _sz_aliceIdent_tsA_padding_aliceSig must contain at least - * (2 + _aliceIdentSize + 4 + padding + sig) bytes. - * - * Sets _aliceIdent so that we - * - * readAliceRouterIdentity() must have been called previously - * - * Make sure the signatures are correct, and if they are, update the - * NIOConnection with the session key / peer ident / clock skew / iv. - * The NIOConnection itself is responsible for registering with the - * transport - * - * State must be IB_GOT_RI. - * This will always change the state to VERIFIED or CORRUPT. - * Caller must synch. - * - * @param buf possibly containing "extra" data for data phase - */ - private void verifyInbound(ByteBuffer buf) { - byte b[] = _sz_aliceIdent_tsA_padding_aliceSig.toByteArray(); - try { - int sz = _aliceIdentSize; - // her timestamp from message #3 - long tsA = DataHelper.fromLong(b, 2+sz, 4); - // _tsB is when we sent message #2 - // Adjust backward by RTT/2 - long now = _context.clock().now(); - // rtt from sending #2 to receiving #3 - long rtt = now - _con.getCreated(); - _peerSkew = (now - (tsA * 1000) - (rtt / 2) + 500) / 1000; - - ByteArrayStream baos = new ByteArrayStream(256 + 256 + 32 + 4 + 4); - baos.write(_X); - baos.write(_Y); - baos.write(_context.routerHash().getData()); - baos.write(DataHelper.toLong(4, tsA)); - baos.write(DataHelper.toLong(4, _tsB)); - //baos.write(b, 2+sz+4, b.length-2-sz-4-Signature.SIGNATURE_BYTES); - - byte toVerify[] = baos.toByteArray(); - - // handle variable signature size - SigType type = _aliceIdent.getSigningPublicKey().getType(); - if (type == null) { - fail("unsupported sig type"); - return; - } - byte s[] = new byte[type.getSigLen()]; - System.arraycopy(b, b.length-s.length, s, 0, s.length); - Signature sig = new Signature(type, s); - boolean ok = _context.dsa().verifySignature(sig, toVerify, _aliceIdent.getSigningPublicKey()); - Hash aliceHash = _aliceIdent.calculateHash(); - if (ok) { - ok = verifyInbound(aliceHash); - } - if (ok) { - _con.setRemotePeer(_aliceIdent); - sendInboundConfirm(aliceHash, tsA); - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"e_bobSig is " + _e_bobSig.length + " bytes long"); - byte iv[] = _curEncrypted; // reuse buf - System.arraycopy(_e_bobSig, _e_bobSig.length-AES_SIZE, iv, 0, AES_SIZE); - // this does not copy the IV, do not release to cache - // We are Bob, she is Alice, clock skew is Alice-Bob - // skew in seconds - _con.finishInboundEstablishment(_dh.getSessionKey(), _peerSkew, iv, _prevEncrypted); - changeState(State.VERIFIED); - if (buf.hasRemaining()) { - // process "extra" data - // This is unlikely for inbound, as we must reply with message 4 - if (_log.shouldWarn()) - _log.warn("extra data " + buf.remaining() + " on " + this); - _con.recvEncryptedI2NP(buf); - } - releaseBufs(true); - if (_log.shouldLog(Log.INFO)) - _log.info(prefix()+"Verified remote peer as " + aliceHash); - } else { - _context.statManager().addRateData("ntcp.invalidInboundSignature", 1); - // verifyInbound(aliceHash) called fail() - } - } catch (IOException ioe) { - _context.statManager().addRateData("ntcp.invalidInboundIOE", 1); - fail("Error verifying peer", ioe); } } @@ -607,45 +260,6 @@ return rv; } - /** - * We are Bob. Send message #4 to Alice. - * - * State must be VERIFIED. - * Caller must synch. - * - * @param h Alice's Hash - */ - private void sendInboundConfirm(Hash h, long tsA) { - // send Alice E(S(X+Y+Alice.identHash+tsA+tsB), sk, prev) - byte toSign[] = new byte[XY_SIZE + XY_SIZE + 32+4+4]; - int off = 0; - System.arraycopy(_X, 0, toSign, off, XY_SIZE); off += XY_SIZE; - System.arraycopy(_Y, 0, toSign, off, XY_SIZE); off += XY_SIZE; - System.arraycopy(h.getData(), 0, toSign, off, 32); off += 32; - DataHelper.toLong(toSign, off, 4, tsA); off += 4; - DataHelper.toLong(toSign, off, 4, _tsB); off += 4; - - // handle variable signature size - Signature sig = _context.dsa().sign(toSign, _context.keyManager().getSigningPrivateKey()); - int siglen = sig.length(); - int rem = siglen % AES_SIZE; - int padding; - if (rem > 0) - padding = AES_SIZE - rem; - else - padding = 0; - byte preSig[] = new byte[siglen + padding]; - System.arraycopy(sig.getData(), 0, preSig, 0, siglen); - if (padding > 0) - _context.random().nextBytes(preSig, siglen, padding); - _e_bobSig = new byte[preSig.length]; - _context.aes().encrypt(preSig, 0, _e_bobSig, 0, _dh.getSessionKey(), _e_hXY_tsB, HXY_TSB_PAD_SIZE - AES_SIZE, _e_bobSig.length); - - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "Sending encrypted inbound confirmation"); - _transport.getPumper().wantsWrite(_con, _e_bobSig); - } - //// NTCP2 below here /** @@ -765,11 +379,6 @@ fail("Clock Skew: " + _peerSkew, null, true); return; } - // If NTCP1 disabled, we allow longer padding - if (_padlen1 > PADDING1_MAX && _transport.isNTCP1Enabled()) { - fail("bad msg 1 padlen: " + _padlen1); - return; - } if (_msg3p2len < MSG3P2_MIN || _msg3p2len > MSG3P2_MAX) { fail("bad msg3p2 len: " + _msg3p2len); return; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java 2021-05-19 12:12:00.000000000 +0000 @@ -2,6 +2,7 @@ import java.io.Closeable; import java.io.IOException; +import java.net.InetAddress; import java.net.Inet6Address; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; @@ -18,7 +19,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import java.util.zip.Adler32; import com.southernstorm.noise.protocol.CipherState; @@ -58,26 +58,6 @@ * * Public only for UI peers page. Not a public API, not for external use. * - * The NTCP transport sends individual I2NP messages AES/256/CBC encrypted with - * a simple checksum. The unencrypted message is encoded as follows: - *
- *  +-------+-------+--//--+---//----+-------+-------+-------+-------+
- *  | sizeof(data)  | data | padding | adler checksum of sz+data+pad |
- *  +-------+-------+--//--+---//----+-------+-------+-------+-------+
- *
- * That message is then encrypted with the DH/2048 negotiated session key - * (station to station authenticated per the EstablishState class) using the - * last 16 bytes of the previous encrypted message as the IV. - * - * One special case is a metadata message where the sizeof(data) is 0. In - * that case, the unencrypted message is encoded as: - *
- *  +-------+-------+-------+-------+-------+-------+-------+-------+
- *  |       0       |      timestamp in seconds     | uninterpreted             
- *  +-------+-------+-------+-------+-------+-------+-------+-------+
- *          uninterpreted           | adler checksum of sz+data+pad |
- *  +-------+-------+-------+-------+-------+-------+-------+-------+
- *
* */ public class NTCPConnection implements Closeable { @@ -164,8 +144,6 @@ static final int BUFFER_SIZE = 16*1024; private static final int MAX_DATA_READ_BUFS = 16; private static final ByteCache _dataReadBufs = ByteCache.getInstance(MAX_DATA_READ_BUFS, BUFFER_SIZE); - /** 2 bytes for length and 4 for CRC */ - static final int NTCP1_MAX_MSG_SIZE = BUFFER_SIZE - (2 + 4); private static final int INFO_PRIORITY = OutNetMessage.PRIORITY_MY_NETDB_STORE_LOW; private static final String FIXED_RI_VERSION = "0.9.12"; @@ -249,8 +227,9 @@ this(ctx, transport, remAddr, false); _remotePeer = remotePeer; _version = version; - if (version == 1) { - _establishState = new OutboundEstablishState(ctx, transport, this); + if (version != 2) { + throw new IllegalArgumentException("bad version " + version); + //_establishState = new OutboundEstablishState(ctx, transport, this); } else { try { _establishState = new OutboundNTCP2State(ctx, transport, this); @@ -329,58 +308,6 @@ */ public void setRemotePeer(RouterIdentity ident) { _remotePeer = ident; } - /** - * We are Bob. NTCP1 only. - * - * Caller MUST call recvEncryptedI2NP() after, for any remaining bytes in receive buffer - * - * @param clockSkew OUR clock minus ALICE's clock in seconds (may be negative, obviously, but |val| should - * be under 1 minute) - * @param prevWriteEnd exactly 16 bytes, not copied, do not corrupt, the write AES IV - * @param prevReadEnd 16 or more bytes, last 16 bytes copied as the read AES IV - */ - void finishInboundEstablishment(SessionKey key, long clockSkew, byte prevWriteEnd[], byte prevReadEnd[]) { - NTCPConnection toClose = locked_finishInboundEstablishment(key, clockSkew, prevWriteEnd, prevReadEnd); - if (toClose != null) { - int drained = toClose.drainOutboundTo(_outbound); - if (_log.shouldWarn()) - _log.warn("Old connection closed: " + toClose + " replaced by " + this + "; drained " + drained); - _context.statManager().addRateData("ntcp.inboundEstablishedDuplicate", toClose.getUptime()); - toClose.close(); - } - enqueueInfoMessage(); - } - - /** - * We are Bob. NTCP1 only. - * - * @param clockSkew OUR clock minus ALICE's clock in seconds (may be negative, obviously, but |val| should - * be under 1 minute) - * @param prevWriteEnd exactly 16 bytes, not copied, do not corrupt, the write AES IV - * @param prevReadEnd 16 or more bytes, last 16 bytes copied as the read AES IV - * @return old conn to be closed by caller, or null - */ - private synchronized NTCPConnection locked_finishInboundEstablishment( - SessionKey key, long clockSkew, byte prevWriteEnd[], byte prevReadEnd[]) { - if (_establishState == EstablishBase.VERIFIED) { - IllegalStateException ise = new IllegalStateException("Already finished on " + this); - _log.error("Already finished", ise); - throw ise; - } - byte[] prevReadBlock = new byte[BLOCK_SIZE]; - System.arraycopy(prevReadEnd, prevReadEnd.length - BLOCK_SIZE, prevReadBlock, 0, BLOCK_SIZE); - _curReadState = new NTCP1ReadState(prevReadBlock); - _sessionKey = key; - _clockSkew = clockSkew; - _prevWriteEnd = prevWriteEnd; - _establishedOn = _context.clock().now(); - NTCPConnection rv = _transport.inboundEstablished(this); - _nextMetaTime = _establishedOn + (META_FREQUENCY / 2) + _context.random().nextInt(META_FREQUENCY); - _nextInfoTime = _establishedOn + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); - _establishState = EstablishBase.VERIFIED; - return rv; - } - /** * A positive number means our clock is ahead of theirs. * @return seconds @@ -658,10 +585,7 @@ * con is established, so we know what the version is. */ void enqueueInfoMessage() { - if (_version == 1) { - enqueueInfoMessageNTCP1(); - // may change to 2 for inbound - } else if (_isInbound) { + if (_isInbound) { // TODO or if outbound and it's not right at the beginning // TODO flood sendOurRouterInfo(false); @@ -670,56 +594,6 @@ } /** - * Inject a DatabaseStoreMessage with our RouterInfo. NTCP 1 only. - */ - private void enqueueInfoMessageNTCP1() { - int priority = INFO_PRIORITY; - if (_log.shouldDebug()) - _log.debug("SENDING INFO message pri. " + priority + ": " + toString()); - DatabaseStoreMessage dsm = new DatabaseStoreMessage(_context); - dsm.setEntry(_context.router().getRouterInfo()); - // We are injecting directly, so we can use a null target. - OutNetMessage infoMsg = new OutNetMessage(_context, dsm, _context.clock().now()+10*1000, priority, null); - infoMsg.beginSend(); - send(infoMsg); - } - - /** - * We are Alice. NTCP1 only. - * - * Caller MUST call recvEncryptedI2NP() after, for any remaining bytes in receive buffer - * - * @param clockSkew OUR clock minus BOB's clock in seconds (may be negative, obviously, but |val| should - * be under 1 minute) - * @param prevWriteEnd exactly 16 bytes, not copied, do not corrupt - * @param prevReadEnd 16 or more bytes, last 16 bytes copied - */ - synchronized void finishOutboundEstablishment(SessionKey key, long clockSkew, byte prevWriteEnd[], byte prevReadEnd[]) { - if (_establishState == EstablishBase.VERIFIED) { - IllegalStateException ise = new IllegalStateException("Already finished on " + this); - _log.error("Already finished", ise); - throw ise; - } - byte[] prevReadBlock = new byte[BLOCK_SIZE]; - System.arraycopy(prevReadEnd, prevReadEnd.length - BLOCK_SIZE, prevReadBlock, 0, BLOCK_SIZE); - _curReadState = new NTCP1ReadState(prevReadBlock); - _sessionKey = key; - _clockSkew = clockSkew; - _prevWriteEnd = prevWriteEnd; - if (_log.shouldLog(Log.DEBUG)) - _log.debug("outbound established (key=" + key + " skew=" + clockSkew + - " prevWriteEnd: " + Base64.encode(prevWriteEnd) + " prevReadBlock: " + Base64.encode(prevReadBlock)); - - _establishedOn = _context.clock().now(); - _establishState = EstablishBase.VERIFIED; - _transport.markReachable(getRemotePeer().calculateHash(), false); - _nextMetaTime = _establishedOn + (META_FREQUENCY / 2) + _context.random().nextInt(META_FREQUENCY); - _nextInfoTime = _establishedOn + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); - if (!_outbound.isEmpty()) - _transport.getWriter().wantsWrite(this, "outbound established"); - } - - /** * Prepare the next I2NP message for transmission. This should be run from * the Writer thread pool. NTCP 1 or 2. * @@ -738,115 +612,21 @@ if (!isEstablished()) { return; } - if (_version == 1) - prepareNextWriteFast(prep); - else - prepareNextWriteNTCP2(prep); - } - - /** - * Prepare the next I2NP message for transmission. This should be run from - * the Writer thread pool. NTCP 1 only. - * - * Caller must synchronize. - * @param buf a PrepBuffer to use as scratch space - * - */ - private void prepareNextWriteFast(PrepBuffer buf) { - long now = _context.clock().now(); - if (_nextMetaTime <= now) { - sendMeta(); - _nextMetaTime = now + (META_FREQUENCY / 2) + _context.random().nextInt(META_FREQUENCY / 2); - } - - OutNetMessage msg; - synchronized (_currentOutbound) { - if (!_currentOutbound.isEmpty()) { - if (_log.shouldLog(Log.INFO)) - _log.info("attempt for multiple outbound messages with " + _currentOutbound.size() + " already waiting and " + _outbound.size() + " queued"); - return; - } - while (true) { - msg = _outbound.poll(); - if (msg == null) - return; - if (msg.getExpiration() >= now) - break; - if (_log.shouldWarn()) - _log.warn("dropping message expired on queue: " + msg + " on " + this); - _transport.afterSend(msg, false, false, msg.getLifetime()); - } - _currentOutbound.add(msg); - } - - bufferedPrepare(msg, buf); - _context.aes().encrypt(buf.unencrypted, 0, buf.encrypted, 0, _sessionKey, _prevWriteEnd, 0, buf.unencryptedLength); - System.arraycopy(buf.encrypted, buf.encrypted.length-16, _prevWriteEnd, 0, _prevWriteEnd.length); - _transport.getPumper().wantsWrite(this, buf.encrypted); - - // for every 6-12 hours that we are connected to a peer, send them - // our updated netDb info (they may not accept it and instead query - // the floodfill netDb servers, but they may...) - if (_nextInfoTime <= now) { - // perhaps this should check to see if we are bw throttled, etc? - enqueueInfoMessage(); - _nextInfoTime = now + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); - } - } - - /** - * Serialize the message/checksum/padding/etc for transmission, but leave off - * the encryption. This should be called from a Writer thread - * - * @param msg message to send - * @param buf PrepBuffer to use as scratch space - */ - private void bufferedPrepare(OutNetMessage msg, PrepBuffer buf) { - I2NPMessage m = msg.getMessage(); - // 2 offset for size - int sz = m.toByteArray(buf.unencrypted, 2) - 2; - int min = 2 + sz + 4; - int rem = min % 16; - int padding = 0; - if (rem > 0) - padding = 16 - rem; - buf.unencryptedLength = min+padding; - DataHelper.toLong(buf.unencrypted, 0, 2, sz); - if (padding > 0) { - _context.random().nextBytes(buf.unencrypted, 2+sz, padding); - } - - buf.crc.update(buf.unencrypted, 0, buf.unencryptedLength-4); - - long val = buf.crc.getValue(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Outbound message " + _messagesWritten + " has crc " + val - + " sz=" +sz + " rem=" + rem + " padding=" + padding); - - DataHelper.toLong(buf.unencrypted, buf.unencryptedLength-4, 4, val); - // TODO object churn - // 1) store the length only - // 2) in prepareNextWriteFast(), pull a byte buffer off a queue and encrypt to that - // 3) change EventPumper.wantsWrite() to take a ByteBuffer arg - // 4) in EventPumper.processWrite(), release the byte buffer - buf.encrypted = new byte[buf.unencryptedLength]; + prepareNextWriteNTCP2(prep); } static class PrepBuffer { final byte unencrypted[]; - int unencryptedLength; - final Adler32 crc; - byte encrypted[]; + //int unencryptedLength; + //byte encrypted[]; public PrepBuffer() { unencrypted = new byte[BUFFER_SIZE]; - crc = new Adler32(); } public void init() { - unencryptedLength = 0; - encrypted = null; - crc.reset(); + //unencryptedLength = 0; + //encrypted = null; } } @@ -1386,39 +1166,6 @@ _curReadState.receive(buf); } - /* - * One special case is a metadata message where the sizeof(data) is 0. In - * that case, the unencrypted message is encoded as: - * - *
-    *  +-------+-------+-------+-------+-------+-------+-------+-------+
-    *  |       0       |      timestamp in seconds     | uninterpreted             
-    *  +-------+-------+-------+-------+-------+-------+-------+-------+
-    *          uninterpreted           | adler checksum of sz+data+pad |
-    *  +-------+-------+-------+-------+-------+-------+-------+-------+
-    * 
- * - * Caller must synch - * - * @param unencrypted 16 bytes starting at off - * @param off the offset - */ - private void readMeta(byte unencrypted[], int off) { - Adler32 crc = new Adler32(); - crc.update(unencrypted, off, META_SIZE - 4); - long expected = crc.getValue(); - long read = DataHelper.fromLong(unencrypted, off + META_SIZE - 4, 4); - if (read != expected) { - if (_log.shouldLog(Log.WARN)) - _log.warn("I2NP metadata message had a bad CRC value"); - _context.statManager().addRateData("ntcp.corruptMetaCRC", 1); - close(); - return; - } - long ts = DataHelper.fromLong(unencrypted, off + 2, 4); - receiveTimestamp(ts); - } - /** * Handle a received timestamp, NTCP 1 or 2. * Caller must synch @@ -1443,37 +1190,6 @@ _clockSkew = newSkew; } - /** - * One special case is a metadata message where the sizeof(data) is 0. In - * that case, the unencrypted message is encoded as: - * - *
-     *  +-------+-------+-------+-------+-------+-------+-------+-------+
-     *  |       0       |      timestamp in seconds     | uninterpreted             
-     *  +-------+-------+-------+-------+-------+-------+-------+-------+
-     *          uninterpreted           | adler checksum of sz+data+pad |
-     *  +-------+-------+-------+-------+-------+-------+-------+-------+
-     *
- * - * Caller must synchronize. - */ - private void sendMeta() { - byte[] data = new byte[META_SIZE]; - DataHelper.toLong(data, 0, 2, 0); - DataHelper.toLong(data, 2, 4, (_context.clock().now() + 500) / 1000); - _context.random().nextBytes(data, 6, 6); - Adler32 crc = new Adler32(); - crc.update(data, 0, META_SIZE - 4); - DataHelper.toLong(data, META_SIZE - 4, 4, crc.getValue()); - _context.aes().encrypt(data, 0, data, 0, _sessionKey, _prevWriteEnd, 0, META_SIZE); - System.arraycopy(data, META_SIZE - 16, _prevWriteEnd, 0, _prevWriteEnd.length); - // perhaps this should skip the bw limiter to reduce clock skew issues? - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Sending NTCP metadata"); - _sendingMeta = true; - _transport.getPumper().wantsWrite(this, data); - } - private static final int MAX_HANDLERS = 4; /** @@ -1514,319 +1230,6 @@ public int getFramesReceived(); } - /** - * Read the unencrypted message (16 bytes at a time). - * verify the checksum, and pass it on to - * an I2NPMessageHandler. The unencrypted message is encoded as follows: - * - *
-     *  +-------+-------+--//--+---//----+-------+-------+-------+-------+
-     *  | sizeof(data)  | data | padding | adler checksum of sz+data+pad |
-     *  +-------+-------+--//--+---//----+-------+-------+-------+-------+
-     *
- * - * sizeof(data)+data+pad+crc. - * - * perhaps to reduce the per-con memory footprint, we can acquire/release - * the ReadState._data and ._bais when _size is > 0, so there are only - * J 16KB buffers for the cons actually transmitting, instead of one per - * con (including idle ones) - * - * Call all methods from synchronized parent method. - * - */ - private class NTCP1ReadState implements ReadState { - private int _size; - private ByteArray _dataBuf; - private int _nextWrite; - private final Adler32 _crc; - private long _stateBegin; - private int _blocks; - /** encrypted block of the current I2NP message being read */ - private byte _curReadBlock[]; - /** next byte to which data should be placed in the _curReadBlock */ - private int _curReadBlockIndex; - private final byte _decryptBlockBuf[]; - /** last AES block of the encrypted I2NP message (to serve as the next block's IV) */ - private byte _prevReadBlock[]; - - /** - * @param prevReadBlock 16 bytes AES IV - */ - public NTCP1ReadState(byte[] prevReadBlock) { - _crc = new Adler32(); - _prevReadBlock = prevReadBlock; - _curReadBlock = new byte[BLOCK_SIZE]; - _decryptBlockBuf = new byte[BLOCK_SIZE]; - init(); - } - - private void init() { - _size = -1; - _nextWrite = 0; - _stateBegin = -1; - _blocks = -1; - _crc.reset(); - if (_dataBuf != null) - releaseReadBuf(_dataBuf); - _dataBuf = null; - _curReadBlockIndex = 0; - } - - /** @since 0.9.36 */ - public void destroy() { - if (_dataBuf != null) { - releaseReadBuf(_dataBuf); - _dataBuf = null; - } - // TODO zero things out - } - - /** - * Connection must be established! - * - * The contents of the buffer include some fraction of one or more - * encrypted and encoded I2NP messages. individual i2np messages are - * encoded as "sizeof(data)+data+pad+crc", and those are encrypted - * with the session key and the last 16 bytes of the previous encrypted - * i2np message. - * - * The NTCP connection now owns the buffer - * BUT it must copy out the data - * as reader will call EventPumper.releaseBuf(). - * - * @since 0.9.36 moved from parent class - */ - public void receive(ByteBuffer buf) { - // hasArray() is false for direct buffers, at least on my system... - if (_curReadBlockIndex == 0 && buf.hasArray()) { - // fast way - int tot = buf.remaining(); - if (tot >= 32 && tot % 16 == 0) { - recvEncryptedFast(buf); - return; - } - } - - while (buf.hasRemaining() && !_closed.get()) { - int want = Math.min(buf.remaining(), BLOCK_SIZE - _curReadBlockIndex); - if (want > 0) { - buf.get(_curReadBlock, _curReadBlockIndex, want); - _curReadBlockIndex += want; - } - if (_curReadBlockIndex >= BLOCK_SIZE) { - // cbc - _context.aes().decryptBlock(_curReadBlock, 0, _sessionKey, _decryptBlockBuf, 0); - xor16(_prevReadBlock, _decryptBlockBuf); - boolean ok = recvUnencryptedI2NP(); - if (!ok) { - if (_log.shouldLog(Log.INFO)) - _log.info("Read buffer " + System.identityHashCode(buf) + " contained corrupt data, IV was: " + Base64.encode(_decryptBlockBuf)); - _context.statManager().addRateData("ntcp.corruptDecryptedI2NP", 1); - return; - } - byte swap[] = _prevReadBlock; - _prevReadBlock = _curReadBlock; - _curReadBlock = swap; - _curReadBlockIndex = 0; - } - } - } - - /** - * Decrypt directly out of the ByteBuffer instead of copying the bytes - * 16 at a time to the _curReadBlock / _prevReadBlock flip buffers. - * - * More efficient but can only be used if buf.hasArray == true AND - * _curReadBlockIndex must be 0 and buf.getRemaining() % 16 must be 0 - * and buf.getRemaining() must be >= 16. - * All this is true for most incoming buffers. - * In theory this could be fixed up to handle the other cases too but that's hard. - * Caller must synchronize! - * - * @since 0.8.12, moved from parent class in 0.9.36 - */ - private void recvEncryptedFast(ByteBuffer buf) { - byte[] array = buf.array(); - int pos = buf.arrayOffset() + buf.position(); - int end = pos + buf.remaining(); - - // Copy to _curReadBlock for next IV... - System.arraycopy(array, end - BLOCK_SIZE, _curReadBlock, 0, BLOCK_SIZE); - // call aes().decrypt() to decrypt all at once, in place - // decrypt() will offload to the JVM/OS for larger sizes - _context.aes().decrypt(array, pos, array, pos, _sessionKey, _prevReadBlock, buf.remaining()); - - for ( ; pos < end; pos += BLOCK_SIZE) { - boolean ok = receiveBlock(array, pos); - if (!ok) { - if (_log.shouldLog(Log.INFO)) - _log.info("Read buffer " + System.identityHashCode(buf) + " contained corrupt data"); - _context.statManager().addRateData("ntcp.corruptDecryptedI2NP", 1); - return; - } - } - // ...and flip to _prevReadBlock for next time - byte swap[] = _prevReadBlock; - _prevReadBlock = _curReadBlock; - _curReadBlock = swap; - } - - /** - * Append the next 16 bytes of cleartext to the read state. - * _decryptBlockBuf contains another cleartext block of I2NP to parse. - * Caller must synchronize! - * - * @return success - * @since 0.9.36 moved from parent class - */ - private boolean recvUnencryptedI2NP() { - return receiveBlock(_decryptBlockBuf, 0); - } - - /** - * Caller must synchronize - * @param buf 16 bytes starting at off - * @param off offset - * @return success, only false on initial block with invalid size - */ - private boolean receiveBlock(byte buf[], int off) { - if (_size == -1) { - return receiveInitial(buf, off); - } else { - receiveSubsequent(buf, off); - return true; - } - } - - /** - * Caller must synchronize - * - * @param buf 16 bytes starting at off - * @param off offset - * @return success - */ - private boolean receiveInitial(byte buf[], int off) { - _size = (int)DataHelper.fromLong(buf, off, 2); - if (_size > BUFFER_SIZE) { - // this is typically an AES decryption error, not actually a large I2NP message - if (_log.shouldLog(Log.WARN)) - _log.warn("I2NP message too big - size: " + _size + " Closing " + NTCPConnection.this.toString(), new Exception()); - _context.statManager().addRateData("ntcp.corruptTooLargeI2NP", _size); - close(); - return false; - } - if (_size == 0) { - readMeta(buf, off); - init(); - } else { - _stateBegin = _context.clock().now(); - _dataBuf = acquireReadBuf(); - System.arraycopy(buf, off + 2, _dataBuf.getData(), 0, BLOCK_SIZE - 2); - _nextWrite += BLOCK_SIZE - 2; - _crc.update(buf, off, BLOCK_SIZE); - _blocks++; - if (_log.shouldLog(Log.DEBUG)) - _log.debug("new I2NP message with size: " + _size + " for message " + _messagesRead); - } - return true; - } - - /** - * Caller must synchronize - * - * @param buf 16 bytes starting at off - * @param off offset - */ - private void receiveSubsequent(byte buf[], int off) { - _blocks++; - int remaining = _size - _nextWrite; - int blockUsed = Math.min(BLOCK_SIZE, remaining); - if (remaining > 0) { - System.arraycopy(buf, off, _dataBuf.getData(), _nextWrite, blockUsed); - _nextWrite += blockUsed; - remaining -= blockUsed; - } - if ( (remaining <= 0) && (BLOCK_SIZE - blockUsed < 4) ) { - // we've received all the data but not the 4-byte checksum - if (_log.shouldLog(Log.DEBUG)) - _log.debug("crc wraparound required on block " + _blocks + " in message " + _messagesRead); - _crc.update(buf, off, BLOCK_SIZE); - return; - } else if (remaining <= 0) { - receiveLastBlock(buf, off); - } else { - _crc.update(buf, off, BLOCK_SIZE); - } - } - - /** - * This checks the checksum in buf only. - * All previous data, including that in buf, must have been copied to _dataBuf. - * Note that the checksum does not cover the padding. - * Caller must synchronize. - * - * @param buf 16 bytes starting at off - * @param off offset of the 16-byte block (NOT of the checksum only) - */ - private void receiveLastBlock(byte buf[], int off) { - // on the last block - long expectedCrc = DataHelper.fromLong(buf, off + BLOCK_SIZE - 4, 4); - _crc.update(buf, off, BLOCK_SIZE - 4); - long val = _crc.getValue(); - if (val == expectedCrc) { - try { - I2NPMessageHandler h = acquireHandler(_context); - - // Don't do readMessage(InputStream). I2NPMessageImpl.readBytes() copies the data - // from a stream to a temp buffer. - // We could extend BAIS to adjust the protected count variable to _size - // so that readBytes() doesn't read too far, but it could still read too far. - // So use the new handler method that limits the size. - h.readMessage(_dataBuf.getData(), 0, _size); - I2NPMessage read = h.lastRead(); - long timeToRecv = _context.clock().now() - _stateBegin; - releaseHandler(h); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("I2NP message " + _messagesRead + "/" + (read != null ? read.getUniqueId() : 0) - + " received after " + timeToRecv + " with " + _size +"/"+ (_blocks*16) + " bytes on " + NTCPConnection.this.toString()); - _context.statManager().addRateData("ntcp.receiveTime", timeToRecv); - _context.statManager().addRateData("ntcp.receiveSize", _size); - - // FIXME move end of try block here. - // On the input side, move releaseHandler() and init() to a finally block. - - if (read != null) { - _transport.messageReceived(read, _remotePeer, null, timeToRecv, _size); - _lastReceiveTime = _context.clock().now(); - _messagesRead.incrementAndGet(); - } - } catch (I2NPMessageException ime) { - if (_log.shouldLog(Log.WARN)) { - _log.warn("Error parsing I2NP message on " + NTCPConnection.this + - "\nDUMP:\n" + HexDump.dump(_dataBuf.getData(), 0, _size), - ime); - } - _context.statManager().addRateData("ntcp.corruptI2NPIME", 1); - } - } else { - if (_log.shouldLog(Log.WARN)) - _log.warn("CRC incorrect for message " + _messagesRead + " (calc=" + val + " expected=" + expectedCrc + - ") size=" + _size + " blocks=" + _blocks + " on: " + NTCPConnection.this); - _context.statManager().addRateData("ntcp.corruptI2NPCRC", 1); - } - // get it ready for the next I2NP message - init(); - } - - /* - * Dummy. - * @return 0 always - * @since 0.9.36 - */ - public int getFramesReceived() { return 0; } - } - //// NTCP2 below here /** @@ -2357,9 +1760,16 @@ @Override public String toString() { + String fromIP; + if (_isInbound) { + InetAddress addr = _chan.socket().getInetAddress(); + fromIP = addr != null ? addr.getHostAddress() : "unknown"; + } else { + fromIP = null; + } return "NTCP" + _version + " conn " + _connID + - (_isInbound ? (" from " + _chan.socket().getInetAddress() + " port " + _chan.socket().getPort() + ' ') + (_isInbound ? (" from " + fromIP + " port " + _chan.socket().getPort() + ' ') : (" to " + _remAddr.getHost() + " port " + _remAddr.getPort() + ' ')) + (_remotePeer == null ? "unknown" : _remotePeer.calculateHash().toBase64().substring(0,6)) + (isEstablished() ? "" : " not established") + diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java 2021-05-19 12:12:00.000000000 +0000 @@ -112,7 +112,6 @@ public static final String PROP_BIND_INTERFACE = "i2np.ntcp.bindInterface"; private final NTCPSendFinisher _finisher; - private final DHSessionKeyBuilder.Factory _dhFactory; private final X25519KeyFactory _xdhFactory; private long _lastBadSkew; private static final long[] RATES = { 10*60*1000 }; @@ -138,8 +137,6 @@ private static final int NTCP2_KEY_LEN = OutboundNTCP2State.KEY_SIZE; private static final long MIN_DOWNTIME_TO_REKEY = 30*24*60*60*1000L; private static final long MIN_DOWNTIME_TO_REKEY_HIDDEN = 24*60*60*1000L; - private final boolean _enableNTCP1; - private final boolean _enableNTCP2; private final byte[] _ntcp2StaticPubkey; private final byte[] _ntcp2StaticPrivkey; private final byte[] _ntcp2StaticIV; @@ -147,12 +144,11 @@ private final String _b64Ntcp2StaticIV; /** - * @param dh null to disable NTCP1 + * @param dh unused, ignored * @param xdh null to disable NTCP2 */ public NTCPTransport(RouterContext ctx, DHSessionKeyBuilder.Factory dh, X25519KeyFactory xdh) { super(ctx); - _dhFactory = dh; _xdhFactory = xdh; _log = ctx.logManager().getLog(getClass()); @@ -242,11 +238,9 @@ _transientFail = new SharedBid(TransportBid.TRANSIENT_FAIL); setupPort(); - _enableNTCP1 = dh != null; - _enableNTCP2 = xdh != null; - if (!_enableNTCP1 && !_enableNTCP2) + if (xdh == null) throw new IllegalArgumentException(); - if (_enableNTCP2) { + boolean shouldSave = false; byte[] priv = null; byte[] iv = null; @@ -295,13 +289,7 @@ _ntcp2StaticIV = iv; _b64Ntcp2StaticPubkey = Base64.encode(_ntcp2StaticPubkey); _b64Ntcp2StaticIV = b64IV; - } else { - _ntcp2StaticPubkey = null; - _ntcp2StaticPrivkey = null; - _ntcp2StaticIV = null; - _b64Ntcp2StaticPubkey = null; - _b64Ntcp2StaticIV = null; - } + } /** @@ -416,7 +404,8 @@ // Queue the message, and our RI // doesn't do anything yet, just enqueues it con.send(msg); - con.enqueueInfoMessage(); + // does nothing for outbound NTCP2 + //con.enqueueInfoMessage(); } else if (shouldFlood || newVersion == 1) { // Queue the message, which is a DSM of our RI con.send(msg); @@ -501,9 +490,8 @@ return null; // passed in dataSize assumes 16 byte header, if NTCP2 then // we have a 9-byte header so there's 7 to spare - if (dataSize > NTCPConnection.NTCP2_MAX_MSG_SIZE + 7 || - (!_enableNTCP2 && dataSize > NTCPConnection.NTCP1_MAX_MSG_SIZE)) { - // Too big for NTCP2, or NTCP2 disabled and too big for NTCP1 + if (dataSize > NTCPConnection.NTCP2_MAX_MSG_SIZE + 7) { + // Too big for NTCP2 // Let SSU deal with it _context.statManager().addRateData("ntcp.noBidTooLargeI2NP", dataSize); return null; @@ -521,14 +509,6 @@ boolean established = isEstablished(peer); if (established) { // should we check the queue size? nah, if its valid, use it - if (dataSize > NTCPConnection.NTCP1_MAX_MSG_SIZE) { - // Must be version 2 to send a big message - NTCPConnection con = _conByIdent.get(peer); - if (con == null || con.getVersion() < NTCP2_INT_VERSION) { - _context.statManager().addRateData("ntcp.noBidTooLargeI2NP", dataSize); - return null; - } - } return _fastBid; } if (toAddress.getNetworkId() != _networkID) { @@ -538,12 +518,6 @@ markUnreachable(peer); return null; } - if (dataSize > NTCPConnection.NTCP1_MAX_MSG_SIZE) { - // Not established, too big for NTCP 1, let SSU deal with it - // TODO look at his addresses to see if NTCP2 supported? - _context.statManager().addRateData("ntcp.noBidTooLargeI2NP", dataSize); - return null; - } RouterAddress addr = getTargetAddress(toAddress); if (addr == null) { @@ -865,29 +839,46 @@ // all detected interfaces Collection addrs = getSavedLocalAddresses(); if (!addrs.isEmpty() && !_context.router().isHidden()) { + int count = 0; + boolean skipv4 = false; + boolean skipv6 = false; for (InetAddress ia : addrs) { + boolean ipv6 = ia instanceof Inet6Address; + if ((ipv6 && (isIPv6Firewalled() || _context.getBooleanProperty(PROP_IPV6_FIREWALLED))) || + (!ipv6 && isIPv4Firewalled())) { + if (ipv6) + skipv6 = true; + else + skipv4 = true; + continue; + } OrderedProperties props = new OrderedProperties(); props.setProperty(RouterAddress.PROP_HOST, ia.getHostAddress()); props.setProperty(RouterAddress.PROP_PORT, Integer.toString(port)); addNTCP2Options(props); - boolean ipv6 = ia instanceof Inet6Address; - if (!ipv6 || !_context.getBooleanProperty(PROP_IPV6_FIREWALLED)) { - int cost = getDefaultCost(ipv6); - myAddress = new RouterAddress(getPublishStyle(), props, cost); - replaceAddress(myAddress); - } + int cost = getDefaultCost(ipv6); + myAddress = new RouterAddress(getPublishStyle(), props, cost); + replaceAddress(myAddress); + count++; } - } else if (_enableNTCP2) { + if (count <= 0) { + setOutboundNTCP2Address(); + } else if (skipv6) { + setOutboundNTCP2Address(true); + } else if (skipv4) { + setOutboundNTCP2Address(false); + } + } else { setOutboundNTCP2Address(); } - } else if (_enableNTCP2) { + } else { setOutboundNTCP2Address(); } // TransportManager.startListening() calls router.rebuildRouterInfo() } /** - * Outbound only, NTCP2 with "s" and "v" only + * Outbound only, both IPv4 and IPv6, NTCP2 with "s" and "v" only * @since 0.9.36 */ private void setOutboundNTCP2Address() { @@ -898,6 +889,34 @@ } /** + * Outbound only, either IPv4 or IPv6, NTCP2 with "s" and "v" only. + * @since 0.9.50 + */ + private void setOutboundNTCP2Address(boolean ipv6) { + if (!_context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS)) + return; + // following is like addNTCP2Options() but adds 4 or 6 only, + // and returns if not appropriately configured + String caps; + TransportUtil.IPv6Config config = getIPv6Config(); + if (ipv6) { + if (config == IPV6_DISABLED) + return; + caps = CAP_IPV6; + } else { + if (config == IPV6_ONLY) + return; + caps = CAP_IPV4; + } + OrderedProperties props = new OrderedProperties(); + props.setProperty("caps", caps); + props.setProperty("s", _b64Ntcp2StaticPubkey); + props.setProperty("v", NTCP2_VERSION); + RouterAddress myAddress = new RouterAddress(STYLE2, props, NTCP2_OUTBOUND_COST); + replaceAddress(myAddress); + } + + /** * Only called by externalAddressReceived(). * Calls replaceAddress() or removeAddress(). * To remove all addresses, call replaceAddress(null) directly. @@ -1088,26 +1107,26 @@ net.i2p.router.transport.ntcp.Writer getWriter() { return _writer; } /** - * @return always "NTCP" even if NTCP1 is disabled + * @return always "NTCP" */ public String getStyle() { return STYLE; } /** - * An alternate supported style, or null. - * @return "NTCP2" or null + * An alternate supported style + * @return "NTCP2" always * @since 0.9.35 */ @Override public String getAltStyle() { - return _enableNTCP2 ? STYLE2 : null; + return STYLE2; } /** - * @return "NTCP" if NTCP1 is enabled, else "NTCP2" + * @return "NTCP2" always * @since 0.9.39 */ private String getPublishStyle() { - return _enableNTCP1 ? STYLE : STYLE2; + return STYLE2; } /** @@ -1116,14 +1135,6 @@ EventPumper getPumper() { return _pumper; } /** - * @return null if not configured for NTCP1 - * @since 0.9 - */ - DHSessionKeyBuilder getDHBuilder() { - return _dhFactory != null ? _dhFactory.getBuilder() : null; - } - - /** * @return null if not configured for NTCP2 * @since 0.9.36 */ @@ -1132,18 +1143,6 @@ } /** - * Return an unused DH key builder - * to be put back onto the queue for reuse. - * - * @param builder must not have a peerPublicValue set - * @since 0.9.16 - */ - void returnUnused(DHSessionKeyBuilder builder) { - if (_dhFactory != null) - _dhFactory.returnUnused(builder); - } - - /** * how long from initial connection attempt (accept() or connect()) until * the con must be established to avoid premature close()ing */ @@ -1244,30 +1243,26 @@ * @since 0.9.35 */ private void addNTCP2Options(Properties props) { - if (!_enableNTCP2) - return; // only set i if we are not firewalled - if (props.containsKey("host")) + if (props.containsKey("host")) { props.setProperty("i", _b64Ntcp2StaticIV); + props.remove("caps"); + } else if (_context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS)) { + String caps; + TransportUtil.IPv6Config config = getIPv6Config(); + if (config == IPV6_ONLY) + caps = CAP_IPV6; + else if (config != IPV6_DISABLED && _haveIPv6Address) + caps = CAP_IPV4_IPV6; + else + caps = CAP_IPV4; + props.setProperty("caps", caps); + } props.setProperty("s", _b64Ntcp2StaticPubkey); props.setProperty("v", NTCP2_VERSION); } /** - * Is NTCP1 enabled? - * - * @since 0.9.39 - */ - boolean isNTCP1Enabled() { return _enableNTCP1; } - - /** - * Is NTCP2 enabled? - * - * @since 0.9.35 - */ - boolean isNTCP2Enabled() { return _enableNTCP2; } - - /** * The static priv key * * @since 0.9.36 @@ -1305,12 +1300,8 @@ int rv; String style = addr.getTransportStyle(); if (style.equals(STYLE)) { - if (!_enableNTCP2) - return 1; rv = 1; } else if (style.equals(STYLE2)) { - if (!_enableNTCP2) - return 0; rv = NTCP2_INT_VERSION; } else { return 0; @@ -1323,7 +1314,7 @@ addr.getOption("s") == null || (!v.equals(NTCP2_VERSION) && !v.startsWith(NTCP2_VERSION_ALT))) { // his address is NTCP1 or is outbound NTCP2 only - return (rv == 1 && _enableNTCP1) ? 1 : 0; + return 0; } // his address is NTCP2 // do not validate the s/i b64, we will just catch it later @@ -1518,9 +1509,10 @@ if (_log.shouldLog(Log.WARN)) _log.warn("Old status: " + old + " New status: " + status + " from: ", new Exception("traceback")); - if (old != Status.UNKNOWN) + if (old != Status.UNKNOWN && _context.router().getUptime() > 5*60*1000L) { _context.router().eventLog().addEvent(EventLog.REACHABILITY, "from " + _t(old.toStatusString()) + " to " + _t(status.toStatusString())); + } } _context.router().rebuildRouterInfo(); } @@ -1636,6 +1628,8 @@ newAddr.setCost(DEFAULT_COST); changed = true; } else if (ohost == null || ohost.length() <= 0) { + if (_log.shouldInfo()) + _log.info("No old host, no new host, no change to NTCP Address"); return false; } else if (Boolean.parseBoolean(enabled) && !ssuOK) { // UDP transitioned to not-OK, turn off NTCP address @@ -1644,13 +1638,9 @@ // we are still firewalled (SW firewall, bad UPnP indication, etc.) if (_log.shouldLog(Log.INFO)) _log.info("old host: " + ohost + " config: " + name + " new: null"); - if (_enableNTCP2) { - // addNTCP2Options() called below - newProps.clear(); - newAddr = new RouterAddress(STYLE2, newProps, NTCP2_OUTBOUND_COST); - } else { - newAddr = null; - } + // addNTCP2Options() called below + newProps.clear(); + newAddr = new RouterAddress(STYLE2, newProps, NTCP2_OUTBOUND_COST); changed = true; } @@ -1682,6 +1672,9 @@ // IPv6 // We have an IPv4 address, IPv6 transitioned to firewalled, // so just remove the v6 address + // TODO '6' address + if (_log.shouldInfo()) + _log.info("IPv6 now firewalled"); newAddr = null; } @@ -1765,6 +1758,10 @@ * Previously returned short, now enum as of 0.9.20 */ public Status getReachabilityStatus() { + boolean fwV4 = isIPv4Firewalled(); + boolean fwV6 = isIPv6Firewalled(); + if (fwV4 && fwV6) + return Status.REJECT_UNSOLICITED; if (!isAlive()) return Status.UNKNOWN; TransportUtil.IPv6Config config = getIPv6Config(); @@ -1779,8 +1776,8 @@ v4Disabled = false; v6Disabled = false; } - boolean hasV4 = getCurrentAddress(false) != null; - boolean hasV6 = getCurrentAddress(true) != null; + boolean hasV4 = !fwV4 && getCurrentAddress(false) != null; + boolean hasV6 = !fwV6 && getCurrentAddress(true) != null; boolean showFirewalled = !_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_UDP) && _context.router().getUptime() > 10*60*1000; if (!hasV4 && !hasV6) { @@ -1796,12 +1793,16 @@ return Status.OK; if (!_haveIPv6Address) return Status.OK; + if (fwV6) + return Status.IPV4_OK_IPV6_FIREWALLED; if (!hasV6) return Status.IPV4_OK_IPV6_UNKNOWN; } if (v6OK) { if (v4Disabled) return Status.IPV4_DISABLED_IPV6_OK; + if (fwV4) + return Status.IPV4_FIREWALLED_IPV6_OK; if (!hasV4) return showFirewalled ? Status.IPV4_FIREWALLED_IPV6_OK : Status.IPV4_UNKNOWN_IPV6_OK; } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/OutboundEstablishState.java i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/OutboundEstablishState.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/ntcp/OutboundEstablishState.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/ntcp/OutboundEstablishState.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,317 +0,0 @@ -package net.i2p.router.transport.ntcp; - -import java.io.IOException; -import java.net.InetAddress; -import java.nio.ByteBuffer; -import java.util.Arrays; - -import net.i2p.crypto.SigType; -import net.i2p.data.DataFormatException; -import net.i2p.data.DataHelper; -import net.i2p.data.Hash; -import net.i2p.data.router.RouterIdentity; -import net.i2p.data.Signature; -import net.i2p.router.Router; -import net.i2p.router.RouterContext; -import net.i2p.router.transport.crypto.DHSessionKeyBuilder; -import net.i2p.util.Log; -import net.i2p.util.SimpleByteCache; - -/** - * - * NTCP 1 only. We are Alice. - * - * @since 0.9.35 pulled out of EstablishState - */ -class OutboundEstablishState extends EstablishBase { - - public OutboundEstablishState(RouterContext ctx, NTCPTransport transport, NTCPConnection con) { - super(ctx, transport, con); - _state = State.OB_INIT; - ctx.sha().calculateHash(_X, 0, XY_SIZE, _hX_xor_bobIdentHash, 0); - xor32(con.getRemotePeer().calculateHash().getData(), _hX_xor_bobIdentHash); - // _prevEncrypted will be created later - } - - /** - * Parse the contents of the buffer as part of the handshake. - * - * All data must be copied out of the buffer as Reader.processRead() - * will return it to the pool. - * - * If there are additional data in the buffer after the handshake is complete, - * the EstablishState is responsible for passing it to NTCPConnection. - */ - @Override - public synchronized void receive(ByteBuffer src) { - super.receive(src); - if (!src.hasRemaining()) - return; // nothing to receive - receiveOutbound(src); - } - - /** - * Get the NTCP version - * @return 1 - * @since 0.9.35 - */ - public int getVersion() { return 1; } - - /** - * We are Alice, so receive these bytes as part of an outbound connection. - * This method receives messages 2 and 4, and sends message 3. - * - * All data must be copied out of the buffer as Reader.processRead() - * will return it to the pool. - * - * Caller must synch. - * - */ - private void receiveOutbound(ByteBuffer src) { - - // recv Y+E(H(X+Y)+tsB, sk, Y[239:255]) - // Read in Y, which is the first part of message #2 - if (_state == State.OB_SENT_X && src.hasRemaining()) { - int toGet = Math.min(src.remaining(), XY_SIZE - _received); - src.get(_Y, _received, toGet); - _received += toGet; - if (_received < XY_SIZE) - return; - - try { - _dh.setPeerPublicValue(_Y); - _dh.getSessionKey(); // force the calc - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"DH session key calculated (" + _dh.getSessionKey().toBase64() + ")"); - changeState(State.OB_GOT_Y); - _received = 0; - } catch (DHSessionKeyBuilder.InvalidPublicParameterException e) { - _context.statManager().addRateData("ntcp.invalidDH", 1); - fail("Invalid X", e); - return; - } catch (IllegalStateException ise) { - // setPeerPublicValue() - fail("reused keys?", ise); - return; - } - } - - // Read in the rest of message #2 - if (_state == State.OB_GOT_Y && src.hasRemaining()) { - int toGet = Math.min(src.remaining(), HXY_TSB_PAD_SIZE - _received); - src.get(_e_hXY_tsB, _received, toGet); - _received += toGet; - if (_received < HXY_TSB_PAD_SIZE) - return; - - if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix() + "received _e_hXY_tsB fully"); - byte hXY_tsB[] = new byte[HXY_TSB_PAD_SIZE]; - _context.aes().decrypt(_e_hXY_tsB, 0, hXY_tsB, 0, _dh.getSessionKey(), _Y, XY_SIZE-AES_SIZE, HXY_TSB_PAD_SIZE); - byte XY[] = new byte[XY_SIZE + XY_SIZE]; - System.arraycopy(_X, 0, XY, 0, XY_SIZE); - System.arraycopy(_Y, 0, XY, XY_SIZE, XY_SIZE); - byte[] h = SimpleByteCache.acquire(HXY_SIZE); - _context.sha().calculateHash(XY, 0, XY_SIZE + XY_SIZE, h, 0); - if (!DataHelper.eq(h, 0, hXY_tsB, 0, HXY_SIZE)) { - SimpleByteCache.release(h); - _context.statManager().addRateData("ntcp.invalidHXY", 1); - fail("Invalid H(X+Y) - mitm attack attempted?"); - return; - } - SimpleByteCache.release(h); - changeState(State.OB_GOT_HXY); - _received = 0; - // their (Bob's) timestamp in seconds - _tsB = DataHelper.fromLong(hXY_tsB, HXY_SIZE, 4); - long now = _context.clock().now(); - // rtt from sending #1 to receiving #2 - long rtt = now - _con.getCreated(); - // our (Alice's) timestamp in seconds - _tsA = (now + 500) / 1000; - _peerSkew = (now - (_tsB * 1000) - (rtt / 2) + 500) / 1000; - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"h(X+Y) is correct, skew = " + _peerSkew); - - // the skew is not authenticated yet, but it is certainly fatal to - // the establishment, so fail hard if appropriate - long diff = 1000*Math.abs(_peerSkew); - if (!_context.clock().getUpdatedSuccessfully()) { - // Adjust the clock one time in desperation - // We are Alice, he is Bob, adjust to match Bob - _context.clock().setOffset(1000 * (0 - _peerSkew), true); - _peerSkew = 0; - if (diff != 0) - _log.logAlways(Log.WARN, "NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff)); - } else if (diff >= Router.CLOCK_FUDGE_FACTOR) { - _context.statManager().addRateData("ntcp.invalidOutboundSkew", diff); - _transport.markReachable(_con.getRemotePeer().calculateHash(), false); - // Only banlist if we know what time it is - _context.banlist().banlistRouter(DataHelper.formatDuration(diff), - _con.getRemotePeer().calculateHash(), - _x("Excessive clock skew: {0}")); - _transport.setLastBadSkew(_peerSkew); - fail("Clocks too skewed (" + diff + " ms)", null, true); - return; - } else if (_log.shouldLog(Log.DEBUG)) { - _log.debug(prefix()+"Clock skew: " + diff + " ms"); - } - - // now prepare and send our response - // send E(#+Alice.identity+tsA+padding+S(X+Y+Bob.identHash+tsA+tsB), sk, hX_xor_Bob.identHash[16:31]) - int sigSize = XY_SIZE + XY_SIZE + HXY_SIZE + 4+4;//+12; - byte preSign[] = new byte[sigSize]; - System.arraycopy(_X, 0, preSign, 0, XY_SIZE); - System.arraycopy(_Y, 0, preSign, XY_SIZE, XY_SIZE); - System.arraycopy(_con.getRemotePeer().calculateHash().getData(), 0, preSign, XY_SIZE + XY_SIZE, HXY_SIZE); - DataHelper.toLong(preSign, XY_SIZE + XY_SIZE + HXY_SIZE, 4, _tsA); - DataHelper.toLong(preSign, XY_SIZE + XY_SIZE + HXY_SIZE + 4, 4, _tsB); - // hXY_tsB has 12 bytes of padding (size=48, tsB=4 + hXY=32) - Signature sig = _context.dsa().sign(preSign, _context.keyManager().getSigningPrivateKey()); - - byte ident[] = _context.router().getRouterInfo().getIdentity().toByteArray(); - // handle variable signature size - int min = 2 + ident.length + 4 + sig.length(); - int rem = min % AES_SIZE; - int padding = 0; - if (rem > 0) - padding = AES_SIZE - rem; - byte preEncrypt[] = new byte[min+padding]; - DataHelper.toLong(preEncrypt, 0, 2, ident.length); - System.arraycopy(ident, 0, preEncrypt, 2, ident.length); - DataHelper.toLong(preEncrypt, 2+ident.length, 4, _tsA); - if (padding > 0) - _context.random().nextBytes(preEncrypt, 2 + ident.length + 4, padding); - System.arraycopy(sig.getData(), 0, preEncrypt, 2+ident.length+4+padding, sig.length()); - - _prevEncrypted = new byte[preEncrypt.length]; - _context.aes().encrypt(preEncrypt, 0, _prevEncrypted, 0, _dh.getSessionKey(), - _hX_xor_bobIdentHash, _hX_xor_bobIdentHash.length-AES_SIZE, preEncrypt.length); - - changeState(State.OB_SENT_RI); - _transport.getPumper().wantsWrite(_con, _prevEncrypted); - } - - // Read in message #4 - if (_state == State.OB_SENT_RI && src.hasRemaining()) { - // we are receiving their confirmation - - // recv E(S(X+Y+Alice.identHash+tsA+tsB)+padding, sk, prev) - int off = 0; - if (_e_bobSig == null) { - // handle variable signature size - int siglen = _con.getRemotePeer().getSigningPublicKey().getType().getSigLen(); - int rem = siglen % AES_SIZE; - int padding; - if (rem > 0) - padding = AES_SIZE - rem; - else - padding = 0; - _e_bobSig = new byte[siglen + padding]; - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "receiving E(S(X+Y+Alice.identHash+tsA+tsB)+padding, sk, prev) (remaining? " + - src.hasRemaining() + ")"); - } else { - off = _received; - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "continuing to receive E(S(X+Y+Alice.identHash+tsA+tsB)+padding, sk, prev) (remaining? " + - src.hasRemaining() + " off=" + off + " recv=" + _received + ")"); - } - while (_state == State.OB_SENT_RI && src.hasRemaining()) { - _e_bobSig[off++] = src.get(); - _received++; - - if (off >= _e_bobSig.length) { - changeState(State.OB_GOT_SIG); - byte bobSig[] = new byte[_e_bobSig.length]; - _context.aes().decrypt(_e_bobSig, 0, bobSig, 0, _dh.getSessionKey(), - _e_hXY_tsB, HXY_TSB_PAD_SIZE - AES_SIZE, _e_bobSig.length); - // ignore the padding - // handle variable signature size - SigType type = _con.getRemotePeer().getSigningPublicKey().getType(); - int siglen = type.getSigLen(); - // we don't need to do this if no padding! - byte bobSigData[] = new byte[siglen]; - System.arraycopy(bobSig, 0, bobSigData, 0, siglen); - Signature sig = new Signature(type, bobSigData); - - byte toVerify[] = new byte[XY_SIZE + XY_SIZE + HXY_SIZE +4+4]; - int voff = 0; - System.arraycopy(_X, 0, toVerify, voff, XY_SIZE); voff += XY_SIZE; - System.arraycopy(_Y, 0, toVerify, voff, XY_SIZE); voff += XY_SIZE; - System.arraycopy(_context.routerHash().getData(), 0, toVerify, voff, HXY_SIZE); voff += HXY_SIZE; - DataHelper.toLong(toVerify, voff, 4, _tsA); voff += 4; - DataHelper.toLong(toVerify, voff, 4, _tsB); voff += 4; - - boolean ok = _context.dsa().verifySignature(sig, toVerify, _con.getRemotePeer().getSigningPublicKey()); - if (!ok) { - _context.statManager().addRateData("ntcp.invalidSignature", 1); - fail("Signature was invalid - attempt to spoof " + _con.getRemotePeer().calculateHash().toBase64() + "?"); - } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "signature verified from Bob. done!"); - byte nextWriteIV[] = SimpleByteCache.acquire(AES_SIZE); - System.arraycopy(_prevEncrypted, _prevEncrypted.length-AES_SIZE, nextWriteIV, 0, AES_SIZE); - // this does not copy the nextWriteIV, do not release to cache - // We are Alice, he is Bob, clock skew is Bob - Alice - // skew in seconds - _con.finishOutboundEstablishment(_dh.getSessionKey(), _peerSkew, nextWriteIV, _e_bobSig); - changeState(State.VERIFIED); - if (src.hasRemaining()) { - // process "extra" data - // This is fairly common for outbound, where Bob may send his updated RI - if (_log.shouldInfo()) - _log.info("extra data " + src.remaining() + " on " + this); - _con.recvEncryptedI2NP(src); - } - releaseBufs(true); - // if socket gets closed this will be null - prevent NPE - InetAddress ia = _con.getChannel().socket().getInetAddress(); - if (ia != null) - _transport.setIP(_con.getRemotePeer().calculateHash(), ia.getAddress()); - } - return; - } - } - } - - // check for remaining data - if ((_state == State.VERIFIED || _state == State.CORRUPT) && src.hasRemaining()) { - if (_log.shouldWarn()) - _log.warn("Received unexpected " + src.remaining() + " on " + this, new Exception()); - } - } - - /** - * We are Alice. - * We are establishing an outbound connection, so prepare ourselves by - * queueing up the write of the first part of the handshake - * This method sends message #1 to Bob. - * - * @throws IllegalStateException - */ - @Override - public synchronized void prepareOutbound() { - if (_state == State.OB_INIT) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix() + "send X"); - byte toWrite[] = new byte[XY_SIZE + _hX_xor_bobIdentHash.length]; - System.arraycopy(_X, 0, toWrite, 0, XY_SIZE); - System.arraycopy(_hX_xor_bobIdentHash, 0, toWrite, XY_SIZE, _hX_xor_bobIdentHash.length); - changeState(State.OB_SENT_X); - _transport.getPumper().wantsWrite(_con, toWrite); - } else { - throw new IllegalStateException(prefix() + "unexpected prepareOutbound()"); - } - } - - /** - * Only call once. Caller must synch. - * @since 0.9.16 - */ - @Override - protected void releaseBufs(boolean isVerified) { - super.releaseBufs(isVerified); - Arrays.fill(_Y, (byte) 0); - SimpleByteCache.release(_Y); - } -} diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/SyntheticREDQueue.java i2p-0.9.50/router/java/src/net/i2p/router/transport/SyntheticREDQueue.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/SyntheticREDQueue.java 1970-01-01 00:00:00.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/SyntheticREDQueue.java 2021-05-19 12:12:00.000000000 +0000 @@ -0,0 +1,374 @@ +package net.i2p.router.transport; + +import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; +import net.i2p.util.BandwidthEstimator; +import net.i2p.util.Log; + +/** + * A "synthetic" queue in that it doesn't actually queue anything. + * Actual queueing is assumed to be "dowstream" of this. + * + * Maintains an average estimated "queue size" assuming a constant output rate + * declared in the constructor. The queue size is measured in bytes. + * + * With offer(), will return true for "accepted" or false for "dropped", + * based on the RED algorithm which uses the current average queue size + * and the offered data size to calculate a drop probability. + * Bandwidth is not directly used in the RED algorithm, except to + * synthetically calculate an average queue size assuming the + * queue is being drained precisely at that rate, byte-by-byte + * (not per-packet). + * + * addSample() unconditionally accepts the packet. + * + * Also maintains a Westwood+ bandwidth estimator. + * The bandwidth and queue size estimates are only updated if the + * packet is "accepted". + * + * The average queue size is calculated in the same manner as the + * bandwidth, with an update every WESTWOOD_RTT_MIN ms. + * Both estimators use + * a first stage anti-aliasing low pass filter based on RTT, + * and the time-varying Westwood filter based on inter-arrival time. + * + * Ref: Random Early Detection Gateways for Congestion Avoidance + * Sally Floyd and Van Jacobson + * + * Ref: TCP Westwood: End-to-End Congestion Control for Wired/Wireless Networks + * Casetti et al + * (Westwood) + * + * Ref: End-to-End Bandwidth Estimation for Congestion Control in Packet Networks + * Grieco and Mascolo + * (Westwood+) + * + * Adapted from: Linux kernel tcp_westwood.c (GPLv2) + * + * @since 0.9.50 adapted from streaming + */ +class SyntheticREDQueue implements BandwidthEstimator { + + private final I2PAppContext _context; + private final Log _log; + + private long _tAck; + // bw_est, bw_ns_est + private float _bKFiltered, _bK_ns_est; + // bk + private int _acked; + + // RED vars + // pkts since last dropped pkt + private int _count = -1; + // smoothed average queue size in bytes + private float _avgQSize; + // last sample queue size in bytes + private float _qSize; + // current interval newly queued in bytes, since the last updateQSize() + private int _newDataSize; + // last time _avgQSize calculated + private long _tQSize; + // min queue size threshold, in bytes, to start dropping + private final int _minth; + // max queue size, in bytes, before dropping everything + private final int _maxth; + // bandwidth in bytes per second, as passed to the constructor. + private final int _bwBps; + // bandwidth in bytes per ms. The queue is drained at this rate. + private final float _bwBpms; + // As in RED paper + private static final float MAXP = 0.02f; + + // As in kernel tcp_westwood.c + private static final int DECAY_FACTOR = 8; + private static final int WESTWOOD_RTT_MIN = 500; + // denominator of time, 1/x seconds of traffic in the queue + private static final int DEFAULT_LOW_THRESHOLD = 13; + // denominator of time, 1/x seconds of traffic in the queue + private static final int DEFAULT_HIGH_THRESHOLD = 3; + + /** + * Default thresholds. + * Min: 100 ms of traffic; max: 500 ms. + * + * @param bwBps the output rate of the queue in Bps + */ + SyntheticREDQueue(I2PAppContext ctx, int bwBps) { + // the goal is to drop here rather than let the traffic + // get through to UDP-Sender CoDel and get dropped there, + // when we're at the default 80% share or below. + // That CoDel starts dropping when above 100 ms latency for 500 ms. + // let's try the same 100 ms of traffic here. + this(ctx, bwBps, bwBps / DEFAULT_LOW_THRESHOLD, bwBps / DEFAULT_HIGH_THRESHOLD); + } + + /** + * Specified queue size thresholds. + * offer() drops a 1024 byte packet at 2% probability just lower than maxThKB, + * and at 100% probability higher than maxThKB. + * + * @param bwBps the output rate of the queue in Bps + * @param minThB the minimum queue size to start dropping in Bytes + * @param maxThB the queue size to drop everything in Bytes + */ + SyntheticREDQueue(I2PAppContext ctx, int bwBps, int minThB, int maxThB) { + _log = ctx.logManager().getLog(SyntheticREDQueue.class); + _context = ctx; + // assume we're about to send something + _tAck = ctx.clock().now(); + _acked = -1; + _minth = minThB; + _maxth = maxThB; + _bwBps = bwBps; + _bwBpms = bwBps / 1000f; + _tQSize = _tAck; + if (_log.shouldDebug()) + _log.debug("Configured " + bwBps + " BPS, min: " + minThB + " B, max: " + maxThB + " B"); + } + + /** + * + * Nominal bandwidth limit in bytes per second, as passed to the constructor. + * + */ + public int getMaxBandwidth() { + return _bwBps; + } + + /** + * Unconditional, never drop. + * The queue size and bandwidth estimates will be updated. + */ + public void addSample(int size) { + offer(size, 0); + } + + /** + * Should we drop this packet? + * If accepted, the queue size and bandwidth estimates will be updated. + * + * @param size how many bytes to be offered + * @param factor how to adjust the size for the drop probability calculation, + * or 1.0 for standard probability. 0 to prevent dropping. + * Does not affect bandwidth calculations. + * @return true for accepted, false for drop + */ + public boolean offer(int size, float factor) { + long now = _context.clock().now(); + return addSample(size, factor, now); + } + + private synchronized boolean addSample(int acked, float factor, long now) { + if (_acked < 0) { + // first sample + // use time since constructed as the RTT + long deltaT = Math.max(now - _tAck, WESTWOOD_RTT_MIN); + float bkdt = ((float) acked) / deltaT; + _bKFiltered = bkdt; + _bK_ns_est = bkdt; + _acked = 0; + _tAck = now; + _tQSize = now; + _newDataSize = acked; + if (_log.shouldDebug()) + _log.debug("first sample bytes: " + acked + " deltaT: " + deltaT + ' ' + this); + return true; + } else { + // update queue size average if necessary + // the current sample is not included in the calculation + long deltaT = now - _tQSize; + if (deltaT > WESTWOOD_RTT_MIN) + updateQSize(now, deltaT); + if (factor > 0) { + // drop calculation + if (_avgQSize > _maxth) { + if (_log.shouldWarn()) + _log.warn("drop bytes (qsize): " + acked + ' ' + this); + _count = 0; + return false; + } + if (_avgQSize > _minth) { + _count++; + float pb = (acked / 1024f) * factor * MAXP * (_avgQSize - _minth) / (_maxth - _minth); + float pa = pb / (1 - (_count * pb)); + float rand = _context.random().nextFloat(); + if (rand < pa) { + if (_log.shouldWarn()) + _log.warn("drop bytes (prob): " + acked + " factor " + factor + " prob: " + pa + " deltaT: " + deltaT + ' ' + this); + _count = 0; + return false; + } + _count = -1; + } + } + // accepted + _newDataSize += acked; + _acked += acked; + // update bandwidth estimate if necessary + deltaT = now - _tAck; + if (deltaT >= WESTWOOD_RTT_MIN) + computeBWE(now, (int) deltaT); + if (_log.shouldDebug()) + _log.debug("accept bytes: " + acked + " factor " + factor + ' ' + this); + return true; + } + } + + /** + * @return the current bandwidth estimate in bytes/ms. + */ + public float getBandwidthEstimate() { + long now = _context.clock().now(); + // anti-aliasing filter + // As in kernel tcp_westwood.c + // and the Westwood+ paper + synchronized(this) { + long deltaT = now - _tAck; + if (deltaT >= WESTWOOD_RTT_MIN) + return computeBWE(now, (int) deltaT); + return _bKFiltered; + } + } + + /** + * @return the current queue size estimate in bytes. + */ + public float getQueueSizeEstimate() { + long now = _context.clock().now(); + // anti-aliasing filter + // As in kernel tcp_westwood.c + // and the Westwood+ paper + synchronized(this) { + long deltaT = now - _tQSize; + if (deltaT >= WESTWOOD_RTT_MIN) + updateQSize(now, deltaT); + return _avgQSize; + } + } + + private synchronized float computeBWE(final long now, final int rtt) { + if (_acked < 0) + return 0.0f; // nothing ever sampled + updateBK(now, _acked, rtt); + _acked = 0; + return _bKFiltered; + } + + /** + * Optimized version of updateBK with packets == 0 + */ + private void decay() { + _bK_ns_est *= (DECAY_FACTOR - 1) / (float) DECAY_FACTOR; + _bKFiltered = westwood_do_filter(_bKFiltered, _bK_ns_est); + } + + private void decayQueue(int rtt) { + _qSize -= rtt * _bwBpms; + if (_qSize < 1) + _qSize = 0; + _avgQSize = westwood_do_filter(_avgQSize, _qSize); + } + + /** + * Here we insert virtual null samples if necessary as in Westwood, + * And use a very simple EWMA (exponential weighted moving average) + * time-varying filter, as in kernel tcp_westwood.c + * + * @param time the time of the measurement + * @param packets number of bytes acked + * @param rtt current rtt + */ + private void updateBK(long time, int packets, int rtt) { + long deltaT = time - _tAck; + if (rtt < WESTWOOD_RTT_MIN) + rtt = WESTWOOD_RTT_MIN; + if (deltaT > 2 * rtt) { + // Decay with virtual null samples as in the Westwood paper + int numrtts = Math.min((int) ((deltaT / rtt) - 1), 2 * DECAY_FACTOR); + for (int i = 0; i < numrtts; i++) { + if (_bKFiltered <= 0) + break; + decay(); + } + deltaT -= numrtts * rtt; + //if (_log.shouldDebug()) + // _log.debug("decayed " + numrtts + " times, new _bK_ns_est: " + _bK_ns_est + ' ' + this); + } + float bkdt; + if (packets > 0) { + // As in kernel tcp_westwood.c + bkdt = ((float) packets) / deltaT; + _bK_ns_est = westwood_do_filter(_bK_ns_est, bkdt); + _bKFiltered = westwood_do_filter(_bKFiltered, _bK_ns_est); + } else { + bkdt = 0; + decay(); + } + _tAck = time; + //if (_log.shouldDebug()) + // _log.debug("computeBWE bytes: " + packets + " deltaT: " + deltaT + + // " bk/deltaT: " + bkdt + " _bK_ns_est: " + _bK_ns_est + ' ' + this); + } + + + /** + * Here we insert virtual null samples if necessary as in Westwood, + * And use a very simple EWMA (exponential weighted moving average) + * time-varying filter, as in kernel tcp_westwood.c + * + * @param time the time of the measurement + * @param deltaT at least WESTWOOD_RTT_MIN + */ + private void updateQSize(long time, long deltaT) { + long origDT = deltaT; + if (deltaT > 2 * WESTWOOD_RTT_MIN) { + // Decay with virtual null samples as in the Westwood paper + int numrtts = Math.min((int) ((deltaT / WESTWOOD_RTT_MIN) - 1), 2 * DECAY_FACTOR); + for (int i = 0; i < numrtts; i++) { + if (_avgQSize <= 0) + break; + decayQueue(WESTWOOD_RTT_MIN); + } + deltaT -= numrtts * WESTWOOD_RTT_MIN; + //if (_log.shouldDebug()) + // _log.debug("decayed " + numrtts + " times, new _bK_ns_est: " + _bK_ns_est + ' ' + this); + } + int origNDS = _newDataSize; + float newQSize = _newDataSize; + if (_newDataSize > 0) { + newQSize -= deltaT * _bwBpms; + if (newQSize < 1) + newQSize = 0; + _qSize = westwood_do_filter(_qSize, newQSize); + _avgQSize = westwood_do_filter(_avgQSize, _qSize); + _newDataSize = 0; + } else { + decayQueue((int) deltaT); + } + _tQSize = time; + if (_log.shouldDebug()) + _log.debug("computeQS deltaT: " + origDT + + " newData: " + origNDS + + " newQsize: " + newQSize + " qSize: " + _qSize + ' ' + this); + } + + /** + * As in kernel tcp_westwood.c + */ + private static float westwood_do_filter(float a, float b) { + return (((DECAY_FACTOR - 1) * a) + b) / DECAY_FACTOR; + } + + @Override + public synchronized String toString() { + return "SREDQ[" + + //" _bKFiltered " + _bKFiltered + + //" _tAck " + _tAck + "; " + + //" _tQSize " + _tQSize + + ' ' + DataHelper.formatSize2Decimal((long) (_bKFiltered * 1000), false) + + "Bps, avg_qsize " + + DataHelper.formatSize2((long) _avgQSize, false) + + "B]"; + } +} diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/TransportImpl.java i2p-0.9.50/router/java/src/net/i2p/router/transport/TransportImpl.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/TransportImpl.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/TransportImpl.java 2021-05-19 12:12:00.000000000 +0000 @@ -46,6 +46,7 @@ import net.i2p.util.SimpleTimer; import net.i2p.util.SystemVersion; import net.i2p.util.Translate; +import net.i2p.util.VersionComparator; /** * Defines a way to send a message to another peer and start listening for messages @@ -70,6 +71,17 @@ private static final long UNREACHABLE_PERIOD = 5*60*1000; private static final long WAS_UNREACHABLE_PERIOD = 30*60*1000; + /** @since 0.9.50 */ + protected static final String PROP_TRANSPORT_CAPS = "i2np.transportCaps"; + /** @since 0.9.50 */ + protected static final boolean ENABLE_TRANSPORT_CAPS = true; + /** @since 0.9.50 */ + public static final String CAP_IPV4 = "4"; + /** @since 0.9.50 */ + public static final String CAP_IPV6 = "6"; + /** @since 0.9.50 */ + public static final String CAP_IPV4_IPV6 = CAP_IPV4 + CAP_IPV6; + /** @since 0.9.44 */ protected static final String PROP_IPV6_FIREWALLED = "i2np.lastIPv6Firewalled"; @@ -82,6 +94,11 @@ _IPMap = new LHMCache(size); } + /** 50/100/150/250/450/550/700 for BW Tiers K/L/M/N/O/P/X */ + private static final int MAX_CONNECTION_FACTOR = 50; + // see constructor + private final boolean REBALANCE_NTCP; + /** * Initialize the new transport * @@ -108,6 +125,12 @@ _wasUnreachableEntries = new ConcurrentHashMap(32); _localAddresses = new ConcurrentHashSet(4); _context.simpleTimer2().addPeriodicEvent(new CleanupUnreachable(), 2 * UNREACHABLE_PERIOD, UNREACHABLE_PERIOD / 2); + // if the router is slow, or we have the i2prouter script on linux that bumps the ulimit, + // allow more NTCP2 and less SSU. See getMaxConnections() below. + String installed = _context.getProperty("router.firstVersion"); + REBALANCE_NTCP = SystemVersion.isSlow() || + (!SystemVersion.isMac() && !SystemVersion.isWindows() && + SystemVersion.hasWrapper() && installed != null && VersionComparator.comp(installed, "0.9.33") >= 0); } /** @@ -128,9 +151,6 @@ */ public abstract int countActiveSendPeers(); - /** ...and 50/100/150/200/250 for BW Tiers K/L/M/N/O */ - private static final int MAX_CONNECTION_FACTOR = 50; - /** Per-transport connection limit */ public int getMaxConnections() { if (_context.commSystem().isDummy()) @@ -179,9 +199,19 @@ def *= 17; def /= 10; } // increase limit for SSU, for now - if (style.equals("SSU")) - //def = def * 3 / 2; - def *= 3; + if (style.equals("SSU")) { + if (REBALANCE_NTCP) { + def *= 5; def /= 2; + } else { + def *= 3; + } + } else if (style.equals("NTCP")) { + if (REBALANCE_NTCP) { + def *= 3; def /= 2; + if (def > 1500) + def = 1500; + } + } return _context.getProperty(maxProp, def); } @@ -660,9 +690,9 @@ * shuffled and then sorted by cost/preference. * Lowest cost (most preferred) first. * @return non-null, possibly empty - * @since IPv6 + * @since IPv6, public since 0.9.50, was protected */ - protected List getTargetAddresses(RouterInfo target) { + public List getTargetAddresses(RouterInfo target) { List rv; String alt = getAltStyle(); if (alt != null) diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/Transport.java i2p-0.9.50/router/java/src/net/i2p/router/transport/Transport.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/Transport.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/Transport.java 2021-05-19 12:12:00.000000000 +0000 @@ -59,6 +59,18 @@ public List getCurrentAddresses(); /** + * What address are we currently listening to? + * Replaces getCurrentAddress() + * + * Note: An address without a host is considered IPv4. + * + * @param ipv6 true for IPv6 only; false for IPv4 only + * @return first matching address or null + * @since 0.9.50 lifted from TransportImpl + */ + public RouterAddress getCurrentAddress(boolean ipv6); + + /** * Do we have any current address? * @since IPv6 */ @@ -184,6 +196,25 @@ @Deprecated public void recheckReachability(); + /** + * @since 0.9.50 added to interface + */ + public TransportUtil.IPv6Config getIPv6Config(); + + /** + * This returns true if the force-firewalled setting is configured, false otherwise. + * + * @since 0.9.50 added to interface + */ + public boolean isIPv4Firewalled(); + + /** + * This returns true if the force-firewalled setting is configured, false otherwise. + * + * @since 0.9.50 added to interface + */ + public boolean isIPv6Firewalled(); + public boolean isBacklogged(Hash peer); /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/TransportManager.java i2p-0.9.50/router/java/src/net/i2p/router/transport/TransportManager.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/TransportManager.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/TransportManager.java 2021-05-19 12:12:00.000000000 +0000 @@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentHashMap; import net.i2p.crypto.SigType; +import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterIdentity; @@ -73,6 +74,7 @@ private final Map _pluggableTransports; private final RouterContext _context; private final UPnPManager _upnpManager; + private final SimpleTimer2.TimedEvent _upnpRefresher; private final DHSessionKeyBuilder.PrecalcRunner _dhThread; private final X25519KeyFactory _xdhThread; private final boolean _enableUDP; @@ -85,22 +87,20 @@ public final static String PROP_ENABLE_NTCP = "i2np.ntcp.enable"; /** default true */ public final static String PROP_ENABLE_UPNP = "i2np.upnp.enable"; + public final static String PROP_ENABLE_UPNP_IPV6 = "i2np.upnp.ipv6.enable"; + public static final boolean DEFAULT_ENABLE_UPNP_IPV6 = true; private static final String PROP_JAVA_PROXY1 = "socksProxyHost"; private static final String PROP_JAVA_PROXY2 = "java.net.useSystemProxies"; private static final String PROP_JAVA_PROXY3 = "http.proxyHost"; private static final String PROP_JAVA_PROXY4 = "https.proxyHost"; - /** default true */ - private static final String PROP_NTCP1_ENABLE = "i2np.ntcp1.enable"; - private static final boolean DEFAULT_NTCP1_ENABLE = false; - private static final String PROP_NTCP2_ENABLE = "i2np.ntcp2.enable"; - private static final boolean DEFAULT_NTCP2_ENABLE = true; - private static final String PROP_ADVANCED = "routerconsole.advanced"; /** not forever, since they may update */ private static final long SIGTYPE_BANLIST_DURATION = 36*60*60*1000L; + private static final long UPNP_REFRESH_TIME = UPnP.LEASE_TIME_SECONDS * 1000L / 3; + public TransportManager(RouterContext context) { _context = context; _log = _context.logManager().getLog(TransportManager.class); @@ -117,11 +117,10 @@ boolean isProxied = isProxied(); boolean enableUPnP = !isProxied && _context.getBooleanPropertyDefaultTrue(PROP_ENABLE_UPNP); _upnpManager = enableUPnP ? new UPnPManager(context, this) : null; + _upnpRefresher = enableUPnP ? new UPnPRefresher() : null; _enableUDP = _context.getBooleanPropertyDefaultTrue(PROP_ENABLE_UDP); - _enableNTCP1 = isNTCPEnabled(context) && - context.getProperty(PROP_NTCP1_ENABLE, DEFAULT_NTCP1_ENABLE); - boolean enableNTCP2 = isNTCPEnabled(context) && - context.getProperty(PROP_NTCP2_ENABLE, DEFAULT_NTCP2_ENABLE); + _enableNTCP1 = false; + boolean enableNTCP2 = isNTCPEnabled(context); _dhThread = (_enableUDP || enableNTCP2) ? new DHSessionKeyBuilder.PrecalcRunner(context) : null; // always created, even if NTCP2 is not enabled, because ratchet needs it _xdhThread = new X25519KeyFactory(context); @@ -144,7 +143,7 @@ System.out.println(msg); _log.logAlways(Log.WARN, msg); rv = true; - } else if (!SystemVersion.isMac() && Boolean.valueOf(System.getProperty(PROP_JAVA_PROXY2))) { + } else if (!SystemVersion.isMac() && Boolean.parseBoolean(System.getProperty(PROP_JAVA_PROXY2))) { try { // Use ProxySelector to see if we would be proxied // using a dummy address. @@ -261,10 +260,7 @@ initializeAddress(udp); } if (isNTCPEnabled(_context)) { - DHSessionKeyBuilder.PrecalcRunner dh = _enableNTCP1 ? _dhThread : null; - boolean enableNTCP2 = _context.getProperty(PROP_NTCP2_ENABLE, DEFAULT_NTCP2_ENABLE); - X25519KeyFactory xdh = enableNTCP2 ? _xdhThread : null; - Transport ntcp = new NTCPTransport(_context, dh, xdh); + Transport ntcp = new NTCPTransport(_context, null, _xdhThread); addTransport(ntcp); initializeAddress(ntcp); if (udp != null) { @@ -285,9 +281,7 @@ } public static boolean isNTCPEnabled(RouterContext ctx) { - return ctx.getBooleanPropertyDefaultTrue(PROP_ENABLE_NTCP) && - (ctx.getProperty(PROP_NTCP1_ENABLE, DEFAULT_NTCP1_ENABLE) || - ctx.getProperty(PROP_NTCP2_ENABLE, DEFAULT_NTCP2_ENABLE)); + return ctx.getBooleanPropertyDefaultTrue(PROP_ENABLE_NTCP); } /** @@ -319,10 +313,10 @@ Set ipset = Addresses.getAddresses(_context.getBooleanProperty("i2np.allowLocal"), false, true); String lastv4 = _context.getProperty(UDPTransport.PROP_IP); String lastv6 = _context.getProperty(UDPTransport.PROP_IPV6); - boolean preferTemp = _context.getBooleanProperty(UDPTransport.PROP_LAPTOP_MODE); + boolean preferTemp = Boolean.parseBoolean(Addresses.useIPv6TempAddresses()); // // Avoid IPv6 temporary addresses if we have a non-temporary one, - // unless laptop mode + // unless the kernel prefers them // boolean hasPreferredV6Address = false; List addresses = new ArrayList(4); @@ -450,8 +444,10 @@ // Always start on Android, as we may have a cellular IPv4 address but // are routing all traffic through WiFi. // Also, conditions may change rapidly. - if (_upnpManager != null && (SystemVersion.isAndroid() || Addresses.getAnyAddress() == null)) + if (_upnpManager != null && (SystemVersion.isAndroid() || Addresses.getAnyAddress() == null)) { _upnpManager.start(); + _upnpRefresher.schedule(UPNP_REFRESH_TIME); + } configTransports(); _log.debug("Starting up the transport manager"); // Let's do this in a predictable order to make testing easier @@ -488,8 +484,10 @@ * Can be restarted. */ synchronized void stopListening() { - if (_upnpManager != null) + if (_upnpManager != null) { + _upnpRefresher.cancel(); _upnpManager.stop(); + } for (Transport t : _transports.values()) { t.stopListening(); } @@ -743,25 +741,43 @@ static class Port { public final String style; public final int port; + public final boolean isIPv6; + public final String ip; + /** + * IPv4 only + */ public Port(String style, int port) { this.style = style; this.port = port; + isIPv6 = false; + ip = null; + } + + /** + * IPv6 only + * @since 0.9.50 + */ + public Port(String style, String host, int port) { + this.style = style; + this.port = port; + isIPv6 = true; + ip = host; } @Override public int hashCode() { - return style.hashCode() ^ port; + return style.hashCode() ^ port ^ DataHelper.hashCode(ip); } @Override public boolean equals(Object o) { - if (o == null) - return false; + if (o == this) + return true; if (! (o instanceof Port)) return false; Port p = (Port) o; - return port == p.port && style.equals(p.style); + return port == p.port && style.equals(p.style) && DataHelper.eq(ip, p.ip); } } @@ -771,6 +787,8 @@ */ private Set getPorts() { Set rv = new HashSet(4); + if (_context.router().isHidden()) + return rv; for (Transport t : _transports.values()) { int port = t.getRequestedPort(); // Use UDP port for NTCP too - see comment in NTCPTransport.getRequestedPort() for why this is here @@ -780,8 +798,30 @@ if (udp != null) port = udp.getRequestedPort(); } - if (port > 0) - rv.add(new Port(t.getStyle(), port)); + if (port > 0) { + TransportUtil.IPv6Config config = t.getIPv6Config(); + // ipv4 + if (config != TransportUtil.IPv6Config.IPV6_ONLY && + !t.isIPv4Firewalled()) { + rv.add(new Port(t.getStyle(), port)); + } + // ipv6 + if (_context.getProperty(PROP_ENABLE_UPNP_IPV6, DEFAULT_ENABLE_UPNP_IPV6) && + config != TransportUtil.IPv6Config.IPV6_DISABLED && + !t.isIPv6Firewalled()) { + RouterAddress ra = t.getCurrentAddress(true); + if (ra == null) { + if (t.getStyle().equals(UDPTransport.STYLE)) { + UDPTransport udp = (UDPTransport) t; + ra = udp.getCurrentExternalAddress(true); + } + } + if (ra != null) { + String host = ra.getHost(); + rv.add(new Port(t.getStyle(), host, port)); + } + } + } } return rv; } @@ -952,6 +992,23 @@ } } + /** + * Periodic refresh of UPnP ports. + * This is required because UPnP leases expire. + * UPnPManager.Rescanner finds new devices but does not refresh the ports. + * Caller must schedule. + * + * @since 0.9.50 + */ + private class UPnPRefresher extends SimpleTimer2.TimedEvent { + public UPnPRefresher() { super(_context.simpleTimer2()); } + + public void timeReached() { + transportAddressChanged(); + reschedule(UPNP_REFRESH_TIME); + } + } + List getMostRecentErrorMessages() { List rv = new ArrayList(16); for (Transport t : _transports.values()) { diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/TransportUtil.java i2p-0.9.50/router/java/src/net/i2p/router/transport/TransportUtil.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/TransportUtil.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/TransportUtil.java 2021-05-19 12:12:00.000000000 +0000 @@ -123,12 +123,17 @@ /** * Addresses without a host (i.e. w/introducers) - * are assumed to be IPv4 + * are assumed to be IPv4 unless a '6' cap is present + * + * @param addr non-null */ public static boolean isIPv6(RouterAddress addr) { // do this the fast way, without calling getIP() to parse the host string String host = addr.getHost(); - return host != null && host.contains(":"); + if (host != null) + return host.contains(":"); + String caps = addr.getOption("caps"); + return caps != null && caps.contains(TransportImpl.CAP_IPV6) && !caps.contains(TransportImpl.CAP_IPV4); } /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/BandwidthEstimator.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/BandwidthEstimator.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/BandwidthEstimator.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/BandwidthEstimator.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -package net.i2p.router.transport.udp; - -/** - * A Westwood bandwidth estimator - * - * @since 0.9.49 adapted from streaming - */ -interface BandwidthEstimator { - - /** - * Records an arriving ack. - * @param acked how many bytes were acked with this ack - */ - public void addSample(int acked); - - /** - * @return the current bandwidth estimate in bytes/ms. - */ - public float getBandwidthEstimate(); -} diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java 2021-05-19 12:12:00.000000000 +0000 @@ -375,7 +375,7 @@ // w/o ext options, it's always 'requested', no need to set // don't ask if they are indirect boolean requestIntroduction = allowExtendedOptions && !isIndirect && - _transport.introducersMaybeRequired(); + _transport.introducersMaybeRequired(TransportUtil.isIPv6(ra)); state = new OutboundEstablishState(_context, maybeTo, to, toIdentity, allowExtendedOptions, requestIntroduction, @@ -500,8 +500,8 @@ // TODO if already we have their RI, only offer if they need it (no 'C' cap) // if extended options, only if they asked for it if (state.isIntroductionRequested() && - _transport.canIntroduce() && state.getSentPort() >= 1024 && - state.getSentIP().length == 4) { + state.getSentPort() >= 1024 && + _transport.canIntroduce(state.getSentIP().length == 16)) { // ensure > 0 long tag = 1 + _context.random().nextLong(MAX_TAG_VALUE); state.setSentRelayTag(tag); @@ -625,8 +625,8 @@ //if (admitted > 0) // _log.log(Log.CRIT, "Admitted " + admitted + " with " + remaining + " remaining queued and " + active + " active"); - if (_log.shouldLog(Log.INFO)) - _log.info("Outbound established completely! yay: " + state); + if (_log.shouldDebug()) + _log.debug("Outbound established: " + state); PeerState peer = handleCompletelyEstablished(state); notifyActivity(); return peer; @@ -760,8 +760,8 @@ */ private void sendInboundComplete(PeerState peer) { // SimpleTimer.getInstance().addEvent(new PublishToNewInbound(peer), 10*1000); - if (_log.shouldLog(Log.INFO)) - _log.info("Completing to the peer after IB confirm: " + peer); + if (_log.shouldDebug()) + _log.debug("IB confirm: " + peer); DeliveryStatusMessage dsm = new DeliveryStatusMessage(_context); dsm.setArrival(_networkID); // overloaded, sure, but future versions can check this // This causes huge values in the inNetPool.droppedDeliveryStatusDelay stat @@ -943,16 +943,16 @@ _context.statManager().addRateData("udp.sendIntroRelayRequest", 1); List requests = _builder.buildRelayRequest(_transport, this, state, _transport.getIntroKey()); if (requests.isEmpty()) { - // FIXME need a failed OB state if (_log.shouldLog(Log.WARN)) _log.warn("No valid introducers! " + state); - // set failed state, remove nonce, and return + processExpired(state); + return; } for (UDPPacket req : requests) { _transport.send(req); } if (_log.shouldLog(Log.DEBUG)) - _log.debug("Send intro for " + state + " with our intro key as " + _transport.getIntroKey()); + _log.debug("Send relay request for " + state + " with our intro key as " + _transport.getIntroKey()); state.introSent(); } @@ -1043,13 +1043,13 @@ /** * Are IP and port valid? This is only for checking the relay response. - * Reject all IPv6, for now, even if we are configured for it. + * Allow IPv6 as of 0.9.50. * Refuse anybody in the same /16 * @since 0.9.3, pkg private since 0.9.45 for PacketBuider */ boolean isValid(byte[] ip, int port) { return TransportUtil.isValidPort(port) && - ip != null && ip.length == 4 && + ip != null && _transport.isValid(ip) && (!_transport.isTooClose(ip)) && (!_context.blocklist().isBlocklisted(ip)); @@ -1377,7 +1377,7 @@ boolean removed = _liveIntroductions.remove(Long.valueOf(nonce), outboundState); if (removed) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Send intro for " + outboundState + " timed out"); + _log.debug("Relay request for " + outboundState + " timed out"); _context.statManager().addRateData("udp.sendIntroRelayTimeout", 1); } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java 2021-05-19 12:12:00.000000000 +0000 @@ -13,14 +13,14 @@ import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.Base64; +import net.i2p.data.SessionKey; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterInfo; -import net.i2p.data.SessionKey; import net.i2p.router.RouterContext; +import net.i2p.router.transport.TransportUtil; import net.i2p.util.Addresses; -import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; -import net.i2p.router.transport.TransportUtil; +import net.i2p.util.VersionComparator; /** * Keep track of inbound and outbound introductions. @@ -78,8 +78,8 @@ private final PacketBuilder _builder; /** map of relay tag to PeerState that should receive the introduction */ private final Map _outbound; - /** list of peers (PeerState) who have given us introduction tags */ - private final Set _inbound; + /** map of relay tag to PeerState who have given us introduction tags */ + private final Map _inbound; private final Set _recentHolePunches; private long _lastHolePunchClean; @@ -98,8 +98,9 @@ /** Max one per target in this time */ private static final long PUNCH_CLEAN_TIME = 5*1000; /** Max for all targets per PUNCH_CLEAN_TIME */ - private static final int MAX_PUNCHES = 8; + private static final int MAX_PUNCHES = 20; private static final long INTRODUCER_EXPIRATION = 80*60*1000L; + private static final String MIN_IPV6_INTRODUCER_VERSION = "0.9.50"; public IntroductionManager(RouterContext ctx, UDPTransport transport) { _context = ctx; @@ -107,7 +108,7 @@ _transport = transport; _builder = new PacketBuilder(ctx, transport); _outbound = new ConcurrentHashMap(MAX_OUTBOUND); - _inbound = new ConcurrentHashSet(MAX_INBOUND); + _inbound = new ConcurrentHashMap(MAX_INBOUND); _recentHolePunches = new HashSet(16); ctx.statManager().createRateStat("udp.receiveRelayIntro", "How often we get a relayed request for us to talk to someone?", "udp", UDPTransport.RATES); ctx.statManager().createRateStat("udp.receiveRelayRequest", "How often we receive a good request to relay to someone else?", "udp", UDPTransport.RATES); @@ -125,32 +126,44 @@ // let's not use an introducer on a privileged port, sounds like trouble if (!TransportUtil.isValidPort(peer.getRemotePort())) return; - // Only allow relay as Bob or Charlie if the Bob-Charlie session is IPv4 - if (peer.getRemoteIP().length != 4) - return; - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Adding peer " + peer.getRemoteHostId() + ", weRelayToThemAs " - + peer.getWeRelayToThemAs() + ", theyRelayToUsAs " + peer.getTheyRelayToUsAs()); - if (peer.getWeRelayToThemAs() > 0) - _outbound.put(Long.valueOf(peer.getWeRelayToThemAs()), peer); - if (peer.getTheyRelayToUsAs() > 0 && _inbound.size() < MAX_INBOUND) { - _inbound.add(peer); - } + long id = peer.getWeRelayToThemAs(); + boolean added = id > 0; + if (added) + _outbound.put(Long.valueOf(id), peer); + long id2 = peer.getTheyRelayToUsAs(); + if (id2 > 0 && _inbound.size() < MAX_INBOUND) { + added = true; + _inbound.put(Long.valueOf(id2), peer); + } + if (added &&_log.shouldLog(Log.DEBUG)) + _log.debug("adding peer " + peer.getRemotePeer() + ' ' + peer.getRemoteHostId() + ", weRelayToThemAs " + + id + ", theyRelayToUsAs " + id2); } public void remove(PeerState peer) { if (peer == null) return; - if (_log.shouldLog(Log.DEBUG)) - _log.debug("removing peer " + peer.getRemoteHostId() + ", weRelayToThemAs " - + peer.getWeRelayToThemAs() + ", theyRelayToUsAs " + peer.getTheyRelayToUsAs()); long id = peer.getWeRelayToThemAs(); if (id > 0) _outbound.remove(Long.valueOf(id)); - if (peer.getTheyRelayToUsAs() > 0) { - _inbound.remove(peer); - } + long id2 = peer.getTheyRelayToUsAs(); + if (id2 > 0) { + _inbound.remove(Long.valueOf(id2)); + } + if ((id > 0 || id2 > 0) &&_log.shouldLog(Log.DEBUG)) + _log.debug("removing peer " + peer.getRemotePeer() + ' ' + peer.getRemoteHostId() + ", weRelayToThemAs " + + id + ", theyRelayToUsAs " + id2); } + /** + * Is this inbound tag currently valid, + * i.e. is the peer still connected? + * + * @since 0.9.50 + */ + public boolean isInboundTagValid(long tag) { + return _inbound.containsKey(Long.valueOf(tag)); + } + private PeerState get(long id) { return _outbound.get(Long.valueOf(id)); } @@ -168,15 +181,16 @@ * and we want to keep our introducers valid. * * @param current current router address, may be null + * @param ipv6 what type is the current address we need introducers for? * @param ssuOptions out parameter, options are added * @return number of introducers added */ - public int pickInbound(RouterAddress current, Properties ssuOptions, int howMany) { + public int pickInbound(RouterAddress current, boolean ipv6, Properties ssuOptions, int howMany) { int start = _context.random().nextInt(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Picking inbound out of " + _inbound.size()); if (_inbound.isEmpty()) return 0; - List peers = new ArrayList(_inbound); + List peers = new ArrayList(_inbound.values()); int sz = peers.size(); start = start % sz; int found = 0; @@ -186,8 +200,33 @@ if (sz <= howMany + 2) inactivityCutoff -= UDPTransport.EXPIRE_TIMEOUT / 4; List introducers = new ArrayList(howMany); + String exp = Long.toString((now + INTRODUCER_EXPIRATION) / 1000); + + // reuse old ones if ok + if (current != null) { + UDPAddress ua = new UDPAddress(current); + for (int i = 0; i < ua.getIntroducerCount(); i++) { + long lexp = ua.getIntroducerExpiration(i); + if (lexp > 0 && lexp < now + UDPTransport.INTRODUCER_EXPIRATION_MARGIN) + continue; + long tag = ua.getIntroducerTag(i); + if (!isInboundTagValid(tag)) + continue; + introducers.add(new Introducer(ua.getIntroducerHost(i).getAddress(), + ua.getIntroducerPort(i), + ua.getIntroducerKey(i), + tag, + Long.toString(ua.getIntroducerExpiration(i) / 1000))); + if (_log.shouldInfo()) + _log.info("Reusing introducer: " + ua.getIntroducerHost(i)); + found++; + } + } + for (int i = 0; i < sz && found < howMany; i++) { PeerState cur = peers.get((start + i) % sz); + if (cur.isIPv6() != ipv6) + continue; RouterInfo ri = _context.netDb().lookupRouterInfoLocally(cur.getRemotePeer()); if (ri == null) { if (_log.shouldLog(Log.INFO)) @@ -196,8 +235,8 @@ } // FIXME we can include all his addresses including IPv6 even if we don't support IPv6 (isValid() is false) // but requires RelayRequest support, see below - RouterAddress ra = _transport.getTargetAddress(ri); - if (ra == null) { + List ras = _transport.getTargetAddresses(ri); + if (ras.isEmpty()) { if (_log.shouldLog(Log.INFO)) _log.info("Picked peer has no SSU address: " + ri); continue; @@ -219,33 +258,55 @@ _log.info("Peer is idle too long: " + cur); continue; } - // FIXME we can include all his addresses including IPv6 even if we don't support IPv6 (isValid() is false) - // but requires RelayRequest support, see below - byte[] ip = cur.getRemoteIP(); - int port = cur.getRemotePort(); - if (!isValid(ip, port)) - continue; - if (_log.shouldLog(Log.INFO)) + int oldFound = found; + loop: + for (RouterAddress ra : ras) { + byte[] ip = ra.getIP(); + if (ip == null) + continue; + // we must canonicalize IPv6 addresses + String host = ip.length == 4 ? ra.getHost() : Addresses.toString(ip); + if (host == null) + continue; + // dup check of reused introducers + for (Introducer intro : introducers) { + if (host.equals(intro.sip)) + continue loop; + } + int port = ra.getPort(); + if (!isValid(ip, port, true)) + continue; + // IPv6/IPv4 and vice versa allowed as of 0.9.50 + if (((!ipv6 && ip.length == 16) || (ipv6 && ip.length == 4)) && + VersionComparator.comp(ri.getVersion(), MIN_IPV6_INTRODUCER_VERSION) < 0) { + if (_log.shouldLog(Log.INFO)) + _log.info("IPv6 intro. for IPv4 or IPv4 intro for IPv6 but he doesn't support it: " + cur); + continue; + } + cur.setIntroducerTime(); + UDPAddress ura = new UDPAddress(ra); + byte[] ikey = ura.getIntroKey(); + if (ikey == null) + continue; + introducers.add(new Introducer(ip, port, ikey, cur.getTheyRelayToUsAs(), exp)); + found++; + // two per router max + if (found - oldFound >= 2) + break; + } + if (oldFound != found && _log.shouldLog(Log.INFO)) _log.info("Picking introducer: " + cur); - cur.setIntroducerTime(); - UDPAddress ura = new UDPAddress(ra); - byte[] ikey = ura.getIntroKey(); - if (ikey == null) - continue; - introducers.add(new Introducer(ip, port, ikey, cur.getTheyRelayToUsAs())); - found++; } // we sort them so a change in order only won't happen, and won't cause a republish Collections.sort(introducers); - String exp = Long.toString((now + INTRODUCER_EXPIRATION) / 1000); for (int i = 0; i < found; i++) { Introducer in = introducers.get(i); ssuOptions.setProperty(UDPAddress.PROP_INTRO_HOST_PREFIX + i, in.sip); ssuOptions.setProperty(UDPAddress.PROP_INTRO_PORT_PREFIX + i, in.sport); ssuOptions.setProperty(UDPAddress.PROP_INTRO_KEY_PREFIX + i, in.skey); ssuOptions.setProperty(UDPAddress.PROP_INTRO_TAG_PREFIX + i, in.stag); - String sexp = exp; + String sexp = in.sexp; // look for existing expiration in current published // and reuse if still recent enough, so deepEquals() won't fail in UDPT.rEA if (current != null) { @@ -283,13 +344,14 @@ * @since 0.9.18 */ private static class Introducer implements Comparable { - public final String sip, sport, skey, stag; + public final String sip, sport, skey, stag, sexp; - public Introducer(byte[] ip, int port, byte[] key, long tag) { + public Introducer(byte[] ip, int port, byte[] key, long tag, String exp) { sip = Addresses.toString(ip); sport = String.valueOf(port); skey = Base64.encode(key); stag = String.valueOf(tag); + sexp = exp; } @Override @@ -325,7 +387,7 @@ long now = _context.clock().now(); long pingCutoff = now - (105 * 60 * 1000); long inactivityCutoff = now - UDPTransport.MIN_EXPIRE_TIMEOUT; - for (PeerState cur : _inbound) { + for (PeerState cur : _inbound.values()) { if (cur.getIntroducerTime() > pingCutoff && cur.getLastSendTime() < inactivityCutoff) { if (_log.shouldLog(Log.INFO)) @@ -340,13 +402,22 @@ * Not as elaborate as pickInbound() above. * Just a quick check to see how many volunteers we know, * which the Transport uses to see if we need more. + * + * @param ipv6 what type of address are they introducing us for * @return number of peers that have volunteered to introduce us */ - int introducerCount() { - return _inbound.size(); + int introducerCount(boolean ipv6) { + int rv = 0; + for (PeerState ps : _inbound.values()) { + if (ps.isIPv6() == ipv6) + rv++; + } + return rv; } /** + * Combined IPv4 and IPv6 + * * @return number of peers we have volunteered to introduce * @since 0.9.3 */ @@ -380,7 +451,8 @@ reader.getRelayIntroReader().readIP(ip, 0); int port = reader.getRelayIntroReader().readPort(); - if ((!isValid(ip, port)) || (!isValid(bob.getIP(), bob.getPort()))) { + // allow IPv6 as of 0.9.50 + if ((!isValid(ip, port, true)) || (!isValid(bob.getIP(), bob.getPort(), true))) { if (_log.shouldLog(Log.WARN)) _log.warn("Bad relay intro from " + bob + " for " + Addresses.toString(ip, port)); _context.statManager().addRateData("udp.relayBadIP", 1); @@ -468,47 +540,64 @@ int ipSize = rrReader.readIPSize(); int port = rrReader.readPort(); - // ip/port inside message should be 0:0, as it's unimplemented on send - - // see PacketBuilder.buildRelayRequest() - // and we don't read it here. - // FIXME implement for getting Alice's IPv4 in RelayRequest sent over IPv6? - // or is that just too easy to spoof? byte[] aliceIP = alice.getIP(); int alicePort = alice.getPort(); - if (!isValid(alice.getIP(), alice.getPort())) { + boolean ipIncluded = ipSize != 0; + // here we allow IPv6 + if (!isValid(aliceIP, alicePort, true)) { + // not necessarily invalid ip/port, could be blocklisted if (_log.shouldWarn()) - _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(aliceIP, alicePort)); + _log.warn("Rejecting relay req from " + alice + " for " + Addresses.toString(aliceIP, alicePort)); _context.statManager().addRateData("udp.relayBadIP", 1); return; } // prior to 0.9.24 we rejected any non-zero-length ip - // here we reject anything different - // TODO relay request over IPv6 - if (ipSize != 0) { + // here we reject anything different if it's the same size + // As of 0.9.50 we allow relay request over IPv6 + if (ipIncluded) { byte ip[] = new byte[ipSize]; rrReader.readIP(ip, 0); - if (!Arrays.equals(aliceIP, ip)) { + if (ipSize == aliceIP.length && !Arrays.equals(aliceIP, ip)) { if (_log.shouldWarn()) _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(ip, port)); _context.statManager().addRateData("udp.relayBadIP", 1); return; } + aliceIP = ip; } // prior to 0.9.24 we rejected any nonzero port // here we reject anything different - // TODO relay request over IPv6 - if (port != 0 && port != alicePort) { - if (_log.shouldWarn()) - _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(aliceIP, port)); - _context.statManager().addRateData("udp.relayBadIP", 1); + // As of 0.9.50 we allow it if the IP was included + if (port != 0) { + if (ipIncluded) { + alicePort = port; + } else if (port != alicePort) { + if (_log.shouldWarn()) + _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(aliceIP, port)); + _context.statManager().addRateData("udp.relayBadIP", 1); + } return; } + // check again if IP was provided + // allow IPv6 as of 0.9.50 + RemoteHostId aliceRelayID; + if (ipIncluded) { + if (!isValid(aliceIP, alicePort, true)) { + if (_log.shouldWarn()) + _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(aliceIP, alicePort)); + _context.statManager().addRateData("udp.relayBadIP", 1); + return; + } + aliceRelayID = new RemoteHostId(aliceIP, alicePort); + } else { + aliceRelayID = alice; + } PeerState charlie = get(tag); if (charlie == null) { if (_log.shouldLog(Log.INFO)) _log.info("Receive relay request from " + alice - + " with unknown tag"); + + " with unknown tag " + tag); _context.statManager().addRateData("udp.receiveRelayRequestBadTag", 1); return; } @@ -522,7 +611,7 @@ _context.statManager().addRateData("udp.receiveRelayRequest", 1); // send that peer an introduction for alice - _transport.send(_builder.buildRelayIntro(alice, charlie, reader.getRelayRequestReader())); + _transport.send(_builder.buildRelayIntro(aliceRelayID, charlie, rrReader)); // send alice back charlie's info // lookup session so we can use session key if available @@ -546,7 +635,7 @@ if (_log.shouldLog(Log.INFO)) _log.info("Sending relay response (in-session) to " + alice); } - _transport.send(_builder.buildRelayResponse(alice, charlie, reader.getRelayRequestReader().readNonce(), + _transport.send(_builder.buildRelayResponse(alice, charlie, rrReader.readNonce(), cipherKey, macKey)); } @@ -556,9 +645,20 @@ * Refuse anybody in the same /16 * @since 0.9.3 */ +/* private boolean isValid(byte[] ip, int port) { + return isValid(ip, port, false); + } +*/ + + /** + * Are IP and port valid? + * @since 0.9.50 + */ + private boolean isValid(byte[] ip, int port, boolean allowIPv6) { return TransportUtil.isValidPort(port) && - ip != null && ip.length == 4 && + ip != null && + (ip.length == 4 || (allowIPv6 && ip.length == 16)) && _transport.isValid(ip) && (!_transport.isTooClose(ip)) && (!_context.blocklist().isBlocklisted(ip)); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java 2021-05-19 12:12:00.000000000 +0000 @@ -2,6 +2,7 @@ import java.net.DatagramPacket; import java.net.InetAddress; +import java.net.Inet6Address; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; @@ -16,6 +17,7 @@ import net.i2p.data.router.RouterIdentity; import net.i2p.data.SessionKey; import net.i2p.data.Signature; +import net.i2p.data.router.RouterAddress; import net.i2p.router.RouterContext; import net.i2p.router.transport.TransportUtil; import net.i2p.util.Addresses; @@ -411,8 +413,7 @@ if (explicitToSend > 0) { if (msg != null) msg.append(explicitToSend).append(" full acks included:"); - DataHelper.toLong(data, off, 1, explicitToSend); - off++; + data[off++] = (byte) explicitToSend; Iterator iter = ackIdsRemaining.iterator(); for (int i = 0; i < explicitToSend && iter.hasNext(); i++) { Long ackId = iter.next(); @@ -471,8 +472,7 @@ //if ( (msg != null) && (acksIncluded) ) // _log.debug(msg.toString()); - DataHelper.toLong(data, off, 1, numFragments); - off++; + data[off++] = (byte) numFragments; // now write each fragment int sizeWritten = 0; @@ -625,8 +625,7 @@ off++; if (fullACKCount > 0) { - DataHelper.toLong(data, off, 1, fullACKCount); - off++; + data[off++] = (byte) fullACKCount; for (int i = 0; i < ackBitfields.size(); i++) { ACKBitfield bf = ackBitfields.get(i); if (bf.receivedComplete()) { @@ -639,8 +638,7 @@ } if (partialACKCount > 0) { - DataHelper.toLong(data, off, 1, partialACKCount); - off++; + data[off++] = (byte) partialACKCount; for (int i = 0; i < ackBitfields.size(); i++) { ACKBitfield bitfield = ackBitfields.get(i); if (bitfield.receivedComplete()) continue; @@ -670,8 +668,7 @@ } } - DataHelper.toLong(data, off, 1, 0); // no fragments in this message - off++; + data[off++] = 0; // no fragments in this message if (msg != null) _log.debug(msg.toString()); @@ -720,8 +717,7 @@ // now for the body System.arraycopy(state.getSentY(), 0, data, off, state.getSentY().length); off += state.getSentY().length; - DataHelper.toLong(data, off, 1, sentIP.length); - off += 1; + data[off++] = (byte) sentIP.length; System.arraycopy(sentIP, 0, data, off, sentIP.length); off += sentIP.length; DataHelper.toLong(data, off, 2, state.getSentPort()); @@ -826,8 +822,7 @@ byte[] x = state.getSentX(); System.arraycopy(x, 0, data, off, x.length); off += x.length; - DataHelper.toLong(data, off, 1, toIP.length); - off += 1; + data[off++] = (byte) toIP.length; System.arraycopy(toIP, 0, data, off, toIP.length); off += toIP.length; int port = state.getSentPort(); @@ -1074,8 +1069,7 @@ // now for the body DataHelper.toLong(data, off, 4, nonce); off += 4; - DataHelper.toLong(data, off, 1, 0); // neither Bob nor Charlie need Alice's IP from her - off++; + data[off++] = 0; // neither Bob nor Charlie need Alice's IP from her DataHelper.toLong(data, off, 2, 0); // neither Bob nor Charlie need Alice's port from her off += 2; System.arraycopy(aliceIntroKey.getData(), 0, data, off, SessionKey.KEYSIZE_BYTES); @@ -1109,8 +1103,7 @@ DataHelper.toLong(data, off, 4, nonce); off += 4; byte ip[] = aliceIP.getAddress(); - DataHelper.toLong(data, off, 1, ip.length); - off++; + data[off++] = (byte) ip.length; System.arraycopy(ip, 0, data, off, ip.length); off += ip.length; DataHelper.toLong(data, off, 2, alicePort); @@ -1147,8 +1140,7 @@ DataHelper.toLong(data, off, 4, nonce); off += 4; byte ip[] = aliceIP.getAddress(); - DataHelper.toLong(data, off, 1, ip.length); - off++; + data[off++] = (byte) ip.length; System.arraycopy(ip, 0, data, off, ip.length); off += ip.length; DataHelper.toLong(data, off, 2, alicePort); @@ -1185,8 +1177,7 @@ DataHelper.toLong(data, off, 4, nonce); off += 4; byte ip[] = aliceIP.getAddress(); - DataHelper.toLong(data, off, 1, ip.length); - off++; + data[off++] = (byte) ip.length; System.arraycopy(ip, 0, data, off, ip.length); off += ip.length; DataHelper.toLong(data, off, 2, alicePort); @@ -1204,12 +1195,6 @@ return packet; } - // specify these if we know what our external receive ip/port is and if its different - // from what bob is going to think - // FIXME IPv4 addr must be specified when sent over IPv6 - private byte[] getOurExplicitIP() { return null; } - private int getOurExplicitPort() { return 0; } - /** * build intro packets for each of the published introducers * @@ -1229,17 +1214,33 @@ long tag = addr.getIntroducerTag(i); long exp = addr.getIntroducerExpiration(i); // let's not use an introducer on a privileged port, sounds like trouble - if (ikey == null || - iaddr == null || tag <= 0 || - // we must use the same isValid() as EstablishmentManager.receiveRelayResponse(). - // If an introducer isn't valid, we shouldn't send to it - !emgr.isValid(iaddr.getAddress(), iport) || - (exp > 0 && exp < cutoff) || + if (iaddr == null) { + if (_log.shouldWarn()) + _log.warn("Cannot build a relay request for " + state.getRemoteIdentity().calculateHash() + + " slot " + i + " no address"); + continue; + } + if (ikey == null || tag <= 0) { + if (_log.shouldWarn()) + _log.warn("Cannot build a relay request for " + state.getRemoteIdentity().calculateHash() + + " slot " + i + " no key/tag"); + continue; + } + if (exp > 0 && exp < cutoff) { + if (_log.shouldWarn()) + _log.warn("Cannot build a relay request for " + state.getRemoteIdentity().calculateHash() + + ", expired " + DataHelper.formatTime(exp) + + " : " + Addresses.toString(iaddr.getAddress(), iport)); + continue; + } + // we must use the same isValid() as EstablishmentManager.receiveRelayResponse(). + // If an introducer isn't valid, we shouldn't send to it + if (!emgr.isValid(iaddr.getAddress(), iport) || // FIXME this will have already failed in isValid() above, right? (Arrays.equals(iaddr.getAddress(), _transport.getExternalIP()) && !_transport.allowLocal())) { - if (_log.shouldLog(Log.WARN)) + if (_log.shouldWarn()) _log.warn("Cannot build a relay request for " + state.getRemoteIdentity().calculateHash() - + ", as the introducer address is invalid: " + iaddr + ':' + iport); + + ", introducer address is invalid or blocklisted: " + Addresses.toString(iaddr.getAddress(), iport)); // TODO implement some sort of introducer banlist continue; } @@ -1266,22 +1267,24 @@ cipherKey = new SessionKey(ikey); macKey = cipherKey; if (_log.shouldLog(Log.INFO)) - _log.info("Sending relay request (w/ intro key) to " + iaddr + ":" + iport); + _log.info("Sending relay request (w/ intro key) to " + Addresses.toString(iaddr.getAddress(), iport)); } else { if (_log.shouldLog(Log.INFO)) - _log.info("Sending relay request (in-session) to " + iaddr + ":" + iport); + _log.info("Sending relay request (in-session) to " + Addresses.toString(iaddr.getAddress(), iport)); } - rv.add(buildRelayRequest(iaddr, iport, cipherKey, macKey, tag, - ourIntroKey, state.getIntroNonce())); + UDPPacket pkt = buildRelayRequest(iaddr, iport, cipherKey, macKey, tag, ourIntroKey, state.getIntroNonce()); + if (pkt != null) + rv.add(pkt); + else if (_log.shouldWarn()) + _log.warn("Cannot build a relay request for " + state.getRemoteIdentity().calculateHash() + + ", as we don't have an address to send to: " + Addresses.toString(iaddr.getAddress(), iport)); } return rv; } /** - * TODO Alice IP/port in packet will always be null/0, must be fixed to - * send a RelayRequest over IPv6 - * + * @return null on failure */ private UDPPacket buildRelayRequest(InetAddress introHost, int introPort, SessionKey cipherKey, SessionKey macKey, @@ -1291,30 +1294,48 @@ byte data[] = pkt.getData(); int off = HEADER_SIZE; - // FIXME must specify these if request is going over IPv6 - byte ourIP[] = getOurExplicitIP(); - int ourPort = getOurExplicitPort(); + // Must specify these if request is going over IPv6 for v4 or vice versa + byte ourIP[]; + int ourPort; + if (introHost instanceof Inet6Address) { + RouterAddress ra = _transport.getCurrentExternalAddress(true); + if (ra == null) { + ra = _transport.getCurrentExternalAddress(false); + if (ra == null) + return null; + } + byte[] ip = ra.getIP(); + if (ip == null) + return null; + if (ip.length != 16) { + ourIP = ip; + ourPort = _transport.getRequestedPort(); + } else { + ourIP = null; + ourPort = 0; + } + } else { + // TODO IPv4 introducer, IPv6 introduction + ourIP = null; + ourPort = 0; + } // now for the body DataHelper.toLong(data, off, 4, introTag); off += 4; if (ourIP != null) { - DataHelper.toLong(data, off, 1, ourIP.length); - off++; + data[off++] = (byte) ourIP.length; System.arraycopy(ourIP, 0, data, off, ourIP.length); off += ourIP.length; } else { - DataHelper.toLong(data, off, 1, 0); - off++; + data[off++] = 0; } DataHelper.toLong(data, off, 2, ourPort); off += 2; // challenge... - DataHelper.toLong(data, off, 1, 0); - off++; - //off += 0; // *cough* + data[off++] = 0; System.arraycopy(ourIntroKey.getData(), 0, data, off, SessionKey.KEYSIZE_BYTES); off += SessionKey.KEYSIZE_BYTES; @@ -1347,18 +1368,16 @@ // now for the body byte ip[] = alice.getIP(); - DataHelper.toLong(data, off, 1, ip.length); - off++; + data[off++] = (byte) ip.length; System.arraycopy(ip, 0, data, off, ip.length); off += ip.length; DataHelper.toLong(data, off, 2, alice.getPort()); off += 2; int sz = request.readChallengeSize(); - DataHelper.toLong(data, off, 1, sz); - off++; + data[off++] = (byte) sz; if (sz > 0) { - request.readChallengeSize(data, off); + request.readChallengeData(data, off); off += sz; } @@ -1391,8 +1410,7 @@ // now for the body byte charlieIP[] = charlie.getRemoteIP(); - DataHelper.toLong(data, off, 1, charlieIP.length); - off++; + data[off++] = (byte) charlieIP.length; System.arraycopy(charlieIP, 0, data, off, charlieIP.length); off += charlieIP.length; DataHelper.toLong(data, off, 2, charlie.getRemotePort()); @@ -1400,8 +1418,7 @@ // Alice IP/Port currently ignored on receive - see UDPPacketReader byte aliceIP[] = alice.getIP(); - DataHelper.toLong(data, off, 1, aliceIP.length); - off++; + data[off++] = (byte) aliceIP.length; System.arraycopy(aliceIP, 0, data, off, aliceIP.length); off += aliceIP.length; DataHelper.toLong(data, off, 2, alice.getPort()); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PacketHandler.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PacketHandler.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PacketHandler.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PacketHandler.java 2021-05-19 12:12:00.000000000 +0000 @@ -46,7 +46,11 @@ private static final int MAX_QUEUE_SIZE = 192; private static final int MIN_NUM_HANDLERS = 1; // unless < 32MB private static final int MAX_NUM_HANDLERS = 1; - /** let packets be up to 30s slow */ + /** + * Let packets be up to this much skewed. + * This is the same limit as in InNetMessagePool's MessageValidator. + * There's no use making it any larger, as messages will just be thrown out there. + */ private static final long GRACE_PERIOD = Router.CLOCK_FUDGE_FACTOR + 30*1000; private static final long MAX_SKEW = 90*24*60*60*1000L; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerState.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerState.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerState.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerState.java 2021-05-19 12:12:00.000000000 +0000 @@ -24,6 +24,7 @@ import net.i2p.router.util.CachedIteratorCollection; import net.i2p.router.util.CoDelPriorityBlockingQueue; import net.i2p.router.util.PriBlockingQueue; +import net.i2p.util.BandwidthEstimator; import net.i2p.util.Log; import net.i2p.util.ConcurrentHashSet; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerTestEvent.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerTestEvent.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerTestEvent.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerTestEvent.java 2021-05-19 12:12:00.000000000 +0000 @@ -8,7 +8,7 @@ import static net.i2p.router.transport.TransportUtil.IPv6Config.*; import static net.i2p.router.transport.udp.PeerTestState.Role.*; - + /** * Initiate a test (we are Alice) * @@ -26,6 +26,7 @@ private final AtomicLong _lastTestedV6 = new AtomicLong(); private static final int NO_FORCE = 0, FORCE_IPV4 = 1, FORCE_IPV6 = 2; private int _forceRun; + private boolean _lastTestIPv6 = true; private static final int TEST_FREQUENCY = 13*60*1000; private static final int MIN_TEST_FREQUENCY = 45*1000; @@ -37,7 +38,7 @@ _transport = udp; _testManager = ptmgr; } - + public synchronized void timeReached() { if (shouldTest()) { long now = _context.clock().now(); @@ -45,14 +46,17 @@ long sinceRunV6 = now - _lastTestedV6.get(); boolean configV4fw = _transport.isIPv4Firewalled(); boolean configV6fw = _transport.isIPv6Firewalled(); + boolean preferV4 = _lastTestIPv6; if (!configV4fw && _forceRun == FORCE_IPV4 && sinceRunV4 >= MIN_TEST_FREQUENCY) { locked_runTest(false); } else if (!configV6fw && _forceRun == FORCE_IPV6 && _transport.hasIPv6Address() && sinceRunV6 >= MIN_TEST_FREQUENCY) { locked_runTest(true); - } else if (!configV4fw && sinceRunV4 >= TEST_FREQUENCY && _transport.getIPv6Config() != IPV6_ONLY) { + } else if (preferV4 && !configV4fw && sinceRunV4 >= TEST_FREQUENCY && _transport.getIPv6Config() != IPV6_ONLY) { locked_runTest(false); } else if (!configV6fw && _transport.hasIPv6Address() && sinceRunV6 >= TEST_FREQUENCY) { locked_runTest(true); + } else if (!preferV4 && !configV4fw && sinceRunV4 >= TEST_FREQUENCY && _transport.getIPv6Config() != IPV6_ONLY) { + locked_runTest(false); } else { if (_log.shouldLog(Log.INFO)) _log.info("PTE timeReached(), no test run, last v4 test: " + new java.util.Date(_lastTested.get()) + @@ -72,8 +76,9 @@ schedule(delay); } } - + private void locked_runTest(boolean isIPv6) { + _lastTestIPv6 = isIPv6; PeerState bob = _transport.pickTestPeer(BOB, isIPv6, null); if (bob != null) { if (_log.shouldLog(Log.INFO)) @@ -88,7 +93,7 @@ // so we don't get stuck running the same test over and over _forceRun = NO_FORCE; } - + /** * Run within the next 45 seconds at the latest * @since 0.9.13 @@ -96,7 +101,7 @@ public synchronized void forceRunSoon(boolean isIPv6) { forceRunSoon(isIPv6, MIN_TEST_FREQUENCY); } - + /** * Run within the specified time at the latest * @since 0.9.39 @@ -113,7 +118,7 @@ _log.debug("reschedule for " + net.i2p.data.DataHelper.formatDuration(delay)); reschedule(delay); } - + /** * * Run within the next 5 seconds at the latest @@ -122,7 +127,7 @@ public synchronized void forceRunImmediately(boolean isIPv6) { forceRunSoon(isIPv6, 5*1000); } - + public synchronized void setIsAlive(boolean isAlive) { if (_log.shouldLog(Log.DEBUG)) _log.debug("PTE.setIsAlive(), isAlive? " + isAlive, new Exception()); @@ -151,9 +156,10 @@ if (_log.shouldLog(Log.DEBUG)) _log.debug("PTE.setLastTested() - v6? " + isIPv6, new Exception()); } - + private boolean shouldTest() { return ! (_context.router().isHidden() || + _context.router().gracefulShutdownInProgress() || (_transport.isIPv4Firewalled() && _transport.isIPv6Firewalled())); //String val = _context.getProperty(PROP_SHOULD_TEST); //return ( (val != null) && ("true".equals(val)) ); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java 2021-05-19 12:12:00.000000000 +0000 @@ -195,7 +195,6 @@ test.setBobPort(bobPort); test.setBobCipherKey(bobCipherKey); test.setBobMACKey(bobMACKey); - test.setLastSendTime(test.getBeginTime()); _currentTest = test; _currentTestComplete = false; @@ -225,13 +224,18 @@ // already completed, possibly on to the next test return; } else if (expired()) { - testComplete(true); - } else if (_context.clock().now() - state.getLastSendTime() >= RESEND_TIMEOUT) { + if (!_currentTestComplete) + testComplete(); + return; + } + long timeSinceSend = _context.clock().now() - state.getLastSendTime(); + if (timeSinceSend >= RESEND_TIMEOUT) { int sent = state.incrementPacketsRelayed(); if (sent > MAX_RELAYED_PER_TEST_ALICE) { - testComplete(false); if (_log.shouldLog(Log.WARN)) _log.warn("Sent too many packets: " + state); + if (!_currentTestComplete) + testComplete(); return; } if (state.getReceiveBobTime() <= 0) { @@ -248,6 +252,8 @@ } // retx at 4, 10, 17, 25 elapsed time _context.simpleTimer2().addEvent(ContinueTest.this, RESEND_TIMEOUT + (sent*1000)); + } else { + _context.simpleTimer2().addEvent(ContinueTest.this, RESEND_TIMEOUT - timeSinceSend); } } } @@ -268,6 +274,7 @@ if (!expired()) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Sending test to Bob: " + test); + test.setLastSendTime(_context.clock().now()); _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getBobIP(), test.getBobPort(), test.getBobCipherKey(), test.getBobMACKey(), //_bobIntroKey, test.getNonce(), _transport.getIntroKey())); @@ -282,6 +289,7 @@ if (!expired()) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Sending test to Charlie: " + test); + test.setLastSendTime(_context.clock().now()); _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getCharlieIP(), test.getCharliePort(), test.getCharlieIntroKey(), test.getNonce(), _transport.getIntroKey())); @@ -346,7 +354,7 @@ if (_log.shouldLog(Log.DEBUG)) _log.debug("Receive test reply from Bob: " + test); if (test.getAlicePortFromCharlie() > 0) - testComplete(true); + testComplete(); } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to get our IP (length " + ipSize + @@ -391,7 +399,7 @@ if (_log.shouldLog(Log.DEBUG)) _log.debug("Receive test reply from Charlie: " + test); if (test.getReceiveBobTime() > 0) - testComplete(true); + testComplete(); } catch (UnknownHostException uhe) { if (_log.shouldWarn()) _log.warn("Charlie @ " + from + " said we were an invalid IP address: " + uhe.getMessage(), uhe); @@ -399,9 +407,10 @@ } } else { if (test.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_ALICE) { - testComplete(false); if (_log.shouldLog(Log.WARN)) _log.warn("Sent too many packets on the test: " + test); + if (!_currentTestComplete) + testComplete(); return; } @@ -433,11 +442,9 @@ * Evaluate the info we have and act accordingly, since the test has either timed out or * we have successfully received the second PeerTest from a Charlie. * - * @param forgetTest must be true to clear out this test and allow another - * * call from a synchronized method */ - private void testComplete(boolean forgetTest) { + private void testComplete() { _currentTestComplete = true; PeerTestState test = _currentTest; @@ -476,8 +483,7 @@ _log.info("Test complete: " + test); honorStatus(status, isIPv6); - if (forgetTest) - _currentTest = null; + _currentTest = null; } /** @@ -688,7 +694,6 @@ state.setAliceIntroKey(aliceIntroKey); state.setBobIP(bobIP); state.setBobPort(from.getPort()); - state.setLastSendTime(now); state.setReceiveBobTime(now); PeerState bob = _transport.getPeerState(from); @@ -716,6 +721,7 @@ _context.simpleTimer2().addEvent(new RemoveTest(nonce), MAX_CHARLIE_LIFETIME); } + state.setLastSendTime(now); UDPPacket packet = _packetBuilder.buildPeerTestToBob(bobIP, from.getPort(), aliceIP, alicePort, aliceIntroKey, nonce, state.getBobCipherKey(), state.getBobMACKey()); @@ -810,7 +816,6 @@ state.setCharlieIP(charlie.getRemoteIPAddress()); state.setCharliePort(charlie.getRemotePort()); state.setCharlieIntroKey(charlieIntroKey); - state.setLastSendTime(now); state.setReceiveAliceTime(now); if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_BOB) { @@ -824,6 +829,7 @@ _context.simpleTimer2().addEvent(new RemoveTest(nonce), MAX_CHARLIE_LIFETIME); } + state.setLastSendTime(now); UDPPacket packet = _packetBuilder.buildPeerTestToCharlie(aliceIP, from.getPort(), aliceIntroKey, nonce, charlie.getRemoteIPAddress(), charlie.getRemotePort(), @@ -862,6 +868,7 @@ return; } state.setReceiveCharlieTime(now); + state.setLastSendTime(now); UDPPacket packet = _packetBuilder.buildPeerTestToAlice(state.getAliceIP(), state.getAlicePort(), state.getAliceIntroKey(), state.getCharlieIntroKey(), @@ -894,6 +901,7 @@ return; } state.setReceiveAliceTime(now); + state.setLastSendTime(now); try { InetAddress aliceIP = InetAddress.getByAddress(from.getIP()); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerTestState.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerTestState.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/PeerTestState.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/PeerTestState.java 2021-05-19 12:12:00.000000000 +0000 @@ -3,6 +3,7 @@ import java.net.InetAddress; import java.util.concurrent.atomic.AtomicInteger; +import net.i2p.data.DataHelper; import net.i2p.data.SessionKey; /** @@ -119,6 +120,8 @@ public String toString() { StringBuilder buf = new StringBuilder(256); buf.append("PeerTest ").append(_testNonce) + .append(_isIPv6 ? " IPv6" : " IPv4") + .append(" started ").append(DataHelper.formatTime(_beginTime)) .append(" as ").append(_ourRole.toString()); if (_aliceIP != null) buf.append("; Alice: ").append(_aliceIP).append(':').append(_alicePort); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/SimpleBandwidthEstimator.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/SimpleBandwidthEstimator.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/SimpleBandwidthEstimator.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/SimpleBandwidthEstimator.java 2021-05-19 12:12:00.000000000 +0000 @@ -2,6 +2,7 @@ import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; +import net.i2p.util.BandwidthEstimator; import net.i2p.util.Log; /** diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java 2021-05-19 12:12:00.000000000 +0000 @@ -748,7 +748,7 @@ } /** unused */ - public void readChallengeSize(byte target[], int targetOffset) { + public void readChallengeData(byte target[], int targetOffset) { int offset = readBodyOffset() + 4; offset += _message[offset] & 0xff; offset += 1 + 2; @@ -815,7 +815,7 @@ } /** unused */ - public void readChallengeSize(byte target[], int targetOffset) { + public void readChallengeData(byte target[], int targetOffset) { int offset = readBodyOffset(); offset += _message[offset] & 0xff; offset += 1 + 2; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/UDPSender.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/UDPSender.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/UDPSender.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/UDPSender.java 2021-05-19 12:12:00.000000000 +0000 @@ -35,8 +35,10 @@ // Queue needs to be big enough that we can compete with NTCP for // bandwidth requests, and so CoDel can work well. // When full, packets back up into the PacketPusher thread, pre-CoDel. - private static final int MIN_QUEUE_SIZE = 64; - private static final int MAX_QUEUE_SIZE = 384; + private static final int MIN_QUEUE_SIZE = 128; + private static final int MAX_QUEUE_SIZE = 768; + private static final int CODEL_TARGET = 100; + private static final int CODEL_INTERVAL = 500; public UDPSender(RouterContext ctx, DatagramSocket socket, String name, SocketListener lsnr) { _context = ctx; @@ -44,7 +46,7 @@ _log = ctx.logManager().getLog(UDPSender.class); long maxMemory = SystemVersion.getMaxMemory(); int qsize = (int) Math.max(MIN_QUEUE_SIZE, Math.min(MAX_QUEUE_SIZE, maxMemory / (1024*1024))); - _outboundQueue = new CoDelBlockingQueue(ctx, "UDP-Sender", qsize); + _outboundQueue = new CoDelBlockingQueue(ctx, "UDP-Sender", qsize, CODEL_TARGET, CODEL_INTERVAL); _socket = socket; _runner = new Runner(); _name = name; @@ -283,13 +285,13 @@ if (throttleTime > 10) _context.statManager().addRateData("udp.sendBWThrottleTime", throttleTime, acquireTime - packet.getBegin()); if (packet.getMarkedType() == 1) - _context.statManager().addRateData("udp.sendACKTime", throttleTime, packet.getLifetime()); - _context.statManager().addRateData("udp.pushTime", packet.getLifetime(), packet.getLifetime()); - _context.statManager().addRateData("udp.sendPacketSize", size, packet.getLifetime()); + _context.statManager().addRateData("udp.sendACKTime", throttleTime); + _context.statManager().addRateData("udp.pushTime", packet.getLifetime()); + _context.statManager().addRateData("udp.sendPacketSize", size); } catch (IOException ioe) { if (_log.shouldLog(Log.WARN)) _log.warn("Error sending to " + packet.getPacket().getAddress(), ioe); - _context.statManager().addRateData("udp.sendException", 1, packet.getLifetime()); + _context.statManager().addRateData("udp.sendException", 1); if (_socket.isClosed()) { if (_keepRunning) { _keepRunning = false; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/UDPTransport.java i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/UDPTransport.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/udp/UDPTransport.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/udp/UDPTransport.java 2021-05-19 12:12:00.000000000 +0000 @@ -87,7 +87,8 @@ // only for logging, to be removed private long _reachabilityStatusLastUpdated; private int _reachabilityStatusUnchanged; - private long _introducersSelectedOn; + private long _v4IntroducersSelectedOn; + private long _v6IntroducersSelectedOn; private long _lastInboundReceivedOn; private final DHSessionKeyBuilder.Factory _dhFactory; private final SSUHMACGenerator _hmac; @@ -124,6 +125,7 @@ private Hash _lastFromv4, _lastFromv6; private byte[] _lastOurIPv4, _lastOurIPv6; private int _lastOurPortv4, _lastOurPortv6; + private boolean _haveUPnP; /** since we don't publish our IP/port if introduced anymore, we need to store it somewhere. */ private RouterAddress _currentOurV4Address; @@ -187,6 +189,8 @@ private static final String CAP_TESTING = Character.toString(UDPAddress.CAPACITY_TESTING); private static final String CAP_TESTING_INTRO = CAP_TESTING + UDPAddress.CAPACITY_INTRODUCER; + private static final String CAP_TESTING_4 = CAP_TESTING + CAP_IPV4; + private static final String CAP_TESTING_6 = CAP_TESTING + CAP_IPV6; /** how many relays offered to us will we use at a time? */ public static final int PUBLIC_RELAY_COUNT = 3; @@ -204,6 +208,7 @@ private static final int MAX_CONSECUTIVE_FAILED = 5; public static final int DEFAULT_COST = 5; + private static final int SSU_OUTBOUND_COST = 14; static final long[] RATES = { 10*60*1000 }; /** minimum active peers to maintain IP detection, etc. */ private static final int MIN_PEERS = 5; @@ -246,12 +251,21 @@ Status.REJECT_UNSOLICITED, Status.IPV4_FIREWALLED_IPV6_OK, Status.IPV4_SNAT_IPV6_OK, - Status.IPV4_OK_IPV6_FIREWALLED); + Status.IPV4_FIREWALLED_IPV6_UNKNOWN); private static final Set STATUS_IPV6_FW = EnumSet.of(Status.IPV4_OK_IPV6_FIREWALLED, Status.IPV4_UNKNOWN_IPV6_FIREWALLED, Status.IPV4_DISABLED_IPV6_FIREWALLED); + private static final Set STATUS_FW = EnumSet.of(Status.DIFFERENT, + Status.REJECT_UNSOLICITED, + Status.IPV4_FIREWALLED_IPV6_OK, + Status.IPV4_SNAT_IPV6_OK, + Status.IPV4_FIREWALLED_IPV6_UNKNOWN, + Status.IPV4_OK_IPV6_FIREWALLED, + Status.IPV4_UNKNOWN_IPV6_FIREWALLED, + Status.IPV4_DISABLED_IPV6_FIREWALLED); + private static final Set STATUS_IPV6_FW_2 = EnumSet.of(Status.IPV4_OK_IPV6_FIREWALLED, Status.IPV4_UNKNOWN_IPV6_FIREWALLED, Status.IPV4_DISABLED_IPV6_FIREWALLED, @@ -276,6 +290,9 @@ Status.IPV4_FIREWALLED_IPV6_OK, Status.IPV4_FIREWALLED_IPV6_UNKNOWN); + private static final Set STATUS_OK = EnumSet.of(Status.OK, + Status.IPV4_DISABLED_IPV6_OK); + public UDPTransport(RouterContext ctx, DHSessionKeyBuilder.Factory dh) { super(ctx); @@ -315,7 +332,8 @@ _reachabilityStatus = Status.UNKNOWN; _reachabilityStatusPending = Status.OK; _introManager = new IntroductionManager(_context, this); - _introducersSelectedOn = -1; + _v4IntroducersSelectedOn = -1; + _v6IntroducersSelectedOn = -1; _lastInboundReceivedOn = -1; _hmac = new SSUHMACGenerator(); _mtu = PeerState.LARGE_MTU; @@ -610,29 +628,64 @@ // REA param is false; // TransportManager.startListening() calls router.rebuildRouterInfo() if (newPort > 0 && bindToAddrs.isEmpty()) { + // Update some config variables and event logs, + // because changeAddress() below won't do that for hidden mode + // because rebuildExternalAddress() always returns null. + boolean save = _context.router().isHidden(); + Map changes = save ? new HashMap(4) : null; boolean hasv6 = false; for (InetAddress ia : getSavedLocalAddresses()) { // Discovered or configured addresses are presumed good at the start. // when externalAddressReceived() was called with SOURCE_INTERFACE, // isAlive() was false, so setReachabilityStatus() was not called - if (ia.getAddress().length == 16) { + byte[] addr = ia.getAddress(); + String prop = addr.length == 4 ? PROP_IP : PROP_IPV6; + String oldIP = save ? _context.getProperty(prop) : null; + String newIP = Addresses.toString(addr); + if (addr.length == 16) { // only call REA for one v6 address if (hasv6) continue; hasv6 = true; + // save the external address but don't publish it + // save it where UPnP can get it and try to forward it + OrderedProperties localOpts = new OrderedProperties(); + localOpts.setProperty(UDPAddress.PROP_PORT, String.valueOf(newPort)); + localOpts.setProperty(UDPAddress.PROP_HOST, newIP); + RouterAddress local = new RouterAddress(STYLE, localOpts, DEFAULT_COST); + replaceCurrentExternalAddress(local, true); if (isIPv6Firewalled() || _context.getBooleanProperty(PROP_IPV6_FIREWALLED)) { setReachabilityStatus(Status.IPV4_UNKNOWN_IPV6_FIREWALLED, true); } else { _lastInboundIPv6 = _context.clock().now(); setReachabilityStatus(Status.IPV4_UNKNOWN_IPV6_OK, true); - rebuildExternalAddress(ia.getHostAddress(), newPort, false); + rebuildExternalAddress(newIP, newPort, false); } } else { - if (!isIPv4Firewalled()) + // save the external address but don't publish it + // save it where UPnP can get it and try to forward it + OrderedProperties localOpts = new OrderedProperties(); + localOpts.setProperty(UDPAddress.PROP_PORT, String.valueOf(newPort)); + localOpts.setProperty(UDPAddress.PROP_HOST, newIP); + RouterAddress local = new RouterAddress(STYLE, localOpts, DEFAULT_COST); + replaceCurrentExternalAddress(local, false); + if (isIPv4Firewalled()) { + setReachabilityStatus(Status.IPV4_FIREWALLED_IPV6_UNKNOWN); + } else { setReachabilityStatus(Status.IPV4_OK_IPV6_UNKNOWN); - rebuildExternalAddress(ia.getHostAddress(), newPort, false); + rebuildExternalAddress(newIP, newPort, false); + } + } + if (save && !newIP.equals(oldIP)) { + changes.put(prop, newIP); + if (addr.length == 4) + changes.put(PROP_IP_CHANGE, Long.toString(_context.clock().now())); + if (oldIP != null) + _context.router().eventLog().addEvent(EventLog.CHANGE_IP, newIP); } } + if (save && !changes.isEmpty()) + _context.router().saveConfig(changes, null); } else if (newPort > 0 && !bindToAddrs.isEmpty()) { for (InetAddress ia : bindToAddrs) { if (ia.getAddress().length == 16) { @@ -657,13 +710,13 @@ else setReachabilityStatus(Status.REJECT_UNSOLICITED); } - rebuildExternalAddress(false); + rebuildExternalAddress(false, false); } public synchronized void shutdown() { if (_haveIPv6Address) { boolean fwOld = _context.getBooleanProperty(PROP_IPV6_FIREWALLED); - boolean fwNew = STATUS_IPV6_FW.contains(_reachabilityStatus); + boolean fwNew = STATUS_IPV6_FW_2.contains(_reachabilityStatus); if (fwOld != fwNew) _context.router().saveConfig(PROP_IPV6_FIREWALLED, Boolean.toString(fwNew)); } @@ -710,7 +763,7 @@ setReachabilityStatus(Status.HOSED); // TODO restart? } - rebuildExternalAddress(); + rebuildExternalAddress(endpoint.isIPv6()); } } @@ -725,6 +778,9 @@ */ SessionKey getIntroKey() { return _introKey; } + /** + * Published or requested port + */ int getExternalPort(boolean ipv6) { RouterAddress addr = getCurrentAddress(ipv6); if (addr != null) { @@ -736,7 +792,7 @@ } /** - * IPv4 only + * Published IP, IPv4 only * @return IP or null * @since 0.9.2 */ @@ -772,7 +828,7 @@ if (DataHelper.eq(ip, 0, myip, 0, 2)) return true; } else if (ip.length == 16) { - if (DataHelper.eq(ip, 0, myip, 0, 8)) + if (DataHelper.eq(ip, 0, myip, 0, 4)) return true; } } @@ -914,6 +970,8 @@ // (we don't want to set this for Teredo, 6to4, ...) _haveIPv6Address = true; } + if (source == SOURCE_UPNP) + _haveUPnP = true; if (explicitAddressSpecified()) return; String sources = _context.getProperty(PROP_SOURCES, DEFAULT_SOURCES); @@ -942,6 +1000,24 @@ gotIPv6Addr = true; } } + if ((source == SOURCE_INTERFACE || source == SOURCE_UPNP) && + _context.router().isHidden()) { + // Update some config variables and event logs, + // because changeAddress() below won't do that for hidden mode + // because rebuildExternalAddress() always returns null. + String prop = ip.length == 4 ? PROP_IP : PROP_IPV6; + String oldIP = _context.getProperty(prop); + String newIP = Addresses.toString(ip); + if (!newIP.equals(oldIP)) { + Map changes = new HashMap(2); + changes.put(prop, newIP); + if (ip.length == 4) + changes.put(PROP_IP_CHANGE, Long.toString(_context.clock().now())); + _context.router().saveConfig(changes, null); + if (oldIP != null) + _context.router().eventLog().addEvent(EventLog.CHANGE_IP, newIP); + } + } boolean changed = changeAddress(ip, port); // Assume if we have an interface with a public IP that we aren't firewalled. // If this is wrong, the peer test will figure it out and change the status. @@ -966,15 +1042,25 @@ */ @Override public void forwardPortStatus(byte[] ip, int port, int externalPort, boolean success, String reason) { + if (success) + _haveUPnP = true; if (_log.shouldLog(Log.WARN)) { if (success) _log.warn("UPnP has opened the SSU port: " + port + " via " + Addresses.toString(ip, externalPort)); else _log.warn("UPnP has failed to open the SSU port: " + port + " reason: " + reason); } - if (success && ip != null && getExternalIP() != null) { - if (!isIPv4Firewalled()) - setReachabilityStatus(Status.IPV4_OK_IPV6_UNKNOWN); + if (success && ip != null) { + if (ip.length == 4) { + if (getCurrentExternalAddress(false) != null && !isIPv4Firewalled()) + setReachabilityStatus(Status.IPV4_OK_IPV6_UNKNOWN); + } else if (ip.length == 16) { + boolean fwOld = _context.getBooleanProperty(PROP_IPV6_FIREWALLED); + if (!fwOld) + _context.router().saveConfig(PROP_IPV6_FIREWALLED, "false"); + if (!isIPv6Firewalled()) + setReachabilityStatus(Status.IPV4_UNKNOWN_IPV6_OK, true); + } } } @@ -1074,6 +1160,9 @@ if (_log.shouldLog(Log.INFO)) _log.info(from + " and another peer agree we have the IP " + Addresses.toString(ourIP, ourPort) + ". Changing address."); + // Never change port for IPv6 or if we have UPnP + if (_haveUPnP || ourIP.length == 16) + ourPort = 0; changeAddress(ourIP, ourPort); } } @@ -1188,7 +1277,7 @@ } else if (updated) { _context.statManager().addRateData("udp.addressUpdated", 1); Map changes = new HashMap(); - if (ourIP.length == 4 && !fixedPort) + if (!isIPv6 && !fixedPort) changes.put(PROP_EXTERNAL_PORT, Integer.toString(ourPort)); // queue a country code lookup of the new IP _context.commSystem().queueLookup(ourIP); @@ -1196,7 +1285,7 @@ // IPV4 ONLY String oldIP = _context.getProperty(PROP_IP); String newIP = Addresses.toString(ourIP); - if (ourIP.length == 4 && !newIP.equals(oldIP)) { + if (!isIPv6 && !newIP.equals(oldIP)) { long lastChanged = 0; long now = _context.clock().now(); String lcs = _context.getProperty(PROP_IP_CHANGE); @@ -1231,10 +1320,10 @@ _context.router().shutdown(Router.EXIT_HARD_RESTART); // doesn't return } - } else if (ourIP.length == 4 && !fixedPort) { + } else if (!isIPv6 && !fixedPort) { // save PROP_EXTERNAL_PORT _context.router().saveConfig(changes, null); - } else if (ourIP.length == 16) { + } else if (isIPv6) { oldIP = _context.getProperty(PROP_IPV6); if (!newIP.equals(oldIP)) { changes.put(PROP_IPV6, newIP); @@ -1585,13 +1674,14 @@ } } } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received another message: " + inMsg.getClass().getName()); + //if (_log.shouldLog(Log.DEBUG)) + // _log.debug("Received another message: " + inMsg.getClass().getName()); } - PeerState peer = getPeerState(remoteIdentHash); + //PeerState peer = getPeerState(remoteIdentHash); super.messageReceived(inMsg, remoteIdent, remoteIdentHash, msToReceive, bytesReceived); - if (peer != null) - peer.expireInboundMessages(); + // Called in IMF, not needed here too + //if (peer != null) + // peer.expireInboundMessages(); } private class RemoveDropList implements SimpleTimer.TimedEvent { @@ -1670,7 +1760,9 @@ synchronized(_addDropLock) { locked_dropPeer(peer, shouldBanlist, why); } - rebuildIfNecessary(); + // the only possible reason to rebuild is if they were an introducer for us + if (peer.getTheyRelayToUsAs() > 0) + rebuildIfNecessary(); } /** @@ -1724,52 +1816,91 @@ */ private void rebuildIfNecessary() { synchronized (_rebuildLock) { - if (locked_needsRebuild()) - rebuildExternalAddress(); + int code = locked_needsRebuild(); + if (code != 0) + rebuildExternalAddress(code == 2); } } - private boolean locked_needsRebuild() { - if (_needsRebuild) return true; // simple enough - if (_context.router().isHidden()) return false; - boolean v6Only = getIPv6Config() == IPV6_ONLY; - RouterAddress addr = getCurrentAddress(v6Only); - if (!v6Only && introducersRequired()) { + /** + * @return 1 for ipv4, 2 for ipv6, 0 for neither + */ + private int locked_needsRebuild() { + if (_context.router().isHidden()) return 0; + TransportUtil.IPv6Config config = getIPv6Config(); + // IPv4 + boolean v6Only = config == IPV6_ONLY; + if (!v6Only) { + RouterAddress addr = getCurrentAddress(false); + if (locked_needsRebuild(addr, false)) + return 1; + } + // IPv6 + boolean v4Only = config == IPV6_DISABLED; + if (!v4Only && _haveIPv6Address) { + RouterAddress addr = getCurrentAddress(true); + if (locked_needsRebuild(addr, true)) + return 2; + } + return 0; + } + + /** + * Does this address need rebuilding? + * + * @param addr may be null + * @since 0.9.50 split out from above + */ + private boolean locked_needsRebuild(RouterAddress addr, boolean ipv6) { + if (_needsRebuild) + return true; + if (introducersRequired(ipv6)) { UDPAddress ua = new UDPAddress(addr); long now = _context.clock().now(); int valid = 0; - for (int i = 0; i < ua.getIntroducerCount(); i++) { - // warning: this is only valid as long as we use the ident hash as their key. - byte[] key = ua.getIntroducerKey(i); - if (key.length != Hash.HASH_LENGTH) - continue; + int count = ua.getIntroducerCount(); + for (int i = 0; i < count; i++) { long exp = ua.getIntroducerExpiration(i); - if (exp > 0 && exp < now + INTRODUCER_EXPIRATION_MARGIN) + if (exp > 0 && exp < now + INTRODUCER_EXPIRATION_MARGIN) { + if (_log.shouldWarn()) + _log.warn((ipv6 ? "IPv6" : "IPv4") + " Introducer " + i + " expiring soon, need to replace"); continue; - PeerState peer = getPeerState(new Hash(key)); - if (peer != null) + } + long tag = ua.getIntroducerTag(i); + if (_introManager.isInboundTagValid(tag)) { valid++; + } else { + if (_log.shouldWarn()) + _log.warn((ipv6 ? "IPv6" : "IPv4") + " Introducer " + i + " no longer connected, need to replace"); + } } - long sinceSelected = now - _introducersSelectedOn; + long sinceSelected = now - (ipv6 ? _v6IntroducersSelectedOn : _v4IntroducersSelectedOn); if (valid >= PUBLIC_RELAY_COUNT) { // try to shift 'em around every 10 minutes or so - if (sinceSelected > 17*60*1000) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Our introducers are valid, but haven't changed in " + DataHelper.formatDuration(sinceSelected) + ", so lets rechoose"); - return true; - } else { + //if (sinceSelected > 17*60*1000) { + // if (_log.shouldLog(Log.WARN)) + // _log.warn((ipv6 ? "IPv6" : "IPv4") + " introducers valid, haven't changed in " + DataHelper.formatDuration(sinceSelected) + ", reselecting"); + // return true; + //} else { if (_log.shouldLog(Log.INFO)) - _log.info("Our introducers are valid and were selected " + DataHelper.formatDuration(sinceSelected) + " ago"); + _log.info((ipv6 ? "IPv6" : "IPv4") + " introducers valid, selected " + DataHelper.formatDuration(sinceSelected) + " ago"); return false; - } + //} } else if (sinceSelected > 2*60*1000) { // Rate limit to prevent rapid churn after transition to firewalled or at startup - if (_log.shouldLog(Log.INFO)) - _log.info("Need more introducers (have " +valid + " need " + PUBLIC_RELAY_COUNT + ')'); - return true; + int avail = _introManager.introducerCount(ipv6); + boolean rv = valid < count || valid < avail; + if (rv) { + if (_log.shouldWarn()) + _log.warn((ipv6 ? "IPv6" : "IPv4") + " Need more introducers (have " + count + " valid " + valid + " need " + PUBLIC_RELAY_COUNT + " avail " + avail + ')'); + } else { + if (_log.shouldInfo()) + _log.info((ipv6 ? "IPv6" : "IPv4") + " Need more introducers, no more avail. (have " + valid + " need " + PUBLIC_RELAY_COUNT + " avail " + avail + ')'); + } + return rv; } else { if (_log.shouldLog(Log.INFO)) - _log.info("Need more introducers (have " +valid + " need " + PUBLIC_RELAY_COUNT + ')' + + _log.info((ipv6 ? "IPv6" : "IPv4") + " Need more introducers (have " + valid + " need " + PUBLIC_RELAY_COUNT + ')' + " but we just chose them " + DataHelper.formatDuration(sinceSelected) + " ago so wait"); // TODO also check to see if we actually have more available return false; @@ -1785,10 +1916,10 @@ } if (rv) { if (_log.shouldLog(Log.INFO)) - _log.info("Need to initialize our direct SSU info (" + Addresses.toString(externalListenHost, externalListenPort) + ')'); + _log.info((ipv6 ? "IPv6" : "IPv4") + " Need to initialize our direct SSU info (" + Addresses.toString(externalListenHost, externalListenPort) + ')'); } else if (addr.getPort() <= 0 || addr.getHost() == null) { if (_log.shouldLog(Log.INFO)) - _log.info("Our direct SSU info is initialized, but not used in our address yet"); + _log.info((ipv6 ? "IPv6" : "IPv4") + " Our direct SSU info is initialized, but not used in our address yet"); rv = true; } else { //_log.info("Our direct SSU info is initialized"); @@ -1917,6 +2048,9 @@ return null; } + if (isUnreachable(to)) + return null; + // Validate his SSU address RouterAddress addr = getTargetAddress(toAddress); if (addr == null) { @@ -1924,6 +2058,16 @@ return null; } + // c++ bug thru 2.36.0/0.9.49, will disconnect inbound session after 5 seconds + if (addr.getCost() == 10) { + if (VersionComparator.comp(toAddress.getVersion(), "0.9.49") <= 0) { + //if (_log.shouldDebug()) + // _log.debug("Not bidding to: " + toAddress); + markUnreachable(to); + return null; + } + } + // Check for supported sig type SigType type = toAddress.getIdentity().getSigType(); if (type == null || !type.isAvailable()) { @@ -1957,11 +2101,15 @@ // (Otherwise we only talk UDP to those that are firewalled, and we will // never get any introducers) int count = _peersByIdent.size(); + boolean ipv6 = TransportUtil.isIPv6(addr); if (alwaysPreferUDP()) { return _cachedBid[SLOW_PREFERRED_BID]; - } else if (count < _min_peers || - (_haveIPv6Address && count < _min_v6_peers) || - (introducersRequired() && _introManager.introducerCount() < MIN_INTRODUCER_POOL)) { + } else if ((!ipv6 && count < _min_peers) || + (ipv6 && _haveIPv6Address && count < _min_v6_peers) || + (introducersRequired(ipv6) && + addr.getOption(UDPAddress.PROP_CAPACITY) != null && + addr.getOption(UDPAddress.PROP_CAPACITY).indexOf(UDPAddress.CAPACITY_INTRODUCER) >= 0 && + _introManager.introducerCount(ipv6) < MIN_INTRODUCER_POOL)) { // Even if we haven't hit our minimums, give NTCP a chance some of the time. // This may make things work a little faster at startup // (especially when we have an IPv6 address and the increased minimums), @@ -2010,7 +2158,8 @@ } } else { // introducers - if (getIPv6Config() == IPV6_ONLY) + String caps = addr.getOption(UDPAddress.PROP_CAPACITY); + if (caps != null && caps.contains(CAP_IPV6) && !_haveIPv6Address) continue; } return addr; @@ -2196,25 +2345,26 @@ } /** - * Rebuild to get updated cost and introducers. + * Rebuild to get updated cost and introducers. IPv4 only, unless configured as IPv6 only. * Do not tell the router (he is the one calling this) * @since 0.7.12 */ @Override public List updateAddress() { - rebuildExternalAddress(false); + boolean ipv6 = getIPv6Config() == IPV6_ONLY; + rebuildExternalAddress(false, ipv6); return getCurrentAddresses(); } /** - * Update our IPv4 addresses AND tell the router to rebuild and republish the router info. + * Update our IPv4 or IPv6 address AND tell the router to rebuild and republish the router info. * * @return the new address if changed, else null */ - private RouterAddress rebuildExternalAddress() { + private RouterAddress rebuildExternalAddress(boolean ipv6) { if (_log.shouldLog(Log.DEBUG)) _log.debug("REA1"); - return rebuildExternalAddress(true); + return rebuildExternalAddress(true, ipv6); } /** @@ -2231,7 +2381,7 @@ * @param allowRebuildRouterInfo whether to tell the router * @return the new address if changed, else null */ - private RouterAddress rebuildExternalAddress(boolean allowRebuildRouterInfo) { + private RouterAddress rebuildExternalAddress(boolean allowRebuildRouterInfo, boolean ipv6) { if (_log.shouldDebug()) _log.debug("REA2 " + allowRebuildRouterInfo); // if the external port is specified, we want to use that to bind to even @@ -2303,12 +2453,13 @@ return rv; } } else { - if (!introducersRequired()) { - boolean v6Only = getIPv6Config() == IPV6_ONLY; - RouterAddress cur = getCurrentExternalAddress(v6Only); + if (!introducersRequired(ipv6)) { + RouterAddress cur = getCurrentExternalAddress(ipv6); if (cur != null) host = cur.getHost(); } + if (ipv6 && host == null) + host = ":"; // special flag, see REA4 } return rebuildExternalAddress(host, port, allowRebuildRouterInfo); } @@ -2337,6 +2488,7 @@ * FIXME no way to remove an IPv6 address * * @param host new validated IPv4 or IPv6 or DNS hostname or null + * or ":" to force IPv6 introducer rebuild * @param port new validated port or 0/-1 * @param allowRebuildRouterInfo whether to tell the router * @return the new address if changed, else null @@ -2348,17 +2500,59 @@ } } + /** + * @param host new validated IPv4 or IPv6 or DNS hostname or null + * or ":" to force IPv6 introducer rebuild + */ private RouterAddress locked_rebuildExternalAddress(String host, int port, boolean allowRebuildRouterInfo) { if (_log.shouldDebug()) _log.debug("REA4 " + host + ' ' + port, new Exception()); - if (_context.router().isHidden()) - return null; - + boolean isIPv6 = host != null && host.contains(":"); + if (isIPv6 && host.equals(":")) + host = null; OrderedProperties options = new OrderedProperties(); + if (_context.router().isHidden()) { + // save the external address, since we didn't publish it + if (port > 0 && host != null) { + RouterAddress old = getCurrentExternalAddress(isIPv6); + if (old == null || !host.equals(old.getHost()) || port != old.getPort()) { + options.setProperty(UDPAddress.PROP_PORT, String.valueOf(port)); + options.setProperty(UDPAddress.PROP_HOST, host); + RouterAddress local = new RouterAddress(STYLE, options, SSU_OUTBOUND_COST); + replaceCurrentExternalAddress(local, isIPv6); + options = new OrderedProperties(); + } + } + if (!_context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS)) + return null; + // As of 0.9.50, make an address with only 4/6 caps + String caps; + TransportUtil.IPv6Config config = getIPv6Config(); + if (config == IPV6_ONLY) + caps = CAP_IPV6; + else if (config != IPV6_DISABLED && hasIPv6Address()) + caps = CAP_IPV4_IPV6; + else + caps = CAP_IPV4; + options.setProperty(UDPAddress.PROP_CAPACITY, caps); + RouterAddress current = getCurrentAddress(false); + RouterAddress addr = new RouterAddress(STYLE, options, SSU_OUTBOUND_COST); + if (!addr.deepEquals(current)) { + if (_log.shouldInfo()) + _log.info("Address rebuilt: " + addr, new Exception()); + replaceAddress(addr); + if (allowRebuildRouterInfo) + rebuildRouterInfo(); + } else { + addr = null; + } + _needsRebuild = false; + return addr; + } + boolean directIncluded; // DNS name assumed IPv4 - boolean isIPv6 = host != null && host.contains(":"); - boolean introducersRequired = (!isIPv6) && introducersRequired(); + boolean introducersRequired = introducersRequired(isIPv6); if (!introducersRequired && allowDirectUDP() && port > 0 && host != null) { options.setProperty(UDPAddress.PROP_PORT, String.valueOf(port)); options.setProperty(UDPAddress.PROP_HOST, host); @@ -2373,25 +2567,38 @@ // deepEquals() below will not fail even with same introducers. // Was only a problem when we had very very few peers to pick from. RouterAddress current = getCurrentAddress(isIPv6); - int found = _introManager.pickInbound(current, options, PUBLIC_RELAY_COUNT); + int found = _introManager.pickInbound(current, isIPv6, options, PUBLIC_RELAY_COUNT); if (found > 0) { if (_log.shouldLog(Log.INFO)) - _log.info("Direct? " + directIncluded + " reqd? " + introducersRequired + - " picked introducers: " + found); - _introducersSelectedOn = _context.clock().now(); + _log.info("ipv6? " + isIPv6 + " picked introducers: " + found); + long now = _context.clock().now(); + if (isIPv6) + _v6IntroducersSelectedOn = now; + else + _v4IntroducersSelectedOn = now; introducersIncluded = true; } else { if (_log.shouldLog(Log.WARN)) - _log.warn("Direct? " + directIncluded + " reqd? " + introducersRequired + - " no introducers"); + _log.warn("ipv6? " + isIPv6 + " no introducers"); } } // if we have explicit external addresses, they had better be reachable - if (introducersRequired) - options.setProperty(UDPAddress.PROP_CAPACITY, CAP_TESTING); - else - options.setProperty(UDPAddress.PROP_CAPACITY, CAP_TESTING_INTRO); + String caps; + if (introducersRequired || !canIntroduce(isIPv6)) { + if (!directIncluded && + _context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS)) { + if (isIPv6) + caps = CAP_TESTING_6; + else + caps = CAP_TESTING_4; + } else { + caps = CAP_TESTING; + } + } else { + caps = CAP_TESTING_INTRO; + } + options.setProperty(UDPAddress.PROP_CAPACITY, caps); // MTU since 0.9.2 int mtu; @@ -2452,6 +2659,17 @@ if (_log.shouldLog(Log.INFO)) _log.info("Address rebuilt: " + addr, new Exception()); replaceAddress(addr); + if (!isIPv6 && + _context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS) && + getCurrentAddress(true) == null && + getIPv6Config() != IPV6_DISABLED && + hasIPv6Address()) { + // Also make an empty "6" address + OrderedProperties opts = new OrderedProperties(); + opts.setProperty(UDPAddress.PROP_CAPACITY, CAP_IPV6); + RouterAddress addr6 = new RouterAddress(STYLE, opts, SSU_OUTBOUND_COST); + replaceAddress(addr6); + } // warning, this calls back into us with allowRebuildRouterInfo = false, // via CSFI.createAddresses->TM.getAddresses()->updateAddress()->REA if (allowRebuildRouterInfo) @@ -2460,13 +2678,14 @@ addr = null; } - if (!isIPv6) - _needsRebuild = false; + _needsRebuild = false; return addr; } else { if (_log.shouldLog(Log.WARN)) _log.warn("Wanted to rebuild my SSU address, but couldn't specify either the direct or indirect info (needs introducers? " - + introducersRequired + ")", new Exception("source")); + + introducersRequired + + " ipv6? " + isIPv6 + + ')', new Exception()); _needsRebuild = true; // save the external address, even if we didn't publish it if (port > 0 && host != null) { @@ -2476,6 +2695,21 @@ RouterAddress local = new RouterAddress(STYLE, localOpts, DEFAULT_COST); replaceCurrentExternalAddress(local, isIPv6); } + if (!isIPv6 && + _context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS)) { + // Make an empty "4" address + OrderedProperties opts = new OrderedProperties(); + opts.setProperty(UDPAddress.PROP_CAPACITY, CAP_IPV4); + RouterAddress addr4 = new RouterAddress(STYLE, opts, SSU_OUTBOUND_COST); + RouterAddress current = getCurrentAddress(false); + boolean wantsRebuild = !addr4.deepEquals(current); + if (!wantsRebuild) + return null; + replaceAddress(addr4); + if (allowRebuildRouterInfo) + rebuildRouterInfo(); + return addr4; + } removeExternalAddress(isIPv6, allowRebuildRouterInfo); return null; } @@ -2544,9 +2778,9 @@ * we don't put them in the real, published RouterAddress anymore * if we are firewalled. * - * @since 0.9.18 + * @since 0.9.18, public for PacketBuilder and TransportManager since 0.9.50 */ - private RouterAddress getCurrentExternalAddress(boolean isIPv6) { + public RouterAddress getCurrentExternalAddress(boolean isIPv6) { // deadlock thru here ticket #1699 synchronized (_rebuildLock) { return isIPv6 ? _currentOurV6Address : _currentOurV4Address; @@ -2625,7 +2859,10 @@ /** * Do we require introducers? */ - public boolean introducersRequired() { + private boolean introducersRequired(boolean ipv6) { + if (_context.router().isHidden()) + return false; + //if (ipv6) return false; /****************** * Don't do this anymore, as we are removing the checkbox from the UI, * and we rarely if ever see the problem of false negatives for firewall detection - @@ -2639,23 +2876,47 @@ } *******************/ Status status = getReachabilityStatus(); - switch (status) { - case REJECT_UNSOLICITED: - case DIFFERENT: - case IPV4_FIREWALLED_IPV6_OK: - case IPV4_FIREWALLED_IPV6_UNKNOWN: - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Require introducers, because our status is " + status); + TransportUtil.IPv6Config config = getIPv6Config(); + if (ipv6) { + if (!_haveIPv6Address) + return false; + if (config == IPV6_DISABLED) + return false; + // must be published with '6' cap + if (!_context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS)) + return false; + if (isIPv6Firewalled()) return true; - - default: - if (!allowDirectUDP()) { + switch (status) { + case REJECT_UNSOLICITED: + case DIFFERENT: + case IPV4_OK_IPV6_FIREWALLED: + case IPV4_UNKNOWN_IPV6_FIREWALLED: if (_log.shouldLog(Log.DEBUG)) - _log.debug("Require introducers, because we do not allow direct UDP connections"); + _log.debug("Require IPv6 introducers, status is " + status); return true; - } + } + } else { + if (config == IPV6_ONLY) return false; + if (isIPv4Firewalled()) + return true; + switch (status) { + case REJECT_UNSOLICITED: + case DIFFERENT: + case IPV4_FIREWALLED_IPV6_OK: + case IPV4_FIREWALLED_IPV6_UNKNOWN: + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Require IPv4 introducers, status is " + status); + return true; + } + } + if (!allowDirectUDP()) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Require introducers, because we do not allow direct UDP connections"); + return true; } + return false; } /** @@ -2665,37 +2926,70 @@ * * @since 0.9.24 */ - boolean introducersMaybeRequired() { + boolean introducersMaybeRequired(boolean ipv6) { + if (_context.router().isHidden()) + return false; + //if (ipv6) return false; Status status = getReachabilityStatus(); - switch (status) { - case REJECT_UNSOLICITED: - case DIFFERENT: - case IPV4_FIREWALLED_IPV6_OK: - case IPV4_FIREWALLED_IPV6_UNKNOWN: - case IPV4_UNKNOWN_IPV6_OK: - case IPV4_UNKNOWN_IPV6_FIREWALLED: - case UNKNOWN: + TransportUtil.IPv6Config config = getIPv6Config(); + if (ipv6) { + if (!_haveIPv6Address) + return false; + if (config == IPV6_DISABLED) + return false; + // must be published with '6' cap + if (!_context.getProperty(PROP_TRANSPORT_CAPS, ENABLE_TRANSPORT_CAPS)) + return false; + if (isIPv6Firewalled()) + return true; + switch (status) { + case REJECT_UNSOLICITED: + case DIFFERENT: + case IPV4_OK_IPV6_FIREWALLED: + case IPV4_UNKNOWN_IPV6_FIREWALLED: + case IPV4_OK_IPV6_UNKNOWN: + case IPV4_FIREWALLED_IPV6_UNKNOWN: + case UNKNOWN: + return _introManager.introducerCount(true) < 3 * MIN_INTRODUCER_POOL; + } + } else { + if (config == IPV6_ONLY) + return false; + if (isIPv4Firewalled()) return true; + switch (status) { + case REJECT_UNSOLICITED: + case DIFFERENT: + case IPV4_FIREWALLED_IPV6_OK: + case IPV4_FIREWALLED_IPV6_UNKNOWN: + case IPV4_UNKNOWN_IPV6_OK: + case IPV4_UNKNOWN_IPV6_FIREWALLED: + case UNKNOWN: + return _introManager.introducerCount(false) < 3 * MIN_INTRODUCER_POOL; - default: - return !allowDirectUDP(); + } } + return !allowDirectUDP(); } /** - * For EstablishmentManager + * For EstablishmentManager. + * * @since 0.9.3 */ - boolean canIntroduce() { + boolean canIntroduce(boolean ipv6) { // we don't expect inbound connections when hidden, but it could happen // Don't offer if we are approaching max connections. While Relay Intros do not // count as connections, we have to keep the connection to this peer up longer if // we are offering introductions. return (!_context.router().isHidden()) && - (!introducersRequired()) && + (!introducersRequired(ipv6)) && haveCapacity() && (!_context.netDb().floodfillEnabled()) && + (!ipv6 || _haveIPv6Address) && + ((!ipv6 && getIPv6Config() != IPV6_ONLY) || + (ipv6 && getIPv6Config() != IPV6_DISABLED)) && _introManager.introducedCount() < IntroductionManager.MAX_OUTBOUND && _introManager.introducedCount() < getMaxConnections() / 4; } @@ -3013,7 +3307,7 @@ final long mayDisconCutoff = now - MAY_DISCON_TIMEOUT; long pingCutoff = now - (2 * 60*60*1000); long pingFirewallCutoff = now - PING_FIREWALL_CUTOFF; - boolean shouldPingFirewall = _reachabilityStatus != Status.OK; + boolean shouldPingFirewall = !STATUS_OK.contains(_reachabilityStatus); int currentListenPort = getListenPort(false); boolean pingOneOnly = shouldPingFirewall && getExternalPort(false) == currentListenPort; boolean shortLoop = shouldPingFirewall || !haveCap || _context.netDb().floodfillEnabled(); @@ -3030,8 +3324,8 @@ } else if ((!haveCap || !peer.isInbound()) && peer.getMayDisconnect() && peer.getMessagesReceived() <= 2 && peer.getMessagesSent() <= 2) { - if (_log.shouldInfo()) - _log.info("Possible early disconnect for: " + peer); + //if (_log.shouldInfo()) + // _log.info("Possible early disconnect for: " + peer); inactivityCutoff = mayDisconCutoff; } else { inactivityCutoff = shortInactivityCutoff; @@ -3151,8 +3445,9 @@ if (status != old) { // for the following transitions ONLY, require two in a row // to prevent thrashing - if ((old == Status.OK && STATUS_IPV4_FW.contains(status)) || - (status == Status.OK && STATUS_IPV4_FW.contains(old))) { + if ((STATUS_OK.contains(old) && STATUS_FW.contains(status)) || + (STATUS_OK.contains(status) && STATUS_FW.contains(old)) || + (STATUS_FW.contains(status) && STATUS_FW.contains(old))) { if (status != _reachabilityStatusPending) { if (_log.shouldLog(Log.WARN)) _log.warn("Old status: " + old + " status pending confirmation: " + status + @@ -3176,27 +3471,43 @@ _log.warn("Old status: " + old + " New status: " + status + " Caused by update: " + newStatus + " from: ", new Exception("traceback")); - if (old != Status.UNKNOWN) + if (old != Status.UNKNOWN && _context.router().getUptime() > 5*60*1000L) { _context.router().eventLog().addEvent(EventLog.REACHABILITY, "from " + _t(old.toStatusString()) + " to " + _t(status.toStatusString())); + } // Always rebuild when the status changes, even if our address hasn't changed, // as rebuildExternalAddress() calls replaceAddress() which calls CSFI.notifyReplaceAddress() // which will start up NTCP inbound when we transition to OK. if (isIPv6) { - if (STATUS_IPV6_FW.contains(status)) { + if (STATUS_IPV6_FW_2.contains(status)) { removeExternalAddress(true, true); - } else if (STATUS_IPV6_FW.contains(old) && + } else if (STATUS_IPV6_FW_2.contains(old) && STATUS_IPV6_OK.contains(status) && - _lastOurIPv6 != null && !explicitAddressSpecified()){ - String addr = Addresses.toString(_lastOurIPv6); - int port = _context.getProperty(PROP_EXTERNAL_PORT, -1); - rebuildExternalAddress(addr, port, true); + RouterAddress ra = _currentOurV6Address; + if (ra != null) { + String addr = ra.getHost(); + if (addr != null) { + int port = _context.getProperty(PROP_EXTERNAL_PORT, -1); + rebuildExternalAddress(addr, port, true); + } else if (_log.shouldWarn()) { + _log.warn("Not IPv6 firewalled but no address?"); + } + } else if (_log.shouldWarn()) { + _log.warn("Not IPv6 firewalled but no address?"); + } } } else { - rebuildExternalAddress(); + rebuildExternalAddress(false); } } else { + if (newStatus == Status.UNKNOWN && status != _reachabilityStatusPending) { + // still have something pending, try again + if (_log.shouldLog(Log.WARN)) + _log.warn("Old status: " + status + " status pending confirmation: " + _reachabilityStatusPending + + " Caused by update: " + newStatus); + _testEvent.forceRunSoon(isIPv6); + } if (_log.shouldLog(Log.INFO)) _log.info("Status unchanged: " + _reachabilityStatus + " after update: " + newStatus + @@ -3314,7 +3625,7 @@ */ private class PingIntroducers implements SimpleTimer.TimedEvent { public void timeReached() { - if (introducersRequired()) + if (introducersRequired(false) || introducersRequired(true)) _introManager.pingIntroducers(); } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/UPnP.java i2p-0.9.50/router/java/src/net/i2p/router/transport/UPnP.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/UPnP.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/UPnP.java 2021-05-19 12:12:00.000000000 +0000 @@ -5,6 +5,7 @@ import java.io.Serializable; import java.net.InetAddress; +import java.net.Inet6Address; import java.net.UnknownHostException; import java.net.URI; import java.net.URISyntaxException; @@ -101,8 +102,11 @@ private static final String WAN_IP_CONNECTION_2 = "urn:schemas-upnp-org:service:WANIPConnection:2"; private static final String WAN_IPV6_CONNECTION = "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1"; + public static final int LEASE_TIME_SECONDS = 3*60*60; + private Device _router; private Service _service; + private Service _service6; // UDN -> device private final Map _otherUDNs; private final Map _eventVars; @@ -165,10 +169,12 @@ Thread.sleep(100); } catch (InterruptedException ie) {} } + // stop() does unsubscribe() super.stop(); synchronized(lock) { _router = null; _service = null; + _service6 = null; _serviceLacksAPM = false; _permanentLeasesOnly = false; } @@ -265,7 +271,7 @@ } } } - Set myAddresses = Addresses.getAddresses(true, false); // yes local, no IPv6 + Set myAddresses = Addresses.getAddresses(true, true); // yes local, yes IPv6 if (!ignore && !ALLOW_SAME_HOST && ip != null && myAddresses.contains(ip)) { ignore = true; if (_log.shouldWarn()) @@ -278,28 +284,36 @@ if (pkt != null) { String pktIP = pkt.getRemoteAddress(); if (!stringEquals(ip, pktIP)) { - ignore = true; - if (_log.shouldWarn()) - _log.warn("Ignoring UPnP with IP mismatch: " + name + " UDN: " + udn); + // IPv6 location received over IPv4 is ok, or vice versa + boolean v61 = ip.contains(":"); + boolean v62 = pktIP.contains(":"); + if (v61 == v62) { + ignore = true; + if (_log.shouldWarn()) + _log.warn("Ignoring UPnP with IP mismatch: " + name + " UDN: " + udn + + " dev IP " + ip + " pkt IP: " + pktIP); + } } } } // Find valid service + List services = null; Service service = null; String extIP = null; boolean subscriptionFailed = false; if (!ignore) { - service = discoverService(dev); - if (service == null) { + services = discoverService(dev); + if (services == null) { ignore = true; } else { + service = services.get(0); // does it have an external IP? extIP = getNATAddress(service); if (extIP == null) { // this would meet all our qualifications if connected. // subscribe to it, in case it becomes connected. - boolean ok = subscribe(service); + boolean ok = subscribe(service, LEASE_TIME_SECONDS); if (ok) { // we can't trust that events will work even if the subscription succeeded. //ignore = true; @@ -394,6 +408,8 @@ _eventVars.clear(); _router = dev; _service = service; + if (services.size() > 1) + _service6 = services.get(1); _permanentLeasesOnly = false; } if (fpc != null) @@ -403,12 +419,14 @@ _log.warn("UP&P IGD found : " + name + " UDN: " + udn + " lease time: " + dev.getLeaseTime()); if (!subscriptionFailed) { - boolean ok = subscribe(service); - if (_log.shouldInfo()) { - if (ok) - _log.info("Subscribed to our device " + name + " UDN: " + udn); - else - _log.info("Failed subscription to our device " + name + " UDN: " + udn); + for (Service svc : services) { + boolean ok = subscribe(svc); + if (_log.shouldInfo()) { + if (ok) + _log.info("Subscribed to " + svc.getServiceType() + " on device " + name); + else + _log.info("Failed subscription to " + svc.getServiceType() + " on device " + name); + } } } @@ -427,10 +445,12 @@ /** * Traverses the structure of the router device looking for the port mapping service. + * The first Service will be the IPv4 Service. + * The second Service, if present, will be the IPv6 Service. * - * @return the service or null + * @return the list of services, non-empty, one or two entries, or null */ - private Service discoverService(Device router) { + private List discoverService(Device router) { for (Device current : router.getDeviceList()) { String type = current.getDeviceType(); if (!(WAN_DEVICE.equals(type) || WAN_DEVICE_2.equals(type))) @@ -454,13 +474,16 @@ } } } - if (_log.shouldInfo()) { + if (service != null) { Service svc2 = current2.getService(WAN_IPV6_CONNECTION); - if (svc2 != null) - _log.info(_router.getFriendlyName() + " supports WANIPv6Connection, but we don't"); + if (svc2 != null) { + List rv = new ArrayList(2); + rv.add(service); + rv.add(svc2); + return rv; + } + return Collections.singletonList(service); } - if (service != null) - return service; } } @@ -468,15 +491,18 @@ } private boolean tryAddMapping(String protocol, int port, String description, ForwardPort fp) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Registering a port mapping for " + port + "/" + protocol); + if (_log.shouldWarn()) + _log.warn("Registering a port mapping for " + port + "/" + protocol + " IPv" + (fp.isIP6 ? '6' : '4')); int nbOfTries = 0; + final int maxTries = fp.isIP6 ? 1 : 3; boolean isPortForwarded = false; - while ((!_serviceLacksAPM) && nbOfTries++ < 5) { + while ((!_serviceLacksAPM) && nbOfTries++ < maxTries) { //isPortForwarded = addMapping(protocol, port, "I2P " + description, fp); isPortForwarded = addMapping(protocol, port, description, fp); if(isPortForwarded || _serviceLacksAPM) break; + if (++nbOfTries >= maxTries) + break; try { Thread.sleep(5000); } catch (InterruptedException e) {} @@ -523,6 +549,7 @@ runSearch = true; _router = null; _service = null; + _service6 = null; _eventVars.clear(); _serviceLacksAPM = false; _permanentLeasesOnly = false; @@ -617,11 +644,13 @@ boolean isIGD = (ROUTER_DEVICE.equals(type) || ROUTER_DEVICE_2.equals(type)) && dev.isRootDevice(); if (!isIGD) continue; - Service service = discoverService(dev); - if (service == null) + List services = discoverService(dev); + if (services == null) continue; - if (sid.equals(service.getSID())) - return dev; + for (Service service : services) { + if (sid.equals(service.getSID())) + return dev; + } } } return null; @@ -1117,6 +1146,7 @@ Device router; Service service; + Service service6; synchronized(lock) { if (!_otherUDNs.isEmpty()) { sb.append(""); @@ -1159,6 +1189,7 @@ } router = _router; service = _service; + service6 = _service6; } listSubDev(null, router, sb); String addr = getNATAddress(service); @@ -1176,6 +1207,14 @@ synchronized(lock) { for(ForwardPort port : portsToForward) { sb.append("
"); + if (port.isIP6) { + sb.append("IPv6 "); + sb.append(((IPv6ForwardPort) port).getIP()).append(' '); + } else { + sb.append("IPv4 "); + if (addr != null) + sb.append(DataHelper.escapeHTML(addr)).append(' '); + } if(portsForwarded.contains(port)) // {0} is TCP or UDP // {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. @@ -1211,6 +1250,7 @@ /** * This always requests that the external port == the internal port, for now. * Blocking! + * @return success */ private boolean addMapping(String protocol, int port, String description, ForwardPort fp) { Service service; @@ -1219,13 +1259,27 @@ _log.error("Can't addMapping: " + isNATPresent() + " " + _router); return false; } - service = _service; + service = fp.isIP6 ? _service6 : _service; } - - // Just in case... - // this confuses my linksys? - zzz - //removeMapping(protocol, port, fp, true); - + if (service == null) { + if (_log.shouldWarn()) + _log.warn("No service for IPv" + (fp.isIP6 ? '6' : '4')); + return false; + } + if (fp.isIP6) + return addMappingV6(service, port, (IPv6ForwardPort) fp); + else + return addMappingV4(service, protocol, port, description, fp); + } + + /** + * This always requests that the external port == the internal port, for now. + * Blocking! + * + * @return success + * @since 0.9.50 split out from above + */ + private boolean addMappingV4(Service service, String protocol, int port, String description, ForwardPort fp) { Action add = service.getAction("AddPortMapping"); if(add == null) { if (_serviceLacksAPM) { @@ -1254,7 +1308,7 @@ add.setArgumentValue("NewEnabled","1"); // 3 hours // MUST be longer than max RI republish which is 52 minutes - int leaseTime = _permanentLeasesOnly ? 0 : 3*60*60; + int leaseTime = _permanentLeasesOnly ? 0 : LEASE_TIME_SECONDS; add.setArgumentValue("NewLeaseDuration", leaseTime); boolean rv = add.postControlAction(); @@ -1306,6 +1360,105 @@ return rv; } + + /** + * This always requests that the external port == the internal port, for now. + * Blocking! + * + * @param service WANIPv6FirewallControl + * @return success + * @since 0.9.50 + */ + private boolean addMappingV6(Service service, int port, IPv6ForwardPort fp) { + Action add = service.getAction("AddPinhole"); + if (add == null) { + if (_log.shouldWarn()) + _log.warn("UPnP device does not support pinholing"); + return false; + } + String ip = fp.getIP(); + add.setArgumentValue("RemoteHost", ""); + add.setArgumentValue("RemotePort", 0); + add.setArgumentValue("InternalClient", ip); + add.setArgumentValue("InternalPort", port); + add.setArgumentValue("Protocol", fp.protocol); + // permanent leases aren't supported by miniupnpd anyway + add.setArgumentValue("LeaseTime", LEASE_TIME_SECONDS); + int uid = fp.getUID(); + if (uid < 0) { + uid = getNewUID(); + fp.setUID(uid); + } + add.setArgumentValue("UniqueID", uid); + + // I2P - bind the POST socket to the given IP if we're sending to IPv6 + boolean rv; + String hisIP = service.getRootDevice().getLocation(true); + if (hisIP != null && hisIP.contains(":")) { + rv = add.postControlAction(ip); + } else { + // this probably won't work if security is enabled + rv = add.postControlAction(); + } + if (rv) { + // In cases where the RemoteHost, RemotePort, InternalPort, InternalClient and Protocol are the same than + // an existing pinhole, but LeaseTime is different, the device MUST extend the existing pinhole's lease time + // and return the UniqueID of the existing pinhole. + Argument a = add.getOutputArgumentList().getArgument("UniqueID"); + if (a != null) { + try { + int newuid = Integer.parseInt(a.getValue()); + if (newuid != uid) { + if (_log.shouldDebug()) + _log.debug("Updating UID from " + uid + " to " + newuid + " for " + fp); + fp.setUID(newuid); + } + } catch (NumberFormatException nfe) {} + } + synchronized(lock) { + portsForwarded.add(fp); + } + } + int level = rv ? Log.INFO : Log.WARN; + if (_log.shouldLog(level)) { + StringBuilder buf = new StringBuilder(); + buf.append("AddPinhole result for ").append(fp.toString()); + UPnPStatus status = add.getStatus(); + if (status != null) + buf.append(" Status: ").append(status.getCode()).append(' ').append(status.getDescription()); + status = add.getControlStatus(); + if (status != null) + buf.append(" ControlStatus: ").append(status.getCode()).append(' ').append(status.getDescription()); + _log.log(level, buf.toString()); + } + + // 606 Action not authorized + + return rv; + } + + /** + * 65536 isn't a lot, so check for dups + * + * @return 0 - 65535 + * @since 0.9.50 + */ + private int getNewUID() { + synchronized(lock) { + while(true) { + int rv = _context.random().nextInt(65536); + boolean dup = false; + for (ForwardPort fp : portsToForward) { + if (fp.isIP6 && ((IPv6ForwardPort) fp).getUID() == rv) { + dup = true; + break; + } + } + if (!dup) + return rv; + } + } + } /** * @param dev non-null @@ -1331,6 +1484,8 @@ } catch (URISyntaxException use) {} } } + if (rv != null && rv.startsWith("[") && rv.endsWith("]")) + rv = rv.substring(1, rv.length() - 1); return rv; } @@ -1389,7 +1544,10 @@ return rv; } - /** blocking */ + /** + * Blocking + * @return success + */ private boolean removeMapping(String protocol, int port, ForwardPort fp, boolean noLog) { Service service; synchronized(lock) { @@ -1397,9 +1555,25 @@ _log.error("Can't removeMapping: " + isNATPresent() + " " + _router); return false; } - service = _service; + service = fp.isIP6 ? _service6 : _service; + } + if (service == null) { + if (_log.shouldInfo()) + _log.info("No service for IPv" + (fp.isIP6 ? '6' : '4')); + return false; } + if (fp.isIP6) + return removeMappingV6(service, protocol, port, (IPv6ForwardPort) fp, noLog); + else + return removeMappingV4(service, protocol, port, fp, noLog); + } + /** + * + * @since 0.9.50 split out from above + * @return success + */ + private boolean removeMappingV4(Service service, String protocol, int port, ForwardPort fp, boolean noLog) { Action remove = service.getAction("DeletePortMapping"); if(remove == null) { if (_log.shouldLog(Log.WARN)) @@ -1416,8 +1590,62 @@ portsForwarded.remove(fp); } - if(_log.shouldLog(Log.WARN) && !noLog) - _log.warn("UPnP: Removed mapping for "+fp.name+" "+port+" / "+protocol); + int level = retval ? Log.INFO : Log.WARN; + if (!noLog && _log.shouldLog(level)) { + if (retval) + _log.log(level, "UPnP: Removed IPv4 mapping for "+fp.name+" "+port+" / "+protocol); + else + _log.log(level, "UPnP: Failed to remove IPv4 mapping for "+fp.name+" "+port+" / "+protocol); + } + return retval; + } + + /** + * + * @since 0.9.50 + * @return success + */ + private boolean removeMappingV6(Service service, String protocol, int port, IPv6ForwardPort fp, boolean noLog) { + int uid = fp.getUID(); + if (uid < 0) + return false; + Action remove = service.getAction("DeletePinhole"); + if (remove == null) { + if (_log.shouldWarn()) + _log.warn("Couldn't find DeletePinhole action!"); + return false; + } + remove.setArgumentValue("UniqueID", uid); + // I2P - bind the POST socket to the given IP if we're sending to IPv6 + boolean retval; + String hisIP = service.getRootDevice().getLocation(true); + if (hisIP != null && hisIP.contains(":")) { + String ip = fp.getIP(); + retval = remove.postControlAction(ip); + } else { + retval = remove.postControlAction(); + } + synchronized(lock) { + portsForwarded.remove(fp); + } + + int level = retval ? Log.INFO : Log.WARN; + if (!noLog && _log.shouldLog(level)) { + String ip = fp.getIP(); + if (retval) { + _log.log(level, "UPnP: Removed IPv6 mapping for " + fp); + } else { + StringBuilder buf = new StringBuilder(); + buf.append("UPnP: Failed to remove IPv6 mapping for ").append(fp.toString()); + UPnPStatus status = remove.getStatus(); + if (status != null) + buf.append(" Status: ").append(status.getCode()).append(' ').append(status.getDescription()); + status = remove.getControlStatus(); + if (status != null) + buf.append(" ControlStatus: ").append(status.getCode()).append(' ').append(status.getDescription()); + _log.log(level, buf.toString()); + } + } return retval; } @@ -1446,6 +1674,7 @@ portsToForward.clear(); portsToForwardNow = null; } else { + portsToForwardNow = new HashSet(); // Some ports to keep, some ports to dump // Ports in ports but not in portsToForwardNow we must forward // Ports in portsToForwardNow but not in ports we must dump @@ -1460,17 +1689,61 @@ // Do we need to re-forward anyway? or poll the router? //} else { // Needs forwarding - if(portsToForwardNow == null) portsToForwardNow = new HashSet(); portsToForwardNow.add(port); //} } for(ForwardPort port : portsToForward) { if(ports.contains(port)) { // Should be forwarded, has been forwarded, cool. + if (port.isIP6) { + // copy over uid and expiration from existing + ports.remove(port); + ports.add(port); + portsToForwardNow.remove(port); + portsToForwardNow.add(port); + if (_log.shouldWarn()) + _log.warn("Retaining: " + port); + } } else { - // Needs dropping - if(portsToDumpNow == null) portsToDumpNow = new HashSet(); - portsToDumpNow.add(port); + boolean keep = false; + if (port.isIP6) { + // Don't dump old ipv6 immediately if deprecated + IPv6ForwardPort v6port = (IPv6ForwardPort) port; + long now = _context.clock().now(); + long exp = v6port.getExpiration(); + if (exp > 0) { + keep = exp > now; + if (_log.shouldDebug()) { + if (keep) + _log.debug("Deprecated address not expired, continue forwarding: " + v6port); + else + _log.debug("Deprecated address expired, stop forwarding: " + v6port); + } + } else { + try { + Inet6Address v6addr = (Inet6Address) InetAddress.getByName(v6port.getIP()); + // Addresses caches the result, so don't use isDeprecated(), it may not be current + if (Addresses.isTemporary(v6addr)) { + v6port.setExpiration(now + 24*60*60*1000L); + keep = true; + if (_log.shouldWarn()) + _log.warn("Address now deprecated, continue forwarding for 24h: " + v6port); + } + } catch (UnknownHostException uhe) {} + } + if (keep) { + // copy over uid and expiration from existing + ports.add(port); + portsToForwardNow.remove(port); + portsToForwardNow.add(port); + } + } + + if (!keep) { + // Needs dropping + if (portsToDumpNow == null) portsToDumpNow = new HashSet(); + portsToDumpNow.add(port); + } } } portsToForward.clear(); @@ -1484,8 +1757,8 @@ } if(portsToDumpNow != null && !portsToDumpNow.isEmpty()) unregisterPorts(portsToDumpNow); - if(portsToForwardNow != null && !portsToForwardNow.isEmpty()) - registerPorts(portsToForwardNow); + // call all the time, as it renews subsriptions also. + registerPorts(portsToForwardNow); } private static String protoToString(int p) { @@ -1502,9 +1775,11 @@ * postControlAction() can take many seconds, especially if it's failing, * and onChangePublicPorts() may be called from threads we don't want to slow down, * so throw this in a thread. + * + * @param portsToForwardNow if null, renew subscriptions only, then exit. */ private void registerPorts(Set portsToForwardNow) { - if (_serviceLacksAPM) { + if (_serviceLacksAPM && portsToForwardNow != null) { if (_log.shouldLog(Log.WARN)) _log.warn("UPnP device does not support port forwarding"); Map map = @@ -1518,22 +1793,36 @@ forwardCallback.portForwardStatus(map); return; } - if (_log.shouldLog(Log.INFO)) - _log.info("Starting thread to forward " + portsToForwardNow.size() + " ports"); - Thread t = new I2PThread(new RegisterPortsThread(portsToForwardNow)); + if (_log.shouldInfo()) { + if (portsToForwardNow != null) + _log.info("Starting thread to forward " + portsToForwardNow.size() + " ports"); + else + _log.info("Starting thread to renew subscriptions"); + } + Thread t = new I2PThread(new RegisterPortsThread(portsToForwardNow)); t.setName("UPnP Port Opener " + __id.incrementAndGet()); t.setDaemon(true); t.start(); } + /** + * This also renews all subscriptions. + */ private class RegisterPortsThread implements Runnable { - private Set portsToForwardNow; + private final Set portsToForwardNow; + /** + * @param ports if null, renew subscriptions only, then exit. + */ public RegisterPortsThread(Set ports) { portsToForwardNow = ports; } public void run() { + // This renews the subscriptions for all services on all devices + renewSubscriberService(LEASE_TIME_SECONDS); + if (portsToForwardNow == null) + return; Map map = new HashMap(portsToForwardNow.size()); for(ForwardPort port : portsToForwardNow) { @@ -1546,6 +1835,15 @@ } else { fps = new ForwardPortStatus(ForwardPortStatus.PROBABLE_FAILURE, "UPnP port forwarding apparently failed", port.portNumber); } + if (port.isIP6) { + // Don't report result if deprecated + IPv6ForwardPort v6port = (IPv6ForwardPort) port; + if (v6port.getExpiration() > 0) { + if (_log.shouldDebug()) + _log.debug("Not reporting result for deprecated " + v6port + " - " + fps.reasonString); + continue; + } + } map.put(port, fps); } forwardCallback.portForwardStatus(map); @@ -1567,7 +1865,7 @@ } private class UnregisterPortsThread implements Runnable { - private Set portsToForwardNow; + private final Set portsToForwardNow; public UnregisterPortsThread(Set ports) { portsToForwardNow = ports; @@ -1584,6 +1882,67 @@ } } + /** + * Extended to store the requested IP to be forwarded. + * @since 0.9.50 + */ + static class IPv6ForwardPort extends ForwardPort { + private final String _ip; + private int _uid = -1; + private long _expires; + + /** + * @param ip the IPv6 address being forwarded + */ + public IPv6ForwardPort(String name, int protocol, int port, String ip) { + super(name, true, protocol, port); + _ip = ip; + } + + public String getIP() { return _ip; } + + /** + * @return 0-65535 or -1 if unset + */ + public synchronized int getUID() { return _uid; } + + /** + * @param uid 0-65535 + */ + public synchronized void setUID(int uid) { _uid = uid; } + + /** + * @return absolute time or 0 if unset + */ + public synchronized long getExpiration() { return _expires; } + + /** + * @param expires absolute time + */ + public synchronized void setExpiration(long expires) { _expires = expires; } + + @Override + public int hashCode() { + return _ip.hashCode() ^ super.hashCode(); + } + + /** + * Ignores UID + */ + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof IPv6ForwardPort)) return false; + IPv6ForwardPort f = (IPv6ForwardPort) o; + return _ip.equals(f.getIP()) && super.equals(o); + } + + @Override + public String toString() { + return "IPv6FP " + name + ' ' + protocol + ' ' + _ip + ' ' + portNumber + ' ' + _uid + ' ' + _expires; + } + } + /** * Dumps out device info in semi-HTML format */ diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/transport/UPnPManager.java i2p-0.9.50/router/java/src/net/i2p/router/transport/UPnPManager.java --- i2p-0.9.49/router/java/src/net/i2p/router/transport/UPnPManager.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/transport/UPnPManager.java 2021-05-19 12:12:00.000000000 +0000 @@ -71,9 +71,10 @@ _context = context; _manager = manager; _log = _context.logManager().getLog(UPnPManager.class); - // UPnP wants to bind to IPv6 link local interfaces by default, but what UPnP router - // is going to want to talk IPv6 anyway? Just make it easy and force IPv4 only - org.cybergarage.upnp.UPnP.setEnable(org.cybergarage.upnp.UPnP.USE_ONLY_IPV4_ADDR); + // this controls what sockets UPnP listens on + // not clear it makes any practical difference though + if (!context.getProperty(TransportManager.PROP_ENABLE_UPNP_IPV6, TransportManager.DEFAULT_ENABLE_UPNP_IPV6)) + org.cybergarage.upnp.UPnP.setEnable(org.cybergarage.upnp.UPnP.USE_ONLY_IPV4_ADDR); // set up logging in the UPnP package Debug.initialize(context); int ssdpPort = _context.getProperty(PROP_SSDP_PORT, DEFAULT_SSDP_PORT); @@ -189,7 +190,7 @@ if (_scannerCallback != null) _scannerCallback.beforeScan(); if (_log.shouldLog(Log.DEBUG)) - _log.debug("UPnP Rescan"); + _log.debug("UPnP Rescan", new Exception()); // TODO default search MX (jitter) is 3 seconds... reduce? // See also: // Adaptive Jitter Control for UPnP M-Search @@ -287,7 +288,11 @@ } if (_log.shouldLog(Log.DEBUG)) _log.debug("Adding: " + style + " " + port); - ForwardPort fp = new ForwardPort(name, false, protocol, port); + ForwardPort fp; + if (entry.isIPv6) + fp = new UPnP.IPv6ForwardPort(name, protocol, port, entry.ip); + else + fp = new ForwardPort(name, false, protocol, port); forwards.add(fp); } // non-blocking @@ -352,6 +357,7 @@ ForwardPortStatus fps = entry.getValue(); if (_log.shouldDebug()) _log.debug("FPS: " + fp.name + ' ' + fp.protocol + ' ' + fp.portNumber + + (fp.isIP6 ? " IPv6" : " IPv4") + " status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort); String style; if (fp.protocol == ForwardPort.PROTOCOL_UDP_IPV4) { @@ -364,8 +370,18 @@ continue; } boolean success = fps.status >= ForwardPortStatus.MAYBE_SUCCESS; + byte[] fwdip; + if (fp.isIP6) { + UPnP.IPv6ForwardPort v6fp = (UPnP.IPv6ForwardPort) fp; + String sip = v6fp.getIP(); + fwdip = Addresses.getIP(sip); + if (fwdip == null) + continue; + } else { + fwdip = ipaddr; + } // deadlock path 2 - _manager.forwardPortStatus(style, ipaddr, fp.portNumber, fps.externalPort, success, fps.reasonString); + _manager.forwardPortStatus(style, fwdip, fp.portNumber, fps.externalPort, success, fps.reasonString); } } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java 2021-05-19 12:12:00.000000000 +0000 @@ -52,7 +52,6 @@ //if (_context.tunnelDispatcher().shouldDropParticipatingMessage("IBGW", encrypted.length)) // return -1; //_config.incrementSentMessages(); - _context.bandwidthLimiter().sentParticipatingMessage(1024); TunnelDataMessage msg = new TunnelDataMessage(_context); msg.setData(encrypted); msg.setTunnelId(_config.getSendTunnel()); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/OutboundMessageDistributor.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/OutboundMessageDistributor.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/OutboundMessageDistributor.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/OutboundMessageDistributor.java 2021-05-19 12:12:00.000000000 +0000 @@ -83,21 +83,19 @@ if (_toRouters == null) return false; synchronized(this) { - if (_toRouters.contains(target)) + if (!_toRouters.add(target) || _context.commSystem().isEstablished(target) || ++_newRouterCount <= MAX_ROUTERS_PER_PERIOD) return false; - // haven't sent to this router before long now = _context.clock().now(); if (_newRouterTime < now - NEW_ROUTER_PERIOD) { - _newRouterCount = 0; + // latest guy is outside previous period + _newRouterCount = 1; _newRouterTime = now; - } else if (_newRouterCount >= MAX_ROUTERS_PER_PERIOD) { - if (!_context.commSystem().isEstablished(target)) - return true; //drop + return false; } - _newRouterCount++; - _toRouters.add(target); + // rarely get here at current limits + _toRouters.remove(target); } - return false; + return true; } private void distribute(I2NPMessage msg, RouterInfo target, TunnelId tunnel) { diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java 2021-05-19 12:12:00.000000000 +0000 @@ -79,8 +79,6 @@ //int kb = (size + 1023) / 1024; //for (int i = 0; i < kb; i++) // _config.incrementSentMessages(); - if (!toUs) - _context.bandwidthLimiter().sentParticipatingMessage(size); _outDistributor.distribute(msg, toRouter, toTunnel); } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java 2021-05-19 12:12:00.000000000 +0000 @@ -518,6 +518,8 @@ _currentLookups.set(1); if (_log.shouldLog(Log.DEBUG)) _log.debug("Request " + req + + " From: " + from + + " ID: " + state.msg.getUniqueId() + " handled, lookup next peer " + nextPeer + " lookups: " + current + '/' + limit); _context.netDb().lookupRouterInfo(nextPeer, new HandleReq(_context, state, req, nextPeer), @@ -525,7 +527,9 @@ } else { _currentLookups.decrementAndGet(); if (_log.shouldLog(Log.WARN)) - _log.warn("Drop next hop lookup, limit " + limit + ": " + req); + _log.warn("Drop next hop lookup, limit " + limit + ": " + req + + " From: " + from + + " ID: " + state.msg.getUniqueId()); _context.statManager().addRateData("tunnel.dropLookupThrottle", 1); if (from != null) _context.commSystem().mayDisconnect(from); @@ -536,7 +540,10 @@ handleReq(nextPeerInfo, state, req, nextPeer); long handleTime = System.currentTimeMillis() - beforeHandle; if (_log.shouldLog(Log.DEBUG)) - _log.debug("Request " + req + " handled and we know the next peer " + _log.debug("Request " + req + + " From: " + from + + " ID: " + state.msg.getUniqueId() + + " handled and we know the next peer " + nextPeer + " after " + handleTime + "/" + decryptTime + "/" + lookupTime + "/" + timeSinceReceived); return handleTime; @@ -610,8 +617,14 @@ _currentLookups.decrementAndGet(); getContext().statManager().addRateData("tunnel.rejectTimeout", 1); getContext().statManager().addRateData("tunnel.buildLookupSuccess", 0); - if (_log.shouldLog(Log.WARN)) - _log.warn("Next hop lookup failure: " + _req); + if (_log.shouldLog(Log.WARN)) { + Hash from = _state.fromHash; + if (from == null && _state.from != null) + from = _state.from.calculateHash(); + _log.warn("Next hop lookup failure: " + _req + + " From: " + from + + " ID: " + _state.msg.getUniqueId()); + } // ??? should we blame the peer here? getContext().profileManager().tunnelTimedOut(_nextPeer); getContext().messageHistory().tunnelRejected(_state.fromHash, new TunnelId(_req.readReceiveTunnelId()), _nextPeer, @@ -741,7 +754,7 @@ timeDiff = roundedNow - time; maxAge = MAX_REQUEST_AGE; } - if (timeDiff > MAX_REQUEST_AGE) { + if (timeDiff > maxAge) { _context.statManager().addRateData("tunnel.rejectTooOld", 1); if (_log.shouldLog(Log.WARN)) _log.warn("Dropping build request too old... replay attack? " + DataHelper.formatDuration(timeDiff) + ": " + req); @@ -1056,7 +1069,7 @@ fh = from.calculateHash(); if (fh != null && _requestThrottler.shouldThrottle(fh)) { if (_log.shouldLog(Log.WARN)) - _log.warn("Dropping tunnel request (from throttle), previous hop: " + fh); + _log.warn("Dropping tunnel request (from throttle) id " + reqId + ", previous hop: " + fh); _context.statManager().addRateData("tunnel.dropReqThrottle", 1); accept = false; } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java 2021-05-19 12:12:00.000000000 +0000 @@ -9,6 +9,8 @@ import net.i2p.data.PublicKey; import net.i2p.data.router.RouterInfo; import net.i2p.data.TunnelId; +import net.i2p.data.i2np.I2NPMessage; +import net.i2p.data.i2np.InboundTunnelBuildMessage; import net.i2p.data.i2np.TunnelBuildMessage; import net.i2p.data.i2np.VariableTunnelBuildMessage; import net.i2p.router.JobImpl; @@ -17,6 +19,7 @@ import net.i2p.router.TunnelInfo; import net.i2p.router.TunnelManagerFacade; import net.i2p.router.TunnelPoolSettings; +import net.i2p.router.networkdb.kademlia.MessageWrapper; import net.i2p.router.tunnel.BuildMessageGenerator; import net.i2p.router.tunnel.HopConfig; import net.i2p.router.tunnel.TunnelCreatorConfig; @@ -46,7 +49,6 @@ MEDIUM_ORDER.add(Integer.valueOf(i)); } } - private static final int PRIORITY = OutNetMessage.PRIORITY_MY_BUILD_REQUEST; /** @@ -193,7 +195,7 @@ } //long beforeCreate = System.currentTimeMillis(); - TunnelBuildMessage msg = createTunnelBuildMessage(ctx, pool, cfg, pairedTunnel, exec); + I2NPMessage msg = createTunnelBuildMessage(ctx, pool, cfg, pairedTunnel, exec); //long createTime = System.currentTimeMillis()-beforeCreate; if (msg == null) { if (log.shouldLog(Log.WARN)) @@ -206,14 +208,33 @@ //long beforeDispatch = System.currentTimeMillis(); if (cfg.isInbound()) { + Hash ibgw = cfg.getPeer(0); + if (msg.getType() == InboundTunnelBuildMessage.MESSAGE_TYPE) { + // ITBM is garlic encrypted to the IBGW, to hide it from the OBEP + RouterInfo peer = ctx.netDb().lookupRouterInfoLocally(ibgw); + if (peer != null) { + I2NPMessage enc = MessageWrapper.wrap(ctx, msg, peer); + if (enc != null) { + msg = enc; + // log.debug("wrapping IB TBM to " + ibgw); + } else { + if (log.shouldWarn()) + log.warn("failed to wrap IB TBM to " + ibgw); + } + } else { + if (log.shouldWarn()) + log.warn("no RI, failed to wrap IB TBM to " + ibgw); + } + } + if (log.shouldLog(Log.INFO)) log.info("Sending the tunnel build request " + msg.getUniqueId() + " out the tunnel " + pairedTunnel + " to " - + cfg.getPeer(0) + " for " + cfg + " waiting for the reply of " + + ibgw + " for " + cfg + " waiting for the reply of " + cfg.getReplyMessageId()); // send it out a tunnel targetting the first hop // TODO - would be nice to have a TunnelBuildFirstHopFailJob queued if the // pairedTunnel is zero-hop, but no way to do that? - ctx.tunnelDispatcher().dispatchOutbound(msg, pairedTunnel.getSendTunnelId(0), cfg.getPeer(0)); + ctx.tunnelDispatcher().dispatchOutbound(msg, pairedTunnel.getSendTunnelId(0), ibgw); } else { if (log.shouldLog(Log.INFO)) log.info("Sending the tunnel build request directly to " + cfg.getPeer(1) diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/ThrottledPumpedTunnelGateway.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/ThrottledPumpedTunnelGateway.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/ThrottledPumpedTunnelGateway.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/ThrottledPumpedTunnelGateway.java 2021-05-19 12:12:00.000000000 +0000 @@ -34,7 +34,15 @@ // Hard to do this exactly, but we'll assume 2:1 batching // for the purpose of estimating outgoing size. // We assume that it's the outbound bandwidth that is the issue... - int size = Math.max(msg.getMessageSize(), 1024/2); + // first frag. overhead + int size = msg.getMessageSize() + 60; + if (size > 1024) { + // additional frag. overhead + size += 28 * (size / 1024); + } else if (size < 512) { + // 2:1 batching of small messages + size = 512; + } if (_context.tunnelDispatcher().shouldDropParticipatingMessage(TunnelDispatcher.Location.IBGW, msg.getType(), size)) { // this overstates the stat somewhat, but ok for now int kb = (size + 1023) / 1024; diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java 2021-05-19 12:12:00.000000000 +0000 @@ -767,84 +767,30 @@ public boolean shouldDropParticipatingMessage(Location loc, int type, int length) { if (length <= 0) return false; - /**** - Don't use the tunnel.participatingBandwidth stat any more. It could be up to 3 minutes old. - Also, it counts inbound bandwidth, i.e. before dropping, which resulted in too many drops - during a burst. - We now use the bandwidth limiter to track outbound participating bandwidth - over the last few seconds. - ****/ - /**** - RateStat rs = _context.statManager().getRate("tunnel.participatingBandwidth"); - if (rs == null) - return false; - Rate r = rs.getRate(60*1000); - if (r == null) - return false; - // weight current period higher - long count = r.getLastEventCount() + (3 * r.getCurrentEventCount()); - int bw = 0; - if (count > 0) - bw = (int) ((r.getLastTotalValue() + (3 * r.getCurrentTotalValue())) / count); - else - bw = (int) r.getLifetimeAverageValue(); - - int usedIn = Math.min(_context.router().get1sRateIn(), _context.router().get15sRateIn()); - if (bw < usedIn) - usedIn = bw; - if (usedIn <= 0) - return false; - int usedOut = Math.min(_context.router().get1sRate(true), _context.router().get15sRate(true)); - if (bw < usedOut) - usedOut = bw; - if (usedOut <= 0) - return false; - int used = Math.min(usedIn, usedOut); - ****/ - int used = _context.bandwidthLimiter().getCurrentParticipatingBandwidth(); - if (used <= 0) - return false; - - int maxKBps = Math.min(_context.bandwidthLimiter().getInboundKBytesPerSecond(), - _context.bandwidthLimiter().getOutboundKBytesPerSecond()); - float share = (float) _context.router().getSharePercentage(); - - // start dropping at 120% of the limit, - // as we rely on Throttle for long-term bandwidth control by rejecting tunnels - float maxBps = maxKBps * share * (1024f * 1.20f); - float pctDrop = (used - maxBps) / used; - if (pctDrop <= 0) - return false; // increase the drop probability for OBEP, // (except lower it for tunnel build messages type 21/22/23/24), // and lower it for IBGW, for network efficiency - double len = length; + float factor; if (loc == Location.OBEP) { // we don't need to check for VTBRM/TBRM as that happens at tunnel creation if (type == VariableTunnelBuildMessage.MESSAGE_TYPE || type == TunnelBuildMessage.MESSAGE_TYPE) - len /= 1.5; + factor = 1 / 1.5f; else - len *= 1.5; + factor = 1.5f; } else if (loc == Location.IBGW) { // we don't need to check for VTBM/TBM as that happens at tunnel creation if (type == VariableTunnelBuildReplyMessage.MESSAGE_TYPE || type == TunnelBuildReplyMessage.MESSAGE_TYPE) - len /= 1.5 * 1.5 * 1.5; + factor = 1 / (1.5f * 1.5f * 1.5f); else - len /= 1.5; + factor = 1 / 1.5f; + } else { + factor = 1.0f; } - // drop in proportion to size w.r.t. a standard 1024-byte message - // this is a little expensive but we want to adjust the curve between 0 and 1 - // Most messages are 1024, only at the OBEP do we see other sizes - if ((int)len != 1024) - pctDrop = (float) Math.pow(pctDrop, 1024d / len); - float rand = _context.random().nextFloat(); - boolean reject = rand <= pctDrop; + boolean reject = ! _context.bandwidthLimiter().sentParticipatingMessage(length, factor); if (reject) { if (_log.shouldLog(Log.WARN)) { - int availBps = (int) (((maxKBps*1024)*share) - used); - _log.warn("Drop part. msg. avail/max/used " + availBps + "/" + (int) maxBps + "/" - + used + " %Drop = " + pctDrop + _log.warn("Drop part. msg. factor=" + factor + ' ' + loc + ' ' + type + ' ' + length); } _context.statManager().addRateData("tunnel.participatingMessageDropped", 1); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java i2p-0.9.50/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java --- i2p-0.9.49/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java 2021-05-19 12:12:00.000000000 +0000 @@ -203,7 +203,6 @@ TunnelDataMessage.MESSAGE_TYPE, 1024)) return; //_config.incrementSentMessages(); - _context.bandwidthLimiter().sentParticipatingMessage(1024); long oldId = msg.getUniqueId(); long newId = _context.random().nextLong(I2NPMessage.MAX_ID_VALUE); _context.messageHistory().wrap("TunnelDataMessage", oldId, "TunnelDataMessage", newId); diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/util/CoDelBlockingQueue.java i2p-0.9.50/router/java/src/net/i2p/router/util/CoDelBlockingQueue.java --- i2p-0.9.49/router/java/src/net/i2p/router/util/CoDelBlockingQueue.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/util/CoDelBlockingQueue.java 2021-05-19 12:12:00.000000000 +0000 @@ -56,17 +56,17 @@ * * I2P: Raise to 15 due to multithreading environment * - * Maybe need to make configurable per-instance. */ - private static final long TARGET = 15; + private static final int TARGET = 15; + private final long _target; /** * Quote: * A setting of 100 ms works well across a range of RTTs from 10 ms to 1 second * - * Maybe need to make configurable per-instance. */ - private static final long INTERVAL = 100; + private static final int INTERVAL = 100; + private final long _interval; //private static final int MAXPACKET = 512; private final String STAT_DROP; @@ -75,14 +75,28 @@ private static final long BACKLOG_TIME = 2*1000; /** + * Target 15, interval 100 + * * @param name for stats */ public CoDelBlockingQueue(I2PAppContext ctx, String name, int capacity) { + this(ctx, name, capacity, TARGET, INTERVAL); + } + + /** + * @param target the target max latency (ms) + * @param interval how long above target to start dropping (ms) + * @param name for stats + * @since 0.9.50 + */ + public CoDelBlockingQueue(I2PAppContext ctx, String name, int capacity, int target, int interval) { super(capacity); _context = ctx; _log = ctx.logManager().getLog(CoDelBlockingQueue.class); _name = name; _capacity = capacity; + _target = target; + _interval = interval; STAT_DROP = ("codel." + name + ".drop").intern(); STAT_DELAY = ("codel." + name + ".delay").intern(); ctx.statManager().createRateStat(STAT_DROP, "queue delay of dropped items", "Router", RATES); @@ -207,13 +221,13 @@ long sojurn = _now - entry.getEnqueueTime(); _context.statManager().addRateData(STAT_DELAY, sojurn); // I2P use isEmpty instead of size() < MAXPACKET - if (sojurn < TARGET || isEmpty()) { + if (sojurn < _target || isEmpty()) { _first_above_time = 0; } else { if (_first_above_time == 0) { // just went above from below. if we stay above - // for at least INTERVAL we'll say it's ok to drop - _first_above_time = _now + INTERVAL; + // for at least _interval we'll say it's ok to drop + _first_above_time = _now + _interval; } else if (_now >= _first_above_time) { ok_to_drop = true; } @@ -270,7 +284,7 @@ } } } else if (ok_to_drop && - (_now - _drop_next < INTERVAL || _now - _first_above_time >= INTERVAL)) { + (_now - _drop_next < _interval || _now - _first_above_time >= _interval)) { // If we get here, then we're not in dropping state. If the sojourn time has been above // target for interval, then we decide whether it's time to enter dropping state. // We do so if we've been either in dropping state recently or above target for a relatively @@ -287,7 +301,7 @@ _dropping = true; // If we're in a drop cycle, the drop rate that controlled the queue // on the last cycle is a good starting point to control it now. - if (_now - _drop_next < INTERVAL) + if (_now - _drop_next < _interval) _count = _count > 2 ? _count - 2 : 1; else _count = 1; @@ -313,6 +327,6 @@ * Caller must synch on this */ private void control_law(long t) { - _drop_next = t + (long) (INTERVAL / Math.sqrt(_count)); + _drop_next = t + (long) (_interval / Math.sqrt(_count)); } } diff -Nru i2p-0.9.49/router/java/src/net/i2p/router/util/CoDelPriorityBlockingQueue.java i2p-0.9.50/router/java/src/net/i2p/router/util/CoDelPriorityBlockingQueue.java --- i2p-0.9.49/router/java/src/net/i2p/router/util/CoDelPriorityBlockingQueue.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/net/i2p/router/util/CoDelPriorityBlockingQueue.java 2021-05-19 12:12:00.000000000 +0000 @@ -52,7 +52,8 @@ * * Maybe need to make configurable per-instance. */ - private static final long TARGET = 15; + private static final int TARGET = 15; + private final long _target; /** * Quote: @@ -62,7 +63,8 @@ * * Maybe need to make configurable per-instance. */ - private static final long INTERVAL = 300; + private static final int INTERVAL = 300; + private final long _interval; //private static final int MAXPACKET = 512; private final String STAT_DROP; @@ -77,7 +79,16 @@ * @param name for stats */ public CoDelPriorityBlockingQueue(I2PAppContext ctx, String name, int initialCapacity) { + this(ctx, name, initialCapacity, TARGET, INTERVAL); + } + + /** + * @param name for stats + */ + public CoDelPriorityBlockingQueue(I2PAppContext ctx, String name, int initialCapacity, int target, int interval) { super(ctx, name, initialCapacity); + _target = target; + _interval = interval; STAT_DROP = ("codel." + name + ".drop.").intern(); STAT_DELAY = ("codel." + name + ".delay").intern(); for (int i = 0; i < PRIORITIES.length; i++) { @@ -190,13 +201,13 @@ long sojurn = _now - entry.getEnqueueTime(); _context.statManager().addRateData(STAT_DELAY, sojurn); // I2P use isEmpty instead of size() < MAXPACKET - if (sojurn < TARGET || isEmpty()) { + if (sojurn < _target || isEmpty()) { _first_above_time = 0; } else { if (_first_above_time == 0) { // just went above from below. if we stay above - // for at least INTERVAL we'll say it's ok to drop - _first_above_time = _now + INTERVAL; + // for at least _interval we'll say it's ok to drop + _first_above_time = _now + _interval; } else if (_now >= _first_above_time) { ok_to_drop = true; } @@ -253,7 +264,7 @@ } } else if (ok_to_drop && rv.getPriority() < DONT_DROP_PRIORITY && - (_now - _drop_next < INTERVAL || _now - _first_above_time >= INTERVAL)) { + (_now - _drop_next < _interval || _now - _first_above_time >= _interval)) { // If we get here, then we're not in dropping state. If the sojourn time has been above // target for interval, then we decide whether it's time to enter dropping state. // We do so if we've been either in dropping state recently or above target for a relatively @@ -271,7 +282,7 @@ _dropping = true; // If we're in a drop cycle, the drop rate that controlled the queue // on the last cycle is a good starting point to control it now. - if (_now - _drop_next < INTERVAL) + if (_now - _drop_next < _interval) _count = _count > 2 ? _count - 2 : 1; else _count = 1; @@ -301,6 +312,6 @@ * Caller must synch on this */ private void control_law(long t) { - _drop_next = t + (long) (INTERVAL / Math.sqrt(_count)); + _drop_next = t + (long) (_interval / Math.sqrt(_count)); } } diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/http/HTTPRequest.java i2p-0.9.50/router/java/src/org/cybergarage/http/HTTPRequest.java --- i2p-0.9.49/router/java/src/org/cybergarage/http/HTTPRequest.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/http/HTTPRequest.java 2021-05-19 12:12:00.000000000 +0000 @@ -388,6 +388,16 @@ private Socket postSocket = null; + private String bindTo = null; + + /** + * I2P - bind HTTP socket to specified local host address + * + * @param host null to not bind to a particlar local address + * @since 0.9.50 + */ + public void setBindHost(String host) { bindTo = host; } + public HTTPResponse post(String host, int port, boolean isKeepAlive) { HTTPResponse httpRes = new HTTPResponse(); @@ -413,6 +423,8 @@ // And set the soTimeout to 2 second (for reads). //postSocket = new Socket(host, port); postSocket = new Socket(); + if (bindTo != null) + postSocket.bind(new InetSocketAddress(bindTo, 0)); postSocket.setSoTimeout(2000); SocketAddress sa = new InetSocketAddress(host, port); postSocket.connect(sa, 3000); diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/upnp/Action.java i2p-0.9.50/router/java/src/org/cybergarage/upnp/Action.java --- i2p-0.9.49/router/java/src/org/cybergarage/upnp/Action.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/upnp/Action.java 2021-05-19 12:12:00.000000000 +0000 @@ -52,7 +52,7 @@ //////////////////////////////////////////////// private Node serviceNode; - private Node actionNode; + private final Node actionNode; private Node getServiceNode() { @@ -370,11 +370,24 @@ public boolean postControlAction() { + return postControlAction(null); + } + + /** + * I2P - bind HTTP socket to specified local host address + * + * @param fromHost null to not bind to a particlar local address + * @since 0.9.50 + */ + public boolean postControlAction(String fromHost) + { // Thanks for Giordano Sassaroli (08/30/03) ArgumentList actionArgList = getArgumentList(); ArgumentList actionInputArgList = getInputArgumentList(); ActionRequest ctrlReq = new ActionRequest(); ctrlReq.setRequest(this, actionInputArgList); + if (fromHost != null) + ctrlReq.setBindHost(fromHost); if (Debug.isOn() == true) ctrlReq.print(); ActionResponse ctrlRes = ctrlReq.post(); diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/upnp/control/ControlRequest.java i2p-0.9.50/router/java/src/org/cybergarage/upnp/control/ControlRequest.java --- i2p-0.9.49/router/java/src/org/cybergarage/upnp/control/ControlRequest.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/upnp/control/ControlRequest.java 2021-05-19 12:12:00.000000000 +0000 @@ -50,6 +50,9 @@ public class ControlRequest extends SOAPRequest { + // I2P see setRequestHost(); + private static final String WAN_IPV6_CONNECTION = "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1"; + //////////////////////////////////////////////// // Constructor //////////////////////////////////////////////// @@ -114,8 +117,13 @@ // Thanks for Rob van den Boomen (02/17/04) // BUGFIX, set urlbase from location string if not set in description.xml - if (postURL == null || postURL.length() <= 0) - postURL = service.getRootDevice().getLocation(); + if (postURL == null || postURL.length() <= 0) { + // I2P + // if service is ipv6 service... + String type = service.getServiceType(); + boolean preferIPv6 = WAN_IPV6_CONNECTION.equals(type); + postURL = service.getRootDevice().getLocation(preferIPv6); + } String reqHost = HTTP.getHost(postURL); int reqPort = HTTP.getPort(postURL); diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/upnp/control/QueryRequest.java i2p-0.9.50/router/java/src/org/cybergarage/upnp/control/QueryRequest.java --- i2p-0.9.49/router/java/src/org/cybergarage/upnp/control/QueryRequest.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/upnp/control/QueryRequest.java 2021-05-19 12:12:00.000000000 +0000 @@ -74,7 +74,7 @@ { Service service = stateVar.getService(); - String ctrlURL = service.getControlURL(); + //String ctrlURL = service.getControlURL(); setRequestHost(service); diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/upnp/ControlPoint.java i2p-0.9.50/router/java/src/org/cybergarage/upnp/ControlPoint.java --- i2p-0.9.49/router/java/src/org/cybergarage/upnp/ControlPoint.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/upnp/ControlPoint.java 2021-05-19 12:12:00.000000000 +0000 @@ -97,6 +97,9 @@ import org.cybergarage.xml.Parser; import org.cybergarage.xml.ParserException; +import net.i2p.util.Addresses; +import net.i2p.router.transport.TransportUtil; + public class ControlPoint implements HTTPRequestListener { private final static int DEFAULT_EVENTSUB_PORT = 8058; @@ -105,6 +108,9 @@ private final static String DEFAULT_EVENTSUB_URI = "/evetSub"; + // I2P + private static final boolean ALLOW_IPV6_LOCATION = true; + //////////////////////////////////////////////// // Member //////////////////////////////////////////////// @@ -242,15 +248,9 @@ { if (ssdpPacket.isRootDevice() == false) return; - + String usn = ssdpPacket.getUSN(); - String udn = USN.getUDN(usn); - Device dev = getDevice(udn); - if (dev != null) { - dev.setSSDPPacket(ssdpPacket); - return; - } - + String location = ssdpPacket.getLocation(); try { URL locationUrl = new URL(location); @@ -263,13 +263,64 @@ return; } } + // I2P + // We duplicate all the checks in Parser.parse() because they + // are bypassed for a known device. + // Devices may send two SSDP responses, one with an IPv4 location + // and one with an IPv6 location. + // Do these check BEFORE we call dev.setSSDPPacket() so we don't + // overwrite the SSDPPacket in DeviceData. + // TODO handle multiple locations in DeviceData. + String host = locationUrl.getHost(); + if (host == null) { + Debug.warning("Ignoring device with bad URL at " + location); + return; + } + if (host.startsWith("127.")) { + Debug.warning("Ignoring localhost device at " + location); + return; + } + if (host.startsWith("[") && host.endsWith("]")) { + if (!ALLOW_IPV6_LOCATION) { + Debug.warning("Ignoring IPv6 device at " + location); + return; + } + // fixup for valid checks below + host = host.substring(1, host.length() - 1); + } + if (!"http".equals(locationUrl.getProtocol())) { + Debug.warning("Ignoring non-http device at " + location); + return; + } + if (!Addresses.isIPv4Address(host) && + (!ALLOW_IPV6_LOCATION || !Addresses.isIPv6Address(host))) { + Debug.warning("Ignoring non-IPv4 address at " + location); + return; + } + byte[] ip = Addresses.getIP(host); + if (ip == null) { + Debug.warning("Ignoring bad IP at " + location); + return; + } + if (TransportUtil.isPubliclyRoutable(ip, ALLOW_IPV6_LOCATION)) { + Debug.warning("Ignoring public address at " + location); + return; + } + String udn = USN.getUDN(usn); + Device dev = getDevice(udn); + if (dev != null) { + Debug.message("Additional SSDP for " + udn + " at " + location); + dev.setSSDPPacket(ssdpPacket); + return; + } + Parser parser = UPnP.getXMLParser(); Node rootNode = parser.parse(locationUrl); Device rootDev = getDevice(rootNode); if (rootDev == null) return; rootDev.setSSDPPacket(ssdpPacket); - Debug.warning("Add root device", new Exception("received on " + ssdpPacket.getLocalAddress())); + Debug.warning("Add root device at " + location, new Exception("received on " + ssdpPacket.getLocalAddress())); addDevice(rootNode); // Thanks for Oliver Newell (2004/10/16) diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/upnp/Device.java i2p-0.9.50/router/java/src/org/cybergarage/upnp/Device.java --- i2p-0.9.49/router/java/src/org/cybergarage/upnp/Device.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/upnp/Device.java 2021-05-19 12:12:00.000000000 +0000 @@ -731,9 +731,18 @@ } public SSDPPacket getSSDPPacket() { + return getSSDPPacket(false); + } + + /** + * I2P for multiple location support + * + * @since 0.9.50 + */ + public SSDPPacket getSSDPPacket(boolean preferIPv6) { if (isRootDevice() == false) return null; - return getDeviceData().getSSDPPacket(); + return getDeviceData().getSSDPPacket(preferIPv6); } // ////////////////////////////////////////////// @@ -745,10 +754,19 @@ } public String getLocation() { - SSDPPacket packet = getSSDPPacket(); + return getLocation(false); + } + + /** + * I2P for multiple location support + * + * @since 0.9.50 + */ + public String getLocation(boolean preferIPv6) { + SSDPPacket packet = getSSDPPacket(preferIPv6); if (packet != null) return packet.getLocation(); - return getDeviceData().getLocation(); + return getDeviceData().getLocation(preferIPv6); } // ////////////////////////////////////////////// diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/upnp/xml/DeviceData.java i2p-0.9.50/router/java/src/org/cybergarage/upnp/xml/DeviceData.java --- i2p-0.9.49/router/java/src/org/cybergarage/upnp/xml/DeviceData.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/upnp/xml/DeviceData.java 2021-05-19 12:12:00.000000000 +0000 @@ -19,6 +19,8 @@ import java.io.*; import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.URL; import org.cybergarage.util.*; import org.cybergarage.http.*; @@ -27,6 +29,11 @@ import org.cybergarage.upnp.ssdp.*; import org.cybergarage.upnp.device.*; +/** + * + * I2P added multiple location support + * + */ public class DeviceData extends NodeData { public DeviceData() @@ -61,12 +68,43 @@ //////////////////////////////////////////////// private String location = ""; + private String location_ipv6 = ""; public String getLocation() { - return location; + return getLocation(false); + } + + /** + * I2P for multiple location support + * + * @since 0.9.50 + */ + public String getLocation(boolean preferIPv6) { + if (preferIPv6) { + if (location_ipv6 != null && !location_ipv6.isEmpty()) + return location_ipv6; + return location; + } else { + if (location != null && !location.isEmpty()) + return location; + return location_ipv6; + } } public void setLocation(String location) { + if (location != null) { + try { + URL url = new URL(location); + String host = url.getHost(); + if (host != null && host.startsWith("[")) { + location_ipv6 = location; + return; + } + } catch (MalformedURLException me) { + Debug.warning("Bad location: " + location, me); + return; + } + } this.location = location; } @@ -241,12 +279,44 @@ //////////////////////////////////////////////// private SSDPPacket ssdpPacket = null; + private SSDPPacket ssdpPacket_ipv6 = null; public SSDPPacket getSSDPPacket() { - return ssdpPacket; + return getSSDPPacket(false); + } + + /** + * I2P for multiple location support + * + * @since 0.9.50 + */ + public SSDPPacket getSSDPPacket(boolean preferIPv6) { + if (preferIPv6) { + if (ssdpPacket_ipv6 != null) + return ssdpPacket_ipv6; + return ssdpPacket; + } else { + if (ssdpPacket != null) + return ssdpPacket; + return ssdpPacket_ipv6; + } } public void setSSDPPacket(SSDPPacket packet) { + String location = packet.getLocation(); + if (location != null) { + try { + URL url = new URL(location); + String host = url.getHost(); + if (host != null && host.startsWith("[")) { + ssdpPacket_ipv6 = packet; + return; + } + } catch (MalformedURLException me) { + Debug.warning("Bad location: " + location, me); + return; + } + } ssdpPacket = packet; } diff -Nru i2p-0.9.49/router/java/src/org/cybergarage/xml/Parser.java i2p-0.9.50/router/java/src/org/cybergarage/xml/Parser.java --- i2p-0.9.49/router/java/src/org/cybergarage/xml/Parser.java 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/java/src/org/cybergarage/xml/Parser.java 2021-05-19 12:12:00.000000000 +0000 @@ -71,12 +71,13 @@ throw new ParserException("Not HTTP"); String host = locationURL.getHost(); if (host == null || - !Addresses.isIPv4Address(host) || host.startsWith("127.")) throw new ParserException("Bad host " + host); + if (host.startsWith("[") && host.endsWith("]")) + host = host.substring(1, host.length() - 1); byte[] ip = Addresses.getIP(host); if (ip == null || - TransportUtil.isPubliclyRoutable(ip, false)) + TransportUtil.isPubliclyRoutable(ip, true)) throw new ParserException("Bad host " + host); int port = locationURL.getPort(); diff -Nru i2p-0.9.49/router/locale/messages_it.po i2p-0.9.50/router/locale/messages_it.po --- i2p-0.9.49/router/locale/messages_it.po 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/locale/messages_it.po 2021-05-19 12:12:00.000000000 +0000 @@ -6,6 +6,7 @@ # # Translators: # zzzi2p, 2019 +# SebastianoPistore , 2021 # msgid "" msgstr "" @@ -13,7 +14,7 @@ "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-12-18 13:32+0000\n" "PO-Revision-Date: 2019-12-19 14:09+0000\n" -"Last-Translator: zzzi2p, 2019\n" +"Last-Translator: SebastianoPistore , 2021\n" "Language-Team: Italian (https://www.transifex.com/otf/teams/12694/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -174,7 +175,7 @@ #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:806 msgid "Rejecting tunnels: Connection limit" -msgstr "Rifiuto dei tunnels: Limite di connessioni raggiunto" +msgstr "Rifiuto dei tunnel: Limite connessioni raggiunto" #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1024 #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1057 diff -Nru i2p-0.9.49/router/locale/messages_pt_BR.po i2p-0.9.50/router/locale/messages_pt_BR.po --- i2p-0.9.49/router/locale/messages_pt_BR.po 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/router/locale/messages_pt_BR.po 2021-05-19 12:12:00.000000000 +0000 @@ -10,7 +10,7 @@ # Gutem , 2019 # C. E., 2019 # zzzi2p, 2019 -# Eduardo Rodrigues, 2020 +# Eduardo Rodrigues, 2021 # msgid "" msgstr "" @@ -18,7 +18,7 @@ "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-12-18 13:32+0000\n" "PO-Revision-Date: 2019-12-19 14:09+0000\n" -"Last-Translator: Eduardo Rodrigues, 2020\n" +"Last-Translator: Eduardo Rodrigues, 2021\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/otf/teams/12694/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -158,20 +158,20 @@ #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:260 msgid "Dropping tunnel requests: Too slow" -msgstr "" +msgstr "Cessando solicitações de túnel: Demasiado lento" #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:270 msgid "Dropping tunnel requests: High job lag" -msgstr "" +msgstr "Cessando solicitações de túnel: Alto acúmulo de trabalho" #. don't even bother, since we are so overloaded locally #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:464 msgid "Dropping tunnel requests: Overloaded" -msgstr "" +msgstr "Cessando solicitações de túnel: Sobrecarregado" #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:747 msgid "Rejecting tunnels: Hidden mode" -msgstr "" +msgstr "Rejeitando túneis: Modo oculto" #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:775 msgid "Rejecting tunnels: Request overload" @@ -184,8 +184,8 @@ #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1024 #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1057 msgid "Dropping tunnel requests: High load" -msgstr "" +msgstr "Cessando solicitações de túnel: Carga alta" #: ../java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1140 msgid "Dropping tunnel requests: Queue time" -msgstr "" +msgstr "Cessando solicitações de túnel: Tempo de espera" diff -Nru i2p-0.9.49/tests/scripts/checkscripts.sh i2p-0.9.50/tests/scripts/checkscripts.sh --- i2p-0.9.49/tests/scripts/checkscripts.sh 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/tests/scripts/checkscripts.sh 2021-05-19 12:12:00.000000000 +0000 @@ -16,7 +16,6 @@ ./apps/i2ptunnel/java/bundle-messages*.sh \ ./apps/ministreaming/java/bundle-messages.sh \ ./apps/routerconsole/java/bundle-messages*.sh \ - ./apps/sam/c/examples/i2p-ping/pinger.sh \ ./apps/susidns/src/bundle-messages.sh \ ./apps/susimail/bundle-messages.sh \ ./core/c/*.sh \ @@ -34,7 +33,6 @@ ./installer/resources/locale/bundle-messages.sh \ ./installer/resources/uninstall_i2p_service_osx.command ./installer/resources/uninstall_i2p_service_unix \ - ./launchers/macosx/check_latest_java.sh \ ./Slackware/i2p/i2p.SlackBuild \ ./Slackware/i2p/doinst.sh \ ./Slackware/i2p/rc.i2p \ diff -Nru i2p-0.9.49/tests/scripts/checkxml.sh i2p-0.9.50/tests/scripts/checkxml.sh --- i2p-0.9.49/tests/scripts/checkxml.sh 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/tests/scripts/checkxml.sh 2021-05-19 12:12:00.000000000 +0000 @@ -14,14 +14,6 @@ XMLFILES="\ ./apps/addressbook/build.xml \ ./apps/BOB/build.xml \ -./apps/BOB/Demos/echo/echoclient/build.xml \ -./apps/BOB/Demos/echo/echoclient/nbproject/build-impl.xml \ -./apps/BOB/Demos/echo/echoclient/nbproject/private/private.xml \ -./apps/BOB/Demos/echo/echoclient/nbproject/project.xml \ -./apps/BOB/Demos/echo/echoserver/build.xml \ -./apps/BOB/Demos/echo/echoserver/nbproject/build-impl.xml \ -./apps/BOB/Demos/echo/echoserver/nbproject/private/private.xml \ -./apps/BOB/Demos/echo/echoserver/nbproject/project.xml \ ./apps/BOB/nbproject/build-impl.xml \ ./apps/BOB/nbproject/project.xml \ ./apps/desktopgui/build.xml \ diff -Nru i2p-0.9.49/tests/scripts/travis.sh i2p-0.9.50/tests/scripts/travis.sh --- i2p-0.9.49/tests/scripts/travis.sh 2021-02-17 19:22:21.000000000 +0000 +++ i2p-0.9.50/tests/scripts/travis.sh 2021-05-19 12:12:00.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh -if [ "$TRAVIS_JDK_VERSION" == "oraclejdk11" ]; then +if [ "$TRAVIS_JDK_VERSION" = "oraclejdk11" ]; then ./gradlew sonarqube codeCoverageReport -Dsonar.verbose=true else ./gradlew check codeCoverageReport