From 8be65604bd1da2f837735c6ffea6e9b0feb99cf9 Mon Sep 17 00:00:00 2001 From: Sasha Romijn Date: Thu, 28 Nov 2024 14:51:42 +0100 Subject: [PATCH] Add #949 - Add support for inline PGP signatures in RPSL update form --- irrd/webui/endpoints.py | 9 ++++++--- irrd/webui/templates/rpsl_form.html | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/irrd/webui/endpoints.py b/irrd/webui/endpoints.py index c6e603bf..c5984259 100644 --- a/irrd/webui/endpoints.py +++ b/irrd/webui/endpoints.py @@ -18,6 +18,7 @@ from irrd.storage.orm_provider import ORMSessionProvider, session_provider_manager from irrd.storage.queries import RPSLDatabaseQuery from irrd.updates.handler import ChangeSubmissionHandler +from irrd.utils.pgp import validate_pgp_signature from irrd.webui.auth.decorators import authentication_required, mark_user_mfa_incomplete from irrd.webui.helpers import filter_auth_hash_non_mntner from irrd.webui.rendering import template_context_render @@ -101,7 +102,6 @@ async def rpsl_detail(request: Request, user_mfa_incomplete: bool, session_provi ) -@csrf_protect @mark_user_mfa_incomplete @session_provider_manager async def rpsl_update( @@ -147,6 +147,7 @@ async def rpsl_update( elif request.method == "POST": form_data = await request.form() + submission = form_data.get("data", form_data.get("DATA")) request_meta = { META_KEY_HTTP_CLIENT_IP: request.client.host if request.client else "", "HTTP-User-Agent": request.headers.get("User-Agent"), @@ -160,8 +161,10 @@ async def rpsl_update( # and therefore needs wrapping in a thread @sync_to_async def save(): + signed_submission, pgp_fingerprint = validate_pgp_signature(submission) return ChangeSubmissionHandler().load_text_blob( - object_texts_blob=form_data["data"], + object_texts_blob=signed_submission if signed_submission else submission, + pgp_fingerprint=pgp_fingerprint, origin=AuthoritativeChangeOrigin.webui, request_meta=request_meta, internal_authenticated_user=active_user, @@ -172,7 +175,7 @@ def save(): "rpsl_form.html", request, { - "existing_data": form_data["data"], + "existing_data": submission, "status": handler.status(), "report": handler.submitter_report_human(), "mntner_perms": mntner_perms, diff --git a/irrd/webui/templates/rpsl_form.html b/irrd/webui/templates/rpsl_form.html index 8f8d85f0..6cf05d37 100644 --- a/irrd/webui/templates/rpsl_form.html +++ b/irrd/webui/templates/rpsl_form.html @@ -28,8 +28,8 @@

Change/create/delete object(s){% if status %}: {{ status }}{% endif %}

This form is identical to email submissions, which means you can use the pseudo-attributes delete for deletions or password for password authentication. - PGP is not supported. - See the IRRD documentation for more details. + PGP inline signatures are supported. + See the IRRD documentation for more details.

{% if user and user.override %}