package com.pwt.netty.handler;

import com.pwt.common.utils.StringUtils;
import com.pwt.common.utils.ip.IpUtils;
import com.pwt.common.utils.spring.SpringUtils;
import com.pwt.netty.config.NettyConfig;
import io.netty.handler.ipfilter.IpFilterRule;
import io.netty.handler.ipfilter.IpFilterRuleType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.net.InetSocketAddress;

/**
 * @author linyun
 * @version V1.0
 * @Title: IpFilterRuleHandler
 * @Description: ip过滤策略处理类
 * @date 2022/11/10
 **/
@Slf4j
@Component
public class IpFilterRuleHandler implements IpFilterRule {


    /**
     *  验证ip地址是否在配置的ip段
     **/
    @Override
    public boolean matches(InetSocketAddress remoteAddress)
    {
        String ip = remoteAddress.getHostString();
        NettyConfig nettyConfig = SpringUtils.getBean(NettyConfig.class);
        String ip_range = nettyConfig.getIP_RANGE();
        // ip_range字段为*直接跳过ip验证
        // ip_range字段为ip段则执行拦截策略
        if (StringUtils.isNotBlank(ip_range) && !"*".equals(ip_range))
        {
            log.info("ip未授权,系统拒绝连接,当前申请连接的ip为:{}", ip);
            return !IpUtils.ipExistsInRange(ip, nettyConfig.getIP_RANGE());
        }
        return false;
    }

    /**
     * 连接策略:
     * 返回拒绝则表示拒绝连接，反之返回接受则表示可以连接
     **/
    @Override
    public IpFilterRuleType ruleType()
    {
        return IpFilterRuleType.REJECT;
    }
}
