Add more tests for the Key model. Remove the key_id field and made it a property derived from the fingerprint.
This commit is contained in:
@@ -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'),
|
||||
|
||||
@@ -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:]
|
||||
|
||||
@@ -30,7 +30,9 @@ class KeyGenerationError(GPGException):
|
||||
|
||||
|
||||
class KeyFetchingError(GPGException):
|
||||
pass
|
||||
"""
|
||||
Unable to receive key or key not found
|
||||
"""
|
||||
|
||||
|
||||
class KeyDoesNotExist(GPGException):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,6 +29,10 @@ class KeyManager(models.Manager):
|
||||
|
||||
import_results = gpg.recv_keys(setting_keyserver.value, key_id)
|
||||
|
||||
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)
|
||||
|
||||
18
mayan/apps/django_gpg/migrations/0005_remove_key_key_id.py
Normal file
18
mayan/apps/django_gpg/migrations/0005_remove_key_key_id.py
Normal file
@@ -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',
|
||||
),
|
||||
]
|
||||
@@ -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:]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
]
|
||||
)
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user