@@ -117,9 +117,9 @@ impl RPCRequestHandler for RPCListStackerDBReplicasRequestHandler {
117
117
. take ( )
118
118
. ok_or ( NetError :: SendError ( "`contract_identifier` not set" . into ( ) ) ) ?;
119
119
120
- let replicas_resp =
120
+ let ( replicas_resp, local_peer , allow_private ) =
121
121
node. with_node_state ( |network, _sortdb, _chainstate, _mempool, _rpc_args| {
122
- PeerDB :: find_stacker_db_replicas (
122
+ let replicas_resp = PeerDB :: find_stacker_db_replicas (
123
123
network. peerdb_conn ( ) ,
124
124
network. bound_neighbor_key ( ) . network_id ,
125
125
& contract_identifier,
@@ -132,22 +132,44 @@ impl RPCRequestHandler for RPCListStackerDBReplicasRequestHandler {
132
132
& preamble,
133
133
& HttpServerError :: new ( "Unable to list replicas of StackerDB" . to_string ( ) )
134
134
)
135
- } )
135
+ } ) ;
136
+ let local_peer_resp = network. get_local_peer ( ) . clone ( ) ;
137
+ ( replicas_resp, local_peer_resp, network. get_connection_opts ( ) . private_neighbors )
136
138
} ) ;
137
139
138
- let naddrs_resp = match replicas_resp {
140
+ let mut naddrs = match replicas_resp {
139
141
Ok ( neighbors) => neighbors
140
142
. into_iter ( )
141
143
. map ( |neighbor| NeighborAddress :: from_neighbor ( & neighbor) )
144
+ . filter ( |naddr| {
145
+ if naddr. addrbytes . is_anynet ( ) {
146
+ // don't expose 0.0.0.0 or ::1
147
+ return false ;
148
+ }
149
+ if !allow_private && naddr. addrbytes . is_in_private_range ( ) {
150
+ // filter unroutable network addresses
151
+ return false ;
152
+ }
153
+ true
154
+ } )
142
155
. collect :: < Vec < _ > > ( ) ,
143
156
Err ( response) => {
144
157
return response. try_into_contents ( ) . map_err ( NetError :: from) ;
145
158
}
146
159
} ;
147
160
161
+ if local_peer
162
+ . stacker_dbs
163
+ . iter ( )
164
+ . find ( |contract_id| contract_id == & & contract_identifier)
165
+ . is_some ( )
166
+ {
167
+ naddrs. insert ( 0 , local_peer. to_public_neighbor_addr ( ) ) ;
168
+ }
169
+
148
170
let mut preamble = HttpResponsePreamble :: ok_json ( & preamble) ;
149
171
preamble. set_canonical_stacks_tip_height ( Some ( node. canonical_stacks_tip_height ( ) ) ) ;
150
- let body = HttpResponseContents :: try_from_json ( & naddrs_resp ) ?;
172
+ let body = HttpResponseContents :: try_from_json ( & naddrs ) ?;
151
173
Ok ( ( preamble, body) )
152
174
}
153
175
}
0 commit comments