diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java index ad8b7fae7..5317046b7 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java @@ -162,7 +162,7 @@ class InboundEstablishState2 extends InboundEstablishState implements SSU2Payloa // TODO ban throw new DataFormatException("SSU2 network ID mismatch"); } - List addrs = ri.getTargetAddresses("SSU", "SSU2"); + List addrs = _transport.getTargetAddresses(ri); RouterAddress ra = null; for (RouterAddress addr : addrs) { // skip NTCP w/o "s" diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java index af0ce49e9..b513a4e61 100644 --- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java +++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java @@ -123,6 +123,9 @@ class IntroductionManager { public void add(PeerState peer) { if (peer == null) return; + // Skip SSU2 until we have support for relay + if (peer.getVersion() != 1) + return; // let's not use an introducer on a privileged port, sounds like trouble if (!TransportUtil.isValidPort(peer.getRemotePort())) return; diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index c6cdf1852..73152c85c 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -142,6 +142,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority static final int SSU2_INT_VERSION = 2; /** "2" */ static final String SSU2_VERSION = Integer.toString(SSU2_INT_VERSION); + /** "2," */ + static final String SSU2_VERSION_ALT = SSU2_VERSION + ','; private final boolean _enableSSU1; private final boolean _enableSSU2; private final PacketBuilder2 _packetBuilder2; @@ -897,6 +899,43 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return _ssu2StaticPrivKey; } + /** + * Get the valid SSU version of Bob's SSU address + * for our outbound connections as Alice. + * + * @return the valid version 1 or 2, or 0 if unusable + * @since 0.9.54 + */ + private int getSSUVersion(RouterAddress addr) { + int rv; + String style = addr.getTransportStyle(); + if (style.equals(STYLE)) { + if (!_enableSSU2) + return 1; + rv = 1; + } else if (style.equals(STYLE2)) { + if (!_enableSSU2) + return 0; + rv = SSU2_INT_VERSION; + } else { + return 0; + } + // check version == "2" || version starts with "2," + // and static key and intro key + String v = addr.getOption("v"); + if (v == null || + addr.getOption("i") == null || + addr.getOption("s") == null || + (!v.equals(SSU2_VERSION) && !v.startsWith(SSU2_VERSION_ALT))) { + // his address is SSU1 or is outbound SSU2 only + //return (rv == 1 && _enableSSU1) ? 1 : 0; + return (rv == 1) ? 1 : 0; + } + // his address is SSU2 + // do not validate the s/i b64, we will just catch it later + return SSU2_INT_VERSION; + } + /** * Add the required options to the properties for a SSU2 address. * Host/port must already be set in props if they are going to be. @@ -2271,6 +2310,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority List addrs = getTargetAddresses(target); for (int i = 0; i < addrs.size(); i++) { RouterAddress addr = addrs.get(i); + //if (getSSUVersion(addr) == 0) + // continue; if (addr.getOption("ihost0") == null) { byte[] ip = addr.getIP(); int port = addr.getPort(); @@ -2312,6 +2353,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public String getStyle() { return STYLE; } + /** + * An alternate supported style, or null. + * @since 0.9.54 + */ + @Override + public String getAltStyle() { + return _enableSSU2 ? STYLE2 : null; + } + + @Override public void send(OutNetMessage msg) { if (msg == null) return; @@ -3709,6 +3760,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority List peers = new ArrayList(_peersByIdent.values()); for (Iterator iter = new RandomIterator(peers); iter.hasNext(); ) { PeerState peer = iter.next(); + // Skip SSU2 until we have support for peer test + if (peer.getVersion() != 1) + continue; if ( (dontInclude != null) && (dontInclude.equals(peer.getRemoteHostId())) ) continue; // enforce IPv4/v6 connection if we are ALICE looking for a BOB