Skip to content

Commit ef76cb5

Browse files
committed
Remove force unwrapping of incoming url parameters
Avoid unnecessary crashes due to unrelated incoming URLs by: - guard against existence of URL components. - guard against query parameters - validate required cookies *bonus: discard result from user defaults synchronization.
1 parent 6367c57 commit ef76cb5

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

templates/swift/Sources/OAuth/WebAuthComponent.swift.twig

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,25 @@ public class WebAuthComponent {
5353
/// - url: The URL containing the cookie
5454
///
5555
public static func handleIncomingCookie(from url: URL) {
56-
let components = URLComponents(string: url.absoluteString)!
5756

58-
let cookieParts = [String: String](uniqueKeysWithValues: components.queryItems!.map {
59-
($0.name, $0.value!)
57+
guard let components = URLComponents(string: url.absoluteString),
58+
let queryItems = components.queryItems else {
59+
return
60+
}
61+
62+
let cookieParts = [String: String](uniqueKeysWithValues: queryItems.compactMap { item in
63+
item.value.map { (item.name, $0) }
6064
})
6165

62-
var domain = cookieParts["domain"]!
66+
guard let validatedCookieParts = validateRequiredCookieParts(cookieParts) else {
67+
return
68+
}
69+
70+
var domain = validatedCookieParts.domain
6371
domain.remove(at: domain.startIndex)
72+
let key = validatedCookieParts.key
73+
let secret = validatedCookieParts.secret
6474

65-
let key: String = cookieParts["key"]!
66-
let secret: String = cookieParts["secret"]!
6775
let path: String? = cookieParts["path"]
6876
let expires: String? = cookieParts["expires"]
6977
let maxAge: String? = cookieParts["maxAge"]
@@ -92,7 +100,7 @@ public class WebAuthComponent {
92100
cookie += "; secure"
93101
}
94102

95-
let existing = UserDefaults.standard.stringArray(forKey: domain)
103+
_ = UserDefaults.standard.stringArray(forKey: domain)
96104
let new = [cookie]
97105

98106
UserDefaults.standard.set(new, forKey: domain)
@@ -103,6 +111,15 @@ public class WebAuthComponent {
103111
)
104112
}
105113

114+
private static func validateRequiredCookieParts(_ cookieParts: [String: String]) -> (domain: String, key: String, secret: String)? {
115+
guard let domain = cookieParts["domain"],
116+
let key = cookieParts["key"],
117+
let secret = cookieParts["secret"] else {
118+
return nil
119+
}
120+
return (domain, key, secret)
121+
}
122+
106123
///
107124
/// Trigger a web auth callback
108125
///

0 commit comments

Comments
 (0)