浏览代码

fix(outbound): preserve non-ASCII characters in imported subscription tags (#5354)

SlugRemark stripped every non-ASCII character, so tags generated from
remarks like Cyrillic names collapsed to just their digits, making
imported outbounds hard to identify. Keep Unicode letters and digits in
the slug regex while still collapsing punctuation into dashes.
MHSanaei 9 小时之前
父节点
当前提交
f7ffe89813
共有 2 个文件被更改,包括 11 次插入2 次删除
  1. 4 2
      internal/util/link/outbound.go
  2. 7 0
      internal/util/link/outbound_test.go

+ 4 - 2
internal/util/link/outbound.go

@@ -781,8 +781,10 @@ func base64DecodeFlexible(s string) (string, error) {
 	return "", fmt.Errorf("base64 decode failed")
 }
 
-// SlugRemark turns a free-form remark into a conservative DNS-ish tag segment.
-var slugRe = regexp.MustCompile(`[^a-z0-9]+`)
+// SlugRemark turns a free-form remark into a tag segment, keeping Unicode
+// letters and digits (so non-ASCII remarks like Cyrillic stay readable) and
+// replacing every other run of characters with a single dash.
+var slugRe = regexp.MustCompile(`[^\p{L}\p{N}]+`)
 
 func SlugRemark(remark string) string {
 	s := strings.ToLower(strings.TrimSpace(remark))

+ 7 - 0
internal/util/link/outbound_test.go

@@ -59,4 +59,11 @@ func TestSlugAndSuggest(t *testing.T) {
 	if tag != "hk-sg-01" {
 		t.Errorf("suggest tag got %q", tag)
 	}
+	// Non-ASCII letters/digits are preserved rather than stripped.
+	if got := SlugRemark("Москва 🇷🇺 01"); got != "москва-01" {
+		t.Errorf("unicode slug got %q", got)
+	}
+	if got := SuggestTag("ru-", "Сервер 2", 0); got != "ru-сервер-2" {
+		t.Errorf("unicode suggest tag got %q", got)
+	}
 }