diff --git a/Sources/NextcloudKit/NKCommon.swift b/Sources/NextcloudKit/NKCommon.swift index 73a2c71c..8d491659 100644 --- a/Sources/NextcloudKit/NKCommon.swift +++ b/Sources/NextcloudKit/NKCommon.swift @@ -66,6 +66,12 @@ public struct NKCommon: Sendable { public let notificationCenterChunkedFileStop = NSNotification.Name(rawValue: "NextcloudKit.chunkedFile.stop") + public let headerAccount = "X-NC-Account" + public let headerCheckInterceptor = "X-NC-CheckInterceptor" + public let groupDefaultsUnauthorized = "Unauthorized" + public let groupDefaultsUnavailable = "Unavailable" + public let groupDefaultsToS = "ToS" + public enum TypeReachability: Int { case unknown = 0 case notReachable = 1 @@ -432,6 +438,40 @@ public struct NKCommon: Sendable { return completion(filesChunk) } + // MARK: - Server Error GroupDefaults + + public func appendServerErrorAccount(_ account: String, errorCode: Int) { + guard let groupDefaults = UserDefaults(suiteName: groupIdentifier) else { + return + } + + /// Unavailable + if errorCode == 503 { + var array = groupDefaults.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnavailable) as? [String] ?? [] + + if !array.contains(account) { + array.append(account) + groupDefaults.set(array, forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnavailable) + } + /// Unauthorized + } else if errorCode == 401 { + var array = groupDefaults.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnauthorized) as? [String] ?? [] + + if !array.contains(account) { + array.append(account) + groupDefaults.set(array, forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnauthorized) + } + /// ToS + } else if errorCode == 403 { + var array = groupDefaults.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsToS) as? [String] ?? [] + + if !array.contains(account) { + array.append(account) + groupDefaults.set(array, forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsToS) + } + } + } + // MARK: - Common public func getSession(account: String) -> NKSession? { @@ -444,7 +484,7 @@ public struct NKCommon: Sendable { return session } - public func getStandardHeaders(account: String, checkUnauthorized: Bool? = nil, options: NKRequestOptions? = nil) -> HTTPHeaders? { + public func getStandardHeaders(account: String, options: NKRequestOptions? = nil) -> HTTPHeaders? { guard let session = nksessions.filter({ $0.account == account }).first else { return nil} var headers: HTTPHeaders = [] @@ -465,9 +505,9 @@ public struct NKCommon: Sendable { for (key, value) in options?.customHeader ?? [:] { headers.update(name: key, value: value) } - headers.update(name: "X-NC-Account", value: account) - if let checkUnauthorized { - headers.update(name: "X-NC-CheckUnauthorized", value: checkUnauthorized.description) + headers.update(name: headerAccount, value: account) + if let checkInterceptor = options?.checkInterceptor { + headers.update(name: headerCheckInterceptor, value: checkInterceptor.description) } // Paginate if let options { diff --git a/Sources/NextcloudKit/NKDataFileXML.swift b/Sources/NextcloudKit/NKDataFileXML.swift index 268b3d20..bafb99cd 100644 --- a/Sources/NextcloudKit/NKDataFileXML.swift +++ b/Sources/NextcloudKit/NKDataFileXML.swift @@ -6,7 +6,7 @@ import Foundation import SwiftyXMLParser -class NKDataFileXML: NSObject { +public class NKDataFileXML: NSObject { var nkCommonInstance: NKCommon let requestBodyComments = """ @@ -51,7 +51,7 @@ class NKDataFileXML: NSObject { """ - func getRequestBodyFile(createProperties: [NKProperties]?, removeProperties: [NKProperties] = []) -> String { + public func getRequestBodyFile(createProperties: [NKProperties]?, removeProperties: [NKProperties] = []) -> String { let request = """ @@ -63,6 +63,20 @@ class NKDataFileXML: NSObject { return request } + public func getRequestBodyFileExists() -> String { + let request = """ + + + + + + + + + """ + return request + } + let requestBodyFileSetFavorite = """ @@ -229,7 +243,7 @@ class NKDataFileXML: NSObject { """ - init(nkCommonInstance: NKCommon) { + public init(nkCommonInstance: NKCommon) { self.nkCommonInstance = nkCommonInstance super.init() } diff --git a/Sources/NextcloudKit/NKError.swift b/Sources/NextcloudKit/NKError.swift index 5d4db76d..67ab4b09 100644 --- a/Sources/NextcloudKit/NKError.swift +++ b/Sources/NextcloudKit/NKError.swift @@ -52,6 +52,10 @@ public struct NKError: Sendable, Equatable { public static let xmlError = NKError(errorCode: NSURLErrorBadServerResponse, errorDescription: NSLocalizedString("_error_decode_xml_", value: "Invalid response, error decoding XML", comment: "")) public static let invalidDate = NKError(errorCode: NSURLErrorBadServerResponse, errorDescription: NSLocalizedString("_invalid_date_format_", value: "Invalid date format", comment: "")) public static let invalidData = NKError(errorCode: NSURLErrorCannotDecodeContentData, errorDescription: NSLocalizedString("_invalid_data_format_", value: "Invalid data format", comment: "")) + public static let unauthorizedError = NKError(errorCode: 401, errorDescription: NSLocalizedString("_unauthorized_", value: "Unauthorized", comment: "")) + public static let unavailableError = NKError(errorCode: 503, errorDescription: NSLocalizedString("_Unavailable_", value: "Unavailable", comment: "")) + public static let forbiddenError = NKError(errorCode: 403, errorDescription: NSLocalizedString("_forbidden_", value: "Forbidden", comment: "")) + public static let success = NKError(errorCode: 0, errorDescription: "") public static func getErrorDescription(for code: Int) -> String? { diff --git a/Sources/NextcloudKit/NKInterceptor.swift b/Sources/NextcloudKit/NKInterceptor.swift index 795c23cb..394748b3 100644 --- a/Sources/NextcloudKit/NKInterceptor.swift +++ b/Sources/NextcloudKit/NKInterceptor.swift @@ -13,24 +13,37 @@ final class NKInterceptor: RequestInterceptor, Sendable { } func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { - // - // Detect if exists in the groupDefaults Unauthorized array the account - // if let url: String = urlRequest.url?.absoluteString, self.nkCommonInstance.levelLog > 0 { debugPrint("[DEBUG] Interceptor request url: " + url) } - if let checkUnauthorized = urlRequest.value(forHTTPHeaderField: "X-NC-CheckUnauthorized"), - checkUnauthorized == "false" { + if let checkInterceptor = urlRequest.value(forHTTPHeaderField: nkCommonInstance.headerCheckInterceptor), + checkInterceptor == "false" { return completion(.success(urlRequest)) - } else if let account = urlRequest.value(forHTTPHeaderField: "X-NC-Account"), - let groupDefaults = UserDefaults(suiteName: NextcloudKit.shared.nkCommonInstance.groupIdentifier), - let unauthorizedArray = groupDefaults.array(forKey: "Unauthorized") as? [String], - unauthorizedArray.contains(account) { - self.nkCommonInstance.writeLog("[DEBUG] Unauthorized for account: \(account)") - let error = AFError.responseValidationFailed(reason: .unacceptableStatusCode(code: 401)) - return completion(.failure(error)) + } + + if let account = urlRequest.value(forHTTPHeaderField: nkCommonInstance.headerAccount), + let groupDefaults = UserDefaults(suiteName: nkCommonInstance.groupIdentifier) { + /// Unauthorized + if let array = groupDefaults.array(forKey: nkCommonInstance.groupDefaultsUnauthorized) as? [String], + array.contains(account) { + self.nkCommonInstance.writeLog("[DEBUG] Unauthorized for account: \(account)") + let error = AFError.responseValidationFailed(reason: .unacceptableStatusCode(code: 401)) + return completion(.failure(error)) + /// Unavailable + } else if let array = groupDefaults.array(forKey: nkCommonInstance.groupDefaultsUnavailable) as? [String], + array.contains(account) { + self.nkCommonInstance.writeLog("[DEBUG] Unavailable for account: \(account)") + let error = AFError.responseValidationFailed(reason: .unacceptableStatusCode(code: 503)) + return completion(.failure(error)) + /// ToS + } else if let array = groupDefaults.array(forKey: nkCommonInstance.groupDefaultsToS) as? [String], + array.contains(account) { + self.nkCommonInstance.writeLog("[DEBUG] ToS for account: \(account)") + let error = AFError.responseValidationFailed(reason: .unacceptableStatusCode(code: 403)) + return completion(.failure(error)) + } } completion(.success(urlRequest)) diff --git a/Sources/NextcloudKit/NKMonitor.swift b/Sources/NextcloudKit/NKMonitor.swift index a0575297..ac650ef4 100644 --- a/Sources/NextcloudKit/NKMonitor.swift +++ b/Sources/NextcloudKit/NKMonitor.swift @@ -28,44 +28,14 @@ final class NKMonitor: EventMonitor, Sendable { func request(_ request: DataRequest, didParseResponse response: AFDataResponse) { nkCommonInstance.delegate?.request(request, didParseResponse: response) - if let statusCode = response.response?.statusCode { - - // - // Unauthorized, append the account in groupDefaults unauthorized array - // - if statusCode == 401, - let headerValue = request.request?.allHTTPHeaderFields?["X-NC-CheckUnauthorized"], - headerValue.lowercased() == "true", - let account = request.request?.allHTTPHeaderFields?["X-NC-Account"] as? String, - let groupDefaults = UserDefaults(suiteName: NextcloudKit.shared.nkCommonInstance.groupIdentifier) { - - var unauthorizedArray = groupDefaults.array(forKey: "Unauthorized") as? [String] ?? [] - if !unauthorizedArray.contains(account) { - unauthorizedArray.append(account) - groupDefaults.set(unauthorizedArray, forKey: "Unauthorized") - groupDefaults.synchronize() - } - - // - // Unavailable, append the account in groupDefaults unavailable array - // - } else if statusCode == 503, - let account = request.request?.allHTTPHeaderFields?["X-NC-Account"] as? String, - let groupDefaults = UserDefaults(suiteName: NextcloudKit.shared.nkCommonInstance.groupIdentifier) { - - var unavailableArray = groupDefaults.array(forKey: "Unavailable") as? [String] ?? [] - if !unavailableArray.contains(account) { - unavailableArray.append(account) - groupDefaults.set(unavailableArray, forKey: "Unavailable") - groupDefaults.synchronize() - } - } - - if let url = request.request?.url?.absoluteString, - let account = request.request?.allHTTPHeaderFields?["X-NC-Account"] as? String, - self.nkCommonInstance.levelLog > 0 { - debugPrint("[DEBUG] Monitor request url: \(url), status code \(statusCode), account: \(account)") - } + // + // Server Error GroupDefaults + // + if let statusCode = response.response?.statusCode, + let headerCheckInterceptor = request.request?.allHTTPHeaderFields?[self.nkCommonInstance.headerCheckInterceptor], + headerCheckInterceptor.lowercased() == "true", + let account = request.request?.allHTTPHeaderFields?[self.nkCommonInstance.headerAccount] as? String { + self.nkCommonInstance.appendServerErrorAccount(account, errorCode: statusCode) } // diff --git a/Sources/NextcloudKit/NKRequestOptions.swift b/Sources/NextcloudKit/NKRequestOptions.swift index 2c2baa68..fe5ba863 100644 --- a/Sources/NextcloudKit/NKRequestOptions.swift +++ b/Sources/NextcloudKit/NKRequestOptions.swift @@ -16,7 +16,7 @@ public class NKRequestOptions: NSObject { var taskDescription: String? var createProperties: [NKProperties]? var removeProperties: [NKProperties] - var checkUnauthorized: Bool? + var checkInterceptor: Bool var paginate: Bool var paginateToken: String? var paginateOffset: Int? @@ -33,7 +33,7 @@ public class NKRequestOptions: NSObject { taskDescription: String? = nil, createProperties: [NKProperties]? = nil, removeProperties: [NKProperties] = [], - checkUnauthorized: Bool? = nil, + checkInterceptor: Bool = true, paginate: Bool = false, paginateToken: String? = nil, paginateOffset: Int? = nil, @@ -50,7 +50,7 @@ public class NKRequestOptions: NSObject { self.taskDescription = taskDescription self.createProperties = createProperties self.removeProperties = removeProperties - self.checkUnauthorized = checkUnauthorized + self.checkInterceptor = checkInterceptor self.paginate = paginate self.paginateToken = paginateToken self.paginateOffset = paginateOffset diff --git a/Sources/NextcloudKit/NextcloudKit+API.swift b/Sources/NextcloudKit/NextcloudKit+API.swift index 42b209d0..c07077f3 100644 --- a/Sources/NextcloudKit/NextcloudKit+API.swift +++ b/Sources/NextcloudKit/NextcloudKit+API.swift @@ -64,13 +64,9 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } let method = HTTPMethod(rawValue: method.uppercased()) @@ -100,13 +96,9 @@ public extension NextcloudKit { completion: @escaping (_ account: String, _ externalFiles: [NKExternalSite], _ responseData: AFDataResponse?, _ error: NKError) -> Void) { var externalSites: [NKExternalSite] = [] let endpoint = "ocs/v2.php/apps/external/api/v1" - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, externalSites, nil, .urlError) } } @@ -221,12 +213,8 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let nkSession = nkCommonInstance.getSession(account: account), - var headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + var headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } if var etag = etag { @@ -264,14 +252,10 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ width: Int, _ height: Int, _ etag: String?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "index.php/core/preview?fileId=\(fileId)&x=\(width)&y=\(height)&a=\(crop)&mode=\(cropMode)&forceIcon=\(forceIcon)&mimeFallback=\(mimeFallback)" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - var headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + var headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, width, height, nil, nil, .urlError) } } @@ -309,15 +293,11 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ width: Int, _ height: Int, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "index.php/apps/files_trashbin/preview?fileId=\(fileId)&x=\(width)&y=\(height)&a=\(crop)&mode=\(cropMode)&forceIcon=\(forceIcon)&mimeFallback=\(mimeFallback)" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, width, height, nil, .urlError) } } @@ -347,14 +327,10 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ imageAvatar: UIImage?, _ imageOriginal: UIImage?, _ etag: String?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "index.php/avatar/\(user)/\(sizeImage)" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - var headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + var headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, nil, nil, .urlError) } } @@ -451,13 +427,9 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let url = serverUrl.asUrl, let nkSession = nkCommonInstance.getSession(account: account), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } @@ -484,14 +456,10 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ userProfile: NKUserProfile?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v2.php/cloud/user" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } @@ -557,14 +525,10 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v1.php/cloud/capabilities" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } @@ -672,10 +636,6 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ activities: [NKActivity], _ activityFirstKnown: Int, _ activityLastGiven: Int, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } var activities: [NKActivity] = [] var activityFirstKnown = 0 var activityLastGiven = 0 @@ -700,7 +660,7 @@ public extension NextcloudKit { guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, activities, activityFirstKnown, activityLastGiven, nil, .urlError) } } @@ -773,14 +733,10 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ notifications: [NKNotifications]?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v2.php/apps/notifications/api/v2/notifications" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } @@ -851,12 +807,8 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let nkSession = nkCommonInstance.getSession(account: account), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } var url: URLConvertible? @@ -895,10 +847,6 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ url: String?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v2.php/apps/dav/api/v1/direct" let parameters: [String: Any] = [ "fileId": fileId, @@ -906,7 +854,7 @@ public extension NextcloudKit { ] guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } @@ -937,17 +885,13 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v2.php/apps/security_guard/diagnostics" /// options.contentType = "application/json" /// guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } var urlRequest: URLRequest diff --git a/Sources/NextcloudKit/NextcloudKit+PushNotification.swift b/Sources/NextcloudKit/NextcloudKit+PushNotification.swift index 18d29faa..1052157e 100644 --- a/Sources/NextcloudKit/NextcloudKit+PushNotification.swift +++ b/Sources/NextcloudKit/NextcloudKit+PushNotification.swift @@ -15,14 +15,10 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ deviceIdentifier: String?, _ signature: String?, _ publicKey: String?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v2.php/apps/notifications/api/v2/push" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, nil, nil, .urlError) } } let parameters = [ @@ -62,14 +58,10 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v2.php/apps/notifications/api/v2/push" guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } diff --git a/Sources/NextcloudKit/NextcloudKit+RecommendedFiles.swift b/Sources/NextcloudKit/NextcloudKit+RecommendedFiles.swift index 55d5e587..9bd3dea2 100644 --- a/Sources/NextcloudKit/NextcloudKit+RecommendedFiles.swift +++ b/Sources/NextcloudKit/NextcloudKit+RecommendedFiles.swift @@ -12,17 +12,13 @@ public extension NextcloudKit { request: @escaping (DataRequest?) -> Void = { _ in }, taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ recommendations: [NKRecommendation]?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } let endpoint = "ocs/v2.php/apps/recommendations/api/v1/recommendations" /// options.contentType = "application/xml" /// guard let nkSession = nkCommonInstance.getSession(account: account), let url = nkCommonInstance.createStandardUrl(serverUrl: nkSession.urlBase, endpoint: endpoint, options: options), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } diff --git a/Sources/NextcloudKit/NextcloudKit+WebDAV.swift b/Sources/NextcloudKit/NextcloudKit+WebDAV.swift index 2948973a..afbe4ed6 100644 --- a/Sources/NextcloudKit/NextcloudKit+WebDAV.swift +++ b/Sources/NextcloudKit/NextcloudKit+WebDAV.swift @@ -12,13 +12,9 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ ocId: String?, _ date: Date?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let url = serverUrlFileName.encodedToUrl, let nkSession = nkCommonInstance.getSession(account: account), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, nil, .urlError) } } let method = HTTPMethod(rawValue: "MKCOL") @@ -61,13 +57,9 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let url = serverUrlFileName.encodedToUrl, let nkSession = nkCommonInstance.getSession(account: account), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } var urlRequest: URLRequest @@ -102,13 +94,9 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let url = serverUrlFileNameSource.encodedToUrl, let nkSession = nkCommonInstance.getSession(account: account), - var headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + var headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } let method = HTTPMethod(rawValue: "MOVE") @@ -150,13 +138,9 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } guard let url = serverUrlFileNameSource.encodedToUrl, let nkSession = nkCommonInstance.getSession(account: account), - var headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + var headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } let method = HTTPMethod(rawValue: "COPY") @@ -201,10 +185,6 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ files: [NKFile]?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } var files: [NKFile] = [] var serverUrlFileName = serverUrlFileName /// @@ -212,7 +192,7 @@ public extension NextcloudKit { /// guard let nkSession = nkCommonInstance.getSession(account: account), let url = serverUrlFileName.encodedToUrl, - var headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + var headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } if depth == "0", serverUrlFileName.last == "/" { @@ -376,15 +356,11 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ files: [NKFile]?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } /// options.contentType = "application/xml" /// guard let nkSession = nkCommonInstance.getSession(account: account), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } var files: [NKFile] = [] @@ -429,15 +405,11 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } /// options.contentType = "application/xml" /// guard let nkSession = nkCommonInstance.getSession(account: account), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, .urlError) } } let serverUrlFileName = nkSession.urlBase + "/" + nkSession.dav + "/files/" + nkSession.userId + "/" + fileName @@ -479,15 +451,11 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ files: [NKFile]?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } /// options.contentType = "application/xml" /// guard let nkSession = nkCommonInstance.getSession(account: account), - let headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + let headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } let serverUrlFileName = nkSession.urlBase + "/" + nkSession.dav + "/files/" + nkSession.userId @@ -534,15 +502,11 @@ public extension NextcloudKit { options: NKRequestOptions = NKRequestOptions(), taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in }, completion: @escaping (_ account: String, _ items: [NKTrash]?, _ responseData: AFDataResponse?, _ error: NKError) -> Void) { - var checkUnauthorized = true - if let optionsCheckUnauthorized = options.checkUnauthorized { - checkUnauthorized = optionsCheckUnauthorized - } /// options.contentType = "application/xml" /// guard let nkSession = nkCommonInstance.getSession(account: account), - var headers = nkCommonInstance.getStandardHeaders(account: account, checkUnauthorized: checkUnauthorized, options: options) else { + var headers = nkCommonInstance.getStandardHeaders(account: account, options: options) else { return options.queue.async { completion(account, nil, nil, .urlError) } } var serverUrlFileName = nkSession.urlBase + "/" + nkSession.dav + "/trashbin/" + nkSession.userId + "/trash/" diff --git a/Sources/NextcloudKit/NextcloudKitBackground.swift b/Sources/NextcloudKit/NextcloudKitBackground.swift index 2a80b817..7a33ec87 100644 --- a/Sources/NextcloudKit/NextcloudKitBackground.swift +++ b/Sources/NextcloudKit/NextcloudKitBackground.swift @@ -17,32 +17,39 @@ public final class NKBackground: NSObject, URLSessionTaskDelegate, URLSessionDel public func download(serverUrlFileName: Any, fileNameLocalPath: String, taskDescription: String? = nil, - account: String) -> URLSessionDownloadTask? { + account: String) -> (URLSessionDownloadTask?, error: NKError) { var url: URL? let groupDefaults = UserDefaults(suiteName: NextcloudKit.shared.nkCommonInstance.groupIdentifier) + /// Check error in groupDefaults + if let array = groupDefaults?.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnauthorized) as? [String], + array.contains(account) { + return (nil, .unauthorizedError) + } else if let array = groupDefaults?.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnavailable) as? [String], + array.contains(account) { + return (nil, .unavailableError) + } else if let array = groupDefaults?.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsToS) as? [String], + array.contains(account) { + return (nil, .forbiddenError) + } + if serverUrlFileName is URL { url = serverUrlFileName as? URL } else if serverUrlFileName is String || serverUrlFileName is NSString { url = (serverUrlFileName as? String)?.encodedToUrl as? URL } - if let unauthorizedArray = groupDefaults?.array(forKey: "Unauthorized") as? [String], - unauthorizedArray.contains(account) { - return nil - } - guard let nkSession = nkCommonInstance.getSession(account: account), let urlForRequest = url else { - return nil + return (nil, .urlError) } var request = URLRequest(url: urlForRequest) let loginString = "\(nkSession.user):\(nkSession.password)" guard let loginData = loginString.data(using: String.Encoding.utf8) else { - return nil + return (nil, .invalidData) } let base64LoginString = loginData.base64EncodedString() @@ -54,7 +61,7 @@ public final class NKBackground: NSObject, URLSessionTaskDelegate, URLSessionDel task.resume() self.nkCommonInstance.writeLog("Network start download file: \(serverUrlFileName)") - return task + return (task, .success) } // MARK: - Upload @@ -66,32 +73,39 @@ public final class NKBackground: NSObject, URLSessionTaskDelegate, URLSessionDel taskDescription: String? = nil, overwrite: Bool = false, account: String, - sessionIdentifier: String) -> URLSessionUploadTask? { + sessionIdentifier: String) -> (URLSessionUploadTask?, error: NKError) { var url: URL? var uploadSession: URLSession? let groupDefaults = UserDefaults(suiteName: NextcloudKit.shared.nkCommonInstance.groupIdentifier) + /// Check error in groupDefaults + if let array = groupDefaults?.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnauthorized) as? [String], + array.contains(account) { + return (nil, .unauthorizedError) + } else if let array = groupDefaults?.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsUnavailable) as? [String], + array.contains(account) { + return (nil, .unavailableError) + } else if let array = groupDefaults?.array(forKey: NextcloudKit.shared.nkCommonInstance.groupDefaultsToS) as? [String], + array.contains(account) { + return (nil, .forbiddenError) + } + if serverUrlFileName is URL { url = serverUrlFileName as? URL } else if serverUrlFileName is String || serverUrlFileName is NSString { url = (serverUrlFileName as? String)?.encodedToUrl as? URL } - if let unauthorizedArray = groupDefaults?.array(forKey: "Unauthorized") as? [String], - unauthorizedArray.contains(account) { - return nil - } - guard let nkSession = nkCommonInstance.getSession(account: account), let urlForRequest = url else { - return nil + return (nil, .urlError) } var request = URLRequest(url: urlForRequest) let loginString = "\(nkSession.user):\(nkSession.password)" guard let loginData = loginString.data(using: String.Encoding.utf8) else { - return nil + return (nil, .invalidData) } let base64LoginString = loginData.base64EncodedString() @@ -122,7 +136,8 @@ public final class NKBackground: NSObject, URLSessionTaskDelegate, URLSessionDel task?.taskDescription = taskDescription task?.resume() self.nkCommonInstance.writeLog("Network start upload file: \(serverUrlFileName)") - return task + + return (task, .success) } // MARK: - SessionDelegate