PeerAllowPush: consent to exchange pushes, for a while, and nothing else
PeerTrust syncs a peer's pins and serves it everything - too much to grant a stranger. An app that wants two peers sharing something (two phones at the same place) to hand each other new content allows pushes for ttl_secs (at most a day): both sides may push, the receiver pins, and the allowance lapses on its own. Asking again extends it; PeerUntrust ends it. varde-ctl peer allow-push. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
0006a188e3
commit
2063d11890
@@ -566,11 +566,23 @@ impl Daemon {
|
||||
let parsed: iroh::EndpointId = node_id
|
||||
.parse()
|
||||
.map_err(|e| OpError::InvalidArgument(format!("invalid node id: {e}")))?;
|
||||
if !self.meta.untrust_peer(&parsed.to_string())? {
|
||||
let was_trusted = self.meta.untrust_peer(&parsed.to_string())?;
|
||||
let was_allowed = self.meta.disallow_push(&parsed.to_string())?;
|
||||
if !was_trusted && !was_allowed {
|
||||
return Err(OpError::NotFound(format!("{parsed} was not trusted")));
|
||||
}
|
||||
Ok(ResponseData::Done {})
|
||||
}
|
||||
Request::PeerAllowPush { node_id, ttl_secs } => {
|
||||
let parsed: iroh::EndpointId = node_id
|
||||
.parse()
|
||||
.map_err(|e| OpError::InvalidArgument(format!("invalid node id: {e}")))?;
|
||||
let ttl = ttl_secs.min(varde_proto::MAX_PUSH_TTL_SECS);
|
||||
self.meta
|
||||
.allow_push(&parsed.to_string(), crate::meta::unix_now() + ttl)?;
|
||||
debug!(peer = %parsed, ttl, "pushes allowed");
|
||||
Ok(ResponseData::Done {})
|
||||
}
|
||||
Request::PeerList {} => Ok(ResponseData::Peers {
|
||||
peers: self.present_trusted_peers(),
|
||||
}),
|
||||
@@ -579,11 +591,12 @@ impl Daemon {
|
||||
let peer: iroh::EndpointId = node_id
|
||||
.parse()
|
||||
.map_err(|e| OpError::InvalidArgument(format!("invalid node id: {e}")))?;
|
||||
// Consent, sending side: we only push to peers we trust.
|
||||
// (The receiver independently requires that it trusts us.)
|
||||
if !self.meta.is_trusted(&peer.to_string()) {
|
||||
// Consent, sending side: we only push to peers we trust or
|
||||
// hold a push allowance for. (The receiver independently
|
||||
// requires the same of us.)
|
||||
if !self.meta.may_push(&peer.to_string()) {
|
||||
return Err(OpError::InvalidArgument(format!(
|
||||
"{peer} is not a trusted peer; trust it before pushing"
|
||||
"{peer} is neither trusted nor allowed to exchange pushes; trust it or allow pushes first"
|
||||
)));
|
||||
}
|
||||
let (_, _, complete) = self.store.presence(parsed).await?;
|
||||
|
||||
Reference in New Issue
Block a user