OSDN Git Service

Add p2p security module (#143)
[bytom/vapor.git] / p2p / security / security.go
1 package security
2
3 import (
4         log "github.com/sirupsen/logrus"
5
6         cfg "github.com/vapor/config"
7 )
8
9 const logModule = "p2p/security"
10
11 type Security struct {
12         filter        *PeerFilter
13         blacklist     *Blacklist
14         peersBanScore *PeersBanScore
15 }
16
17 func NewSecurity(config *cfg.Config) *Security {
18         return &Security{
19                 filter:        NewPeerFilter(),
20                 blacklist:     NewBlacklist(config),
21                 peersBanScore: NewPeersScore(),
22         }
23 }
24
25 func (s *Security) DoFilter(ip string, pubKey string) error {
26         return s.filter.doFilter(ip, pubKey)
27 }
28
29 func (s *Security) IsBanned(ip string, level byte, reason string) bool {
30         if ok := s.peersBanScore.Increase(ip, level, reason); !ok {
31                 return false
32         }
33
34         if err := s.blacklist.AddPeer(ip); err != nil {
35                 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("fail on add ban peer")
36         }
37         //clear peer score
38         s.peersBanScore.DelPeer(ip)
39         return true
40 }
41
42 func (s *Security) RegisterFilter(filter Filter) {
43         s.filter.register(filter)
44 }
45
46 func (s *Security) Start() error {
47         if err := s.blacklist.LoadPeers(); err != nil {
48                 return err
49         }
50
51         s.filter.register(s.blacklist)
52         return nil
53 }