-
Notifications
You must be signed in to change notification settings - Fork 0
[feature] Desensitize sensitive information(new) #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
c9adee8
ab96101
578337c
d2a8725
5b34623
8ade3d3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -33,6 +33,9 @@ private CacheFactory() {} | |||||||||||||||||||
|
||||||||||||||||||||
private static final CommonCacheService<String, Object> ALERT_CONVERGE_CACHE = | ||||||||||||||||||||
new CaffeineCacheServiceImpl<>(10, 1000, Duration.ofDays(1), false); | ||||||||||||||||||||
|
||||||||||||||||||||
private static final CommonCacheService<String, Object> DESENSITIZATION_MAP_CACHE = | ||||||||||||||||||||
new CaffeineCacheServiceImpl<>(10, 1000, Duration.ofDays(1), false); | ||||||||||||||||||||
|
||||||||||||||||||||
/** | ||||||||||||||||||||
* get notice cache | ||||||||||||||||||||
|
@@ -57,4 +60,10 @@ public static CommonCacheService<String, Object> getAlertSilenceCache() { | |||||||||||||||||||
public static CommonCacheService<String, Object> getAlertConvergeCache() { | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sensitive Data Exposure through Unprotected CacheThe implementation stores original sensitive data (emails and phone numbers) in a cache that lacks access controls. While the data is desensitized in API responses, there's no mechanism to ensure that only authorized code can retrieve the original values from the cache. The cache has a long expiration time (1 day) and doesn't implement any authentication or authorization checks for data access.
Suggested change
Rationale
References
|
||||||||||||||||||||
return ALERT_CONVERGE_CACHE; | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
/** | ||||||||||||||||||||
* get desensitizationMap cache | ||||||||||||||||||||
* @return desensitizationMap cache | ||||||||||||||||||||
*/ | ||||||||||||||||||||
public static CommonCacheService<String, Object> getDesensitizationMapCache(){return DESENSITIZATION_MAP_CACHE;}; | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
import jakarta.persistence.GeneratedValue; | ||
import jakarta.persistence.GenerationType; | ||
import jakarta.persistence.Id; | ||
Comment on lines
+22
to
+25
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Comment on lines
+22
to
+25
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove JPA entity annotations from VO class. A VO (Value Object/View Object) should not contain JPA entity annotations like -import jakarta.persistence.Column;
-import jakarta.persistence.GeneratedValue;
-import jakarta.persistence.GenerationType;
-import jakarta.persistence.Id;
-@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;
-@Column(length = 300)
private String hookUrl; Apply this pattern to remove all Also applies to: 55-56, 97-98 🤖 Prompt for AI Agents
|
||
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; | ||
Comment on lines
+36
to
+39
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove Spring Data auditing annotations from VO class. Spring Data auditing annotations ( -import org.springframework.data.annotation.CreatedBy;
-import org.springframework.data.annotation.CreatedDate;
-import org.springframework.data.annotation.LastModifiedBy;
-import org.springframework.data.annotation.LastModifiedDate;
@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; Also applies to: 226-241 🤖 Prompt for AI Agents
|
||
|
||
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 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider the class design and naming convention. The class appears to be a direct copy of an entity class with serializers added. Consider whether this is truly a VO/DTO or if you should:
🤖 Prompt for AI Agents
|
||
|
||
@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 = "[email protected]", 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; | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -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<String> { | ||||||||||||||||
|
||||||||||||||||
@Override | ||||||||||||||||
public void serialize(String email, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { | ||||||||||||||||
String emailDesensitization = ""; | ||||||||||||||||
CommonCacheService<String, Object> desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); | ||||||||||||||||
if (StrUtil.isNotBlank(email)) { | ||||||||||||||||
int index = StrUtil.indexOf(email, '@'); | ||||||||||||||||
emailDesensitization = index <= 1 ? email : | ||||||||||||||||
StrUtil.replace(email, 1, index, '*'); | ||||||||||||||||
Comment on lines
+41
to
+43
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Improve email desensitization logic and use Hutool's built-in method. The current email desensitization logic has several issues:
-int index = StrUtil.indexOf(email, '@');
-emailDesensitization = index <= 1 ? email :
- StrUtil.replace(email, 1, index, '*');
+emailDesensitization = DesensitizedUtil.email(email); 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||
NoticeReceiverVO currentValue = (NoticeReceiverVO) jsonGenerator.getOutputContext().getCurrentValue(); | ||||||||||||||||
desensitizationMapCache.put(currentValue.getId() + "_" + emailDesensitization, email); | ||||||||||||||||
} | ||||||||||||||||
jsonGenerator.writeString(emailDesensitization); | ||||||||||||||||
} | ||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -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<String> { | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||
public void serialize(String phone, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { | ||||||||||||||||||||||||||||||||||||
String phoneDesensitization = ""; | ||||||||||||||||||||||||||||||||||||
CommonCacheService<String, Object> desensitizationMapCache = CacheFactory.getDesensitizationMapCache(); | ||||||||||||||||||||||||||||||||||||
if (StrUtil.isNotBlank(phone)){ | ||||||||||||||||||||||||||||||||||||
phoneDesensitization = DesensitizedUtil.mobilePhone(phone); | ||||||||||||||||||||||||||||||||||||
NoticeReceiverVO currentValue = (NoticeReceiverVO)jsonGenerator.getOutputContext().getCurrentValue(); | ||||||||||||||||||||||||||||||||||||
desensitizationMapCache.put(currentValue.getId()+"_"+phoneDesensitization, phone); | ||||||||||||||||||||||||||||||||||||
Comment on lines
+43
to
+44
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add null safety checks and improve reusability. The code has several issues:
-NoticeReceiverVO currentValue = (NoticeReceiverVO)jsonGenerator.getOutputContext().getCurrentValue();
-desensitizationMapCache.put(currentValue.getId()+"_"+phoneDesensitization, phone);
+Object currentObj = jsonGenerator.getOutputContext().getCurrentValue();
+if (currentObj instanceof NoticeReceiverVO) {
+ NoticeReceiverVO currentValue = (NoticeReceiverVO) currentObj;
+ if (currentValue.getId() != null) {
+ try {
+ desensitizationMapCache.put(currentValue.getId() + "_" + phoneDesensitization, phone);
+ } catch (Exception e) {
+ // Log error but don't fail serialization
+ // Consider using a logger here
+ }
+ }
+} 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
jsonGenerator.writeString(phoneDesensitization); | ||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using specific
hutool
modules instead ofhutool-all
to reduce the application size. For the functionality used in this PR (StrUtil
,DesensitizedUtil
),hutool-core
might be sufficient.