Split lemmy_apub crate into two parts apub and apub_receive
This commit is contained in:
parent
36a79e18cd
commit
722cdb78ba
35 changed files with 246 additions and 163 deletions
46
Cargo.lock
generated
46
Cargo.lock
generated
|
@ -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",
|
||||
|
|
|
@ -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" }
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
pub(crate) mod receive;
|
||||
pub mod send;
|
||||
|
|
|
@ -3,7 +3,7 @@ use lemmy_utils::LemmyError;
|
|||
use serde_json::json;
|
||||
use url::Url;
|
||||
|
||||
pub(crate) fn lemmy_context() -> Result<Vec<AnyBase>, LemmyError> {
|
||||
pub fn lemmy_context() -> Result<Vec<AnyBase>, LemmyError> {
|
||||
let context_ext = AnyBase::from_arbitrary_json(json!(
|
||||
{
|
||||
"sc": "http://schema.org#",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<String, String>,
|
||||
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(
|
||||
|
|
|
@ -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(())
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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<actor::ApActor<ApObject<actor::Group>>, GroupExtension, Pub
|
|||
/// Activitystreams type for person
|
||||
type PersonExt = Ext2<actor::ApActor<ApObject<actor::Person>>, PersonExtension, PublicKeyExtension>;
|
||||
/// Activitystreams type for post
|
||||
type PageExt = Ext1<ApObject<Page>, PageExtension>;
|
||||
type NoteExt = ApObject<Note>;
|
||||
pub type PageExt = Ext1<ApObject<Page>, PageExtension>;
|
||||
pub type NoteExt = ApObject<Note>;
|
||||
|
||||
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<DbUrl, LemmyError>
|
|||
Ok(Url::parse(&url)?.into())
|
||||
}
|
||||
|
||||
pub(crate) fn generate_moderators_url(community_id: &DbUrl) -> Result<DbUrl, LemmyError> {
|
||||
pub fn generate_moderators_url(community_id: &DbUrl) -> Result<DbUrl, LemmyError> {
|
||||
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<T>(
|
||||
pub async fn insert_activity<T>(
|
||||
ap_id: &Url,
|
||||
activity: T,
|
||||
local: bool,
|
||||
|
@ -318,7 +317,7 @@ where
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) enum PostOrComment {
|
||||
pub enum PostOrComment {
|
||||
Comment(Box<Comment>),
|
||||
Post(Box<Post>),
|
||||
}
|
||||
|
@ -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<PostOrComment, LemmyError> {
|
||||
|
@ -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<T, Kind>(activity: &T) -> Vec<Url>
|
||||
where
|
||||
T: AsObject<Kind>,
|
||||
{
|
||||
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
|
||||
}
|
||||
|
|
|
@ -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<Self::ApubType, LemmyError>;
|
||||
fn to_tombstone(&self) -> Result<Tombstone, LemmyError>;
|
||||
}
|
||||
|
||||
#[async_trait::async_trait(?Send)]
|
||||
pub(crate) trait FromApub {
|
||||
pub trait FromApub {
|
||||
type ApubType;
|
||||
/// Converts an object from ActivityPub type to Lemmy internal type.
|
||||
///
|
||||
|
|
45
crates/apub_receive/Cargo.toml
Normal file
45
crates/apub_receive/Cargo.toml
Normal file
|
@ -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"
|
||||
|
1
crates/apub_receive/src/activities/mod.rs
Normal file
1
crates/apub_receive/src/activities/mod.rs
Normal file
|
@ -0,0 +1 @@
|
|||
pub(crate) mod receive;
|
|
@ -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},
|
|
@ -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;
|
|
@ -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::{
|
|
@ -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};
|
|
@ -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;
|
|
@ -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::{
|
|
@ -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};
|
|
@ -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;
|
|
@ -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;
|
|
@ -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(())
|
||||
}
|
|
@ -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<T, Kind>(activity: &T) -> Vec<Url>
|
||||
where
|
||||
T: AsObject<Kind>,
|
||||
{
|
||||
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<T, Kind>(activity: &T) -> Result<(), LemmyError>
|
||||
where
|
||||
T: AsBase<Kind> + AsObject<Kind> + ActorAndObjectRefExt,
|
|
@ -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},
|
|
@ -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::{
|
|
@ -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};
|
4
crates/apub_receive/src/lib.rs
Normal file
4
crates/apub_receive/src/lib.rs
Normal file
|
@ -0,0 +1,4 @@
|
|||
mod activities;
|
||||
mod http;
|
||||
mod inbox;
|
||||
pub mod routes;
|
|
@ -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};
|
||||
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue