diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/notice/impl/DingTalkRobotAlertNotifyHandlerImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/notice/impl/DingTalkRobotAlertNotifyHandlerImpl.java index 35bca56034c..b4e4b266301 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/notice/impl/DingTalkRobotAlertNotifyHandlerImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/notice/impl/DingTalkRobotAlertNotifyHandlerImpl.java @@ -18,12 +18,17 @@ package org.apache.hertzbeat.alert.notice.impl; import com.fasterxml.jackson.annotation.JsonProperty; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.List; + import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.hertzbeat.alert.notice.AlertNoticeException; +import org.apache.hertzbeat.alert.util.CryptoUtils; import org.apache.hertzbeat.common.entity.alerter.GroupAlert; import org.apache.hertzbeat.common.entity.alerter.NoticeReceiver; import org.apache.hertzbeat.common.entity.alerter.NoticeTemplate; @@ -54,7 +59,13 @@ public void send(NoticeReceiver receiver, NoticeTemplate noticeTemplate, GroupAl HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity httpEntity = new HttpEntity<>(dingTalkWebHookDto, headers); - String webHookUrl = alerterProperties.getDingTalkWebhookUrl() + receiver.getAccessToken(); + StringBuilder webHookUrlBuilder = new StringBuilder() + .append(alerterProperties.getDingTalkWebhookUrl()) + .append(receiver.getAccessToken()); + if (StringUtils.isNotBlank(receiver.getAppSecret())) { + webHookUrlBuilder.append(signSecret(receiver.getAppSecret())); + } + String webHookUrl = webHookUrlBuilder.toString(); ResponseEntity responseEntity = restTemplate.postForEntity(webHookUrl, httpEntity, CommonRobotNotifyResp.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { @@ -102,6 +113,13 @@ private DingTalkWebHookDto checkNeedAtNominator(NoticeReceiver receiver) { return dingTalkWebHookDto; } + private String signSecret(String secret) throws Exception { + Long timestamp = System.currentTimeMillis(); + String sign = URLEncoder.encode(CryptoUtils.hmacSha256Base64(secret, timestamp + "\n" + secret), + StandardCharsets.UTF_8); + return String.format("×tamp=%s&sign=%s", timestamp, sign); + } + @Override public byte type() { return 5; @@ -109,6 +127,7 @@ public byte type() { /** * DingTalk robot request body + * * @version 1.0 */ @Data @@ -187,5 +206,4 @@ private static class AtDTO { } - } diff --git a/web-app/src/app/routes/alert/alert-notice/alert-notice-receiver/alert-notice-receiver.component.html b/web-app/src/app/routes/alert/alert-notice/alert-notice-receiver/alert-notice-receiver.component.html index 908d4db97c8..ab245b5f1e1 100644 --- a/web-app/src/app/routes/alert/alert-notice/alert-notice-receiver/alert-notice-receiver.component.html +++ b/web-app/src/app/routes/alert/alert-notice/alert-notice-receiver/alert-notice-receiver.component.html @@ -295,6 +295,14 @@ /> + + + {{ 'alert.notice.type.ding-secret' | i18n }} + + + + + {{ 'alert.notice.type.phone' | i18n }} diff --git a/web-app/src/assets/i18n/en-US.json b/web-app/src/assets/i18n/en-US.json index 369bda2050a..0948405e123 100644 --- a/web-app/src/assets/i18n/en-US.json +++ b/web-app/src/assets/i18n/en-US.json @@ -196,6 +196,7 @@ "alert.notice.type.WeComApp-userId": "User ID(separated by | symbol)", "alert.notice.type.access-token": "Robot ACCESS_TOKEN", "alert.notice.type.ding": "DingDing Robot", + "alert.notice.type.ding-secret": "Robot Secret", "alert.notice.type.discord": "Discord Bot", "alert.notice.type.discord-bot-token": "Discord Bot Token", "alert.notice.type.discord-channel-id": "Discord Channel ID", diff --git a/web-app/src/assets/i18n/ja-JP.json b/web-app/src/assets/i18n/ja-JP.json index ad5f394da5e..485d539291e 100644 --- a/web-app/src/assets/i18n/ja-JP.json +++ b/web-app/src/assets/i18n/ja-JP.json @@ -196,6 +196,7 @@ "alert.notice.type.WeComApp-userId": "ユーザーID(|記号で区切る)", "alert.notice.type.access-token": "ロボットACCESS_TOKEN", "alert.notice.type.ding": "DingDing ロボット", + "alert.notice.type.ding-secret": "DingTalkロボット秘密鍵", "alert.notice.type.discord": "Discord ボット", "alert.notice.type.discord-bot-token": "Discord ボットトークン", "alert.notice.type.discord-channel-id": "Discord チャンネルID", diff --git a/web-app/src/assets/i18n/pt-BR.json b/web-app/src/assets/i18n/pt-BR.json index d813e1b0b0d..f84f582eda7 100644 --- a/web-app/src/assets/i18n/pt-BR.json +++ b/web-app/src/assets/i18n/pt-BR.json @@ -172,6 +172,7 @@ "alert.notice.type.WeCom-robot-key": "Chave do Robô WeCom", "alert.notice.type.access-token": "Token de Acesso do Robô", "alert.notice.type.ding": "Robô DingDing", + "alert.notice.type.ding-secret": "Chave Secreta do Robô DingDing", "alert.notice.type.fei-shu": "Robô FeiShu", "alert.notice.type.fei-shu-key": "Chave do Robô FeiShu", "alert.notice.type.telegram-bot": "Bot do Telegram", diff --git a/web-app/src/assets/i18n/zh-CN.json b/web-app/src/assets/i18n/zh-CN.json index 6934139a2c0..a1378f0b623 100644 --- a/web-app/src/assets/i18n/zh-CN.json +++ b/web-app/src/assets/i18n/zh-CN.json @@ -196,6 +196,7 @@ "alert.notice.type.WeComApp-userId": "用户id(多个使用|符号分隔)", "alert.notice.type.access-token": "机器人ACCESS_TOKEN", "alert.notice.type.ding": "钉钉机器人", + "alert.notice.type.ding-secret": "钉钉机器人密钥", "alert.notice.type.discord": "Discord机器人", "alert.notice.type.discord-bot-token": "Discord Bot Token", "alert.notice.type.discord-channel-id": "Discord频道ID", diff --git a/web-app/src/assets/i18n/zh-TW.json b/web-app/src/assets/i18n/zh-TW.json index 3159a7b107d..1dad50dc107 100644 --- a/web-app/src/assets/i18n/zh-TW.json +++ b/web-app/src/assets/i18n/zh-TW.json @@ -195,6 +195,7 @@ "alert.notice.type.WeComApp-userId": "使用者id(多個使用|符號分隔)", "alert.notice.type.access-token": "機器人ACCESS_TOKEN", "alert.notice.type.ding": "釘釘機器人", + "alert.notice.type.ding-secret": "釘釘機器人密鑰", "alert.notice.type.discord": "Discord機器人", "alert.notice.type.discord-bot-token": "Discord Bot Token", "alert.notice.type.discord-channel-id": "Discord頻道ID",