From 9bc8997fb5a39676f81c672920cc4591005af7eb Mon Sep 17 00:00:00 2001 From: silverpill Date: Sun, 13 Feb 2022 17:55:35 +0000 Subject: [PATCH] Identify incoming followers-only posts --- src/activitypub/inbox/create.rs | 47 +++++++++++++++++++++++---------- src/activitypub/receiver.rs | 10 +++++-- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/activitypub/inbox/create.rs b/src/activitypub/inbox/create.rs index 72fb386..551baf7 100644 --- a/src/activitypub/inbox/create.rs +++ b/src/activitypub/inbox/create.rs @@ -3,7 +3,6 @@ use crate::models::posts::types::Visibility; use crate::models::profiles::types::DbActorProfile; pub fn get_note_visibility( - note_id: &str, author: &DbActorProfile, primary_audience: Vec, secondary_audience: Vec, @@ -12,30 +11,32 @@ pub fn get_note_visibility( secondary_audience.contains(&AP_PUBLIC.to_string()) { Visibility::Public } else { - // Treat all notes that aren't public-addressed as direct messages - log::warn!( - "processing non-public note {} attributed to {}; primary audience {:?}; secondary audience {:?}", - note_id, - author.username, - primary_audience, - secondary_audience, - ); - Visibility::Direct + let maybe_followers = author.actor_json.as_ref() + .and_then(|actor| actor.followers.as_ref()); + if let Some(followers) = maybe_followers { + if primary_audience.contains(&followers) || + secondary_audience.contains(&followers) { + Visibility::Followers + } else { + Visibility::Direct + } + } else { + Visibility::Direct + } } } #[cfg(test)] mod tests { + use crate::activitypub::actor::Actor; use super::*; #[test] fn test_get_note_visibility_public() { - let object_id = "https://example.com/test"; let author = DbActorProfile::default(); let primary_audience = vec![AP_PUBLIC.to_string()]; let secondary_audience = vec![]; let visibility = get_note_visibility( - object_id, &author, primary_audience, secondary_audience, @@ -43,14 +44,32 @@ mod tests { assert_eq!(visibility, Visibility::Public); } + #[test] + fn test_get_note_visibility_followers() { + let author_followers = "https://example.com/users/author/followers"; + let author = DbActorProfile { + actor_json: Some(Actor { + followers: Some(author_followers.to_string()), + ..Default::default() + }), + ..Default::default() + }; + let primary_audience = vec![author_followers.to_string()]; + let secondary_audience = vec![]; + let visibility = get_note_visibility( + &author, + primary_audience, + secondary_audience, + ); + assert_eq!(visibility, Visibility::Followers); + } + #[test] fn test_get_note_visibility_direct() { - let object_id = "https://example.com/test"; let author = DbActorProfile::default(); let primary_audience = vec!["https://example.com/users/1".to_string()]; let secondary_audience = vec![]; let visibility = get_note_visibility( - object_id, &author, primary_audience, secondary_audience, diff --git a/src/activitypub/receiver.rs b/src/activitypub/receiver.rs index 0331e32..0a41094 100644 --- a/src/activitypub/receiver.rs +++ b/src/activitypub/receiver.rs @@ -17,7 +17,7 @@ use crate::models::posts::queries::{ delete_post, }; use crate::models::posts::tags::normalize_tag; -use crate::models::posts::types::{Post, PostCreateData}; +use crate::models::posts::types::{Post, PostCreateData, Visibility}; use crate::models::profiles::queries::{ get_profile_by_actor_id, get_profile_by_acct, @@ -379,11 +379,17 @@ pub async fn process_note( None => vec![], }; let visibility = get_note_visibility( - &object.id, &author, primary_audience, secondary_audience, ); + if visibility != Visibility::Public { + log::warn!( + "processing note with visibility {:?} attributed to {}", + visibility, + author.username, + ); + }; let post_data = PostCreateData { content: content_cleaned, in_reply_to_id,