diff --git a/.gitignore b/.gitignore index 8d0d750a6a05bb1dc862a1fbc4e5f0739c281c50..4bfb5df8d4adfffa218c65c625089f17e90225b5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ .classpath .settings .idea +.local target */target duniter4j.iml diff --git a/.local/deploy-all.sh b/.local/deploy-all.sh new file mode 100755 index 0000000000000000000000000000000000000000..f0eee22231527b355a88545691d6c91b66ebcbff --- /dev/null +++ b/.local/deploy-all.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +set JAVA_HOME=/usr/lib/jvm/java-8-oracle +CESIUM_PLUS_POD_DIR="${HOME}/git/duniter/cesium-plus-pod" +DEPLOY_DIR="${CESIUM_PLUS_POD_DIR}/cesium-plus-pod-assembly/target/es-run-home/plugins/cesium-plus-pod-core" + +# Go to project root +cd .. +ROOT=`pwd` + +echo "***************************************" +echo " Compiling core-* ... " + +# Remove old JAR +rm duniter4j-core-client/target/*.jar +rm duniter4j-core-shared/target/*.jar + +# Compile the core-client +mvn install --quiet -DskipTests +if [[ $? -ne 0 ]]; then + exit 1 +fi +echo " Successfully compiled ! " + +echo "***************************************" +echo " Installing into Cesium+ pod (target assembly)... " + +# Copy jar +mkdir -p ${DEPLOY_DIR} +if [[ $? -ne 0 ]]; then + exit 1 +fi + +rm -f "${DEPLOY_DIR}/duniter4j-core-client-*.jar" +rm -f "${DEPLOY_DIR}/duniter4j-core-shared-*.jar" +if [[ $? -ne 0 ]]; then + exit 1 +fi + +cd ${ROOT}/duniter4j-core-client/target/ +JAR_FILE=`ls *.jar` +cp -v ${JAR_FILE} ${DEPLOY_DIR}/ +if [[ $? -ne 0 ]]; then + exit 1 +fi + +cd ${ROOT}/duniter4j-core-shared/target/ +JAR_FILE=`ls *.jar` +cp -v ${JAR_FILE} ${DEPLOY_DIR}/ +if [[ $? -ne 0 ]]; then + exit 1 +fi + +echo " Successfully deployed !" +echo "************************" diff --git a/.local/deploy_to_pod.sh b/.local/deploy-core-client.sh similarity index 95% rename from .local/deploy_to_pod.sh rename to .local/deploy-core-client.sh index 09a43e12b0b36698641676f8060200130c21e07a..a6ee2bac53933d54cb16b0c66f9d0ff7bd8e771e 100755 --- a/.local/deploy_to_pod.sh +++ b/.local/deploy-core-client.sh @@ -8,7 +8,7 @@ DEPLOY_DIR="${CESIUM_PLUS_POD_DIR}/cesium-plus-pod-assembly/target/es-run-home/p cd .. echo "***************************************" -echo " Compiling duniter4j.core-client... " +echo " Compiling core-client... " # Remove old JAR rm duniter4j-core-client/target/*.jar diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/EndpointApi.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/EndpointApi.java index 0f1733bf4b59fbe2c2522083751b20afffa0df23..f84b200da0c26b814fd1a3d455b962e2b1357ca3 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/EndpointApi.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/EndpointApi.java @@ -29,6 +29,7 @@ public enum EndpointApi { BMAS, BMATOR, WS2P, + WS2PTOR, ES_CORE_API, ES_USER_API, ES_SUBSCRIPTION_API, diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java index f96d15baaf50f46796454ea07c865dd030f2c4c9..206a788220359bae381e302e5da40a0bdb07f3b6 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java @@ -24,6 +24,8 @@ package org.duniter.core.client.model.bma; import org.duniter.core.util.StringUtils; import org.duniter.core.util.http.InetAddressUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.regex.Matcher; @@ -34,10 +36,13 @@ import java.util.regex.Pattern; */ public class Endpoints { - public static final String EP_END_REGEXP = "(?: ([a-z_][a-z0-9-_.ÄŸÄž]*))?(?: ([0-9.]+))?(?: ([0-9a-f:]+))?(?: ([0-9]+))(?: (/[^/]+))?$"; + + private static final Logger log = LoggerFactory.getLogger(Endpoints.class); + + public static final String EP_END_REGEXP = "(?: ([a-z0-9_ÄŸÄž][a-z0-9-_.ÄŸÄž]*))?(?: ([0-9.]+))?(?: ([0-9a-f:]+)(?:%[a-z0-9]+)?)?(?: ([0-9]+))(?: (/[^/]*))?$"; public static final String BMA_API_REGEXP = "^BASIC_MERKLED_API" + EP_END_REGEXP; public static final String BMAS_API_REGEXP = "^BMAS" + EP_END_REGEXP; - public static final String WS2P_API_REGEXP = "^WS2P ([a-f0-9]{8})" + EP_END_REGEXP; + public static final String WS2P_API_REGEXP = "^(WS2P(?:TOR)?) ([a-f0-9]{7,8})" + EP_END_REGEXP; public static final String OTHER_API_REGEXP = "^([A-Z_-]+)" + EP_END_REGEXP; private static Pattern bmaPattern = Pattern.compile(BMA_API_REGEXP); @@ -49,12 +54,13 @@ public class Endpoints { // helper class } - public static NetworkPeering.Endpoint parse(String ept) throws IOException { + public static NetworkPeering.Endpoint parse(String raw) throws IOException { NetworkPeering.Endpoint endpoint = new NetworkPeering.Endpoint(); + endpoint.setRaw(raw); // BMA API - Matcher mather = bmaPattern.matcher(ept); + Matcher mather = bmaPattern.matcher(raw); if (mather.matches()) { endpoint.api = EndpointApi.BASIC_MERKLED_API; parseDefaultFormatEndPoint(mather, endpoint, 1); @@ -62,7 +68,7 @@ public class Endpoints { } // BMAS API - mather = bmasPattern.matcher(ept); + mather = bmasPattern.matcher(raw); if (mather.matches()) { endpoint.api = EndpointApi.BMAS; parseDefaultFormatEndPoint(mather, endpoint, 1); @@ -70,16 +76,22 @@ public class Endpoints { } // WS2P API - mather = ws2pPattern.matcher(ept); + mather = ws2pPattern.matcher(raw); if (mather.matches()) { - endpoint.api = EndpointApi.WS2P; - endpoint.id = mather.group(1); - parseDefaultFormatEndPoint(mather, endpoint, 2); - return endpoint; + String api = mather.group(1); + try { + endpoint.api = EndpointApi.valueOf(api); + endpoint.id = mather.group(2); + parseDefaultFormatEndPoint(mather, endpoint, 3); + return endpoint; + } catch(Exception e) { + // Unknown API + throw new IOException("Unable to deserialize endpoint: WS2P api [" + api + "]", e); // link the exception + } } // Other API - mather = otherApiPattern.matcher(ept); + mather = otherApiPattern.matcher(raw); if (mather.matches()) { String api = mather.group(1); try { @@ -92,7 +104,8 @@ public class Endpoints { } } - return null; + log.warn("Unable to parse Endpoint: " + raw); + return endpoint; } public static void parseDefaultFormatEndPoint(Matcher matcher, NetworkPeering.Endpoint endpoint, int startGroup) { diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java index 38838e3c7090f78cbe7ba29c9093f740cb2901c7..3568093d430d247b1a910760bdf965c74ed1dd6a 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeering.java @@ -29,6 +29,7 @@ import org.duniter.core.util.StringUtils; import java.io.Serializable; import java.util.Objects; import java.util.StringJoiner; +import java.util.stream.Stream; /** * Created by eis on 05/02/15. @@ -110,6 +111,8 @@ public class NetworkPeering implements Serializable { } public String toString() { + if (StringUtils.isNotBlank(raw)) return raw; + StringBuilder sb = new StringBuilder(); // Version sb.append("Version: ").append(Protocol.VERSION).append("\n"); @@ -124,9 +127,9 @@ public class NetworkPeering implements Serializable { // Endpoints sb.append("Endpoints:\n"); if (CollectionUtils.isNotEmpty(endpoints)) { - for (Endpoint ep: endpoints) { - sb.append(ep.toString()).append("\n"); - } + Stream.of(endpoints) + .filter(Objects::nonNull) // can be null + .forEach(ep -> sb.append(ep.toString()).append("\n")); } if (StringUtils.isNotBlank(signature)) { sb.append(signature).append("\n"); @@ -142,6 +145,7 @@ public class NetworkPeering implements Serializable { public Integer port; public String id; public String path; + public String raw; public EndpointApi getApi() { return api; @@ -199,15 +203,25 @@ public class NetworkPeering implements Serializable { this.path = path; } + @JsonIgnore + public String getRaw() { + return raw; + } + + @JsonIgnore + public void setRaw(String raw) { + this.raw = raw; + } + @Override public String toString() { + if (raw != null) return raw; StringJoiner joiner = new StringJoiner(" "); // API if (api != null) { joiner.add(api.name()); } - // Id (use for WS2P) if (StringUtils.isNotBlank(id)) { joiner.add(id); diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java index 417ae26bec30517c9d155203715c0c1a699a3877..5545c74e72ec98bb44147925612f234914318db3 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java @@ -90,6 +90,8 @@ public class NetworkPeerings { result.setStatus("UP"); + result.setRaw(document); + return result; } catch(Exception e) { diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java index 480b8d49e7103e96f94d48f0c164d6d07c4f3c9c..2cdff5c54a343a154b84d52d1d653573653bde1c 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeers.java @@ -63,5 +63,11 @@ public class NetworkPeers implements Serializable { public void setLastTry(Long lastTry) { this.lastTry = lastTry; } + + @Override + @JsonIgnore + public String getRaw() { + return super.getRaw(); + } } } diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java index c739b25ffa7c57720d2643625b11c42f1ccef0e1..e892615944d70555e54bf85fed7d372da61cf041 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java @@ -58,7 +58,7 @@ public class EndpointDeserializer extends JsonDeserializer<NetworkPeering.Endpoi log.warn(e.getMessage(), e); // link the exception } else { - log.debug(e.getMessage()); + log.warn(e.getMessage()); } return null; } diff --git a/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java index 5bebfa2e3895283849f55812e31565522c2fbe4e..b0a02e54b83301144ef532a6140fc83b6ebc0452 100644 --- a/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java +++ b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java @@ -36,6 +36,29 @@ public class EndpointsTest { Assert.assertNotNull(ep.port); Assert.assertEquals(443, ep.port.intValue()); + // ws2pId on 7 characters + ep = Endpoints.parse("WS2P 90e9b12 duniter.g1.1000i100.fr 443 /ws2p"); + Assert.assertNotNull(ep); + Assert.assertEquals(ep.api, EndpointApi.WS2P); + Assert.assertNotNull(ep.id); + Assert.assertNotNull(ep.path); + + // path without slash + ep = Endpoints.parse("WS2P 90e9b12 duniter.g1.1000i100.fr 443 ws2p"); + Assert.assertNotNull(ep); + Assert.assertEquals(ep.api, EndpointApi.WS2P); + Assert.assertNotNull(ep.id); + Assert.assertNotNull(ep.path); + + ep = Endpoints.parse("WS2PTOR 1be86653 3k2zovlpihbt3j3g.onion 20901"); + Assert.assertNotNull(ep); + Assert.assertNotNull(ep.id); + Assert.assertNull(ep.path); + Assert.assertEquals(EndpointApi.WS2PTOR, ep.api); + Assert.assertEquals("3k2zovlpihbt3j3g.onion", ep.dns); + Assert.assertNotNull(ep.port); + Assert.assertEquals(20901, ep.port.intValue()); + ep = Endpoints.parse("GCHANGE_API data.gchange.fr 443"); Assert.assertNotNull(ep); Assert.assertEquals(ep.api, EndpointApi.GCHANGE_API); diff --git a/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/NetworkPeeringTest.java b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/NetworkPeeringTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6bac181a26d237d50a149cf8af138128d6948c02 --- /dev/null +++ b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/NetworkPeeringTest.java @@ -0,0 +1,44 @@ +package org.duniter.core.client.model.bma; + +import org.junit.Assert; +import org.junit.Test; + +public class NetworkPeeringTest { + + @Test + public void toStringTest() throws Exception { + + + NetworkPeering peering = new NetworkPeering(); + peering.setCurrency("g1"); + Assert.assertNotNull(peering); + + peering.setCurrency("g1"); + peering.setVersion(new Integer(10)); + peering.setPubkey("38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE"); + peering.setBlock("162694-0000067CAF81B13E4BD7AE72A06F9981D80EB957E4D46C23A67B4DF734E258ED"); + peering.setSignature("U+obPZqDQ3WDDclyCrOhT80Dq/8sPZp0ng+hj4THPAaxKNQwc9cijNnfvwzSsQ/hZBJpZ6+Gzrzso+zprhNICQ=="); + peering.setStatus("UP"); + + NetworkPeering.Endpoint epBma = new NetworkPeering.Endpoint(); + epBma.setApi(EndpointApi.BASIC_MERKLED_API); + epBma.setDns("g1.duniter.fr"); + epBma.setPort(80); + + NetworkPeering.Endpoint epWs2p = new NetworkPeering.Endpoint(); + epWs2p.setApi(EndpointApi.WS2P); + epWs2p.setDns("g1.duniter.fr"); + epWs2p.setPath("/ws2p"); + epWs2p.setId("fb17fcd4"); + epWs2p.setPort(443); + + peering.setEndpoints(new NetworkPeering.Endpoint[]{epBma, epWs2p}); + + String raw = peering.toString(); + String expedtedRaw = "Version: 10\nType: Peer\nCurrency: g1\nPublicKey: 38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE\nBlock: 162694-0000067CAF81B13E4BD7AE72A06F9981D80EB957E4D46C23A67B4DF734E258ED\nEndpoints:\nBASIC_MERKLED_API g1.duniter.fr 80\nWS2P fb17fcd4 g1.duniter.fr 443 /ws2p\nU+obPZqDQ3WDDclyCrOhT80Dq/8sPZp0ng+hj4THPAaxKNQwc9cijNnfvwzSsQ/hZBJpZ6+Gzrzso+zprhNICQ==\n"; + + Assert.assertEquals(expedtedRaw, raw); + + } + +} diff --git a/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/NetworkPeeringsTest.java b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/NetworkPeeringsTest.java index c1217be30a3534e2be363031234add08c15a4d7a..f2db982a76888372d3a5f1c9ace7e50abe125adc 100644 --- a/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/NetworkPeeringsTest.java +++ b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/NetworkPeeringsTest.java @@ -14,7 +14,7 @@ public class NetworkPeeringsTest { Assert.assertNotNull(peering); Assert.assertEquals("g1", peering.getCurrency()); - Assert.assertEquals("10", peering.getVersion()); + Assert.assertEquals(new Integer(10), peering.getVersion()); Assert.assertEquals("38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE", peering.getPubkey()); Assert.assertEquals("162694-0000067CAF81B13E4BD7AE72A06F9981D80EB957E4D46C23A67B4DF734E258ED", peering.getBlock()); Assert.assertEquals("U+obPZqDQ3WDDclyCrOhT80Dq/8sPZp0ng+hj4THPAaxKNQwc9cijNnfvwzSsQ/hZBJpZ6+Gzrzso+zprhNICQ==", peering.getSignature()); diff --git a/src/changes/changelog_v1.2.10.md b/src/changes/changelog_v1.2.10.md new file mode 100644 index 0000000000000000000000000000000000000000..9933bf1287a12cf6142c2d511bb06c86ef1ff147 --- /dev/null +++ b/src/changes/changelog_v1.2.10.md @@ -0,0 +1,7 @@ +# Version v1.2.10 + +## Network + + - Add endpoint API: WS2PTOR + - Fix parsing of WS2P endpoint + \ No newline at end of file