示例#1
0
                     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.'
示例#2
0
 def setUp(self):
     self.manager = PasswordSettingsManager(os.path.expanduser('~/.ctSESAM_test.pws'))
示例#3
0
#!/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
示例#4
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())
#!/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.")