1 /* 2 * Copyright 2012 The Netty Project 3 * 4 * The Netty Project licenses this file to you under the Apache License, 5 * version 2.0 (the "License"); you may not use this file except in compliance 6 * with the License. You may obtain a copy of the License at: 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 package org.jboss.netty.handler.ipfilter; 17 18 import org.jboss.netty.logging.InternalLogger; 19 import org.jboss.netty.logging.InternalLoggerFactory; 20 21 import java.net.InetAddress; 22 import java.net.UnknownHostException; 23 24 /** 25 * This class allows to check if an IP V4 or V6 Address is contained in a subnet.<BR> 26 * <p/> 27 * Supported IP V4 Formats for the Subnets are: 1.1.1.1/255.255.255.255 or 1.1.1.1/32 (CIDR-Notation) 28 * and (InetAddress,Mask) where Mask is a integer for CIDR-notation or a String for Standard Mask notation.<BR> 29 * <BR><BR>Example1:<BR> 30 * <tt>IpV4Subnet ips = new IpV4Subnet("192.168.1.0/24");</tt><BR> 31 * <tt>System.out.println("Result: "+ ips.contains("192.168.1.123"));</tt><BR> 32 * <tt>System.out.println("Result: "+ ips.contains(inetAddress2));</tt><BR> 33 * <BR>Example1 bis:<BR> 34 * <tt>IpV4Subnet ips = new IpV4Subnet(inetAddress, 24);</tt><BR> 35 * where inetAddress is 192.168.1.0 and inetAddress2 is 192.168.1.123<BR> 36 * <BR><BR>Example2:<BR> 37 * <tt>IpV4Subnet ips = new IpV4Subnet("192.168.1.0/255.255.255.0");</tt><BR> 38 * <tt>System.out.println("Result: "+ ips.contains("192.168.1.123"));</tt><BR> 39 * <tt>System.out.println("Result: "+ ips.contains(inetAddress2));</tt><BR> 40 * <BR>Example2 bis:<BR> 41 * <tt>IpV4Subnet ips = new IpV4Subnet(inetAddress, "255.255.255.0");</tt><BR> 42 * where inetAddress is 192.168.1.0 and inetAddress2 is 192.168.1.123<BR> 43 * <BR> 44 * Supported IP V6 Formats for the Subnets are: a:b:c:d:e:f:g:h/NN (CIDR-Notation) 45 * or any IPV6 notations (like a:b:c:d::/NN, a:b:c:d:e:f:w.x.y.z/NN) 46 * and (InetAddress,Mask) where Mask is a integer for CIDR-notation 47 * and (InetAddress,subnet).<BR> 48 * <BR><BR>Example1:<BR> 49 * <tt>IpSubnet ips = new IpSubnet("1fff:0:0a88:85a3:0:0:0:0/24");</tt><BR> 50 * <tt>IpSubnet ips = new IpSubnet("1fff:0:0a88:85a3::/24");</tt><BR> 51 * <tt>System.out.println("Result: "+ ips.contains("1fff:0:0a88:85a3:0:0:ac1f:8001"));</tt><BR> 52 * <tt>System.out.println("Result: "+ ips.contains(inetAddress2));</tt><BR> 53 * <BR>Example1 bis:<BR> 54 * <tt>IpSubnet ips = new IpSubnet(inetAddress, 24);</tt><BR> 55 * where inetAddress2 is 1fff:0:0a88:85a3:0:0:ac1f:8001<BR> 56 */ 57 public class IpSubnet implements IpSet, Comparable<IpSubnet> { 58 59 private static final InternalLogger logger = 60 InternalLoggerFactory.getInstance(IpSubnet.class); 61 62 /** Internal representation */ 63 private final CIDR cidr; 64 65 /** Create IpSubnet for ALL (used for ALLOW or DENY ALL) */ 66 public IpSubnet() { 67 // ALLOW or DENY ALL 68 cidr = null; 69 } 70 71 /** 72 * Create IpSubnet using the CIDR or normal Notation<BR> 73 * i.e.:<br> 74 * IpSubnet subnet = new IpSubnet("10.10.10.0/24"); or<br> 75 * IpSubnet subnet = new IpSubnet("10.10.10.0/255.255.255.0"); or<br> 76 * IpSubnet subnet = new IpSubnet("1fff:0:0a88:85a3:0:0:0:0/24"); 77 * 78 * @param netAddress a network address as string. 79 */ 80 public IpSubnet(String netAddress) throws UnknownHostException { 81 cidr = CIDR.newCIDR(netAddress); 82 } 83 84 /** Create IpSubnet using the CIDR Notation */ 85 public IpSubnet(InetAddress inetAddress, int cidrNetMask) throws UnknownHostException { 86 cidr = CIDR.newCIDR(inetAddress, cidrNetMask); 87 } 88 89 /** Create IpSubnet using the normal Notation */ 90 public IpSubnet(InetAddress inetAddress, String netMask) throws UnknownHostException { 91 cidr = CIDR.newCIDR(inetAddress, netMask); 92 } 93 94 /** 95 * Compares the given IP-Address against the Subnet and returns true if 96 * the ip is in the subnet-ip-range and false if not. 97 * 98 * @param ipAddr an ipaddress 99 * @return returns true if the given IP address is inside the currently 100 * set network. 101 */ 102 public boolean contains(String ipAddr) throws UnknownHostException { 103 InetAddress inetAddress1 = InetAddress.getByName(ipAddr); 104 return contains(inetAddress1); 105 } 106 107 /** 108 * Compares the given InetAddress against the Subnet and returns true if 109 * the ip is in the subnet-ip-range and false if not. 110 * 111 * @return returns true if the given IP address is inside the currently 112 * set network. 113 */ 114 public boolean contains(InetAddress inetAddress) { 115 if (cidr == null) { 116 // ANY 117 return true; 118 } 119 return cidr.contains(inetAddress); 120 } 121 122 @Override 123 public String toString() { 124 return cidr.toString(); 125 } 126 127 @Override 128 public boolean equals(Object o) { 129 if (!(o instanceof IpSubnet)) { 130 return false; 131 } 132 IpSubnet ipSubnet = (IpSubnet) o; 133 return ipSubnet.cidr.equals(cidr); 134 } 135 136 @Override 137 public int hashCode() { 138 return cidr.hashCode(); 139 } 140 141 /** Compare two IpSubnet */ 142 public int compareTo(IpSubnet o) { 143 return cidr.toString().compareTo(o.cidr.toString()); 144 } 145 }