Skip to content

Commit 7b7067b

Browse files
committed
fix: only return routable replicas, and include localpeer if needed
1 parent 5794ee8 commit 7b7067b

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

stackslib/src/net/api/liststackerdbreplicas.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,9 @@ impl RPCRequestHandler for RPCListStackerDBReplicasRequestHandler {
117117
.take()
118118
.ok_or(NetError::SendError("`contract_identifier` not set".into()))?;
119119

120-
let replicas_resp =
120+
let (replicas_resp, local_peer, allow_private) =
121121
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(
123123
network.peerdb_conn(),
124124
network.bound_neighbor_key().network_id,
125125
&contract_identifier,
@@ -132,22 +132,44 @@ impl RPCRequestHandler for RPCListStackerDBReplicasRequestHandler {
132132
&preamble,
133133
&HttpServerError::new("Unable to list replicas of StackerDB".to_string())
134134
)
135-
})
135+
});
136+
let local_peer_resp = network.get_local_peer().clone();
137+
(replicas_resp, local_peer_resp, network.get_connection_opts().private_neighbors)
136138
});
137139

138-
let naddrs_resp = match replicas_resp {
140+
let mut naddrs = match replicas_resp {
139141
Ok(neighbors) => neighbors
140142
.into_iter()
141143
.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+
})
142155
.collect::<Vec<_>>(),
143156
Err(response) => {
144157
return response.try_into_contents().map_err(NetError::from);
145158
}
146159
};
147160

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+
148170
let mut preamble = HttpResponsePreamble::ok_json(&preamble);
149171
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)?;
151173
Ok((preamble, body))
152174
}
153175
}

0 commit comments

Comments
 (0)