Update DocumentVersionSignatureCreateForm

Use FilteredSelectionForm. Improve document signatures tests.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-04-15 02:29:08 -04:00
parent cdb55ab5dd
commit 0d2a827413
7 changed files with 146 additions and 193 deletions

View File

@@ -62,6 +62,8 @@
* Use FilteredSelectionForm to add a new ACLCreateForm.
* Rename IndexListForm to IndexTemplateFilteredForm.
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm.
* Improve document signatures tests.
3.1.11 (2019-04-XX)
===================

View File

@@ -34,12 +34,20 @@ Move the development URL definitions for Rosetta and Debug toolbar
to a separate URL file. Convert the single urls.py to a module to
allow multiple URL files to be used.
Settings
^^^^^^^^
New default value for setting DOCUMENTS_HASH_BLOCK_SIZE is 65535.
New default value for setting MIMETYPE_FILE_READ_SIZE is 1024.
User interface
^^^^^^^^^^^^^^
Usage of select2 in more places (FilteredSelectionForm).
Cabinets, Tags, Rebuild index.
Other changes
^^^^^^^^^^^^^
@@ -86,6 +94,8 @@ Other changes
* Use FilteredSelectionForm to add a new ACLCreateForm.
* Rename IndexListForm to IndexTemplateFilteredForm.
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm.
* Improve document signatures tests.
Removals
--------

View File

@@ -5,8 +5,7 @@ import logging
from django import forms
from django.utils.translation import ugettext_lazy as _
from mayan.apps.acls.models import AccessControlList
from mayan.apps.common.forms import DetailForm
from mayan.apps.common.forms import DetailForm, FilteredSelectionForm
from mayan.apps.django_gpg.models import Key
from mayan.apps.django_gpg.permissions import permission_key_sign
@@ -15,28 +14,30 @@ from .models import SignatureBaseModel
logger = logging.getLogger(__name__)
class DocumentVersionSignatureCreateForm(forms.Form):
class DocumentVersionSignatureCreateForm(FilteredSelectionForm):
key = forms.ModelChoiceField(
label=_('Key'), queryset=Key.objects.none()
)
passphrase = forms.CharField(
label=_('Passphrase'), required=False,
help_text=_(
'The passphrase to unlock the key and allow it to be used to '
'sign the document version.'
), label=_('Passphrase'), required=False,
widget=forms.widgets.PasswordInput
)
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
logger.debug('user: %s', user)
super(
DocumentVersionSignatureCreateForm, self
).__init__(*args, **kwargs)
queryset = AccessControlList.objects.filter_by_access(
permission_key_sign, user, queryset=Key.objects.private_keys()
class Meta:
allow_multiple = False
field_name = 'key'
label = _('Key')
help_text = _(
'Private key that will be used to sign this document version.'
)
self.fields['key'].queryset = queryset
permission = permission_key_sign
queryset = Key.objects.private_keys()
required = True
widget_attributes = {'class': 'select2'}
class DocumentVersionSignatureDetailForm(DetailForm):

View File

@@ -0,0 +1,22 @@
from __future__ import absolute_import, unicode_literals
from django.core.files import File
from mayan.apps.django_gpg.models import Key
from ..models import DetachedSignature
from .literals import TEST_KEY_FILE, TEST_SIGNATURE_FILE_PATH
class SignaturesTestMixin(object):
def _create_detached_signature(self):
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
self.test_signature = DetachedSignature.objects.create(
document_version=self.document.latest_version,
signature_file=File(file_object)
)
def _create_test_key(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
self.test_key = Key.objects.create(key_data=file_object.read())

View File

@@ -4,7 +4,6 @@ import hashlib
import logging
import time
from django.core.files import File
from django.test import override_settings
from mayan.apps.common.tests import BaseTestCase
@@ -19,13 +18,13 @@ from ..models import DetachedSignature, EmbeddedSignature
from ..tasks import task_verify_missing_embedded_signature
from .literals import (
TEST_SIGNED_DOCUMENT_PATH, TEST_SIGNATURE_FILE_PATH, TEST_KEY_FILE,
TEST_KEY_ID, TEST_SIGNATURE_ID
TEST_SIGNED_DOCUMENT_PATH, TEST_KEY_FILE, TEST_KEY_ID, TEST_SIGNATURE_ID
)
from .mixins import SignaturesTestMixin
@override_settings(OCR_AUTO_OCR=False)
class DocumentSignaturesTestCase(BaseTestCase):
class DocumentSignaturesTestCase(SignaturesTestMixin, BaseTestCase):
def setUp(self):
super(DocumentSignaturesTestCase, self).setUp()
self.document_type = DocumentType.objects.create(
@@ -123,66 +122,56 @@ class DocumentSignaturesTestCase(BaseTestCase):
def test_detached_signature_no_key(self):
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.assertEqual(DetachedSignature.objects.count(), 1)
signature = DetachedSignature.objects.first()
self.assertEqual(signature.document_version, document.latest_version)
self.assertEqual(signature.key_id, TEST_KEY_ID)
self.assertEqual(signature.public_key_fingerprint, None)
self.assertEqual(
self.test_signature.document_version, self.document.latest_version
)
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
self.assertEqual(self.test_signature.public_key_fingerprint, None)
def test_detached_signature_with_key(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
key = Key.objects.create(key_data=file_object.read())
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.assertEqual(DetachedSignature.objects.count(), 1)
signature = DetachedSignature.objects.first()
self.assertEqual(signature.document_version, document.latest_version)
self.assertEqual(signature.key_id, TEST_KEY_ID)
self.assertEqual(signature.public_key_fingerprint, key.fingerprint)
self.assertEqual(
self.test_signature.document_version, self.document.latest_version
)
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
self.assertEqual(
self.test_signature.public_key_fingerprint, key.fingerprint
)
def test_detached_signature_post_key_verify(self):
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.assertEqual(DetachedSignature.objects.count(), 1)
signature = DetachedSignature.objects.first()
self.assertEqual(signature.document_version, document.latest_version)
self.assertEqual(signature.key_id, TEST_KEY_ID)
self.assertEqual(signature.public_key_fingerprint, None)
self.assertEqual(
self.test_signature.document_version, self.document.latest_version
)
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
self.assertEqual(self.test_signature.public_key_fingerprint, None)
with open(TEST_KEY_FILE, mode='rb') as file_object:
key = Key.objects.create(key_data=file_object.read())
@@ -196,23 +185,21 @@ class DocumentSignaturesTestCase(BaseTestCase):
key = Key.objects.create(key_data=file_object.read())
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.assertEqual(DetachedSignature.objects.count(), 1)
signature = DetachedSignature.objects.first()
self.assertEqual(signature.document_version, document.latest_version)
self.assertEqual(signature.key_id, TEST_KEY_ID)
self.assertEqual(signature.public_key_fingerprint, key.fingerprint)
self.assertEqual(
self.test_signature.document_version, self.document.latest_version
)
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
self.assertEqual(
self.test_signature.public_key_fingerprint, key.fingerprint
)
key.delete()

View File

@@ -2,11 +2,8 @@ from __future__ import absolute_import, unicode_literals
import logging
from django.core.files import File
from django_downloadview.test import assert_download_response
from mayan.apps.django_gpg.models import Key
from mayan.apps.documents.models import DocumentVersion
from mayan.apps.documents.tests import (
GenericDocumentViewTestCase, TEST_DOCUMENT_PATH
@@ -21,15 +18,14 @@ from ..permissions import (
permission_document_version_signature_view
)
from .literals import (
TEST_SIGNATURE_FILE_PATH, TEST_SIGNED_DOCUMENT_PATH, TEST_KEY_FILE
)
from .literals import TEST_SIGNATURE_FILE_PATH, TEST_SIGNED_DOCUMENT_PATH
from .mixins import SignaturesTestMixin
TEST_UNSIGNED_DOCUMENT_COUNT = 4
TEST_SIGNED_DOCUMENT_COUNT = 2
class SignaturesViewTestCase(GenericDocumentViewTestCase):
class SignaturesViewTestCase(SignaturesTestMixin, GenericDocumentViewTestCase):
def setUp(self):
super(SignaturesViewTestCase, self).setUp()
self.login_user()
@@ -41,251 +37,198 @@ class SignaturesViewTestCase(GenericDocumentViewTestCase):
)
def test_signature_list_view_no_permission(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
Key.objects.create(key_data=file_object.read())
self._create_test_key()
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
response = self._request_document_version_signature_list_view(
document=document
document=self.document
)
self.assertEqual(response.status_code, 403)
def test_signature_list_view_with_access(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
Key.objects.create(key_data=file_object.read())
self._create_test_key()
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.grant_access(
obj=document,
obj=self.document,
permission=permission_document_version_signature_view
)
response = self._request_document_version_signature_list_view(
document=document
document=self.document
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['object_list'].count(), 1)
def _request_document_version_signature_details_view(self, signature):
def _request_document_version_signature_details_view(self):
return self.get(
viewname='signatures:document_version_signature_details',
args=(signature.pk,)
args=(self.test_signature.pk,)
)
def test_signature_detail_view_no_permission(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
Key.objects.create(key_data=file_object.read())
self._create_test_key()
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
signature = DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
response = self._request_document_version_signature_details_view(
signature=signature
)
response = self._request_document_version_signature_details_view()
self.assertEqual(response.status_code, 403)
def test_signature_detail_view_with_access(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
Key.objects.create(key_data=file_object.read())
self._create_test_key()
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
signature = DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.grant_access(
obj=document,
obj=self.document,
permission=permission_document_version_signature_view
)
response = self._request_document_version_signature_details_view(
signature=signature
)
response = self._request_document_version_signature_details_view()
self.assertContains(
response=response, text=signature.signature_id, status_code=200
response=response, text=self.test_signature.signature_id,
status_code=200
)
def _request_document_version_signature_upload_view(self, document_version):
def _request_document_version_signature_upload_view(self):
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
return self.post(
viewname='signatures:document_version_signature_upload',
args=(document_version.pk,),
kwargs={'pk': self.document.latest_version.pk},
data={'signature_file': file_object}
)
def test_signature_upload_view_no_permission(self):
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
response = self._request_document_version_signature_upload_view(
document_version=document.latest_version
)
response = self._request_document_version_signature_upload_view()
self.assertEqual(response.status_code, 403)
self.assertEqual(DetachedSignature.objects.count(), 0)
def test_signature_upload_view_with_access(self):
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
self.grant_access(
obj=document,
obj=self.document,
permission=permission_document_version_signature_upload
)
response = self._request_document_version_signature_upload_view(
document_version=document.latest_version
)
response = self._request_document_version_signature_upload_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(DetachedSignature.objects.count(), 1)
def _request_document_version_signature_download_view(self, signature):
def _request_document_version_signature_download_view(self):
return self.get(
viewname='signatures:document_version_signature_download',
args=(signature.pk,),
kwargs={'pk': self.test_signature.pk}
)
def test_signature_download_view_no_permission(self):
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
signature = DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
response = self._request_document_version_signature_download_view(
signature=signature
)
response = self._request_document_version_signature_download_view()
self.assertEqual(response.status_code, 403)
def test_signature_download_view_with_access(self):
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
signature = DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.grant_access(
obj=document,
obj=self.document,
permission=permission_document_version_signature_download
)
self.expected_content_type = 'application/octet-stream; charset=utf-8'
response = self._request_document_version_signature_download_view(
signature=signature
)
response = self._request_document_version_signature_download_view()
with signature.signature_file as file_object:
with self.test_signature.signature_file as file_object:
assert_download_response(
self, response=response, content=file_object.read(),
)
def _request_document_version_signature_delete_view(self, signature):
def _request_document_version_signature_delete_view(self):
return self.post(
viewname='signatures:document_version_signature_delete',
args=(signature.pk,)
kwargs={'pk': self.test_signature.pk}
)
def test_signature_delete_view_no_permission(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
Key.objects.create(key_data=file_object.read())
self._create_test_key()
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
signature = DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.grant_access(
obj=document,
obj=self.document,
permission=permission_document_version_signature_view
)
response = self._request_document_version_signature_delete_view(
signature=signature
)
response = self._request_document_version_signature_delete_view()
self.assertEqual(response.status_code, 403)
self.assertEqual(DetachedSignature.objects.count(), 1)
def test_signature_delete_view_with_access(self):
with open(TEST_KEY_FILE, mode='rb') as file_object:
Key.objects.create(key_data=file_object.read())
self._create_test_key()
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
document = self.document_type.new_document(
self.document = self.document_type.new_document(
file_object=file_object
)
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
signature = DetachedSignature.objects.create(
document_version=document.latest_version,
signature_file=File(file_object)
)
self._create_detached_signature()
self.grant_access(
obj=document,
obj=self.document,
permission=permission_document_version_signature_delete
)
self.grant_access(
obj=document,
obj=self.document,
permission=permission_document_version_signature_view
)
response = self._request_document_version_signature_delete_view(
signature=signature
)
response = self._request_document_version_signature_delete_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(DetachedSignature.objects.count(), 0)

View File

@@ -54,7 +54,7 @@ class DocumentVersionDetachedSignatureCreateView(FormView):
passphrase = form.cleaned_data['passphrase'] or None
AccessControlList.objects.check_access(
permissions=permission_key_sign, user=self.request.user, obj=key
obj=key, permissions=permission_key_sign, user=self.request.user
)
try:
@@ -124,14 +124,8 @@ class DocumentVersionDetachedSignatureCreateView(FormView):
) % self.get_document_version(),
}
def get_form_kwargs(self):
result = super(
DocumentVersionDetachedSignatureCreateView, self
).get_form_kwargs()
result.update({'user': self.request.user})
return result
def get_form_extra_kwargs(self):
return {'user': self.request.user}
def get_post_action_redirect(self):
return reverse(
@@ -193,7 +187,7 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
return HttpResponseRedirect(
reverse(
'signatures:document_version_signature_list',
viewname='signatures:document_version_signature_list',
args=(new_version.pk,)
)
)
@@ -223,14 +217,8 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
) % self.get_document_version(),
}
def get_form_kwargs(self):
result = super(
DocumentVersionEmbeddedSignatureCreateView, self
).get_form_kwargs()
result.update({'user': self.request.user})
return result
def get_form_extra_kwargs(self):
return {'user': self.request.user}
class DocumentVersionSignatureDeleteView(SingleObjectDeleteView):