wip: try to fix inbox routing
This commit is contained in:
parent
51bb80a966
commit
c57a3db3b1
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
*/
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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>(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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)),
|
||||
|
|
Loading…
Reference in New Issue