def rar_contains_unwanted_file(filepath): # checks for unwanted extensions in the rar file 'filepath' # ... unwanted extensions are defined in global variable cfg.unwanted_extensions() # returns False if no unwanted extensions are found in the rar file # returns name of file if unwanted extension is found in the rar file unwanted = None if cfg.unwanted_extensions() and is_rarfile(filepath): # logging.debug('rar file to check: %s',filepath) # logging.debug('unwanted extensions are: %s', cfg.unwanted_extensions()) try: zf = RarFile(filepath, all_names=True) # logging.debug('files in rar file: %s', zf.namelist()) for somefile in zf.namelist(): logging.debug("file in rar file: %s", somefile) if os.path.splitext(somefile)[1].replace(".", "").lower() in cfg.unwanted_extensions(): logging.debug("Unwanted file %s", somefile) unwanted = somefile zf.close() except: logging.debug("RAR file %s cannot be inspected.", filepath) return unwanted
def rar_contains_unwanted_file(filepath): # checks for unwanted extensions in the rar file 'filepath' # ... unwanted extensions are defined in global variable cfg.unwanted_extensions() # returns False if no unwanted extensions are found in the rar file # returns name of file if unwanted extension is found in the rar file unwanted = None if cfg.unwanted_extensions() and is_rarfile(filepath): # logging.debug('rar file to check: %s',filepath) # logging.debug('unwanted extensions are: %s', cfg.unwanted_extensions()) try: zf = RarFile(filepath, all_names=True) # logging.debug('files in rar file: %s', zf.namelist()) for somefile in zf.namelist(): logging.debug('file in rar file: %s', somefile) if os.path.splitext(somefile)[1].replace( '.', '').lower() in cfg.unwanted_extensions(): logging.debug('Unwanted file %s', somefile) unwanted = somefile zf.close() except: logging.debug('RAR file %s cannot be inspected.', filepath) return unwanted
def check_encrypted_and_unwanted_files(nzo, filepath): """ Combines check for unwanted and encrypted files to save on CPU and IO """ encrypted = False unwanted = None if (cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions()) or ( nzo.encrypted == 0 and cfg.pause_on_pwrar()): # These checks should not break the assembler try: # Rarfile freezes on Windows special names, so don't try those! if sabnzbd.WIN32 and has_win_device(filepath): return encrypted, unwanted # Is it even a rarfile? if rarfile.is_rarfile(filepath): # Open the rar rarfile.UNRAR_TOOL = sabnzbd.newsunpack.RAR_COMMAND zf = rarfile.RarFile(filepath, all_names=True) # Check for encryption if nzo.encrypted == 0 and cfg.pause_on_pwrar() and ( zf.needs_password() or is_cloaked(nzo, filepath, zf.namelist())): # Load all passwords passwords = get_all_passwords(nzo) # Cloaked job? if is_cloaked(nzo, filepath, zf.namelist()): encrypted = True elif not sabnzbd.HAVE_CRYPTOGRAPHY and not passwords: # if no cryptography installed, only error when no password was set logging.info(T('%s missing'), 'Python Cryptography') nzo.encrypted = 1 encrypted = True elif sabnzbd.HAVE_CRYPTOGRAPHY: # Lets test if any of the password work password_hit = False for password in passwords: if password: logging.info( 'Trying password "%s" on job "%s"', password, nzo.final_name) try: zf.setpassword(password) except: # On weird passwords the setpassword() will fail # but the actual rartest() will work pass try: zf.testrar() password_hit = password break except rarfile.RarCRCError: # On CRC error we can continue! password_hit = password break except Exception as e: # Did we start from the right volume? if 'need to start extraction from a previous volume' in e[ 0]: return encrypted, unwanted # This one failed pass # Did any work? if password_hit: # We always trust the user's input if not nzo.password: nzo.password = password_hit # Don't check other files logging.info('Password "%s" matches for job "%s"', password_hit, nzo.final_name) nzo.encrypted = -1 encrypted = False else: # Encrypted and none of them worked nzo.encrypted = 1 encrypted = True else: # Don't check other files nzo.encrypted = -1 encrypted = False # Check for unwanted extensions if cfg.unwanted_extensions( ) and cfg.action_on_unwanted_extensions(): for somefile in zf.namelist(): logging.debug('File contains: %s', somefile) if get_ext(somefile).replace( '.', '').lower() in cfg.unwanted_extensions(): logging.debug('Unwanted file %s', somefile) unwanted = somefile zf.close() del zf except: logging.info('Error during inspection of RAR-file %s', filepath) logging.debug('Traceback: ', exc_info=True) return encrypted, unwanted
def check_encrypted_and_unwanted_files(nzo: NzbObject, filepath: str) -> Tuple[bool, Optional[str]]: """ Combines check for unwanted and encrypted files to save on CPU and IO """ encrypted = False unwanted = None if (cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions()) or ( nzo.encrypted == 0 and cfg.pause_on_pwrar() ): # These checks should not break the assembler try: # Rarfile freezes on Windows special names, so don't try those! if sabnzbd.WIN32 and has_win_device(filepath): return encrypted, unwanted # Is it even a rarfile? if rarfile.is_rarfile(filepath): # Open the rar rarfile.UNRAR_TOOL = sabnzbd.newsunpack.RAR_COMMAND zf = rarfile.RarFile(filepath, single_file_check=True) # Check for encryption if ( nzo.encrypted == 0 and cfg.pause_on_pwrar() and (zf.needs_password() or is_cloaked(nzo, filepath, zf.namelist())) ): # Load all passwords passwords = get_all_passwords(nzo) # Cloaked job? if is_cloaked(nzo, filepath, zf.namelist()): encrypted = True elif not passwords: # Only error when no password was set nzo.encrypted = 1 encrypted = True else: # Lets test if any of the password work password_hit = False for password in passwords: if password: logging.info('Trying password "%s" on job "%s"', password, nzo.final_name) try: zf.setpassword(password) except rarfile.Error: # On weird passwords the setpassword() will fail # but the actual testrar() will work pass try: zf.testrar() password_hit = password break except rarfile.RarWrongPassword: # This one really didn't work pass except rarfile.RarCRCError as e: # CRC errors can be thrown for wrong password or # missing the next volume (with correct password) if "cannot find volume" in str(e).lower(): # We assume this one worked! password_hit = password break # This one didn't work pass except: # All the other errors we skip, they might be fixable in post-proc. # For example starting from the wrong volume, or damaged files # This will cause the check to be performed again for the next rar, might # be disk-intensive! Could be removed later and just accept the password. return encrypted, unwanted # Did any work? if password_hit: # We always trust the user's input if not nzo.password: nzo.password = password_hit # Don't check other files logging.info('Password "%s" matches for job "%s"', password_hit, nzo.final_name) nzo.encrypted = -1 encrypted = False else: # Encrypted and none of them worked nzo.encrypted = 1 encrypted = True # Check for unwanted extensions if cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions(): for somefile in zf.namelist(): logging.debug("File contains: %s", somefile) if get_ext(somefile).replace(".", "").lower() in cfg.unwanted_extensions(): logging.debug("Unwanted file %s", somefile) unwanted = somefile zf.close() del zf except: logging.info("Error during inspection of RAR-file %s", filepath) logging.debug("Traceback: ", exc_info=True) return encrypted, unwanted
def check_encrypted_and_unwanted_files(nzo, filepath): """ Combines check for unwanted and encrypted files to save on CPU and IO """ encrypted = False unwanted = None if (cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions()) or (nzo.encrypted == 0 and cfg.pause_on_pwrar()): # These checks should not break the assembler try: # Rarfile freezes on Windows special names, so don't try those! if sabnzbd.WIN32 and has_win_device(filepath): return encrypted, unwanted # Is it even a rarfile? if rarfile.is_rarfile(filepath): # Open the rar rarfile.UNRAR_TOOL = sabnzbd.newsunpack.RAR_COMMAND zf = rarfile.RarFile(filepath, all_names=True) # Check for encryption if nzo.encrypted == 0 and cfg.pause_on_pwrar() and (zf.needs_password() or is_cloaked(nzo, filepath, zf.namelist())): # Load all passwords passwords = get_all_passwords(nzo) # Cloaked job? if is_cloaked(nzo, filepath, zf.namelist()): encrypted = True elif not sabnzbd.HAVE_CRYPTOGRAPHY and not passwords: # if no cryptography installed, only error when no password was set logging.info(T('%s missing'), 'Python Cryptography') nzo.encrypted = 1 encrypted = True elif sabnzbd.HAVE_CRYPTOGRAPHY: # Lets test if any of the password work password_hit = False for password in passwords: if password: logging.info('Trying password "%s" on job "%s"', password, nzo.final_name) try: zf.setpassword(password) except: # On weird passwords the setpassword() will fail # but the actual rartest() will work pass try: zf.testrar() password_hit = password break except rarfile.RarCRCError: # On CRC error we can continue! password_hit = password break except Exception as e: # Did we start from the right volume? if 'need to start extraction from a previous volume' in e[0]: return encrypted, unwanted # This one failed pass # Did any work? if password_hit: # Don't check other files logging.info('Password "%s" matches for job "%s"', password_hit, nzo.final_name) nzo.encrypted = -1 encrypted = False else: # Encrypted and none of them worked nzo.encrypted = 1 encrypted = True else: # Don't check other files nzo.encrypted = -1 encrypted = False # Check for unwanted extensions if cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions(): for somefile in zf.namelist(): logging.debug('File contains: %s', somefile) if os.path.splitext(somefile)[1].replace('.', '').lower() in cfg.unwanted_extensions(): logging.debug('Unwanted file %s', somefile) unwanted = somefile zf.close() del zf except: logging.info('Error during inspection of RAR-file %s', filepath, exc_info=True) return encrypted, unwanted
def check_encrypted_and_unwanted_files(nzo, filepath): """ Combines check for unwanted and encrypted files to save on CPU and IO """ encrypted = False unwanted = None if cfg.unwanted_extensions() or (nzo.encrypted == 0 and cfg.pause_on_pwrar()): # Safe-format for Windows # RarFile requires de-unicoded filenames for zf.testrar() filepath_split = os.path.split(filepath) workdir_short = short_path(filepath_split[0]) filepath = deunicode(os.path.join(workdir_short, filepath_split[1])) # Is it even a rarfile? if rarfile.is_rarfile(filepath): try: zf = rarfile.RarFile(filepath, all_names=True) # Check for encryption if nzo.encrypted == 0 and cfg.pause_on_pwrar() and (zf.needs_password() or is_cloaked(filepath, zf.namelist())): # Load all passwords passwords = get_all_passwords(nzo) # if no cryptography installed, only error when no password was set if not sabnzbd.HAVE_CRYPTOGRAPHY and not passwords: logging.info(T('%s missing'), 'Python Cryptography') nzo.encrypted = 1 encrypted = True elif sabnzbd.HAVE_CRYPTOGRAPHY: # Lets test if any of the password work password_hit = False rarfile.UNRAR_TOOL = sabnzbd.newsunpack.RAR_COMMAND for password in passwords: if password: logging.info('Trying password "%s" on job "%s"', password, nzo.final_name) try: zf.setpassword(password) zf.testrar() password_hit = password break except rarfile.RarCRCError: # On CRC error we can continue! password_hit = password break except: pass # Did any work? if password_hit: # Don't check other files logging.info('Password "%s" matches for job "%s"', password_hit, nzo.final_name) nzo.encrypted = -1 encrypted = False else: # Encrypted and none of them worked nzo.encrypted = 1 encrypted = True else: # Don't check other files nzo.encrypted = -1 encrypted = False # Check for unwanted extensions if cfg.unwanted_extensions(): for somefile in zf.namelist(): logging.debug('File contains: %s', somefile) if os.path.splitext(somefile)[1].replace('.', '').lower() in cfg.unwanted_extensions(): logging.debug('Unwanted file %s', somefile) unwanted = somefile zf.close() zf.close() del zf except: logging.debug('RAR file %s cannot be inspected', filepath) return encrypted, unwanted