Normalize IDN host allowlist entries

This commit is contained in:
Lawrence Chen 2026-02-20 19:34:34 -08:00
parent 7cc94ffa29
commit 1d5be22820
2 changed files with 14 additions and 1 deletions

View file

@ -239,7 +239,15 @@ enum BrowserInsecureHTTPSettings {
private static func trimHost(_ raw: String) -> String? {
let trimmed = raw.trimmingCharacters(in: CharacterSet(charactersIn: "."))
return trimmed.isEmpty ? nil : trimmed
guard !trimmed.isEmpty else { return nil }
// Canonicalize IDN entries (e.g. bücher.example -> xn--bcher-kva.example)
// so user-entered allowlist patterns compare against URL.host consistently.
if let canonicalized = URL(string: "https://\(trimmed)")?.host {
return canonicalized
}
return trimmed
}
}

View file

@ -2960,4 +2960,9 @@ final class BrowserHostWhitelistTests: XCTestCase {
defaults.set("http://\n*.\n", forKey: BrowserLinkOpenSettings.browserHostWhitelistKey)
XCTAssertFalse(BrowserLinkOpenSettings.hostMatchesWhitelist("example.com", defaults: defaults))
}
func testUnicodeWhitelistEntryMatchesPunycodeHost() {
defaults.set("b\\u{00FC}cher.example", forKey: BrowserLinkOpenSettings.browserHostWhitelistKey)
XCTAssertTrue(BrowserLinkOpenSettings.hostMatchesWhitelist("xn--bcher-kva.example", defaults: defaults))
}
}