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 8973320237c684c68864c29ff0c4a90d75bfdd3e..a6b25617d0caa6695e2e5055b78b9f0bff9f2c55 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,61 +206,31 @@ 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); + // 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(); 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 5705b745a0e7472ca7a215468ae20775a53babfb..4646c6ec5cead5db5da0d73b1f455c2355750707 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 @@ -31,10 +31,12 @@ import org.junit.Test; public class AclUtilsTest { + // strArray[i] = StringUtils.leftPad(strArray[i],4, '0'); + @Test - public void getAddreeStrArray() { + public void getAddresses() { String address = "1.1.1.{1,2,3,4}"; - String[] addressArray = AclUtils.getAddreeStrArray(address, "{1,2,3,4}"); + String[] addressArray = AclUtils.getAddresses(address, "{1,2,3,4}"); List newAddressList = new ArrayList<>(); for (String a : addressArray) { newAddressList.add(a); @@ -49,7 +51,7 @@ public class AclUtilsTest { // IPv6 test String ipv6Address = "1:ac41:9987::bb22:666:{1,2,3,4}"; - String[] ipv6AddressArray = AclUtils.getAddreeStrArray(ipv6Address, "{1,2,3,4}"); + String[] ipv6AddressArray = AclUtils.getAddresses(ipv6Address, "{1,2,3,4}"); List newIPv6AddressList = new ArrayList<>(); for (String a : ipv6AddressArray) { newIPv6AddressList.add(a); @@ -181,23 +183,28 @@ public class AclUtilsTest { public void v6ipProcessTest() { String remoteAddr = "5::7:6:1-200:*"; String[] strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0000:0000:0000:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0007:0006"); remoteAddr = "5::7:6:1-200"; strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0000:0000:0000:0000:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); remoteAddr = "5::7:6:*"; strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0000:0000:0000:0000:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0000:0000:0000:0000:0007:0006"); remoteAddr = "5:7:6:*"; strArray = StringUtils.split(remoteAddr, ":"); - Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0007:0006"); + Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr), "0005:0007:0006"); +// Assert.assertEquals(AclUtils.v6ipProcess(remoteAddr, strArray, 3), "0005:0007:0006"); } @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");