diff --git a/apps/document_signatures/__init__.py b/apps/document_signatures/__init__.py index f8a60505ac..0a34ed064d 100644 --- a/apps/document_signatures/__init__.py +++ b/apps/document_signatures/__init__.py @@ -4,34 +4,35 @@ import logging try: from cStringIO import StringIO except ImportError: - from StringIO import StringIO + from StringIO import StringIO from django.utils.translation import ugettext_lazy as _ from django.db.models.signals import post_save from documents.models import Document, DocumentVersion -from navigation.api import register_links, register_top_menu, \ - register_model_list_columns, register_multi_item_links, \ - register_sidebar_template +from navigation.api import register_links + from django_gpg.runtime import gpg -from django_gpg.exceptions import GPGDecryptionError +from django_gpg.exceptions import GPGDecryptionError from .models import DocumentVersionSignature from .permissions import ( - PERMISSION_DOCUMENT_VERIFY, + PERMISSION_DOCUMENT_VERIFY, PERMISSION_SIGNATURE_UPLOAD, PERMISSION_SIGNATURE_DOWNLOAD - ) +) logger = logging.getLogger(__name__) def has_embedded_signature(context): return DocumentVersionSignature.objects.has_embedded_signature(context['object']) - + + def doesnt_have_detached_signature(context): return DocumentVersionSignature.objects.has_detached_signature(context['object']) == False + def document_pre_open_hook(descriptor): try: result = gpg.decrypt_file(descriptor, close_descriptor=False) @@ -43,9 +44,10 @@ def document_pre_open_hook(descriptor): else: return StringIO(result.data) + def document_post_save(sender, instance, **kwargs): if kwargs.get('created', False): - DocumentVersionSignature.objects.signature_state(instance.document) + DocumentVersionSignature.objects.signature_state(instance.document) document_signature_upload = {'text': _(u'upload signature'), 'view': 'document_signature_upload', 'args': 'object.pk', 'famfam': 'pencil_add', 'permissions': [PERMISSION_SIGNATURE_UPLOAD], 'conditional_disable': has_embedded_signature} document_signature_download = {'text': _(u'download signature'), 'view': 'document_signature_download', 'args': 'object.pk', 'famfam': 'disk', 'permissions': [PERMISSION_SIGNATURE_DOWNLOAD], 'conditional_disable': doesnt_have_detached_signature} diff --git a/apps/document_signatures/managers.py b/apps/document_signatures/managers.py index 04980e3094..f4ed8c28f9 100644 --- a/apps/document_signatures/managers.py +++ b/apps/document_signatures/managers.py @@ -3,7 +3,7 @@ import logging from django.db import models from django_gpg.runtime import gpg -from django_gpg.exceptions import GPGVerificationError, GPGDecryptionError +from django_gpg.exceptions import GPGVerificationError logger = logging.getLogger(__name__) @@ -33,24 +33,24 @@ class DocumentVersionSignatureManager(models.Manager): document_signature.save() else: raise Exception('document already has an embedded signature') - + def has_detached_signature(self, document): document_signature, created = self.model.objects.get_or_create( document_version=document.latest_version, - ) + ) if document_signature.signature_file: return True else: return False - + def has_embedded_signature(self, document): logger.debug('document: %s' % document) - + if self.signature_state(document): return True else: return False - + def signature_state(self, document): document_signature, created = self.model.objects.get_or_create( document_version=document.latest_version, @@ -65,26 +65,26 @@ class DocumentVersionSignatureManager(models.Manager): except GPGVerificationError: document_signature.signature_state = None finally: - document_signature.save() - + document_signature.save() + #document_signature.signature_state = self.verify_signature(document).status #document_signature.save() - + return document_signature.signature_state - + def detached_signature(self, document): document_signature, created = self.model.objects.get_or_create( document_version=document.latest_version, - ) + ) return document_signature.signature_file.storage.open(document_signature.signature_file.path) - + def verify_signature(self, document): if self.has_detached_signature(document): logger.debug('has detached signature') args = (document.open(raw=True), self.detached_signature(document)) else: args = (document.open(raw=True),) - + try: return gpg.verify_w_retry(*args) except GPGVerificationError: diff --git a/apps/document_signatures/models.py b/apps/document_signatures/models.py index 3f2b40c057..0f82666b84 100644 --- a/apps/document_signatures/models.py +++ b/apps/document_signatures/models.py @@ -19,9 +19,9 @@ class DocumentVersionSignature(models.Model): document_version = models.ForeignKey(DocumentVersion, verbose_name=_(u'document version'), editable=False) signature_state = models.CharField(blank=True, null=True, max_length=16, verbose_name=_(u'signature state'), editable=False) signature_file = models.FileField(blank=True, null=True, upload_to=get_filename_from_uuid, storage=STORAGE_BACKEND(), verbose_name=_(u'signature file'), editable=False) - + objects = DocumentVersionSignatureManager() class Meta: verbose_name = _(u'document version signature') - verbose_name_plural = _(u'document version signatures') + verbose_name_plural = _(u'document version signatures') diff --git a/apps/document_signatures/views.py b/apps/document_signatures/views.py index dd83df19be..6c3d51fddf 100644 --- a/apps/document_signatures/views.py +++ b/apps/document_signatures/views.py @@ -8,21 +8,15 @@ from django.http import HttpResponseRedirect from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext from django.contrib import messages -from django.core.urlresolvers import reverse from django.utils.safestring import mark_safe from django.conf import settings from django.template.defaultfilters import force_escape from documents.models import Document, RecentDocument from permissions.api import check_permissions -from common.utils import pretty_size, parse_range, urlquote, \ - return_diff, encapsulate from filetransfers.api import serve_file - -from django_gpg.api import Key, SIGNATURE_STATES -from django_gpg.runtime import gpg -from django_gpg.exceptions import (GPGVerificationError, KeyFetchingError, - KeyImportError) + +from django_gpg.api import SIGNATURE_STATES from . import (PERMISSION_DOCUMENT_VERIFY, PERMISSION_SIGNATURE_UPLOAD, PERMISSION_SIGNATURE_DOWNLOAD) @@ -30,18 +24,18 @@ from .forms import DetachedSignatureForm from .models import DocumentVersionSignature logger = logging.getLogger(__name__) - + def document_verify(request, document_pk): check_permissions(request.user, [PERMISSION_DOCUMENT_VERIFY]) document = get_object_or_404(Document, pk=document_pk) RecentDocument.objects.add_document_for_user(request.user, document) - + signature = DocumentVersionSignature.objects.verify_signature(document) signature_state = SIGNATURE_STATES.get(getattr(signature, 'status', None)) - + widget = (u'' % (settings.STATIC_URL, signature_state['icon'])) paragraphs = [ _(u'Signature status: %(widget)s %(text)s') % { @@ -65,21 +59,21 @@ def document_verify(request, document_pk): _(u'Signee: %s') % force_escape(getattr(signature, 'username', u'')), ] ) - + return render_to_response('generic_template.html', { 'title': _(u'signature properties for: %s') % document, 'object': document, 'document': document, 'paragraphs': paragraphs, }, context_instance=RequestContext(request)) - - + + def document_signature_upload(request, document_pk): check_permissions(request.user, [PERMISSION_SIGNATURE_UPLOAD]) document = get_object_or_404(Document, pk=document_pk) RecentDocument.objects.add_document_for_user(request.user, document) - + post_action_redirect = None previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/'))) @@ -105,8 +99,8 @@ def document_signature_upload(request, document_pk): 'previous': previous, 'object': document, }, context_instance=RequestContext(request)) - - + + def document_signature_download(request, document_pk): check_permissions(request.user, [PERMISSION_SIGNATURE_DOWNLOAD]) document = get_object_or_404(Document, pk=document_pk)