github.com/Finschia/ostracon@v1.1.5/privval/internal/ip_filter.go (about)

     1  package internal
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/Finschia/ostracon/libs/log"
     6  	"net"
     7  	"strings"
     8  )
     9  
    10  type IpFilter struct {
    11  	allowList []string
    12  	log       log.Logger
    13  }
    14  
    15  func NewIpFilter(allowAddresses []string, l log.Logger) *IpFilter {
    16  	return &IpFilter{
    17  		allowList: allowAddresses,
    18  		log:       l,
    19  	}
    20  }
    21  
    22  func (f *IpFilter) Filter(addr net.Addr) net.Addr {
    23  	if f.isAllowedAddr(addr) {
    24  		return addr
    25  	}
    26  	return nil
    27  }
    28  
    29  func (f *IpFilter) String() string {
    30  	return strings.Join(f.allowList, ",")
    31  }
    32  
    33  func (f *IpFilter) isAllowedAddr(addr net.Addr) bool {
    34  	if len(f.allowList) == 0 {
    35  		return false
    36  	}
    37  	hostAddr, _, err := net.SplitHostPort(addr.String())
    38  	if err != nil {
    39  		if f.log != nil {
    40  			f.log.Error(fmt.Sprintf("IpFilter: can't split host and port from addr.String()=%s", addr.String()))
    41  		}
    42  		return false
    43  	}
    44  	for _, address := range f.allowList {
    45  		if address == hostAddr {
    46  			return true
    47  		}
    48  	}
    49  	return false
    50  }