diff --git a/mayan/apps/django_gpg/managers.py b/mayan/apps/django_gpg/managers.py index 79a29b5af5..3ef0545fa2 100644 --- a/mayan/apps/django_gpg/managers.py +++ b/mayan/apps/django_gpg/managers.py @@ -39,7 +39,9 @@ class KeyManager(models.Manager): if not decrypt_result.status or decrypt_result.status == 'no data was provided': raise DecryptionError('Unable to decrypt file') - return str(decrypt_result) + file_object.close() + + return io.BytesIO(str(decrypt_result)) def receive_key(self, key_id): temporary_directory = tempfile.mkdtemp() @@ -109,8 +111,9 @@ class KeyManager(models.Manager): try: key = self.get(fingerprint__endswith=key_id) except self.model.DoesNotExist: - shutil.rmtree(temporary_directory) - raise KeyDoesNotExist('Specified key for verification not found in keyring') + pass + #shutil.rmtree(temporary_directory) + #raise KeyDoesNotExist('Specified key for verification not found in keyring') else: result = gpg.import_keys(key_data=key.key_data) @@ -135,12 +138,17 @@ class KeyManager(models.Manager): logger.debug('verify_result.status: %s', verify_result.status) + shutil.rmtree(temporary_directory) + if verify_result: - shutil.rmtree(temporary_directory) + # Signed and key present return SignatureVerification(verify_result.__dict__) elif verify_result.status == 'no public key' and not (key_fingerprint or all_keys or key_id): + # Signed but key not present, retry with key fetch file_object.seek(0) return self.verify_file(file_object=file_object, signature_file=signature_file, key_id=verify_result.key_id) + elif verify_result.key_id: + # Signed, retried and key still not found + return SignatureVerification(verify_result.__dict__) else: - shutil.rmtree(temporary_directory) raise VerificationError('File not signed') diff --git a/mayan/apps/django_gpg/tests/test_models.py b/mayan/apps/django_gpg/tests/test_models.py index 5b11afd959..e871ecf1b3 100644 --- a/mayan/apps/django_gpg/tests/test_models.py +++ b/mayan/apps/django_gpg/tests/test_models.py @@ -34,12 +34,25 @@ class KeyTestCase(TestCase): Key.objects.receive_key(key_id=TEST_SEARCH_FINGERPRINT) self.assertEqual(Key.objects.all().count(), 1) - self.assertEqual(Key.objects.first().fingerprint, TEST_SEARCH_FINGERPRINT) + self.assertEqual( + Key.objects.first().fingerprint, TEST_SEARCH_FINGERPRINT + ) + + def test_cleartext_file_verification(self): + cleartext_file = tempfile.TemporaryFile() + cleartext_file.write('test') + cleartext_file.seek(0) + + with self.assertRaises(VerificationError): + Key.objects.verify_file(file_object=cleartext_file) + + cleartext_file.close() def test_embedded_verification_no_key(self): with open(TEST_SIGNED_FILE) as signed_file: - with self.assertRaises(KeyDoesNotExist): - Key.objects.verify_file(signed_file) + result = Key.objects.verify_file(signed_file) + + self.assertTrue(result.key_id in TEST_KEY_FINGERPRINT) def test_embedded_verification_with_key(self): Key.objects.create(key_data=TEST_KEY_DATA) @@ -47,14 +60,15 @@ class KeyTestCase(TestCase): with open(TEST_SIGNED_FILE) as signed_file: result = Key.objects.verify_file(signed_file) - self.assertTrue(result.valid) self.assertEqual(result.fingerprint, TEST_KEY_FINGERPRINT) def test_embedded_verification_with_correct_fingerprint(self): Key.objects.create(key_data=TEST_KEY_DATA) with open(TEST_SIGNED_FILE) as signed_file: - result = Key.objects.verify_file(signed_file, key_fingerprint=TEST_KEY_FINGERPRINT) + result = Key.objects.verify_file( + signed_file, key_fingerprint=TEST_KEY_FINGERPRINT + ) self.assertTrue(result.valid) self.assertEqual(result.fingerprint, TEST_KEY_FINGERPRINT) @@ -72,7 +86,7 @@ class KeyTestCase(TestCase): with open(TEST_SIGNED_FILE) as signed_file: result = Key.objects.decrypt_file(file_object=signed_file) - self.assertEqual(result, TEST_SIGNED_FILE_CONTENT) + self.assertEqual(result.read(), TEST_SIGNED_FILE_CONTENT) def test_cleartext_file_decryption(self): cleartext_file = tempfile.TemporaryFile() @@ -87,15 +101,20 @@ class KeyTestCase(TestCase): def test_detached_verification_no_key(self): with open(TEST_DETACHED_SIGNATURE) as signature_file: with open(TEST_FILE) as test_file: - with self.assertRaises(KeyDoesNotExist): - Key.objects.verify_file(file_object=test_file, signature_file=signature_file) + result = Key.objects.verify_file( + file_object=test_file, signature_file=signature_file + ) + + self.assertTrue(result.key_id in TEST_KEY_FINGERPRINT) def test_detached_verification_with_key(self): Key.objects.create(key_data=TEST_KEY_DATA) with open(TEST_DETACHED_SIGNATURE) as signature_file: with open(TEST_FILE) as test_file: - result = Key.objects.verify_file(file_object=test_file, signature_file=signature_file) + result = Key.objects.verify_file( + file_object=test_file, signature_file=signature_file + ) self.assertTrue(result) self.assertEqual(result.fingerprint, TEST_KEY_FINGERPRINT) diff --git a/mayan/apps/documents/links.py b/mayan/apps/documents/links.py index e48512402b..f1bb286c83 100644 --- a/mayan/apps/documents/links.py +++ b/mayan/apps/documents/links.py @@ -18,7 +18,7 @@ from .settings import setting_zoom_max_level, setting_zoom_min_level def is_not_current_version(context): - return context['object'].document.latest_version.timestamp != context['object'].timestamp + return context['resolved_object'].document.latest_version.timestamp != context['resolved_object'].timestamp def is_first_page(context): @@ -40,12 +40,12 @@ def is_min_zoom(context): # Facet link_document_preview = Link( icon='fa fa-eye', permissions=(permission_document_view,), - text=_('Preview'), view='documents:document_preview', args='object.id' + text=_('Preview'), view='documents:document_preview', args='resolved_object.id' ) link_document_properties = Link( icon='fa fa-info', permissions=(permission_document_view,), text=_('Properties'), view='documents:document_properties', - args='object.id' + args='resolved_object.id' ) link_document_version_list = Link( icon='fa fa-code-fork', permissions=(permission_document_view,), @@ -61,32 +61,32 @@ link_document_pages = Link( link_document_clear_transformations = Link( permissions=(permission_transformation_delete,), text=_('Clear transformations'), - view='documents:document_clear_transformations', args='object.id' + view='documents:document_clear_transformations', args='resolved_object.id' ) link_document_delete = Link( permissions=(permission_document_delete,), tags='dangerous', - text=_('Delete'), view='documents:document_delete', args='object.id' + text=_('Delete'), view='documents:document_delete', args='resolved_object.id' ) link_document_trash = Link( permissions=(permission_document_trash,), tags='dangerous', - text=_('Move to trash'), view='documents:document_trash', args='object.id' + text=_('Move to trash'), view='documents:document_trash', args='resolved_object.id' ) link_document_edit = Link( permissions=(permission_document_properties_edit,), text=_('Edit properties'), view='documents:document_edit', - args='object.id' + args='resolved_object.id' ) link_document_document_type_edit = Link( permissions=(permission_document_properties_edit,), text=_('Change type'), - view='documents:document_document_type_edit', args='object.id' + view='documents:document_document_type_edit', args='resolved_object.id' ) link_document_download = Link( permissions=(permission_document_download,), text=_('Download'), - view='documents:document_download', args='object.id' + view='documents:document_download', args='resolved_object.id' ) link_document_print = Link( permissions=(permission_document_print,), text=_('Print'), - view='documents:document_print', args='object.id' + view='documents:document_print', args='resolved_object.id' ) link_document_update_page_count = Link( permissions=(permission_document_tools,), text=_('Recalculate page count'), @@ -125,7 +125,7 @@ link_document_multiple_restore = Link( ) link_document_version_download = Link( args='object.pk', permissions=(permission_document_download,), - text=_('Download'), view='documents:document_version_download' + text=_('Download version'), view='documents:document_version_download' ) # Views diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index 7f32be5832..04f0d49a3d 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -322,10 +322,6 @@ class Document(models.Model): # Document has no version yet return 0 - @property - def signature_state(self): - return self.latest_version.signature_state - class DeletedDocument(Document): objects = TrashCanManager()