Browse Source

Keychain improvements.

Jonas Borgström 14 years ago
parent
commit
be469ba8c4
4 changed files with 17 additions and 15 deletions
  1. 1 0
      dedupestore/archive.py
  2. 9 12
      dedupestore/archiver.py
  3. 5 1
      dedupestore/crypto.py
  4. 2 2
      dedupestore/test.py

+ 1 - 0
dedupestore/archive.py

@@ -90,6 +90,7 @@ class Archive(object):
         return osize, csize, usize
         return osize, csize, usize
 
 
     def list(self):
     def list(self):
+        self.get_items()
         for item in self.items:
         for item in self.items:
             print item['path']
             print item['path']
 
 

+ 9 - 12
dedupestore/archiver.py

@@ -1,5 +1,6 @@
 import argparse
 import argparse
 import logging
 import logging
+import os
 import sys
 import sys
 
 
 from .archive import Archive
 from .archive import Archive
@@ -83,19 +84,21 @@ class Archiver(object):
         return self.exit_code_from_logger()
         return self.exit_code_from_logger()
 
 
     def do_keychain_generate(self, args):
     def do_keychain_generate(self, args):
-        return KeyChain.generate(args.path)
+        return KeyChain.generate(args.keychain)
 
 
     def do_keychain_restrict(self, args):
     def do_keychain_restrict(self, args):
-        return KeyChain(args.input).restrict(args.output)
+        return KeyChain(args.keychain).restrict(args.output)
 
 
     def do_keychain_chpass(self, args):
     def do_keychain_chpass(self, args):
         return KeyChain(args.keychain).chpass()
         return KeyChain(args.keychain).chpass()
 
 
-
     def run(self, args=None):
     def run(self, args=None):
+        default_keychain = os.path.join(os.path.expanduser('~'),
+                                        '.dedupestore', 'keychain')
         parser = argparse.ArgumentParser(description='Dedupestore')
         parser = argparse.ArgumentParser(description='Dedupestore')
-        parser.add_argument('-k', '--key-chain', dest='keychain', type=str,
-                            help='Key chain')
+        parser.add_argument('-k', '--keychain', dest='keychain', type=str,
+                            default=default_keychain,
+                            help='Keychain to use')
         parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
         parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
                             default=False,
                             default=False,
                             help='Verbose output')
                             help='Verbose output')
@@ -105,18 +108,12 @@ class Archiver(object):
         subparser = subparsers.add_parser('keychain')
         subparser = subparsers.add_parser('keychain')
         subsubparsers = subparser.add_subparsers(title='Available subcommands')
         subsubparsers = subparser.add_subparsers(title='Available subcommands')
         subparser = subsubparsers.add_parser('generate')
         subparser = subsubparsers.add_parser('generate')
-        subparser.add_argument('path', metavar='PATH', type=str,
-                               help='Path to keychain')
         subparser.set_defaults(func=self.do_keychain_generate)
         subparser.set_defaults(func=self.do_keychain_generate)
         subparser = subsubparsers.add_parser('restrict')
         subparser = subsubparsers.add_parser('restrict')
-        subparser.add_argument('input', metavar='INPUT', type=str,
-                               help='Existing keychain')
         subparser.add_argument('output', metavar='OUTPUT', type=str,
         subparser.add_argument('output', metavar='OUTPUT', type=str,
                                help='Keychain to create')
                                help='Keychain to create')
         subparser.set_defaults(func=self.do_keychain_restrict)
         subparser.set_defaults(func=self.do_keychain_restrict)
-        subparser = subsubparsers.add_parser('chpass')
-        subparser.add_argument('keychain', metavar='KEYCHAIN', type=str,
-                               help='Path to keychain')
+        subparser = subsubparsers.add_parser('change-password')
         subparser.set_defaults(func=self.do_keychain_chpass)
         subparser.set_defaults(func=self.do_keychain_chpass)
 
 
         subparser = subparsers.add_parser('create')
         subparser = subparsers.add_parser('create')

+ 5 - 1
dedupestore/crypto.py

@@ -17,6 +17,7 @@ from .oaep import OAEP
 
 
 
 
 class KeyChain(object):
 class KeyChain(object):
+    FILE_ID = 'DDS KEYCHAIN'
 
 
     def __init__(self, path=None):
     def __init__(self, path=None):
         self.aes_id = self.rsa_read = self.rsa_create = None
         self.aes_id = self.rsa_read = self.rsa_create = None
@@ -25,7 +26,10 @@ class KeyChain(object):
             self.open(path)
             self.open(path)
 
 
     def open(self, path):
     def open(self, path):
+        logging.info('Opening keychain "%s"', path)
         with open(path, 'rb') as fd:
         with open(path, 'rb') as fd:
+            if fd.read(len(self.FILE_ID)) != self.FILE_ID:
+                raise ValueError('Not a keychain')
             cdata = fd.read()
             cdata = fd.read()
         data = self.decrypt(cdata, '')
         data = self.decrypt(cdata, '')
         while not data:
         while not data:
@@ -36,7 +40,6 @@ class KeyChain(object):
             if not data:
             if not data:
                 logging.error('Incorrect password')
                 logging.error('Incorrect password')
         chain = msgpack.unpackb(data)
         chain = msgpack.unpackb(data)
-        logging.info('Key chain "%s" opened', path)
         assert chain['version'] == 1
         assert chain['version'] == 1
         self.aes_id = chain['aes_id']
         self.aes_id = chain['aes_id']
         self.rsa_read = RSA.importKey(chain['rsa_read'])
         self.rsa_read = RSA.importKey(chain['rsa_read'])
@@ -77,6 +80,7 @@ class KeyChain(object):
         }
         }
         data = self.encrypt(msgpack.packb(chain), password)
         data = self.encrypt(msgpack.packb(chain), password)
         with open(path, 'wb') as fd:
         with open(path, 'wb') as fd:
+            fd.write(self.FILE_ID)
             fd.write(data)
             fd.write(data)
             logging.info('Key chain "%s" saved', path)
             logging.info('Key chain "%s" saved', path)
 
 

+ 2 - 2
dedupestore/test.py

@@ -15,14 +15,14 @@ class Test(unittest.TestCase):
         self.store_path = os.path.join(self.tmpdir, 'store')
         self.store_path = os.path.join(self.tmpdir, 'store')
         self.keychain = '/tmp/_test_dedupstore.keychain'
         self.keychain = '/tmp/_test_dedupstore.keychain'
         if not os.path.exists(self.keychain):
         if not os.path.exists(self.keychain):
-            self.dedupestore('keychain', 'generate', self.keychain)
+            self.dedupestore('keychain', 'generate')
 
 
     def tearDown(self):
     def tearDown(self):
         shutil.rmtree(self.tmpdir)
         shutil.rmtree(self.tmpdir)
 
 
     def dedupestore(self, *args, **kwargs):
     def dedupestore(self, *args, **kwargs):
         exit_code = kwargs.get('exit_code', 0)
         exit_code = kwargs.get('exit_code', 0)
-        args = ['--key-chain', self.keychain] + list(args)
+        args = ['--keychain', self.keychain] + list(args)
         self.assertEqual(exit_code, self.archiver.run(args))
         self.assertEqual(exit_code, self.archiver.run(args))
 
 
     def create_src_archive(self, name):
     def create_src_archive(self, name):