Initial code for database stored GPG keys.

This commit is contained in:
Roberto Rosario
2016-03-22 05:10:54 -04:00
parent ccd6e8c88c
commit dc5d25fd00
4 changed files with 189 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
from __future__ import unicode_literals
from django.contrib import admin
from .models import Key
@admin.register(Key)
class KeyAdmin(admin.ModelAdmin):
#date_hierarchy = 'datetime'
list_display = ('key_id', 'user_id', 'key_type')
#readonly_fields = list_display
"""
key_id = models.CharField(
max_length=16, unique=True, verbose_name=_('Key ID')
)
creation_date = models.DateField(verbose_name=_('Creation date'))
expiration_date = models.DateField(verbose_name=_('Expiration date'))
fingerprint = models.CharField(
max_length=40, verbose_name=_('Fingerprint')
)
length = models.PositiveIntegerField(verbose_name=_('Length'))
algorithm = models.PositiveIntegerField(verbose_name=_('Algorithm'))
user_id = models.TextField(verbose_name=_('User ID'))
key_type = models.CharField(max_length=3, verbose_name=_('Type'))
"""

View File

@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Key',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('data', models.TextField(verbose_name='Data')),
('key_id', models.CharField(unique=True, max_length=16, verbose_name='Key ID')),
('creation_date', models.DateField(verbose_name='Creation date')),
('expiration_date', models.DateField(null=True, verbose_name='Expiration date', blank=True)),
('fingerprint', models.CharField(unique=True, max_length=40, verbose_name='Fingerprint')),
('length', models.PositiveIntegerField(verbose_name='Length')),
('algorithm', models.PositiveIntegerField(verbose_name='Algorithm')),
('user_id', models.TextField(verbose_name='User ID')),
('key_type', models.CharField(max_length=3, verbose_name='Type')),
],
options={
'verbose_name': 'Key',
'verbose_name_plural': 'Keys',
},
),
]

View File

@@ -0,0 +1,130 @@
from __future__ import absolute_import, unicode_literals
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
from datetime import date
import logging
import os
import shutil
import tempfile
import gnupg
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.core.files import File
from django.core.urlresolvers import reverse
from django.db import models, transaction
from django.utils.encoding import python_2_unicode_compatible
from django.utils.timezone import now
from django.utils.translation import ugettext, ugettext_lazy as _
from .settings import setting_gpg_path, setting_keyservers
logger = logging.getLogger(__name__)
class KeyManager(models.Manager):
def receive_key(self, key_id):
temporary_directory = tempfile.mkdtemp()
os.chmod(temporary_directory, 0x1C0)
gpg = gnupg.GPG(
gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value
)
import_results = gpg.recv_keys(setting_keyservers.value[0], key_id)
key_data = gpg.export_keys(import_results.fingerprints[0])
shutil.rmtree(temporary_directory)
return self.create(data=key_data)
def search(self, query):
temporary_directory = tempfile.mkdtemp()
gpg = gnupg.GPG(
gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value
)
result = gpg.search_keys(query=query, keyserver=setting_keyservers.value[0])
shutil.rmtree(temporary_directory)
return result
@python_2_unicode_compatible
class Key(models.Model):
data = models.TextField(verbose_name=_('Data'))
key_id = models.CharField(
max_length=16, unique=True, verbose_name=_('Key ID')
)
creation_date = models.DateField(verbose_name=_('Creation date'))
expiration_date = models.DateField(
blank=True, null=True, verbose_name=_('Expiration date')
)
fingerprint = models.CharField(
max_length=40, unique=True, verbose_name=_('Fingerprint')
)
length = models.PositiveIntegerField(verbose_name=_('Length'))
algorithm = models.PositiveIntegerField(verbose_name=_('Algorithm'))
user_id = models.TextField(verbose_name=_('User ID'))
key_type = models.CharField(max_length=3, verbose_name=_('Type'))
objects = KeyManager()
class Meta:
verbose_name = _('Key')
verbose_name_plural = _('Keys')
def save(self, *args, **kwargs):
temporary_directory = tempfile.mkdtemp()
logger.debug('temporary_directory: %s', temporary_directory)
gpg = gnupg.GPG(
gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value
)
import_results = gpg.import_keys(key_data=self.data)
logger.debug('import_results.results: %s', import_results.results)
logger.debug('import_results.fingerprints: %s', import_results.fingerprints)
key_data = gpg.list_keys(keys=import_results.fingerprints[0])[0]
logger.debug('key_data: %s', key_data)
shutil.rmtree(temporary_directory)
self.key_id = key_data['keyid']
self.algorithm = key_data['algo']
self.creation_date = date.fromtimestamp(int(key_data['date']))
if key_data['expires']:
self.expiration_date = date.fromtimestamp(int(key_data['expires']))
self.fingerprint = key_data['fingerprint']
self.length = int(key_data['length'])
self.user_id = key_data['uids'][0]
self.key_type = key_data['type']
super(Key, self).save(*args, **kwargs)
def __str__(self):
return self.key_id
def sign_file(self, file_object, passphrase=None, clearsign=True, detach=False, binary=False):
output = StringIO()
temporary_directory = tempfile.mkdtemp()
gpg = gnupg.GPG(
gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value
)
import_results = gpg.import_keys(key_data=self.data)