Accept Undo Follow from already unfollowed actor

This commit is contained in:
asonix 2020-03-21 16:01:54 -05:00
parent 5a49c1f10c
commit 13ce219d76
3 changed files with 29 additions and 5 deletions

View file

@ -24,6 +24,7 @@ pub enum UrlKind {
Followers, Followers,
Following, Following,
Inbox, Inbox,
Index,
MainKey, MainKey,
NodeInfo, NodeInfo,
Outbox, Outbox,
@ -117,6 +118,7 @@ impl Config {
UrlKind::Followers => format!("{}://{}/followers", scheme, self.hostname), UrlKind::Followers => format!("{}://{}/followers", scheme, self.hostname),
UrlKind::Following => format!("{}://{}/following", scheme, self.hostname), UrlKind::Following => format!("{}://{}/following", scheme, self.hostname),
UrlKind::Inbox => format!("{}://{}/inbox", scheme, self.hostname), UrlKind::Inbox => format!("{}://{}/inbox", scheme, self.hostname),
UrlKind::Index => format!("{}://{}/", scheme, self.hostname),
UrlKind::MainKey => format!("{}://{}/actor#main-key", scheme, self.hostname), UrlKind::MainKey => format!("{}://{}/actor#main-key", scheme, self.hostname),
UrlKind::NodeInfo => format!("{}://{}/nodeinfo/2.0.json", scheme, self.hostname), UrlKind::NodeInfo => format!("{}://{}/nodeinfo/2.0.json", scheme, self.hostname),
UrlKind::Outbox => format!("{}://{}/outbox", scheme, self.hostname), UrlKind::Outbox => format!("{}://{}/outbox", scheme, self.hostname),

View file

@ -50,7 +50,7 @@ pub async fn inbox(
return Err(MyError::Whitelist(actor.id.to_string())); return Err(MyError::Whitelist(actor.id.to_string()));
} }
if input.kind != ValidTypes::Follow && !is_listener { if !is_listener && !valid_without_listener(&input) {
return Err(MyError::NotSubscribed(actor.inbox().to_string())); return Err(MyError::NotSubscribed(actor.inbox().to_string()));
} }
@ -78,7 +78,17 @@ pub async fn inbox(
ValidTypes::Delete | ValidTypes::Update => { ValidTypes::Delete | ValidTypes::Update => {
handle_forward(&state, &jobs, input, actor).await handle_forward(&state, &jobs, input, actor).await
} }
ValidTypes::Undo => handle_undo(&db, &state, &config, &jobs, input, actor).await, ValidTypes::Undo => {
handle_undo(&db, &state, &config, &jobs, input, actor, is_listener).await
}
}
}
fn valid_without_listener(input: &AcceptedObjects) -> bool {
match input.kind {
ValidTypes::Follow => true,
ValidTypes::Undo if input.object.is_kind("Follow") => true,
_ => false,
} }
} }
@ -139,6 +149,7 @@ async fn handle_undo(
jobs: &JobServer, jobs: &JobServer,
input: AcceptedObjects, input: AcceptedObjects,
actor: AcceptedActors, actor: AcceptedActors,
is_listener: bool,
) -> Result<HttpResponse, MyError> { ) -> Result<HttpResponse, MyError> {
match input.object.kind() { match input.object.kind() {
Some("Follow") | Some("Announce") | Some("Create") => (), Some("Follow") | Some("Announce") | Some("Create") => (),
@ -150,7 +161,13 @@ async fn handle_undo(
} }
if !input.object.is_kind("Follow") { if !input.object.is_kind("Follow") {
return handle_forward(state, jobs, input, actor).await; if is_listener {
return handle_forward(state, jobs, input, actor).await;
} else {
return Err(MyError::Kind(
input.object.kind().unwrap_or("unknown").to_owned(),
));
}
} }
let my_id: XsdAnyUri = config.generate_url(UrlKind::Actor).parse()?; let my_id: XsdAnyUri = config.generate_url(UrlKind::Actor).parse()?;
@ -159,6 +176,10 @@ async fn handle_undo(
return Err(MyError::WrongActor(input.object.id().to_string())); return Err(MyError::WrongActor(input.object.id().to_string()));
} }
if !is_listener {
return Ok(accepted(serde_json::json!({})));
}
let inbox = actor.inbox().to_owned(); let inbox = actor.inbox().to_owned();
db.remove_listener(inbox).await?; db.remove_listener(inbox).await?;

View file

@ -37,9 +37,10 @@ impl State {
self.private_key.clone(), self.private_key.clone(),
self.actor_cache.clone(), self.actor_cache.clone(),
format!( format!(
"{} {}", "Actix Web 3.0.0-alpha.1 ({}/{}; +{})",
self.config.software_name(), self.config.software_name(),
self.config.software_version() self.config.software_version(),
self.config.generate_url(UrlKind::Index),
), ),
) )
} }