Server IP : 85.214.239.14 / Your IP : 18.224.43.98 Web Server : Apache/2.4.62 (Debian) System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.18 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /proc/3/task/3/cwd/srv/modoboa/env/lib/python3.5/site-packages/modoboa_pdfcredentials/ |
Upload File : |
"""Internal library.""" from io import BytesIO import os import struct from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend from django.conf import settings from django.utils.encoding import force_bytes, smart_bytes from django.utils.translation import ugettext as _ from modoboa.lib.exceptions import InternalError from modoboa.parameters import tools as param_tools def init_storage_dir(): """Create the directory whare documents will be stored.""" storage_dir = param_tools.get_global_parameter("storage_dir") if os.path.exists(storage_dir): return try: os.mkdir(storage_dir) except (OSError, IOError) as inst: raise InternalError( _("Failed to create the directory that will contain " "PDF documents (%s)") % inst ) def get_creds_filename(account): """Return the full path of a document.""" storage_dir = param_tools.get_global_parameter("storage_dir") return os.path.join(storage_dir, account.username + ".pdf") def delete_credentials(account): """Try to delete a local file.""" fname = get_creds_filename(account) if not os.path.exists(fname): return os.remove(fname) def _get_cipher(iv): """Return ready-to-user Cipher.""" key = smart_bytes(settings.SECRET_KEY[:32]) backend = default_backend() return Cipher( algorithms.AES(force_bytes(key)), modes.CBC(iv), backend=backend ) def crypt_and_save_to_file(content, filename, length, chunksize=64*512): """Crypt content and save it to a file.""" iv = os.urandom(16) cipher = _get_cipher(iv) encryptor = cipher.encryptor() with open(filename, "wb") as fp: fp.write(struct.pack(b"<Q", length)) fp.write(iv) while True: chunk = content.read(chunksize) if not len(chunk): break elif len(chunk) % 16: chunk += b" " * (16 - len(chunk) % 16) fp.write(encryptor.update(force_bytes(chunk))) fp.write(encryptor.finalize()) def decrypt_file(filename, chunksize=24*1024): """Decrypt the content of a file and return it.""" buff = BytesIO() with open(filename, "rb") as fp: origsize = struct.unpack(b"<Q", fp.read(struct.calcsize(b"Q")))[0] iv = fp.read(16) cipher = _get_cipher(iv) decryptor = cipher.decryptor() while True: chunk = fp.read(chunksize) if not len(chunk): break buff.write(decryptor.update(chunk)) buff.write(decryptor.finalize()) buff.truncate(origsize) return buff.getvalue() def get_document_logo(): """Retrieve path to logo.""" try: logo = settings.MODOBOA_CUSTOM_LOGO logo = os.path.join(settings.MEDIA_ROOT, os.path.basename(logo)) except AttributeError: logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") finally: return logo