From 648a2179713212c02dd64ef6a210450d4c07b017 Mon Sep 17 00:00:00 2001 From: silverpill Date: Tue, 6 Dec 2022 23:48:24 +0000 Subject: [PATCH] Create unified handler for Update() activities --- src/activitypub/handlers/mod.rs | 3 ++- src/activitypub/handlers/update.rs | 34 ++++++++++++++++++++++++++++++ src/activitypub/receiver.rs | 13 +++--------- 3 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 src/activitypub/handlers/update.rs diff --git a/src/activitypub/handlers/mod.rs b/src/activitypub/handlers/mod.rs index 56b624f..4303d2a 100644 --- a/src/activitypub/handlers/mod.rs +++ b/src/activitypub/handlers/mod.rs @@ -15,5 +15,6 @@ pub mod reject_follow; pub mod remove; pub mod undo; pub mod undo_follow; -pub mod update_note; +pub mod update; +mod update_note; pub mod update_person; diff --git a/src/activitypub/handlers/update.rs b/src/activitypub/handlers/update.rs new file mode 100644 index 0000000..dd4da08 --- /dev/null +++ b/src/activitypub/handlers/update.rs @@ -0,0 +1,34 @@ +use tokio_postgres::GenericClient; + +use crate::activitypub::{ + activity::{Activity, Object}, + vocabulary::{NOTE, PERSON}, +}; +use crate::config::Config; +use crate::errors::ValidationError; +use super::HandlerResult; +use super::update_note::handle_update_note; +use super::update_person::handle_update_person; + +pub async fn handle_update( + config: &Config, + db_client: &mut impl GenericClient, + activity: Activity, +) -> HandlerResult { + let object_type = activity.object["type"].as_str() + .ok_or(ValidationError("unknown object type"))?; + match object_type { + NOTE => { + let object: Object = serde_json::from_value(activity.object) + .map_err(|_| ValidationError("invalid object"))?; + handle_update_note(db_client, object).await + }, + PERSON => { + handle_update_person(config, db_client, activity).await + }, + _ => { + log::warn!("unexpected object type {}", object_type); + Ok(None) + }, + } +} diff --git a/src/activitypub/receiver.rs b/src/activitypub/receiver.rs index cb68381..c344f1e 100644 --- a/src/activitypub/receiver.rs +++ b/src/activitypub/receiver.rs @@ -32,8 +32,7 @@ use super::handlers::{ remove::handle_remove, undo::handle_undo, undo_follow::handle_undo_follow, - update_note::handle_update_note, - update_person::handle_update_person, + update::handle_update, }; use super::vocabulary::*; @@ -264,15 +263,9 @@ pub async fn receive_activity( require_actor_signature(&activity.actor, &signer_id)?; handle_undo(db_client, activity).await? }, - (UPDATE, NOTE) => { + (UPDATE, _) => { require_actor_signature(&activity.actor, &signer_id)?; - let object: Object = serde_json::from_value(activity.object) - .map_err(|_| ValidationError("invalid object"))?; - handle_update_note(db_client, object).await? - }, - (UPDATE, PERSON) => { - require_actor_signature(&activity.actor, &signer_id)?; - handle_update_person(config, db_client, activity).await? + handle_update(config, db_client, activity).await? }, (MOVE, _) => { require_actor_signature(&activity.actor, &signer_id)?;