diff --git a/mayan/apps/django_gpg/api.py b/mayan/apps/django_gpg/api.py index 43e4e29839..b2fd04625d 100644 --- a/mayan/apps/django_gpg/api.py +++ b/mayan/apps/django_gpg/api.py @@ -9,7 +9,6 @@ try: except ImportError: from StringIO import StringIO -from hkp import KeyServer import gnupg from django.utils.translation import ugettext_lazy as _ @@ -20,6 +19,16 @@ from .literals import KEY_TYPES logger = logging.getLogger(__name__) +class KeyStub(object): + def __init__(self, raw): + self.key_id = raw['keyid'] + self.key_type = raw['type'] + self.date = raw['date'] + self.expires = raw['expires'] + self.length = raw['length'] + self.uids = raw['uids'] + + class Key(object): @staticmethod def get_key_id(fingerprint): @@ -268,14 +277,8 @@ class GPG(object): def query(self, term): results = {} for keyserver in self.keyservers: - url = 'http://%s' % keyserver - server = KeyServer(url) - try: - key_list = server.search(term) - for key in key_list: - results[key.keyid] = key - except: - pass + for key_data in self.gpg.search_keys(query=term, keyserver=keyserver): + results[key_data['keyid']] = KeyStub(raw=key_data) return results.values() diff --git a/mayan/apps/django_gpg/apps.py b/mayan/apps/django_gpg/apps.py index 05ca9d6c3a..603e6f0434 100644 --- a/mayan/apps/django_gpg/apps.py +++ b/mayan/apps/django_gpg/apps.py @@ -3,11 +3,9 @@ from __future__ import unicode_literals from django import apps from django.utils.translation import ugettext_lazy as _ -from hkp import Key as KeyServerKey - from common import menu_object, menu_setup, menu_sidebar -from .api import Key +from .api import Key, KeyStub from .links import ( link_key_delete, link_key_query, link_key_receive, link_key_setup, link_public_keys @@ -20,6 +18,6 @@ class DjangoGPGApp(apps.AppConfig): def ready(self): menu_object.bind_links(links=[link_key_delete], sources=[Key]) - menu_object.bind_links(links=[link_key_receive], sources=[KeyServerKey]) + menu_object.bind_links(links=[link_key_receive], sources=[KeyStub]) menu_setup.bind_links(links=[link_key_setup]) menu_sidebar.bind_links(links=[link_public_keys, link_key_query], sources=['django_gpg:key_delete', 'django_gpg:key_public_list', 'django_gpg:key_query']) diff --git a/mayan/apps/django_gpg/links.py b/mayan/apps/django_gpg/links.py index 9e83a0c738..5e85e4a8b5 100644 --- a/mayan/apps/django_gpg/links.py +++ b/mayan/apps/django_gpg/links.py @@ -13,5 +13,5 @@ link_private_keys = Link(icon='fa fa-key', permissions=[PERMISSION_KEY_VIEW], te link_public_keys = Link(icon='fa fa-key', permissions=[PERMISSION_KEY_VIEW], text=_('Public keys'), view='django_gpg:key_public_list') link_key_delete = Link(permissions=[PERMISSION_KEY_DELETE], text=_('Delete'), view='django_gpg:key_delete', args=['object.fingerprint', 'object.type']) link_key_query = Link(text=_('Query keyservers'), view='django_gpg:key_query', permissions=[PERMISSION_KEYSERVER_QUERY]) -link_key_receive = Link(keep_query=True, permissions=[PERMISSION_KEY_RECEIVE], text=_('Import'), view='django_gpg:key_receive', args='object.keyid') +link_key_receive = Link(keep_query=True, permissions=[PERMISSION_KEY_RECEIVE], text=_('Import'), view='django_gpg:key_receive', args='object.key_id') link_key_setup = Link(icon='fa fa-key', permissions=[PERMISSION_KEY_VIEW], text=_('Key management'), view='django_gpg:key_public_list') diff --git a/mayan/apps/django_gpg/views.py b/mayan/apps/django_gpg/views.py index 8e09b38895..56f9cdb7ed 100644 --- a/mayan/apps/django_gpg/views.py +++ b/mayan/apps/django_gpg/views.py @@ -1,12 +1,13 @@ from __future__ import absolute_import, unicode_literals +from datetime import datetime import logging from django.conf import settings from django.contrib import messages from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect -from django.shortcuts import render_to_response +from django.shortcuts import redirect, render_to_response from django.template import RequestContext from django.utils.translation import ugettext_lazy as _ @@ -28,33 +29,35 @@ logger = logging.getLogger(__name__) def key_receive(request, key_id): Permission.objects.check_permissions(request.user, [PERMISSION_KEY_RECEIVE]) - post_action_redirect = None previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) - next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) if request.method == 'POST': try: - term = request.GET.get('term') - results = gpg.query(term) - keys_dict = dict([(key.keyid, key) for key in results]) - key = gpg.import_key(keys_dict[key_id].key) - messages.success(request, _('Key: %s, imported successfully.') % key) - return HttpResponseRedirect(next) - except (KeyImportError, KeyError, TypeError) as exception: + gpg.receive_key(key_id=key_id) + except Exception as exception: messages.error( request, - _('Unable to import key id: %(key_id)s; %(error)s') % + _('Unable to import key: %(key_id)s; %(error)s') % { 'key_id': key_id, 'error': exception, } ) return HttpResponseRedirect(previous) + else: + messages.success( + request, + _('Successfully received key: %(key_id)s') % + { + 'key_id': key_id, + } + ) + + return redirect('django_gpg:key_public_list') return render_to_response('appearance/generic_confirm.html', { 'title': _('Import key'), 'message': _('Are you sure you wish to import key id: %s?') % key_id, - 'next': next, 'previous': previous, 'submit_method': 'GET', @@ -146,40 +149,27 @@ def key_query(request): 'extra_columns': [ { 'name': _('ID'), - 'attribute': 'keyid', + 'attribute': 'key_id', }, { 'name': _('Type'), - 'attribute': 'algo', + 'attribute': 'key_type', }, { 'name': _('Creation date'), - 'attribute': 'creation_date', - }, - { - 'name': _('Disabled'), - 'attribute': 'disabled', + 'attribute': encapsulate(lambda x: datetime.fromtimestamp(int(x.date))) }, { 'name': _('Expiration date'), - 'attribute': 'expiration_date', - }, - { - 'name': _('Expired'), - 'attribute': 'expired', + 'attribute': encapsulate(lambda x: datetime.fromtimestamp(int(x.expires)) if x.expires else _('No expiration')) }, { 'name': _('Length'), - 'attribute': 'key_length', + 'attribute': 'length', }, { - 'name': _('Revoked'), - 'attribute': 'revoked', - }, - - { - 'name': _('Identifies'), - 'attribute': encapsulate(lambda x: ', '.join([identity.uid for identity in x.identities])), + 'name': _('Identities'), + 'attribute': encapsulate(lambda x: ', '.join(x.uids)), }, ] }, diff --git a/requirements/common.txt b/requirements/common.txt index 3ef072ccfd..d65dac090a 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -25,7 +25,6 @@ pycountry==1.10 python-dateutil==2.4.2 pytz==2015.4 python-gnupg==0.3.7 -python-hkp==0.1.3 python-magic==0.4.6 sh==1.11