forked from hyperledger-archives/burrow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
peers_filter.go
55 lines (46 loc) · 1.41 KB
/
peers_filter.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
package abci
import (
"fmt"
"strings"
"github.com/hyperledger/burrow/consensus/tendermint/codes"
abciTypes "github.com/tendermint/tendermint/abci/types"
)
const (
peersFilterQueryPath = "/p2p/filter/"
)
func isPeersFilterQuery(query *abciTypes.RequestQuery) bool {
return strings.HasPrefix(query.Path, peersFilterQueryPath)
}
func (app *App) peersFilter(reqQuery *abciTypes.RequestQuery, respQuery *abciTypes.ResponseQuery) {
app.logger.TraceMsg("abci.App/Query peers filter query", "query_path", reqQuery.Path)
path := strings.Split(reqQuery.Path, "/")
if len(path) != 5 {
panic(fmt.Errorf("invalid peers filter query path %v", reqQuery.Path))
}
filterType := path[3]
peer := path[4]
authorizedPeersID, authorizedPeersAddress := app.authorizedPeersProvider()
var authorizedPeers []string
switch filterType {
case "id":
authorizedPeers = authorizedPeersID
case "addr":
authorizedPeers = authorizedPeersAddress
default:
panic(fmt.Errorf("invalid peers filter query type %v", reqQuery.Path))
}
peerAuthorized := len(authorizedPeers) == 0
for _, authorizedPeer := range authorizedPeers {
if authorizedPeer == peer {
peerAuthorized = true
break
}
}
if peerAuthorized {
app.logger.TraceMsg("Peer sync authorized", "peer", peer)
respQuery.Code = codes.PeerFilterAuthorizedCode
} else {
app.logger.InfoMsg("Peer sync forbidden", "peer", peer)
respQuery.Code = codes.PeerFilterForbiddenCode
}
}