help="If not specified it will be prompted.") parser.add_argument('-d', '--domain', help="If not specified it will be prompted.") parser.add_argument( '-q', '--quiet', action='store_const', const=True, help="Display only prompts (if necessary) and the plain password") args = parser.parse_args() if args.master_password: master_password = args.master_password else: master_password = getpass.getpass(prompt='Masterpasswort: ') settings_manager = PasswordSettingsManager() try: settings_manager.load_settings(master_password, not args.no_sync, args.update_sync_settings) if args.update_sync_settings: settings_manager.sync_manager.ask_for_sync_settings() except zlib.error: print( "Falsches Masterpasswort. Es wurden keine Einstellungen geladen.") if args.domain: domain = args.domain else: domain = input('Domain: ') while len(domain) < 1: print( 'Bitte gib eine Domain an, für die das Passwort generiert werden soll.'
def setUp(self): self.manager = PasswordSettingsManager(os.path.expanduser('~/.ctSESAM_test.pws'))
#!/usr/bin/python3 # -*- coding: utf-8 -*- from PasswordManager import CtSesam from PasswordSettingsManager import PasswordSettingsManager from Sync import Sync import getpass import zlib if __name__ == "__main__": syncer = Sync("https://ersatzworld.net/ctpwdgen-server/", 'inter', 'op') remote_blob = syncer.pull() master_password = getpass.getpass(prompt='Masterpasswort: ') settings_manager = PasswordSettingsManager() write_to_file = False remote_update_needed = False try: settings_manager.load_settings_from_file(master_password) remote_update_needed = settings_manager.update_from_export_data( master_password, remote_blob) write_to_file = True except zlib.error: print( "Falsches Masterpasswort. Es wurden keine Einstellungen geladen.") domain = input('Domain: ') while len(domain) < 1: print( 'Bitte gib eine Domain an, für die das Passwort generiert werden soll.' ) domain = input('Domain: ') setting_found = False
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())
#!/usr/bin/python3 # -*- coding: utf-8 -*- from PasswordManager import CtSesam from PasswordSettingsManager import PasswordSettingsManager from Sync import Sync import getpass import zlib if __name__ == "__main__": syncer = Sync("https://ersatzworld.net/ctpwdgen-server/", 'inter', 'op') remote_blob = syncer.pull() master_password = getpass.getpass(prompt='Masterpasswort: ') settings_manager = PasswordSettingsManager() write_to_file = False remote_update_needed = False try: settings_manager.load_settings_from_file(master_password) remote_update_needed = settings_manager.update_from_export_data(master_password, remote_blob) write_to_file = True except zlib.error: print("Falsches Masterpasswort. Es wurden keine Einstellungen geladen.") domain = input('Domain: ') while len(domain) < 1: 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.")