diff --git a/mayan/apps/django_gpg/apps.py b/mayan/apps/django_gpg/apps.py index 1062fbf3a4..938fc2896b 100644 --- a/mayan/apps/django_gpg/apps.py +++ b/mayan/apps/django_gpg/apps.py @@ -70,10 +70,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SourceColumn(source=Key, label=_('Key ID'), attribute='key_id') SourceColumn(source=Key, label=_('User ID'), attribute='user_id') - SourceColumn( - source=KeyStub, label=_('ID'), - func=lambda context: '...{0}'.format(context['object'].key_id[-16:]) - ) + SourceColumn(source=KeyStub, label=_('Key ID'), attribute='key_id') SourceColumn(source=KeyStub, label=_('Type'), attribute='key_type') SourceColumn( source=KeyStub, label=_('Creation date'), diff --git a/mayan/apps/django_gpg/classes.py b/mayan/apps/django_gpg/classes.py index 6d72870e38..6f16e4076c 100644 --- a/mayan/apps/django_gpg/classes.py +++ b/mayan/apps/django_gpg/classes.py @@ -3,9 +3,13 @@ from __future__ import absolute_import, unicode_literals class KeyStub(object): def __init__(self, raw): - self.key_id = raw['keyid'] + self.fingerprint = raw['keyid'] self.key_type = raw['type'] self.date = raw['date'] self.expires = raw['expires'] self.length = raw['length'] self.uids = raw['uids'] + + @property + def key_id(self): + return self.fingerprint[-8:] diff --git a/mayan/apps/django_gpg/exceptions.py b/mayan/apps/django_gpg/exceptions.py index 31691d4a42..14dbe5ffa8 100644 --- a/mayan/apps/django_gpg/exceptions.py +++ b/mayan/apps/django_gpg/exceptions.py @@ -30,7 +30,9 @@ class KeyGenerationError(GPGException): class KeyFetchingError(GPGException): - pass + """ + Unable to receive key or key not found + """ class KeyDoesNotExist(GPGException): diff --git a/mayan/apps/django_gpg/forms.py b/mayan/apps/django_gpg/forms.py index ecc934db39..a2d1235c9e 100644 --- a/mayan/apps/django_gpg/forms.py +++ b/mayan/apps/django_gpg/forms.py @@ -29,9 +29,9 @@ class KeyDetailForm(DetailForm): 'widget': forms.widgets.DateInput }, {'label': _('Fingerprint'), 'field': 'fingerprint'}, - {'label': _('length'), 'field': 'length'}, - {'label': _('algorithm'), 'field': 'algorithm'}, - {'label': _('key_type'), 'field': 'key_type'}, + {'label': _('Length'), 'field': 'length'}, + {'label': _('Algorithm'), 'field': 'algorithm'}, + {'label': _('Type'), 'field': lambda x: instance.get_key_type_display()}, ) kwargs['extra_fields'] = extra_fields diff --git a/mayan/apps/django_gpg/managers.py b/mayan/apps/django_gpg/managers.py index 20b9074ab7..89c5100308 100644 --- a/mayan/apps/django_gpg/managers.py +++ b/mayan/apps/django_gpg/managers.py @@ -10,6 +10,7 @@ import gnupg from django.db import models from .classes import KeyStub +from .exceptions import KeyFetchingError from .literals import KEY_TYPE_PUBLIC, KEY_TYPE_SECRET from .settings import setting_gpg_path, setting_keyserver @@ -28,11 +29,15 @@ class KeyManager(models.Manager): import_results = gpg.recv_keys(setting_keyserver.value, key_id) - key_data = gpg.export_keys(import_results.fingerprints[0]) + if not import_results.count: + shutil.rmtree(temporary_directory) + raise KeyFetchingError('No key found') + else: + key_data = gpg.export_keys(import_results.fingerprints[0]) - shutil.rmtree(temporary_directory) + shutil.rmtree(temporary_directory) - return self.create(key_data=key_data) + return self.create(key_data=key_data) def search(self, query): temporary_directory = tempfile.mkdtemp() diff --git a/mayan/apps/django_gpg/migrations/0005_remove_key_key_id.py b/mayan/apps/django_gpg/migrations/0005_remove_key_key_id.py new file mode 100644 index 0000000000..6acb9c702e --- /dev/null +++ b/mayan/apps/django_gpg/migrations/0005_remove_key_key_id.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_gpg', '0004_auto_20160322_2202'), + ] + + operations = [ + migrations.RemoveField( + model_name='key', + name='key_id', + ), + ] diff --git a/mayan/apps/django_gpg/models.py b/mayan/apps/django_gpg/models.py index a5b61afc32..9235adb65c 100644 --- a/mayan/apps/django_gpg/models.py +++ b/mayan/apps/django_gpg/models.py @@ -44,9 +44,6 @@ def gpg_command(function): @python_2_unicode_compatible class Key(models.Model): key_data = models.TextField(verbose_name=_('Key data')) - key_id = models.CharField( - editable=False, max_length=16, unique=True, verbose_name=_('Key ID') - ) creation_date = models.DateField( editable=False, verbose_name=_('Creation date') ) @@ -103,7 +100,6 @@ class Key(models.Model): shutil.rmtree(temporary_directory) - self.key_id = key_info['keyid'] self.algorithm = key_info['algo'] self.creation_date = date.fromtimestamp(int(key_info['date'])) if key_info['expires']: @@ -147,3 +143,7 @@ class Key(models.Model): raise NeedPassphrase return file_sign_results + + @property + def key_id(self): + return self.fingerprint[-8:] diff --git a/mayan/apps/django_gpg/tests/literals.py b/mayan/apps/django_gpg/tests/literals.py index 822bdcd593..0936a239d1 100644 --- a/mayan/apps/django_gpg/tests/literals.py +++ b/mayan/apps/django_gpg/tests/literals.py @@ -1,9 +1,11 @@ from __future__ import unicode_literals TEST_GPG_HOME = '/tmp/test_gpg_home' -TEST_KEY_ID = '607138F1AECC5A5CA31CB7715F3F7F75D210724D' +TEST_KEY_FINGERPRINT = '6A24574E0A35004CDDFD22704125E9C571F378AC' TEST_KEYSERVERS = ['pool.sks-keyservers.net'] -TEST_UIDS = 'Roberto Rosario' + +TEST_SEARCH_UID = 'Roberto Rosario' +TEST_SEARCH_FINGERPRINT = '607138F1AECC5A5CA31CB7715F3F7F75D210724D' TEST_KEY_DATA = '''-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 diff --git a/mayan/apps/django_gpg/tests/test_classes.py b/mayan/apps/django_gpg/tests/test_classes.py deleted file mode 100644 index a31618414c..0000000000 --- a/mayan/apps/django_gpg/tests/test_classes.py +++ /dev/null @@ -1,45 +0,0 @@ -from __future__ import unicode_literals - -import shutil - -from django.test import TestCase - -from ..api import GPG, Key -from ..settings import setting_gpg_path - -from .literals import TEST_GPG_HOME, TEST_KEY_ID, TEST_KEYSERVERS, TEST_UIDS - - -class DjangoGPGTestCase(TestCase): - def setUp(self): - try: - shutil.rmtree(TEST_GPG_HOME) - except OSError: - pass - - self.gpg = GPG( - binary_path=setting_gpg_path.value, home=TEST_GPG_HOME, - keyservers=TEST_KEYSERVERS - ) - - def test_main(self): - # No private or public keys in the keyring - self.assertEqual(Key.get_all(self.gpg, secret=True), []) - self.assertEqual(Key.get_all(self.gpg), []) - - # Test querying the keyservers - self.assertTrue( - TEST_KEY_ID in [ - key_stub.key_id for key_stub in self.gpg.query(TEST_UIDS) - ] - ) - - # Receive a public key from the keyserver - self.gpg.receive_key(key_id=TEST_KEY_ID[-8:]) - - # Check that the received key is indeed in the keyring - self.assertTrue( - TEST_KEY_ID[-16:] in [ - key_stub.key_id for key_stub in Key.get_all(self.gpg) - ] - ) diff --git a/mayan/apps/django_gpg/tests/test_models.py b/mayan/apps/django_gpg/tests/test_models.py index 69d74f3b04..bcb97cda34 100644 --- a/mayan/apps/django_gpg/tests/test_models.py +++ b/mayan/apps/django_gpg/tests/test_models.py @@ -4,7 +4,10 @@ from django.test import TestCase from ..models import Key -from .literals import TEST_KEY_DATA, TEST_KEY_FINGERPRINT, TEST_KEY_ID +from .literals import ( + TEST_KEY_DATA, TEST_KEY_FINGERPRINT, TEST_SEARCH_FINGERPRINT, + TEST_SEARCH_UID +) class KeyTestCase(TestCase): @@ -12,5 +15,19 @@ class KeyTestCase(TestCase): # Creating a Key instance is analogous to importing a key key = Key.objects.create(key_data=TEST_KEY_DATA) - self.assertEqual(key.key_id, TEST_KEY_ID) self.assertEqual(key.fingerprint, TEST_KEY_FINGERPRINT) + + def test_key_search(self): + search_results = Key.objects.search(query=TEST_SEARCH_UID) + + self.assertTrue( + TEST_SEARCH_FINGERPRINT in [ + key_stub.fingerprint for key_stub in search_results + ] + ) + + def test_key_receive(self): + Key.objects.receive_key(key_id=TEST_SEARCH_FINGERPRINT) + + self.assertEqual(Key.objects.all().count(), 1) + self.assertEqual(Key.objects.first().fingerprint, TEST_SEARCH_FINGERPRINT)