# Utils.java

    /*
    *  Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
    *
    *  WSO2 Inc. licenses this file to you under the Apache License,
    *  Version 2.0 (the "License"); you may not use this file except
    *  in compliance with the License.
    *  You may obtain a copy of the License at
    *
    *    http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied.  See the License for the
    * specific language governing permissions and limitations
    * under the License.
    */
    package org.apache.synapse.commons.throttle.module.utils;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import java.io.*;
    import java.net.InetAddress;
    import java.net.URL;
    import java.net.UnknownHostException;
    import java.util.Properties;

    public class Utils {

        private static Log log   = LogFactory.getLog(Utils.class);
        private static String  OAUTH_HEADER_SPLITTER = ",";
        private static String  OAUTH_CONSUMER_KEY = "oauth_consumer_key";

        /**
         * Check whether a given Ip is in a given ip range
         * @param address ip address to check
         * @param range  range ex: 192.168.2.2-192.168.2.100
         * @return true is in range , false if not
         * @throws UnknownHostException  If Host is not Valid or can't resolve it
         */
        public static boolean isIpInRange(String  address , String range) throws UnknownHostException {

            if(address == null || range == null) {
                return false;
            }

            String[] bounds = range.split("-");

            String ipLow = bounds[0].trim();

            String ipHigh  = bounds[1].trim();

            long ipLo = ipToLong(InetAddress.getByName(ipLow));
            long ipHi = ipToLong(InetAddress.getByName(ipHigh));
            long ipToTest = ipToLong(InetAddress.getByName(address));

            return ipToTest >= ipLo && ipToTest <= ipHi;
        }

        /**
         * Extract the customer key from the OAuth Authentication header
         * @param authHeader Header string
         * @return extracted customer key value
         */
        public static String extractCustomerKeyFromAuthHeader(String authHeader) {

            // Expected header :
            //OAuth oauth_consumer_key="nq21LN39VlKe6OezcOndBx",
            // oauth_signature_method="HMAC-SHA1", oauth_signature="DZKyT75hiOIdtMGCU%2BbITArs4sU%3D",
            // oauth_timestamp="1328590467", oauth_nonce="7031216264696", oauth_version="1.0"

            String  consumerKey = null;

            if (authHeader.startsWith("OAuth ") || authHeader.startsWith("oauth ")) {
                authHeader = authHeader.substring(authHeader.indexOf("o"));
            }

            String[] headers = authHeader.split(OAUTH_HEADER_SPLITTER);
            if (headers != null && headers.length > 0) {
                for (int i = 0; i < headers.length; i++) {
                    String[] elements = headers[i].split("=");
                    if (elements != null && elements.length > 1) {
                        if (OAUTH_CONSUMER_KEY.equals(elements[0].trim())) {
                            consumerKey = removeLeadingAndTrailing(elements[1].trim());
                        }
                    }
                }
            }

            return consumerKey;
        }

        /**
         * Help to extract consumer key from OAuth header
         * @param base
         * @return
         */
        private static String removeLeadingAndTrailing(String base) {
            String result = base;

            if (base.startsWith("\"") || base.endsWith("\"")) {
                result = base.replace("\"", "");
            }
            return result.trim();
        }

        private static long ipToLong(InetAddress ip) {
            byte[] octets = ip.getAddress();
            long result = 0;
            for (byte octet : octets) {
                result <<= 8;
                result |= octet & 0xff;
            }
            return result;
        }

        public static void main(String[] args) throws UnknownHostException {
            System.out.println(isIpInRange("192.168.1.1","192.168.1.1-192.168.1.10"));
            System.out.println(isIpInRange("192.168.1.4","192.168.1.1-192.168.1.10"));
            System.out.println(isIpInRange("192.164.1.10","192.168.1.1-192.168.1.10"));
            System.out.println(isIpInRange("193.168.1.1","192.168.1.1-192.168.1.10"));

            System.out.println(extractCustomerKeyFromAuthHeader("oauth_consumer_key=\"nq21LN39VlKe6OezcOndBx\", oauth_signature_method=\"HMAC-SHA1\", oauth_signature=\"DZKyT75hiOIdtMGCU%2BbITArs4sU%3D\", oauth_timestamp=\"1328590467\", oauth_nonce=\"7031216264696\", oauth_version=\"1.0\""));
        }

    }