diff --git a/hertzbeat-common/pom.xml b/hertzbeat-common/pom.xml index bfa3faa7c28..ba256508783 100644 --- a/hertzbeat-common/pom.xml +++ b/hertzbeat-common/pom.xml @@ -135,12 +135,20 @@ ${poi.version} compile + org.apache.poi poi-ooxml ${poi.version} compile + + + + cn.hutool + hutool-all + ${hutool-all.version} + diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java index 37aaf0703c6..178f9902024 100644 --- a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java +++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java @@ -33,6 +33,9 @@ private CacheFactory() {} private static final CommonCacheService ALERT_CONVERGE_CACHE = new CaffeineCacheServiceImpl<>(10, 1000, Duration.ofDays(1), false); + + private static final CommonCacheService DESENSITIZATION_MAP_CACHE = + new CaffeineCacheServiceImpl<>(10, 1000, Duration.ofDays(1), false); /** * get notice cache @@ -57,4 +60,10 @@ public static CommonCacheService getAlertSilenceCache() { public static CommonCacheService getAlertConvergeCache() { return ALERT_CONVERGE_CACHE; } + + /** + * get desensitizationMap cache + * @return desensitizationMap cache + */ + public static CommonCacheService getDesensitizationMapCache(){return DESENSITIZATION_MAP_CACHE;}; } diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/dto/vo/NoticeReceiverVO.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/dto/vo/NoticeReceiverVO.java new file mode 100644 index 00000000000..6da5be0ffd9 --- /dev/null +++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/dto/vo/NoticeReceiverVO.java @@ -0,0 +1,242 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hertzbeat.common.entity.dto.vo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.persistence.Column; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.hertzbeat.common.serialize.EmailDesensitizationSerializer; +import org.apache.hertzbeat.common.serialize.PhoneDesensitizationSerializer; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; + +import java.time.LocalDateTime; + +import static io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_ONLY; +import static io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_WRITE; + +/** + * 2024-12-06 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class NoticeReceiverVO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Schema(title = "Recipient entity primary key index ID", description = "Recipient entity primary key index ID", + example = "87584674384", accessMode = READ_ONLY) + private Long id; + + @Schema(title = "Recipient name", description = "Recipient name", + example = "tom", accessMode = READ_WRITE) + @Size(max = 100) + @NotBlank(message = "name can not null") + private String name; + + @Schema(title = "Notification information method: 0-SMS 1-Email 2-webhook 3-WeChat Official Account 4-Enterprise WeChat Robot " + + "5-DingTalk Robot 6-FeiShu Robot 7-Telegram Bot 8-SlackWebHook 9-Discord Bot 10-Enterprise WeChat app message", + description = "Notification information method: " + + "0-SMS 1-Email 2-webhook 3-WeChat Official Account " + + "4-Enterprise WeChat Robot 5-DingTalk Robot 6-FeiShu Robot " + + "7-Telegram Bot 8-SlackWebHook 9-Discord Bot 10-Enterprise " + + "WeChat app message", + accessMode = READ_WRITE) + @Min(0) + @NotNull(message = "type can not null") + private Byte type; + + @Schema(title = "Mobile number: Valid when the notification method is SMS", + description = "Mobile number: Valid when the notification method is SMS", + example = "18923435643", accessMode = READ_WRITE) + @Size(max = 100) + @JsonSerialize(using = PhoneDesensitizationSerializer.class) + private String phone; + + @Schema(title = "Email account: Valid when the notification method is email", + description = "Email account: Valid when the notification method is email", + example = "tom@qq.com", accessMode = READ_WRITE) + @Size(max = 100) + @JsonSerialize(using = EmailDesensitizationSerializer.class) + private String email; + + @Schema(title = "URL address: The notification method is valid for webhook", + description = "URL address: The notification method is valid for webhook", + example = "https://www.tancloud.cn", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String hookUrl; + + @Schema(title = "openId : The notification method is valid for WeChat official account, enterprise WeChat robot or FlyBook robot", + description = "openId : The notification method is valid for WeChat official account, enterprise WeChat robot or FlyBook robot", + example = "343432", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String wechatId; + + @Schema(title = "Access token : The notification method is valid for DingTalk robot", + description = "Access token : The notification method is valid for DingTalk robot", + example = "34823984635647", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String accessToken; + + @Schema(title = "Telegram bot token : The notification method is valid for Telegram Bot", + description = "Telegram bot token : The notification method is valid for Telegram Bot", + example = "1499012345:AAEOB_wEYS-DZyPM3h5NzI8voJMXXXXXX", accessMode = READ_WRITE) + private String tgBotToken; + + @Schema(title = "Telegram user id: The notification method is valid for Telegram Bot", + description = "Telegram user id: The notification method is valid for Telegram Bot", + example = "779294123", accessMode = READ_WRITE) + private String tgUserId; + + @Schema(title = "DingTalk,FeiShu,WeWork user id: The notification method is valid for DingTalk,FeiShu,WeWork Bot", + description = "DingTalk,FeiShu,WeWork user id: The notification method is valid for DingTalk,FeiShu,WeWork Bot", + example = "779294123", accessMode = READ_WRITE) + private String userId; + + @Schema(title = "URL address: The notification method is valid for Slack", + description = "URL address: The notification method is valid for Slack", + example = "https://hooks.slack.com/services/XXXX/XXXX/XXXX", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String slackWebHookUrl; + + @Schema(title = "Enterprise weChat message: The notification method is valid for Enterprise WeChat app message", + description = "Enterprise weChat message: The notification method is valid for Enterprise WeChat app message", + example = "ww1a603432123d0dc1", accessMode = READ_WRITE) + private String corpId; + + @Schema(title = "Enterprise weChat appId: The notification method is valid for Enterprise WeChat app message", + description = "Enterprise weChat appId: The notification method is valid for Enterprise WeChat app message", + example = "1000001", accessMode = READ_WRITE) + private Integer agentId; + + @Schema(title = "Enterprise weChat secret: The notification method is valid for Enterprise WeChat app message", + description = "Enterprise weChat secret: The notification method is valid for Enterprise WeChat app message", + example = "oUydwn92ey0lnuY02MixNa57eNK-20dJn5NEOG-u2uE", accessMode = READ_WRITE) + private String appSecret; + + @Schema(title = "Enterprise weChat party id: The notification method is valid for Enterprise WeChat app message", + description = "Enterprise weChat party id: The notification method is valid for Enterprise WeChat app message", + example = "779294123", accessMode = READ_WRITE) + private String partyId; + + @Schema(title = "Enterprise weChat tag id: The notification method is valid for Enterprise WeChat app message", + description = "Enterprise weChat tag id: The notification method is valid for Enterprise WeChat app message", + example = "779294123", accessMode = READ_WRITE) + private String tagId; + + @Schema(title = "Discord channel id: The notification method is valid for Discord", + description = "Discord channel id: The notification method is valid for Discord", + example = "1065303416030642266", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String discordChannelId; + + @Schema(title = "Discord bot token: The notification method is valid for Discord", + description = "Discord bot token: The notification method is valid for Discord", + example = "MTA2NTMwMzU0ODY4Mzg4MjUzNw.xxxxx.xxxxxxx", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String discordBotToken; + + @Schema(title = "huawei cloud SMN ak: If the notification method is valid for huawei cloud SMN", + description = "huawei cloud SMN ak: If the notification method is valid for huawei cloud SMN", + example = "NCVBODJOEYHSW3VNXXXX", accessMode = READ_WRITE) + @Size(max = 22) + @Column(length = 22) + private String smnAk; + + @Schema(title = "huawei cloud SMN sk: If the notification method is valid for huawei cloud SMN", + description = "huawei cloud SMN sk: If the notification method is valid for huawei cloud SMN", + example = "nmSNhUJN9MlpPl8lfCsgdA0KvHCL9JXXXX", accessMode = READ_WRITE) + @Size(max = 42) + @Column(length = 42) + private String smnSk; + + @Schema(title = "huawei cloud SMN projectId: If the notification method is valid for huawei cloud SMN", + description = "huawei cloud SMN projectId: If the notification method is valid for huawei cloud SMN", + example = "320c2fb11edb47a481c299c1XXXXXX", accessMode = READ_WRITE) + @Size(max = 32) + @Column(length = 32) + private String smnProjectId; + + @Schema(title = "huawei cloud SMN region: If the notification method is valid for huawei cloud SMN", + description = "huawei cloud SMN region: If the notification method is valid for huawei cloud SMN", + example = "cn-east-3", accessMode = READ_WRITE) + @Size(max = 32) + @Column(length = 32) + private String smnRegion; + + @Schema(title = "huawei cloud SMN TopicUrn: If the notification method is valid for huawei cloud SMN", + description = "huawei cloud SMN TopicUrn: If the notification method is valid for huawei cloud SMN", + example = "urn:smn:cn-east-3:xxx:hertzbeat_test", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String smnTopicUrn; + + @Schema(title = "serverChanToken : The notification method is valid for ServerChan", + description = "serverChanToken : The notification method is valid for ServerChan", + example = "SCT193569TSNm6xIabdjqeZPtOGOWcvU1e", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String serverChanToken; + + @Schema(title = "Gotify token : The notification method is valid for Gotify", + description = "Gotify token : The notification method is valid for Gotify", + example = "A845h__ZMqDxZlO", accessMode = READ_WRITE) + @Size(max = 300) + @Column(length = 300) + private String gotifyToken; + + @Schema(title = "The creator of this record", example = "tom", + accessMode = READ_ONLY) + @CreatedBy + private String creator; + + @Schema(title = "This record was last modified by", example = "tom", accessMode = READ_ONLY) + @LastModifiedBy + private String modifier; + + @Schema(title = "Record creation time (millisecond timestamp)", + example = "1612198922000", accessMode = READ_ONLY) + @CreatedDate + private LocalDateTime gmtCreate; + + @Schema(title = "Record the latest modification time (timestamp in milliseconds)", + example = "1612198444000", accessMode = READ_ONLY) + @LastModifiedDate + private LocalDateTime gmtUpdate; +} diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializer.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializer.java new file mode 100644 index 00000000000..0f895f403a7 --- /dev/null +++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializer.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hertzbeat.common.serialize; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.apache.hertzbeat.common.cache.CacheFactory; +import org.apache.hertzbeat.common.cache.CommonCacheService; +import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO; + +import java.io.IOException; + +/** + * 2024-12-06 + * Email Desensitizing serializer + */ +public class EmailDesensitizationSerializer extends JsonSerializer { + + @Override + public void serialize(String email, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + String emailDesensitization = ""; + CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); + if (StrUtil.isNotBlank(email)) { + int index = StrUtil.indexOf(email, '@'); + emailDesensitization = index <= 1 ? email : + StrUtil.replace(email, 1, index, '*'); + NoticeReceiverVO currentValue = (NoticeReceiverVO) jsonGenerator.getOutputContext().getCurrentValue(); + desensitizationMapCache.put(currentValue.getId() + "_" + emailDesensitization, email); + } + jsonGenerator.writeString(emailDesensitization); + } +} \ No newline at end of file diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializer.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializer.java new file mode 100644 index 00000000000..a71ec44b1b9 --- /dev/null +++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializer.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hertzbeat.common.serialize; + +import cn.hutool.core.util.DesensitizedUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.apache.hertzbeat.common.cache.CacheFactory; +import org.apache.hertzbeat.common.cache.CommonCacheService; +import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO; + +import java.io.IOException; + +/** + * 2024-12-06 + * Phone Desensitizing serializer + */ +public class PhoneDesensitizationSerializer extends JsonSerializer { + + @Override + public void serialize(String phone, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + String phoneDesensitization = ""; + CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); + if (StrUtil.isNotBlank(phone)){ + phoneDesensitization = DesensitizedUtil.mobilePhone(phone); + NoticeReceiverVO currentValue = (NoticeReceiverVO)jsonGenerator.getOutputContext().getCurrentValue(); + desensitizationMapCache.put(currentValue.getId()+"_"+phoneDesensitization, phone); + } + + jsonGenerator.writeString(phoneDesensitization); + } +} \ No newline at end of file diff --git a/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializerTest.java b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializerTest.java new file mode 100644 index 00000000000..2992af12c55 --- /dev/null +++ b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializerTest.java @@ -0,0 +1,42 @@ +package org.apache.hertzbeat.common.serialize; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.apache.hertzbeat.common.cache.CacheFactory; +import org.apache.hertzbeat.common.cache.CommonCacheService; +import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class EmailDesensitizationSerializerTest { + + private EmailDesensitizationSerializer emailDesensitizationSerializer; + + @BeforeEach + void setUp() { + emailDesensitizationSerializer = new EmailDesensitizationSerializer(); + } + + @Test + public void test() throws JsonProcessingException { + NoticeReceiverVO noticeReceiver = new NoticeReceiverVO(); + noticeReceiver.setId(1L); + noticeReceiver.setEmail("12345@163.com"); + + ObjectMapper objectMapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(String.class,emailDesensitizationSerializer); + + objectMapper.registerModule(simpleModule); + + String jsonString = objectMapper.writeValueAsString(noticeReceiver); + NoticeReceiverVO noticeReceiverVO = objectMapper.readValue(jsonString, NoticeReceiverVO.class); + + CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); + + assertEquals(noticeReceiver.getEmail(),desensitizationMapCache.get(noticeReceiverVO.getId()+"_"+noticeReceiverVO.getEmail())); + } +} \ No newline at end of file diff --git a/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializerTest.java b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializerTest.java new file mode 100644 index 00000000000..cdf0899d263 --- /dev/null +++ b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializerTest.java @@ -0,0 +1,42 @@ +package org.apache.hertzbeat.common.serialize; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.apache.hertzbeat.common.cache.CacheFactory; +import org.apache.hertzbeat.common.cache.CommonCacheService; +import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PhoneDesensitizationSerializerTest { + + private PhoneDesensitizationSerializer phoneDesensitizationSerializer; + + @BeforeEach + void setUp() { + phoneDesensitizationSerializer = new PhoneDesensitizationSerializer(); + } + + @Test + public void test() throws JsonProcessingException { + NoticeReceiverVO noticeReceiver = new NoticeReceiverVO(); + noticeReceiver.setId(1L); + noticeReceiver.setPhone("12345678910"); + + ObjectMapper objectMapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(String.class,phoneDesensitizationSerializer); + + objectMapper.registerModule(simpleModule); + + String jsonString = objectMapper.writeValueAsString(noticeReceiver); + NoticeReceiverVO noticeReceiverVO = objectMapper.readValue(jsonString, NoticeReceiverVO.class); + + CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); + + assertEquals(noticeReceiver.getPhone(),desensitizationMapCache.get(noticeReceiverVO.getId()+"_"+noticeReceiverVO.getPhone())); + } +} \ No newline at end of file diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java index 241bddaa070..cb8b1fe0c0f 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java @@ -19,6 +19,8 @@ import static org.apache.hertzbeat.common.constants.CommonConstants.FAIL_CODE; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +import cn.hutool.core.bean.BeanUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,6 +28,7 @@ import java.util.Optional; import javax.validation.Valid; import org.apache.hertzbeat.common.entity.dto.Message; +import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO; import org.apache.hertzbeat.common.entity.manager.NoticeReceiver; import org.apache.hertzbeat.common.entity.manager.NoticeRule; import org.apache.hertzbeat.common.entity.manager.NoticeTemplate; @@ -82,9 +85,9 @@ public ResponseEntity> deleteNoticeReceiver( @GetMapping(path = "/receivers") @Operation(summary = "Get a list of message notification recipients based on query filter items", description = "Get a list of message notification recipients based on query filter items") - public ResponseEntity>> getReceivers( + public ResponseEntity>> getReceivers( @Parameter(description = "en: Recipient name,support fuzzy query", example = "tom") @RequestParam(required = false) final String name) { - return ResponseEntity.ok(Message.success(noticeConfigService.getNoticeReceivers(name))); + return ResponseEntity.ok(Message.success(BeanUtil.copyToList(noticeConfigService.getNoticeReceivers(name), NoticeReceiverVO.class))); } @PostMapping(path = "/rule") diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java index b4dd9b5c01d..a33c1fa44c0 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java @@ -17,6 +17,7 @@ package org.apache.hertzbeat.manager.service.impl; +import cn.hutool.core.util.ObjectUtil; import jakarta.persistence.criteria.Predicate; import java.io.IOException; import java.io.InputStream; @@ -132,6 +133,14 @@ public void addReceiver(NoticeReceiver noticeReceiver) { @Override public void editReceiver(NoticeReceiver noticeReceiver) { + CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); + if (ObjectUtil.isNotEmpty(noticeReceiver.getEmail()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail()))){ + noticeReceiver.setEmail((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail())); + } + if (ObjectUtil.isNotEmpty(noticeReceiver.getPhone()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone()))){ + noticeReceiver.setPhone((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone())); + } + noticeReceiverDao.save(noticeReceiver); } @@ -267,6 +276,16 @@ public NoticeTemplate getDefaultNoticeTemplateByType(Byte type) { @Override public boolean sendTestMsg(NoticeReceiver noticeReceiver) { + if (null != noticeReceiver.getId()){ + CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); + if (ObjectUtil.isNotEmpty(noticeReceiver.getEmail()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail()))){ + noticeReceiver.setEmail((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail())); + } + if (ObjectUtil.isNotEmpty(noticeReceiver.getPhone()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone()))){ + noticeReceiver.setPhone((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone())); + } + } + Map tags = new HashMap<>(8); tags.put(CommonConstants.TAG_MONITOR_ID, "100"); tags.put(CommonConstants.TAG_MONITOR_NAME, "100Name"); diff --git a/pom.xml b/pom.xml index 05974f113fa..cb6242bb543 100644 --- a/pom.xml +++ b/pom.xml @@ -163,6 +163,7 @@ 3.1.37 3.23.5 3.8.0 + 5.8.20 0.13.3 2.23 @@ -474,6 +475,13 @@ spring-boot-starter-test test + + + + cn.hutool + hutool-all + ${hutool-all.version} +