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 a6b25617d0caa6695e2e5055b78b9f0bff9f2c55..8973320237c684c68864c29ff0c4a90d75bfdd3e 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,31 +206,61 @@ public class AclUtils { } public static String expandIP(String netaddress, int part) { - // 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(":"); + 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 = 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] = StringUtils.leftPad(strArray[i], 4, '0'); + if (strArray[i].length() < 4) { + strArray[i] = "0000".substring(0, 4 - strArray[i].length()) + strArray[i]; } } - // output StringBuilder sb = new StringBuilder(); - for (int i = 0; i < strArray.length; i++) { - sb.append(strArray[i]); - if (i != strArray.length - 1) { - sb.append(":"); + 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(":"); + } } } return sb.toString().toUpperCase();