def save(self, *args, **kwargs): temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG(gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value) import_results = gpg.import_keys(key_data=self.key_data) key_info = gpg.list_keys(keys=import_results.fingerprints[0])[0] logger.debug('key_info: %s', key_info) shutil.rmtree(temporary_directory) self.algorithm = key_info['algo'] self.creation_date = date.fromtimestamp(int(key_info['date'])) if key_info['expires']: self.expiration_date = date.fromtimestamp(int(key_info['expires'])) self.fingerprint = key_info['fingerprint'] self.length = int(key_info['length']) self.user_id = key_info['uids'][0] if OUTPUT_MESSAGE_CONTAINS_PRIVATE_KEY in import_results.results[0][ 'text']: self.key_type = KEY_TYPE_SECRET else: self.key_type = key_info['type'] super(Key, self).save(*args, **kwargs)
def gpg_command(function): temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG(gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value) result = function(gpg=gpg) shutil.rmtree(temporary_directory) return result
def gpg_command(self, function, **kwargs): temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG( gnupghome=temporary_directory, gpgbinary=self.kwargs['binary_path'] ) result = function(gpg=gpg, **kwargs) shutil.rmtree(temporary_directory) return result
def decrypt_file(self, file_object, all_keys=False, key_fingerprint=None, key_id=None): temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG(gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value) # Preload keys if all_keys: logger.debug('preloading all keys') for key in self.all(): gpg.import_keys(key_data=key.key_data) elif key_fingerprint: logger.debug('preloading key fingerprint: %s', key_fingerprint) try: key = self.get(fingerprint=key_fingerprint) except self.model.DoesNotExist: logger.debug('key fingerprint %s not found', key_fingerprint) shutil.rmtree(temporary_directory) raise KeyDoesNotExist( 'Specified key for verification not found') else: gpg.import_keys(key_data=key.key_data) elif key_id: logger.debug('preloading key id: %s', key_id) try: key = self.get(fingerprint__endswith=key_id) except self.model.DoesNotExist: logger.debug('key id %s not found', key_id) else: gpg.import_keys(key_data=key.key_data) logger.debug('key id %s impored', key_id) decrypt_result = gpg.decrypt_file(file=file_object) shutil.rmtree(temporary_directory) logger.debug('decrypt_result.status: %s', decrypt_result.status) if not decrypt_result.status or decrypt_result.status == 'no data was provided': raise DecryptionError('Unable to decrypt file') file_object.close() return io.BytesIO(decrypt_result.data)
def test_issue_gh_163(self): """ Non-ASCII chars in document name failing in upload via watch folder gh-issue #163 https://github.com/mayan-edms/mayan-edms/issues/163 """ temporary_directory = mkdtemp() shutil.copy(TEST_NON_ASCII_DOCUMENT_PATH, temporary_directory) watch_folder = WatchFolderSource.objects.create( document_type=self.document_type, folder_path=temporary_directory, uncompress=SOURCE_UNCOMPRESS_CHOICE_Y ) watch_folder.check_source() self.assertEqual(Document.objects.count(), 1) document = Document.objects.first() self.assertEqual(document.exists(), True) self.assertEqual(document.size, 17436) self.assertEqual(document.file_mimetype, 'image/png') self.assertEqual(document.file_mime_encoding, 'binary') self.assertEqual(document.label, TEST_NON_ASCII_DOCUMENT_FILENAME) self.assertEqual(document.page_count, 1) # Test Non-ASCII named documents inside Non-ASCII named compressed file shutil.copy( TEST_NON_ASCII_COMPRESSED_DOCUMENT_PATH, temporary_directory ) watch_folder.check_source() document = Document.objects.all()[1] self.assertEqual(Document.objects.count(), 2) self.assertEqual(document.exists(), True) self.assertEqual(document.size, 17436) self.assertEqual(document.file_mimetype, 'image/png') self.assertEqual(document.file_mime_encoding, 'binary') self.assertEqual(document.label, TEST_NON_ASCII_DOCUMENT_FILENAME) self.assertEqual(document.page_count, 1) shutil.rmtree(temporary_directory)
def search(self, query): temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG(gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value) key_data_list = gpg.search_keys(query=query, keyserver=setting_keyserver.value) shutil.rmtree(temporary_directory) result = [] for key_data in key_data_list: result.append(KeyStub(raw=key_data)) return result
def receive_key(self, key_id): temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG(gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value) import_results = gpg.recv_keys(setting_keyserver.value, key_id) if not import_results.count: shutil.rmtree(temporary_directory) raise KeyFetchingError('No key found') else: key_data = gpg.export_keys(import_results.fingerprints[0]) shutil.rmtree(temporary_directory) return self.create(key_data=key_data)
def test_unicode_staging_file(self): temporary_directory = mkdtemp() shutil.copy(TEST_NON_ASCII_DOCUMENT_PATH, temporary_directory) filename = os.path.basename(TEST_NON_ASCII_DOCUMENT_PATH) class MockStagingFolder(object): self.folder_path = temporary_directory staging_file_1 = StagingFile(staging_folder=MockStagingFolder(), filename=filename) staging_file_2 = StagingFile( staging_folder=MockStagingFolder(), encoded_filename=staging_file_1.encoded_filename) self.assertEqual(filename, staging_file_2.filename) shutil.rmtree(temporary_directory)
def sign_file(self, file_object, passphrase=None, clearsign=False, detached=False, binary=False, output=None): # WARNING: using clearsign=True and subsequent decryption corrupts the # file. Appears to be a problem in python-gnupg or gpg itself. # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=55647 # "The problems differ from run to run and file to # file, and appear to be due to random data being inserted in the # output data stream." temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG(gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value) import_results = gpg.import_keys(key_data=self.key_data) file_sign_results = gpg.sign_file(file=file_object, keyid=import_results.fingerprints[0], passphrase=passphrase, clearsign=clearsign, detach=detached, binary=binary, output=output) shutil.rmtree(temporary_directory) logger.debug('file_sign_results.stderr: %s', file_sign_results.stderr) if ERROR_MSG_NEED_PASSPHRASE in file_sign_results.stderr: if ERROR_MSG_BAD_PASSPHRASE in file_sign_results.stderr: raise PassphraseError elif ERROR_MSG_GOOD_PASSPHRASE not in file_sign_results.stderr: raise NeedPassphrase return file_sign_results
def test_unicode_staging_file(self): temporary_directory = mkdtemp() shutil.copy(TEST_NON_ASCII_DOCUMENT_PATH, temporary_directory) filename = os.path.basename(TEST_NON_ASCII_DOCUMENT_PATH) class MockStagingFolder(object): self.folder_path = temporary_directory staging_file_1 = StagingFile( staging_folder=MockStagingFolder(), filename=filename ) staging_file_2 = StagingFile( staging_folder=MockStagingFolder(), encoded_filename=staging_file_1.encoded_filename ) self.assertEqual(filename, staging_file_2.filename) shutil.rmtree(temporary_directory)
def soffice(self): """ Executes LibreOffice as a subprocess """ if not LIBREOFFICE: raise OfficeConversionError( _('LibreOffice not installed or not found.') ) new_file_object, input_filepath = mkstemp() self.file_object.seek(0) os.write(new_file_object, self.file_object.read()) self.file_object.seek(0) os.lseek(new_file_object, 0, os.SEEK_SET) os.close(new_file_object) libreoffice_filter = None if self.mime_type == 'text/plain': libreoffice_filter = 'Text (encoded):UTF8,LF,,,' libreoffice_home_directory = mkdtemp() args = ( input_filepath, '--outdir', setting_temporary_directory.value, '-env:UserInstallation=file://{}'.format( os.path.join( libreoffice_home_directory, 'LibreOffice_Conversion' ) ), ) kwargs = {'_env': {'HOME': libreoffice_home_directory}} if libreoffice_filter: kwargs.update({'infilter': libreoffice_filter}) try: LIBREOFFICE(*args, **kwargs) except sh.ErrorReturnCode as exception: raise OfficeConversionError(exception) except Exception as exception: logger.error('Exception launching Libre Office; %s', exception) raise finally: fs_cleanup(input_filepath) fs_cleanup(libreoffice_home_directory) filename, extension = os.path.splitext( os.path.basename(input_filepath) ) logger.debug('filename: %s', filename) logger.debug('extension: %s', extension) converted_output = os.path.join( setting_temporary_directory.value, os.path.extsep.join( (filename, 'pdf') ) ) logger.debug('converted_output: %s', converted_output) with open(converted_output) as converted_file_object: while True: data = converted_file_object.read(CHUNK_SIZE) if not data: break yield data fs_cleanup(input_filepath) fs_cleanup(converted_output)
def verify_file(self, file_object, signature_file=None, all_keys=False, key_fingerprint=None, key_id=None): temporary_directory = mkdtemp() os.chmod(temporary_directory, 0x1C0) gpg = gnupg.GPG(gnupghome=temporary_directory, gpgbinary=setting_gpg_path.value) # Preload keys if all_keys: logger.debug('preloading all keys') for key in self.all(): gpg.import_keys(key_data=key.key_data) elif key_fingerprint: logger.debug('preloading key fingerprint: %s', key_fingerprint) try: key = self.get(fingerprint=key_fingerprint) except self.model.DoesNotExist: logger.debug('key fingerprint %s not found', key_fingerprint) shutil.rmtree(temporary_directory) raise KeyDoesNotExist( 'Specified key for verification not found') else: gpg.import_keys(key_data=key.key_data) elif key_id: logger.debug('preloading key id: %s', key_id) try: key = self.get(fingerprint__endswith=key_id) except self.model.DoesNotExist: logger.debug('key id %s not found', key_id) else: gpg.import_keys(key_data=key.key_data) logger.debug('key id %s impored', key_id) if signature_file: # Save the original data and invert the argument order # Signature first, file second temporary_file_object, temporary_filename = mkstemp() os.write(temporary_file_object, file_object.read()) os.close(temporary_file_object) signature_file_buffer = io.BytesIO() signature_file_buffer.write(signature_file.read()) signature_file_buffer.seek(0) signature_file.seek(0) verify_result = gpg.verify_file(file=signature_file_buffer, data_filename=temporary_filename) signature_file_buffer.close() os.unlink(temporary_filename) else: verify_result = gpg.verify_file(file=file_object) logger.debug('verify_result.status: %s', verify_result.status) shutil.rmtree(temporary_directory) if verify_result: # Signed and key present logger.debug('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 logger.debug('no public key') 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 logger.debug('signed, retried and key still not found') return SignatureVerification(verify_result.__dict__) else: logger.debug('file not signed') raise VerificationError('File not signed')
def setUp(self): super(StagingFolderTestCase, self).setUp() self.temporary_directory = mkdtemp() shutil.copy(TEST_SMALL_DOCUMENT_PATH, self.temporary_directory) self.filename = os.path.basename(TEST_SMALL_DOCUMENT_PATH)
def setUp(self): super(StagingFolderViewTestCase, self).setUp() self.temporary_directory = mkdtemp() shutil.copy(TEST_SMALL_DOCUMENT_PATH, self.temporary_directory) self.filename = os.path.basename(TEST_SMALL_DOCUMENT_PATH)