diff --git a/biostools/extractors.py b/biostools/extractors.py index 5f85ea8..9b3988c 100644 --- a/biostools/extractors.py +++ b/biostools/extractors.py @@ -1634,7 +1634,6 @@ class InterleaveExtractor(Extractor): # Write all deinterleaved permutations, as some sets may # contain the same interleaved string on more than one part. - alphanumeric = '0123456789abcdefghijklmn' file_counter = 0 part_count = len(data) buf = bytearray(part_size * part_count) @@ -1646,7 +1645,7 @@ class InterleaveExtractor(Extractor): data_offset += 1 # Write deinterleaved file. - f = open(os.path.join(dest_dir, 'deinterleaved_' + alphanumeric[file_counter] + '.bin'), 'wb') + f = open(os.path.join(dest_dir, 'deinterleaved_' + ''.join(util.base62[data_index] for data_index in permutation) + '.bin'), 'wb') f.write(buf) f.close() file_counter += 1 @@ -1661,7 +1660,7 @@ class InterleaveExtractor(Extractor): for counterpart_path in counterpart_paths: # Move original file. try: - shutil.move(counterpart_path, os.path.join(dest_dir, 'interleaved_' + alphanumeric[file_counter] + '.bin')) + shutil.move(counterpart_path, os.path.join(dest_dir, 'interleaved_' + util.base62[file_counter] + '.bin')) except: pass file_counter += 1 @@ -1751,6 +1750,7 @@ class OMFExtractor(Extractor): while data: data = in_f.read(1048576) out_f.write(data) + out_f.close() except: in_f.close() @@ -2215,7 +2215,7 @@ class VMExtractor(ArchiveExtractor): floppy_media = 'floppy.144' # Copy original file and blank floppy image to the destination directory. - exe_name = util.random_name(8, alnum_only=True).lower() + '.exe' + exe_name = util.random_name(8, charset=util.random_name_nosymbols).lower() + '.exe' exe_path = os.path.join(dest_dir, exe_name) image_path = os.path.join(dest_dir, util.random_name(8) + '.img') try: @@ -2301,7 +2301,7 @@ class VMExtractor(ArchiveExtractor): # Create filename for the individual ETI. eti_name = temp_files[0] # dummy while eti_name in temp_files: - eti_name = util.random_name(8, alnum_only=True).lower() + '.eti' + eti_name = util.random_name(8, charset=util.random_name_nosymbols).lower() + '.eti' temp_files.append(eti_name) # Sanitize extracted filename to not overwrite ourselves. @@ -2361,7 +2361,7 @@ class VMExtractor(ArchiveExtractor): required for Siemens Nixdorf FastPacket with its LZEXE-compressed stub.""" # Copy original file to the destination directory. - exe_name = util.random_name(8, alnum_only=True).lower() + '.exe' + exe_name = util.random_name(8, charset=util.random_name_nosymbols).lower() + '.exe' exe_path = os.path.join(dest_dir, exe_name) try: shutil.copy2(file_path, exe_path) @@ -2369,7 +2369,7 @@ class VMExtractor(ArchiveExtractor): return True # Generate a name for the unpacked file. - unpacked_name = util.random_name(8, alnum_only=True).lower() + '.ulz' + unpacked_name = util.random_name(8, charset=util.random_name_nosymbols).lower() + '.ulz' unpacked_path = os.path.join(dest_dir, unpacked_name) # Create batch file for extraction. diff --git a/biostools/util.py b/biostools/util.py index b4345d4..7034b16 100644 --- a/biostools/util.py +++ b/biostools/util.py @@ -21,6 +21,14 @@ from biostools.pciutil import * date_pattern_mmddyy = re.compile('''(?P[0-9]{2})/(?P[0-9]{2})/(?P[0-9]{2,4})''') number_pattern = re.compile('''[0-9]+''') +digits = '0123456789' +lowercase = 'abcdefghijklmnopqrstuvwxyz' +uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +fn_symbols = '$%\'-_@~`!(){}^#&.+,;=[]' +base62 = digits + lowercase + uppercase +random_name_symbols = lowercase + digits + fn_symbols + uppercase +random_name_nosymbols = lowercase + digits + uppercase + _error_log_lock = multiprocessing.Lock() @@ -158,14 +166,9 @@ def log_traceback(*args): traceback.print_exc(file=f) f.close() -def random_name(chars=16, alnum_only=False): - """Generate a random filename using valid DOS/Windows characters - (alnum_only=False) or alphanumeric characters (alnum_only=True).""" - if alnum_only: - symbols = '' - else: - symbols = '$%\'-_@~`!(){}^#&.+,;=[]' - return ''.join(random.choice('abcdefghijklmnopqrstuvwxyz0123456789' + symbols + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') for x in range(chars)) +def random_name(chars=16, charset=random_name_symbols): + """Generate a random filename using the given charset.""" + return ''.join(random.choice(charset) for x in range(chars)) def read_complement(file_path, file_header=None, max_size=16777216): """Read up to max_size from file_path starting at the end of file_header.