package com.eactive.eai.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IpUtil {
	/**
	 * matchIps에 ip 목록을 컴마(,)구분자로 나열 하고 requestIp와 맞는지 비교
	 * 
	 * @param matchIps  컴마구분자 matchIp 목록 예제) 192.168.0.1,192.168.0.0/24,192.168.1.*
	 * @param requestIp 원격IP
	 * @return
	 */
	public static boolean isMatchIp(String matchIps, String requestIp) {
		String[] matchIpArr = org.springframework.util.StringUtils.tokenizeToStringArray(matchIps, ",");
		for (String match : matchIpArr) {
			if (match.indexOf('*') >= 0) {
				String matchRegexp = match.replace("\\*", "[0-9]+").trim();
				Matcher matcher = Pattern.compile(matchRegexp, Pattern.CASE_INSENSITIVE).matcher(requestIp);
				if (matcher.matches()) {
					return true;
				}
			} else if (match.indexOf('/') >= 0) { // CIDR 표기법 "192.168.0.0/24"
				org.apache.commons.net.util.SubnetUtils utils = new org.apache.commons.net.util.SubnetUtils(match);
				if (utils.getInfo().isInRange(requestIp)) {
					return true;
				}
			} else {
				if (match.equals(requestIp)) {
					return true;
				}
			}
		}
		return false;
	}

	public static void main(String[] args) throws Exception {
		String matchdIps = "192.168.0.1,192.168.0.0/24,192.168.1.*";
		String requestIp = "192.168.1.2";
		if (IpUtil.isMatchIp(matchdIps, requestIp)) {
			// System.out.println(true);
		} else {
			// System.out.println(false);

		}
	}
}