def soffice(self): """ Executes LibreOffice as a subprocess """ if not os.path.exists(setting_libreoffice_path.value): raise OfficeConversionError( _( 'LibreOffice not installed or not found at path: %s' ) % setting_libreoffice_path.value ) 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,,,' args = (input_filepath, '--outdir', setting_temporary_directory.value) kwargs = {'_env': {'HOME': setting_temporary_directory.value}} if libreoffice_filter: kwargs.update({'infilter': libreoffice_filter}) try: LIBREOFFICE(*args, **kwargs) except sh.ErrorReturnCode as exception: raise OfficeConversionError(exception) finally: fs_cleanup(input_filepath) 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): keys = self._preload_keys(all_keys=all_keys, key_fingerprint=key_fingerprint, key_id=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_backend.verify_file( file_object=signature_file_buffer, data_filename=temporary_filename, keys=keys) signature_file_buffer.close() os.unlink(temporary_filename) else: verify_result = gpg_backend.verify_file(file_object=file_object, keys=keys) logger.debug('verify_result.status: %s', verify_result.status) 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 verify_file(self, file_object, signature_file=None, all_keys=False, key_fingerprint=None, key_id=None): keys = self._preload_keys( all_keys=all_keys, key_fingerprint=key_fingerprint, key_id=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_backend.verify_file( file_object=signature_file_buffer, data_filename=temporary_filename, keys=keys ) signature_file_buffer.close() os.unlink(temporary_filename) else: verify_result = gpg_backend.verify_file( file_object=file_object, keys=keys ) logger.debug('verify_result.status: %s', verify_result.status) 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 sign_document_version(self, document_version, key, passphrase=None, user=None): temporary_file_object, temporary_filename = mkstemp() try: with document_version.open() as file_object: key.sign_file( binary=True, file_object=file_object, output=temporary_filename, passphrase=passphrase ) except Exception: raise else: with open(temporary_filename, mode='rb') as file_object: new_version = document_version.document.new_version( file_object=file_object, _user=user ) finally: os.unlink(temporary_filename) return new_version
def convert(self, *args, **kwargs): super(Python, self).convert(*args, **kwargs) if self.mime_type == 'application/pdf' and pdftoppm: 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.close(new_file_object) image_buffer = io.BytesIO() try: pdftoppm(input_filepath, f=self.page_number + 1, l=self.page_number + 1, _out=image_buffer) image_buffer.seek(0) return Image.open(image_buffer) finally: fs_cleanup(input_filepath)
def convert(self, *args, **kwargs): super(Python, self).convert(*args, **kwargs) if self.mime_type == 'application/pdf' and pdftoppm: 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.close(new_file_object) image_buffer = io.BytesIO() try: pdftoppm( input_filepath, f=self.page_number + 1, l=self.page_number + 1, _out=image_buffer ) image_buffer.seek(0) return Image.open(image_buffer) finally: fs_cleanup(input_filepath)
def sign_document_version(self, document_version, key, passphrase=None, user=None): temporary_file_object, temporary_filename = mkstemp() try: with document_version.open() as file_object: key.sign_file(binary=True, file_object=file_object, output=temporary_filename, passphrase=passphrase) except Exception: raise else: with open(temporary_filename) as file_object: new_version = document_version.document.new_version( file_object=file_object, _user=user) finally: os.unlink(temporary_filename) return new_version
def execute(self, file_object, page_number): logger.debug('Parsing PDF page: %d', page_number) destination_descriptor, temp_filepath = mkstemp() copyfile(file_object, temp_filepath) command = [] command.append(self.pdftotext_path) command.append('-f') command.append(str(page_number)) command.append('-l') command.append(str(page_number)) command.append(temp_filepath) command.append('-') proc = subprocess.Popen(command, close_fds=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) return_code = proc.wait() if return_code != 0: logger.error(proc.stderr.readline()) fs_cleanup(temp_filepath, file_descriptor=destination_descriptor) raise ParserError output = proc.stdout.read() fs_cleanup(temp_filepath, file_descriptor=destination_descriptor) if output == b'\x0c': logger.debug('Parser didn\'t return any output') return '' if output[-3:] == b'\x0a\x0a\x0c': return output[:-3] return output
def execute(self, file_object, page_number): logger.debug('Parsing PDF page: %d', page_number) destination_descriptor, temp_filepath = mkstemp() copyfile(file_object, temp_filepath) command = [] command.append(self.pdftotext_path) command.append('-f') command.append(str(page_number)) command.append('-l') command.append(str(page_number)) command.append(temp_filepath) command.append('-') proc = subprocess.Popen( command, close_fds=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE ) return_code = proc.wait() if return_code != 0: logger.error(proc.stderr.readline()) fs_cleanup(temp_filepath, file_descriptor=destination_descriptor) raise ParserError output = proc.stdout.read() fs_cleanup(temp_filepath, file_descriptor=destination_descriptor) if output == b'\x0c': logger.debug('Parser didn\'t return any output') return '' if output[-3:] == b'\x0a\x0a\x0c': return output[:-3] return 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 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)
import logging import json import threading import time import uuid from django.core.files import locks from common.utils import mkstemp from ..exceptions import LockError lock = threading.Lock() logger = logging.getLogger(__name__) temporary_file = mkstemp()[1] logger.debug('temporary_file: %s', temporary_file) class FileLock(object): @classmethod def acquire_lock(cls, name, timeout=None): instance = FileLock(name=name, timeout=timeout) return instance def _get_lock_dictionary(self): if self.timeout: result = { 'expiration': time.time() + self.timeout, 'uuid': self.uuid }