From b9897eec7cceea2eab6fe7aa20d9538075f7e611 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 3 Apr 2026 14:35:31 +0530 Subject: [PATCH] fix: align mobile pairing secure endpoint UX (#60128) --- .../ai/openclaw/app/ui/GatewayConfigResolver.kt | 3 +-- .../app/ui/GatewayConfigResolverTest.kt | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayConfigResolver.kt b/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayConfigResolver.kt index 24142f8054b..f3e42e7ad5e 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayConfigResolver.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayConfigResolver.kt @@ -125,10 +125,9 @@ internal fun parseGatewayEndpoint(rawInput: String): GatewayEndpointConfig? { return parseGatewayEndpointResult(rawInput).config } -internal fun parseGatewayEndpointResult(rawInput: String): GatewayEndpointParseResult { + internal fun parseGatewayEndpointResult(rawInput: String): GatewayEndpointParseResult { val raw = rawInput.trim() if (raw.isEmpty()) return GatewayEndpointParseResult(error = GatewayEndpointValidationError.INVALID_URL) - if (raw.contains('%')) return GatewayEndpointParseResult(error = GatewayEndpointValidationError.INVALID_URL) val normalized = if (raw.contains("://")) raw else "https://$raw" val uri = diff --git a/apps/android/app/src/test/java/ai/openclaw/app/ui/GatewayConfigResolverTest.kt b/apps/android/app/src/test/java/ai/openclaw/app/ui/GatewayConfigResolverTest.kt index d35aa4316ec..3fea8261ca4 100644 --- a/apps/android/app/src/test/java/ai/openclaw/app/ui/GatewayConfigResolverTest.kt +++ b/apps/android/app/src/test/java/ai/openclaw/app/ui/GatewayConfigResolverTest.kt @@ -163,10 +163,23 @@ class GatewayConfigResolverTest { } @Test - fun parseGatewayEndpointRejectsLinkLocalIpv6ZoneCleartextWsUrls() { + fun parseGatewayEndpointAllowsLinkLocalIpv6ZoneCleartextWsUrls() { val parsed = parseGatewayEndpoint("ws://[fe80::1%25eth0]") - assertNull(parsed) + assertEquals("fe80::1%25eth0", parsed?.host) + assertEquals(18789, parsed?.port) + assertEquals(false, parsed?.tls) + assertEquals("http://[fe80::1%25eth0]:18789", parsed?.displayUrl) + } + + @Test + fun parseGatewayEndpointAllowsSecureIpv6ZoneUrls() { + val parsed = parseGatewayEndpoint("wss://[fe80::1%25wlan0]:443") + + assertEquals("fe80::1%25wlan0", parsed?.host) + assertEquals(443, parsed?.port) + assertEquals(true, parsed?.tls) + assertEquals("https://[fe80::1%25wlan0]", parsed?.displayUrl) } @Test