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  }