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:
Roberto Rosario
2016-03-23 11:58:08 -04:00
parent f82b2000c3
commit cd077cb076
10 changed files with 65 additions and 65 deletions

View File

@@ -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'),

View File

@@ -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:]

View File

@@ -30,7 +30,9 @@ class KeyGenerationError(GPGException):
class KeyFetchingError(GPGException):
pass
"""
Unable to receive key or key not found
"""
class KeyDoesNotExist(GPGException):

View File

@@ -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

View File

@@ -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)

View 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',
),
]

View File

@@ -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:]

View File

@@ -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

View File

@@ -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)
]
)

View File

@@ -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)