Files

51 lines
1.7 KiB
C#

using System.Security.Cryptography;
using System.Text;
namespace WxAgent.Core;
public sealed record UiNodeSnapshot(
string ControlType,
string Name,
string AutomationId,
bool IsEnabled,
string Bounds,
IReadOnlyList<UiNodeSnapshot> Children);
public static class UiSnapshotSanitizer
{
private static readonly HashSet<string> SafeAutomationIds = new(StringComparer.Ordinal)
{
"MainView",
"MainView.main_tabbar",
"MainView.main_tabbar.tabbar_setting",
"session_list",
"chat_message_page",
"chat_message_list",
"chat_message_list.qt_scrollarea_viewport.chat_bubble_item_view",
"chat_input_field",
"chat_input_field.qt_scrollarea_viewport",
"tool_bar_accessible"
};
private static readonly HashSet<string> SafeSearchLabels = new(StringComparer.Ordinal)
{
"联系人", "群聊", "功能", "聊天记录", "网络搜索", "搜一搜", "返回",
"更多联系人", "更多群聊", "查看更多联系人", "查看更多群聊", "查看全部", "显示全部"
};
public static string SanitizeName(string? value) => Sanitize(value, SafeSearchLabels, "text");
public static string SanitizeAutomationId(string? value) => Sanitize(value, SafeAutomationIds, "id");
private static string Sanitize(string? value, HashSet<string> allowList, string label)
{
if (string.IsNullOrEmpty(value) || allowList.Contains(value))
{
return value ?? string.Empty;
}
var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(value));
return $"[{label}:{value.Length}:{Convert.ToHexString(bytes.AsSpan(0, 4)).ToLowerInvariant()}]";
}
}