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" }} &ndash; {{ 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" }} &ndash; {{ 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" }} &ndash; {{ 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