Compare commits

...

15 Commits

Author SHA1 Message Date
ed2b34add0 Fix net.i2p.util.Addresses::getIP empty string
The standard library behavior is to return the localhost when null or an empty string is passed.
getIP seeked to override that behavior, but didn't treat the empty string case.
2021-01-25 18:32:19 +01:00
8f931f3d16 Add @since 0.9.49 to net.i2p.util.Addresses 2021-01-25 18:27:31 +01:00
453dd4076f test net.i2p.util.Addresses::getPort 2021-01-21 21:34:59 +01:00
0263ba23b0 test net.i2p.util.Addresses::toString 2021-01-21 00:08:26 +01:00
61ffbce1c1 test net.i2p.util.Addresses::isDeprecated 2021-01-20 23:19:59 +01:00
78a09c27f7 test net.i2p.util.Addresses::isDynamic 2021-01-20 23:19:59 +01:00
30f3e8c6ed test net.i2p.util.Addresses::isIP{v6,v4,}Address 2021-01-20 23:19:59 +01:00
23352c2d76 test net.i2p.util.Addresses::getIP with IP string 2021-01-20 23:15:50 +01:00
6b3bf4cb78 test net.i2p.util.Addresses::getIP with empty string 2021-01-20 23:15:50 +01:00
b37c718785 test net.i2p.util.Addresses::getIP with null input 2021-01-20 23:15:49 +01:00
3276cfca82 Correct @return of Addresses.getAddresses 2021-01-20 19:44:44 +01:00
zzz
f71e59a049 Merge branch 'test-convert' into 'master'
Test net.i2p.util.ConvertToHash

See merge request i2p-hackers/i2p.i2p!13
2021-01-20 14:38:37 +00:00
169fb59d7d test: fix I2PSocketExceptionTest::testUnknownStatus
In non-English environments, the message is translated.
2021-01-20 14:38:37 +00:00
zzz
922178b2c7 SSU: Fix deadlock with router restart
http://zzz.i2p/topics/3036
2021-01-20 09:27:55 -05:00
zzz
74a9193ba5 Console: Fix link to UPnP status 2021-01-20 09:25:58 -05:00
7 changed files with 267 additions and 13 deletions

View File

@@ -46,7 +46,7 @@
</td>
</tr>
<tr>
<th id="upnpconfig"><%=intl._t("UPnP Configuration")%>&nbsp;<a href="peers#upnp">[<%=intl._t("UPnP Status")%>]</a></th>
<th id="upnpconfig"><%=intl._t("UPnP Configuration")%>&nbsp;<a href="peers?tx=upnp">[<%=intl._t("UPnP Status")%>]</a></th>
</tr>
<tr>
<td>

View File

@@ -40,7 +40,7 @@ import net.i2p.data.DataHelper;
* @author zzz
*/
public abstract class Addresses {
private static final File IF_INET6_FILE = new File("/proc/net/if_inet6");
private static final long INET6_CACHE_EXPIRE = 10*60*1000;
private static final boolean INET6_CACHE_ENABLED = !SystemVersion.isMac() && !SystemVersion.isWindows() &&
@@ -122,10 +122,9 @@ public abstract class Addresses {
*
* Warning, very slow on Windows, appx. 200ms + 50ms/interface
*
* @return a sorted set of all addresses including wildcard
* @param includeLocal whether to include local
* @param includeIPv6 whether to include IPV6
* @return a Set of all addresses
* @return a sorted set of all addresses including wildcard
* @since 0.8.3
*/
public static SortedSet<String> getAddresses(boolean includeLocal, boolean includeIPv6) {
@@ -141,11 +140,10 @@ public abstract class Addresses {
*
* Warning, very slow on Windows, appx. 200ms + 50ms/interface
*
* @return a sorted set of all addresses
* @param includeSiteLocal whether to include private like 192.168.x.x
* @param includeLoopbackAndWildcard whether to include 127.x.x.x and 0.0.0.0
* @param includeIPv6 whether to include IPV6
* @return a Set of all addresses
* @return a sorted set of all addresses
* @since 0.9.4
*/
public static SortedSet<String> getAddresses(boolean includeSiteLocal,
@@ -163,12 +161,11 @@ public abstract class Addresses {
*
* Warning, very slow on Windows, appx. 200ms + 50ms/interface
*
* @return a sorted set of all addresses
* @param includeSiteLocal whether to include private like 192.168.x.x
* @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
* @return a Set of all addresses
* @return a sorted set of all addresses
* @since 0.9.46
*/
public static SortedSet<String> getAddresses(boolean includeSiteLocal,
@@ -343,7 +340,7 @@ public abstract class Addresses {
return "(bad IP length " + addr.length + "):" + port;
}
}
/**
* Convenience method to convert and validate a port String
* without throwing an exception.
@@ -402,7 +399,7 @@ public abstract class Addresses {
* @since 0.9.3
*/
public static byte[] getIP(String host) {
if (host == null)
if (host == null || host.isEmpty())
return null;
byte[] rv;
synchronized (_IPAddress) {

View File

@@ -0,0 +1,145 @@
package net.i2p.util;
import org.junit.Test;
import java.net.Inet6Address;
import java.net.UnknownHostException;
import static org.junit.Assert.*;
/**
* @since 0.9.49
*/
public class AddressesTest {
@Test
public void getIPNull() {
assertNull(Addresses.getIP(null));
}
@Test
public void getIPEmptyString() {
assertNull(Addresses.getIP(""));
}
@Test
public void getIPWithIPString() {
byte[] address = {
1, 2, 3, 4
};
assertArrayEquals(address, Addresses.getIP("1.2.3.4"));
}
@Test
public void getPort() {
assertEquals(80, Addresses.getPort("80"));
}
@Test
public void getPort__invalidPort() {
String[] strings = {
"",
" 80",
"-100",
"a",
"99999",
null
};
for (String string : strings) {
assertEquals(0, Addresses.getPort(string));
}
}
@Test
public void isIPAddress() {
assertTrue(Addresses.isIPAddress("127.0.0.1"));
assertTrue(Addresses.isIPAddress("::1"));
}
@Test
public void isIPv6Address() {
assertTrue(Addresses.isIPv6Address("::1"));
assertFalse(Addresses.isIPv6Address(""));
}
@Test
public void isIPv4Address() {
assertTrue(Addresses.isIPv4Address("127.0.0.1"));
assertFalse(Addresses.isIPv4Address(""));
}
/**
* Should always return false when the address isn't in the cache
*/
@Test
public void isDynamic() throws UnknownHostException {
String host = "localhost";
byte[] address = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
assertFalse(Addresses.isDynamic((Inet6Address) Inet6Address.getByAddress(host, address)));
}
/**
* Should always return false when the address isn't in the cache
*/
@Test
public void isDeprecated() throws UnknownHostException {
String host = "localhost";
byte[] address = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
assertFalse(Addresses.isDeprecated((Inet6Address) Inet6Address.getByAddress(host, address)));
}
@Test
public void testToString() {
byte[] address = {127, 0, 0, 1};
assertEquals("127.0.0.1", Addresses.toString(address));
}
@Test
public void testToString__ipv4withPort() {
byte[] address = {127, 0, 0, 1};
assertEquals("127.0.0.1:80", Addresses.toString(address, 80));
}
@Test
public void testToString__ipv6withPort() {
byte[] address = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 1,
};
assertEquals("[0:0:0:0:0:0:0:1]:80", Addresses.toString(address, 80));
}
@Test
public void testToString__null() {
assertEquals("null", Addresses.toString(null));
}
@Test
public void testToString__nullWithPort() {
assertEquals("null:80", Addresses.toString(null, 80));
}
@Test
public void testToString__badLength() {
byte[] address = {1};
assertTrue(Addresses.toString(address).startsWith("bad IP length"));
}
@Test
public void testToString__badLengthWithPort() {
byte[] address = {1};
String string = Addresses.toString(address, 80);
String expectedStartString = "(bad IP length";
assertTrue(
String.format("%s doesn't start with: %s", string, expectedStartString),
string.startsWith(expectedStartString)
);
String expectedEndString = "80";
assertTrue(
String.format("%s doesn't end with: %s", string, expectedEndString),
string.endsWith(expectedEndString)
);
}
}

View File

@@ -0,0 +1,69 @@
package net.i2p.util;
import net.i2p.data.Hash;
import org.junit.Test;
import static org.junit.Assert.*;
public class ConvertToHashTest {
private static final String zzzDotI2pBase32Hash = "lhbd7ojcaiofbfku7ixh47qj537g572zmhdc4oilvugzxdpdghua";
private static final String zzzDotI2pBase64Hash = "WcI~uSICHFCVVPoufn4J7v5u~1lhxi45C60Nm43jMeg=";
private static final String zzzDotI2pBase64Dest = "GKapJ8koUcBj~jmQzHsTYxDg2tpfWj0xjQTzd8BhfC9c3OS5fwPBNajgF-eOD6eCjFTqTlorlh7Hnd8kXj1qblUGXT-tDoR9~YV8dmXl51cJn9MVTRrEqRWSJVXbUUz9t5Po6Xa247Vr0sJn27R4KoKP8QVj1GuH6dB3b6wTPbOamC3dkO18vkQkfZWUdRMDXk0d8AdjB0E0864nOT~J9Fpnd2pQE5uoFT6P0DqtQR2jsFvf9ME61aqLvKPPWpkgdn4z6Zkm-NJOcDz2Nv8Si7hli94E9SghMYRsdjU-knObKvxiagn84FIwcOpepxuG~kFXdD5NfsH0v6Uri3usE3XWD7Pw6P8qVYF39jUIq4OiNMwPnNYzy2N4mDMQdsdHO3LUVh~DEppOy9AAmEoHDjjJxt2BFBbGxfdpZCpENkwvmZeYUyNCCzASqTOOlNzdpne8cuesn3NDXIpNnqEE6Oe5Qm5YOJykrX~Vx~cFFT3QzDGkIjjxlFBsjUJyYkFjBQAEAAcAAA==";
@Test
public void getHashNullPeer() {
assertNull(ConvertToHash.getHash(null));
}
@Test
public void getHashB64() {
Hash hash = ConvertToHash.getHash(zzzDotI2pBase64Hash);
assertNotNull(hash);
assertEquals(hash.toBase64(), zzzDotI2pBase64Hash);
}
@Test
public void getHashB64DotI2P() {
Hash hash = ConvertToHash.getHash(zzzDotI2pBase64Hash + ".i2p");
assertNotNull(hash);
assertEquals(hash.toBase64(), zzzDotI2pBase64Hash);
}
@Test
public void getHashDestinationB64() {
Hash hash = ConvertToHash.getHash(zzzDotI2pBase64Dest);
assertNotNull(hash);
assertEquals(hash.toBase64(), zzzDotI2pBase64Hash);
}
@Test
public void getHashDestinationB64DotI2P() {
Hash hash = ConvertToHash.getHash(zzzDotI2pBase64Dest + ".i2p");
assertNotNull(hash);
assertEquals(hash.toBase64(), zzzDotI2pBase64Hash);
}
@Test
public void getHashB32() {
Hash hash = ConvertToHash.getHash(zzzDotI2pBase32Hash);
assertNotNull(hash);
assertEquals(hash.toBase32(), zzzDotI2pBase32Hash + ".b32.i2p");
}
@Test
public void getHashB32DotI2P() {
String zzzB32I2P = zzzDotI2pBase32Hash + ".b32.i2p";
Hash hash = ConvertToHash.getHash(zzzB32I2P);
assertNotNull(hash);
assertEquals(hash.toBase32(), zzzB32I2P);
}
/**
* The case where a destination cannot be resolved at all
*/
@Test
public void getHashResolveDestinationFail() {
assertNull(ConvertToHash.getHash("unknown.i2p"));
}
}

View File

@@ -1,3 +1,22 @@
2021-01-20 zzz
* Console: Fix link to UPnP status
* SSU: Fix deadlock with router restart
2021-01-14 zzz
* Router:
- Change default encryption type to ECIES-X25519 (proposal 156)
- Move Sybil subsystem from console to router
- Limit max addresses in RI
2021-01-13 zzz
* Jetty: Fix URI in request logs
2021-01-12 zzz
* i2psnark: Don't decrement downloaded counter after receiving bad piece
2021-01-11 zzz
* Console: Delete rrd files for no-longer-configured stats at startup
2021-01-08 zzz
* i2ptunnel: Disable shared clients (DSA) (part 2)
* SSU: Fix bandwidth estimator deadlock (ticket #2798)

View File

@@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */
public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 13;
public final static long BUILD = 14;
/** for example "-test" */
public final static String EXTRA = "";

View File

@@ -2455,7 +2455,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
// warning, this calls back into us with allowRebuildRouterInfo = false,
// via CSFI.createAddresses->TM.getAddresses()->updateAddress()->REA
if (allowRebuildRouterInfo)
_context.router().rebuildRouterInfo();
rebuildRouterInfo();
} else {
addr = null;
}
@@ -2510,11 +2510,35 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
// warning, this calls back into us with allowRebuildRouterInfo = false,
// via CSFI.createAddresses->TM.getAddresses()->updateAddress()->REA
if (allowRebuildRouterInfo)
_context.router().rebuildRouterInfo();
rebuildRouterInfo();
}
}
}
/**
* Avoid deadlocks part 999
* @since 0.9.49
*/
private void rebuildRouterInfo() {
(new RebuildEvent()).schedule(0);
}
/**
* @since 0.9.49
*/
private class RebuildEvent extends SimpleTimer2.TimedEvent {
/**
* Caller must schedule
*/
public RebuildEvent() {
super(_context.simpleTimer2());
}
public void timeReached() {
_context.router().rebuildRouterInfo(true);
}
}
/**
* Simple fetch of stored IP and port, since
* we don't put them in the real, published RouterAddress anymore