50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
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 )
|
|
|
|
|