strip session-added comments
This commit is contained in:
@@ -10,11 +10,6 @@ use k_ap::ActivityPubService;
|
||||
|
||||
use crate::urls::actor_url;
|
||||
|
||||
/// Broadcasts the actor `Delete` to the user's accepted followers.
|
||||
///
|
||||
/// k-ap only enqueues the per-inbox deliveries; they are signed later from the
|
||||
/// tombstoned user row and keypair, which the purge keeps until the tombstone
|
||||
/// cleanup (see `AccountPurger`).
|
||||
pub struct ApDeletionNotifier {
|
||||
service: Arc<ActivityPubService>,
|
||||
instance: InstanceIdentity,
|
||||
|
||||
@@ -63,9 +63,6 @@ impl EventHandler for ActivityPubEventHandler {
|
||||
}
|
||||
|
||||
async fn handle(&self, event: &DomainEvent) -> Result<(), DomainError> {
|
||||
// A deleted account must not speak again: its queued events would
|
||||
// otherwise sign and send from the tombstone after the Delete. Only
|
||||
// the Delete itself (sent by the deletion notifier) goes out.
|
||||
if let Some(author) = self.outbound_author(event)
|
||||
&& self.is_tombstoned(&author).await
|
||||
{
|
||||
@@ -173,8 +170,6 @@ impl EventHandler for ActivityPubEventHandler {
|
||||
}
|
||||
|
||||
impl ActivityPubEventHandler {
|
||||
/// The local account an outbound activity would be sent as. A queued
|
||||
/// delivery counts unless it is the account's `Delete`.
|
||||
fn outbound_author(&self, event: &DomainEvent) -> Option<UserId> {
|
||||
match event {
|
||||
DomainEvent::ReviewLogged { user_id, .. }
|
||||
|
||||
@@ -14,7 +14,6 @@ pub struct RemoteReviewUpdate<'a> {
|
||||
pub spoilers: bool,
|
||||
}
|
||||
|
||||
/// A remote review to persist, with the events that ride the same write.
|
||||
pub struct NewRemoteReview<'a> {
|
||||
pub review: &'a Review,
|
||||
pub ap_id: &'a str,
|
||||
|
||||
@@ -159,7 +159,6 @@ impl ApObjectHandler for ReviewObjectHandler {
|
||||
spoilers: obj.contains_spoilers,
|
||||
});
|
||||
|
||||
// The enrichment request rides the review write (one transaction).
|
||||
let events: Vec<DomainEvent> = obj
|
||||
.external_metadata_id
|
||||
.as_ref()
|
||||
|
||||
@@ -39,7 +39,6 @@ impl CompositeSocialAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
/// Best-effort publish for writes k_ap owns (no shared transaction).
|
||||
async fn announce(&self, events: &[DomainEvent]) {
|
||||
for event in events {
|
||||
if let Err(e) = self.event_publisher.publish(event).await {
|
||||
@@ -84,8 +83,6 @@ impl SocialCommand for CompositeSocialAdapter {
|
||||
SocialIdentity::Remote { actor_url } => actor_url.clone(),
|
||||
},
|
||||
};
|
||||
// Not atomic: k_ap owns the transaction, so the events are published
|
||||
// best-effort after its write succeeds.
|
||||
self.ap_service
|
||||
.follow(follower.value(), &handle)
|
||||
.await
|
||||
@@ -102,7 +99,6 @@ impl SocialCommand for CompositeSocialAdapter {
|
||||
) -> Result<(), DomainError> {
|
||||
match target {
|
||||
SocialIdentity::Local(_) => self.local.unfollow(follower, target, events).await,
|
||||
// Not atomic: k_ap owns the transaction.
|
||||
SocialIdentity::Remote { .. } => {
|
||||
self.ap_service
|
||||
.unfollow(follower.value(), &self.instance.actor_url_of(target))
|
||||
@@ -122,7 +118,6 @@ impl SocialCommand for CompositeSocialAdapter {
|
||||
) -> Result<(), DomainError> {
|
||||
match requester {
|
||||
SocialIdentity::Local(_) => self.local.accept_follow(owner, requester, events).await,
|
||||
// Not atomic: k_ap owns the transaction.
|
||||
SocialIdentity::Remote { .. } => {
|
||||
self.ap_service
|
||||
.accept_follower(owner.value(), &self.instance.actor_url_of(requester))
|
||||
@@ -142,7 +137,6 @@ impl SocialCommand for CompositeSocialAdapter {
|
||||
) -> Result<(), DomainError> {
|
||||
match requester {
|
||||
SocialIdentity::Local(_) => self.local.reject_follow(owner, requester, events).await,
|
||||
// Not atomic: k_ap owns the transaction.
|
||||
SocialIdentity::Remote { .. } => {
|
||||
self.ap_service
|
||||
.reject_follower(owner.value(), &self.instance.actor_url_of(requester))
|
||||
@@ -162,7 +156,6 @@ impl SocialCommand for CompositeSocialAdapter {
|
||||
) -> Result<(), DomainError> {
|
||||
match follower {
|
||||
SocialIdentity::Local(_) => self.local.remove_follower(owner, follower, events).await,
|
||||
// Not atomic: k_ap owns the transaction.
|
||||
SocialIdentity::Remote { .. } => {
|
||||
self.ap_service
|
||||
.remove_follower(owner.value(), &self.instance.actor_url_of(follower))
|
||||
@@ -174,7 +167,6 @@ impl SocialCommand for CompositeSocialAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
/// Not atomic: k_ap owns the transaction.
|
||||
async fn block(
|
||||
&self,
|
||||
blocker: &UserId,
|
||||
@@ -190,7 +182,6 @@ impl SocialCommand for CompositeSocialAdapter {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Not atomic: k_ap owns the transaction.
|
||||
async fn unblock(
|
||||
&self,
|
||||
blocker: &UserId,
|
||||
|
||||
@@ -8,9 +8,6 @@ use axum::{
|
||||
};
|
||||
use domain::{ports::UserRepository, value_objects::UserId};
|
||||
|
||||
/// Answers `410 Gone` for the per-user ActivityPub endpoints of a deleted
|
||||
/// account. k-ap resolves tombstones so it can sign the account's `Delete`
|
||||
/// deliveries; this keeps that from making the actor look alive.
|
||||
pub async fn tombstone_gate(
|
||||
State(users): State<Arc<dyn UserRepository>>,
|
||||
request: Request,
|
||||
@@ -27,9 +24,6 @@ pub async fn tombstone_gate(
|
||||
next.run(request).await
|
||||
}
|
||||
|
||||
/// The user id in any `/users/{id}/...` path (outbox, inbox, collections,
|
||||
/// content objects such as `/users/{id}/reviews/{rid}`). The bare actor path
|
||||
/// has its own tombstone response.
|
||||
pub fn gated_user(path: &str) -> Option<uuid::Uuid> {
|
||||
let rest = path.strip_prefix("/users/")?;
|
||||
let (id, endpoint) = rest.split_once('/')?;
|
||||
|
||||
@@ -64,10 +64,6 @@ impl DomainUserRepoAdapter {
|
||||
impl ApUserRepository for DomainUserRepoAdapter {
|
||||
async fn find_by_id(&self, id: uuid::Uuid) -> anyhow::Result<Option<ApUser>> {
|
||||
let user_id = UserId::from_uuid(id);
|
||||
// A deleted account still resolves here, so k-ap can sign the queued
|
||||
// `Delete` deliveries until the tombstone cleanup. Username lookups
|
||||
// below stay live-only, and the AP endpoints answer 410 for it
|
||||
// (`tombstone_gate`, `actor_document_response`).
|
||||
let user = match self.repo.find_by_id(&user_id).await? {
|
||||
Some(u) => u,
|
||||
None => match self.repo.find_tombstoned_by_id(&user_id).await? {
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
//! Outbound activity ids across a redelivered event, through the real k-ap
|
||||
//! `ActivityPubService` (delivery captured via its `EventPublisher` seam).
|
||||
//!
|
||||
//! k-ap 0.5.0 derives Create ids from the object id (UUIDv5,
|
||||
//! `service/broadcast.rs:285-288`) but mints Update/Delete/Move/actor-update ids
|
||||
//! randomly (`broadcast.rs:81,129,157,210,321,343,377` -> `url_scheme.rs:53`,
|
||||
//! `Uuid::new_v4`) with no override.
|
||||
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
@@ -189,8 +181,6 @@ async fn activitypub_is_idempotent_when_run_twice() {
|
||||
assert_eq!(first, second, "a redelivered Create keeps its activity id");
|
||||
}
|
||||
|
||||
/// Characterises the k-ap 0.5.0 limitation recorded in ADR-0015. If k-ap starts
|
||||
/// minting deterministic Delete ids this fails: upgrade the ADR and flip it.
|
||||
#[tokio::test]
|
||||
async fn redelivered_delete_gets_a_fresh_activity_id_known_k_ap_limitation() {
|
||||
let mut h = harness().await;
|
||||
@@ -207,8 +197,6 @@ async fn redelivered_delete_gets_a_fresh_activity_id_known_k_ap_limitation() {
|
||||
assert_ne!(first, second);
|
||||
}
|
||||
|
||||
/// Queued events of a deleted account must not sign and send from its
|
||||
/// tombstone; the account's own Delete still goes out.
|
||||
#[tokio::test]
|
||||
async fn a_deleted_account_sends_nothing_but_its_delete() {
|
||||
let mut h = harness().await;
|
||||
@@ -240,7 +228,6 @@ async fn a_deleted_account_sends_nothing_but_its_delete() {
|
||||
signing_actor_id: h.user.value(),
|
||||
};
|
||||
|
||||
// The review repository panics if the handler gets past the guard.
|
||||
for event in [&logged, &added, &queued] {
|
||||
h.handler.handle(event).await.unwrap();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user