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  }