Skip to content

Commit 58021a2

Browse files
committed
Release v1.4.11
Add MultiAddress.isPublic()
1 parent dd08d7d commit 58021a2

4 files changed

Lines changed: 63 additions & 3 deletions

File tree

build.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<attribute name="Class-Path" value="${manifest_cp}"/>
4141
<attribute name="Implementation-Vendor" value="io.ipfs"/>
4242
<attribute name="Implementation-Title" value="multiaddr"/>
43-
<attribute name="Implementation-Version" value="1.4.10"/>
43+
<attribute name="Implementation-Version" value="1.4.11"/>
4444
</manifest>
4545
</jar>
4646
</target>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>com.github.multiformats</groupId>
66
<artifactId>java-multiaddr</artifactId>
7-
<version>v1.4.10</version>
7+
<version>v1.4.11</version>
88

99
<name>multiaddr</name>
1010
<url>https://github.com/multiformats/java-multiaddr</url>

src/main/java/io/ipfs/multiaddr/MultiAddress.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.ipfs.multihash.*;
44

55
import java.io.*;
6+
import java.net.*;
67
import java.util.*;
78
import java.util.stream.*;
89

@@ -27,6 +28,29 @@ public byte[] getBytes() {
2728
return Arrays.copyOfRange(raw, 0, raw.length);
2829
}
2930

31+
public boolean isRelayed() {
32+
String[] parts = toString().substring(1).split("/");
33+
return Arrays.asList(parts).contains("/p2p-circuit");
34+
}
35+
36+
public boolean isPublic(boolean testReachable) {
37+
String[] parts = toString().substring(1).split("/");
38+
try {
39+
for (int i = 0; i < parts.length; i++) {
40+
if (parts[i].equals(Protocol.Type.IP6ZONE.name))
41+
return true;
42+
if (parts[i].equals(Protocol.Type.IP4.name) || parts[i].equals(Protocol.Type.IP6.name)) {
43+
InetAddress ip = InetAddress.getByName(parts[i + 1]);
44+
if (ip.isLoopbackAddress() || ip.isSiteLocalAddress() || ip.isLinkLocalAddress() || ip.isAnyLocalAddress())
45+
return false;
46+
return !testReachable || ip.isReachable(1000);
47+
}
48+
}
49+
} catch (UnknownHostException e) {}
50+
catch (IOException e) {}
51+
return false;
52+
}
53+
3054
public boolean isTCPIP() {
3155
String[] parts = toString().substring(1).split("/");
3256
if (parts.length != 4)
@@ -72,7 +96,7 @@ private static byte[] decodeFromString(String addr) {
7296
Stream.of(Arrays.copyOfRange(parts, i, parts.length)).reduce("", (a, b) -> a + "/" + b) :
7397
parts[i++];
7498
if (component.length() == 0)
75-
throw new IllegalStateException("Protocol requires address, but non provided!");
99+
throw new IllegalStateException("Protocol requires address, but none provided!");
76100

77101
bout.write(p.addressToBytes(component));
78102
if (p.isTerminal())

src/test/java/io/ipfs/api/MultiAddressTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,42 @@ public void fails() {
7373
throw new IllegalStateException("Parsed invalid MultiAddresses: "+parsed);
7474
}
7575

76+
@Test
77+
public void publicIps() {
78+
List<MultiAddress> pub = Stream.of("/ip4/8.8.8.8")
79+
.map(MultiAddress::new)
80+
.collect(Collectors.toList());
81+
for (MultiAddress addr : pub) {
82+
Assert.assertTrue(addr.toString() + " is public", addr.isPublic(false));
83+
}
84+
List<MultiAddress> priv = Stream.of(
85+
// "/ip4/100.64.0.0",
86+
"/ip4/172.16.0.0",
87+
"/ip4/10.0.0.0",
88+
"/ip4/169.254.0.0",
89+
"/ip4/192.168.0.0",
90+
"/ip4/127.0.0.1",
91+
"/ip4/0.0.0.0",
92+
// "/ip4/192.0.0.0",
93+
// "/ip4/192.0.2.0",
94+
// "/ip4/192.88.99.0",
95+
// "/ip4/198.18.0.0",
96+
// "/ip4/198.51.100.0",
97+
// "/ip4/203.0.113.0",
98+
// "/ip4/224.0.0.0",
99+
// "/ip4/240.0.0.0",
100+
// "/ip4/255.255.255.255",
101+
"/ip6/::1",
102+
// "/ip6/fc00::",
103+
// "/ip6/ff00::",
104+
"/ip6/fe80::"
105+
).map(MultiAddress::new)
106+
.collect(Collectors.toList());
107+
for (MultiAddress addr : priv) {
108+
Assert.assertTrue(addr.toString() + " is private", ! addr.isPublic(false));
109+
}
110+
}
111+
76112
@Test
77113
public void succeeds() {
78114
List<String> failed = Stream.of(

0 commit comments

Comments
 (0)