1
0
Fork 0
forked from alemi/upub

fix: deliveries will try to resolve actor inbox

This commit is contained in:
əlemi 2024-04-18 07:02:42 +02:00
parent 2073015b7f
commit a4c555d0c5

View file

@ -4,7 +4,7 @@ use apb::{BaseMut, CollectionMut, CollectionPageMut};
use openssl::rsa::Rsa; use openssl::rsa::Rsa;
use sea_orm::{ColumnTrait, Condition, DatabaseConnection, EntityTrait, QueryFilter, QuerySelect, SelectColumns, Set}; use sea_orm::{ColumnTrait, Condition, DatabaseConnection, EntityTrait, QueryFilter, QuerySelect, SelectColumns, Set};
use crate::{model, routes::activitypub::jsonld::LD}; use crate::{model, routes::activitypub::jsonld::LD, server::fetcher::Fetcher};
use super::dispatcher::Dispatcher; use super::dispatcher::Dispatcher;
@ -176,23 +176,31 @@ impl Context {
} }
pub async fn deliver_to(&self, aid: &str, from: &str, targets: &[String]) -> crate::Result<()> { pub async fn deliver_to(&self, aid: &str, from: &str, targets: &[String]) -> crate::Result<()> {
let deliveries : Vec<model::delivery::ActiveModel> = targets let mut deliveries = Vec::new();
.iter() for target in targets.iter()
.filter(|to| !to.is_empty()) .filter(|to| !to.is_empty())
.filter(|to| Context::server(to) != self.base()) .filter(|to| Context::server(to) != self.base())
.filter(|to| to != &apb::target::PUBLIC) .filter(|to| to != &apb::target::PUBLIC)
.map(|to| model::delivery::ActiveModel { {
id: sea_orm::ActiveValue::NotSet, // TODO fetch concurrently
actor: Set(from.to_string()), match self.fetch_user(target).await {
// TODO we should resolve each user by id and check its inbox because we can't assume Ok(model::user::Model { inbox: Some(inbox), .. }) => deliveries.push(
// it's /users/{id}/inbox for every software, but oh well it's waaaaay easier now model::delivery::ActiveModel {
target: Set(format!("{}/inbox", to)), id: sea_orm::ActiveValue::NotSet,
activity: Set(aid.to_string()), actor: Set(from.to_string()),
created: Set(chrono::Utc::now()), // TODO we should resolve each user by id and check its inbox because we can't assume
not_before: Set(chrono::Utc::now()), // it's /users/{id}/inbox for every software, but oh well it's waaaaay easier now
attempt: Set(0), target: Set(inbox),
}) activity: Set(aid.to_string()),
.collect(); created: Set(chrono::Utc::now()),
not_before: Set(chrono::Utc::now()),
attempt: Set(0),
}
),
Ok(_) => tracing::error!("resolved target but missing inbox: '{target}', skipping delivery"),
Err(e) => tracing::error!("failed resolving target inbox: {e}, skipping delivery to '{target}'"),
}
}
if !deliveries.is_empty() { if !deliveries.is_empty() {
model::delivery::Entity::insert_many(deliveries) model::delivery::Entity::insert_many(deliveries)