Add delete support for the outbox

main
Thomas Sileo 2022-07-02 10:33:20 +02:00
parent d164d6d2dd
commit da048a9208
5 changed files with 62 additions and 1 deletions

View File

@ -427,6 +427,18 @@ async def admin_actions_follow(
return RedirectResponse(redirect_url, status_code=302) return RedirectResponse(redirect_url, status_code=302)
@router.post("/actions/delete")
async def admin_actions_delete(
request: Request,
ap_object_id: str = Form(),
redirect_url: str = Form(),
csrf_check: None = Depends(verify_csrf_token),
db_session: AsyncSession = Depends(get_db_session),
) -> RedirectResponse:
await boxes.send_delete(db_session, ap_object_id)
return RedirectResponse(redirect_url, status_code=302)
@router.post("/actions/like") @router.post("/actions/like")
async def admin_actions_like( async def admin_actions_like(
request: Request, request: Request,

View File

@ -76,6 +76,39 @@ async def save_outbox_object(
return outbox_object return outbox_object
async def send_delete(db_session: AsyncSession, ap_object_id: str) -> None:
outbox_object_to_delete = await get_outbox_object_by_ap_id(db_session, ap_object_id)
if not outbox_object_to_delete:
raise ValueError(f"{ap_object_id} not found in the outbox")
delete_id = allocate_outbox_id()
delete = {
"@context": ap.AS_CTX,
"id": outbox_object_id(delete_id),
"type": "Delete",
"actor": ID,
"object": ap_object_id,
}
outbox_object = await save_outbox_object(
db_session,
delete_id,
delete,
relates_to_outbox_object_id=outbox_object_to_delete.id,
)
if not outbox_object.id:
raise ValueError("Should never happen")
outbox_object_to_delete.is_deleted = True
await db_session.commit()
# Compute the original recipients
recipients = await _compute_recipients(
db_session, outbox_object_to_delete.ap_object
)
for rcp in recipients:
await new_outgoing_activity(db_session, rcp, outbox_object.id)
async def send_like(db_session: AsyncSession, ap_object_id: str) -> None: async def send_like(db_session: AsyncSession, ap_object_id: str) -> None:
inbox_object = await get_inbox_object_by_ap_id(db_session, ap_object_id) inbox_object = await get_inbox_object_by_ap_id(db_session, ap_object_id)
if not inbox_object: if not inbox_object:

View File

@ -99,8 +99,11 @@ def process_next_outgoing_activity(db: Session) -> bool:
next_activity.last_try = now() next_activity.last_try = now()
payload = ap.wrap_object_if_needed(next_activity.outbox_object.ap_object) payload = ap.wrap_object_if_needed(next_activity.outbox_object.ap_object)
if payload["type"] == "Create":
# Use LD sig if the activity may need to be forwarded by recipients
if payload["type"] in ["Create", "Delete"]:
ldsig.generate_signature(payload, k) ldsig.generate_signature(payload, k)
logger.info(f"{payload=}") logger.info(f"{payload=}")
try: try:
resp = ap.post(next_activity.recipient, payload) resp = ap.post(next_activity.recipient, payload)

View File

@ -16,6 +16,7 @@
<div class="actor-action">You followed</div> <div class="actor-action">You followed</div>
{{ utils.display_actor(outbox_object.relates_to_actor, actors_metadata) }} {{ utils.display_actor(outbox_object.relates_to_actor, actors_metadata) }}
{% elif outbox_object.ap_type in ["Article", "Note", "Video"] %} {% elif outbox_object.ap_type in ["Article", "Note", "Video"] %}
{% if outbox_object.is_deleted %}Deleted{% endif %}
{{ utils.display_object(outbox_object) }} {{ utils.display_object(outbox_object) }}
{% else %} {% else %}
Implement {{ outbox_object.ap_type }} Implement {{ outbox_object.ap_type }}

View File

@ -60,6 +60,15 @@
</form> </form>
{% endmacro %} {% endmacro %}
{% macro admin_delete_button(ap_object_id) %}
<form action="{{ request.url_for("admin_actions_delete") }}" method="POST" onsubmit="return confirm('Do you really want to delete this object?');">
{{ embed_csrf_token() }}
{{ embed_redirect_url() }}
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
<input type="submit" value="Delete">
</form>
{% endmacro %}
{% macro admin_announce_button(ap_object_id, disabled=False) %} {% macro admin_announce_button(ap_object_id, disabled=False) %}
<form action="{{ request.url_for("admin_actions_announce") }}" method="POST"> <form action="{{ request.url_for("admin_actions_announce") }}" method="POST">
{{ embed_csrf_token() }} {{ embed_csrf_token() }}
@ -320,6 +329,9 @@
</div> </div>
{% if is_admin %} {% if is_admin %}
<div class="bar-item">
{{ admin_delete_button(object.ap_id) }}
</div>
<div class="bar-item"> <div class="bar-item">
{{ admin_reply_button(object.ap_id) }} {{ admin_reply_button(object.ap_id) }}
</div> </div>