|
|
@@ -32,7 +32,8 @@ _NAMESPACE_MEDASHARE_PATH = uuid.UUID('f6f36b62-3770-4a68-bc3d-dc3e31e429e6') |
|
|
|
|
|
|
|
_defaulthash = 'sha512' |
|
|
|
_validhashes = set([ 'sha256', 'sha512' ]) |
|
|
|
_hashlengths = { len(getattr(hashlib, x)().hexdigest()): x for x in _validhashes } |
|
|
|
_hashlengths = { len(getattr(hashlib, x)().hexdigest()): x for x in |
|
|
|
_validhashes } |
|
|
|
|
|
|
|
def _keyordering(x): |
|
|
|
k, v = x |
|
|
@@ -56,7 +57,8 @@ def _makeuuid(s): |
|
|
|
|
|
|
|
return uuid.UUID(bytes=s) |
|
|
|
|
|
|
|
# XXX - known issue, store is not atomic/safe, overwrites in place instead of renames |
|
|
|
# XXX - known issue, store is not atomic/safe, overwrites in place instead of |
|
|
|
# renames |
|
|
|
|
|
|
|
# XXX - add validation |
|
|
|
# XXX - how to add singletons |
|
|
@@ -81,8 +83,10 @@ class MDBase(object): |
|
|
|
|
|
|
|
_common_properties = [ 'type', 'created_by_ref' ] # XXX - add lang? |
|
|
|
_common_optional = set(('parent_refs', 'sig')) |
|
|
|
_common_names = set(_common_properties + list(_generated_properties.keys())) |
|
|
|
_common_names_list = _common_properties + list(_generated_properties.keys()) |
|
|
|
_common_names = set(_common_properties + list( |
|
|
|
_generated_properties.keys())) |
|
|
|
_common_names_list = _common_properties + list( |
|
|
|
_generated_properties.keys()) |
|
|
|
|
|
|
|
def __init__(self, obj={}, **kwargs): |
|
|
|
obj = copy.deepcopy(obj) |
|
|
@@ -198,7 +202,8 @@ class Identity(MDBase): |
|
|
|
'created_by_ref' ] |
|
|
|
_common_optional = set([ x for x in MDBase._common_optional if x != |
|
|
|
'parent_refs' ] + [ 'name', 'pubkey' ]) |
|
|
|
_common_names = set(_common_properties + list(MDBase._generated_properties.keys())) |
|
|
|
_common_names = set(_common_properties + list( |
|
|
|
MDBase._generated_properties.keys())) |
|
|
|
|
|
|
|
def _trytodict(o): |
|
|
|
if isinstance(o, uuid.UUID): |
|
|
@@ -206,7 +211,8 @@ def _trytodict(o): |
|
|
|
try: |
|
|
|
return 'dict', o.__to_dict__() |
|
|
|
except Exception: # pragma: no cover |
|
|
|
raise TypeError('unable to find __to_dict__ on %s: %s' % (type(o), repr(o))) |
|
|
|
raise TypeError('unable to find __to_dict__ on %s: %s' % |
|
|
|
(type(o), repr(o))) |
|
|
|
|
|
|
|
class CanonicalCoder(pasn1.ASN1DictCoder): |
|
|
|
def enc_dict(self, obj, **kwargs): |
|
|
@@ -234,7 +240,8 @@ class Persona(object): |
|
|
|
|
|
|
|
if 'pubkey' in self._identity: |
|
|
|
pubkeybytes = self._identity.pubkey |
|
|
|
self._pubkey = Ed448PublicKey.from_public_bytes(pubkeybytes) |
|
|
|
self._pubkey = Ed448PublicKey.from_public_bytes( |
|
|
|
pubkeybytes) |
|
|
|
|
|
|
|
self._created_by_ref = self._identity.uuid |
|
|
|
|
|
|
@@ -311,7 +318,8 @@ class Persona(object): |
|
|
|
|
|
|
|
kwargs = {} |
|
|
|
if 'key' in objs: |
|
|
|
kwargs['key'] = Ed448PrivateKey.from_private_bytes(objs['key']) |
|
|
|
kwargs['key'] = Ed448PrivateKey.from_private_bytes( |
|
|
|
objs['key']) |
|
|
|
|
|
|
|
return cls(Identity(objs['identity']), **kwargs) |
|
|
|
|
|
|
@@ -401,7 +409,8 @@ class ObjectStore(object): |
|
|
|
value = hashstr |
|
|
|
|
|
|
|
bvalue = value.encode('ascii') |
|
|
|
if strict and len(bvalue.translate(None, string.hexdigits.lower().encode('ascii'))) != 0: |
|
|
|
if strict and len(bvalue.translate(None, |
|
|
|
string.hexdigits.lower().encode('ascii'))) != 0: |
|
|
|
raise ValueError('value has invalid hex digits (must be lower case)', value) |
|
|
|
|
|
|
|
if hash in _validhashes: |
|
|
@@ -486,7 +495,8 @@ class ObjectStore(object): |
|
|
|
if j: |
|
|
|
return j |
|
|
|
else: |
|
|
|
raise KeyError('unable to find metadata for file: %s' % repr(fname)) |
|
|
|
raise KeyError('unable to find metadata for file: %s' % |
|
|
|
repr(fname)) |
|
|
|
|
|
|
|
def _readfp(fp): |
|
|
|
while True: |
|
|
@@ -539,7 +549,8 @@ def enumeratedir(_dir, created_by_ref): |
|
|
|
|
|
|
|
Returned is a list of FileObjects.''' |
|
|
|
|
|
|
|
return [FileObject.from_file(os.path.join(_dir, x), created_by_ref) for x in os.listdir(_dir)] |
|
|
|
return [FileObject.from_file(os.path.join(_dir, x), |
|
|
|
created_by_ref) for x in os.listdir(_dir)] |
|
|
|
|
|
|
|
def get_objstore(options): |
|
|
|
persona = get_persona(options) |
|
|
@@ -562,7 +573,8 @@ def get_persona(options): |
|
|
|
try: |
|
|
|
persona = Persona.load(identfname) |
|
|
|
except FileNotFoundError: |
|
|
|
print('ERROR: Identity not created, create w/ -g.', file=sys.stderr) |
|
|
|
print('ERROR: Identity not created, create w/ -g.', |
|
|
|
file=sys.stderr) |
|
|
|
sys.exit(1) |
|
|
|
|
|
|
|
return persona |
|
|
@@ -587,7 +599,8 @@ def cmd_ident(options): |
|
|
|
persona = Persona.load(identfname) |
|
|
|
|
|
|
|
if options.tagvalue: |
|
|
|
persona.new_version(*(x.split('=', 1) for x in options.tagvalue)) |
|
|
|
persona.new_version(*(x.split('=', 1) for x in |
|
|
|
options.tagvalue)) |
|
|
|
|
|
|
|
persona.store(identfname) |
|
|
|
else: |
|
|
@@ -610,9 +623,11 @@ def cmd_modify(options): |
|
|
|
print('ERROR: tag needs to start with a "+" (add) or a "-" (remove).', file=sys.stderr) |
|
|
|
sys.exit(1) |
|
|
|
|
|
|
|
badtags = list(x[1] for x in props if x[1] in (MDBase._common_names | MDBase._common_optional)) |
|
|
|
badtags = list(x[1] for x in props if x[1] in (MDBase._common_names | |
|
|
|
MDBase._common_optional)) |
|
|
|
if any(badtags): |
|
|
|
print('ERROR: invalid tag%s: %s.' % ( 's' if len(badtags) > 1 else '', repr(badtags)), file=sys.stderr) |
|
|
|
print('ERROR: invalid tag%s: %s.' % ( 's' if |
|
|
|
len(badtags) > 1 else '', repr(badtags)), file=sys.stderr) |
|
|
|
sys.exit(1) |
|
|
|
|
|
|
|
adds = [ x[1:] for x in props if x[0] == '+' ] |
|
|
@@ -667,7 +682,8 @@ def cmd_list(options): |
|
|
|
print('%s:\t%s' % (k, v)) |
|
|
|
except (KeyError, FileNotFoundError): |
|
|
|
# XXX - tell the difference? |
|
|
|
print('ERROR: file not found: %s' % repr(i), file=sys.stderr) |
|
|
|
print('ERROR: file not found: %s' % repr(i), |
|
|
|
file=sys.stderr) |
|
|
|
sys.exit(1) |
|
|
|
|
|
|
|
def main(): |
|
|
@@ -675,7 +691,8 @@ def main(): |
|
|
|
|
|
|
|
parser = argparse.ArgumentParser() |
|
|
|
|
|
|
|
parser.add_argument('--db', '-d', type=str, help='base name for storage') |
|
|
|
parser.add_argument('--db', '-d', type=str, |
|
|
|
help='base name for storage') |
|
|
|
|
|
|
|
subparsers = parser.add_subparsers(title='subcommands', |
|
|
|
description='valid subcommands', help='additional help') |
|
|
|