From da738f61f1f3b728eec52763b337f0ad70a96282 Mon Sep 17 00:00:00 2001 From: liuhy Date: Fri, 24 Jul 2026 08:04:23 -0700 Subject: [PATCH] fix: validate ops setting requests --- .../rocketmq/studio/ops/OpsController.java | 13 ++--- .../rocketmq/studio/ops/OpsNameServerDTO.java | 2 + .../com/rocketmq/studio/ops/OpsTlsDTO.java | 4 +- .../rocketmq/studio/ops/OpsVipChannelDTO.java | 4 +- .../studio/ops/OpsControllerTest.java | 49 +++++++++++++++++++ 5 files changed, 64 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/com/rocketmq/studio/ops/OpsController.java b/server/src/main/java/com/rocketmq/studio/ops/OpsController.java index 5bfb8a23..9b86447d 100644 --- a/server/src/main/java/com/rocketmq/studio/ops/OpsController.java +++ b/server/src/main/java/com/rocketmq/studio/ops/OpsController.java @@ -18,6 +18,7 @@ package com.rocketmq.studio.ops; import com.rocketmq.studio.common.domain.Result; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -38,26 +39,26 @@ public Result homePage() { } @PostMapping("/updateNameSvrAddr") - public Result updateNameSvrAddr(@RequestBody OpsNameServerDTO request) { + public Result updateNameSvrAddr(@Valid @RequestBody OpsNameServerDTO request) { opsService.updateNameServer(request.getNamesrvAddr()); return Result.ok(); } @PostMapping("/addNameSvrAddr") - public Result addNameSvrAddr(@RequestBody OpsNameServerDTO request) { + public Result addNameSvrAddr(@Valid @RequestBody OpsNameServerDTO request) { opsService.addNameServer(request.getNamesrvAddr()); return Result.ok(); } @PostMapping("/updateIsVIPChannel") - public Result updateIsVIPChannel(@RequestBody OpsVipChannelDTO request) { - opsService.updateVipChannel(request.isUseVIPChannel()); + public Result updateIsVIPChannel(@Valid @RequestBody OpsVipChannelDTO request) { + opsService.updateVipChannel(request.getUseVIPChannel()); return Result.ok(); } @PostMapping("/updateUseTLS") - public Result updateUseTLS(@RequestBody OpsTlsDTO request) { - opsService.updateUseTLS(request.isUseTLS()); + public Result updateUseTLS(@Valid @RequestBody OpsTlsDTO request) { + opsService.updateUseTLS(request.getUseTLS()); return Result.ok(); } } diff --git a/server/src/main/java/com/rocketmq/studio/ops/OpsNameServerDTO.java b/server/src/main/java/com/rocketmq/studio/ops/OpsNameServerDTO.java index a520cd75..e1c5a8ed 100644 --- a/server/src/main/java/com/rocketmq/studio/ops/OpsNameServerDTO.java +++ b/server/src/main/java/com/rocketmq/studio/ops/OpsNameServerDTO.java @@ -17,9 +17,11 @@ package com.rocketmq.studio.ops; +import jakarta.validation.constraints.NotBlank; import lombok.Data; @Data public class OpsNameServerDTO { + @NotBlank(message = "namesrvAddr is required") private String namesrvAddr; } diff --git a/server/src/main/java/com/rocketmq/studio/ops/OpsTlsDTO.java b/server/src/main/java/com/rocketmq/studio/ops/OpsTlsDTO.java index 1ed42ee2..6c860545 100644 --- a/server/src/main/java/com/rocketmq/studio/ops/OpsTlsDTO.java +++ b/server/src/main/java/com/rocketmq/studio/ops/OpsTlsDTO.java @@ -17,9 +17,11 @@ package com.rocketmq.studio.ops; +import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class OpsTlsDTO { - private boolean useTLS; + @NotNull(message = "useTLS is required") + private Boolean useTLS; } diff --git a/server/src/main/java/com/rocketmq/studio/ops/OpsVipChannelDTO.java b/server/src/main/java/com/rocketmq/studio/ops/OpsVipChannelDTO.java index 612b8f38..f38d0283 100644 --- a/server/src/main/java/com/rocketmq/studio/ops/OpsVipChannelDTO.java +++ b/server/src/main/java/com/rocketmq/studio/ops/OpsVipChannelDTO.java @@ -17,9 +17,11 @@ package com.rocketmq.studio.ops; +import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class OpsVipChannelDTO { - private boolean useVIPChannel; + @NotNull(message = "useVIPChannel is required") + private Boolean useVIPChannel; } diff --git a/server/src/test/java/com/rocketmq/studio/ops/OpsControllerTest.java b/server/src/test/java/com/rocketmq/studio/ops/OpsControllerTest.java index cbc4582b..33dc49b4 100644 --- a/server/src/test/java/com/rocketmq/studio/ops/OpsControllerTest.java +++ b/server/src/test/java/com/rocketmq/studio/ops/OpsControllerTest.java @@ -31,6 +31,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -80,6 +81,18 @@ void updateNameSvrAddrShouldDelegateToService() throws Exception { verify(opsService).updateNameServer(eq("10.0.0.1:9876")); } + @Test + void updateNameSvrAddrShouldRejectMissingAddress() throws Exception { + mockMvc.perform(post("/api/ops/updateNameSvrAddr") + .contentType(MediaType.APPLICATION_JSON) + .content("{}")) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value(400)) + .andExpect(jsonPath("$.message").value("namesrvAddr is required")); + + verifyNoInteractions(opsService); + } + @Test void addNameSvrAddrShouldDelegateToService() throws Exception { mockMvc.perform(post("/api/ops/addNameSvrAddr") @@ -90,6 +103,18 @@ void addNameSvrAddrShouldDelegateToService() throws Exception { verify(opsService).addNameServer(eq("10.0.0.2:9876")); } + @Test + void addNameSvrAddrShouldRejectBlankAddress() throws Exception { + mockMvc.perform(post("/api/ops/addNameSvrAddr") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(Map.of("namesrvAddr", " ")))) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value(400)) + .andExpect(jsonPath("$.message").value("namesrvAddr is required")); + + verifyNoInteractions(opsService); + } + @Test void updateVipChannelShouldDelegateToService() throws Exception { mockMvc.perform(post("/api/ops/updateIsVIPChannel") @@ -100,6 +125,18 @@ void updateVipChannelShouldDelegateToService() throws Exception { verify(opsService).updateVipChannel(false); } + @Test + void updateVipChannelShouldRejectMissingFlag() throws Exception { + mockMvc.perform(post("/api/ops/updateIsVIPChannel") + .contentType(MediaType.APPLICATION_JSON) + .content("{}")) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value(400)) + .andExpect(jsonPath("$.message").value("useVIPChannel is required")); + + verifyNoInteractions(opsService); + } + @Test void updateUseTlsShouldDelegateToService() throws Exception { mockMvc.perform(post("/api/ops/updateUseTLS") @@ -109,4 +146,16 @@ void updateUseTlsShouldDelegateToService() throws Exception { verify(opsService).updateUseTLS(true); } + + @Test + void updateUseTlsShouldRejectMissingFlag() throws Exception { + mockMvc.perform(post("/api/ops/updateUseTLS") + .contentType(MediaType.APPLICATION_JSON) + .content("{}")) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value(400)) + .andExpect(jsonPath("$.message").value("useTLS is required")); + + verifyNoInteractions(opsService); + } }