1 14 package org.jahia.security.ip; 15 16 17 48 public class IPRange implements Cloneable  49 { 50 51 52 private IPNumber mIPAddress = null; 53 54 55 private IPNumber mIPSubnetMask = null; 56 57 58 private int mExtendedNetworkPrefix = 0; 59 60 61 75 public IPRange (String range) 76 throws InvalidIPRangeException 77 { 78 parseRange (range); 79 } 80 81 82 98 public IPRange (IPNumber ipAddress, IPNumber subnetMask) 99 throws InvalidIPRangeException, 100 InvalidIPNumberException 101 { 102 if ((ipAddress == null) || (subnetMask == null)) { 103 throw new InvalidIPNumberException (); 104 } 105 106 mIPAddress = ipAddress; 107 mIPSubnetMask = subnetMask; 108 109 mExtendedNetworkPrefix = computeNetworkPrefixFromMask (subnetMask); 110 if (mExtendedNetworkPrefix == -1) { 111 throw new InvalidIPRangeException (); 112 } 113 } 114 115 116 131 public IPRange (IPNumber ipAddress, int extendedNetworkPrefix) 132 throws InvalidIPNumberException, 133 InvalidIPRangeException 134 { 135 if (ipAddress == null) { 136 throw new InvalidIPNumberException(); 137 } 138 139 if ((extendedNetworkPrefix < 0) || (extendedNetworkPrefix > 32)) { 140 throw new InvalidIPRangeException(); 141 } 142 143 mIPAddress = ipAddress; 144 mExtendedNetworkPrefix = extendedNetworkPrefix; 145 mIPSubnetMask = computeMaskFromNetworkPrefix (extendedNetworkPrefix); 146 } 147 148 159 private IPRange (IPNumber ipAddress, IPNumber subnetMask, 160 int extendedNetworkPrefix) 161 { 162 mIPAddress = ipAddress; 163 mIPSubnetMask = subnetMask; 164 mExtendedNetworkPrefix = extendedNetworkPrefix; 165 } 166 167 168 175 public final IPNumber getIPAddress () { 176 return mIPAddress; 177 } 178 179 180 187 public final IPNumber getIPSubnetMask () { 188 return mIPSubnetMask; 189 } 190 191 192 199 public final int getExtendedNetworkPrefix () { 200 return mExtendedNetworkPrefix; 201 } 202 203 204 213 public String toString () 214 { 215 StringBuffer result = new StringBuffer (mIPAddress.toString()); 216 result.append ("/"); 217 result.append (mExtendedNetworkPrefix); 218 219 return result.toString(); 220 } 221 222 223 234 public boolean equals (Object another) 235 { 236 if (another instanceof IPRange) { 237 IPRange range = (IPRange)another; 238 239 return (mIPAddress.equals (range.getIPAddress()) && 240 (mExtendedNetworkPrefix == range.mExtendedNetworkPrefix)); 241 } 242 return false; 243 } 244 245 246 257 protected void parseRange (String range) 258 throws InvalidIPRangeException 259 { 260 if (range == null) { 261 throw new InvalidIPRangeException (range); 262 } 263 264 int index = range.indexOf ("/"); 265 if (index == -1) { 266 throw new InvalidIPRangeException (range); 267 } 268 269 try { 270 mIPAddress = new IPNumber (range.substring (0, index)); 271 272 String subnetStr = range.substring (index+1); 273 274 try { 277 mExtendedNetworkPrefix = Integer.parseInt (subnetStr); 278 if ((mExtendedNetworkPrefix < 0) || 279 (mExtendedNetworkPrefix > 32)) { 280 throw new InvalidIPRangeException (range); 281 } 282 283 mIPSubnetMask = 284 computeMaskFromNetworkPrefix (mExtendedNetworkPrefix); 285 subnetStr = null; 286 } 287 catch (NumberFormatException ex) { 288 289 mIPSubnetMask = new IPNumber (subnetStr); 292 subnetStr = null; 293 294 mExtendedNetworkPrefix = 296 computeNetworkPrefixFromMask (mIPSubnetMask); 297 if (mExtendedNetworkPrefix == -1) { 298 throw new InvalidIPRangeException (range); 299 } 300 } 301 302 } 303 catch (InvalidIPNumberException ex) { 304 throw new InvalidIPRangeException (range); 305 } 306 catch (IndexOutOfBoundsException ex) { 307 throw new InvalidIPRangeException (range); 308 } 309 } 310 311 312 322 private int computeNetworkPrefixFromMask (IPNumber mask) 323 { 324 int result = 0; 325 int tmp = mask.getIPNumber(); 326 327 while ((tmp & 0x00000001) == 0x00000001) { 328 result++; 329 tmp = tmp >>> 1; 330 } 331 332 if (tmp != 0) { 333 return -1; 334 } 335 return result; 336 } 337 338 339 349 private IPNumber computeMaskFromNetworkPrefix (int prefix) 350 throws InvalidIPNumberException 351 { 352 int subnet = 0; 353 for (int i=0; i<prefix; i++) { 354 subnet = subnet << 1; 355 subnet += 1; 356 } 357 return new IPNumber (subnet); 358 } 359 360 361 372 public boolean isIPAddressInRange (IPNumber address) 373 { 374 int result1 = address.getIPNumber() & mIPSubnetMask.getIPNumber(); 375 int result2 = mIPAddress.getIPNumber() & mIPSubnetMask.getIPNumber(); 376 377 return result1 == result2; 378 } 379 380 381 388 public Object clone () 389 { 390 return new IPRange ((IPNumber)mIPAddress.clone(), 391 (IPNumber)mIPSubnetMask.clone(), 392 mExtendedNetworkPrefix); 393 } 394 } 395 396 | Popular Tags |