wip: try to fix inbox routing

This commit is contained in:
Felix Ableitner 2021-07-04 00:59:42 +02:00
parent 51bb80a966
commit c57a3db3b1
11 changed files with 63 additions and 18 deletions

View File

@ -9,7 +9,7 @@
"scripts": {
"lint": "tsc --noEmit && eslint --report-unused-disable-directives --ext .js,.ts,.tsx src",
"fix": "prettier --write src && eslint --fix src",
"api-test": "jest src/ -i --verbose"
"api-test": "jest src/post.spec.ts -i --verbose"
},
"devDependencies": {
"@types/jest": "^26.0.23",

View File

@ -3,6 +3,7 @@ set -e
export LEMMY_TEST_SEND_SYNC=1
export RUST_BACKTRACE=1
export RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_apub_receive=debug,lemmy_db_queries=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
for INSTANCE in lemmy_alpha lemmy_beta lemmy_gamma lemmy_delta lemmy_epsilon; do
psql "${LEMMY_DATABASE_URL}/lemmy" -c "DROP DATABASE IF EXISTS $INSTANCE"

View File

@ -88,7 +88,7 @@ test('Create a post', async () => {
let searchEpsilon = await searchPost(epsilon, postRes.post_view.post);
expect(searchEpsilon.posts[0]).toBeUndefined();
});
/*
test('Create a post in a non-existent community', async () => {
let postRes = await createPost(alpha, -2);
expect(postRes).toStrictEqual({ error: 'couldnt_create_post' });
@ -363,3 +363,4 @@ test('Enforce community ban for federated user', async () => {
let betaPost = searchBeta.posts[0];
expect(betaPost).toBeDefined();
});
*/

View File

@ -49,7 +49,7 @@ where
if check_is_apub_id_valid(&inbox, false).is_ok() {
debug!(
"Sending activity {:?} to {}",
&activity.id_unchecked(),
&activity.id_unchecked().map(ToString::to_string),
&inbox
);
send_activity_internal(context, activity, creator, vec![inbox], true, true).await?;
@ -88,7 +88,7 @@ where
.collect();
debug!(
"Sending activity {:?} to followers of {}",
&activity.id_unchecked().map(|i| i.to_string()),
&activity.id_unchecked().map(ToString::to_string),
&community.actor_id
);
@ -127,7 +127,7 @@ where
check_is_apub_id_valid(&inbox, false)?;
debug!(
"Sending activity {:?} to community {}",
&activity.id_unchecked(),
&activity.id_unchecked().map(ToString::to_string),
&community.actor_id
);
// dont send to object_actor here, as that is responsibility of the community itself
@ -262,6 +262,7 @@ async fn do_send(task: SendActivityTask, client: &Client) -> Result<(), Error> {
task.private_key.to_owned(),
)
.await;
dbg!(&result);
if let Err(e) = result {
warn!("{}", e);

View File

@ -7,6 +7,7 @@ use lemmy_db_views_actor::community_view::CommunityView;
use lemmy_utils::LemmyError;
use lemmy_websocket::LemmyContext;
use url::Url;
use lemmy_apub_lib::ActivityHandler;
pub mod comment;
pub mod community;

View File

@ -18,12 +18,12 @@ pub struct CreatePost {
}
#[async_trait::async_trait(?Send)]
impl ActivityHandler for LemmyActivity<CreatePost> {
impl ActivityHandler for CreatePost {
type Actor = Person;
async fn verify(&self, _context: &LemmyContext) -> Result<(), LemmyError> {
verify_domains_match(self.id_unchecked(), &self.actor)?;
self.inner.object.id(self.actor.as_str())?;
self.object.id(self.actor.as_str())?;
check_is_apub_id_valid(&self.actor, false)
}

View File

@ -57,11 +57,18 @@ pub(crate) async fn get_apub_community_http(
/// Handler for all incoming receive to community inboxes.
pub async fn community_inbox(
request: HttpRequest,
input: web::Json<LemmyActivity<GroupInboxActivities>>,
path: web::Path<String>,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> {
receive_activity(request, input.into_inner(), Some(path.0), context).await
dbg!(123);
dbg!(&request);
dbg!(request.resource_map());
/*
let activity: LemmyActivity<SharedInboxActivities>= serde_json::from_str(&input)?;
dbg!(&activity);
receive_activity(request, activity, None, context).await
*/
Ok(HttpResponse::Unauthorized().finish())
}
/// Returns an empty followers collection, only populating the size (for privacy).

View File

@ -49,6 +49,7 @@ use lemmy_websocket::LemmyContext;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)]
pub enum PersonInboxActivities {
AcceptFollowCommunity(AcceptFollowCommunity),
CreatePrivateMessage(CreatePrivateMessage),
@ -59,6 +60,7 @@ pub enum PersonInboxActivities {
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)]
pub enum GroupInboxActivities {
FollowCommunity(FollowCommunity),
UndoFollowCommunity(UndoFollowCommunity),
@ -94,6 +96,7 @@ pub enum GroupInboxActivities {
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)]
pub enum SharedInboxActivities {
// received by person
AcceptFollowCommunity(AcceptFollowCommunity),
@ -141,7 +144,10 @@ impl ActivityHandler for SharedInboxActivities {
type Actor = lemmy_apub::fetcher::Actor;
async fn verify(&self, context: &LemmyContext) -> Result<(), LemmyError> {
self.verify(context).await
match self.inner {
SharedInboxActivities::CreatePost(p) => p.verify(context),
_ => unimplemented!()
}
}
async fn receive(

View File

@ -1,8 +1,7 @@
use actix_web::{body::Body, web, HttpRequest, HttpResponse};
use actix_web::{body::Body, web, HttpRequest, HttpResponse, FromRequest};
use http::StatusCode;
use serde::{Deserialize, Serialize};
use url::Url;
use crate::{activities::LemmyActivity, http::inbox_enums::SharedInboxActivities};
use anyhow::{anyhow, Context};
use lemmy_api_common::blocking;
@ -19,6 +18,12 @@ use lemmy_db_schema::source::activity::Activity;
use lemmy_utils::{location_info, settings::structs::Settings, LemmyError};
use lemmy_websocket::LemmyContext;
use std::fmt::Debug;
use actix_web::dev::Payload;
use futures::StreamExt;
use crate::activities::post::create::CreatePost;
use actix_web::web::Bytes;
use std::io::Read;
use crate::activities::post::like::LikePost;
pub mod comment;
pub mod community;
@ -26,12 +31,30 @@ pub mod inbox_enums;
pub mod person;
pub mod post;
#[derive(Debug, serde::Deserialize)]
#[serde(untagged)]
enum Ac {
CreatePost(CreatePost),
LikePost(LikePost),
}
pub async fn shared_inbox(
request: HttpRequest,
input: web::Json<LemmyActivity<SharedInboxActivities>>,
mut body: web::Payload,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> {
receive_activity(request, input.into_inner(), None, context).await
let mut bytes = web::BytesMut::new();
while let Some(item) = body.next().await {
bytes.extend_from_slice(&item?);
}
let mut unparsed: String = String::new();
Bytes::from(bytes).as_ref().read_to_string(&mut unparsed)?;
dbg!(&unparsed);
let activity: LemmyActivity<SharedInboxActivities> = serde_json::from_str(&unparsed)?;
let request_counter = &mut 0;
let actor: Actor =
get_or_fetch_and_upsert_actor(&activity.actor, &context, request_counter).await?;
Ok(HttpResponse::Ok().finish())
}
async fn receive_activity<T>(

View File

@ -49,11 +49,18 @@ pub(crate) async fn get_apub_person_http(
pub async fn person_inbox(
request: HttpRequest,
input: web::Json<LemmyActivity<PersonInboxActivities>>,
path: web::Path<String>,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> {
receive_activity(request, input.into_inner(), Some(path.0), context).await
dbg!(123);
dbg!(&request);
dbg!(request.resource_map());
/*
let activity: LemmyActivity<SharedInboxActivities>= serde_json::from_str(&input)?;
dbg!(&activity);
receive_activity(request, activity, None, context).await
*/
Ok(HttpResponse::Unauthorized().finish())
}
pub(crate) async fn get_apub_person_outbox(

View File

@ -70,8 +70,6 @@ pub fn config(cfg: &mut web::ServiceConfig) {
// Inboxes dont work with the header guard for some reason.
.service(
web::scope("/")
.wrap(digest_verifier)
.guard(header_guard_content_type)
.route("/c/{community_name}/inbox", web::post().to(community_inbox))
.route("/u/{user_name}/inbox", web::post().to(person_inbox))
.route("/inbox", web::post().to(shared_inbox)),