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