Move DbActorProfile::actor_id function to activitypub::identifiers

This commit is contained in:
silverpill 2023-03-18 17:25:52 +00:00
parent 306fd7b75b
commit f76438b6f8
13 changed files with 56 additions and 35 deletions

View file

@ -12,6 +12,7 @@ use crate::activitypub::{
local_actor_id, local_actor_id,
local_object_id, local_object_id,
post_object_id, post_object_id,
profile_actor_id,
}, },
types::{build_default_context, Context}, types::{build_default_context, Context},
vocabulary::ANNOUNCE, vocabulary::ANNOUNCE,
@ -50,7 +51,7 @@ fn build_announce(
.expect("repost_of field should be populated"); .expect("repost_of field should be populated");
let object_id = post_object_id(instance_url, post); let object_id = post_object_id(instance_url, post);
let activity_id = local_object_id(instance_url, &repost.id); let activity_id = local_object_id(instance_url, &repost.id);
let recipient_id = post.author.actor_id(instance_url); let recipient_id = profile_actor_id(instance_url, &post.author);
let followers = local_actor_followers(instance_url, sender_username); let followers = local_actor_followers(instance_url, sender_username);
Announce { Announce {
context: build_default_context(), context: build_default_context(),
@ -77,7 +78,7 @@ pub async fn get_announce_recipients(
recipients.push(remote_actor); recipients.push(remote_actor);
}; };
}; };
let primary_recipient = post.author.actor_id(instance_url); let primary_recipient = profile_actor_id(instance_url, &post.author);
if let Some(remote_actor) = post.author.actor_json.as_ref() { if let Some(remote_actor) = post.author.actor_json.as_ref() {
recipients.push(remote_actor.clone()); recipients.push(remote_actor.clone());
}; };

View file

@ -15,6 +15,7 @@ use crate::activitypub::{
local_object_id, local_object_id,
local_tag_collection, local_tag_collection,
post_object_id, post_object_id,
profile_actor_id,
}, },
types::{ types::{
build_default_context, build_default_context,
@ -134,7 +135,7 @@ pub fn build_note(
let mut tags = vec![]; let mut tags = vec![];
for profile in &post.mentions { for profile in &post.mentions {
let tag_name = format!("@{}", profile.actor_address(instance_hostname)); let tag_name = format!("@{}", profile.actor_address(instance_hostname));
let actor_id = profile.actor_id(instance_url); let actor_id = profile_actor_id(instance_url, profile);
if !primary_audience.contains(&actor_id) { if !primary_audience.contains(&actor_id) {
primary_audience.push(actor_id.clone()); primary_audience.push(actor_id.clone());
}; };
@ -183,7 +184,10 @@ pub fn build_note(
let in_reply_to = post.in_reply_to.as_ref() let in_reply_to = post.in_reply_to.as_ref()
.expect("in_reply_to should be populated"); .expect("in_reply_to should be populated");
assert_eq!(in_reply_to.id, in_reply_to_id); assert_eq!(in_reply_to.id, in_reply_to_id);
let in_reply_to_actor_id = in_reply_to.author.actor_id(instance_url); let in_reply_to_actor_id = profile_actor_id(
instance_url,
&in_reply_to.author,
);
if !primary_audience.contains(&in_reply_to_actor_id) { if !primary_audience.contains(&in_reply_to_actor_id) {
primary_audience.push(in_reply_to_actor_id); primary_audience.push(in_reply_to_actor_id);
}; };

View file

@ -7,6 +7,7 @@ use crate::activitypub::{
actors::types::Actor, actors::types::Actor,
constants::AP_PUBLIC, constants::AP_PUBLIC,
deliverer::OutgoingActivity, deliverer::OutgoingActivity,
identifiers::local_actor_id,
types::{build_default_context, Context}, types::{build_default_context, Context},
vocabulary::DELETE, vocabulary::DELETE,
}; };
@ -35,7 +36,7 @@ fn build_delete_person(
instance_url: &str, instance_url: &str,
user: &User, user: &User,
) -> DeletePerson { ) -> DeletePerson {
let actor_id = user.profile.actor_id(instance_url); let actor_id = local_actor_id(instance_url, &user.profile.username);
let activity_id = format!("{}/delete", actor_id); let activity_id = format!("{}/delete", actor_id);
DeletePerson { DeletePerson {
context: build_default_context(), context: build_default_context(),

View file

@ -7,7 +7,12 @@ use crate::activitypub::{
actors::types::Actor, actors::types::Actor,
constants::AP_PUBLIC, constants::AP_PUBLIC,
deliverer::OutgoingActivity, deliverer::OutgoingActivity,
identifiers::{local_actor_id, local_object_id, post_object_id}, identifiers::{
local_actor_id,
local_object_id,
post_object_id,
profile_actor_id,
},
types::{build_default_context, Context}, types::{build_default_context, Context},
vocabulary::LIKE, vocabulary::LIKE,
}; };
@ -94,7 +99,7 @@ pub async fn prepare_like(
post, post,
).await?; ).await?;
let object_id = post_object_id(&instance.url(), post); let object_id = post_object_id(&instance.url(), post);
let post_author_id = post.author.actor_id(&instance.url()); let post_author_id = profile_actor_id(&instance.url(), &post.author);
let activity = build_like( let activity = build_like(
&instance.url(), &instance.url(),
&sender.profile, &sender.profile,

View file

@ -5,7 +5,7 @@ use mitra_config::Instance;
use crate::activitypub::{ use crate::activitypub::{
deliverer::OutgoingActivity, deliverer::OutgoingActivity,
identifiers::{local_actor_id, local_object_id}, identifiers::{local_actor_id, local_object_id, profile_actor_id},
types::{build_default_context, Context}, types::{build_default_context, Context},
vocabulary::UNDO, vocabulary::UNDO,
}; };
@ -71,7 +71,7 @@ pub async fn prepare_undo_like(
&instance.url(), &instance.url(),
post, post,
).await?; ).await?;
let post_author_id = post.author.actor_id(&instance.url()); let post_author_id = profile_actor_id(&instance.url(), &post.author);
let activity = build_undo_like( let activity = build_undo_like(
&instance.url(), &instance.url(),
&sender.profile, &sender.profile,

View file

@ -19,7 +19,7 @@ use crate::activitypub::{
get_or_import_profile_by_actor_id, get_or_import_profile_by_actor_id,
import_post, import_post,
}, },
identifiers::parse_local_actor_id, identifiers::{parse_local_actor_id, profile_actor_id},
receiver::{parse_array, parse_property_value, HandlerError}, receiver::{parse_array, parse_property_value, HandlerError},
types::{Attachment, EmojiTag, Link, LinkTag, Object, Tag}, types::{Attachment, EmojiTag, Link, LinkTag, Object, Tag},
vocabulary::*, vocabulary::*,
@ -150,7 +150,7 @@ pub async fn get_object_attachments(
}, },
}; };
if is_gnu_social_link( if is_gnu_social_link(
&author.actor_id(&instance.url()), &profile_actor_id(&instance.url(), author),
&attachment, &attachment,
) { ) {
// Don't fetch HTML pages attached by GNU Social // Don't fetch HTML pages attached by GNU Social

View file

@ -9,7 +9,7 @@ use crate::activitypub::{
undo_follow::prepare_undo_follow, undo_follow::prepare_undo_follow,
}, },
fetcher::helpers::get_or_import_profile_by_actor_id, fetcher::helpers::get_or_import_profile_by_actor_id,
identifiers::parse_local_actor_id, identifiers::{parse_local_actor_id, profile_actor_id},
receiver::parse_array, receiver::parse_array,
vocabulary::PERSON, vocabulary::PERSON,
}; };
@ -64,7 +64,7 @@ pub async fn handle_move(
&activity.object, &activity.object,
).await? ).await?
}; };
let old_actor_id = old_profile.actor_id(&instance.url()); let old_actor_id = profile_actor_id(&instance.url(), &old_profile);
let new_profile = get_or_import_profile_by_actor_id( let new_profile = get_or_import_profile_by_actor_id(
db_client, db_client,
&instance, &instance,
@ -77,7 +77,7 @@ pub async fn handle_move(
// Find aliases by DIDs (signed) // Find aliases by DIDs (signed)
let mut aliases = find_aliases(db_client, &new_profile).await? let mut aliases = find_aliases(db_client, &new_profile).await?
.into_iter() .into_iter()
.map(|profile| profile.actor_id(&instance.url())) .map(|profile| profile_actor_id(&instance.url(), &profile))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
// Read aliases from alsoKnownAs property // Read aliases from alsoKnownAs property
// TODO: use new_profile.aliases.into_actor_ids() // TODO: use new_profile.aliases.into_actor_ids()

View file

@ -125,13 +125,20 @@ pub fn post_object_id(instance_url: &str, post: &Post) -> String {
} }
} }
pub fn profile_actor_id(instance_url: &str, profile: &DbActorProfile) -> String {
match profile.actor_json {
Some(ref actor) => actor.id.clone(),
None => local_actor_id(instance_url, &profile.username),
}
}
pub fn profile_actor_url(instance_url: &str, profile: &DbActorProfile) -> String { pub fn profile_actor_url(instance_url: &str, profile: &DbActorProfile) -> String {
if let Some(ref actor) = profile.actor_json { if let Some(ref actor) = profile.actor_json {
if let Some(ref actor_url) = actor.url { if let Some(ref actor_url) = actor.url {
return actor_url.to_string(); return actor_url.to_string();
}; };
}; };
profile.actor_id(instance_url) profile_actor_id(instance_url, profile)
} }
#[cfg(test)] #[cfg(test)]

View file

@ -35,6 +35,7 @@ use super::handlers::{
undo::handle_undo, undo::handle_undo,
update::handle_update, update::handle_update,
}; };
use super::identifiers::profile_actor_id;
use super::queues::IncomingActivityJobData; use super::queues::IncomingActivityJobData;
use super::vocabulary::*; use super::vocabulary::*;
@ -298,7 +299,7 @@ pub async fn receive_activity(
return Ok(()); return Ok(());
}; };
let signer_id = signer.actor_id(&config.instance_url()); let signer_id = profile_actor_id(&config.instance_url(), &signer);
let is_authenticated = activity_actor == signer_id; let is_authenticated = activity_actor == signer_id;
if !is_authenticated { if !is_authenticated {
match activity_type { match activity_type {

View file

@ -26,12 +26,15 @@ use mitra_utils::{
passwords::hash_password, passwords::hash_password,
}; };
use crate::activitypub::builders::{ use crate::activitypub::{
undo_follow::prepare_undo_follow, builders::{
update_person::{ undo_follow::prepare_undo_follow,
build_update_person, update_person::{
prepare_update_person, build_update_person,
prepare_update_person,
},
}, },
identifiers::local_actor_id,
}; };
use crate::database::{get_database_client, DatabaseError, DbPool}; use crate::database::{get_database_client, DatabaseError, DbPool};
use crate::errors::ValidationError; use crate::errors::ValidationError;
@ -369,7 +372,10 @@ async fn get_identity_claim(
}, },
_ => return Err(ValidationError("unknown proof type").into()), _ => return Err(ValidationError("unknown proof type").into()),
}; };
let actor_id = current_user.profile.actor_id(&config.instance_url()); let actor_id = local_actor_id(
&config.instance_url(),
&current_user.profile.username,
);
let claim = create_identity_claim(&actor_id, &did) let claim = create_identity_claim(&actor_id, &did)
.map_err(|_| MastodonError::InternalError)?; .map_err(|_| MastodonError::InternalError)?;
let response = IdentityClaim { did, claim }; let response = IdentityClaim { did, claim };
@ -399,7 +405,10 @@ async fn create_identity_proof(
Err(DatabaseError::NotFound(_)) => (), Err(DatabaseError::NotFound(_)) => (),
Err(other_error) => return Err(other_error.into()), Err(other_error) => return Err(other_error.into()),
}; };
let actor_id = current_user.profile.actor_id(&config.instance_url()); let actor_id = local_actor_id(
&config.instance_url(),
&current_user.profile.username,
);
let message = create_identity_claim(&actor_id, &did) let message = create_identity_claim(&actor_id, &did)
.map_err(|_| ValidationError("invalid claim"))?; .map_err(|_| ValidationError("invalid claim"))?;

View file

@ -11,6 +11,7 @@ use actix_web_httpauth::extractors::bearer::BearerAuth;
use mitra_config::Config; use mitra_config::Config;
use mitra_utils::passwords::hash_password; use mitra_utils::passwords::hash_password;
use crate::activitypub::identifiers::profile_actor_id;
use crate::database::{get_database_client, DatabaseError, DbPool}; use crate::database::{get_database_client, DatabaseError, DbPool};
use crate::errors::ValidationError; use crate::errors::ValidationError;
use crate::http::get_request_base_url; use crate::http::get_request_base_url;
@ -147,7 +148,7 @@ async fn move_followers(
// Find known aliases of the current user // Find known aliases of the current user
let mut aliases = find_aliases(db_client, &current_user.profile).await? let mut aliases = find_aliases(db_client, &current_user.profile).await?
.into_iter() .into_iter()
.map(|profile| profile.actor_id(&instance.url())); .map(|profile| profile_actor_id(&instance.url(), &profile));
if !aliases.any(|actor_id| actor_id == request_data.from_actor_id) { if !aliases.any(|actor_id| actor_id == request_data.from_actor_id) {
return Err(ValidationError("old profile is not an alias").into()); return Err(ValidationError("old profile is not an alias").into());
}; };

View file

@ -15,7 +15,6 @@ use mitra_utils::{
use crate::activitypub::{ use crate::activitypub::{
actors::types::Actor, actors::types::Actor,
identifiers::local_actor_id,
}; };
use crate::database::{ use crate::database::{
json_macro::{json_from_sql, json_to_sql}, json_macro::{json_from_sql, json_to_sql},
@ -399,13 +398,6 @@ impl DbActorProfile {
self.actor_json.is_none() self.actor_json.is_none()
} }
pub fn actor_id(&self, instance_url: &str) -> String {
match self.actor_json {
Some(ref actor) => actor.id.clone(),
None => local_actor_id(instance_url, &self.username),
}
}
pub fn actor_address(&self, local_hostname: &str) -> ActorAddress { pub fn actor_address(&self, local_hostname: &str) -> ActorAddress {
assert_eq!(self.hostname.is_none(), self.is_local()); assert_eq!(self.hostname.is_none(), self.is_local());
ActorAddress { ActorAddress {

View file

@ -14,7 +14,7 @@ use uuid::Uuid;
use mitra_config::Config; use mitra_config::Config;
use crate::activitypub::{ use crate::activitypub::{
identifiers::post_object_id, identifiers::{post_object_id, profile_actor_id},
views::is_activitypub_request, views::is_activitypub_request,
}; };
use crate::database::{get_database_client, DbPool}; use crate::database::{get_database_client, DbPool};
@ -53,7 +53,7 @@ async fn profile_page_redirect_view(
) -> Result<HttpResponse, HttpError> { ) -> Result<HttpResponse, HttpError> {
let db_client = &**get_database_client(&db_pool).await?; let db_client = &**get_database_client(&db_pool).await?;
let profile = get_profile_by_id(db_client, &profile_id).await?; let profile = get_profile_by_id(db_client, &profile_id).await?;
let actor_id = profile.actor_id(&config.instance_url()); let actor_id = profile_actor_id(&config.instance_url(), &profile);
let response = HttpResponse::Found() let response = HttpResponse::Found()
.append_header(("Location", actor_id)) .append_header(("Location", actor_id))
.finish(); .finish();
@ -75,7 +75,7 @@ async fn profile_acct_page_redirect_view(
) -> Result<HttpResponse, HttpError> { ) -> Result<HttpResponse, HttpError> {
let db_client = &**get_database_client(&db_pool).await?; let db_client = &**get_database_client(&db_pool).await?;
let profile = get_profile_by_acct(db_client, &acct).await?; let profile = get_profile_by_acct(db_client, &acct).await?;
let actor_id = profile.actor_id(&config.instance_url()); let actor_id = profile_actor_id(&config.instance_url(), &profile);
let response = HttpResponse::Found() let response = HttpResponse::Found()
.append_header(("Location", actor_id)) .append_header(("Location", actor_id))
.finish(); .finish();