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}'
                )
Esempio n. 2
0
 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))
Esempio n. 5
0
    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']))
Esempio n. 6
0
 def tearDownClass(cls):
     cli.do_command(cls.params, 'logout')
Esempio n. 7
0
    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']))