From 8451610737e5577aff530d2c1567a17eaea566a5 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 20 Dec 2010 19:37:38 +0000 Subject: [PATCH] Several connect-to-self checks --- .../org/klomp/snark/ConnectionAcceptor.java | 5 ++++ .../src/org/klomp/snark/I2PSnarkUtil.java | 26 +++++++++++++------ .../java/src/org/klomp/snark/Peer.java | 4 +++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java index 52099d1d2..34fa5054e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java @@ -137,6 +137,11 @@ public class ConnectionAcceptor implements Runnable } } } else { + if (socket.getPeerDestination().equals(_util.getMyDestination())) { + _util.debug("Incoming connection from myself", Snark.ERROR); + try { socket.close(); } catch (IOException ioe) {} + continue; + } Thread t = new I2PAppThread(new Handler(socket), "I2PSnark incoming connection"); t.start(); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index e8ff0881f..c0c272ae7 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -227,6 +227,8 @@ public class I2PSnarkUtil { Destination addr = peer.getAddress(); if (addr == null) throw new IOException("Null address"); + if (addr.equals(getMyDestination())) + throw new IOException("Attempt to connect to myself"); Hash dest = addr.calculateHash(); if (_shitlist.contains(dest)) throw new IOException("Not trying to contact " + dest.toBase64() + ", as they are shitlisted"); @@ -300,17 +302,25 @@ public class I2PSnarkUtil { } String getOurIPString() { - if (_manager == null) - return "unknown"; - I2PSession sess = _manager.getSession(); - if (sess != null) { - Destination dest = sess.getMyDestination(); - if (dest != null) - return dest.toBase64(); - } + Destination dest = getMyDestination(); + if (dest != null) + return dest.toBase64(); return "unknown"; } + /** + * @return dest or null + * @since 0.8.4 + */ + Destination getMyDestination() { + if (_manager == null) + return null; + I2PSession sess = _manager.getSession(); + if (sess != null) + return sess.getMyDestination(); + return null; + } + /** Base64 only - static (no naming service) */ static Destination getDestinationFromBase64(String ip) { if (ip == null) return null; diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index a65e45887..f5d200fda 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -30,6 +30,7 @@ import java.util.Arrays; import java.util.List; import net.i2p.client.streaming.I2PSocket; +import net.i2p.data.DataHelper; import net.i2p.util.Log; public class Peer implements Comparable @@ -353,6 +354,9 @@ public class Peer implements Comparable if (_log.shouldLog(Log.DEBUG)) _log.debug("Read the remote side's hash and peerID fully from " + toString()); + if (DataHelper.eq(my_id, bs)) + throw new IOException("Connected to myself"); + if (options != 0) { // send them something in runConnection() above if (_log.shouldLog(Log.DEBUG))