From: <bra...@us...> - 2007-09-18 23:38:28
|
Revision: 1992 http://archive-access.svn.sourceforge.net/archive-access/?rev=1992&view=rev Author: bradtofel Date: 2007-09-18 16:38:30 -0700 (Tue, 18 Sep 2007) Log Message: ----------- INITIAL REV: this code must exist somewhere else, but here it is again, and not very pretty or optimized, but this parses an IP or IP/netbits form network and then answers queries to determine if a given test IP is within the range. Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/IPRange.java trunk/archive-access/projects/wayback/wayback-core/src/test/java/org/archive/wayback/util/IPRangeTest.java Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/IPRange.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/IPRange.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/IPRange.java 2007-09-18 23:38:30 UTC (rev 1992) @@ -0,0 +1,181 @@ +package org.archive.wayback.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class IPRange { + + // STATIC MEMBERS: + private final static Pattern IP_PATTERN = + Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"); + private final static Pattern IP_MASK_PATTERN = + Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)/(\\d+)"); + private final static byte[] FULL_MASK = + {(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff}; + + private final static byte[] flags = { + (byte) 0x80, + (byte) 0x40, + (byte) 0x20, + (byte) 0x10, + (byte) 0x08, + (byte) 0x04, + (byte) 0x02, + (byte) 0x01, + }; + + // INSTANCE MEMBERS: + private byte[] ip = null; + private byte[] mask = null; + + // INSTANCE METHODS: + public byte[] getIp() { + return ip; + } + + public byte[] getMask() { + return mask; + } + + public boolean contains(String ipString) { + byte[] testIP = matchIP(ipString); + if(testIP == null) { + return false; + } + return contains(testIP); + } + + public boolean contains(byte[] testIP) { + byte[] masked = and(testIP,mask); + return equals(ip,masked); + } + + public String getRangeString() { + return null; + } + public void setRangeString(String range) { + setRange(range); + } + + public boolean setRange(String range) { + Matcher m = IP_MASK_PATTERN.matcher(range); + if(m != null) { + if(m.matches()) { + return setRangeMask(m.group(1),m.group(2)); + } + } + return setRangeIP(range); + } + + // PRIVATE INSTANCE METHODS: + private boolean setRangeMask(String ipString, String maskBitsString) { + byte[] tmpMask = maskBits(maskBitsString); + if(tmpMask != null) { + if(setRangeIP(ipString)) { + mask = tmpMask; + ip = and(ip,mask); + return true; + } + } + return false; + } + private boolean setRangeIP(String ipString) { + byte[] tmpIp = matchIP(ipString); + if(tmpIp != null) { + ip = tmpIp; + mask = FULL_MASK; + return true; + } + return false; + } + + // STATIC METHODS: + public static byte[] maskBits(String bitsString) { + try { + int bits = Integer.parseInt(bitsString); + return maskBits(bits); + } catch(NumberFormatException e) { + e.printStackTrace(); + } + return null; + } + public static byte[] maskBits(int bits) { + byte[] res = new byte[4]; + if(bits < 0) { + return null; + } + if(bits > 32) { + return null; + } + for(int i=0; i < 4; i++) { + + int startBit = 8 * i; + int endBit = 8 * (i+1); + if(bits < startBit) { + res[i] = (byte)0x00; + } else if(bits >= endBit) { + res[i] = (byte)0xff; + } else { + int numOn = bits - startBit; + int val = 0x00; + for(int j=0; j < numOn; j++) { + val |= flags[j]; + } + res[i] = (byte) val; + } + } + return res; + } + public static String bitString(byte b) { + StringBuilder sb = new StringBuilder(8); + for(int i=0; i<8; i++) { + sb.append(((b & flags[i])==0)?"0":"1"); + } + return sb.toString(); + } + + public static byte[] and(byte b1[], byte b2[]) { + byte[] res = new byte[4]; + for(int i=0; i<4; i++) { + res[i] = (byte) ((byte) b1[i] & (byte) b2[i]); + } + return res; + } + public static boolean equals(byte b1[], byte b2[]) { + for(int i=0; i<4; i++) { + if(b1[i] != b2[i]) { + return false; + } + } + return true; + } + public static boolean isOn(byte b, int pos) { + return (b & flags[pos]) != 0; + } + + public static byte[] matchIP(String ip) { + Matcher m = IP_PATTERN.matcher(ip); + if(m != null) { + if(m.matches()) { + try { + byte[] res = new byte[4]; + for(int i=0; i < 4; i++) { + int testInt = Integer.parseInt(m.group(i+1)); + if(testInt < 0) { + return null; + } + if(testInt > 255) { + return null; + } + res[i] = (byte) testInt; + } + return res; + } catch(NumberFormatException e) { + e.printStackTrace(); + return null; + } + } + } + return null; + } +} Added: trunk/archive-access/projects/wayback/wayback-core/src/test/java/org/archive/wayback/util/IPRangeTest.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/test/java/org/archive/wayback/util/IPRangeTest.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/test/java/org/archive/wayback/util/IPRangeTest.java 2007-09-18 23:38:30 UTC (rev 1992) @@ -0,0 +1,191 @@ +package org.archive.wayback.util; + +import junit.framework.TestCase; + +public class IPRangeTest extends TestCase { + public void testBitOn() { + byte b = (byte) 0xFF; + for(int i=0; i<8; i++) { + assertTrue(IPRange.isOn(b, i)); + } + b = (byte) 0x80; + assertTrue(IPRange.isOn(b, 0)); + for(int i=1; i<8; i++) { + assertFalse(IPRange.isOn(b, i)); + } + b = (byte) 0xc0; + assertTrue(IPRange.isOn(b, 0)); + assertTrue(IPRange.isOn(b, 1)); + for(int i=2; i<8; i++) { + assertFalse(IPRange.isOn(b, i)); + } + b |= 0x01; + assertTrue(IPRange.isOn(b, 0)); + assertTrue(IPRange.isOn(b, 1)); + assertTrue(IPRange.isOn(b, 7)); + for(int i=2; i<7; i++) { + assertFalse(IPRange.isOn(b, i)); + } + + b = (byte) 0xf0 & (byte) 0x00; + for(int i=0; i<8; i++) { + assertFalse(IPRange.isOn(b, i)); + } + + b = (byte) 0xf0 & (byte) 0x80; + assertTrue(IPRange.isOn(b, 0)); + for(int i=1; i<8; i++) { + assertFalse(IPRange.isOn(b, i)); + } + } + public void testBitString() { + assertEquals("00000000",IPRange.bitString((byte)0x00)); + assertEquals("11111111",IPRange.bitString((byte)0xff)); + assertEquals("11110000",IPRange.bitString((byte)0xf0)); + assertEquals("11100000",IPRange.bitString((byte)0xe0)); + assertEquals("11000000",IPRange.bitString((byte)0xc0)); + assertEquals("11001100",IPRange.bitString((byte)0xcc)); + assertEquals("11001101",IPRange.bitString((byte)0xcd)); + assertEquals("00010000",IPRange.bitString((byte)0x10)); + assertEquals("00010001",IPRange.bitString((byte)0x11)); + } + + public void testMask() { + byte[] b = IPRange.maskBits(0); + assertEquals("00000000",IPRange.bitString(b[0])); + assertEquals("00000000",IPRange.bitString(b[1])); + assertEquals("00000000",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + b = IPRange.maskBits(1); + assertEquals("10000000",IPRange.bitString(b[0])); + assertEquals("00000000",IPRange.bitString(b[1])); + assertEquals("00000000",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + b = IPRange.maskBits(2); + assertEquals("11000000",IPRange.bitString(b[0])); + assertEquals("00000000",IPRange.bitString(b[1])); + assertEquals("00000000",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + b = IPRange.maskBits(9); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("10000000",IPRange.bitString(b[1])); + assertEquals("00000000",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + b = IPRange.maskBits(23); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111110",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + b = IPRange.maskBits(30); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111111",IPRange.bitString(b[2])); + assertEquals("11111100",IPRange.bitString(b[3])); + + b = IPRange.maskBits(31); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111111",IPRange.bitString(b[2])); + assertEquals("11111110",IPRange.bitString(b[3])); + + b = IPRange.maskBits(32); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111111",IPRange.bitString(b[2])); + assertEquals("11111111",IPRange.bitString(b[3])); + + } + public void testParse() { + IPRange r = new IPRange(); + + assertFalse(r.setRange("127.0.0.")); + assertFalse(r.setRange("256.0.0.1")); + assertFalse(r.setRange("0.256.0.0.1")); + assertFalse(r.setRange("0.256.0.0")); + assertFalse(r.setRange("0.0.0.256")); + + assertTrue(r.setRange("127.0.0.1")); + assertTrue(r.setRange("255.0.0.0")); + assertTrue(r.setRange("0.0.0.255")); + assertTrue(r.setRange("127.127.127.127")); + assertTrue(r.setRange("127.127.127.255")); + + assertTrue(r.setRange("128.0.0.0")); + byte[] b = r.getMask(); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111111",IPRange.bitString(b[2])); + assertEquals("11111111",IPRange.bitString(b[3])); + b = r.getIp(); + assertEquals("10000000",IPRange.bitString(b[0])); + assertEquals("00000000",IPRange.bitString(b[1])); + assertEquals("00000000",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + assertTrue(r.setRange("129.0.0.0")); + b = r.getMask(); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111111",IPRange.bitString(b[2])); + assertEquals("11111111",IPRange.bitString(b[3])); + b = r.getIp(); + assertEquals("10000001",IPRange.bitString(b[0])); + assertEquals("00000000",IPRange.bitString(b[1])); + assertEquals("00000000",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + assertTrue(r.setRange("129.0.0.0/30")); + b = r.getMask(); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111111",IPRange.bitString(b[2])); + assertEquals("11111100",IPRange.bitString(b[3])); + b = r.getIp(); + assertEquals("10000001",IPRange.bitString(b[0])); + assertEquals("00000000",IPRange.bitString(b[1])); + assertEquals("00000000",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + + assertTrue(r.setRange("129.129.129.129/24")); + b = r.getMask(); + assertEquals("11111111",IPRange.bitString(b[0])); + assertEquals("11111111",IPRange.bitString(b[1])); + assertEquals("11111111",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + b = r.getIp(); + assertEquals("10000001",IPRange.bitString(b[0])); + assertEquals("10000001",IPRange.bitString(b[1])); + assertEquals("10000001",IPRange.bitString(b[2])); + assertEquals("00000000",IPRange.bitString(b[3])); + } + + public void testContains() { + IPRange r = new IPRange(); + assertTrue(r.setRange("129.129.129.0/24")); + assertTrue(r.contains("129.129.129.129")); + assertTrue(r.contains("129.129.129.255")); + assertTrue(r.contains("129.129.129.0")); + assertFalse(r.contains("129.129.128.0")); + assertFalse(r.contains("129.129.128.255")); + + assertTrue(r.setRange("129.129.129.129/24")); + assertTrue(r.contains("129.129.129.129")); + assertTrue(r.contains("129.129.129.255")); + assertTrue(r.contains("129.129.129.0")); + assertFalse(r.contains("129.129.128.0")); + assertFalse(r.contains("129.129.128.255")); + + assertTrue(r.setRange("129.129.129.129/25")); + assertTrue(r.contains("129.129.129.128")); + assertTrue(r.contains("129.129.129.129")); + assertTrue(r.contains("129.129.129.255")); + assertFalse(r.contains("129.129.129.0")); + assertFalse(r.contains("129.129.128.0")); + assertFalse(r.contains("129.129.128.255")); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |