From ad04d11415262afea37bbc637b3bdf65c9840b66 Mon Sep 17 00:00:00 2001
From: Bruno Muniz Azevedo Filho <bruno@elixxir.io>
Date: Tue, 5 Jul 2022 04:38:14 -0300
Subject: [PATCH] Working on the SFTP 3rd party

---
 App/client-ios.xcodeproj/project.pbxproj      |  4 +-
 .../Resources/GoogleService-Info.plist        | 64 +++++++++----------
 .../Implementations/Bindings.swift            | 20 +++---
 .../Integration/Resources/cert_mainnet.txt    | 34 +++++++++-
 .../Controllers/RestoreListController.swift   |  2 +-
 .../ViewModels/RestoreListViewModel.swift     |  2 +-
 Sources/SFTPFeature/SFTPController.swift      | 36 +++++++++++
 Sources/SFTPFeature/SFTPViewModel.swift       | 56 ++++++++++++++++
 8 files changed, 171 insertions(+), 47 deletions(-)
 create mode 100644 Sources/SFTPFeature/SFTPViewModel.swift

diff --git a/App/client-ios.xcodeproj/project.pbxproj b/App/client-ios.xcodeproj/project.pbxproj
index 9ffb59c7..a5344720 100644
--- a/App/client-ios.xcodeproj/project.pbxproj
+++ b/App/client-ios.xcodeproj/project.pbxproj
@@ -463,7 +463,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.1.1;
+				MARKETING_VERSION = 1.1.3;
 				OTHER_SWIFT_FLAGS = "$(inherited)";
 				PRODUCT_BUNDLE_IDENTIFIER = xx.messenger.mock;
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -503,7 +503,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.1.1;
+				MARKETING_VERSION = 1.1.3;
 				OTHER_SWIFT_FLAGS = "";
 				PRODUCT_BUNDLE_IDENTIFIER = xx.messenger;
 				PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/App/client-ios/Resources/GoogleService-Info.plist b/App/client-ios/Resources/GoogleService-Info.plist
index 03e09469..676030ed 100644
--- a/App/client-ios/Resources/GoogleService-Info.plist
+++ b/App/client-ios/Resources/GoogleService-Info.plist
@@ -1,36 +1,36 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
-<dict>
-	<key>CLIENT_ID</key>
-	<string></string>
-	<key>REVERSED_CLIENT_ID</key>
-	<string></string>
-	<key>ANDROID_CLIENT_ID</key>
-	<string></string>
-	<key>API_KEY</key>
-	<string></string>
-	<key>GCM_SENDER_ID</key>
-	<string></string>
-	<key>PLIST_VERSION</key>
-	<string></string>
-	<key>BUNDLE_ID</key>
-	<string></string>
-	<key>PROJECT_ID</key>
-	<string></string>
-	<key>STORAGE_BUCKET</key>
-	<string></string>
-	<key>IS_ADS_ENABLED</key>
-	<false/>
-	<key>IS_ANALYTICS_ENABLED</key>
-	<false/>
-	<key>IS_APPINVITE_ENABLED</key>
-	<false/>
-	<key>IS_GCM_ENABLED</key>
-	<false/>
-	<key>IS_SIGNIN_ENABLED</key>
-	<false/>
-	<key>GOOGLE_APP_ID</key>
-	<string></string>
-</dict>
+    <dict>
+        <key>CLIENT_ID</key>
+        <string>662236151640-herpu89qikpfs9m4kvbi9bs5fpdji5de.apps.googleusercontent.com</string>
+        <key>REVERSED_CLIENT_ID</key>
+        <string>com.googleusercontent.apps.662236151640-herpu89qikpfs9m4kvbi9bs5fpdji5de</string>
+        <key>ANDROID_CLIENT_ID</key>
+        <string>662236151640-2ughgo2dvc59dm4o39b45lbdungp2mct.apps.googleusercontent.com</string>
+        <key>API_KEY</key>
+        <string>AIzaSyCbI2yQ7pbuVSRvraqanjGcS9CDrjD7lNU</string>
+        <key>GCM_SENDER_ID</key>
+        <string>662236151640</string>
+        <key>PLIST_VERSION</key>
+        <string>1</string>
+        <key>BUNDLE_ID</key>
+        <string>io.xxlabs.messenger</string>
+        <key>PROJECT_ID</key>
+        <string>xx-messenger-6e03e</string>
+        <key>STORAGE_BUCKET</key>
+        <string>xx-messenger-6e03e.appspot.com</string>
+        <key>IS_ADS_ENABLED</key>
+        <false></false>
+        <key>IS_ANALYTICS_ENABLED</key>
+        <false></false>
+        <key>IS_APPINVITE_ENABLED</key>
+        <true></true>
+        <key>IS_GCM_ENABLED</key>
+        <true></true>
+        <key>IS_SIGNIN_ENABLED</key>
+        <true></true>
+        <key>GOOGLE_APP_ID</key>
+        <string>1:662236151640:ios:24badb58ab07515d8cef2d</string>
+    </dict>
 </plist>
diff --git a/Sources/Integration/Implementations/Bindings.swift b/Sources/Integration/Implementations/Bindings.swift
index 6aac71d4..7c6feb9f 100644
--- a/Sources/Integration/Implementations/Bindings.swift
+++ b/Sources/Integration/Implementations/Bindings.swift
@@ -499,11 +499,11 @@ extension BindingsClient: BindingsInterface {
             fatalError("Couldn't retrieve cert.")
         }
 
-        try! udb!.setAlternative(
-            "18.198.117.203:11420".data(using: .utf8),
-            cert: try! Data(contentsOf: URL(fileURLWithPath: certPath)),
-            contactFile: try! Data(contentsOf: URL(fileURLWithPath: contactFilePath))
-        )
+//        try! udb!.setAlternative(
+//            "18.198.117.203:11420".data(using: .utf8),
+//            cert: try! Data(contentsOf: URL(fileURLWithPath: certPath)),
+//            contactFile: try! Data(contentsOf: URL(fileURLWithPath: contactFilePath))
+//        )
 
         guard let error = error else { return udb! }
         throw error.friendly()
@@ -525,11 +525,11 @@ extension BindingsClient: BindingsInterface {
             fatalError("Couldn't retrieve cert.")
         }
 
-        try! udb!.setAlternative(
-            "18.198.117.203:11420".data(using: .utf8),
-            cert: try! Data(contentsOf: URL(fileURLWithPath: certPath)),
-            contactFile: try! Data(contentsOf: URL(fileURLWithPath: contactFilePath))
-        )
+//        try! udb!.setAlternative(
+//            "18.198.117.203:11420".data(using: .utf8),
+//            cert: try! Data(contentsOf: URL(fileURLWithPath: certPath)),
+//            contactFile: try! Data(contentsOf: URL(fileURLWithPath: contactFilePath))
+//        )
 
         guard let error = error else { return udb! }
         throw error.friendly()
diff --git a/Sources/Integration/Resources/cert_mainnet.txt b/Sources/Integration/Resources/cert_mainnet.txt
index 40045d63..096e3b5c 100644
--- a/Sources/Integration/Resources/cert_mainnet.txt
+++ b/Sources/Integration/Resources/cert_mainnet.txt
@@ -1 +1,33 @@
-[PLACE THE CERTIFICATE CONTENT HERE]
+-----BEGIN CERTIFICATE-----
+MIIFqTCCA5GgAwIBAgIUO0qHXSeKrOMucO+Zz82Mf1Zlq4gwDQYJKoZIhvcNAQEL
+BQAwgYAxCzAJBgNVBAYTAktZMRQwEgYDVQQHDAtHZW9yZ2UgVG93bjETMBEGA1UE
+CgwKeHggbmV0d29yazEPMA0GA1UECwwGRGV2T3BzMRMwEQYDVQQDDAp4eC5uZXR3
+b3JrMSAwHgYJKoZIhvcNAQkBFhFhZG1pbnNAeHgubmV0d29yazAeFw0yMTEwMzAy
+MjI5MjZaFw0zMTEwMjgyMjI5MjZaMIGAMQswCQYDVQQGEwJLWTEUMBIGA1UEBwwL
+R2VvcmdlIFRvd24xEzARBgNVBAoMCnh4IG5ldHdvcmsxDzANBgNVBAsMBkRldk9w
+czETMBEGA1UEAwwKeHgubmV0d29yazEgMB4GCSqGSIb3DQEJARYRYWRtaW5zQHh4
+Lm5ldHdvcmswggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQD08ixnPWwz
+FtBIEWx2SnFjBsdrSWCp9NcWXRtGWeq3ACz+ixiflj/U9U4b57aULeOAvcoC7bwU
+j5w3oYxRmXIV40QSevx1z9mNcW3xbbacQ+yCgPPhhj3/c285gVVOUzURLBTNAi9I
+EA59zAb8Vy0E6zfq4HRAhH11Q/10QgDjEXuGXra1k3IlemVsouiJGNAtKojNDE1N
+x9HnraSEiXzdnV2GDplEvMHaLd3s9vs4XsiLB3VwKyHv7EH9+LOIra6pr5BWw+kD
+2qHKGmQMOQe0a7nCirW/k9axH0WiA0XWuQu3U1WfcMEfdC/xn1vtubrdYjtzpXUy
+oUEX5eHfu4OlA/zoH+trocfARDyBmTVbDy0P9imH//a6GUKDui9r3fXwEy5YPMhb
+dKaNc7QWLPHMh1n25h559z6PqxxPT6UqFFbZD2gTw1sbbpjyqhLbnYguurkxY3jZ
+ztW337hROzQ1/abbg/P59JA95Pmhkl8nqqDEf0buOmvMazq3Lwg92nuZ8gsdMKXB
+xaEtTTpxhTPOqzc1/XQgScZnc+092MBDh3C2GMxzylOIdk+yF2Gyb+VWPUe29dSa
+azzxsDXzRy8y8jaOjdSUWaLa/MgS5Dg1AfHtD55bdvqYzw3NEXIVarpMlzl+Z+6w
+jvuwz8GyoMSVe+YEGgvSDvlfY/z19aqneQIDAQABoxkwFzAVBgNVHREEDjAMggp4
+eC5uZXR3b3JrMA0GCSqGSIb3DQEBCwUAA4ICAQCp0JDub2w5vZQvFREyA+utZ/+s
+XT05j1iTgIRKMa3nofDGERYJUG7FcTd373I2baS70PGx8FF1QuXhn4DNNZlW/SZt
+pa1d0pAerqFrIzwOuWVDponYHQ8ayvsT7awCbwZEZE4RhooqS4LqnvtgFu/g7LuM
+zkFN8TER7HAUn3P7BujLvcgtqk2LMDz+AgBRszDp/Bw7+1EJDeG9d7hC/stXgDV/
+vpD1YDpxSmW4zjezFJqV6OdMOwo9RWVIktK3RXbFc6I5UJZ5kmzPe/I2oPPCBQvD
+G3VqFLQe5ik5rXP7SgAN1fL/7KuQna0s42hkV64Z2ymCX69G1ofpgpEFaQLaxLbj
+QOun0r8A3NyKvHRIh4K0dFcc3FSOF60Y6k769HKbOPmSDjSSg0qO9GEONBJ8BxAT
+IHcHoTAOQoqGehdzepXQSjHsPqTXv3ZFFwCCgO0toI0Qhqwo89X6R3k+i4Kaktr7
+mLiPO8s0nq1PZ1XrybKE9BCHkYH1JkUDA+M0pn4QAEx/BuM0QnGXoi1sImW3pEUG
+NP7fjkISrD48P8P/TLS45sx5pB8MNGEsRw0lBKmuOdWDmdfhOltB6JxmbhpstNZp
+6LVLK6SEOwE76xnHiisR2KyhTTiroUq73BgPFWkWhoJDPbmL1DHgnbdKwwstG8Qu
+UGb8k8vh6tzqYZAOKg==
+-----END CERTIFICATE-----
diff --git a/Sources/RestoreFeature/Controllers/RestoreListController.swift b/Sources/RestoreFeature/Controllers/RestoreListController.swift
index 4588630a..4a5f22f2 100644
--- a/Sources/RestoreFeature/Controllers/RestoreListController.swift
+++ b/Sources/RestoreFeature/Controllers/RestoreListController.swift
@@ -88,7 +88,7 @@ public final class RestoreListController: UIViewController {
         screenView.sftpButton
             .publisher(for: .touchUpInside)
             .sink { [unowned self] in
-                coordinator.toSFTP(from: self) //viewModel.didTapCloud(.sftp, from: self)
+                coordinator.toSFTP(from: self)
             }.store(in: &cancellables)
     }
 
diff --git a/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift b/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift
index 1d86eabc..301ad92a 100644
--- a/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift
+++ b/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift
@@ -34,7 +34,7 @@ final class RestoreListViewModel {
         case .dropbox:
             didRequestDropboxAuthorization(from: parent)
         case .sftp:
-            didRequestSFTPAuthorization()
+            break
         }
     }
 
diff --git a/Sources/SFTPFeature/SFTPController.swift b/Sources/SFTPFeature/SFTPController.swift
index 5ccb14ad..47b8c542 100644
--- a/Sources/SFTPFeature/SFTPController.swift
+++ b/Sources/SFTPFeature/SFTPController.swift
@@ -1,8 +1,12 @@
 import UIKit
+import Combine
 
 public final class SFTPController: UIViewController {
     lazy private var screenView = SFTPView()
 
+    private let viewModel = SFTPViewModel()
+    private var cancellables = Set<AnyCancellable>()
+
     public override func loadView() {
         view = screenView
     }
@@ -10,6 +14,7 @@ public final class SFTPController: UIViewController {
     public override func viewDidLoad() {
         super.viewDidLoad()
         setupNavigationBar()
+        setupBindings()
     }
 
     private func setupNavigationBar() {
@@ -23,6 +28,37 @@ public final class SFTPController: UIViewController {
         )
     }
 
+    private func setupBindings() {
+        screenView.hostField
+            .textPublisher
+            .receive(on: DispatchQueue.main)
+            .sink { [unowned self] in viewModel.didEnterHost($0) }
+            .store(in: &cancellables)
+
+        screenView.usernameField
+            .textPublisher
+            .receive(on: DispatchQueue.main)
+            .sink { [unowned self] in viewModel.didEnterUsername($0) }
+            .store(in: &cancellables)
+
+        screenView.passwordField
+            .textPublisher
+            .receive(on: DispatchQueue.main)
+            .sink { [unowned self] in viewModel.didEnterPassword($0) }
+            .store(in: &cancellables)
+
+        viewModel.statePublisher
+            .receive(on: DispatchQueue.main)
+            .map(\.isButtonEnabled)
+            .sink { [unowned self] in screenView.loginButton.isEnabled = $0 }
+            .store(in: &cancellables)
+
+        screenView.loginButton
+            .publisher(for: .touchUpInside)
+            .sink { [unowned self] in viewModel.didTapLogin() }
+            .store(in: &cancellables)
+    }
+
     @objc private func didTapBack() {
         navigationController?.popViewController(animated: true)
     }
diff --git a/Sources/SFTPFeature/SFTPViewModel.swift b/Sources/SFTPFeature/SFTPViewModel.swift
new file mode 100644
index 00000000..f429f251
--- /dev/null
+++ b/Sources/SFTPFeature/SFTPViewModel.swift
@@ -0,0 +1,56 @@
+import Combine
+import Foundation
+
+struct SFTPViewState {
+    var host: String = ""
+    var username: String = ""
+    var password: String = ""
+    var isButtonEnabled: Bool = false
+}
+
+final class SFTPViewModel {
+    var statePublisher: AnyPublisher<SFTPViewState, Never> {
+        stateSubject.eraseToAnyPublisher()
+    }
+
+    private let stateSubject = CurrentValueSubject<SFTPViewState, Never>(.init())
+
+    func didEnterHost(_ string: String) {
+        stateSubject.value.host = string
+        validate()
+    }
+
+    func didEnterUsername(_ string: String) {
+        stateSubject.value.username = string
+        validate()
+    }
+
+    func didEnterPassword(_ string: String) {
+        stateSubject.value.password = string
+        validate()
+    }
+
+    func didTapLogin() {
+
+
+//        do {
+//            let session = try SSH(host: stateSubject.value.host)
+//            try session.authenticate(
+//                username: stateSubject.value.username,
+//                password: stateSubject.value.password
+//            )
+//
+//            let sftp = try session.openSftp()
+//            try sftp.download(remotePath: "", localURL: URL(string: "")!)
+//        } catch {
+//            print(error.localizedDescription)
+//        }
+    }
+
+    private func validate() {
+        stateSubject.value.isButtonEnabled =
+        !stateSubject.value.host.isEmpty &&
+        !stateSubject.value.username.isEmpty &&
+        !stateSubject.value.password.isEmpty
+    }
+}
-- 
GitLab