def test_add_enterprise_user(self): params = TestEnterpriseCommands.params # type: KeeperParams self.assertIsNotNone(params.enterprise) template_body = ''' [ { "title": "Record For ${user_name}", "login": "******", "password": "******", "login_url": "https://keepersecurity.com", "notes": "notes", "custom_fields": { "key1": "value1", "key2": "value2" } }, { "title": "Empty record" } ]''' new_user = '******' with mock.patch('builtins.open', mock.mock_open(read_data=template_body)), \ mock.patch('os.path.abspath', return_value='template.json'), \ mock.patch('os.path.isfile', return_value=True): with self.assertLogs(level=logging.WARNING): cli.do_command( params, f'create-user --generate --name="New User" --expire --records="template.json" ' f'--question="This app name?" --answer="Commander" {new_user}' )
def test_quoting(self): """Check if quoting is self-consistent among mkdir and cd.""" params = TestConnectedCommands.params with mock.patch( 'builtins.input', side_effect=KeyboardInterrupt()), mock.patch('builtins.print'): cli.do_command(params, 'mkdir --user-folder "/quoting"') cli.do_command(params, 'cd /quoting') for subdir in ('a//b', r'c\ d', r'e\"f', r"g\'h", r'\\'): cli.do_command(params, 'mkdir --user-folder {}'.format(subdir)) cli.do_command(params, 'cd {}'.format(subdir)) cli.do_command(params, 'cd /quoting')
def tearDownClass(cls): params = cls.params api.query_enterprise(params) for user in params.enterprise['users']: if user['status'] == 'actove' and user['lock'] != 0: request = { 'command': 'enterprise_user_lock', 'enterprise_user_id': user['enterprise_user_id'], 'lock': 'unlocked' } api.communicate(params, request) cli.do_command(params, 'logout')
def test_commands(self): params = TestEnterpriseCommands.params # type: KeeperParams self.assertIsNotNone(params.enterprise) test_user = params.config['user'] new_user = '******' new_team = 'Test Team' with mock.patch( 'builtins.input', side_effect=KeyboardInterrupt()), mock.patch('builtins.print'): cli.do_command(params, 'enterprise-info --verbose') cli.do_command(params, 'enterprise-team --add "{0}"'.format(new_team)) cli.do_command( params, 'enterprise-team --restrict-edit=on --restrict-share=on --restrict-view=off "{0}"' .format(new_team)) cli.do_command( params, 'enterprise-user --add --name="Test User" {0}'.format( new_user)) cli.do_command(params, 'enterprise-user --lock "{0}"'.format(test_user)) cli.do_command(params, 'enterprise-user --unlock "{0}"'.format(test_user)) cli.do_command( params, 'enterprise-team --add-user="******" "{1}"'.format( test_user, new_team)) cli.do_command( params, 'enterprise-team --remove-user="******" "{1}"'.format( test_user, new_team)) cli.do_command( params, 'enterprise-user --add-team="{0}" "{1}"'.format( new_team, test_user)) cli.do_command( params, 'enterprise-user --remove-team="{0}" "{1}"'.format( new_team, test_user)) role_id = None managed_roles = set() for mn in params.enterprise['managed_nodes']: managed_roles.add(mn['role_id']) for role in params.enterprise['roles']: if role['role_id'] not in managed_roles: role_id = role['role_id'] break if role_id: cli.do_command( params, 'enterprise-role --add-user="******" "{1}"'.format( new_user, role_id))
def test_vault_commands(self): params = TestConnectedCommands.params # type: KeeperParams with mock.patch( 'builtins.input', side_effect=KeyboardInterrupt()), mock.patch('builtins.print'): cli.do_command( params, 'add --login="******" --pass=password --url="https://keepersecurity.com/" --custom="{\\"cmdr:plugin\\":\\"noop\\"}" "Record 1"' ) cli.do_command(params, 'sync-down') record_uid = next(iter(params.record_cache.keys())) rec = api.get_record(params, record_uid) self.assertEqual(rec.get('cmdr:plugin'), 'noop') old_password = rec.password cli.do_command(params, 'r -- {0}'.format(rec.record_uid)) cli.do_command(params, 'sync-down') rec = api.get_record(params, record_uid) self.assertNotEqual(old_password, rec.password) cli.do_command(params, 'ls -l') cli.do_command(params, 'mkdir --user-folder "User Folder 1"') cli.do_command(params, 'mkdir --shared-folder --all "Shared Folder 1"') cli.do_command(params, 'sync-down') cli.do_command(params, 'cd "User Folder 1"') cli.do_command(params, 'mkdir --user-folder "User Folder 2"') cli.do_command(params, 'cd /') cli.do_command(params, 'ln "Record 1" "Shared Folder 1"') cli.do_command(params, 'mv "Record 1" "User Folder 1"') params.revision = 0 cli.do_command(params, 'sync-down') self.assertEqual(len(params.record_cache), 1) self.assertEqual(len(params.shared_folder_cache), 1) cli.do_command(params, 'cd "Shared Folder 1"') cli.do_command( params, 'append-notes --notes="Additional info" "Record 1"') cli.do_command(params, 'sync-down') cli.do_command(params, 'cd "../User Folder 1"') cli.do_command(params, 'rmdir --force "User Folder 2"') cli.do_command(params, 'sync-down') cli.do_command(params, 'cd /') cli.do_command(params, 'search record') cli.do_command(params, 'search folder') with tempfile.NamedTemporaryFile() as f: f.write(b'data') f.flush() cli.do_command(params, 'cd "User Folder 1"') cli.do_command( params, 'upload-attachment --file="{0}" "Record 1"'.format(f.name)) cli.do_command(params, 'sync-down') with mock.patch('builtins.open', mock.mock_open()) as m_open, mock.patch( 'os.path.abspath', return_value='file/path'): cli.do_command(params, 'download-attachment -- {0}'.format(record_uid)) m_open.assert_called() m_open.return_value.write.assert_called() rec = api.get_record(params, record_uid) self.assertEqual(len(rec.attachments), 1) cli.do_command( params, 'delete-attachment --name={0} -- {1}'.format( rec.attachments[0]['id'], record_uid)) cli.do_command(params, 'sync-down') rec = api.get_record(params, record_uid) self.assertEqual(len(rec.attachments), 0) json_text = '' with mock.patch('builtins.open', mock.mock_open()) as m_open, mock.patch( 'os.path.abspath', return_value='file/path'): def file_write(text): nonlocal json_text json_text += text m_open.return_value.write = file_write cli.do_command(params, 'export --format=json file') self.assertTrue(len(json_text) > 0) exported = json.loads(json_text) self.assertEqual(len(params.record_cache), len(exported['records'])) self.assertEqual(len(params.shared_folder_cache), len(exported['shared_folders'])) TestConnectedCommands.wipe_out_data() with mock.patch('builtins.open', mock.mock_open()) as m_open, mock.patch( 'os.path.isfile', return_value=True): def file_read(): nonlocal json_text return json_text m_open.return_value.read = file_read cli.do_command(params, 'import --format=json file') self.assertEqual(len(params.record_cache), len(exported['records'])) self.assertEqual(len(params.shared_folder_cache), len(exported['shared_folders']))
def tearDownClass(cls): cli.do_command(cls.params, 'logout')
def test_commands(self): params = TestConnectedCommands.params # type: KeeperParams with mock.patch( 'builtins.input', side_effect=KeyboardInterrupt()), mock.patch('builtins.print'): record_uid = cli.do_command( params, 'add --legacy --login="******" --pass=password --url="https://keepersecurity.com/" --custom="{\\"cmdr:plugin\\":\\"noop\\"}" --title="Record 1"' ) cli.do_command(params, 'sync-down') rec = api.get_record(params, record_uid) self.assertEqual(rec.get('cmdr:plugin'), 'noop') old_password = rec.password cli.do_command(params, 'rotate -- {0}'.format(rec.record_uid)) cli.do_command(params, 'sync-down') rec = api.get_record(params, record_uid) self.assertNotEqual(old_password, rec.password) cli.do_command(params, 'ls -l') cli.do_command(params, 'mkdir --user-folder "User Folder 1"') cli.do_command(params, 'mkdir --shared-folder --all "Shared Folder 1"') cli.do_command(params, 'sync-down') cli.do_command(params, 'cd "User Folder 1"') cli.do_command(params, 'mkdir --user-folder "User Folder 2"') cli.do_command(params, 'cd /') cli.do_command(params, 'ln "Record 1" "Shared Folder 1"') cli.do_command(params, 'mv "Record 1" "User Folder 1"') params.revision = 0 cli.do_command(params, 'sync-down') self.assertEqual(len(params.record_cache), 1) self.assertEqual(len(params.shared_folder_cache), 1) cli.do_command(params, 'cd "Shared Folder 1"') cli.do_command( params, 'append-notes --notes="Additional info" "Record 1"') cli.do_command(params, 'sync-down') cli.do_command(params, 'cd "../User Folder 1"') cli.do_command(params, 'rmdir --force "User Folder 2"') cli.do_command(params, 'sync-down') cli.do_command(params, 'cd /') cli.do_command(params, 'search record') cli.do_command(params, 'search folder') with tempfile.NamedTemporaryFile(delete=False) as f: try: f.write(b'data') f.flush() cli.do_command(params, 'cd "User Folder 1"') cli.do_command( params, 'upload-attachment --file="{0}" "Record 1"'.format( f.name)) f.close() finally: os.remove(f.name) cli.do_command(params, 'sync-down') rec = api.get_record(params, record_uid) self.assertEqual(len(rec.attachments), 1) cli.do_command( params, 'delete-attachment --name={0} -- {1}'.format( rec.attachments[0]['id'], record_uid)) cli.do_command(params, 'sync-down') rec = api.get_record(params, record_uid) self.assertEqual(len(rec.attachments), 0) script_path = os.path.dirname(__file__) cwd = os.getcwd() if script_path.startswith(cwd): script_path = script_path[len(cwd):] if script_path.startswith(os.sep): script_path = script_path[1:] file = 'keepass.kdbx' if script_path: file = os.path.join(script_path, file) if os.path.isfile(file): os.remove(file) with mock.patch('getpass.getpass', return_value='password'), mock.patch( 'keepercommander.commands.base.user_choice', return_value='y'): cli.do_command(params, 'export --format=keepass "{0}"'.format(file)) TestConnectedCommands.wipe_out_data() cli.do_command(params, 'sync-down') with mock.patch('getpass.getpass', return_value='password'), mock.patch( 'builtins.input', return_value=''): cli.do_command(params, 'import --format=keepass "{0}"'.format(file)) cli.do_command(params, 'sync-down') json_text = '' with mock.patch('builtins.open', mock.mock_open()) as m_open, mock.patch( 'os.path.abspath', return_value='file/path'): def file_write(text): nonlocal json_text json_text += text m_open.return_value.write = file_write cli.do_command(params, 'export --format=json file') self.assertTrue(len(json_text) > 0) exported = json.loads(json_text) self.assertEqual(len(params.record_cache), len(exported['records'])) self.assertEqual(len(params.shared_folder_cache), len(exported['shared_folders'])) TestConnectedCommands.wipe_out_data() with mock.patch('builtins.open', mock.mock_open()) as m_open, mock.patch( 'os.path.isfile', return_value=True): def file_read(): nonlocal json_text return json_text m_open.return_value.read = file_read cli.do_command(params, 'import --format=json file') self.assertEqual(len(params.record_cache), len(exported['records'])) self.assertEqual(len(params.shared_folder_cache), len(exported['shared_folders']))