From a68e01df68e5741b982eae4b821265087d261b80 Mon Sep 17 00:00:00 2001 From: ykyivskyi-gd Date: Thu, 29 Jul 2021 13:42:33 +0300 Subject: [PATCH 1/4] Tolerating not found, timeout, service unavailable errors in EnterpriseService; --- .../Services/EnterpriseServerApi.swift | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift index f1a8ce626..91ef1110c 100644 --- a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift +++ b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift @@ -32,6 +32,9 @@ extension EnterpriseServerApiError: LocalizedError { class EnterpriseServerApi: EnterpriseServerApiType { private enum Constants { + /// 404 - Not Found, -1001 - request timed out, 503 - service unavailable + static let getToleratedStatuses = [404, -1001, 503] + static let getActiveFesTimeout: TimeInterval = 4 static let serviceKey = "service" @@ -69,9 +72,21 @@ class EnterpriseServerApi: EnterpriseServerApiType { body: nil ) - let response = try? awaitPromise(URLSession.shared.call(request)) - guard let safeReponse = response, - let responseDictionary = try? safeReponse.data.toDict(), + guard let safeReponse = try? awaitPromise( + URLSession.shared.call( + request, + tolerateStatus: Constants.getToleratedStatuses + ) + ) else { + resolve(nil) + return + } + + if Constants.getToleratedStatuses.contains(safeReponse.status) { + resolve(nil) + } + + guard let responseDictionary = try? safeReponse.data.toDict(), let service = responseDictionary[Constants.serviceKey] as? String, service == Constants.serviceNeededValue else { resolve(nil) @@ -99,12 +114,24 @@ class EnterpriseServerApi: EnterpriseServerApiType { method: .get, body: nil ) - let response = try? awaitPromise(URLSession.shared.call(request)) + guard let safeReponse = try? awaitPromise( + URLSession.shared.call( + request, + tolerateStatus: Constants.getToleratedStatuses + ) + ) else { + reject(EnterpriseServerApiError.parse) + return + } + + if Constants.getToleratedStatuses.contains(safeReponse.status) { + resolve(.empty) + } + let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase - guard let safeReponse = response, - let clientConfiguration = (try? decoder.decode( + guard let clientConfiguration = (try? decoder.decode( ClientConfigurationContainer.self, from: safeReponse.data ))?.clientConfiguration From 934951cf5768647ecf551bebc3c14a03679ff627 Mon Sep 17 00:00:00 2001 From: ykyivskyi-gd Date: Thu, 29 Jul 2021 17:39:45 +0300 Subject: [PATCH 2/4] Fixed error handling for getting FES url; --- .../Services/EnterpriseServerApi.swift | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift index 91ef1110c..522543c93 100644 --- a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift +++ b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift @@ -32,10 +32,11 @@ extension EnterpriseServerApiError: LocalizedError { class EnterpriseServerApi: EnterpriseServerApiType { private enum Constants { - /// 404 - Not Found, -1001 - request timed out, 503 - service unavailable - static let getToleratedStatuses = [404, -1001, 503] - - static let getActiveFesTimeout: TimeInterval = 4 + /// 404 - Not Found + static let getToleratedHTTPStatuses = [404] + /// -1001 - request timed out, -1003 - сannot resolve host + static let getToleratedNSErrorCodes = [-1001, -1003] + static let getActiveFesTimeout: TimeInterval = 100 static let serviceKey = "service" static let serviceNeededValue = "enterprise-server" @@ -72,21 +73,18 @@ class EnterpriseServerApi: EnterpriseServerApiType { body: nil ) - guard let safeReponse = try? awaitPromise( + let response = try awaitPromise( URLSession.shared.call( request, - tolerateStatus: Constants.getToleratedStatuses + tolerateStatus: Constants.getToleratedHTTPStatuses ) - ) else { - resolve(nil) - return - } + ) - if Constants.getToleratedStatuses.contains(safeReponse.status) { + if Constants.getToleratedHTTPStatuses.contains(response.status) { resolve(nil) } - guard let responseDictionary = try? safeReponse.data.toDict(), + guard let responseDictionary = try? response.data.toDict(), let service = responseDictionary[Constants.serviceKey] as? String, service == Constants.serviceNeededValue else { resolve(nil) @@ -96,6 +94,14 @@ class EnterpriseServerApi: EnterpriseServerApiType { resolve(urlString) } .timeout(Constants.getActiveFesTimeout) + .recover { error -> String? in + if let httpError = error as? HttpErr, + let nsError = httpError.error as NSError?, + Constants.getToleratedNSErrorCodes.contains(nsError.code) { + return nil + } + throw error + } .recoverFromTimeOut(result: nil) } @@ -105,6 +111,12 @@ class EnterpriseServerApi: EnterpriseServerApiType { reject(EnterpriseServerApiError.emailFormat) return } + + guard try awaitPromise(self.getActiveFesUrl(for: email)) != nil else { + resolve(.empty) + return + } + if Configuration.publicEmailProviderDomains.contains(userDomain) { resolve(.empty) return @@ -114,19 +126,7 @@ class EnterpriseServerApi: EnterpriseServerApiType { method: .get, body: nil ) - guard let safeReponse = try? awaitPromise( - URLSession.shared.call( - request, - tolerateStatus: Constants.getToleratedStatuses - ) - ) else { - reject(EnterpriseServerApiError.parse) - return - } - - if Constants.getToleratedStatuses.contains(safeReponse.status) { - resolve(.empty) - } + let safeReponse = try awaitPromise(URLSession.shared.call(request)) let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase From 1671691b10bf65acefc9ba190fe9bdd502095a02 Mon Sep 17 00:00:00 2001 From: ykyivskyi-gd Date: Fri, 30 Jul 2021 15:16:10 +0300 Subject: [PATCH 3/4] Fixed timeout for enterprise api; --- FlowCrypt/Functionality/Services/EnterpriseServerApi.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift index 522543c93..773ec3a38 100644 --- a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift +++ b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift @@ -36,7 +36,7 @@ class EnterpriseServerApi: EnterpriseServerApiType { static let getToleratedHTTPStatuses = [404] /// -1001 - request timed out, -1003 - сannot resolve host static let getToleratedNSErrorCodes = [-1001, -1003] - static let getActiveFesTimeout: TimeInterval = 100 + static let getActiveFesTimeout: TimeInterval = 4 static let serviceKey = "service" static let serviceNeededValue = "enterprise-server" From 50ba157ef37103421e1a078e4acbe650ba720376 Mon Sep 17 00:00:00 2001 From: ykyivskyi-gd Date: Fri, 30 Jul 2021 15:18:41 +0300 Subject: [PATCH 4/4] Added more tolerated errors for FES url fetching; --- FlowCrypt/Functionality/Services/EnterpriseServerApi.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift index 773ec3a38..c8168dcc0 100644 --- a/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift +++ b/FlowCrypt/Functionality/Services/EnterpriseServerApi.swift @@ -34,8 +34,10 @@ class EnterpriseServerApi: EnterpriseServerApiType { private enum Constants { /// 404 - Not Found static let getToleratedHTTPStatuses = [404] - /// -1001 - request timed out, -1003 - сannot resolve host - static let getToleratedNSErrorCodes = [-1001, -1003] + /// -1001 - request timed out, -1003 - сannot resolve host, -1004 - can't conenct to hosts, + /// -1005 - network connection lost, -1006 - dns lookup failed, -1007 - too many redirects + /// -1008 - resource unavailable + static let getToleratedNSErrorCodes = [-1001, -1003, -1004, -1005, -1006, -1007, -1008] static let getActiveFesTimeout: TimeInterval = 4 static let serviceKey = "service"