<?php

namespace JsonRPC\Validator;

use JsonRPC\Exception\AccessDeniedException;

/**
 * Class HostValidator
 *
 * @package JsonRPC\Validator
 * @author  Frederic Guillot
 */
class HostValidator
{
    /**
     * Validate
     *
     * @static
     * @access public
     * @param  array  $hosts
     * @param  string $remoteAddress
     * @throws AccessDeniedException
     */
    public static function validate(array $hosts, $remoteAddress)
    {
        if (!empty($hosts)) {
            foreach ($hosts as $host) {
                if (self::ipMatch($remoteAddress, $host)) {
                    return;
                }
            }
            throw new AccessDeniedException('Access Forbidden');
        }
    }
    
    /**
     * Validate remoteAddress match host
     * @param $remoteAddress
     * @param $host
     * @return bool
     */
    public static function ipMatch($remoteAddress, $host)
    {
        $host = trim($host);
        if (strpos($host, '/') !== false) {
            list($network, $mask) = explode('/', $host);
            if (self::netMatch($remoteAddress, $network, $mask)) {
                return true;
            }
        }

        if ($host === $remoteAddress) {
            return true;
        }

        return false;
    }

    /**
     * validate the ipAddress in network
     *  192.168.1.1/24
     * @param $clientIp
     * @param $networkIp
     * @param $mask
     *
     * @return bool
     */
    public static function netMatch($clientIp, $networkIp, $mask)
    {
        $mask1 = 32 - $mask;
        return ((ip2long($clientIp) >> $mask1) == (ip2long($networkIp) >> $mask1));
    }
}