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 django.contrib.auth.models import Group from guardian.mixins import PermissionRequiredMixin, PermissionListMixin from guardian.shortcuts import assign_perm from . import models from . import forms from django import template class PublicKeyListView(PermissionListMixin, ListView): model = models.PublicKey permission_required = ['view_publickey', 'list_publickey'] class PublicKeyDetailView(PermissionRequiredMixin, DetailView): model = models.PublicKey permission_required = ['view_publickey', 'list_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") except queryset.model.MultipleObjectsReturned: # Lookup was with ID, assume the same key matched multple times return queryset.all()[0] return key class PublicKeyCreateView(PermissionRequiredMixin, CreateView): form_class = forms.PublicKeyForm model = models.PublicKey permission_required = ['add_publickey'] permission_object = None success_url = reverse_lazy('publickey-list') def form_valid(self, form): resp = super().form_valid(form) assign_perm('view_publickey', self.request.user, self.object) assign_perm('list_publickey', self.request.user, self.object) assign_perm('change_publickey', self.request.user, self.object) if form.cleaned_data["public"]: any_user = Group.objects.get(name="any-user") assign_perm('view_publickey', any_user, self.object) if form.cleaned_data["index"]: any_user = Group.objects.get(name="any-user") assign_perm('list_publickey', any_user, self.object) return resp