1. Russell Ballestrini
  2. filevault

Source

filevault / filevault.py

from os import path
from os import makedirs
from uuid import uuid4
from hashlib import sha256
from itertools import permutations

HEX="0123456789abcdef"

class Vault( object ):
    def __init__( self, vaultpath='vault', depth=3, salt='changeme' ):
        self.vaultpath = vaultpath
        self.depth = depth
        self.salt = salt
        self.initVault()

    def initVault( self ):
        """Build the vault directories if they don't exist"""
        if path.exists( self.vaultpath ):
            return True

        perms = permutations( HEX * self.depth, self.depth )
        for perm in perms:
            try: makedirs( path.join( self.vaultpath, *perm ) )
            except OSError: pass

    def _generate_filename( self, h, ext='', absolute=False ):
        """Accept a hash, return a valid file path"""
        dirs = h[ 0 : self.depth ]
        if ext and not ext.startswith( '.' ): ext = '.' + ext
        if absolute == True:
            return path.join( self.vaultpath, *dirs ) + '/' + h + ext
        return path.join( *dirs ) + '/' + h + ext

    def create_filename( self, seed, ext='', absolute=False ):
        """
        Create a valid vault filename seeded with input. Optional extension.
        Path relative to vaultpath by default unless absolute is True.
        """ 
        h = sha256( seed + self.salt ).hexdigest()
        return self._generate_filename( h, ext, absolute )

    def create_random_filename( self, ext='', absolute=False ):
        """
        Create a valid vault filename seeded with random input. Optional extension.
        Path relative to vaultpath by default unless absolute is True.
        """
        h = sha256( str( uuid4() ) + self.salt ).hexdigest()
        return self._generate_filename( h, ext, absolute )