This repository has been archived by the owner on Mar 21, 2024. It is now read-only.
/
blacklist.go
98 lines (79 loc) · 1.77 KB
/
blacklist.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package security
import (
"encoding/json"
"errors"
"sync"
"time"
cfg "github.com/bytom/bytom/config"
dbm "github.com/bytom/bytom/database/leveldb"
)
const (
defaultBanDuration = time.Hour * 1
blacklistKey = "BlacklistPeers"
)
var (
ErrConnectBannedPeer = errors.New("connect banned peer")
)
type Blacklist struct {
peers map[string]time.Time
db dbm.DB
mtx sync.Mutex
}
func NewBlacklist(config *cfg.Config) *Blacklist {
return &Blacklist{
peers: make(map[string]time.Time),
db: dbm.NewDB("blacklist", config.DBBackend, config.DBDir()),
}
}
//AddPeer add peer to blacklist
func (bl *Blacklist) AddPeer(ip string) error {
bl.mtx.Lock()
defer bl.mtx.Unlock()
// delete expired banned peers
for peer, banEnd := range bl.peers {
if time.Now().Before(banEnd) {
delete(bl.peers, peer)
}
}
// add banned peer
bl.peers[ip] = time.Now().Add(defaultBanDuration)
dataJSON, err := json.Marshal(bl.peers)
if err != nil {
return err
}
bl.db.Set([]byte(blacklistKey), dataJSON)
return nil
}
func (bl *Blacklist) delPeer(ip string) error {
delete(bl.peers, ip)
dataJson, err := json.Marshal(bl.peers)
if err != nil {
return err
}
bl.db.Set([]byte(blacklistKey), dataJson)
return nil
}
func (bl *Blacklist) DoFilter(ip string, pubKey string) error {
bl.mtx.Lock()
defer bl.mtx.Unlock()
if banEnd, ok := bl.peers[ip]; ok {
if time.Now().Before(banEnd) {
return ErrConnectBannedPeer
}
if err := bl.delPeer(ip); err != nil {
return err
}
}
return nil
}
// LoadPeers load banned peers from db
func (bl *Blacklist) LoadPeers() error {
bl.mtx.Lock()
defer bl.mtx.Unlock()
if dataJSON := bl.db.Get([]byte(blacklistKey)); dataJSON != nil {
if err := json.Unmarshal(dataJSON, &bl.peers); err != nil {
return err
}
}
return nil
}