From b6b126ddd580acf421beb4f434d8ed4d9349cd83 Mon Sep 17 00:00:00 2001 From: Frank Sauerburger <frank@sauerburger.com> Date: Fri, 26 Feb 2021 12:06:18 +0100 Subject: [PATCH] Link singer keys --- hkp/views.py | 1 + keys_home/static/keys_home/css/main.scss | 8 ++++++- pgp/templates/pgp/publickey_item.html | 15 ++++++++++--- pgp/urls.py | 2 ++ pgp/views.py | 28 ++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/hkp/views.py b/hkp/views.py index ae42b4f..6bc09cb 100644 --- a/hkp/views.py +++ b/hkp/views.py @@ -11,6 +11,7 @@ class HttpNotImplementedError(HttpResponse): def lookup(request): op = request.GET.get('op', None) search = request.GET.get('search', None) + serach = search.lower() if op not in ["get"]: return HttpNotImplementedError("Not implemented") diff --git a/keys_home/static/keys_home/css/main.scss b/keys_home/static/keys_home/css/main.scss index 696f6fd..9f91fdd 100644 --- a/keys_home/static/keys_home/css/main.scss +++ b/keys_home/static/keys_home/css/main.scss @@ -280,11 +280,17 @@ body { } .pgpkey-fingerprint-title, .pgpkey-userid-title { - @extend .text-muted, .mb-1; + @extend .text-muted; i, svg { @extend .mr-1; } } + .pgpkey-fingerprint-title { + @extend .mb-1; + } + .pgpkey-userid-title { + @extend .my-1, .lead; + } .pgpkey-fingerprint-primary, .pgpkey-proto-listing { @extend .input-group, .mb-2; diff --git a/pgp/templates/pgp/publickey_item.html b/pgp/templates/pgp/publickey_item.html index 3ae3983..47de879 100644 --- a/pgp/templates/pgp/publickey_item.html +++ b/pgp/templates/pgp/publickey_item.html @@ -26,7 +26,10 @@ {% for sig in uid.signatures %} <li> <i class="fas fa-file-signature"></i> - Signed by <code>0x{{ sig.signer }}</code> + Signed by + <a href="{% url 'publickey-fingerprint-detail' sig.signer %}"> + <code>0x{{ sig.signer }}</code> + </a> (valid {{ sig.created|date:"Y-m-d" }} – {{ sig.expires_at|date:"Y-m-d"|default:"infinity" }}) </li> {% endfor %} @@ -54,7 +57,10 @@ {% for sig in publickey.details.signatures %} <li> <i class="fas fa-file-signature"></i> - Signed by <code>0x{{ sig.signer }}</code> + Signed by + <a href="{% url 'publickey-fingerprint-detail' sig.signer %}"> + <code>0x{{ sig.signer }}</code> + </a> (valid {{ sig.created|date:"Y-m-d" }} – {{ sig.expires_at|date:"Y-m-d"|default:"infinity" }}) </li> {% endfor %} @@ -85,7 +91,10 @@ {% for sig in subkey.signatures %} <li> <i class="fas fa-file-signature"></i> - Signed by <code>0x{{ sig.signer }}</code> + Signed by + <a href="{% url 'publickey-fingerprint-detail' sig.signer %}"> + <code>0x{{ sig.signer }}</code> + </a> (valid {{ sig.created|date:"Y-m-d" }} – {{ sig.expires_at|date:"Y-m-d"|default:"infinity" }}) </li> {% endfor %} diff --git a/pgp/urls.py b/pgp/urls.py index 81a26b0..e0c63ec 100644 --- a/pgp/urls.py +++ b/pgp/urls.py @@ -21,5 +21,7 @@ from . import views urlpatterns = [ path("", views.PublicKeyListView.as_view(), name="publickey-list"), path("<int:pk>", views.PublicKeyDetailView.as_view(), name="publickey-detail"), + path("<str:fingerprint>", views.PublicKeyFingerprintDetailView.as_view(), + name="publickey-fingerprint-detail"), path("new", views.PublicKeyCreateView.as_view(), name="publickey-create"), ] diff --git a/pgp/views.py b/pgp/views.py index 25038c0..2344124 100644 --- a/pgp/views.py +++ b/pgp/views.py @@ -1,5 +1,7 @@ from django.shortcuts import render from django.urls import reverse_lazy +from django.http import Http404 +from django.utils.translation import gettext as _ from django.views.generic import DetailView, ListView, CreateView from guardian.mixins import PermissionRequiredMixin, PermissionListMixin from guardian.shortcuts import assign_perm @@ -18,6 +20,32 @@ class PublicKeyDetailView(PermissionRequiredMixin, DetailView): model = models.PublicKey permission_required = ['view_publickey'] + +class PublicKeyFingerprintDetailView(PermissionRequiredMixin, DetailView): + model = models.PublicKey + permission_required = ['view_publickey'] + slug_url_kwarg = 'fingerprint' + slug_field = 'keyid' + + def get_object(self, queryset=None): + if queryset is None: + queryset = self.get_queryset() + + slug_field = self.get_slug_field() + slug = self.kwargs.get(self.slug_url_kwarg) + slug = slug.lower() + if slug.startswith("0x"): + slug = slug[2:] + + params = {slug_field + "__endswith": slug} + queryset = queryset.filter(**params) + try: + # Get the single item from the filtered queryset + key = queryset.get() + except queryset.model.DoesNotExist: + raise Http404("No OpenPGP Public Key found %matching the query") + return key + class PublicKeyCreateView(PermissionRequiredMixin, CreateView): form_class = forms.PublicKeyForm model = models.PublicKey -- GitLab