package executor import ( "crypto/rand" "encoding/hex" "regexp" "strings" "github.com/google/uuid" ) // userIDPattern matches Claude Code format: user_[64-hex]_account__session_[uuid-v4] var userIDPattern = regexp.MustCompile(`^user_[a-fA-F0-9]{64}_account__session_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`) // generateFakeUserID generates a fake user ID in Claude Code format. // Format: user_[64-hex-chars]_account__session_[UUID-v4] func generateFakeUserID() string { hexBytes := make([]byte, 32) _, _ = rand.Read(hexBytes) hexPart := hex.EncodeToString(hexBytes) uuidPart := uuid.New().String() return "user_" + hexPart + "_account__session_" + uuidPart } // isValidUserID checks if a user ID matches Claude Code format. func isValidUserID(userID string) bool { return userIDPattern.MatchString(userID) } // shouldCloak determines if request should be cloaked based on config and client User-Agent. // Returns true if cloaking should be applied. func shouldCloak(cloakMode string, userAgent string) bool { switch strings.ToLower(cloakMode) { case "always": return true case "never": return false default: // "auto" or empty // If client is Claude Code, don't cloak return !strings.HasPrefix(userAgent, "claude-cli") } } // isClaudeCodeClient checks if the User-Agent indicates a Claude Code client. func isClaudeCodeClient(userAgent string) bool { return strings.HasPrefix(userAgent, "claude-cli") }