diff --git a/Cargo.lock b/Cargo.lock index 004b31d04..b5c654131 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1802,7 +1802,6 @@ dependencies = [ "background-jobs", "base64 0.13.0", "bcrypt", - "captcha", "chrono", "diesel", "futures", @@ -1881,6 +1880,50 @@ dependencies = [ "uuid", ] +[[package]] +name = "lemmy_apub_receive" +version = "0.1.0" +dependencies = [ + "activitystreams", + "activitystreams-ext", + "actix", + "actix-rt", + "actix-web", + "anyhow", + "async-trait", + "awc", + "backtrace", + "base64 0.13.0", + "bcrypt", + "chrono", + "diesel", + "futures", + "http", + "http-signature-normalization-actix", + "http-signature-normalization-reqwest", + "itertools", + "lemmy_api_common", + "lemmy_apub", + "lemmy_db_queries", + "lemmy_db_schema", + "lemmy_db_views", + "lemmy_db_views_actor", + "lemmy_utils", + "lemmy_websocket", + "log", + "openssl", + "percent-encoding", + "rand 0.8.3", + "serde", + "serde_json", + "sha2", + "strum", + "strum_macros", + "thiserror", + "tokio 0.3.7", + "url", +] + [[package]] name = "lemmy_db_queries" version = "0.1.0" @@ -1996,6 +2039,7 @@ dependencies = [ "lemmy_api_common", "lemmy_api_crud", "lemmy_apub", + "lemmy_apub_receive", "lemmy_db_queries", "lemmy_db_schema", "lemmy_db_views", diff --git a/Cargo.toml b/Cargo.toml index 4f338f9b1..0fd838819 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ members = [ "crates/api_crud", "crates/api_common", "crates/apub", + "crates/apub_receive", "crates/utils", "crates/db_queries", "crates/db_schema", @@ -29,6 +30,7 @@ members = [ lemmy_api = { path = "./crates/api" } lemmy_api_crud = { path = "./crates/api_crud" } lemmy_apub = { path = "./crates/apub" } +lemmy_apub_receive = { path = "./crates/apub_receive" } lemmy_utils = { path = "./crates/utils" } lemmy_db_schema = { path = "./crates/db_schema" } lemmy_db_queries = { path = "./crates/db_queries" } diff --git a/crates/api_crud/Cargo.toml b/crates/api_crud/Cargo.toml index f7fde4a68..deebc12fa 100644 --- a/crates/api_crud/Cargo.toml +++ b/crates/api_crud/Cargo.toml @@ -38,7 +38,6 @@ itertools = "0.10.0" uuid = { version = "0.8.2", features = ["serde", "v4"] } sha2 = "0.9.3" async-trait = "0.1.42" -captcha = "0.0.8" anyhow = "1.0.38" thiserror = "1.0.23" background-jobs = "0.8.0" diff --git a/crates/apub/src/activities/mod.rs b/crates/apub/src/activities/mod.rs index cb61fcf21..5c9ff6943 100644 --- a/crates/apub/src/activities/mod.rs +++ b/crates/apub/src/activities/mod.rs @@ -1,2 +1 @@ -pub(crate) mod receive; pub mod send; diff --git a/crates/apub/src/extensions/context.rs b/crates/apub/src/extensions/context.rs index 041ca4bf0..63ae2c6d0 100644 --- a/crates/apub/src/extensions/context.rs +++ b/crates/apub/src/extensions/context.rs @@ -3,7 +3,7 @@ use lemmy_utils::LemmyError; use serde_json::json; use url::Url; -pub(crate) fn lemmy_context() -> Result, LemmyError> { +pub fn lemmy_context() -> Result, LemmyError> { let context_ext = AnyBase::from_arbitrary_json(json!( { "sc": "http://schema.org#", diff --git a/crates/apub/src/extensions/mod.rs b/crates/apub/src/extensions/mod.rs index 2f7df8211..19e37894d 100644 --- a/crates/apub/src/extensions/mod.rs +++ b/crates/apub/src/extensions/mod.rs @@ -1,5 +1,5 @@ -pub(crate) mod context; +pub mod context; pub(crate) mod group_extension; pub(crate) mod page_extension; pub(crate) mod person_extension; -pub(crate) mod signatures; +pub mod signatures; diff --git a/crates/apub/src/extensions/signatures.rs b/crates/apub/src/extensions/signatures.rs index a9b4cfbdf..92e2a306d 100644 --- a/crates/apub/src/extensions/signatures.rs +++ b/crates/apub/src/extensions/signatures.rs @@ -26,7 +26,7 @@ lazy_static! { /// Creates an HTTP post request to `inbox_url`, with the given `client` and `headers`, and /// `activity` as request body. The request is signed with `private_key` and then sent. -pub async fn sign_and_send( +pub(crate) async fn sign_and_send( client: &Client, headers: BTreeMap, inbox_url: &Url, @@ -65,10 +65,7 @@ pub async fn sign_and_send( } /// Verifies the HTTP signature on an incoming inbox request. -pub(crate) fn verify_signature( - request: &HttpRequest, - actor: &dyn ActorType, -) -> Result<(), LemmyError> { +pub fn verify_signature(request: &HttpRequest, actor: &dyn ActorType) -> Result<(), LemmyError> { let public_key = actor.public_key().context(location_info!())?; let verified = CONFIG2 .begin_verify( diff --git a/crates/apub/src/fetcher/community.rs b/crates/apub/src/fetcher/community.rs index c657bfad4..6187ac10c 100644 --- a/crates/apub/src/fetcher/community.rs +++ b/crates/apub/src/fetcher/community.rs @@ -5,7 +5,6 @@ use crate::{ person::get_or_fetch_and_upsert_person, should_refetch_actor, }, - inbox::person_inbox::receive_announce, objects::FromApub, GroupExt, }; @@ -31,7 +30,7 @@ use url::Url; /// /// If it exists locally and `!should_refetch_actor()`, it is returned directly from the database. /// Otherwise it is fetched from the remote instance, stored and returned. -pub(crate) async fn get_or_fetch_and_upsert_community( +pub async fn get_or_fetch_and_upsert_community( apub_id: &Url, context: &LemmyContext, recursion_counter: &mut i32, @@ -158,7 +157,8 @@ async fn fetch_community_outbox( } for activity in outbox_activities { - receive_announce(context, activity, community, recursion_counter).await?; + todo!("{:?} {:?} {:?}", activity, community, recursion_counter); + //receive_announce(context, activity, community, recursion_counter).await?; } Ok(()) diff --git a/crates/apub/src/fetcher/mod.rs b/crates/apub/src/fetcher/mod.rs index 234a929b9..477cecc87 100644 --- a/crates/apub/src/fetcher/mod.rs +++ b/crates/apub/src/fetcher/mod.rs @@ -1,7 +1,7 @@ -pub(crate) mod community; +pub mod community; mod fetch; -pub(crate) mod objects; -pub(crate) mod person; +pub mod objects; +pub mod person; pub mod search; use crate::{ @@ -42,7 +42,7 @@ where /// /// If it exists locally and `!should_refetch_actor()`, it is returned directly from the database. /// Otherwise it is fetched from the remote instance, stored and returned. -pub(crate) async fn get_or_fetch_and_upsert_actor( +pub async fn get_or_fetch_and_upsert_actor( apub_id: &Url, context: &LemmyContext, recursion_counter: &mut i32, diff --git a/crates/apub/src/fetcher/objects.rs b/crates/apub/src/fetcher/objects.rs index b8f8bbde4..41bc075a0 100644 --- a/crates/apub/src/fetcher/objects.rs +++ b/crates/apub/src/fetcher/objects.rs @@ -13,7 +13,7 @@ use url::Url; /// pulled from its apub ID, inserted and returned. /// /// The parent community is also pulled if necessary. Comments are not pulled. -pub(crate) async fn get_or_fetch_and_insert_post( +pub async fn get_or_fetch_and_insert_post( post_ap_id: &Url, context: &LemmyContext, recursion_counter: &mut i32, @@ -49,7 +49,7 @@ pub(crate) async fn get_or_fetch_and_insert_post( /// pulled from its apub ID, inserted and returned. /// /// The parent community, post and comment are also pulled if necessary. -pub(crate) async fn get_or_fetch_and_insert_comment( +pub async fn get_or_fetch_and_insert_comment( comment_ap_id: &Url, context: &LemmyContext, recursion_counter: &mut i32, diff --git a/crates/apub/src/fetcher/person.rs b/crates/apub/src/fetcher/person.rs index 81ba731b1..4e6191abb 100644 --- a/crates/apub/src/fetcher/person.rs +++ b/crates/apub/src/fetcher/person.rs @@ -17,7 +17,7 @@ use url::Url; /// /// If it exists locally and `!should_refetch_actor()`, it is returned directly from the database. /// Otherwise it is fetched from the remote instance, stored and returned. -pub(crate) async fn get_or_fetch_and_upsert_person( +pub async fn get_or_fetch_and_upsert_person( apub_id: &Url, context: &LemmyContext, recursion_counter: &mut i32, diff --git a/crates/apub/src/lib.rs b/crates/apub/src/lib.rs index ad697d0ce..8dd35ea3d 100644 --- a/crates/apub/src/lib.rs +++ b/crates/apub/src/lib.rs @@ -5,10 +5,7 @@ pub mod activities; pub mod activity_queue; pub mod extensions; pub mod fetcher; -pub mod http; -pub mod inbox; pub mod objects; -pub mod routes; use crate::extensions::{ group_extension::GroupExtension, @@ -20,7 +17,7 @@ use activitystreams::{ activity::Follow, actor, base::AnyBase, - object::{ApObject, Note, Page}, + object::{ApObject, AsObject, Note, ObjectExt, Page}, }; use activitystreams_ext::{Ext1, Ext2}; use anyhow::{anyhow, Context}; @@ -36,8 +33,10 @@ use lemmy_db_schema::{ post::Post, private_message::PrivateMessage, }, + CommunityId, DbUrl, }; +use lemmy_db_views_actor::community_person_ban_view::CommunityPersonBanView; use lemmy_utils::{location_info, settings::structs::Settings, LemmyError}; use lemmy_websocket::LemmyContext; use serde::Serialize; @@ -49,8 +48,8 @@ type GroupExt = Ext2>, GroupExtension, Pub /// Activitystreams type for person type PersonExt = Ext2>, PersonExtension, PublicKeyExtension>; /// Activitystreams type for post -type PageExt = Ext1, PageExtension>; -type NoteExt = ApObject; +pub type PageExt = Ext1, PageExtension>; +pub type NoteExt = ApObject; pub static APUB_JSON_CONTENT_TYPE: &str = "application/activity+json"; @@ -63,7 +62,7 @@ pub static APUB_JSON_CONTENT_TYPE: &str = "application/activity+json"; /// - URL not being in the blocklist (if it is active) /// /// Note that only one of allowlist and blacklist can be enabled, not both. -fn check_is_apub_id_valid(apub_id: &Url) -> Result<(), LemmyError> { +pub fn check_is_apub_id_valid(apub_id: &Url) -> Result<(), LemmyError> { let settings = Settings::get(); let domain = apub_id.domain().context(location_info!())?.to_string(); let local_instance = settings.get_hostname_without_port()?; @@ -294,13 +293,13 @@ pub fn generate_shared_inbox_url(actor_id: &DbUrl) -> Result Ok(Url::parse(&url)?.into()) } -pub(crate) fn generate_moderators_url(community_id: &DbUrl) -> Result { +pub fn generate_moderators_url(community_id: &DbUrl) -> Result { Ok(Url::parse(&format!("{}/moderators", community_id))?.into()) } /// Store a sent or received activity in the database, for logging purposes. These records are not /// persistent. -pub(crate) async fn insert_activity( +pub async fn insert_activity( ap_id: &Url, activity: T, local: bool, @@ -318,7 +317,7 @@ where Ok(()) } -pub(crate) enum PostOrComment { +pub enum PostOrComment { Comment(Box), Post(Box), } @@ -326,7 +325,7 @@ pub(crate) enum PostOrComment { /// Tries to find a post or comment in the local database, without any network requests. /// This is used to handle deletions and removals, because in case we dont have the object, we can /// simply ignore the activity. -pub(crate) async fn find_post_or_comment_by_id( +pub async fn find_post_or_comment_by_id( context: &LemmyContext, apub_id: Url, ) -> Result { @@ -400,3 +399,49 @@ pub(crate) async fn find_object_by_id( Err(NotFound.into()) } + +pub async fn check_community_or_site_ban( + person: &Person, + community_id: CommunityId, + pool: &DbPool, +) -> Result<(), LemmyError> { + if person.banned { + return Err(anyhow!("Person is banned from site").into()); + } + let person_id = person.id; + let is_banned = + move |conn: &'_ _| CommunityPersonBanView::get(conn, person_id, community_id).is_ok(); + if blocking(pool, is_banned).await? { + return Err(anyhow!("Person is banned from community").into()); + } + + Ok(()) +} + +pub fn get_activity_to_and_cc(activity: &T) -> Vec +where + T: AsObject, +{ + let mut to_and_cc = vec![]; + if let Some(to) = activity.to() { + let to = to.to_owned().unwrap_to_vec(); + let mut to = to + .iter() + .map(|t| t.as_xsd_any_uri()) + .flatten() + .map(|t| t.to_owned()) + .collect(); + to_and_cc.append(&mut to); + } + if let Some(cc) = activity.cc() { + let cc = cc.to_owned().unwrap_to_vec(); + let mut cc = cc + .iter() + .map(|c| c.as_xsd_any_uri()) + .flatten() + .map(|c| c.to_owned()) + .collect(); + to_and_cc.append(&mut cc); + } + to_and_cc +} diff --git a/crates/apub/src/objects/mod.rs b/crates/apub/src/objects/mod.rs index 08822abfd..8c18e3417 100644 --- a/crates/apub/src/objects/mod.rs +++ b/crates/apub/src/objects/mod.rs @@ -1,7 +1,8 @@ use crate::{ + check_community_or_site_ban, check_is_apub_id_valid, fetcher::{community::get_or_fetch_and_upsert_community, person::get_or_fetch_and_upsert_person}, - inbox::{community_inbox::check_community_or_site_ban, get_activity_to_and_cc}, + get_activity_to_and_cc, PageExt, }; use activitystreams::{ @@ -33,14 +34,14 @@ pub(crate) mod private_message; /// Trait for converting an object or actor into the respective ActivityPub type. #[async_trait::async_trait(?Send)] -pub(crate) trait ToApub { +pub trait ToApub { type ApubType; async fn to_apub(&self, pool: &DbPool) -> Result; fn to_tombstone(&self) -> Result; } #[async_trait::async_trait(?Send)] -pub(crate) trait FromApub { +pub trait FromApub { type ApubType; /// Converts an object from ActivityPub type to Lemmy internal type. /// diff --git a/crates/apub_receive/Cargo.toml b/crates/apub_receive/Cargo.toml new file mode 100644 index 000000000..54e01f7df --- /dev/null +++ b/crates/apub_receive/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "lemmy_apub_receive" +version = "0.1.0" +edition = "2018" + +[dependencies] +lemmy_utils = { path = "../utils" } +lemmy_apub = { path = "../apub" } +lemmy_db_queries = { path = "../db_queries" } +lemmy_db_schema = { path = "../db_schema" } +lemmy_db_views = { path = "../db_views" } +lemmy_db_views_actor = { path = "../db_views_actor" } +lemmy_api_common = { path = "../api_common" } +lemmy_websocket = { path = "../websocket" } +diesel = "1.4.5" +activitystreams = "0.7.0-alpha.11" +activitystreams-ext = "0.1.0-alpha.2" +bcrypt = "0.9.0" +chrono = { version = "0.4.19", features = ["serde"] } +serde_json = { version = "1.0.61", features = ["preserve_order"] } +serde = { version = "1.0.123", features = ["derive"] } +actix = "0.10.0" +actix-web = { version = "3.3.2", default-features = false } +actix-rt = { version = "1.1.1", default-features = false } +awc = { version = "2.0.3", default-features = false } +log = "0.4.14" +rand = "0.8.3" +strum = "0.20.0" +strum_macros = "0.20.1" +url = { version = "2.2.1", features = ["serde"] } +percent-encoding = "2.1.0" +openssl = "0.10.32" +http = "0.2.3" +http-signature-normalization-actix = { version = "0.4.1", default-features = false, features = ["sha-2"] } +http-signature-normalization-reqwest = { version = "0.1.3", default-features = false, features = ["sha-2"] } +base64 = "0.13.0" +tokio = "0.3.6" +futures = "0.3.12" +itertools = "0.10.0" +sha2 = "0.9.3" +async-trait = "0.1.42" +anyhow = "1.0.38" +thiserror = "1.0.23" +backtrace = "0.3.56" + diff --git a/crates/apub_receive/src/activities/mod.rs b/crates/apub_receive/src/activities/mod.rs new file mode 100644 index 000000000..cbdeafaf9 --- /dev/null +++ b/crates/apub_receive/src/activities/mod.rs @@ -0,0 +1 @@ +pub(crate) mod receive; diff --git a/crates/apub/src/activities/receive/comment.rs b/crates/apub_receive/src/activities/receive/comment.rs similarity index 98% rename from crates/apub/src/activities/receive/comment.rs rename to crates/apub_receive/src/activities/receive/comment.rs index d79ef84a2..18508fa20 100644 --- a/crates/apub/src/activities/receive/comment.rs +++ b/crates/apub_receive/src/activities/receive/comment.rs @@ -1,10 +1,11 @@ -use crate::{activities::receive::get_actor_as_person, objects::FromApub, ActorType, NoteExt}; +use crate::activities::receive::get_actor_as_person; use activitystreams::{ activity::{ActorAndObjectRefExt, Create, Dislike, Like, Update}, base::ExtendsExt, }; use anyhow::Context; use lemmy_api_common::{blocking, comment::CommentResponse, send_local_notifs}; +use lemmy_apub::{objects::FromApub, ActorType, NoteExt}; use lemmy_db_queries::{source::comment::Comment_, Crud, Likeable}; use lemmy_db_schema::source::{ comment::{Comment, CommentLike, CommentLikeForm}, diff --git a/crates/apub/src/activities/receive/comment_undo.rs b/crates/apub_receive/src/activities/receive/comment_undo.rs similarity index 100% rename from crates/apub/src/activities/receive/comment_undo.rs rename to crates/apub_receive/src/activities/receive/comment_undo.rs diff --git a/crates/apub/src/activities/receive/community.rs b/crates/apub_receive/src/activities/receive/community.rs similarity index 100% rename from crates/apub/src/activities/receive/community.rs rename to crates/apub_receive/src/activities/receive/community.rs diff --git a/crates/apub/src/activities/receive/mod.rs b/crates/apub_receive/src/activities/receive/mod.rs similarity index 97% rename from crates/apub/src/activities/receive/mod.rs rename to crates/apub_receive/src/activities/receive/mod.rs index 1d5fcc300..afad2dfc9 100644 --- a/crates/apub/src/activities/receive/mod.rs +++ b/crates/apub_receive/src/activities/receive/mod.rs @@ -1,10 +1,10 @@ -use crate::fetcher::person::get_or_fetch_and_upsert_person; use activitystreams::{ activity::{ActorAndObjectRef, ActorAndObjectRefExt}, base::{AsBase, BaseExt}, error::DomainError, }; use anyhow::{anyhow, Context}; +use lemmy_apub::fetcher::person::get_or_fetch_and_upsert_person; use lemmy_db_schema::source::person::Person; use lemmy_utils::{location_info, LemmyError}; use lemmy_websocket::LemmyContext; diff --git a/crates/apub/src/activities/receive/post.rs b/crates/apub_receive/src/activities/receive/post.rs similarity index 99% rename from crates/apub/src/activities/receive/post.rs rename to crates/apub_receive/src/activities/receive/post.rs index 2f4290d0b..07f6a6653 100644 --- a/crates/apub/src/activities/receive/post.rs +++ b/crates/apub_receive/src/activities/receive/post.rs @@ -1,9 +1,6 @@ use crate::{ activities::receive::get_actor_as_person, inbox::receive_for_community::verify_mod_activity, - objects::FromApub, - ActorType, - PageExt, }; use activitystreams::{ activity::{Announce, Create, Dislike, Like, Update}, @@ -11,6 +8,7 @@ use activitystreams::{ }; use anyhow::Context; use lemmy_api_common::{blocking, post::PostResponse}; +use lemmy_apub::{objects::FromApub, ActorType, PageExt}; use lemmy_db_queries::{source::post::Post_, ApubObject, Crud, Likeable}; use lemmy_db_schema::{ source::{ diff --git a/crates/apub/src/activities/receive/post_undo.rs b/crates/apub_receive/src/activities/receive/post_undo.rs similarity index 100% rename from crates/apub/src/activities/receive/post_undo.rs rename to crates/apub_receive/src/activities/receive/post_undo.rs diff --git a/crates/apub/src/activities/receive/private_message.rs b/crates/apub_receive/src/activities/receive/private_message.rs similarity index 98% rename from crates/apub/src/activities/receive/private_message.rs rename to crates/apub_receive/src/activities/receive/private_message.rs index 6d90e8681..6be1a0415 100644 --- a/crates/apub/src/activities/receive/private_message.rs +++ b/crates/apub_receive/src/activities/receive/private_message.rs @@ -1,11 +1,4 @@ -use crate::{ - activities::receive::verify_activity_domains_valid, - check_is_apub_id_valid, - fetcher::person::get_or_fetch_and_upsert_person, - inbox::get_activity_to_and_cc, - objects::FromApub, - NoteExt, -}; +use crate::activities::receive::verify_activity_domains_valid; use activitystreams::{ activity::{ActorAndObjectRefExt, Create, Delete, Undo, Update}, base::{AsBase, ExtendsExt}, @@ -14,6 +7,13 @@ use activitystreams::{ }; use anyhow::{anyhow, Context}; use lemmy_api_common::{blocking, person::PrivateMessageResponse}; +use lemmy_apub::{ + check_is_apub_id_valid, + fetcher::person::get_or_fetch_and_upsert_person, + get_activity_to_and_cc, + objects::FromApub, + NoteExt, +}; use lemmy_db_queries::source::private_message::PrivateMessage_; use lemmy_db_schema::source::private_message::PrivateMessage; use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView}; diff --git a/crates/apub/src/http/comment.rs b/crates/apub_receive/src/http/comment.rs similarity index 90% rename from crates/apub/src/http/comment.rs rename to crates/apub_receive/src/http/comment.rs index 4f63d89d3..001879e00 100644 --- a/crates/apub/src/http/comment.rs +++ b/crates/apub_receive/src/http/comment.rs @@ -1,10 +1,8 @@ -use crate::{ - http::{create_apub_response, create_apub_tombstone_response}, - objects::ToApub, -}; +use crate::http::{create_apub_response, create_apub_tombstone_response}; use actix_web::{body::Body, web, web::Path, HttpResponse}; use diesel::result::Error::NotFound; use lemmy_api_common::blocking; +use lemmy_apub::objects::ToApub; use lemmy_db_queries::Crud; use lemmy_db_schema::{source::comment::Comment, CommentId}; use lemmy_utils::LemmyError; diff --git a/crates/apub/src/http/community.rs b/crates/apub_receive/src/http/community.rs similarity index 98% rename from crates/apub/src/http/community.rs rename to crates/apub_receive/src/http/community.rs index 4d3d8481d..1d5ae906e 100644 --- a/crates/apub/src/http/community.rs +++ b/crates/apub_receive/src/http/community.rs @@ -1,10 +1,4 @@ -use crate::{ - extensions::context::lemmy_context, - generate_moderators_url, - http::{create_apub_response, create_apub_tombstone_response}, - objects::ToApub, - ActorType, -}; +use crate::http::{create_apub_response, create_apub_tombstone_response}; use activitystreams::{ base::{AnyBase, BaseExt}, collection::{CollectionExt, OrderedCollection, UnorderedCollection}, @@ -12,6 +6,12 @@ use activitystreams::{ }; use actix_web::{body::Body, web, HttpResponse}; use lemmy_api_common::blocking; +use lemmy_apub::{ + extensions::context::lemmy_context, + generate_moderators_url, + objects::ToApub, + ActorType, +}; use lemmy_db_queries::source::{activity::Activity_, community::Community_}; use lemmy_db_schema::source::{activity::Activity, community::Community}; use lemmy_db_views_actor::{ diff --git a/crates/apub/src/http/mod.rs b/crates/apub_receive/src/http/mod.rs similarity index 97% rename from crates/apub/src/http/mod.rs rename to crates/apub_receive/src/http/mod.rs index 5d0cf71f2..531c37890 100644 --- a/crates/apub/src/http/mod.rs +++ b/crates/apub_receive/src/http/mod.rs @@ -1,7 +1,7 @@ -use crate::APUB_JSON_CONTENT_TYPE; use actix_web::{body::Body, web, HttpResponse}; use http::StatusCode; use lemmy_api_common::blocking; +use lemmy_apub::APUB_JSON_CONTENT_TYPE; use lemmy_db_queries::source::activity::Activity_; use lemmy_db_schema::source::activity::Activity; use lemmy_utils::{settings::structs::Settings, LemmyError}; diff --git a/crates/apub/src/http/person.rs b/crates/apub_receive/src/http/person.rs similarity index 93% rename from crates/apub/src/http/person.rs rename to crates/apub_receive/src/http/person.rs index 6a5a9a27b..69598ec2a 100644 --- a/crates/apub/src/http/person.rs +++ b/crates/apub_receive/src/http/person.rs @@ -1,15 +1,11 @@ -use crate::{ - extensions::context::lemmy_context, - http::{create_apub_response, create_apub_tombstone_response}, - objects::ToApub, - ActorType, -}; +use crate::http::{create_apub_response, create_apub_tombstone_response}; use activitystreams::{ base::BaseExt, collection::{CollectionExt, OrderedCollection}, }; use actix_web::{body::Body, web, HttpResponse}; use lemmy_api_common::blocking; +use lemmy_apub::{extensions::context::lemmy_context, objects::ToApub, ActorType}; use lemmy_db_queries::source::person::Person_; use lemmy_db_schema::source::person::Person; use lemmy_utils::LemmyError; diff --git a/crates/apub/src/http/post.rs b/crates/apub_receive/src/http/post.rs similarity index 89% rename from crates/apub/src/http/post.rs rename to crates/apub_receive/src/http/post.rs index 324bb7da9..45a0191eb 100644 --- a/crates/apub/src/http/post.rs +++ b/crates/apub_receive/src/http/post.rs @@ -1,10 +1,8 @@ -use crate::{ - http::{create_apub_response, create_apub_tombstone_response}, - objects::ToApub, -}; +use crate::http::{create_apub_response, create_apub_tombstone_response}; use actix_web::{body::Body, web, HttpResponse}; use diesel::result::Error::NotFound; use lemmy_api_common::blocking; +use lemmy_apub::objects::ToApub; use lemmy_db_queries::Crud; use lemmy_db_schema::{source::post::Post, PostId}; use lemmy_utils::LemmyError; diff --git a/crates/apub/src/inbox/community_inbox.rs b/crates/apub_receive/src/inbox/community_inbox.rs similarity index 91% rename from crates/apub/src/inbox/community_inbox.rs rename to crates/apub_receive/src/inbox/community_inbox.rs index 61123d06f..486636caa 100644 --- a/crates/apub/src/inbox/community_inbox.rs +++ b/crates/apub_receive/src/inbox/community_inbox.rs @@ -3,7 +3,6 @@ use crate::{ inbox::{ assert_activity_not_local, get_activity_id, - get_activity_to_and_cc, inbox_verify_http_signature, is_activity_already_known, receive_for_community::{ @@ -18,9 +17,6 @@ use crate::{ }, verify_is_addressed_to_public, }, - insert_activity, - ActorType, - CommunityType, }; use activitystreams::{ activity::{kind::FollowType, ActorAndObject, Follow, Undo}, @@ -30,15 +26,18 @@ use activitystreams::{ use actix_web::{web, HttpRequest, HttpResponse}; use anyhow::{anyhow, Context}; use lemmy_api_common::blocking; -use lemmy_db_queries::{source::community::Community_, ApubObject, DbPool, Followable}; -use lemmy_db_schema::{ - source::{ - community::{Community, CommunityFollower, CommunityFollowerForm}, - person::Person, - }, - CommunityId, +use lemmy_apub::{ + check_community_or_site_ban, + get_activity_to_and_cc, + insert_activity, + ActorType, + CommunityType, +}; +use lemmy_db_queries::{source::community::Community_, ApubObject, Followable}; +use lemmy_db_schema::source::{ + community::{Community, CommunityFollower, CommunityFollowerForm}, + person::Person, }; -use lemmy_db_views_actor::community_person_ban_view::CommunityPersonBanView; use lemmy_utils::{location_info, LemmyError}; use lemmy_websocket::LemmyContext; use log::info; @@ -318,21 +317,3 @@ async fn handle_undo_follow( Ok(()) } - -pub(crate) async fn check_community_or_site_ban( - person: &Person, - community_id: CommunityId, - pool: &DbPool, -) -> Result<(), LemmyError> { - if person.banned { - return Err(anyhow!("Person is banned from site").into()); - } - let person_id = person.id; - let is_banned = - move |conn: &'_ _| CommunityPersonBanView::get(conn, person_id, community_id).is_ok(); - if blocking(pool, is_banned).await? { - return Err(anyhow!("Person is banned from community").into()); - } - - Ok(()) -} diff --git a/crates/apub/src/inbox/mod.rs b/crates/apub_receive/src/inbox/mod.rs similarity index 86% rename from crates/apub/src/inbox/mod.rs rename to crates/apub_receive/src/inbox/mod.rs index 72b00c334..453781fde 100644 --- a/crates/apub/src/inbox/mod.rs +++ b/crates/apub_receive/src/inbox/mod.rs @@ -1,18 +1,19 @@ -use crate::{ - check_is_apub_id_valid, - extensions::signatures::verify_signature, - fetcher::get_or_fetch_and_upsert_actor, - ActorType, -}; use activitystreams::{ activity::ActorAndObjectRefExt, base::{AsBase, BaseExt, Extends}, - object::{AsObject, ObjectExt}, + object::AsObject, public, }; use actix_web::HttpRequest; use anyhow::{anyhow, Context}; use lemmy_api_common::blocking; +use lemmy_apub::{ + check_is_apub_id_valid, + extensions::signatures::verify_signature, + fetcher::get_or_fetch_and_upsert_actor, + get_activity_to_and_cc, + ActorType, +}; use lemmy_db_queries::{ source::{activity::Activity_, community::Community_}, ApubObject, @@ -56,34 +57,6 @@ pub(crate) async fn is_activity_already_known( } } -pub(crate) fn get_activity_to_and_cc(activity: &T) -> Vec -where - T: AsObject, -{ - let mut to_and_cc = vec![]; - if let Some(to) = activity.to() { - let to = to.to_owned().unwrap_to_vec(); - let mut to = to - .iter() - .map(|t| t.as_xsd_any_uri()) - .flatten() - .map(|t| t.to_owned()) - .collect(); - to_and_cc.append(&mut to); - } - if let Some(cc) = activity.cc() { - let cc = cc.to_owned().unwrap_to_vec(); - let mut cc = cc - .iter() - .map(|c| c.as_xsd_any_uri()) - .flatten() - .map(|c| c.to_owned()) - .collect(); - to_and_cc.append(&mut cc); - } - to_and_cc -} - pub(crate) fn verify_is_addressed_to_public(activity: &T) -> Result<(), LemmyError> where T: AsBase + AsObject + ActorAndObjectRefExt, diff --git a/crates/apub/src/inbox/person_inbox.rs b/crates/apub_receive/src/inbox/person_inbox.rs similarity index 99% rename from crates/apub/src/inbox/person_inbox.rs rename to crates/apub_receive/src/inbox/person_inbox.rs index 99c0f18f5..42567ab63 100644 --- a/crates/apub/src/inbox/person_inbox.rs +++ b/crates/apub_receive/src/inbox/person_inbox.rs @@ -16,12 +16,9 @@ use crate::{ receive_unhandled_activity, verify_activity_domains_valid, }, - check_is_apub_id_valid, - fetcher::community::get_or_fetch_and_upsert_community, inbox::{ assert_activity_not_local, get_activity_id, - get_activity_to_and_cc, inbox_verify_http_signature, is_activity_already_known, is_addressed_to_community_followers, @@ -38,8 +35,6 @@ use crate::{ }, verify_is_addressed_to_public, }, - insert_activity, - ActorType, }; use activitystreams::{ activity::{Accept, ActorAndObject, Announce, Create, Delete, Follow, Remove, Undo, Update}, @@ -50,6 +45,13 @@ use actix_web::{web, HttpRequest, HttpResponse}; use anyhow::{anyhow, Context}; use diesel::NotFound; use lemmy_api_common::blocking; +use lemmy_apub::{ + check_is_apub_id_valid, + fetcher::community::get_or_fetch_and_upsert_community, + get_activity_to_and_cc, + insert_activity, + ActorType, +}; use lemmy_db_queries::{source::person::Person_, ApubObject, Followable}; use lemmy_db_schema::source::{ community::{Community, CommunityFollower}, diff --git a/crates/apub/src/inbox/receive_for_community.rs b/crates/apub_receive/src/inbox/receive_for_community.rs similarity index 99% rename from crates/apub/src/inbox/receive_for_community.rs rename to crates/apub_receive/src/inbox/receive_for_community.rs index 5fe2bdf7a..181a86d12 100644 --- a/crates/apub/src/inbox/receive_for_community.rs +++ b/crates/apub_receive/src/inbox/receive_for_community.rs @@ -31,15 +31,7 @@ use crate::{ receive_unhandled_activity, verify_activity_domains_valid, }, - fetcher::{ - objects::{get_or_fetch_and_insert_comment, get_or_fetch_and_insert_post}, - person::get_or_fetch_and_upsert_person, - }, - find_post_or_comment_by_id, - generate_moderators_url, inbox::verify_is_addressed_to_public, - CommunityType, - PostOrComment, }; use activitystreams::{ activity::{ @@ -62,6 +54,16 @@ use activitystreams::{ use anyhow::{anyhow, Context}; use diesel::result::Error::NotFound; use lemmy_api_common::blocking; +use lemmy_apub::{ + fetcher::{ + objects::{get_or_fetch_and_insert_comment, get_or_fetch_and_insert_post}, + person::get_or_fetch_and_upsert_person, + }, + find_post_or_comment_by_id, + generate_moderators_url, + CommunityType, + PostOrComment, +}; use lemmy_db_queries::{source::community::CommunityModerator_, ApubObject, Crud, Joinable}; use lemmy_db_schema::{ source::{ diff --git a/crates/apub/src/inbox/shared_inbox.rs b/crates/apub_receive/src/inbox/shared_inbox.rs similarity index 91% rename from crates/apub/src/inbox/shared_inbox.rs rename to crates/apub_receive/src/inbox/shared_inbox.rs index 710f34b44..cd4ae145a 100644 --- a/crates/apub/src/inbox/shared_inbox.rs +++ b/crates/apub_receive/src/inbox/shared_inbox.rs @@ -1,21 +1,18 @@ -use crate::{ - inbox::{ - assert_activity_not_local, - community_inbox::{community_receive_message, CommunityAcceptedActivities}, - get_activity_id, - get_activity_to_and_cc, - inbox_verify_http_signature, - is_activity_already_known, - is_addressed_to_community_followers, - is_addressed_to_local_person, - person_inbox::{person_receive_message, PersonAcceptedActivities}, - }, - insert_activity, +use crate::inbox::{ + assert_activity_not_local, + community_inbox::{community_receive_message, CommunityAcceptedActivities}, + get_activity_id, + inbox_verify_http_signature, + is_activity_already_known, + is_addressed_to_community_followers, + is_addressed_to_local_person, + person_inbox::{person_receive_message, PersonAcceptedActivities}, }; use activitystreams::{activity::ActorAndObject, prelude::*}; use actix_web::{web, HttpRequest, HttpResponse}; use anyhow::Context; use lemmy_api_common::blocking; +use lemmy_apub::{get_activity_to_and_cc, insert_activity}; use lemmy_db_queries::{ApubObject, DbPool}; use lemmy_db_schema::source::community::Community; use lemmy_utils::{location_info, LemmyError}; diff --git a/crates/apub_receive/src/lib.rs b/crates/apub_receive/src/lib.rs new file mode 100644 index 000000000..69c32b35a --- /dev/null +++ b/crates/apub_receive/src/lib.rs @@ -0,0 +1,4 @@ +mod activities; +mod http; +mod inbox; +pub mod routes; diff --git a/crates/apub/src/routes.rs b/crates/apub_receive/src/routes.rs similarity index 98% rename from crates/apub/src/routes.rs rename to crates/apub_receive/src/routes.rs index fecf333fa..d112afbea 100644 --- a/crates/apub/src/routes.rs +++ b/crates/apub_receive/src/routes.rs @@ -17,10 +17,10 @@ use crate::{ person_inbox::person_inbox, shared_inbox::shared_inbox, }, - APUB_JSON_CONTENT_TYPE, }; use actix_web::*; use http_signature_normalization_actix::digest::middleware::VerifyDigest; +use lemmy_apub::APUB_JSON_CONTENT_TYPE; use lemmy_utils::settings::structs::Settings; use sha2::{Digest, Sha256}; diff --git a/src/main.rs b/src/main.rs index f8838bfb0..5b8a7ec1d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,7 +91,7 @@ async fn main() -> Result<(), LemmyError> { .data(context) // The routes .configure(|cfg| api_routes::config(cfg, &rate_limiter)) - .configure(lemmy_apub::routes::config) + .configure(lemmy_apub_receive::routes::config) .configure(feeds::config) .configure(|cfg| images::config(cfg, &rate_limiter)) .configure(nodeinfo::config)