Skip to content

Commit 264dd58

Browse files
Copilotfarfromrefug
andcommitted
Address code review feedback: fix task casting, security validation, and deprecated APIs
Agent-Logs-Url: https://github.com/nativescript-community/https/sessions/fc9101f9-5596-43a3-ab69-ff9c48eeef06 Co-authored-by: farfromrefug <655344+farfromrefug@users.noreply.github.com>
1 parent 64999ba commit 264dd58

File tree

2 files changed

+59
-20
lines changed

2 files changed

+59
-20
lines changed

packages/https/platforms/ios/src/AlamofireWrapper.swift

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,15 @@ public class AlamofireWrapper: NSObject {
9595
var afRequest: DataRequest = session.request(request)
9696

9797
// Apply server trust evaluation if security policy is set
98-
if let secPolicy = securityPolicy {
99-
afRequest = afRequest.validate(evaluator: secPolicy)
98+
if let secPolicy = securityPolicy, let host = url.host {
99+
afRequest = afRequest.validate { _, response, _ in
100+
do {
101+
try secPolicy.evaluate(response.serverTrust!, forHost: host)
102+
return .success(Void())
103+
} catch {
104+
return .failure(error)
105+
}
106+
}
100107
}
101108

102109
// Upload progress
@@ -115,24 +122,25 @@ public class AlamofireWrapper: NSObject {
115122

116123
// Response handling
117124
afRequest.response(queue: .main) { response in
118-
guard let task = response.request?.task else {
125+
let task = response.request?.task as? URLSessionDataTask
126+
guard let task = task else {
119127
let error = NSError(domain: "AlamofireWrapper", code: -1, userInfo: [NSLocalizedDescriptionKey: "No task available"])
120128
failure(nil, error)
121129
return
122130
}
123131

124132
if let error = response.error {
125133
let nsError = self.createNSError(from: error, response: response.response, data: response.data)
126-
failure(task as? URLSessionDataTask, nsError)
134+
failure(task, nsError)
127135
return
128136
}
129137

130138
// Deserialize response based on responseSerializer
131139
if let data = response.data {
132140
let result = self.responseSerializer.deserialize(data: data, response: response.response)
133-
success(task as? URLSessionDataTask ?? URLSessionDataTask(), result)
141+
success(task, result)
134142
} else {
135-
success(task as? URLSessionDataTask ?? URLSessionDataTask(), nil)
143+
success(task, nil)
136144
}
137145
}
138146

@@ -178,8 +186,15 @@ public class AlamofireWrapper: NSObject {
178186
}, with: request)
179187

180188
// Apply server trust evaluation if security policy is set
181-
if let secPolicy = securityPolicy {
182-
afRequest = afRequest.validate(evaluator: secPolicy)
189+
if let secPolicy = securityPolicy, let host = url.host {
190+
afRequest = afRequest.validate { _, response, _ in
191+
do {
192+
try secPolicy.evaluate(response.serverTrust!, forHost: host)
193+
return .success(Void())
194+
} catch {
195+
return .failure(error)
196+
}
197+
}
183198
}
184199

185200
// Upload progress
@@ -191,24 +206,25 @@ public class AlamofireWrapper: NSObject {
191206

192207
// Response handling
193208
afRequest.response(queue: .main) { response in
194-
guard let task = response.request?.task else {
209+
let task = response.request?.task as? URLSessionDataTask
210+
guard let task = task else {
195211
let error = NSError(domain: "AlamofireWrapper", code: -1, userInfo: [NSLocalizedDescriptionKey: "No task available"])
196212
failure(nil, error)
197213
return
198214
}
199215

200216
if let error = response.error {
201217
let nsError = self.createNSError(from: error, response: response.response, data: response.data)
202-
failure(task as? URLSessionDataTask, nsError)
218+
failure(task, nsError)
203219
return
204220
}
205221

206222
// Deserialize response based on responseSerializer
207223
if let data = response.data {
208224
let result = self.responseSerializer.deserialize(data: data, response: response.response)
209-
success(task as? URLSessionDataTask ?? URLSessionDataTask(), result)
225+
success(task, result)
210226
} else {
211-
success(task as? URLSessionDataTask ?? URLSessionDataTask(), nil)
227+
success(task, nil)
212228
}
213229
}
214230

@@ -227,8 +243,15 @@ public class AlamofireWrapper: NSObject {
227243
var afRequest = session.upload(fileURL, with: request)
228244

229245
// Apply server trust evaluation if security policy is set
230-
if let secPolicy = securityPolicy {
231-
afRequest = afRequest.validate(evaluator: secPolicy)
246+
if let secPolicy = securityPolicy, let host = request.url?.host {
247+
afRequest = afRequest.validate { _, response, _ in
248+
do {
249+
try secPolicy.evaluate(response.serverTrust!, forHost: host)
250+
return .success(Void())
251+
} catch {
252+
return .failure(error)
253+
}
254+
}
232255
}
233256

234257
// Upload progress
@@ -267,8 +290,15 @@ public class AlamofireWrapper: NSObject {
267290
var afRequest = session.upload(bodyData, with: request)
268291

269292
// Apply server trust evaluation if security policy is set
270-
if let secPolicy = securityPolicy {
271-
afRequest = afRequest.validate(evaluator: secPolicy)
293+
if let secPolicy = securityPolicy, let host = request.url?.host {
294+
afRequest = afRequest.validate { _, response, _ in
295+
do {
296+
try secPolicy.evaluate(response.serverTrust!, forHost: host)
297+
return .success(Void())
298+
} catch {
299+
return .failure(error)
300+
}
301+
}
272302
}
273303

274304
// Upload progress
@@ -371,8 +401,8 @@ public class RequestSerializer: NSObject {
371401
}
372402
} else {
373403
// For GET and others, encode as query parameters
374-
if let dict = parameters as? [String: Any] {
375-
var components = URLComponents(url: request.url!, resolvingAgainstBaseURL: false)
404+
if let dict = parameters as? [String: Any], let requestURL = request.url {
405+
var components = URLComponents(url: requestURL, resolvingAgainstBaseURL: false)
376406
components?.queryItems = dict.map { URLQueryItem(name: $0.key, value: "\($0.value)") }
377407
if let urlWithQuery = components?.url {
378408
request.url = urlWithQuery

packages/https/platforms/ios/src/SecurityPolicyWrapper.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,17 @@ extension SecurityPolicyWrapper: ServerTrustEvaluating {
4848
}
4949

5050
// Get the server certificates
51-
let serverCertificates = (0..<SecTrustGetCertificateCount(trust)).compactMap { index -> SecCertificate? in
52-
return SecTrustGetCertificateAtIndex(trust, index)
51+
let serverCertificates: [SecCertificate]
52+
if #available(iOS 15.0, *) {
53+
if let certificateChain = SecTrustCopyCertificateChain(trust) as? [SecCertificate] {
54+
serverCertificates = certificateChain
55+
} else {
56+
serverCertificates = []
57+
}
58+
} else {
59+
serverCertificates = (0..<SecTrustGetCertificateCount(trust)).compactMap { index -> SecCertificate? in
60+
return SecTrustGetCertificateAtIndex(trust, index)
61+
}
5362
}
5463

5564
// If no pinning mode, just validate the certificate chain

0 commit comments

Comments
 (0)