Start support for processing transient object
This commit is contained in:
parent
8dc0e1877b
commit
4f16e3b940
3 changed files with 35 additions and 3 deletions
18
app/boxes.py
18
app/boxes.py
|
@ -836,6 +836,20 @@ async def _process_note_object(
|
||||||
db_session.add(notif)
|
db_session.add(notif)
|
||||||
|
|
||||||
|
|
||||||
|
async def _process_transient_object(
|
||||||
|
db_session: AsyncSession,
|
||||||
|
raw_object: ap.RawObject,
|
||||||
|
from_actor: models.Actor,
|
||||||
|
) -> None:
|
||||||
|
ap_type = raw_object["type"]
|
||||||
|
if ap_type in ["Add", "Remove"]:
|
||||||
|
logger.info(f"Dropping unsupported {ap_type} object")
|
||||||
|
else:
|
||||||
|
logger.warning(f"Received unknown {ap_type} object")
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
async def save_to_inbox(
|
async def save_to_inbox(
|
||||||
db_session: AsyncSession,
|
db_session: AsyncSession,
|
||||||
raw_object: ap.RawObject,
|
raw_object: ap.RawObject,
|
||||||
|
@ -847,6 +861,10 @@ async def save_to_inbox(
|
||||||
logger.exception("Failed to fetch actor")
|
logger.exception("Failed to fetch actor")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if "id" not in raw_object:
|
||||||
|
await _process_transient_object(db_session, raw_object, actor)
|
||||||
|
return None
|
||||||
|
|
||||||
raw_object_id = ap.get_id(raw_object)
|
raw_object_id = ap.get_id(raw_object)
|
||||||
|
|
||||||
# Ensure forwarded activities have a valid LD sig
|
# Ensure forwarded activities have a valid LD sig
|
||||||
|
|
|
@ -9,6 +9,7 @@ from sqlalchemy import select
|
||||||
|
|
||||||
from app import activitypub as ap
|
from app import activitypub as ap
|
||||||
from app import httpsig
|
from app import httpsig
|
||||||
|
from app import ldsig
|
||||||
from app import models
|
from app import models
|
||||||
from app.boxes import save_to_inbox
|
from app.boxes import save_to_inbox
|
||||||
from app.database import AsyncSession
|
from app.database import AsyncSession
|
||||||
|
@ -22,10 +23,23 @@ async def new_ap_incoming_activity(
|
||||||
db_session: AsyncSession,
|
db_session: AsyncSession,
|
||||||
httpsig_info: httpsig.HTTPSigInfo,
|
httpsig_info: httpsig.HTTPSigInfo,
|
||||||
raw_object: ap.RawObject,
|
raw_object: ap.RawObject,
|
||||||
) -> models.IncomingActivity:
|
) -> models.IncomingActivity | None:
|
||||||
|
ap_id: str
|
||||||
|
if "id" not in raw_object:
|
||||||
|
if "@context" not in raw_object:
|
||||||
|
logger.warning(f"Dropping invalid object: {raw_object}")
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
# This is a transient object, Build the JSON LD hash as the ID
|
||||||
|
ap_id = ldsig._doc_hash(raw_object)
|
||||||
|
else:
|
||||||
|
ap_id = ap.get_id(raw_object)
|
||||||
|
|
||||||
|
# TODO(ts): dedup first
|
||||||
|
|
||||||
incoming_activity = models.IncomingActivity(
|
incoming_activity = models.IncomingActivity(
|
||||||
sent_by_ap_actor_id=httpsig_info.signed_by_ap_actor_id,
|
sent_by_ap_actor_id=httpsig_info.signed_by_ap_actor_id,
|
||||||
ap_id=ap.get_id(raw_object),
|
ap_id=ap_id,
|
||||||
ap_object=raw_object,
|
ap_object=raw_object,
|
||||||
)
|
)
|
||||||
db_session.add(incoming_activity)
|
db_session.add(incoming_activity)
|
||||||
|
|
|
@ -72,7 +72,7 @@ _RESIZED_CACHE: MutableMapping[tuple[str, int], tuple[bytes, str, Any]] = LFUCac
|
||||||
# TODO(ts):
|
# TODO(ts):
|
||||||
#
|
#
|
||||||
# Next:
|
# Next:
|
||||||
# - incoming activity worker
|
# - fix stream (only content from follows + mention, and dedup shares)
|
||||||
# - handle remove activity
|
# - handle remove activity
|
||||||
# - retries httpx?
|
# - retries httpx?
|
||||||
# - DB models for webmentions
|
# - DB models for webmentions
|
||||||
|
|
Loading…
Reference in a new issue