From 9ad099774a989f0cf4a2b19494346b91f9c92a5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Apr 2026 15:54:00 +0000 Subject: [PATCH] refactor: simplify browser dialer UUID path validation Agent-Logs-Url: https://github.com/XTLS/Xray-core/sessions/9288cc3c-d788-49d9-8bdc-f03281c238bf Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com> --- transport/internet/browser_dialer/dialer.go | 30 +++------------------ 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/transport/internet/browser_dialer/dialer.go b/transport/internet/browser_dialer/dialer.go index 960c9470..5dd530f2 100644 --- a/transport/internet/browser_dialer/dialer.go +++ b/transport/internet/browser_dialer/dialer.go @@ -11,6 +11,7 @@ import ( "net/http" "net/url" pathlib "path" + "regexp" "strings" "sync" "time" @@ -35,7 +36,8 @@ var dialerServers map[string]*dialerServer var mu sync.RWMutex const browserDialerSubprotocol = "browser-dialer" -const uuidPathLength = 37 + +var uuidPathPattern = regexp.MustCompile(`^/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$`) var upgrader = &websocket.Upgrader{ ReadBufferSize: 0, @@ -97,7 +99,7 @@ func parseBrowserDialerAddress(addr string) (*browserDialerAddress, bool) { if cleanPath == "." || cleanPath == "/" || cleanPath != path { return nil, false } - if !isUUIDPath(cleanPath) { + if !uuidPathPattern.MatchString(cleanPath) { return nil, false } @@ -107,30 +109,6 @@ func parseBrowserDialerAddress(addr string) (*browserDialerAddress, bool) { }, true } -func isUUIDPath(path string) bool { - if len(path) != uuidPathLength || path[0] != '/' || strings.Count(path, "/") != 1 { - return false - } - - u := path[1:] - for i := 0; i < len(u); i++ { - c := u[i] - switch i { - case 8, 13, 18, 23: - if c != '-' { - return false - } - default: - isHex := (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') - if !isHex { - return false - } - } - } - - return true -} - func newDialerInstance(path string) *dialerInstance { page := bytes.ReplaceAll(webpage, []byte("dialerPath"), []byte(strings.TrimPrefix(path, "/"))) dialer := &dialerInstance{