Replace DbActorProfile::actor_address with ActorAddress::from_profile
This commit is contained in:
parent
f76438b6f8
commit
7640598431
5 changed files with 73 additions and 49 deletions
|
@ -37,6 +37,7 @@ use crate::models::{
|
||||||
relationships::queries::{get_followers, get_subscribers},
|
relationships::queries::{get_followers, get_subscribers},
|
||||||
users::types::User,
|
users::types::User,
|
||||||
};
|
};
|
||||||
|
use crate::webfinger::types::ActorAddress;
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
|
@ -134,7 +135,11 @@ 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 actor_address = ActorAddress::from_profile(
|
||||||
|
instance_hostname,
|
||||||
|
profile,
|
||||||
|
);
|
||||||
|
let tag_name = format!("@{}", actor_address);
|
||||||
let actor_id = profile_actor_id(instance_url, profile);
|
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());
|
||||||
|
|
|
@ -9,6 +9,7 @@ use crate::models::{
|
||||||
posts::types::Post,
|
posts::types::Post,
|
||||||
profiles::types::DbActorProfile,
|
profiles::types::DbActorProfile,
|
||||||
};
|
};
|
||||||
|
use crate::webfinger::types::ActorAddress;
|
||||||
|
|
||||||
const ENTRY_TITLE_MAX_LENGTH: usize = 75;
|
const ENTRY_TITLE_MAX_LENGTH: usize = 75;
|
||||||
|
|
||||||
|
@ -56,7 +57,10 @@ pub fn make_feed(
|
||||||
let actor_id = local_actor_id(&instance.url(), &profile.username);
|
let actor_id = local_actor_id(&instance.url(), &profile.username);
|
||||||
let actor_name = profile.display_name.as_ref()
|
let actor_name = profile.display_name.as_ref()
|
||||||
.unwrap_or(&profile.username);
|
.unwrap_or(&profile.username);
|
||||||
let actor_address = profile.actor_address(&instance.hostname());
|
let actor_address = ActorAddress::from_profile(
|
||||||
|
&instance.hostname(),
|
||||||
|
profile,
|
||||||
|
);
|
||||||
let feed_url = get_feed_url(&instance.url(), &profile.username);
|
let feed_url = get_feed_url(&instance.url(), &profile.username);
|
||||||
let feed_title = format!("{} (@{})", actor_name, actor_address);
|
let feed_title = format!("{} (@{})", actor_name, actor_address);
|
||||||
let mut entries = vec![];
|
let mut entries = vec![];
|
||||||
|
|
|
@ -37,7 +37,10 @@ fn export_profiles_to_csv(
|
||||||
) -> String {
|
) -> String {
|
||||||
let mut csv = String::new();
|
let mut csv = String::new();
|
||||||
for profile in profiles {
|
for profile in profiles {
|
||||||
let actor_address = profile.actor_address(local_hostname);
|
let actor_address = ActorAddress::from_profile(
|
||||||
|
local_hostname,
|
||||||
|
&profile,
|
||||||
|
);
|
||||||
csv += &format!("{}\n", actor_address);
|
csv += &format!("{}\n", actor_address);
|
||||||
};
|
};
|
||||||
csv
|
csv
|
||||||
|
|
|
@ -22,7 +22,6 @@ use crate::database::{
|
||||||
};
|
};
|
||||||
use crate::errors::ValidationError;
|
use crate::errors::ValidationError;
|
||||||
use crate::models::emojis::types::DbEmoji;
|
use crate::models::emojis::types::DbEmoji;
|
||||||
use crate::webfinger::types::ActorAddress;
|
|
||||||
use super::validators::{
|
use super::validators::{
|
||||||
validate_username,
|
validate_username,
|
||||||
validate_display_name,
|
validate_display_name,
|
||||||
|
@ -398,16 +397,6 @@ impl DbActorProfile {
|
||||||
self.actor_json.is_none()
|
self.actor_json.is_none()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn actor_address(&self, local_hostname: &str) -> ActorAddress {
|
|
||||||
assert_eq!(self.hostname.is_none(), self.is_local());
|
|
||||||
ActorAddress {
|
|
||||||
username: self.username.clone(),
|
|
||||||
hostname: self.hostname.as_deref()
|
|
||||||
.unwrap_or(local_hostname)
|
|
||||||
.to_string(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn possibly_outdated(&self) -> bool {
|
pub fn possibly_outdated(&self) -> bool {
|
||||||
if self.is_local() {
|
if self.is_local() {
|
||||||
false
|
false
|
||||||
|
@ -560,8 +549,6 @@ mod tests {
|
||||||
use crate::activitypub::actors::types::Actor;
|
use crate::activitypub::actors::types::Actor;
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
const INSTANCE_HOSTNAME: &str = "example.com";
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_identity_proof_serialization() {
|
fn test_identity_proof_serialization() {
|
||||||
let json_data = r#"{"issuer":"did:pkh:eip155:1:0xb9c5714089478a327f09197987f16f9e5d936e8a","proof_type":1,"value":"dbfe"}"#;
|
let json_data = r#"{"issuer":"did:pkh:eip155:1:0xb9c5714089478a327f09197987f16f9e5d936e8a","proof_type":1,"value":"dbfe"}"#;
|
||||||
|
@ -602,39 +589,6 @@ mod tests {
|
||||||
assert_eq!(serialized, r#"{"payment_type":2,"chain_id":"eip155:1"}"#);
|
assert_eq!(serialized, r#"{"payment_type":2,"chain_id":"eip155:1"}"#);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_local_actor_address() {
|
|
||||||
let local_profile = DbActorProfile {
|
|
||||||
username: "user".to_string(),
|
|
||||||
hostname: None,
|
|
||||||
acct: "user".to_string(),
|
|
||||||
actor_json: None,
|
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
assert_eq!(
|
|
||||||
local_profile.actor_address(INSTANCE_HOSTNAME).to_string(),
|
|
||||||
"user@example.com",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_remote_actor_address() {
|
|
||||||
let remote_profile = DbActorProfile {
|
|
||||||
username: "test".to_string(),
|
|
||||||
hostname: Some("remote.com".to_string()),
|
|
||||||
acct: "test@remote.com".to_string(),
|
|
||||||
actor_json: Some(Actor {
|
|
||||||
id: "https://test".to_string(),
|
|
||||||
..Default::default()
|
|
||||||
}),
|
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
assert_eq!(
|
|
||||||
remote_profile.actor_address(INSTANCE_HOSTNAME).to_string(),
|
|
||||||
remote_profile.acct,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_clean_profile_create_data() {
|
fn test_clean_profile_create_data() {
|
||||||
let mut profile_data = ProfileCreateData {
|
let mut profile_data = ProfileCreateData {
|
||||||
|
|
|
@ -9,6 +9,7 @@ use regex::Regex;
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
use crate::errors::ValidationError;
|
use crate::errors::ValidationError;
|
||||||
|
use crate::models::profiles::types::DbActorProfile;
|
||||||
|
|
||||||
// See also: USERNAME_RE in models::profiles::validators
|
// See also: USERNAME_RE in models::profiles::validators
|
||||||
const ACTOR_ADDRESS_RE: &str = r"^(?P<username>[\w\.-]+)@(?P<hostname>[\w\.-]+)$";
|
const ACTOR_ADDRESS_RE: &str = r"^(?P<username>[\w\.-]+)@(?P<hostname>[\w\.-]+)$";
|
||||||
|
@ -27,6 +28,19 @@ pub struct ActorAddress {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ActorAddress {
|
impl ActorAddress {
|
||||||
|
pub fn from_profile(
|
||||||
|
local_hostname: &str,
|
||||||
|
profile: &DbActorProfile,
|
||||||
|
) -> Self {
|
||||||
|
assert_eq!(profile.hostname.is_none(), profile.is_local());
|
||||||
|
Self {
|
||||||
|
username: profile.username.clone(),
|
||||||
|
hostname: profile.hostname.as_deref()
|
||||||
|
.unwrap_or(local_hostname)
|
||||||
|
.to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns acct string, as used in Mastodon
|
/// Returns acct string, as used in Mastodon
|
||||||
pub fn acct(&self, local_hostname: &str) -> String {
|
pub fn acct(&self, local_hostname: &str) -> String {
|
||||||
if self.hostname == local_hostname {
|
if self.hostname == local_hostname {
|
||||||
|
@ -80,8 +94,52 @@ pub struct JsonResourceDescriptor {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use crate::activitypub::actors::types::Actor;
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_local_actor_address() {
|
||||||
|
let local_hostname = "example.com";
|
||||||
|
let local_profile = DbActorProfile {
|
||||||
|
username: "user".to_string(),
|
||||||
|
hostname: None,
|
||||||
|
acct: "user".to_string(),
|
||||||
|
actor_json: None,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
let actor_address = ActorAddress::from_profile(
|
||||||
|
local_hostname,
|
||||||
|
&local_profile,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
actor_address.to_string(),
|
||||||
|
"user@example.com",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_remote_actor_address() {
|
||||||
|
let local_hostname = "example.com";
|
||||||
|
let remote_profile = DbActorProfile {
|
||||||
|
username: "test".to_string(),
|
||||||
|
hostname: Some("remote.com".to_string()),
|
||||||
|
acct: "test@remote.com".to_string(),
|
||||||
|
actor_json: Some(Actor {
|
||||||
|
id: "https://test".to_string(),
|
||||||
|
..Default::default()
|
||||||
|
}),
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
let actor_address = ActorAddress::from_profile(
|
||||||
|
local_hostname,
|
||||||
|
&remote_profile,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
actor_address.to_string(),
|
||||||
|
remote_profile.acct,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_actor_address_parse_address() {
|
fn test_actor_address_parse_address() {
|
||||||
let value = "user_1@example.com";
|
let value = "user_1@example.com";
|
||||||
|
|
Loading…
Reference in a new issue