diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java index 77abe0e80fbe734576e1b557a889f0e0a2afae47..a03d136212efc685514044621c99e009e09bae7c 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java @@ -206,64 +206,35 @@ public class AclUtils { } public static String expandIP(String netaddress, int part) { - boolean compress = false; - int compressIndex = -1; - String[] strArray = StringUtils.split(netaddress, ":"); - ArrayList indexes = new ArrayList<>(); - for (int i = 0; i < netaddress.length(); i++) { - if (netaddress.charAt(i) == ':') { - if (indexes.size() > 0 && i - indexes.get(indexes.size() - 1) == 1) { - compressIndex = i; - compress = true; - } - indexes.add(i); + netaddress = netaddress.toUpperCase(); + // expand netaddress + int separatorCount = StringUtils.countMatches(netaddress, ":"); + int padCount = part - separatorCount; + if(padCount > 0){ + StringBuilder padStr = new StringBuilder(":"); + for(int i = 0; i < padCount; i++){ + padStr.append(":"); } + netaddress = StringUtils.replace(netaddress, "::", padStr.toString()); } + // pad netaddress + String[] strArray = StringUtils.splitPreserveAllTokens(netaddress, ":"); for (int i = 0; i < strArray.length; i++) { - if (strArray[i].length() < 4) { - strArray[i] = "0000".substring(0, 4 - strArray[i].length()) + strArray[i]; + if(strArray[i].length() < 4){ + strArray[i] = StringUtils.leftPad(strArray[i], 4, '0'); } } + // output StringBuilder sb = new StringBuilder(); - if (compress) { - int pos = indexes.indexOf(compressIndex); - int index = 0; - if (!netaddress.startsWith(":")) { - for (int i = 0; i < pos; i++) { - sb.append(strArray[index]).append(":"); - index += 1; - } - } - int zeroNum = part - strArray.length; - if (netaddress.endsWith(":")) { - for (int i = 0; i < zeroNum; i++) { - sb.append("0000"); - if (i != zeroNum - 1) { - sb.append(":"); - } - } - } else { - for (int i = 0; i < zeroNum; i++) { - sb.append("0000").append(":"); - } - for (int i = index; i < strArray.length; i++) { - sb.append(strArray[i]); - if (i != strArray.length - 1) { - sb.append(":"); - } - } - } - } else { - for (int i = 0; i < strArray.length; i++) { - sb.append(strArray[i]); - if (i != strArray.length - 1) { - sb.append(":"); - } + for (int i = 0; i < strArray.length; i++) { + sb.append(strArray[i]); + if (i != strArray.length - 1) { + sb.append(":"); } } - return sb.toString().toUpperCase(); + return sb.toString(); } public static T getYamlDataObject(String path, Class clazz) { @@ -308,7 +279,7 @@ public class AclUtils { JSONObject yamlDataObject = null; try { yamlDataObject = AclUtils.getYamlDataObject(fileName, - JSONObject.class); + JSONObject.class); } catch (Exception e) { log.error("Convert yaml file to data object error, ", e); return null; diff --git a/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java index 7df0afa6393346eccfc4f8bc48e1952d8f746ede..e2a212ada8ec4fd2a399000c110b4e68ff36f72c 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/common/AclUtilsTest.java @@ -202,6 +202,7 @@ public class AclUtilsTest { @Test public void expandIPTest() { + Assert.assertEquals(AclUtils.expandIP("::", 8), "0000:0000:0000:0000:0000:0000:0000:0000"); Assert.assertEquals(AclUtils.expandIP("::1", 8), "0000:0000:0000:0000:0000:0000:0000:0001"); Assert.assertEquals(AclUtils.expandIP("3::", 8), "0003:0000:0000:0000:0000:0000:0000:0000"); Assert.assertEquals(AclUtils.expandIP("2::2", 8), "0002:0000:0000:0000:0000:0000:0000:0002");