Refactor activitypub::actor module

This commit is contained in:
silverpill 2021-11-12 23:41:03 +00:00
parent 8da194e8a2
commit a5e3bef70c
6 changed files with 25 additions and 22 deletions

View file

@ -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<Option<Actor>, ConversionError> {
pub fn remote_actor(&self) -> Result<Option<Actor>, 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<Actor, rsa::pkcs8::Error> {
instance_url: &str,
) -> Result<Actor, ActorKeyError> {
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)
},

View file

@ -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(),

View file

@ -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<HttpResponse, HttpError> {
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)

View file

@ -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)?;

View file

@ -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, &current_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(

View file

@ -82,21 +82,21 @@ async fn create_status(
let followers = get_followers(db_client, &current_user.id).await?;
let mut recipients: Vec<Actor> = 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, &current_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