From e625c65ddeeb5bb89bb0eede06dbf2eca1ab348c Mon Sep 17 00:00:00 2001 From: Akash Date: Wed, 22 May 2024 18:42:11 +0530 Subject: [PATCH] Introduce base64 groupId to fix 404 incase groupd id contains HTML tags. --- .gitignore | 1 + src/main/java/kafdrop/controller/ConsumerController.java | 7 +++++-- src/main/java/kafdrop/model/ConsumerVO.java | 9 +++++++++ src/main/resources/templates/topic-detail.ftlh | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 4797ad35..a51fd761 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ kafka.properties* kafka.truststore.jks* kafka.keystore.jks* /.vs +.java-version diff --git a/src/main/java/kafdrop/controller/ConsumerController.java b/src/main/java/kafdrop/controller/ConsumerController.java index 55b7a23a..f8893097 100644 --- a/src/main/java/kafdrop/controller/ConsumerController.java +++ b/src/main/java/kafdrop/controller/ConsumerController.java @@ -32,6 +32,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + @Tag(name = "consumer-controller", description = "Consumer Controller") @Controller @RequestMapping("/consumer") @@ -44,7 +47,7 @@ public ConsumerController(KafkaMonitor kafkaMonitor) { @RequestMapping("/{groupId:.+}") public String consumerDetail(@PathVariable("groupId") String groupId, Model model) throws ConsumerNotFoundException { - final var consumer = kafkaMonitor.getConsumersByGroup(groupId).stream().findAny(); + final var consumer = kafkaMonitor.getConsumersByGroup(new String(Base64.getDecoder().decode(groupId), StandardCharsets.UTF_8)).stream().findAny(); model.addAttribute("consumer", consumer.orElseThrow(() -> new ConsumerNotFoundException(groupId))); return "consumer-detail"; @@ -58,7 +61,7 @@ public String consumerDetail(@PathVariable("groupId") String groupId, Model mode @GetMapping(path = "/{groupId:.+}", produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody ConsumerVO getConsumer(@PathVariable("groupId") String groupId) throws ConsumerNotFoundException { - final var consumer = kafkaMonitor.getConsumersByGroup(groupId).stream().findAny(); + final var consumer = kafkaMonitor.getConsumersByGroup(new String(Base64.getDecoder().decode(groupId), StandardCharsets.UTF_8)).stream().findAny(); return consumer.orElseThrow(() -> new ConsumerNotFoundException(groupId)); } diff --git a/src/main/java/kafdrop/model/ConsumerVO.java b/src/main/java/kafdrop/model/ConsumerVO.java index df28fffe..c767930c 100644 --- a/src/main/java/kafdrop/model/ConsumerVO.java +++ b/src/main/java/kafdrop/model/ConsumerVO.java @@ -20,6 +20,8 @@ import org.apache.commons.lang3.Validate; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.Collection; import java.util.Map; import java.util.Objects; @@ -27,17 +29,24 @@ public final class ConsumerVO implements Comparable { private final String groupId; + + private final String groupIdBase64; private final Map topics = new TreeMap<>(); public ConsumerVO(String groupId) { Validate.notEmpty("groupId is required"); this.groupId = groupId; + this.groupIdBase64 = new String (Base64.getEncoder().encode(groupId.getBytes(StandardCharsets.UTF_8))); } public String getGroupId() { return groupId; } + public String getGroupIdBase64() { + return groupIdBase64; + } + public void addTopic(ConsumerTopicVO topic) { topics.put(topic.getTopic(), topic); } diff --git a/src/main/resources/templates/topic-detail.ftlh b/src/main/resources/templates/topic-detail.ftlh index db9c12b6..b6bde23d 100644 --- a/src/main/resources/templates/topic-detail.ftlh +++ b/src/main/resources/templates/topic-detail.ftlh @@ -156,7 +156,7 @@ <#list consumers![] as c> - ${c.groupId} + ${c.groupId} ${c.getTopic(topic.name).lag}