diff --git a/hkp/views.py b/hkp/views.py index ae42b4f045f98644b4fb820c4e3212da063a8466..6bc09cb8bf8642900d097fb38d203ef5033ecc18 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 696f6fd8f558284afab12bc95351d0ba12b7ac27..9f91fddd10fcf0d28380980fa944e61b079617f7 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 3ae398300d4498d1c81fe3ebe721272b8345feb3..47de879b40ffe4af514705b8c7d91471ac1e41b6 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 81a26b0e586202c5779580c60db22646e2de3c47..e0c63ec85a687d626f7cc2c8b9c3e8623f514c35 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 25038c0b666d66cc2dc69fb8843b892747303f0c..2344124fc1a4258307a6ed7f6555fabdec638876 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