From f5496c0c1d2a4ef63e959e45438946de466f4d6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Greffier?= Date: Tue, 28 May 2024 23:24:39 +0200 Subject: [PATCH] Fix mask token on current context display --- .../com/michelin/kafkactl/command/Get.java | 4 +-- .../command/config/ConfigCurrentContext.java | 13 +++++++- .../command/config/ConfigGetContexts.java | 12 +++---- .../kafkactl/mixin/UnmaskTokenMixin.java | 13 ++++++++ .../kafkactl/service/ResourceService.java | 8 ++--- .../kafkactl/command/ApiResourcesTest.java | 2 +- .../kafkactl/command/ConnectorTest.java | 4 +-- .../michelin/kafkactl/command/SchemaTest.java | 2 +- .../config/ConfigCurrentContextTest.java | 32 ++++++++++++++++--- .../command/config/ConfigGetContextsTest.java | 8 ++--- .../service/ApiResourcesServiceTest.java | 2 +- .../kafkactl/service/FileServiceTest.java | 16 +++++----- .../kafkactl/service/LoginServiceTest.java | 2 +- .../kafkactl/service/ResourceServiceTest.java | 8 ++--- 14 files changed, 87 insertions(+), 39 deletions(-) create mode 100644 src/main/java/com/michelin/kafkactl/mixin/UnmaskTokenMixin.java diff --git a/src/main/java/com/michelin/kafkactl/command/Get.java b/src/main/java/com/michelin/kafkactl/command/Get.java index eae2d1e..a8fe127 100644 --- a/src/main/java/com/michelin/kafkactl/command/Get.java +++ b/src/main/java/com/michelin/kafkactl/command/Get.java @@ -74,11 +74,11 @@ public Integer onAuthSuccess() throws IOException { try { // Get individual resources for given types (k get topic topic1) Resource singleResource = - resourceService.getSingleResourceWithType(apiResources.get(0), namespace, resourceName.get(), true); + resourceService.getSingleResourceWithType(apiResources.getFirst(), namespace, resourceName.get(), true); formatService.displaySingle(singleResource, output, commandSpec); return 0; } catch (HttpClientResponseException e) { - formatService.displayError(e, apiResources.get(0).getKind(), resourceName.get(), commandSpec); + formatService.displayError(e, apiResources.getFirst().getKind(), resourceName.get(), commandSpec); return 1; } } diff --git a/src/main/java/com/michelin/kafkactl/command/config/ConfigCurrentContext.java b/src/main/java/com/michelin/kafkactl/command/config/ConfigCurrentContext.java index 8e525cf..a8a7454 100644 --- a/src/main/java/com/michelin/kafkactl/command/config/ConfigCurrentContext.java +++ b/src/main/java/com/michelin/kafkactl/command/config/ConfigCurrentContext.java @@ -1,10 +1,12 @@ package com.michelin.kafkactl.command.config; +import static com.michelin.kafkactl.mixin.UnmaskTokenMixin.MASKED; import static com.michelin.kafkactl.service.FormatService.TABLE; import static com.michelin.kafkactl.util.constant.ResourceKind.CONTEXT; import com.michelin.kafkactl.config.KafkactlConfig; import com.michelin.kafkactl.hook.ValidCurrentContextHook; +import com.michelin.kafkactl.mixin.UnmaskTokenMixin; import com.michelin.kafkactl.model.Metadata; import com.michelin.kafkactl.model.Resource; import com.michelin.kafkactl.service.FormatService; @@ -16,6 +18,7 @@ import java.util.List; import java.util.Map; import picocli.CommandLine.Command; +import picocli.CommandLine.Mixin; /** * Config current context subcommand. @@ -40,12 +43,20 @@ public class ConfigCurrentContext extends ValidCurrentContextHook { @ReflectiveAccess private FormatService formatService; + @Mixin + public UnmaskTokenMixin unmaskTokenMixin; + @Override public Integer onContextValid() { Map specs = new HashMap<>(); specs.put("namespace", kafkactlConfig.getCurrentNamespace()); specs.put("api", kafkactlConfig.getApi()); - specs.put("token", kafkactlConfig.getUserToken()); + + if (unmaskTokenMixin.unmaskTokens) { + specs.put("token", kafkactlConfig.getUserToken()); + } else { + specs.put("token", MASKED); + } String currentContextName = configService.getCurrentContextName(); Resource currentContextAsResource = Resource.builder() diff --git a/src/main/java/com/michelin/kafkactl/command/config/ConfigGetContexts.java b/src/main/java/com/michelin/kafkactl/command/config/ConfigGetContexts.java index a3a1981..e30b55f 100644 --- a/src/main/java/com/michelin/kafkactl/command/config/ConfigGetContexts.java +++ b/src/main/java/com/michelin/kafkactl/command/config/ConfigGetContexts.java @@ -1,9 +1,11 @@ package com.michelin.kafkactl.command.config; +import static com.michelin.kafkactl.mixin.UnmaskTokenMixin.MASKED; import static com.michelin.kafkactl.service.FormatService.TABLE; import static com.michelin.kafkactl.util.constant.ResourceKind.CONTEXT; import com.michelin.kafkactl.config.KafkactlConfig; +import com.michelin.kafkactl.mixin.UnmaskTokenMixin; import com.michelin.kafkactl.model.Metadata; import com.michelin.kafkactl.model.Resource; import com.michelin.kafkactl.service.FormatService; @@ -15,8 +17,8 @@ import java.util.Map; import java.util.concurrent.Callable; import picocli.CommandLine.Command; +import picocli.CommandLine.Mixin; import picocli.CommandLine.Model.CommandSpec; -import picocli.CommandLine.Option; import picocli.CommandLine.Spec; /** @@ -34,8 +36,6 @@ versionProvider = VersionProvider.class, mixinStandardHelpOptions = true) public class ConfigGetContexts implements Callable { - private static final String MASKED = "[MASKED]"; - @Inject @ReflectiveAccess private KafkactlConfig kafkactlConfig; @@ -47,8 +47,8 @@ public class ConfigGetContexts implements Callable { @Spec public CommandSpec commandSpec; - @Option(names = {"-u", "--unmask-tokens"}, description = "Unmask tokens.") - public boolean unmaskTokens; + @Mixin + public UnmaskTokenMixin unmaskTokenMixin; @Override public Integer call() { @@ -62,7 +62,7 @@ public Integer call() { specs.put("namespace", userContext.getDefinition().getNamespace()); specs.put("api", userContext.getDefinition().getApi()); - if (unmaskTokens) { + if (unmaskTokenMixin.unmaskTokens) { specs.put("token", userContext.getDefinition().getUserToken()); } else { specs.put("token", MASKED); diff --git a/src/main/java/com/michelin/kafkactl/mixin/UnmaskTokenMixin.java b/src/main/java/com/michelin/kafkactl/mixin/UnmaskTokenMixin.java new file mode 100644 index 0000000..e7dc7fb --- /dev/null +++ b/src/main/java/com/michelin/kafkactl/mixin/UnmaskTokenMixin.java @@ -0,0 +1,13 @@ +package com.michelin.kafkactl.mixin; + +import picocli.CommandLine; + +/** + * Unmask token mixin. + */ +public class UnmaskTokenMixin { + public static final String MASKED = "[MASKED]"; + + @CommandLine.Option(names = {"-u", "--unmask-tokens"}, description = "Unmask tokens.") + public boolean unmaskTokens; +} diff --git a/src/main/java/com/michelin/kafkactl/service/ResourceService.java b/src/main/java/com/michelin/kafkactl/service/ResourceService.java index e03f8d7..bb50e5f 100644 --- a/src/main/java/com/michelin/kafkactl/service/ResourceService.java +++ b/src/main/java/com/michelin/kafkactl/service/ResourceService.java @@ -73,12 +73,12 @@ public int listAll(List apiResources, String namespace, String outp // Get a single kind of resources if (apiResources.size() == 1) { try { - List resources = listResourcesWithType(apiResources.get(0), namespace); + List resources = listResourcesWithType(apiResources.getFirst(), namespace); if (!resources.isEmpty()) { - formatService.displayList(resources.get(0).getKind(), resources, output, commandSpec); + formatService.displayList(resources.getFirst().getKind(), resources, output, commandSpec); } else { commandSpec.commandLine().getOut() - .println("No " + formatService.prettifyKind(apiResources.get(0).getKind()).toLowerCase() + .println("No " + formatService.prettifyKind(apiResources.getFirst().getKind()).toLowerCase() + " to display."); } return 0; @@ -95,7 +95,7 @@ public int listAll(List apiResources, String namespace, String outp try { List resources = listResourcesWithType(apiResource, namespace); if (!resources.isEmpty()) { - formatService.displayList(resources.get(0).getKind(), resources, output, commandSpec); + formatService.displayList(resources.getFirst().getKind(), resources, output, commandSpec); } return 0; } catch (HttpClientResponseException exception) { diff --git a/src/test/java/com/michelin/kafkactl/command/ApiResourcesTest.java b/src/test/java/com/michelin/kafkactl/command/ApiResourcesTest.java index fe64599..c3e1827 100644 --- a/src/test/java/com/michelin/kafkactl/command/ApiResourcesTest.java +++ b/src/test/java/com/michelin/kafkactl/command/ApiResourcesTest.java @@ -102,7 +102,7 @@ void shouldDisplayApiResources() { int code = cmd.execute(); assertEquals(0, code); verify(formatService).displayList(eq(RESOURCE_DEFINITION), - argThat(resources -> resources.get(0).getMetadata().getName().equals("Topic")), + argThat(resources -> resources.getFirst().getMetadata().getName().equals("Topic")), eq(TABLE), eq(cmd.getCommandSpec())); } diff --git a/src/test/java/com/michelin/kafkactl/command/ConnectorTest.java b/src/test/java/com/michelin/kafkactl/command/ConnectorTest.java index 7792da5..8ab2cca 100644 --- a/src/test/java/com/michelin/kafkactl/command/ConnectorTest.java +++ b/src/test/java/com/michelin/kafkactl/command/ConnectorTest.java @@ -135,7 +135,7 @@ void shouldChangeState() { int code = cmd.execute("pause", "my-connector", "-n", "namespace"); assertEquals(0, code); verify(formatService).displayList(eq(CHANGE_CONNECTOR_STATE), - argThat(connectors -> connectors.get(0).equals(resource)), + argThat(connectors -> connectors.getFirst().equals(resource)), eq(TABLE), eq(cmd.getCommandSpec())); } @@ -175,7 +175,7 @@ void shouldChangeStateOfAll() { int code = cmd.execute("pause", "all", "-n", "namespace"); assertEquals(0, code); verify(formatService).displayList(eq(CHANGE_CONNECTOR_STATE), - argThat(connectors -> connectors.get(0).equals(resource)), + argThat(connectors -> connectors.getFirst().equals(resource)), eq(TABLE), eq(cmd.getCommandSpec())); } diff --git a/src/test/java/com/michelin/kafkactl/command/SchemaTest.java b/src/test/java/com/michelin/kafkactl/command/SchemaTest.java index e06f355..ef7b04b 100644 --- a/src/test/java/com/michelin/kafkactl/command/SchemaTest.java +++ b/src/test/java/com/michelin/kafkactl/command/SchemaTest.java @@ -126,7 +126,7 @@ void shouldUpdateCompat() { int code = cmd.execute("backward", "mySubject", "-n", "namespace"); assertEquals(0, code); verify(formatService).displayList(eq(SCHEMA_COMPATIBILITY_STATE), - argThat(schemas -> schemas.get(0).equals(resource)), + argThat(schemas -> schemas.getFirst().equals(resource)), eq(TABLE), eq(cmd.getCommandSpec())); } } diff --git a/src/test/java/com/michelin/kafkactl/command/config/ConfigCurrentContextTest.java b/src/test/java/com/michelin/kafkactl/command/config/ConfigCurrentContextTest.java index 7d18bae..7c8029f 100644 --- a/src/test/java/com/michelin/kafkactl/command/config/ConfigCurrentContextTest.java +++ b/src/test/java/com/michelin/kafkactl/command/config/ConfigCurrentContextTest.java @@ -38,15 +38,13 @@ class ConfigCurrentContextTest { ConfigCurrentContext subcommand; @Test - void shouldGetCurrentContext() { + void shouldGetCurrentContextWithMaskedTokens() { when(configService.isCurrentContextValid()) .thenReturn(true); when(kafkactlConfig.getCurrentNamespace()) .thenReturn("namespace"); when(kafkactlConfig.getApi()) .thenReturn("ns4kafka.com"); - when(kafkactlConfig.getUserToken()) - .thenReturn("user-token"); when(configService.getCurrentContextName()) .thenReturn("current-context"); @@ -57,10 +55,36 @@ void shouldGetCurrentContext() { int code = cmd.execute(); assertEquals(0, code); verify(formatService).displayList(eq("Context"), - argThat(currentContext -> currentContext.get(0).getMetadata().getName().equals("current-context")), + argThat(currentContext -> currentContext.getFirst().getMetadata().getName().equals("current-context") + && currentContext.getFirst().getSpec().get("token").equals("[MASKED]")), eq(TABLE), eq(cmd.getCommandSpec())); } + @Test + void shouldGetCurrentContextWithUnmaskedTokens() { + when(configService.isCurrentContextValid()) + .thenReturn(true); + when(kafkactlConfig.getCurrentNamespace()) + .thenReturn("namespace"); + when(kafkactlConfig.getApi()) + .thenReturn("ns4kafka.com"); + when(kafkactlConfig.getUserToken()) + .thenReturn("user-token"); + when(configService.getCurrentContextName()) + .thenReturn("current-context"); + + CommandLine cmd = new CommandLine(subcommand); + StringWriter sw = new StringWriter(); + cmd.setOut(new PrintWriter(sw)); + + int code = cmd.execute("-u"); + assertEquals(0, code); + verify(formatService).displayList(eq("Context"), + argThat(currentContext -> currentContext.getFirst().getMetadata().getName().equals("current-context") + && currentContext.getFirst().getSpec().get("token").equals("user-token")), + eq(TABLE), eq(cmd.getCommandSpec())); + } + @Test void shouldNotGetCurrentContextWhenInvalid() { when(configService.isCurrentContextValid()) diff --git a/src/test/java/com/michelin/kafkactl/command/config/ConfigGetContextsTest.java b/src/test/java/com/michelin/kafkactl/command/config/ConfigGetContextsTest.java index 469186f..a0ccfc2 100644 --- a/src/test/java/com/michelin/kafkactl/command/config/ConfigGetContextsTest.java +++ b/src/test/java/com/michelin/kafkactl/command/config/ConfigGetContextsTest.java @@ -69,8 +69,8 @@ void shouldGetContextsWithMaskedTokens() { int code = cmd.execute(); assertEquals(0, code); verify(formatService).displayList(eq("Context"), - argThat(currentContext -> currentContext.get(0).getMetadata().getName().equals("name") - && currentContext.get(0).getSpec().get("token").equals("[MASKED]")), + argThat(currentContext -> currentContext.getFirst().getMetadata().getName().equals("name") + && currentContext.getFirst().getSpec().get("token").equals("[MASKED]")), eq(TABLE), eq(cmd.getCommandSpec())); } @@ -95,8 +95,8 @@ void shouldGetContextsWithUnmaskedTokens() { int code = cmd.execute("-u"); assertEquals(0, code); verify(formatService).displayList(eq("Context"), - argThat(currentContext -> currentContext.get(0).getMetadata().getName().equals("name") - && currentContext.get(0).getSpec().get("token").equals("userToken")), + argThat(currentContext -> currentContext.getFirst().getMetadata().getName().equals("name") + && currentContext.getFirst().getSpec().get("token").equals("userToken")), eq(TABLE), eq(cmd.getCommandSpec())); } } diff --git a/src/test/java/com/michelin/kafkactl/service/ApiResourcesServiceTest.java b/src/test/java/com/michelin/kafkactl/service/ApiResourcesServiceTest.java index a62f250..009d832 100644 --- a/src/test/java/com/michelin/kafkactl/service/ApiResourcesServiceTest.java +++ b/src/test/java/com/michelin/kafkactl/service/ApiResourcesServiceTest.java @@ -217,6 +217,6 @@ void shouldValidateResourceTypesInvalid() { List actual = apiResourcesService.filterNotAllowedResourceTypes(Collections.singletonList(resource)); - assertEquals(resource, actual.get(0)); + assertEquals(resource, actual.getFirst()); } } diff --git a/src/test/java/com/michelin/kafkactl/service/FileServiceTest.java b/src/test/java/com/michelin/kafkactl/service/FileServiceTest.java index 6f4deda..2a4521b 100644 --- a/src/test/java/com/michelin/kafkactl/service/FileServiceTest.java +++ b/src/test/java/com/michelin/kafkactl/service/FileServiceTest.java @@ -27,14 +27,14 @@ void shouldComputeYamlFileListRecursive() { @Test void shouldComputeYamlFileListNonRecursive() { List actual = fileService.computeYamlFileList(new File("src/test/resources"), false); - assertEquals("config.yml", actual.get(0).getName()); + assertEquals("config.yml", actual.getFirst().getName()); assertEquals(1, actual.size()); } @Test void shouldComputeYamlFileListFile() { List actual = fileService.computeYamlFileList(new File("src/test/resources/topics/topic.yml"), false); - assertEquals("topic.yml", actual.get(0).getName()); + assertEquals("topic.yml", actual.getFirst().getName()); assertEquals(1, actual.size()); } @@ -42,9 +42,9 @@ void shouldComputeYamlFileListFile() { void shouldParseResourceListFromFiles() { List actual = fileService.parseResourceListFromFiles( Collections.singletonList(new File("src/test/resources/topics/topic.yml"))); - assertEquals("Topic", actual.get(0).getKind()); - assertEquals("myPrefix.topic", actual.get(0).getMetadata().getName()); - assertEquals(3, actual.get(0).getSpec().get("replicationFactor")); + assertEquals("Topic", actual.getFirst().getKind()); + assertEquals("myPrefix.topic", actual.getFirst().getMetadata().getName()); + assertEquals(3, actual.getFirst().getSpec().get("replicationFactor")); assertEquals(1, actual.size()); } @@ -55,8 +55,8 @@ void shouldParseResourceListFromString() { "{\"apiVersion\": \"v1\", \"kind\": \"Topic\", \"metadata\": {\"name\": \"myTopic\"}}"); assertEquals(1, actual.size()); - assertEquals("v1", actual.get(0).getApiVersion()); - assertEquals("Topic", actual.get(0).getKind()); - assertEquals("myTopic", actual.get(0).getMetadata().getName()); + assertEquals("v1", actual.getFirst().getApiVersion()); + assertEquals("Topic", actual.getFirst().getKind()); + assertEquals("myTopic", actual.getFirst().getMetadata().getName()); } } diff --git a/src/test/java/com/michelin/kafkactl/service/LoginServiceTest.java b/src/test/java/com/michelin/kafkactl/service/LoginServiceTest.java index 7eed848..496e628 100644 --- a/src/test/java/com/michelin/kafkactl/service/LoginServiceTest.java +++ b/src/test/java/com/michelin/kafkactl/service/LoginServiceTest.java @@ -309,7 +309,7 @@ void shouldReadJwtFile() throws IOException { assertIterableEquals(List.of("isAdmin()"), actual.getRoles()); - assertEquals("anotherNamespace", actual.getRoleBindings().get(0).getNamespace()); + assertEquals("anotherNamespace", actual.getRoleBindings().getFirst().getNamespace()); assertIterableEquals(List.of(GET), actual.getRoleBindings().get(0).getVerbs()); assertIterableEquals(List.of("quota"), actual.getRoleBindings().get(0).getResourceTypes()); diff --git a/src/test/java/com/michelin/kafkactl/service/ResourceServiceTest.java b/src/test/java/com/michelin/kafkactl/service/ResourceServiceTest.java index 4e25b0d..e141fcd 100644 --- a/src/test/java/com/michelin/kafkactl/service/ResourceServiceTest.java +++ b/src/test/java/com/michelin/kafkactl/service/ResourceServiceTest.java @@ -1195,10 +1195,10 @@ void shouldParse() { cmd.getCommandSpec()); assertEquals(1, actual.size()); - assertEquals("Topic", actual.get(0).getKind()); - assertEquals("myPrefix.topic", actual.get(0).getMetadata().getName()); - assertEquals(3, actual.get(0).getSpec().get("replicationFactor")); - assertEquals(3, actual.get(0).getSpec().get("partitions")); + assertEquals("Topic", actual.getFirst().getKind()); + assertEquals("myPrefix.topic", actual.getFirst().getMetadata().getName()); + assertEquals(3, actual.getFirst().getSpec().get("replicationFactor")); + assertEquals(3, actual.getFirst().getSpec().get("partitions")); } @Test