diff --git a/mayan/apps/django_gpg/admin.py b/mayan/apps/django_gpg/admin.py new file mode 100644 index 0000000000..4de5c004be --- /dev/null +++ b/mayan/apps/django_gpg/admin.py @@ -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')) + """ diff --git a/mayan/apps/django_gpg/migrations/0001_initial.py b/mayan/apps/django_gpg/migrations/0001_initial.py new file mode 100644 index 0000000000..df1505e689 --- /dev/null +++ b/mayan/apps/django_gpg/migrations/0001_initial.py @@ -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', + }, + ), + ] diff --git a/mayan/apps/django_gpg/migrations/__init__.py b/mayan/apps/django_gpg/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mayan/apps/django_gpg/models.py b/mayan/apps/django_gpg/models.py new file mode 100644 index 0000000000..49f7763b51 --- /dev/null +++ b/mayan/apps/django_gpg/models.py @@ -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) +