Skip to content

Commit f5ae8e1

Browse files
committed
Add delegate for RequestProcessor
1 parent ec8b739 commit f5ae8e1

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

Modules/Sources/NetworkingCore/ApplicationPassword/RequestProcessor.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import Alamofire
22
import Foundation
33

4+
protocol RequestProcessorDelegate: AnyObject {
5+
func didFailToAuthenticateRequestWithApplicationPassword()
6+
}
7+
48
/// Authenticates and retries requests
59
///
610
final class RequestProcessor: RequestInterceptor {
@@ -12,14 +16,12 @@ final class RequestProcessor: RequestInterceptor {
1216

1317
private let notificationCenter: NotificationCenter
1418

15-
private let onApplicationPasswordGenerationFailure: (() -> Void)?
19+
weak var delegate: RequestProcessorDelegate?
1620

1721
init(requestAuthenticator: RequestAuthenticator,
18-
notificationCenter: NotificationCenter = .default,
19-
onApplicationPasswordGenerationFailure: (() -> Void)? = nil) {
22+
notificationCenter: NotificationCenter = .default) {
2023
self.requestAuthenticator = requestAuthenticator
2124
self.notificationCenter = notificationCenter
22-
self.onApplicationPasswordGenerationFailure = onApplicationPasswordGenerationFailure
2325
}
2426

2527
func updateAuthenticator(_ authenticator: RequestAuthenticator) {
@@ -90,7 +92,7 @@ private extension RequestProcessor {
9092
case AFError.responseValidationFailed(reason: .unacceptableStatusCode(code: 404)):
9193
/// Site doesn't support application password
9294
completeRequests(false)
93-
onApplicationPasswordGenerationFailure?()
95+
delegate?.didFailToAuthenticateRequestWithApplicationPassword()
9496
default:
9597
completeRequests(false)
9698
}

Modules/Sources/NetworkingCore/Network/AlamofireNetwork.swift

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public class AlamofireNetwork: Network {
3434

3535
private let selectedSite: AnyPublisher<JetpackSite?, Never>?
3636

37+
private let userDefaults: UserDefaults
38+
3739
/// Converter to convert Jetpack tunnel requests into REST API requests if applicable
3840
///
3941
private var requestConverter: RequestConverter
@@ -51,9 +53,11 @@ public class AlamofireNetwork: Network {
5153
///
5254
public required init(credentials: Credentials?,
5355
selectedSite: AnyPublisher<JetpackSite?, Never>? = nil,
56+
userDefaults: UserDefaults = .standard,
5457
sessionManager: Alamofire.Session? = nil) {
5558
self.credentials = credentials
5659
self.selectedSite = selectedSite
60+
self.userDefaults = userDefaults
5761
self.requestConverter = {
5862
let siteAddress: String? = {
5963
switch credentials {
@@ -75,11 +79,12 @@ public class AlamofireNetwork: Network {
7579

7680
public func updateAppPasswordSwitching(enabled: Bool) {
7781
guard let credentials, case .wpcom = credentials else { return }
78-
if enabled, let selectedSite {
82+
if enabled, let selectedSite, !userDefaults.applicationPasswordUnsupported {
7983
observeSelectedSite(selectedSite)
8084
} else {
8185
requestConverter = RequestConverter(siteAddress: nil)
8286
requestAuthenticator.updateAuthenticator(DefaultRequestAuthenticator(credentials: credentials))
87+
requestAuthenticator.delegate = nil
8388
}
8489
}
8590

@@ -193,11 +198,13 @@ private extension AlamofireNetwork {
193198
func observeSelectedSite(_ selectedSite: AnyPublisher<JetpackSite?, Never>) {
194199
subscription = selectedSite
195200
.removeDuplicates()
196-
.sink { [weak self] site in
201+
.combineLatest(userDefaults.publisher(for: \.applicationPasswordUnsupported))
202+
.sink { [weak self] site, appPasswordUnsupported in
197203
guard let self else { return }
198-
guard let site, site.applicationPasswordAvailable else {
204+
guard let site, site.applicationPasswordAvailable, !appPasswordUnsupported else {
199205
requestConverter = RequestConverter(siteAddress: nil)
200206
requestAuthenticator.updateAuthenticator(DefaultRequestAuthenticator(credentials: credentials))
207+
requestAuthenticator.delegate = nil
201208
return
202209
}
203210
requestConverter = RequestConverter(siteAddress: site.siteAddress)
@@ -206,10 +213,19 @@ private extension AlamofireNetwork {
206213
selectedSite: site,
207214
network: self
208215
))
216+
requestAuthenticator.delegate = self
209217
}
210218
}
211219
}
212220

221+
// MARK: `RequestProcessorDelegate` conformance
222+
//
223+
extension AlamofireNetwork: RequestProcessorDelegate {
224+
func didFailToAuthenticateRequestWithApplicationPassword() {
225+
userDefaults.applicationPasswordUnsupported = false
226+
}
227+
}
228+
213229
private extension DataRequest {
214230
/// Validates only for `RESTRequest`
215231
///
@@ -251,3 +267,16 @@ extension Alamofire.DataResponse {
251267
}
252268
}
253269
}
270+
271+
// MARK: - Helper extension to save internal flag for app password availability
272+
//
273+
extension UserDefaults {
274+
@objc dynamic var applicationPasswordUnsupported: Bool {
275+
get { bool(forKey: Key.applicationPasswordUnsupported.rawValue) }
276+
set { setValue(newValue, forKey: Key.applicationPasswordUnsupported.rawValue) }
277+
}
278+
279+
enum Key: String {
280+
case applicationPasswordUnsupported
281+
}
282+
}

0 commit comments

Comments
 (0)