activemq-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From clebertsuco...@apache.org
Subject [2/2] activemq-artemis git commit: ARTEMIS-212 Unable to parse IPv6 address
Date Thu, 27 Aug 2015 19:29:29 GMT
ARTEMIS-212 Unable to parse IPv6 address


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/c08d7912
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/c08d7912
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/c08d7912

Branch: refs/heads/master
Commit: c08d7912167f8928cabf29091e2575495ea942ff
Parents: bdd04eb
Author: jbertram <jbertram@apache.org>
Authored: Thu Aug 27 10:13:15 2015 -0500
Committer: Clebert Suconic <clebertsuconic@apache.org>
Committed: Thu Aug 27 15:29:21 2015 -0400

----------------------------------------------------------------------
 .../artemis/uri/TCPServerLocatorSchema.java     | 32 ++++++++++++++++++--
 .../artemis/uri/ConnectionFactoryURITest.java   | 26 ++++++++++++++++
 2 files changed, 56 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/c08d7912/artemis-core-client/src/main/java/org/apache/activemq/artemis/uri/TCPServerLocatorSchema.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/uri/TCPServerLocatorSchema.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/uri/TCPServerLocatorSchema.java
index c4701a7..4750047 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/uri/TCPServerLocatorSchema.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/uri/TCPServerLocatorSchema.java
@@ -27,8 +27,26 @@ import org.apache.activemq.artemis.utils.uri.URISchema;
 import java.net.URI;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 public class TCPServerLocatorSchema extends AbstractServerLocatorSchema {
+   // regex from http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
+   private static final Pattern IPV6 = Pattern.compile("(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|"
+           // 1:2:3:4:5:6:7:8
+                                                       "([0-9a-fA-F]{1,4}:){1,7}:|" +   
                       // 1::                              1:2:3:4:5:6:7::
+                                                       "([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|"
+           // 1::8             1:2:3:4:5:6::8  1:2:3:4:5:6::8
+                                                       "([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|"
+    // 1::7:8           1:2:3:4:5::7:8  1:2:3:4:5::8
+                                                       "([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|"
+    // 1::6:7:8         1:2:3:4::6:7:8  1:2:3:4::8
+                                                       "([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|"
+    // 1::5:6:7:8       1:2:3::5:6:7:8  1:2:3::8
+                                                       "([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|"
+    // 1::4:5:6:7:8     1:2::4:5:6:7:8  1:2::8
+                                                       "[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|"
+         // 1::3:4:5:6:7:8   1::3:4:5:6:7:8  1::8
+                                                       ":((:[0-9a-fA-F]{1,4}){1,7}|:)|" +
                      // ::2:3:4:5:6:7:8  ::2:3:4:5:6:7:8 ::8       ::
+                                                       "[fF][eE]80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|"
+ // fe80::7:8%eth0   fe80::7:8%1     (link-local IPv6 addresses with zone index)
+                                                       "::([fF]{4}(:0{1,4}){0,1}:){0,1}"
+
+                                                       "((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}"
+
+                                                       "(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|"
+            // ::255.255.255.255   ::ffff:255.255.255.255  ::ffff:0:255.255.255.255  (IPv4-mapped
IPv6 addresses and IPv4-translated addresses)
+                                                       "([0-9a-fA-F]{1,4}:){1,4}:" +
+                                                       "((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}"
+
+                                                       "(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))");
           // 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
 
    @Override
    public String getSchemaName() {
@@ -64,7 +82,7 @@ public class TCPServerLocatorSchema extends AbstractServerLocatorSchema
{
       StringBuilder fragment = new StringBuilder();
       for (int i = 1; i < staticConnectors.length; i++) {
          TransportConfiguration connector = staticConnectors[i];
-         Map<String, Object> params = connector.getParams();
+         Map<String, Object> params = escapeIPv6Host(connector.getParams());
          URI extraUri = new URI(SchemaConstants.TCP, null, getHost(params), getPort(params),
null, createQuery(params, null), null);
          if (i > 1) {
             fragment.append(",");
@@ -72,10 +90,20 @@ public class TCPServerLocatorSchema extends AbstractServerLocatorSchema
{
          fragment.append(extraUri.toASCIIString());
 
       }
-      Map<String, Object> params = staticConnectors[0].getParams();
+      Map<String, Object> params = escapeIPv6Host(staticConnectors[0].getParams());
       return new URI(SchemaConstants.TCP, null, getHost(params), getPort(params), null, createQuery(params,
query), fragment.toString());
    }
 
+   private static Map<String, Object> escapeIPv6Host(Map<String, Object> params)
{
+      String host = (String) params.get("host");
+
+      if (host != null && IPV6.matcher(host).matches()) {
+         params.put("host", "[" + host + "]");
+      }
+
+      return params;
+   }
+
    private static int getPort(Map<String, Object> params) {
       Object port = params.get("port");
       if (port instanceof String) {

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/c08d7912/artemis-jms-client/src/test/java/org/apache/activemq/artemis/uri/ConnectionFactoryURITest.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/test/java/org/apache/activemq/artemis/uri/ConnectionFactoryURITest.java
b/artemis-jms-client/src/test/java/org/apache/activemq/artemis/uri/ConnectionFactoryURITest.java
index 8169553..827a894 100644
--- a/artemis-jms-client/src/test/java/org/apache/activemq/artemis/uri/ConnectionFactoryURITest.java
+++ b/artemis-jms-client/src/test/java/org/apache/activemq/artemis/uri/ConnectionFactoryURITest.java
@@ -18,6 +18,10 @@
 package org.apache.activemq.artemis.uri;
 
 import java.beans.PropertyDescriptor;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.util.HashMap;
@@ -50,6 +54,28 @@ public class ConnectionFactoryURITest {
    ConnectionFactoryParser parser = new ConnectionFactoryParser();
 
    @Test
+   public void testIPv6() throws Exception {
+      String ipv6 = "fe80::baf6:b1ff:fe12:daf7%eth0";
+      Map<String,Object> params = new HashMap<>();
+      params.put("host", ipv6);
+      params.put("port", 5445);
+      TransportConfiguration transport = new TransportConfiguration(NettyConnectorFactory.class.getName(),
params);
+      ActiveMQConnectionFactory factory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF,
transport);
+
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
+      ObjectOutputStream outStream = new ObjectOutputStream(baos);
+      outStream.writeObject(factory);
+      outStream.close();
+      baos.close();
+      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+      ObjectInputStream in = new ObjectInputStream(bais);
+      factory = (ActiveMQConnectionFactory) in.readObject();
+      in.close();
+      bais.close();
+      Assert.assertEquals("[" + ipv6 + "]", factory.getStaticConnectors()[0].getParams().get("host"));
+   }
+
+   @Test
    public void testQUEUE_XA_CF() throws Exception {
       ActiveMQConnectionFactory factory = parser.newObject(new URI("tcp://localhost:3030?ha=true&type=QUEUE_XA_CF"),
null);
 


Mime
View raw message