* Display both the hash and the full destination associated with each tunnel on
the /i2ptunnel/ page so they can easily be shared. * By default, try to create any needed private key files (for server tunnels only) * keep track of the I2PSession objects used by the I2PTunnel instances (only needed for exposing the associated Destination)
This commit is contained in:
@ -54,6 +54,7 @@ import net.i2p.I2PAppContext;
|
|||||||
import net.i2p.I2PException;
|
import net.i2p.I2PException;
|
||||||
import net.i2p.client.I2PClient;
|
import net.i2p.client.I2PClient;
|
||||||
import net.i2p.client.I2PClientFactory;
|
import net.i2p.client.I2PClientFactory;
|
||||||
|
import net.i2p.client.I2PSession;
|
||||||
import net.i2p.client.naming.NamingService;
|
import net.i2p.client.naming.NamingService;
|
||||||
import net.i2p.data.Base64;
|
import net.i2p.data.Base64;
|
||||||
import net.i2p.data.DataFormatException;
|
import net.i2p.data.DataFormatException;
|
||||||
@ -71,6 +72,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
private static long __tunnelId = 0;
|
private static long __tunnelId = 0;
|
||||||
private long _tunnelId;
|
private long _tunnelId;
|
||||||
private Properties _clientOptions;
|
private Properties _clientOptions;
|
||||||
|
private List _sessions;
|
||||||
|
|
||||||
public static final int PACKET_DELAY = 100;
|
public static final int PACKET_DELAY = 100;
|
||||||
|
|
||||||
@ -108,6 +110,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
_event = new EventDispatcherImpl();
|
_event = new EventDispatcherImpl();
|
||||||
_clientOptions = new Properties();
|
_clientOptions = new Properties();
|
||||||
_clientOptions.putAll(System.getProperties());
|
_clientOptions.putAll(System.getProperties());
|
||||||
|
_sessions = new ArrayList(1);
|
||||||
|
|
||||||
addConnectionEventListener(lsnr);
|
addConnectionEventListener(lsnr);
|
||||||
boolean gui = true;
|
boolean gui = true;
|
||||||
@ -172,6 +175,24 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List getSessions() {
|
||||||
|
synchronized (_sessions) {
|
||||||
|
return new ArrayList(_sessions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void addSession(I2PSession session) {
|
||||||
|
if (session == null) return;
|
||||||
|
synchronized (_sessions) {
|
||||||
|
_sessions.add(session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void removeSession(I2PSession session) {
|
||||||
|
if (session == null) return;
|
||||||
|
synchronized (_sessions) {
|
||||||
|
_sessions.remove(session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Properties getClientOptions() { return _clientOptions; }
|
public Properties getClientOptions() { return _clientOptions; }
|
||||||
|
|
||||||
private void addtask(I2PTunnelTask tsk) {
|
private void addtask(I2PTunnelTask tsk) {
|
||||||
|
@ -86,6 +86,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
|||||||
}
|
}
|
||||||
l.log("I2P session created");
|
l.log("I2P session created");
|
||||||
|
|
||||||
|
getTunnel().addSession(sockMgr.getSession());
|
||||||
|
|
||||||
Thread t = new I2PThread(this);
|
Thread t = new I2PThread(this);
|
||||||
t.setName("Client " + _clientId);
|
t.setName("Client " + _clientId);
|
||||||
listenerReady = false;
|
listenerReady = false;
|
||||||
@ -275,6 +277,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
getTunnel().removeSession(sockMgr.getSession());
|
||||||
l.log("Closing client " + toString());
|
l.log("Closing client " + toString());
|
||||||
try {
|
try {
|
||||||
if (ss != null) ss.close();
|
if (ss != null) ss.close();
|
||||||
|
@ -80,6 +80,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
|||||||
|
|
||||||
}
|
}
|
||||||
sockMgr.setName("Server");
|
sockMgr.setName("Server");
|
||||||
|
getTunnel().addSession(sockMgr.getSession());
|
||||||
l.log("Ready!");
|
l.log("Ready!");
|
||||||
notifyEvent("openServerResult", "ok");
|
notifyEvent("openServerResult", "ok");
|
||||||
open = true;
|
open = true;
|
||||||
@ -130,6 +131,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
|||||||
l.log("Shutting down server " + toString());
|
l.log("Shutting down server " + toString());
|
||||||
try {
|
try {
|
||||||
if (i2pss != null) i2pss.close();
|
if (i2pss != null) i2pss.close();
|
||||||
|
getTunnel().removeSession(sockMgr.getSession());
|
||||||
sockMgr.getSession().destroySession();
|
sockMgr.getSession().destroySession();
|
||||||
} catch (I2PException ex) {
|
} catch (I2PException ex) {
|
||||||
_log.error("Error destroying the session", ex);
|
_log.error("Error destroying the session", ex);
|
||||||
|
@ -64,6 +64,7 @@ public abstract class I2PTunnelTask implements EventDispatcher {
|
|||||||
|
|
||||||
public void disconnected(I2PSession session) {
|
public void disconnected(I2PSession session) {
|
||||||
routerDisconnected();
|
routerDisconnected();
|
||||||
|
getTunnel().removeSession(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void errorOccurred(I2PSession session, String message, Throwable error) {
|
public void errorOccurred(I2PSession session, String message, Throwable error) {
|
||||||
|
@ -13,6 +13,7 @@ import net.i2p.I2PAppContext;
|
|||||||
import net.i2p.I2PException;
|
import net.i2p.I2PException;
|
||||||
import net.i2p.client.I2PClient;
|
import net.i2p.client.I2PClient;
|
||||||
import net.i2p.client.I2PClientFactory;
|
import net.i2p.client.I2PClientFactory;
|
||||||
|
import net.i2p.client.I2PSession;
|
||||||
import net.i2p.data.Destination;
|
import net.i2p.data.Destination;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
@ -39,7 +40,7 @@ public class TunnelController implements Logging {
|
|||||||
* @param prefix beginning of key values that are relevent to this tunnel
|
* @param prefix beginning of key values that are relevent to this tunnel
|
||||||
*/
|
*/
|
||||||
public TunnelController(Properties config, String prefix) {
|
public TunnelController(Properties config, String prefix) {
|
||||||
this(config, prefix, false);
|
this(config, prefix, true);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -53,7 +54,7 @@ public class TunnelController implements Logging {
|
|||||||
setConfig(config, prefix);
|
setConfig(config, prefix);
|
||||||
_messages = new ArrayList(4);
|
_messages = new ArrayList(4);
|
||||||
_running = false;
|
_running = false;
|
||||||
if (createKey)
|
if (createKey && ("server".equals(getType())) )
|
||||||
createPrivateKey();
|
createPrivateKey();
|
||||||
if (getStartOnLoad())
|
if (getStartOnLoad())
|
||||||
startTunnel();
|
startTunnel();
|
||||||
@ -61,6 +62,12 @@ public class TunnelController implements Logging {
|
|||||||
|
|
||||||
private void createPrivateKey() {
|
private void createPrivateKey() {
|
||||||
I2PClient client = I2PClientFactory.createClient();
|
I2PClient client = I2PClientFactory.createClient();
|
||||||
|
String filename = getPrivKeyFile();
|
||||||
|
if ( (filename == null) || (filename.trim().length() <= 0) ) {
|
||||||
|
log("No filename specified for the private key");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
File keyFile = new File(getPrivKeyFile());
|
File keyFile = new File(getPrivKeyFile());
|
||||||
if (keyFile.exists()) {
|
if (keyFile.exists()) {
|
||||||
log("Not overwriting existing private keys in " + keyFile.getAbsolutePath());
|
log("Not overwriting existing private keys in " + keyFile.getAbsolutePath());
|
||||||
@ -312,6 +319,24 @@ public class TunnelController implements Logging {
|
|||||||
String opts = getClientOptions();
|
String opts = getClientOptions();
|
||||||
if ( (opts != null) && (opts.length() > 0) )
|
if ( (opts != null) && (opts.length() > 0) )
|
||||||
buf.append("Network options: ").append(opts).append("<br />\n");
|
buf.append("Network options: ").append(opts).append("<br />\n");
|
||||||
|
if (_running) {
|
||||||
|
List sessions = _tunnel.getSessions();
|
||||||
|
for (int i = 0; i < sessions.size(); i++) {
|
||||||
|
I2PSession session = (I2PSession)sessions.get(i);
|
||||||
|
Destination dest = session.getMyDestination();
|
||||||
|
if (dest != null) {
|
||||||
|
buf.append("Destination hash: ").append(dest.calculateHash().toBase64()).append("<br />\n");
|
||||||
|
buf.append("Full destination: ");
|
||||||
|
buf.append("<input type=\"text\" size=\"10\" onclick=\"this.select();\" ");
|
||||||
|
buf.append("value=\"").append(dest.toBase64()).append("\" />\n");
|
||||||
|
if ("server".equals(getType())) {
|
||||||
|
buf.append(" Give that out to people so they can view your service.");
|
||||||
|
buf.append(" If you are going to share it on irc, be sure to split it on two lines");
|
||||||
|
}
|
||||||
|
buf.append("<br />\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void log(String s) {
|
public void log(String s) {
|
||||||
|
Reference in New Issue
Block a user