Skip to content
Snippets Groups Projects
Commit 08fe999a authored by Bruno Muniz's avatar Bruno Muniz :apple:
Browse files

Merge branch 'sftp' of git.xx.network:elixxir/client-ios into sftp

parents ad04d114 0830eab9
No related branches found
No related tags found
2 merge requests!54Releasing 1.1.4,!42Adding SFTP as a service to backup/restore
......@@ -463,7 +463,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.1.3;
MARKETING_VERSION = 1.1.2;
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.3;
MARKETING_VERSION = 1.1.2;
OTHER_SWIFT_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = xx.messenger;
PRODUCT_NAME = "$(TARGET_NAME)";
......
<?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>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>
<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>
</plist>
import UIKit
import Shared
import Combine
public final class OutlinedInputField: UIView {
private let stackView = UIStackView()
private let textField = UITextField()
private let placeholderLabel = UILabel()
private let inputContainerView = UIView()
private let secureInputButton = SecureInputButton()
public var textPublisher: AnyPublisher<String, Never> {
textField.textPublisher
}
public init() {
super.init(frame: .zero)
layer.borderWidth = 1.0
layer.cornerRadius = 4.0
layer.masksToBounds = true
layer.borderColor = Asset.neutralWeak.color.cgColor
textField.delegate = self
textField.backgroundColor = .clear
placeholderLabel.textColor = Asset.neutralWeak.color
placeholderLabel.font = Fonts.Mulish.regular.font(size: 16.0)
secureInputButton.button.addTarget(self, action: #selector(didTapRight), for: .touchUpInside)
inputContainerView.addSubview(placeholderLabel)
inputContainerView.addSubview(textField)
stackView.addArrangedSubview(inputContainerView)
stackView.addArrangedSubview(secureInputButton)
addSubview(stackView)
placeholderLabel.snp.makeConstraints {
$0.top.equalToSuperview().offset(15)
$0.left.equalToSuperview().offset(15)
$0.right.lessThanOrEqualToSuperview().offset(-15)
$0.bottom.equalToSuperview().offset(-18)
}
textField.snp.makeConstraints {
$0.top.equalToSuperview().offset(15)
$0.left.equalToSuperview().offset(15)
$0.right.equalToSuperview().offset(-15)
$0.bottom.equalToSuperview().offset(-18)
}
stackView.snp.makeConstraints {
$0.edges.equalToSuperview()
}
}
required init?(coder: NSCoder) { nil }
public func setup(title: String, sensitive: Bool = false) {
placeholderLabel.text = title
textField.isSecureTextEntry = sensitive
secureInputButton.isHidden = !sensitive
}
@objc private func didTapRight() {
textField.isSecureTextEntry.toggle()
secureInputButton.setSecure(textField.isSecureTextEntry)
}
}
extension OutlinedInputField: UITextFieldDelegate {
public func textField(
_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String
) -> Bool {
placeholderLabel.alpha = (textField.text! as NSString)
.replacingCharacters(in: range, with: string)
.count > 0 ? 0.0 : 1.0
return true
}
}
import UIKit
import Shared
final class SecureInputButton: UIView {
private(set) var button = UIButton()
private let color = Asset.neutralSecondaryAlternative.color
private lazy var openedImage = Asset.eyeOpen.image.withTintColor(color)
private lazy var closedImage = Asset.eyeClosed.image.withTintColor(color)
init() {
super.init(frame: .zero)
button.setContentCompressionResistancePriority(.required, for: .horizontal)
button.setImage(Asset.eyeClosed.image.withTintColor(color), for: .normal)
addSubview(button)
button.snp.makeConstraints {
$0.top.equalToSuperview()
$0.left.equalToSuperview().offset(10)
$0.right.equalToSuperview().offset(-10)
$0.bottom.equalToSuperview()
}
}
required init?(coder: NSCoder) { nil }
func setSecure(_ bool: Bool) {
button.setImage(bool ? closedImage : openedImage, for: .normal)
}
}
-----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-----
[PLACE THE CERTIFICATE CONTENT HERE]
......@@ -5,9 +5,9 @@ import InputField
final class SFTPView: UIView {
let titleLabel = UILabel()
let subtitleLabel = UILabel()
let hostField = InputField()
let usernameField = InputField()
let passwordField = InputField()
let hostField = OutlinedInputField()
let usernameField = OutlinedInputField()
let passwordField = OutlinedInputField()
let loginButton = CapsuleButton()
let stackView = UIStackView()
......@@ -34,21 +34,9 @@ final class SFTPView: UIView {
subtitleLabel.numberOfLines = 0
subtitleLabel.attributedText = attString
hostField.setup(
style: .regular,
placeholder: Localized.AccountRestore.Sftp.host
)
usernameField.setup(
style: .regular,
placeholder: Localized.AccountRestore.Sftp.username
)
passwordField.setup(
style: .regular,
placeholder: Localized.AccountRestore.Sftp.password,
rightView: .toggleSecureEntry
)
hostField.setup(title: Localized.AccountRestore.Sftp.host)
usernameField.setup(title: Localized.AccountRestore.Sftp.username)
passwordField.setup(title: Localized.AccountRestore.Sftp.password, sensitive: true)
loginButton.set(style: .brandColored, title: Localized.AccountRestore.Sftp.login)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment