This is an automated email from the ASF dual-hosted git repository.
tomsun28 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/master by this push:
new 11cd5bb0c7 [improve] reject masked receiver edit when the stored
receiver does not exist (#4225)
11cd5bb0c7 is described below
commit 11cd5bb0c76ef9f1605a22f03546120c9257deee
Author: Duansg <[email protected]>
AuthorDate: Wed Jul 22 01:32:24 2026 +0800
[improve] reject masked receiver edit when the stored receiver does not
exist (#4225)
---
.../service/impl/NoticeConfigServiceImpl.java | 9 ++++--
.../alert/service/NoticeConfigServiceTest.java | 32 ++++++++++++++++++++--
2 files changed, 37 insertions(+), 4 deletions(-)
diff --git
a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/NoticeConfigServiceImpl.java
b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/NoticeConfigServiceImpl.java
index 2a16f39ab3..bfbed03191 100644
---
a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/NoticeConfigServiceImpl.java
+++
b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/NoticeConfigServiceImpl.java
@@ -185,13 +185,18 @@ public class NoticeConfigServiceImpl implements
NoticeConfigService, CommandLine
* The rest api returns receivers with masked secret fields, so a receiver
submitted
* from the ui may carry the mask placeholder instead of the real secret.
* Restore such fields from the stored entity before using the receiver.
+ * @throws IllegalArgumentException if the receiver carries an id but no
stored receiver
+ * exists for it: without the stored
entity the mask cannot
+ * be resolved, and saving would persist
the placeholder
*/
private void resolveMaskedSecrets(NoticeReceiver noticeReceiver) {
if (noticeReceiver == null || noticeReceiver.getId() == null) {
return;
}
- noticeReceiverDao.findById(noticeReceiver.getId())
- .ifPresent(existing ->
NoticeReceiverMaskUtil.resolveMask(noticeReceiver, existing));
+ NoticeReceiver existing =
noticeReceiverDao.findById(noticeReceiver.getId())
+ .orElseThrow(() -> new IllegalArgumentException(
+ "The receiver with id " + noticeReceiver.getId() + "
does not exist."));
+ NoticeReceiverMaskUtil.resolveMask(noticeReceiver, existing);
}
@Override
diff --git
a/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/NoticeConfigServiceTest.java
b/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/NoticeConfigServiceTest.java
index 9b2780ba1e..72f21bc3c8 100644
---
a/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/NoticeConfigServiceTest.java
+++
b/hertzbeat-alerter/src/test/java/org/apache/hertzbeat/alert/service/NoticeConfigServiceTest.java
@@ -52,10 +52,12 @@ import java.util.Map;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -213,7 +215,9 @@ class NoticeConfigServiceTest {
@Test
void editReceiver() {
- final NoticeReceiver noticeReceiver = mock(NoticeReceiver.class);
+ final NoticeReceiver noticeReceiver = new NoticeReceiver();
+ noticeReceiver.setId(5L);
+
when(noticeReceiverDao.findById(5L)).thenReturn(Optional.of(noticeReceiver));
noticeConfigService.editReceiver(noticeReceiver);
verify(noticeReceiverDao, times(1)).save(noticeReceiver);
}
@@ -235,6 +239,18 @@ class NoticeConfigServiceTest {
verify(noticeReceiverDao, times(1)).save(incoming);
}
+ @Test
+ void editReceiverRejectsUnknownId() {
+ when(noticeReceiverDao.findById(5L)).thenReturn(Optional.empty());
+
+ final NoticeReceiver incoming = new NoticeReceiver();
+ incoming.setId(5L);
+ incoming.setTgBotToken(NoticeReceiverMaskUtil.SECRET_MASK + "voJM");
+
+ assertThrows(IllegalArgumentException.class, () ->
noticeConfigService.editReceiver(incoming));
+ verify(noticeReceiverDao, never()).save(any());
+ }
+
@Test
void sendTestMsgResolvesMaskedSecret() {
final NoticeReceiver stored = new NoticeReceiver();
@@ -251,6 +267,18 @@ class NoticeConfigServiceTest {
assertEquals("1499012345:AAEOB_wEYS-DZyPM3h5NzI8voJM",
incoming.getTgBotToken());
}
+ @Test
+ void sendTestMsgRejectsUnknownId() {
+ when(noticeReceiverDao.findById(5L)).thenReturn(Optional.empty());
+
+ final NoticeReceiver incoming = new NoticeReceiver();
+ incoming.setId(5L);
+ incoming.setTgBotToken(NoticeReceiverMaskUtil.SECRET_MASK + "voJM");
+
+ assertThrows(IllegalArgumentException.class, () ->
noticeConfigService.sendTestMsg(incoming));
+ verify(dispatcherAlarm, never()).sendNoticeMsg(any(), any(), any());
+ }
+
@Test
void deleteReceiver() {
final Long receiverId = 23342525L;
@@ -323,7 +351,7 @@ class NoticeConfigServiceTest {
@Test
void sendTestMsg() {
- final NoticeReceiver noticeReceiver = mock(NoticeReceiver.class);
+ final NoticeReceiver noticeReceiver = new NoticeReceiver();
final NoticeTemplate noticeTemplate = null;
noticeConfigService.sendTestMsg(noticeReceiver);
verify(dispatcherAlarm, times(1)).sendNoticeMsg(eq(noticeReceiver),
eq(noticeTemplate), any(GroupAlert.class));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]