github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/p2p/net/filter/filter.go (about) 1 package filter 2 3 import ( 4 "net" 5 "strings" 6 7 ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" 8 manet "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" 9 ) 10 11 type Filters struct { 12 filters map[string]*net.IPNet 13 } 14 15 func NewFilters() *Filters { 16 return &Filters{ 17 filters: make(map[string]*net.IPNet), 18 } 19 } 20 21 func (fs *Filters) AddDialFilter(f *net.IPNet) { 22 fs.filters[f.String()] = f 23 } 24 25 func (f *Filters) AddrBlocked(a ma.Multiaddr) bool { 26 _, addr, err := manet.DialArgs(a) 27 if err != nil { 28 // if we cant parse it, its probably not blocked 29 return false 30 } 31 32 ipstr := strings.Split(addr, ":")[0] 33 ip := net.ParseIP(ipstr) 34 for _, ft := range f.filters { 35 if ft.Contains(ip) { 36 return true 37 } 38 } 39 return false 40 } 41 42 func (f *Filters) Filters() []*net.IPNet { 43 var out []*net.IPNet 44 for _, ff := range f.filters { 45 out = append(out, ff) 46 } 47 return out 48 } 49 50 func (f *Filters) Remove(ff *net.IPNet) { 51 delete(f.filters, ff.String()) 52 }