コード例 #1
0
class TestPasswordSettingsManager(unittest.TestCase):
    def setUp(self):
        self.manager = PasswordSettingsManager(os.path.expanduser('~/.ctSESAM_test.pws'))

    # noinspection PyUnresolvedReferences
    def tearDown(self):
        file = os.path.expanduser('~/.ctSESAM_test.pws')
        if os.path.isfile(file):
            try:
                import win32con
                import win32api
                win32api.SetFileAttributes(file, win32con.FILE_ATTRIBUTE_NORMAL)
            except ImportError:
                pass
            os.remove(file)

    def test_get_setting(self):
        setting = self.manager.get_setting('abc.de')
        self.assertEqual(PasswordSetting, type(setting))
        self.assertEqual('abc.de', setting.get_domain())
        self.assertIn('abc.de', self.manager.get_domain_list())

    def test_save_settings_to_file(self):
        self.manager.get_setting('abc.de')
        new_setting = PasswordSetting('hugo.com')
        new_setting.set_length(12)
        self.manager.set_setting(new_setting)
        self.manager.save_settings_to_file('xyz')
        with open(os.path.expanduser('~/.ctSESAM_test.pws'), 'br') as f:
            data = f.read()
        crypter = Crypter(data[:32], 'xyz')
        sync_settings_len = struct.unpack('!I', data[32:36])[0]
        data = json.loads(Packer.decompress(crypter.decrypt(data[36+sync_settings_len:])).decode('utf8'))
        self.assertEqual('abc.de', data['settings']['abc.de']['domain'])
        self.assertEqual(10, data['settings']['abc.de']['length'])
        self.assertEqual('hugo.com', data['settings']['hugo.com']['domain'])
        self.assertEqual(12, data['settings']['hugo.com']['length'])

    def test_load_settings_from_file(self):
        settings = {
            'settings': {
                'unit.test': {
                    'domain': 'unit.test',
                    'length': 11,
                    'iterations': 5000,
                    'notes': 'Nice note!',
                    'cDate': '2011-02-12T11:07:31',
                    'mDate': '2011-02-12T11:07:32'
                },
                'some.domain': {
                    'domain': 'some.domain',
                    'length': 4,
                    'usedCharacters': '6478593021',
                    'cDate': '2013-06-17T04:03:41',
                    'mDate': '2014-08-02T10:37:12'
                }
            },
            'synced': []
        }
        salt = os.urandom(32)
        crypter = Crypter(salt, 'xyz')
        f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw')
        f.write(salt + struct.pack('!I', 0) + crypter.encrypt(Packer.compress(json.dumps(settings).encode('utf-8'))))
        f.close()
        self.manager.load_settings_from_file('xyz')
        self.assertIn('unit.test', self.manager.get_domain_list())
        self.assertIn('some.domain', self.manager.get_domain_list())
        self.assertEqual(11, self.manager.get_setting('unit.test').get_length())
        self.assertEqual(5000, self.manager.get_setting('unit.test').get_iterations())
        self.assertEqual('Nice note!', self.manager.get_setting('unit.test').get_notes())
        self.assertEqual(4, self.manager.get_setting('some.domain').get_length())
        self.assertEqual('6478593021', self.manager.get_setting('some.domain').get_character_set())

    def test_set_setting(self):
        setting = self.manager.get_setting('hugo.me')
        setting.set_length(6)
        self.manager.set_setting(setting)
        self.assertIn('hugo.me', self.manager.get_domain_list())
        self.assertEqual(6, self.manager.get_setting('hugo.me').get_length())

    def test_delete_setting(self):
        setting = self.manager.get_setting('hugo.me')
        setting.set_length(6)
        self.manager.set_setting(setting)
        self.assertIn('hugo.me', self.manager.get_domain_list())
        self.manager.delete_setting(setting)
        self.assertNotIn('hugo.me', self.manager.get_domain_list())

    def test_get_domain_list(self):
        settings = {
            'settings': {
                'unit.test': {
                    'domain': 'unit.test',
                    'length': 11,
                    'iterations': 5000,
                    'notes': 'Nice note!',
                    'salt': 'cGVwcGVy',
                    'usedCharacters': 'abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRTUVWXYZ0123456789' +
                                      '#!"§$%&/()[]{}=-_+*<>;:.',
                    'cDate': '2011-02-12T11:07:31',
                    'mDate': '2011-02-12T11:07:32'
                },
                'some.domain': {
                    'domain': 'some.domain',
                    'length': 4,
                    'iterations': 4096,
                    'salt': 'cGVwcGVy',
                    'usedCharacters': '6478593021',
                    'cDate': '2013-06-17T04:03:41',
                    'mDate': '2014-08-02T10:37:12'
                }
            },
            'synced': []
        }
        salt = os.urandom(32)
        crypter = Crypter(salt, 'xyz')
        f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw')
        data = json.dumps(settings).encode('utf-8')
        f.write(salt + struct.pack('!I', 0) + crypter.encrypt(Packer.compress(data)))
        f.close()
        self.manager.load_settings_from_file('xyz')
        self.assertEqual(settings['settings']['unit.test'],
                         self.manager.get_settings_as_dict()['settings']['unit.test'])
        self.assertEqual(settings['settings']['some.domain'],
                         self.manager.get_settings_as_dict()['settings']['some.domain'])
        self.assertEqual(settings, self.manager.get_settings_as_dict())

    def test_get_export_data(self):
        settings = {
            'settings': {
                'unit.test': {
                    'domain': 'unit.test',
                    'length': 11,
                    'iterations': 5000,
                    'notes': 'Nice note!',
                    'salt': 'cGVwcGVy',
                    'usedCharacters': 'abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRTUVWXYZ0123456789' +
                                      '#!"§$%&/()[]{}=-_+*<>;:.',
                    'cDate': '2011-02-12T11:07:31',
                    'mDate': '2011-02-12T11:07:32'
                },
                'some.domain': {
                    'domain': 'some.domain',
                    'length': 4,
                    'iterations': 4096,
                    'salt': 'cGVwcGVy',
                    'usedCharacters': '6478593021',
                    'cDate': '2013-06-17T04:03:41',
                    'mDate': '2014-08-02T10:37:12'
                }
            },
            'synced': []
        }
        salt = os.urandom(32)
        crypter = Crypter(salt, 'xyz')
        f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw')
        f.write(salt + struct.pack('!I', 0) + crypter.encrypt(
            Packer.compress(json.dumps(settings).encode('utf-8'))))
        f.close()
        self.manager.load_settings_from_file('xyz')
        data = b64decode(self.manager.get_export_data('xyz'))
        salt = data[1:33]
        crypter = Crypter(salt, 'xyz')
        self.assertEqual(
            settings['settings'],
            json.loads(str(Packer.decompress(crypter.decrypt(data[33:])), encoding='utf-8')))

    def test_update_from_sync(self):
        settings = {
            'settings': {
                'unit.test': {
                    'domain': 'unit.test',
                    'length': 11,
                    'iterations': 5000,
                    'notes': 'Nice note!',
                    'salt': 'cGVwcGVy',
                    'usedCharacters': 'abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRTUVWXYZ0123456789' +
                                      '#!"§$%&/()[]{}=-_+*<>;:.',
                    'cDate': '2011-02-12T11:07:31',
                    'mDate': '2011-02-12T11:07:32'
                },
                'some.domain': {
                    'domain': 'some.domain',
                    'length': 4,
                    'iterations': 4096,
                    'salt': 'cGVwcGVy',
                    'usedCharacters': '6478593021',
                    'cDate': '2013-06-17T04:03:41',
                    'mDate': '2014-08-02T10:37:12'
                }
            },
            'synced': []
        }
        salt = os.urandom(32)
        crypter = Crypter(salt, 'xyz')
        f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw')
        f.write(salt + struct.pack('!I', 0) + crypter.encrypt(
            Packer.compress(json.dumps(settings).encode('utf-8'))))
        f.close()
        self.manager.load_settings_from_file('xyz')
        self.manager.sync_manager = MockSyncManager()
        self.manager.update_from_sync('xyz')
        self.assertIn('unit.test', self.manager.get_domain_list())
        self.assertIn('some.domain', self.manager.get_domain_list())
        self.assertIn('third.domain', self.manager.get_domain_list())
        self.assertEqual(5001, self.manager.get_setting('unit.test').get_iterations())
        self.assertEqual(4096, self.manager.get_setting('some.domain').get_iterations())
        self.assertEqual(4098, self.manager.get_setting('third.domain').get_iterations())
コード例 #2
0
         setting_found = True
         if not args.quiet:
             print("Die Einstellungen für " + domain + " wurden geladen.")
     else:
         for dom in settings_manager.get_domain_list():
             if dom[:len(domain)] == domain:
                 print("Für die Domain '" + dom +
                       "' wurden Einstellungen gefunden.")
                 answer = input("Sollen sie geladen werden [J/n]? ")
                 if answer not in [
                         "n", "N", "Nein", "nein", "NEIN", "NO", "No", "no",
                         "nay", "not", "Not", "NOT"
                 ]:
                     domain = dom
                     setting_found = True
 setting = settings_manager.get_setting(domain)
 if not setting_found:
     setting.ask_for_input()
 if setting_found and setting.has_username() and not args.quiet:
     print("Benutzername: " + setting.get_username())
 settings_manager.set_setting(setting)
 settings_manager.store_settings(master_password)
 if setting_found and setting.has_legacy_password():
     if args.quiet:
         print(setting.get_legacy_password())
     else:
         print("klassisches Passwort: " + setting.get_legacy_password())
 else:
     sesam = CtSesam()
     sesam.set_password_character_set(setting.get_character_set())
     sesam.set_salt(setting.get_salt())
コード例 #3
0
     print('Bitte gib eine Domain an, für die das Passwort generiert werden soll.')
     domain = input('Domain: ')
 setting_found = False
 if domain in [dom[:len(domain)] for dom in settings_manager.get_domain_list()]:
     if domain in settings_manager.get_domain_list():
         setting_found = True
         print("Die Einstellungen für " + domain + " wurden geladen.")
     else:
         for dom in settings_manager.get_domain_list():
             if dom[:len(domain)] == domain:
                 answer = input("Für die Domain '" + dom + "' wurden Einstellungen gefunden. " +
                                "Sollen sie geladen werden [J/n]? ")
                 if answer not in ["n", "N", "Nein", "nein", "NEIN", "NO", "No", "no", "nay", "not", "Not", "NOT"]:
                     domain = dom
                     setting_found = True
 setting = settings_manager.get_setting(domain)
 if not setting_found:
     setting.set_username(input('Benutzername: '))
     length_str = input('Passwortlänge [10]: ')
     try:
         length = int(length_str)
         if length <= 0:
             length = 10
     except ValueError:
         length = 10
     setting.set_length(length)
     iterations_str = input('Iterationszahl [4096]: ')
     try:
         iterations = int(iterations_str)
         if iterations <= 0:
             iterations = 4096