From 8e1bcf53bbf7ecf325d67778ed9320d42289b4dd Mon Sep 17 00:00:00 2001 From: litianc <719153161@qq.com> Date: Wed, 4 Mar 2026 23:13:17 +0800 Subject: [PATCH] fix: extend RewriteUserID regex to match user_id containing account_uuid The existing regex only matched the old format where account_uuid is empty (account__session_). Real Claude Code clients and newer sub2api generated user_ids use account_{uuid}_session_ which was silently skipped, causing the original metadata.user_id to leak to upstream when User-Agent is rewritten by an intermediate gateway. Closes #766 Co-Authored-By: Claude Opus 4.6 --- backend/internal/service/identity_service.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/backend/internal/service/identity_service.go b/backend/internal/service/identity_service.go index f3130c91..f6a94d15 100644 --- a/backend/internal/service/identity_service.go +++ b/backend/internal/service/identity_service.go @@ -19,8 +19,10 @@ import ( // 预编译正则表达式(避免每次调用重新编译) var ( - // 匹配 user_id 格式: user_{64位hex}_account__session_{uuid} - userIDRegex = regexp.MustCompile(`^user_[a-f0-9]{64}_account__session_([a-f0-9-]{36})$`) + // 匹配 user_id 格式: + // 旧格式: user_{64位hex}_account__session_{uuid} (account 后无 UUID) + // 新格式: user_{64位hex}_account_{uuid}_session_{uuid} (account 后有 UUID) + userIDRegex = regexp.MustCompile(`^user_[a-f0-9]{64}_account_([a-f0-9-]*)_session_([a-f0-9-]{36})$`) // 匹配 User-Agent 版本号: xxx/x.y.z userAgentVersionRegex = regexp.MustCompile(`/(\d+)\.(\d+)\.(\d+)`) ) @@ -239,13 +241,16 @@ func (s *IdentityService) RewriteUserID(body []byte, accountID int64, accountUUI return body, nil } - // 匹配格式: user_{64位hex}_account__session_{uuid} + // 匹配格式: + // 旧格式: user_{64位hex}_account__session_{uuid} + // 新格式: user_{64位hex}_account_{uuid}_session_{uuid} matches := userIDRegex.FindStringSubmatch(userID) if matches == nil { return body, nil } - sessionTail := matches[1] // 原始session UUID + // matches[1] = account UUID (可能为空), matches[2] = session UUID + sessionTail := matches[2] // 原始session UUID // 生成新的session hash: SHA256(accountID::sessionTail) -> UUID格式 seed := fmt.Sprintf("%d::%s", accountID, sessionTail)