diff --git a/Sources/BackupFeature/Service/BackupService.swift b/Sources/BackupFeature/Service/BackupService.swift index b914322433260bbb798de1d18ad4712043f6415b..f1fbd846aba16df20f632a67d66b29d0a7b5d4e5 100644 --- a/Sources/BackupFeature/Service/BackupService.swift +++ b/Sources/BackupFeature/Service/BackupService.swift @@ -2,6 +2,7 @@ import UIKit import Models import Combine import Defaults +import Keychain import SFTPFeature import iCloudFeature import DropboxFeature @@ -14,6 +15,7 @@ public final class BackupService { @Dependency private var icloudService: iCloudInterface @Dependency private var dropboxService: DropboxInterface @Dependency private var networkManager: NetworkMonitoring + @Dependency private var keychainHandler: KeychainHandling @Dependency private var driveService: GoogleDriveInterface @KeyObject(.backupSettings, defaultValue: Data()) private var storedSettings: Data @@ -207,25 +209,25 @@ extension BackupService { } if sftpService.isAuthorized() { - let host = "" - let username = "" - let password = "" - - let completion: SFTPFetchResult = { result in - switch result { - case .success(let settings): - if let settings = settings { - print("") - } else { - print("") + if let keychain = try? DependencyInjection.Container.shared.resolve() as KeychainHandling, + let pwd = try? keychain.get(key: .pwd), + let host = try? keychain.get(key: .host), + let username = try? keychain.get(key: .username) { + + let completion: SFTPFetchResult = { [weak settings] result in + guard let settings = settings else { return } + + switch result { + case .success(let backupSettings): + settings.value.backups[.sftp] = backupSettings?.backup + case .failure(let error): + print(error.localizedDescription) } - case .failure(let error): - print(error.localizedDescription) } - } - let authParams = SFTPAuthParams(host, username, password) - sftpService.fetch((authParams, completion)) + let authParams = SFTPAuthParams(host, username, pwd) + sftpService.fetch((authParams, completion)) + } } if dropboxService.isAuthorized() { @@ -326,7 +328,11 @@ extension BackupService { // try? FileManager.default.removeItem(at: url) } case .sftp: - break // TODO + do { + try sftpService.upload(url) + } catch { + print(error.localizedDescription) + } } } } diff --git a/Sources/NetworkMonitor/MockNetworkMonitor.swift b/Sources/NetworkMonitor/MockNetworkMonitor.swift index 473eb593ece68fd213a4896abe9a74eb3c23d286..30bf846df9e36359ed80a7572a966e56091dce4d 100644 --- a/Sources/NetworkMonitor/MockNetworkMonitor.swift +++ b/Sources/NetworkMonitor/MockNetworkMonitor.swift @@ -32,11 +32,11 @@ public struct MockNetworkMonitor: NetworkMonitoring { statusRelay.send(status) if status == .available { - DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + DispatchQueue.main.asyncAfter(deadline: .now() + 10) { simulateOscilation(.internetNotAvailable) } } else if status == .internetNotAvailable { - DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + DispatchQueue.main.asyncAfter(deadline: .now() + 5) { simulateOscilation(.available) } } diff --git a/Sources/SFTPFeature/SFTPService.swift b/Sources/SFTPFeature/SFTPService.swift index 3bb8c0620c70c0d3a84c6e627e64be9e7f484556..b581362e754acd3a4c2166cd470d52eac6da4989 100644 --- a/Sources/SFTPFeature/SFTPService.swift +++ b/Sources/SFTPFeature/SFTPService.swift @@ -10,6 +10,7 @@ public typealias SFTPFetchParams = (SFTPAuthParams, SFTPFetchResult) public struct SFTPService { public var isAuthorized: () -> Bool + public var upload: (URL) throws -> Void public var fetch: (SFTPFetchParams) -> Void public var download: (String) throws -> Void public var justAuthenticate: (SFTPAuthParams) throws -> Void @@ -18,15 +19,29 @@ public struct SFTPService { public extension SFTPService { static var mock = SFTPService( isAuthorized: { - true + print("^^^ Requested auth status on sftp service") + return true + }, + upload: { url in + print("^^^ Requested upload on sftp service") + print("^^^ URL path: \(url.path)") }, fetch: { (authParams, completion) in + print("^^^ Requested backup metadata on sftp service.") + print("^^^ Host: \(authParams.0)") + print("^^^ Username: \(authParams.1)") + print("^^^ Password: \(authParams.2)") completion(.success(nil)) }, download: { path in - + print("^^^ Requested backup download on sftp service.") + print("^^^ Path: \(path)") }, justAuthenticate: { host, username, password in + print("^^^ Requested to authenticate on sftp service") + print("^^^ Host: \(host)") + print("^^^ Username: \(username)") + print("^^^ Password: \(password)") }) static var live = SFTPService( @@ -40,6 +55,18 @@ public extension SFTPService { return false } }, + upload: { url in + let keychain = try DependencyInjection.Container.shared.resolve() as KeychainHandling + let host = try keychain.get(key: .host) + let password = try keychain.get(key: .pwd) + let username = try keychain.get(key: .username) + + let ssh = try SSH(host: host!, port: 22) + try ssh.authenticate(username: username!, password: password!) + let sftp = try ssh.openSftp() + + try sftp.upload(localURL: url, remotePath: "backup/backup.xxm") + }, fetch: { (authParams, completion) in let host = authParams.0 let username = authParams.1