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 }