Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import Shout
import Socket
import Keychain
import Foundation
import DependencyInjection
public struct SFTPServiceBackupDownloader {
public var download: (String, @escaping SFTPDownloadResult) -> Void
public func callAsFunction(path: String, completion: @escaping SFTPDownloadResult) {
download(path, completion)
}
}
extension SFTPServiceBackupDownloader {
static let mock = SFTPServiceBackupDownloader { path, _ in
print("^^^ Requested backup download on sftp service.")
print("^^^ Path: \(path)")
}
static let live = SFTPServiceBackupDownloader { path, completion in
DispatchQueue.global().async {
do {
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()
let localURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.elixxir.messenger")!
.appendingPathComponent("sftp")
try sftp.download(remotePath: path, localURL: localURL)
let data = try Data(contentsOf: localURL)
completion(.success(data))
} catch {
completion(.failure(error))
if var error = error as? SSHError {
print(error.kind)
print(error.message)
print(error.description)
} else {
print(error.localizedDescription)
}
}
}
}
}