From 735d3db97a4ad54a45be6d3d1b9c171738b5a231 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sun, 5 Feb 2012 00:19:54 -0400 Subject: [PATCH] Merge django_gpg's verify_file + verify_w_retry methods --- apps/django_gpg/api.py | 57 ++++++++++++---------------- apps/document_signatures/managers.py | 2 +- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/apps/django_gpg/api.py b/apps/django_gpg/api.py index 21b41df4fd..7071135af6 100644 --- a/apps/django_gpg/api.py +++ b/apps/django_gpg/api.py @@ -173,31 +173,11 @@ class GPG(object): self.keyservers = keyservers self.gpg = gnupg.GPG(**kwargs) - - def verify_w_retry(self, file_input, detached_signature=None): - logger.debug('file_input type: %s' % type(file_input)) - - input_descriptor = GPG.get_descriptor(file_input) - - try: - verify = self.verify_file(input_descriptor, detached_signature, close_descriptor=False) - if verify.status == 'no public key': - # Try to fetch the public key from the keyservers - try: - self.receive_key(verify.key_id) - return self.verify_w_retry(input_descriptor, detached_signature) - except KeyFetchingError: - return verify - else: - input_descriptor.close() - return verify - except IOError: - return False - - def verify_file(self, file_input, detached_signature=None, close_descriptor=True): - ''' + + def verify_file(self, file_input, detached_signature=None, close_descriptor=True, fetch_key=False): + """ Verify the signature of a file. - ''' + """ input_descriptor = GPG.get_descriptor(file_input) @@ -213,15 +193,28 @@ class GPG(object): else: verify = self.gpg.verify_file(input_descriptor) - if close_descriptor: - input_descriptor.close() - + logger.debug('verify.status: %s' % getattr(verify, 'status', None)) if verify: + logger.debug('verify ok') + if close_descriptor: + input_descriptor.close() return verify - #elif getattr(verify, 'status', None) == 'no public key': - # # Exception to the rule, to be able to query the keyservers - # return verify + elif getattr(verify, 'status', None) == 'no public key': + # Exception to the rule, to be able to query the keyservers + if fetch_key: + try: + self.receive_key(verify.key_id) + return self.verify_file(input_descriptor, detached_signature, close_descriptor, fetch_key=False) + except KeyFetchingError: + if close_descriptor: + input_descriptor.close() + return verify + else: + return verify else: + logger.debug('No verify') + if close_descriptor: + input_descriptor.close() raise GPGVerificationError() def verify(self, data): @@ -234,12 +227,12 @@ class GPG(object): raise GPGVerificationError(verify.status) def sign_file(self, file_input, key=None, destination=None, key_id=None, passphrase=None, clearsign=False): - ''' + """ Signs a filename, storing the signature and the original file in the destination filename provided (the destination file is overrided if it already exists), if no destination file name is provided the signature is returned. - ''' + """ kwargs = {} kwargs['clearsign'] = clearsign diff --git a/apps/document_signatures/managers.py b/apps/document_signatures/managers.py index f1c7bd39dc..af967f30ca 100644 --- a/apps/document_signatures/managers.py +++ b/apps/document_signatures/managers.py @@ -59,6 +59,6 @@ class DocumentVersionSignatureManager(models.Manager): args = (document.open(raw=True),) try: - return gpg.verify_w_retry(*args) + return gpg.verify_file(*args, fetch_key=True) except GPGVerificationError: return None