[improve] reject masked receiver edit when the stored receiver does not exist (#4225)

This commit is contained in:
Duansg
2026-07-22 01:32:24 +08:00
committed by GitHub
parent a9eb231989
commit 11cd5bb0c7
2 changed files with 37 additions and 4 deletions
@@ -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
@@ -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));