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