View Javadoc

    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 java.net.InetAddress;
    19  import java.net.UnknownHostException;
    20
    21  import org.jboss.netty.logging.InternalLogger;
    22  import org.jboss.netty.logging.InternalLoggerFactory;
    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 this.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 }