Author: frm
Date: Fri Sep 9 12:03:26 2016
New Revision: 1759996
URL: http://svn.apache.org/viewvc?rev=1759996&view=rev
Log:
OAK-4738 - IPv6 addresses don't fit in 64 bits
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java?rev=1759996&r1=1759995&r2=1759996&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
Fri Sep 9 12:03:26 2016
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segmen
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -34,16 +35,45 @@ class IpAddressFilter {
private static final Logger log =
LoggerFactory.getLogger(IpAddressFilter.class);
- private static long ipToLong(InetAddress ip) {
- byte[] octets = ip.getAddress();
+ private static boolean areAddressesEqual(InetAddress a, InetAddress b) {
+ return Arrays.equals(a.getAddress(), b.getAddress());
+ }
+
+ private static int compare(byte[] left, byte[] right) {
+ assert left.length == right.length;
+
+ for (int i = 0; i < left.length; i++) {
+ int l = left[i] & 0xff;
+ int r = right[i] & 0xff;
+
+ if (l < r) {
+ return -1;
+ }
+
+ if (r < l) {
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+ private static boolean isAddressInRange(InetAddress address, InetAddress
left, InetAddress right) {
+ byte[] addressBytes = address.getAddress();
- long result = 0;
+ byte[] leftBytes = left.getAddress();
- for (byte octet : octets) {
- result = (result << 8) | (octet & 0xff);
+ if (leftBytes.length != addressBytes.length) {
+ return false;
}
- return result;
+ byte[] rightBytes = right.getAddress();
+
+ if (rightBytes.length != addressBytes.length) {
+ return false;
+ }
+
+ return compare(leftBytes, addressBytes) <= 0 && compare(addressBytes,
rightBytes) <= 0;
}
private static boolean isAllowed(InetAddress client, String left, String
right) {
@@ -65,7 +95,7 @@ class IpAddressFilter {
return false;
}
- return isAllowed(ipToLong(client), ipToLong(leftAddress),
ipToLong(rightAddress));
+ return isAddressInRange(client, leftAddress, rightAddress);
}
private static boolean isAllowed(InetAddress client, String match) {
@@ -78,11 +108,7 @@ class IpAddressFilter {
return false;
}
- return ipToLong(client) == ipToLong(matchAddress);
- }
-
- private static boolean isAllowed(long address, long left, long right) {
- return left <= address && address <= right;
+ return areAddressesEqual(matchAddress, client);
}
private final String[] allowedIpRanges;