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 }