diff --git a/App/client-ios.xcodeproj/project.pbxproj b/App/client-ios.xcodeproj/project.pbxproj index 9ffb59c7aba66820aaf2a22dbf6b6c8e041cff8c..a53447203940e01cd7625f227f3e9e18d47200cb 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 03e09469daae0502a5202f6e63aca9db140d1d77..676030ed57400f2bf5a72dc61d4ba5ed3e5263cb 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 6aac71d4e5c02c661c719db62816662286f9c308..7c6feb9f10688bc0d34726aec2479c8174438484 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 40045d63666dded7450e22eb82c15b62a17d4d68..096e3b5cda98b012d892d6531ab1a4696d13a457 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 4588630a1bc561ac5abd0c17a2c2ab07e8076850..4a5f22f2bdca94a16f23f126d8b41f88c1dcdbe2 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 1d86eabc20a3bb6b21eaea30f942c2a2323e089b..301ad92afe128971bb38b7099aafce4081c85625 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 5ccb14adf258de9650a38aec59262ee43173dff3..47b8c5423ef6819859ab699320a5593b880fbc13 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 0000000000000000000000000000000000000000..f429f25140050c8cee4aec38ad66247ef99eb40d --- /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 + } +}