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=_('Key ID'), attribute='key_id')
|
||||||
SourceColumn(source=Key, label=_('User ID'), attribute='user_id')
|
SourceColumn(source=Key, label=_('User ID'), attribute='user_id')
|
||||||
|
|
||||||
SourceColumn(
|
SourceColumn(source=KeyStub, label=_('Key ID'), attribute='key_id')
|
||||||
source=KeyStub, label=_('ID'),
|
|
||||||
func=lambda context: '...{0}'.format(context['object'].key_id[-16:])
|
|
||||||
)
|
|
||||||
SourceColumn(source=KeyStub, label=_('Type'), attribute='key_type')
|
SourceColumn(source=KeyStub, label=_('Type'), attribute='key_type')
|
||||||
SourceColumn(
|
SourceColumn(
|
||||||
source=KeyStub, label=_('Creation date'),
|
source=KeyStub, label=_('Creation date'),
|
||||||
|
|||||||
@@ -3,9 +3,13 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
|
|
||||||
class KeyStub(object):
|
class KeyStub(object):
|
||||||
def __init__(self, raw):
|
def __init__(self, raw):
|
||||||
self.key_id = raw['keyid']
|
self.fingerprint = raw['keyid']
|
||||||
self.key_type = raw['type']
|
self.key_type = raw['type']
|
||||||
self.date = raw['date']
|
self.date = raw['date']
|
||||||
self.expires = raw['expires']
|
self.expires = raw['expires']
|
||||||
self.length = raw['length']
|
self.length = raw['length']
|
||||||
self.uids = raw['uids']
|
self.uids = raw['uids']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def key_id(self):
|
||||||
|
return self.fingerprint[-8:]
|
||||||
|
|||||||
@@ -30,7 +30,9 @@ class KeyGenerationError(GPGException):
|
|||||||
|
|
||||||
|
|
||||||
class KeyFetchingError(GPGException):
|
class KeyFetchingError(GPGException):
|
||||||
pass
|
"""
|
||||||
|
Unable to receive key or key not found
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class KeyDoesNotExist(GPGException):
|
class KeyDoesNotExist(GPGException):
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ class KeyDetailForm(DetailForm):
|
|||||||
'widget': forms.widgets.DateInput
|
'widget': forms.widgets.DateInput
|
||||||
},
|
},
|
||||||
{'label': _('Fingerprint'), 'field': 'fingerprint'},
|
{'label': _('Fingerprint'), 'field': 'fingerprint'},
|
||||||
{'label': _('length'), 'field': 'length'},
|
{'label': _('Length'), 'field': 'length'},
|
||||||
{'label': _('algorithm'), 'field': 'algorithm'},
|
{'label': _('Algorithm'), 'field': 'algorithm'},
|
||||||
{'label': _('key_type'), 'field': 'key_type'},
|
{'label': _('Type'), 'field': lambda x: instance.get_key_type_display()},
|
||||||
)
|
)
|
||||||
|
|
||||||
kwargs['extra_fields'] = extra_fields
|
kwargs['extra_fields'] = extra_fields
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import gnupg
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from .classes import KeyStub
|
from .classes import KeyStub
|
||||||
|
from .exceptions import KeyFetchingError
|
||||||
from .literals import KEY_TYPE_PUBLIC, KEY_TYPE_SECRET
|
from .literals import KEY_TYPE_PUBLIC, KEY_TYPE_SECRET
|
||||||
from .settings import setting_gpg_path, setting_keyserver
|
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)
|
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])
|
key_data = gpg.export_keys(import_results.fingerprints[0])
|
||||||
|
|
||||||
shutil.rmtree(temporary_directory)
|
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
|
@python_2_unicode_compatible
|
||||||
class Key(models.Model):
|
class Key(models.Model):
|
||||||
key_data = models.TextField(verbose_name=_('Key data'))
|
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(
|
creation_date = models.DateField(
|
||||||
editable=False, verbose_name=_('Creation date')
|
editable=False, verbose_name=_('Creation date')
|
||||||
)
|
)
|
||||||
@@ -103,7 +100,6 @@ class Key(models.Model):
|
|||||||
|
|
||||||
shutil.rmtree(temporary_directory)
|
shutil.rmtree(temporary_directory)
|
||||||
|
|
||||||
self.key_id = key_info['keyid']
|
|
||||||
self.algorithm = key_info['algo']
|
self.algorithm = key_info['algo']
|
||||||
self.creation_date = date.fromtimestamp(int(key_info['date']))
|
self.creation_date = date.fromtimestamp(int(key_info['date']))
|
||||||
if key_info['expires']:
|
if key_info['expires']:
|
||||||
@@ -147,3 +143,7 @@ class Key(models.Model):
|
|||||||
raise NeedPassphrase
|
raise NeedPassphrase
|
||||||
|
|
||||||
return file_sign_results
|
return file_sign_results
|
||||||
|
|
||||||
|
@property
|
||||||
|
def key_id(self):
|
||||||
|
return self.fingerprint[-8:]
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
TEST_GPG_HOME = '/tmp/test_gpg_home'
|
TEST_GPG_HOME = '/tmp/test_gpg_home'
|
||||||
TEST_KEY_ID = '607138F1AECC5A5CA31CB7715F3F7F75D210724D'
|
TEST_KEY_FINGERPRINT = '6A24574E0A35004CDDFD22704125E9C571F378AC'
|
||||||
TEST_KEYSERVERS = ['pool.sks-keyservers.net']
|
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-----
|
TEST_KEY_DATA = '''-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
Version: GnuPG v1
|
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 ..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):
|
class KeyTestCase(TestCase):
|
||||||
@@ -12,5 +15,19 @@ class KeyTestCase(TestCase):
|
|||||||
# Creating a Key instance is analogous to importing a key
|
# Creating a Key instance is analogous to importing a key
|
||||||
key = Key.objects.create(key_data=TEST_KEY_DATA)
|
key = Key.objects.create(key_data=TEST_KEY_DATA)
|
||||||
|
|
||||||
self.assertEqual(key.key_id, TEST_KEY_ID)
|
|
||||||
self.assertEqual(key.fingerprint, TEST_KEY_FINGERPRINT)
|
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