From c3c8baf075fdd6aa66c70c28653da8e171e87f03 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sat, 7 Sep 2019 11:55:55 -0700 Subject: [PATCH] add option to generate your identity... --- ui/cli.py | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/ui/cli.py b/ui/cli.py index 9b6ff5b..99047f5 100644 --- a/ui/cli.py +++ b/ui/cli.py @@ -218,6 +218,13 @@ class Persona(object): return self._identity + def new_version(self, *args): + '''Update the Persona's Identity object.''' + + self._identity = self.sign(self._identity.new_version(*args)) + + return self._identity + def store(self, fname): '''Store the Persona to a file. If there is a private key associated w/ the Persona, it will be saved as well.''' @@ -457,17 +464,36 @@ def enumeratedir(_dir, created_by_ref): def main(): from optparse import OptionParser + import sys parser = OptionParser() parser.add_option('-a', action='append', dest='add', default=[], help='add the arg as metadata for files, tag=value') parser.add_option('-d', action='append', dest='delete', default=[], help='delete the arg as metadata from files. Either specify tag, and all tags are removed, or specify tag=value and that specific tag will be removed.') + parser.add_option('-g', action='store_true', dest='generateident', + default=False, help='generate an identity') parser.add_option('-l', action='store_true', dest='list', default=False, help='list metadata') options, args = parser.parse_args() + # this is shared between generateident and add + addprops = map(lambda x: x.split('=', 1), options.add) + + if options.generateident: + identfname = os.path.expanduser('~/.medashare_identity.pasn1') + + if os.path.exists(identfname): + print >>sys.stderr, 'Error: Identity already created.' + sys.exit(1) + + persona = Persona() + persona.generate_key() + persona.new_version(*addprops) + persona.store(identfname) + return + storefname = os.path.expanduser('~/.medashare_store.pasn1') import sys #print >>sys.stderr, `storefname` @@ -480,7 +506,6 @@ def main(): for k, v in _iterdictlist(j): print '%s:\t%s' % (k, v) elif options.add: - addprops = map(lambda x: x.split('=', 1), options.add) for i in args: for j in objstr.by_file(i): nobj = j.new_version(*addprops) @@ -805,6 +830,24 @@ class _TestCases(unittest.TestCase): with mock.patch('os.path.expanduser', side_effect=expandusermock) \ as eu: + with nested(mock.patch('sys.stdout', + StringIO.StringIO()), mock.patch('sys.argv', + [ 'progname', '-g', '-a', 'name=A Test User' ])) as (stdout, argv): + main() + self.assertEqual(stdout.getvalue(), + '') + eu.assert_called_with('~/.medashare_identity.pasn1') + persona = Persona.load(identfname) + self.assertEqual(persona.get_identity().name, 'A Test User') + + with nested(mock.patch('sys.stderr', + StringIO.StringIO()), mock.patch('sys.argv', + [ 'progname', '-g', '-a', 'name=A Test User' ])) as (stderr, argv): + self.assertRaises(SystemExit, main) + self.assertEqual(stderr.getvalue(), + 'Error: Identity already created.\n') + eu.assert_called_with('~/.medashare_identity.pasn1') + with nested(mock.patch('sys.stdout', StringIO.StringIO()), mock.patch('sys.argv', [ 'progname', '-l', testfname ])) as (stdout, argv):