Skip to content

Commit b26aefb

Browse files
committed
Footgun protection
1 parent 6449930 commit b26aefb

File tree

5 files changed

+106
-7
lines changed

5 files changed

+106
-7
lines changed

Cargo.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ self_cell = "1.1.0"
4242
genawaiter = { version = "0.99.1", features = ["futures03"] }
4343
iroh-base = "0.91.1"
4444
reflink-copy = "0.1.24"
45-
irpc = { version = "0.7.0", features = ["rpc", "quinn_endpoint_setup", "spans", "stream", "derive"], default-features = false, path = "../irpc" }
45+
irpc = { version = "0.7.0", features = ["rpc", "quinn_endpoint_setup", "spans", "stream", "derive"], default-features = false }
4646
iroh-metrics = { version = "0.35" }
4747

4848
[dev-dependencies]

examples/random_store.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ pub fn dump_provider_events(allow_push: bool) -> (tokio::task::JoinHandle<()>, E
176176
}
177177
}
178178
});
179-
(dump_task, EventSender::new(tx, EventMask::ALL))
179+
(dump_task, EventSender::new(tx, EventMask::ALL_READONLY))
180180
}
181181

182182
#[tokio::main]

src/provider/events.rs

Lines changed: 90 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::fmt::Debug;
1+
use std::{fmt::Debug, ops::Deref};
22

33
use irpc::{
44
channel::{mpsc, none::NoSender, oneshot},
@@ -143,12 +143,16 @@ impl EventMask {
143143
observe: ObserveMode::None,
144144
};
145145

146-
/// You get asked for every single thing that is going on and can intervene/throttle.
147-
pub const ALL: Self = Self {
146+
/// All event notifications for read-only requests are fully enabled.
147+
///
148+
/// If you want to enable push requests, which can write to the local store, you
149+
/// need to do it manually. Providing constants that have push enabled would
150+
/// risk misuse.
151+
pub const ALL_READONLY: Self = Self {
148152
connected: ConnectMode::Request,
149153
get: RequestMode::RequestLog,
150154
get_many: RequestMode::RequestLog,
151-
push: RequestMode::RequestLog,
155+
push: RequestMode::Disabled,
152156
throttle: ThrottleMode::Throttle,
153157
observe: ObserveMode::Request,
154158
};
@@ -158,6 +162,14 @@ impl EventMask {
158162
#[derive(Debug, Serialize, Deserialize)]
159163
pub struct Notify<T>(T);
160164

165+
impl<T> Deref for Notify<T> {
166+
type Target = T;
167+
168+
fn deref(&self) -> &Self::Target {
169+
&self.0
170+
}
171+
}
172+
161173
#[derive(Debug, Default, Clone)]
162174
pub struct EventSender {
163175
mask: EventMask,
@@ -263,6 +275,80 @@ impl EventSender {
263275
}
264276
}
265277

278+
/// Log request events at trace level.
279+
pub fn tracing(&self, mask: EventMask) -> Self {
280+
use tracing::trace;
281+
let (tx, mut rx) = tokio::sync::mpsc::channel(32);
282+
n0_future::task::spawn(async move {
283+
fn log_request_events(
284+
mut rx: irpc::channel::mpsc::Receiver<RequestUpdate>,
285+
connection_id: u64,
286+
request_id: u64,
287+
) {
288+
n0_future::task::spawn(async move {
289+
while let Ok(Some(update)) = rx.recv().await {
290+
trace!(%connection_id, %request_id, "{update:?}");
291+
}
292+
});
293+
}
294+
while let Some(msg) = rx.recv().await {
295+
match msg {
296+
ProviderMessage::ClientConnected(_) => todo!(),
297+
ProviderMessage::ClientConnectedNotify(msg) => {
298+
trace!("{:?}", msg.inner);
299+
}
300+
ProviderMessage::ConnectionClosed(msg) => {
301+
trace!("{:?}", msg.inner);
302+
}
303+
ProviderMessage::GetRequestReceived(msg) => {
304+
trace!("{:?}", msg.inner);
305+
msg.tx.send(Ok(())).await.ok();
306+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
307+
}
308+
ProviderMessage::GetRequestReceivedNotify(msg) => {
309+
trace!("{:?}", msg.inner);
310+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
311+
}
312+
ProviderMessage::GetManyRequestReceived(msg) => {
313+
trace!("{:?}", msg.inner);
314+
msg.tx.send(Ok(())).await.ok();
315+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
316+
}
317+
ProviderMessage::GetManyRequestReceivedNotify(msg) => {
318+
trace!("{:?}", msg.inner);
319+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
320+
}
321+
ProviderMessage::PushRequestReceived(msg) => {
322+
trace!("{:?}", msg.inner);
323+
msg.tx.send(Ok(())).await.ok();
324+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
325+
}
326+
ProviderMessage::PushRequestReceivedNotify(msg) => {
327+
trace!("{:?}", msg.inner);
328+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
329+
}
330+
ProviderMessage::ObserveRequestReceived(msg) => {
331+
trace!("{:?}", msg.inner);
332+
msg.tx.send(Ok(())).await.ok();
333+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
334+
}
335+
ProviderMessage::ObserveRequestReceivedNotify(msg) => {
336+
trace!("{:?}", msg.inner);
337+
log_request_events(msg.rx, msg.inner.connection_id, msg.inner.request_id);
338+
}
339+
ProviderMessage::Throttle(msg) => {
340+
trace!("{:?}", msg.inner);
341+
msg.tx.send(Ok(())).await.ok();
342+
}
343+
}
344+
}
345+
});
346+
Self {
347+
mask,
348+
inner: Some(irpc::Client::from(tx)),
349+
}
350+
}
351+
266352
/// A new client has been connected.
267353
pub async fn client_connected(&self, f: impl Fn() -> ClientConnected) -> ClientResult {
268354
if let Some(client) = &self.inner {

src/tests.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,16 @@ fn event_handler(
370370
}
371371
}
372372
}));
373-
(EventSender::new(events_tx, EventMask::ALL), count_rx, task)
373+
(
374+
EventSender::new(
375+
events_tx,
376+
EventMask {
377+
..EventMask::ALL_READONLY
378+
},
379+
),
380+
count_rx,
381+
task,
382+
)
374383
}
375384

376385
async fn two_nodes_push_blobs(

0 commit comments

Comments
 (0)