github.com/tri-stone/burrow@v0.25.0/consensus/abci/peers_filter.go (about) 1 package abci 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/hyperledger/burrow/consensus/tendermint/codes" 8 abciTypes "github.com/tendermint/tendermint/abci/types" 9 ) 10 11 const ( 12 peersFilterQueryPath = "/p2p/filter/" 13 ) 14 15 func isPeersFilterQuery(query *abciTypes.RequestQuery) bool { 16 return strings.HasPrefix(query.Path, peersFilterQueryPath) 17 } 18 19 func (app *App) peersFilter(reqQuery *abciTypes.RequestQuery, respQuery *abciTypes.ResponseQuery) { 20 app.logger.TraceMsg("abci.App/Query peers filter query", "query_path", reqQuery.Path) 21 path := strings.Split(reqQuery.Path, "/") 22 if len(path) != 5 { 23 panic(fmt.Errorf("invalid peers filter query path %v", reqQuery.Path)) 24 } 25 26 filterType := path[3] 27 peer := path[4] 28 29 authorizedPeersID, authorizedPeersAddress := app.authorizedPeersProvider() 30 var authorizedPeers []string 31 switch filterType { 32 case "id": 33 authorizedPeers = authorizedPeersID 34 case "addr": 35 authorizedPeers = authorizedPeersAddress 36 default: 37 panic(fmt.Errorf("invalid peers filter query type %v", reqQuery.Path)) 38 } 39 40 peerAuthorized := len(authorizedPeers) == 0 41 for _, authorizedPeer := range authorizedPeers { 42 if authorizedPeer == peer { 43 peerAuthorized = true 44 break 45 } 46 } 47 48 if peerAuthorized { 49 app.logger.TraceMsg("Peer sync authorized", "peer", peer) 50 respQuery.Code = codes.PeerFilterAuthorizedCode 51 } else { 52 app.logger.InfoMsg("Peer sync forbidden", "peer", peer) 53 respQuery.Code = codes.PeerFilterForbiddenCode 54 } 55 }