From 10c961e15fd43a77e613d4df595379d071b608d6 Mon Sep 17 00:00:00 2001 From: Hirbod <504909+hirbod@users.noreply.github.com> Date: Sat, 24 Jun 2023 18:33:00 +0200 Subject: [PATCH] fix: [iOS][ExpoWebBrowser] don't crash with invalid url (#23084) --- packages/expo-web-browser/CHANGELOG.md | 2 ++ .../expo-web-browser/ios/WebBrowserExceptions.swift | 6 ++++++ packages/expo-web-browser/ios/WebBrowserModule.swift | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/packages/expo-web-browser/CHANGELOG.md b/packages/expo-web-browser/CHANGELOG.md index 47c66cff50314..cc3618069c449 100644 --- a/packages/expo-web-browser/CHANGELOG.md +++ b/packages/expo-web-browser/CHANGELOG.md @@ -8,6 +8,8 @@ ### 🐛 Bug fixes +- On `iOS`, fixed crash when opening an invalid URL in the web browser. ([#22986](https://github.com/expo/expo/pull/23084) by [@hirbod](https://github.com/hirbod)) + ### 💡 Others ## 12.3.0 — 2023-06-21 diff --git a/packages/expo-web-browser/ios/WebBrowserExceptions.swift b/packages/expo-web-browser/ios/WebBrowserExceptions.swift index a2427b2b178f4..c32a8f586c234 100644 --- a/packages/expo-web-browser/ios/WebBrowserExceptions.swift +++ b/packages/expo-web-browser/ios/WebBrowserExceptions.swift @@ -7,3 +7,9 @@ final class WebBrowserAlreadyOpenException: Exception { "Another web browser is already open" } } + +final class WebBrowserInvalidURLException: Exception { + override var reason: String { + return "The provided URL is not valid." + } +} diff --git a/packages/expo-web-browser/ios/WebBrowserModule.swift b/packages/expo-web-browser/ios/WebBrowserModule.swift index 9bf8439072303..e226ca00df493 100644 --- a/packages/expo-web-browser/ios/WebBrowserModule.swift +++ b/packages/expo-web-browser/ios/WebBrowserModule.swift @@ -8,6 +8,10 @@ final public class WebBrowserModule: Module { private var currentWebBrowserSession: WebBrowserSession? private var currentAuthSession: WebAuthSession? + private func isValid(url: URL) -> Bool { + return url.scheme == "http" || url.scheme == "https" + } + public func definition() -> ModuleDefinition { Name("ExpoWebBrowser") @@ -15,10 +19,16 @@ final public class WebBrowserModule: Module { guard self.currentWebBrowserSession == nil else { throw WebBrowserAlreadyOpenException() } + + guard self.isValid(url: url) else { + throw WebBrowserInvalidURLException() + } + self.currentWebBrowserSession = WebBrowserSession(url: url, options: options) { [promise] type in promise.resolve(["type": type]) self.currentWebBrowserSession = nil } + self.currentWebBrowserSession?.open() } .runOnQueue(.main)