@@ -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+
213229private 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