From a5e3bef70c77f00eb9fd9159fa473af78b1b3eb8 Mon Sep 17 00:00:00 2001 From: silverpill Date: Fri, 12 Nov 2021 23:41:03 +0000 Subject: [PATCH] Refactor activitypub::actor module --- src/activitypub/actor.rs | 25 +++++++++++++------------ src/activitypub/receiver.rs | 2 +- src/activitypub/views.rs | 4 ++-- src/http_signatures/verify.rs | 2 +- src/mastodon_api/accounts/views.rs | 6 ++++-- src/mastodon_api/statuses/views.rs | 8 ++++---- 6 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/activitypub/actor.rs b/src/activitypub/actor.rs index 5c19f22..9a28b76 100644 --- a/src/activitypub/actor.rs +++ b/src/activitypub/actor.rs @@ -1,7 +1,6 @@ use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use crate::config::Config; use crate::errors::ConversionError; use crate::models::profiles::types::{DbActorProfile, ExtraField}; use crate::models::users::types::User; @@ -103,7 +102,7 @@ impl Actor { } impl DbActorProfile { - pub fn actor(&self) -> Result, ConversionError> { + pub fn remote_actor(&self) -> Result, ConversionError> { let actor = match self.actor_json { Some(ref value) => { let actor: Actor = serde_json::from_value(value.clone()) @@ -116,16 +115,18 @@ impl DbActorProfile { } } -pub fn get_actor_object( - config: &Config, +pub type ActorKeyError = rsa::pkcs8::Error; + +pub fn get_local_actor( user: &User, -) -> Result { + instance_url: &str, +) -> Result { let username = &user.profile.username; - let id = get_actor_url(&config.instance_url(), &username); - let inbox = get_inbox_url(&config.instance_url(), &username); - let outbox = get_outbox_url(&config.instance_url(), &username); - let followers = get_followers_url(&config.instance_url(), &username); - let following = get_following_url(&config.instance_url(), &username); + let id = get_actor_url(instance_url, username); + let inbox = get_inbox_url(instance_url, username); + let outbox = get_outbox_url(instance_url, username); + let followers = get_followers_url(instance_url, username); + let following = get_following_url(instance_url, username); let private_key = deserialize_private_key(&user.private_key)?; let public_key_pem = get_public_key_pem(&private_key)?; @@ -141,7 +142,7 @@ pub fn get_actor_object( Some(file_name) => { let image = Image { object_type: IMAGE.to_string(), - url: get_file_url(&config.instance_url(), file_name), + url: get_file_url(instance_url, file_name), }; Some(image) }, @@ -151,7 +152,7 @@ pub fn get_actor_object( Some(file_name) => { let image = Image { object_type: IMAGE.to_string(), - url: get_file_url(&config.instance_url(), file_name), + url: get_file_url(instance_url, file_name), }; Some(image) }, diff --git a/src/activitypub/receiver.rs b/src/activitypub/receiver.rs index ceafe38..de4ad66 100644 --- a/src/activitypub/receiver.rs +++ b/src/activitypub/receiver.rs @@ -289,7 +289,7 @@ pub async fn receive_activity( &activity.actor, &config.media_dir(), ).await?; - let source_actor = source_profile.actor().ok().flatten() + let source_actor = source_profile.remote_actor().ok().flatten() .ok_or(HttpError::InternalError)?; let target_actor_id = match activity.object.as_str() { Some(object_id) => object_id.to_owned(), diff --git a/src/activitypub/views.rs b/src/activitypub/views.rs index 11baf00..ea40a18 100644 --- a/src/activitypub/views.rs +++ b/src/activitypub/views.rs @@ -12,7 +12,7 @@ use crate::http_signatures::verify::verify_http_signature; use crate::models::posts::queries::get_thread; use crate::models::users::queries::get_user_by_name; use super::activity::{create_note, OrderedCollection}; -use super::actor::get_actor_object; +use super::actor::get_local_actor; use super::constants::ACTIVITY_CONTENT_TYPE; use super::receiver::receive_activity; @@ -48,7 +48,7 @@ async fn get_actor( ) -> Result { let db_client = &**get_database_client(&db_pool).await?; let user = get_user_by_name(db_client, &username).await?; - let actor = get_actor_object(&config, &user) + let actor = get_local_actor(&user, &config.instance_url()) .map_err(|_| HttpError::InternalError)?; let response = HttpResponse::Ok() .content_type(ACTIVITY_CONTENT_TYPE) diff --git a/src/http_signatures/verify.rs b/src/http_signatures/verify.rs index 7b58177..859ff12 100644 --- a/src/http_signatures/verify.rs +++ b/src/http_signatures/verify.rs @@ -140,7 +140,7 @@ pub async fn verify_http_signature( }, }, }; - let actor = actor_profile.actor().ok().flatten() + let actor = actor_profile.remote_actor().ok().flatten() .ok_or(VerificationError::ActorError)?; let public_key = deserialize_public_key(&actor.public_key.public_key_pem)?; diff --git a/src/mastodon_api/accounts/views.rs b/src/mastodon_api/accounts/views.rs index 2c25298..b5955f7 100644 --- a/src/mastodon_api/accounts/views.rs +++ b/src/mastodon_api/accounts/views.rs @@ -171,7 +171,8 @@ async fn follow( let db_client = &mut **get_database_client(&db_pool).await?; let current_user = get_current_user(db_client, auth.token()).await?; let profile = get_profile_by_id(db_client, &account_id).await?; - let maybe_remote_actor = profile.actor().map_err(|_| HttpError::InternalError)?; + let maybe_remote_actor = profile.remote_actor() + .map_err(|_| HttpError::InternalError)?; let relationship = if let Some(remote_actor) = maybe_remote_actor { // Remote follow let request = follows::create_follow_request(db_client, ¤t_user.id, &profile.id).await?; @@ -199,7 +200,8 @@ async fn unfollow( let db_client = &mut **get_database_client(&db_pool).await?; let current_user = get_current_user(db_client, auth.token()).await?; let target_profile = get_profile_by_id(db_client, &account_id).await?; - let maybe_remote_actor = target_profile.actor().map_err(|_| HttpError::InternalError)?; + let maybe_remote_actor = target_profile.remote_actor() + .map_err(|_| HttpError::InternalError)?; let relationship = if let Some(remote_actor) = maybe_remote_actor { // Remote follow let follow_request = follows::get_follow_request_by_path( diff --git a/src/mastodon_api/statuses/views.rs b/src/mastodon_api/statuses/views.rs index f04f42c..4e61268 100644 --- a/src/mastodon_api/statuses/views.rs +++ b/src/mastodon_api/statuses/views.rs @@ -82,21 +82,21 @@ async fn create_status( let followers = get_followers(db_client, ¤t_user.id).await?; let mut recipients: Vec = Vec::new(); for follower in followers { - let maybe_remote_actor = follower.actor() + let maybe_remote_actor = follower.remote_actor() .map_err(|_| HttpError::InternalError)?; if let Some(remote_actor) = maybe_remote_actor { recipients.push(remote_actor); }; }; if let Some(in_reply_to) = maybe_in_reply_to { - let maybe_remote_actor = in_reply_to.author.actor() + let maybe_remote_actor = in_reply_to.author.remote_actor() .map_err(|_| HttpError::InternalError)?; if let Some(remote_actor) = maybe_remote_actor { recipients.push(remote_actor); } } for profile in post.mentions.iter() { - let maybe_remote_actor = profile.actor() + let maybe_remote_actor = profile.remote_actor() .map_err(|_| HttpError::InternalError)?; if let Some(remote_actor) = maybe_remote_actor { recipients.push(remote_actor); @@ -174,7 +174,7 @@ async fn favourite( get_actions_for_post(db_client, ¤t_user.id, &mut post).await?; if reaction_created { - let maybe_remote_actor = post.author.actor() + let maybe_remote_actor = post.author.remote_actor() .map_err(|_| HttpError::InternalError)?; if let Some(remote_actor) = maybe_remote_actor { // Federate