Initial code for database stored GPG keys.
This commit is contained in:
27
mayan/apps/django_gpg/admin.py
Normal file
27
mayan/apps/django_gpg/admin.py
Normal 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'))
|
||||||
|
"""
|
||||||
32
mayan/apps/django_gpg/migrations/0001_initial.py
Normal file
32
mayan/apps/django_gpg/migrations/0001_initial.py
Normal 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',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
0
mayan/apps/django_gpg/migrations/__init__.py
Normal file
0
mayan/apps/django_gpg/migrations/__init__.py
Normal file
130
mayan/apps/django_gpg/models.py
Normal file
130
mayan/apps/django_gpg/models.py
Normal 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)
|
||||||
|
|
||||||
Reference in New Issue
Block a user