Search in sources :

Example 6 with KcAdmExec

use of org.keycloak.testsuite.cli.KcAdmExec in project keycloak by keycloak.

the class KcAdmTest method testClientLoginWithDefaultConfigInteractive.

@Test
public void testClientLoginWithDefaultConfigInteractive() throws IOException {
    if (!runIntermittentlyFailingTests()) {
        System.out.println("TEST SKIPPED - This test currently suffers from intermittent failures. Use -Dtest.intermittent=true to run it.");
        return;
    }
    // use -Dtest.intermittent=true to run this test
    KcAdmExec exe = KcAdmExec.newBuilder().argsLine("config credentials --server " + serverUrl + " --realm test --client admin-cli-secret").executeAsync();
    exe.waitForStdout("Enter client secret: ");
    exe.sendToStdin("password" + EOL);
    exe.waitCompletion();
    assertExitCodeAndStreamSizes(exe, 0, 1, 1);
    Assert.assertEquals("stderr first line", "Logging into " + serverUrl + " as service-account-admin-cli-secret of realm test", exe.stderrLines().get(0));
    /*
         *  Run the test one more time with stdin redirect
         */
    File tmpFile = new File(KcAdmExec.WORK_DIR + "/" + UUID.randomUUID().toString() + ".tmp");
    try {
        FileOutputStream tmpos = new FileOutputStream(tmpFile);
        tmpos.write("password".getBytes());
        tmpos.write(EOL.getBytes());
        tmpos.close();
        exe = KcAdmExec.newBuilder().argsLine("config credentials --server " + serverUrl + " --realm test --client admin-cli-secret < '" + tmpFile.getName() + "'").execute();
        assertExitCodeAndStreamSizes(exe, 0, 1, 1);
        Assert.assertTrue("Enter client secret prompt", exe.stdoutLines().get(0).startsWith("Enter client secret: "));
        Assert.assertEquals("stderr first line", "Logging into " + serverUrl + " as service-account-admin-cli-secret of realm test", exe.stderrLines().get(0));
    } finally {
        tmpFile.delete();
    }
}
Also used : FileOutputStream(java.io.FileOutputStream) KcAdmExec(org.keycloak.testsuite.cli.KcAdmExec) File(java.io.File) Test(org.junit.Test)

Example 7 with KcAdmExec

use of org.keycloak.testsuite.cli.KcAdmExec in project keycloak by keycloak.

the class AbstractAdmCliTest method loginAsUser.

void loginAsUser(File configFile, String server, String realm, String user, String password) {
    KcAdmExec exe = KcAdmExec.execute("config credentials --server " + server + " --realm " + realm + " --user " + user + " --password " + password + " --config " + configFile.getAbsolutePath());
    assertExitCodeAndStreamSizes(exe, 0, 0, 1);
}
Also used : KcAdmExec(org.keycloak.testsuite.cli.KcAdmExec)

Example 8 with KcAdmExec

use of org.keycloak.testsuite.cli.KcAdmExec in project keycloak by keycloak.

the class AbstractAdmCliTest method testCRUDWithOnTheFlyAuth.

void testCRUDWithOnTheFlyAuth(String serverUrl, String credentials, String extraOptions, String loginMessage) throws IOException {
    File configFile = getDefaultConfigFilePath();
    long lastModified = configFile.exists() ? configFile.lastModified() : 0;
    // This test assumes it is the only user of any instance of on the system
    KcAdmExec exe = execute("create clients --no-config --server " + serverUrl + " --realm test " + credentials + " " + extraOptions + " -s clientId=test-client -o");
    Assert.assertEquals("exitCode == 0", 0, exe.exitCode());
    Assert.assertEquals("login message", loginMessage, exe.stderrLines().get(0));
    ClientRepresentation client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class);
    Assert.assertEquals("clientId", "test-client", client.getClientId());
    long lastModified2 = configFile.exists() ? configFile.lastModified() : 0;
    Assert.assertEquals("config file not modified", lastModified, lastModified2);
    exe = execute("get clients/" + client.getId() + " --no-config --server " + serverUrl + " --realm test " + credentials + " " + extraOptions);
    assertExitCodeAndStdErrSize(exe, 0, 1);
    ClientRepresentation client2 = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class);
    Assert.assertEquals("clientId", "test-client", client2.getClientId());
    lastModified2 = configFile.exists() ? configFile.lastModified() : 0;
    Assert.assertEquals("config file not modified", lastModified, lastModified2);
    exe = execute("update clients/" + client.getId() + " --no-config --server " + serverUrl + " --realm test " + credentials + " " + extraOptions + " -s enabled=false -o");
    assertExitCodeAndStdErrSize(exe, 0, 1);
    ClientRepresentation client4 = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class);
    Assert.assertEquals("clientId", "test-client", client4.getClientId());
    Assert.assertFalse("enabled", client4.isEnabled());
    lastModified2 = configFile.exists() ? configFile.lastModified() : 0;
    Assert.assertEquals("config file not modified", lastModified, lastModified2);
    exe = execute("delete clients/" + client.getId() + " --no-config --server " + serverUrl + " --realm test " + credentials + " " + extraOptions);
    // if there is no login, then there is one less stdErrLinecount
    int linecountOffset = "".equals(loginMessage) ? 1 : 0;
    assertExitCodeAndStreamSizes(exe, 0, 0, 1 - linecountOffset);
    lastModified2 = configFile.exists() ? configFile.lastModified() : 0;
    Assert.assertEquals("config file not modified", lastModified, lastModified2);
    // subsequent delete should fail
    exe = execute("delete clients/" + client.getId() + " --no-config --server " + serverUrl + " --realm test " + credentials + " " + extraOptions);
    assertExitCodeAndStreamSizes(exe, 1, 0, 2 - linecountOffset);
    String resourceUri = serverUrl + "/admin/realms/test/clients/" + client.getId();
    Assert.assertEquals("error message", "Resource not found for url: " + resourceUri, exe.stderrLines().get(1 - linecountOffset));
    lastModified2 = configFile.exists() ? configFile.lastModified() : 0;
    Assert.assertEquals("config file not modified", lastModified, lastModified2);
}
Also used : KcAdmExec(org.keycloak.testsuite.cli.KcAdmExec) File(java.io.File) ClientRepresentation(org.keycloak.representations.idm.ClientRepresentation)

Example 9 with KcAdmExec

use of org.keycloak.testsuite.cli.KcAdmExec in project keycloak by keycloak.

the class KcAdmSessionTest method test.

@Test
public void test() throws IOException {
    FileConfigHandler handler = initCustomConfigFile();
    try (TempFileResource configFile = new TempFileResource(handler.getConfigFile())) {
        // login as admin
        loginAsUser(configFile.getFile(), serverUrl, "master", "admin", "admin");
        // create realm
        KcAdmExec exe = execute("create realms --config '" + configFile.getName() + "' -s realm=demorealm -s enabled=true");
        assertExitCodeAndStreamSizes(exe, 0, 0, 1);
        Assert.assertTrue(exe.stderrLines().get(0).startsWith("Created "));
        // create user
        exe = execute("create users --config '" + configFile.getName() + "' -r demorealm -s username=testuser -s enabled=true -i");
        assertExitCodeAndStreamSizes(exe, 0, 1, 0);
        String userId = exe.stdoutLines().get(0);
        // add realm admin capabilities to user
        exe = execute("add-roles --config '" + configFile.getName() + "' -r demorealm --uusername testuser --cclientid realm-management --rolename realm-admin");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        // set password for the user
        exe = execute("set-password --config '" + configFile.getName() + "' -r demorealm --username testuser -p password");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        // login as testuser
        loginAsUser(configFile.getFile(), serverUrl, "demorealm", "testuser", "password");
        // get realm roles
        exe = execute("get-roles --config '" + configFile.getName() + "'");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        List<ObjectNode> roles = loadJson(exe.stdout(), LIST_OF_JSON);
        Assert.assertThat("expected three realm roles available", roles.size(), equalTo(3));
        // create realm role
        exe = execute("create roles --config '" + configFile.getName() + "' -s name=testrole -s 'description=Test role' -o");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        ObjectNode role = loadJson(exe.stdout(), ObjectNode.class);
        Assert.assertEquals("testrole", role.get("name").asText());
        String roleId = role.get("id").asText();
        // get realm roles again
        exe = execute("get-roles --config '" + configFile.getName() + "'");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        roles = loadJson(exe.stdout(), LIST_OF_JSON);
        Assert.assertThat("expected four realm roles available", roles.size(), equalTo(4));
        // create client
        exe = execute("create clients --config '" + configFile.getName() + "' -s clientId=testclient -i");
        assertExitCodeAndStreamSizes(exe, 0, 1, 0);
        String idOfClient = exe.stdoutLines().get(0);
        // create client role
        exe = execute("create clients/" + idOfClient + "/roles --config '" + configFile.getName() + "' -s name=clientrole  -s 'description=Test client role'");
        assertExitCodeAndStreamSizes(exe, 0, 0, 1);
        Assert.assertTrue(exe.stderrLines().get(0).startsWith("Created "));
        // make sure client role has been created
        exe = execute("get-roles --config '" + configFile.getName() + "' --cclientid testclient");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        roles = loadJson(exe.stdout(), LIST_OF_JSON);
        Assert.assertThat("expected one role", roles.size(), equalTo(1));
        Assert.assertEquals("clientrole", roles.get(0).get("name").asText());
        // add created role to user - we are realm admin so we can add role to ourself
        exe = execute("add-roles --config '" + configFile.getName() + "' --uusername testuser --cclientid testclient --rolename clientrole");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        // make sure the roles have been added
        exe = execute("get-roles --config '" + configFile.getName() + "' --uusername testuser --all");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        ObjectNode node = loadJson(exe.stdout(), ObjectNode.class);
        Assert.assertNotNull(node.get("realmMappings"));
        List<String> realmMappings = StreamSupport.stream(node.get("realmMappings").spliterator(), false).map(o -> o.get("name").asText()).sorted().collect(Collectors.toList());
        Assert.assertEquals(Arrays.asList("default-roles-demorealm"), realmMappings);
        ObjectNode clientRoles = (ObjectNode) node.get("clientMappings");
        // List<String> fields = asSortedList(clientRoles.fieldNames());
        List<String> fields = StreamSupport.stream(clientRoles.spliterator(), false).map(o -> o.get("client").asText()).sorted().collect(Collectors.toList());
        Assert.assertEquals(Arrays.asList("realm-management", "testclient"), fields);
        realmMappings = StreamSupport.stream(clientRoles.get("realm-management").get("mappings").spliterator(), false).map(o -> o.get("name").asText()).sorted().collect(Collectors.toList());
        Assert.assertEquals(Arrays.asList("realm-admin"), realmMappings);
        realmMappings = StreamSupport.stream(clientRoles.get("testclient").get("mappings").spliterator(), false).map(o -> o.get("name").asText()).sorted().collect(Collectors.toList());
        Assert.assertEquals(Arrays.asList("clientrole"), realmMappings);
        // add a realm role to the user
        exe = execute("add-roles --config '" + configFile.getName() + "' --uusername testuser --rolename testrole");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        // get all roles for the user again
        exe = execute("get-roles --config '" + configFile.getName() + "' --uusername testuser --all");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        node = loadJson(exe.stdout(), ObjectNode.class);
        Assert.assertNotNull(node.get("realmMappings"));
        realmMappings = StreamSupport.stream(node.get("realmMappings").spliterator(), false).map(o -> o.get("name").asText()).sorted().collect(Collectors.toList());
        Assert.assertEquals(Arrays.asList("default-roles-demorealm", "testrole"), realmMappings);
        // create a group
        exe = execute("create groups --config '" + configFile.getName() + "' -s name=TestUsers -i");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        String groupId = exe.stdoutLines().get(0);
        // create a sub-group
        exe = execute("create groups/" + groupId + "/children --config '" + configFile.getName() + "' -s name=TestPowerUsers -i");
        assertExitCodeAndStdErrSize(exe, 0, 0);
        String subGroupId = exe.stdoutLines().get(0);
        // add testuser to TestPowerUsers
        exe = execute("update users/" + userId + "/groups/" + subGroupId + " --config '" + configFile.getName() + "' -s realm=demorealm -s userId=" + userId + " -s groupId=" + subGroupId + " -n");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        // delete everything
        exe = execute("delete groups/" + subGroupId + " --config '" + configFile.getName() + "'");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        exe = execute("delete groups/" + groupId + " --config '" + configFile.getName() + "'");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        exe = execute("delete clients/" + idOfClient + " --config '" + configFile.getName() + "'");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        exe = execute("delete roles/testrole --config '" + configFile.getName() + "'");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        exe = execute("delete users/" + userId + " --config '" + configFile.getName() + "'");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
        // delete realm as well - using initial master realm session still saved in config file
        exe = execute("delete realms/demorealm --config '" + configFile.getName() + "' --realm master");
        assertExitCodeAndStreamSizes(exe, 0, 0, 0);
    }
}
Also used : Arrays(java.util.Arrays) AuthServerContainerExclude(org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude) AbstractAdminTest.loadJson(org.keycloak.testsuite.admin.AbstractAdminTest.loadJson) Test(org.junit.Test) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) FileConfigHandler(org.keycloak.client.admin.cli.config.FileConfigHandler) KcAdmExec(org.keycloak.testsuite.cli.KcAdmExec) List(java.util.List) Matchers.equalTo(org.hamcrest.Matchers.equalTo) TempFileResource(org.keycloak.testsuite.util.TempFileResource) StreamSupport(java.util.stream.StreamSupport) TypeReference(com.fasterxml.jackson.core.type.TypeReference) Assert(org.junit.Assert) AuthServer(org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer) KcAdmExec.execute(org.keycloak.testsuite.cli.KcAdmExec.execute) FileConfigHandler(org.keycloak.client.admin.cli.config.FileConfigHandler) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) KcAdmExec(org.keycloak.testsuite.cli.KcAdmExec) TempFileResource(org.keycloak.testsuite.util.TempFileResource) Test(org.junit.Test)

Example 10 with KcAdmExec

use of org.keycloak.testsuite.cli.KcAdmExec in project keycloak by keycloak.

the class KcAdmTest method testBadOptionInPlaceOfCommand.

@Test
public void testBadOptionInPlaceOfCommand() {
    /*
         *  Test most basic execution with non-existent option
         */
    KcAdmExec exe = KcAdmExec.execute("--nonexistent");
    assertExitCodeAndStreamSizes(exe, 1, 0, 1);
    Assert.assertEquals("stderr first line", "Unknown command: --nonexistent", exe.stderrLines().get(0));
}
Also used : KcAdmExec(org.keycloak.testsuite.cli.KcAdmExec) Test(org.junit.Test)

Aggregations

KcAdmExec (org.keycloak.testsuite.cli.KcAdmExec)27 Test (org.junit.Test)25 FileConfigHandler (org.keycloak.client.admin.cli.config.FileConfigHandler)10 TempFileResource (org.keycloak.testsuite.util.TempFileResource)9 File (java.io.File)8 ClientRepresentation (org.keycloak.representations.idm.ClientRepresentation)4 ConfigData (org.keycloak.client.admin.cli.config.ConfigData)3 FileOutputStream (java.io.FileOutputStream)2 RealmResource (org.keycloak.admin.client.resource.RealmResource)2 RealmConfigData (org.keycloak.client.admin.cli.config.RealmConfigData)2 TypeReference (com.fasterxml.jackson.core.type.TypeReference)1 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 Closeable (java.io.Closeable)1 IOException (java.io.IOException)1 Arrays (java.util.Arrays)1 List (java.util.List)1 Collectors (java.util.stream.Collectors)1 StreamSupport (java.util.stream.StreamSupport)1 Matchers.equalTo (org.hamcrest.Matchers.equalTo)1