diff --git a/GMERemittance/Module/Login/User Interface/View/LoginViewController.swift b/GMERemittance/Module/Login/User Interface/View/LoginViewController.swift index f641acee..e8b9ebe5 100644 --- a/GMERemittance/Module/Login/User Interface/View/LoginViewController.swift +++ b/GMERemittance/Module/Login/User Interface/View/LoginViewController.swift @@ -50,22 +50,17 @@ class LoginViewController: UIViewController { @IBOutlet weak var logoImageView: UIImageView! @IBOutlet weak var loginButton: UIButton! - - // keyboard - var mQwertyTransKeyView : TransKeyView? - var mNumberTransKeyView : TransKeyView? - - var secureKey : NSData! - var encryptedPassword : String? - - var numberCipherString : String! - var qwertyCipherString : String! - - var isTranskeyShowing : Bool! - var isShowQwerty : Bool! = true - var isShowNumber : Bool! - - + var encryptedPassword : String? { + didSet { + guard + let email = self.userNameTextField.text, + let pw = self.encryptedPassword, + email != "", pw != "" else {return} + + self.login(UIButton()) + } + } + // MARK: Properties var presenter: LoginModuleInterface? @@ -81,17 +76,10 @@ class LoginViewController: UIViewController { override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) - mQwertyTransKeyView?.mTK_ClearDelegateSubviews() - mNumberTransKeyView?.mTK_ClearDelegateSubviews() - if isTranskeyShowing == false { - mQwertyTransKeyView?.delegate = nil; - mNumberTransKeyView?.delegate = nil; - } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - self.setupKeyboard() } @@ -127,8 +115,6 @@ class LoginViewController: UIViewController { // showAnimation() } - - func authenticateUser() { let context : LAContext = LAContext() var error: NSError? @@ -159,28 +145,7 @@ class LoginViewController: UIViewController { } } - func setupKeyboard() { - isShowNumber = false - isShowQwerty = true - isTranskeyShowing = false - let iv: Array = ["M", "o", "b", "i", "l", "e", "T", "r" , "a", "n", "s", "K", "e", "y", "1", "0"] - secureKey = NSData(bytes: iv, length: 16) - setQwertyTranskey() - // self.showQwertyTranskeyAction() - } - - func setQwertyTranskey() { - mQwertyTransKeyView = TransKeyView() - mQwertyTransKeyView?.mTK_Init(self) - mQwertyTransKeyView?.delegate = self - mQwertyTransKeyView?.mTK_MakeSecureKey() - mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortrait) - // ccr key - mQwertyTransKeyView?.mTK_LicenseCheck("license_mtranskey") - } - private func configureLanguage() { - // Localize.setCurrentLanguage("en") self.headerTitle.text = StringConstants().headerTitle self.subtitle.text = StringConstants().subHeaderTitle self.userIdTitleLabel.text = "email_text".localized() @@ -270,20 +235,13 @@ class LoginViewController: UIViewController { let isUseBiometricAuth = KeyChain.shared.get(key: .biometricAuth), email == typedEmail, isUseBiometricAuth == "1" else { - self.showQwertyTranskeyAction() + let secureKeypad = SecureKeypad(target: self) + secureKeypad.delegate = self + secureKeypad.present(animated: true) return } BiometricAuthenticationWireframe().openWithDelegate(on: self, delegate: self) - - // guard let email = self.userNameTextField.text, - // let isUseBiometricAuth = UserKeychain(email: email).isUseBiometricAuth, - // isUseBiometricAuth, - // let password = UserKeychain.default.encryptedPassword, password != "" else { - // self.showQwertyTranskeyAction() - // return - // } - // BiometricAuthenticationWireframe().openWithDelegate(on: self, delegate: self) } } @@ -302,77 +260,7 @@ extension LoginViewController: LoginViewInterface { } } - -extension LoginViewController: TransKeyViewDelegate { - func secureInputFinish(_ type: Int) { - var targetView : TransKeyView? - if isShowQwerty == true { - qwertyCipherString = mQwertyTransKeyView?.mTK_GetSecureData() - targetView = mQwertyTransKeyView - if mQwertyTransKeyView?.mTK_GetDataLength() == 0 { - self.encryptedPassword = "" - self.passwordTextField.text = "" - }else { - self.encryptedPassword = qwertyCipherString - self.passwordTextField.text = "password" - - } - } - - isShowQwerty = false - isShowNumber = false - isTranskeyShowing = false - targetView?.dismiss(animated: true, completion: { - guard let email = self.userNameTextField.text, let pw = self.encryptedPassword, - email != "", pw != "" else {return} - - self.login(UIButton()) - }) - } - - func showQwertyTranskeyAction(){ - if mQwertyTransKeyView?.isBeingPresented == false { - isShowQwerty = true - isTranskeyShowing = true - - let hintStr = String(format:"password", 0) - let font = UIFont(name: "Arial", size: 15) - - mQwertyTransKeyView?.mTK_SetHint(hintStr, font: font) - mQwertyTransKeyView?.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.") - mQwertyTransKeyView?.mTK_UseCursor(true) - mQwertyTransKeyView?.mTK_UseAllDeleteButton(true) - mQwertyTransKeyView?.mTK_UseNavigationBar(true) - mQwertyTransKeyView?.mTK_UseVoiceOver(true) - mQwertyTransKeyView?.mTK_setHideInputPasswordDelay(3) - mQwertyTransKeyView?.mTK_SetControlCenter(false) - mQwertyTransKeyView?.mTK_setIgnoreStatusbar(false) - - mQwertyTransKeyView?.mTK_UseShiftOptional(true) - - // mQwertyTransKeyView?.mTK_SetLanguage(1) - mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape) - - mQwertyTransKeyView?.setKeyboardType(self, - keypadType: 0, - mTK_inputType: 2, - mTK_inputTitle: "password", - mTK_cryptType: 0, - mTK_maxLength: 100, - mTK_minLength: 0, - mTK_keypadUpper: false, - mTK_languageType: 1) - mQwertyTransKeyView?.mTK_EnableSamekeyInputDataEncrypt(true) - mQwertyTransKeyView?.mTK_SetUseBalloonImageButton(true) - if let mQwertyTransKeyView = mQwertyTransKeyView { - self.present(mQwertyTransKeyView, animated: true, completion: nil) - } - } - } - -} - - +// MARK: - UITextFieldDelegate extension LoginViewController: UITextFieldDelegate { func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { if textField == passwordTextField { @@ -390,6 +278,8 @@ extension LoginViewController: UITextFieldDelegate { } } + +// MARK: - BiometricAuthenticationViewControllerDelegate extension LoginViewController: BiometricAuthenticationViewControllerDelegate { func viewController(_ viewController: BiometricAuthenticationViewController, informationTitleLabel titleLabel: UILabel, authenticationButton button: UIButton) { titleLabel.text = "Please enter authentication information for login" @@ -409,8 +299,10 @@ extension LoginViewController: BiometricAuthenticationViewControllerDelegate { switch error { case .userFallback, .biometryNotAvailable: - viewController.dismiss(animated: true){ - self.showQwertyTranskeyAction() + viewController.dismiss(animated: true) { + let secureKeypad = SecureKeypad(target: viewController) + secureKeypad.delegate = self + secureKeypad.present(animated: true) } case .notBeConfigured, .biometryNotEnrolled: @@ -430,3 +322,13 @@ extension LoginViewController: BiometricAuthenticationViewControllerDelegate { } } + +// MARK: - SecureKeypadDelegate +extension LoginViewController: SecureKeypadDelegate { + func didComplete(_ encryptedString: String) { + if encryptedString != "" { + self.encryptedPassword = encryptedString + self.passwordTextField.text = "password" + } + } +} diff --git a/GMERemittance/Utility/SecureKeypad.swift b/GMERemittance/Utility/SecureKeypad.swift index 17200331..ac711ff0 100644 --- a/GMERemittance/Utility/SecureKeypad.swift +++ b/GMERemittance/Utility/SecureKeypad.swift @@ -9,184 +9,184 @@ import Foundation protocol SecureKeypadDelegate: class { - func didComplete(_ encryptedString: String) + func didComplete(_ encryptedString: String) } enum SecureKeypadType { - case ascii - case numberic + case ascii + case numberic } class SecureKeypad: NSObject { - - weak var delegate: SecureKeypadDelegate? - - var title = "" { - didSet { - self.updateUI() - } + + weak var delegate: SecureKeypadDelegate? + + var title = "Enter Your GME Password" { + didSet { + self.updateUI() } - var placeholder = "" { - didSet { - self.updateUI() - } + } + var placeholder = "Enter Your GME Password" { + didSet { + self.updateUI() } - - var placeholderFont: UIFont? = .systemFont(ofSize: 17) { - didSet { - self.updateUI() - } + } + + var placeholderFont: UIFont? = UIFont(name: "SanFranciscoDisplay-Regular", size: 15) { + didSet { + self.updateUI() } - - private lazy var asciiKeypad = TransKeyView() - private lazy var numberPad = TransKeyView() - - private var target: UIViewController! - private var keypadType: SecureKeypadType = .ascii - - private var encryptedString = "" - - init(target: UIViewController, keypadType: SecureKeypadType = .ascii) { - super.init() - - self.target = target - self.keypadType = keypadType - self.initKeypad() - + } + + private lazy var asciiKeypad = TransKeyView() + private lazy var numberPad = TransKeyView() + + private var target: UIViewController! + private var keypadType: SecureKeypadType = .ascii + + private var encryptedString = "" + + init(target: UIViewController, keypadType: SecureKeypadType = .ascii) { + super.init() + + self.target = target + self.keypadType = keypadType + self.initKeypad() + + } + + deinit { + self.asciiKeypad.mTK_ClearDelegateSubviews() + self.numberPad.mTK_ClearDelegateSubviews() + self.asciiKeypad.delegate = nil; + self.numberPad.delegate = nil; + } + + func present(animated: Bool, completion: (() -> Void)? = nil) { + let vc: TransKeyView + + switch keypadType { + case .ascii: + vc = self.asciiKeypad + case .numberic: + vc = self.numberPad } - deinit { - self.asciiKeypad.mTK_ClearDelegateSubviews() - self.numberPad.mTK_ClearDelegateSubviews() - self.asciiKeypad.delegate = nil; - self.numberPad.delegate = nil; + self.target.present(vc, animated: true, completion: completion) + } + + + + private func updateUI() { + switch self.keypadType { + case .ascii: + self.updateASCIIUI() + case .numberic: + self.updateNumber() } - - func present(animated: Bool, completion: (() -> Void)? = nil) { - let vc: TransKeyView - - switch keypadType { - case .ascii: - vc = self.asciiKeypad - case .numberic: - vc = self.numberPad - } - - self.target.present(vc, animated: true, completion: completion) + } + + private func initKeypad(){ + switch self.keypadType { + case .ascii: + self.initASCIIKeypad() + self.updateASCIIUI() + case.numberic: + //TODO: Numberic keypad + self.initNumberKeypad() + self.updateNumber() + break } + } + + + /// init ASCII keypad + private func initASCIIKeypad() { + asciiKeypad.mTK_Init(self) + asciiKeypad.delegate = self + asciiKeypad.mTK_MakeSecureKey() + asciiKeypad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.") + asciiKeypad.mTK_UseCursor(true) + asciiKeypad.mTK_UseAllDeleteButton(true) + asciiKeypad.mTK_UseNavigationBar(true) + asciiKeypad.mTK_UseVoiceOver(true) + asciiKeypad.mTK_setHideInputPasswordDelay(3) + asciiKeypad.mTK_SetControlCenter(false) + asciiKeypad.mTK_setIgnoreStatusbar(false) + asciiKeypad.mTK_UseShiftOptional(true) + asciiKeypad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape) + asciiKeypad.mTK_EnableSamekeyInputDataEncrypt(true) + asciiKeypad.mTK_SetUseBalloonImageButton(true) + asciiKeypad.mTK_LicenseCheck("license_mtranskey") + } + + /// update ASCII UI + private func updateASCIIUI() { + asciiKeypad.mTK_SetHint(self.placeholder, font: self.placeholderFont) + asciiKeypad.setKeyboardType( + self, + keypadType: 0, + mTK_inputType: 2, + mTK_inputTitle: self.title, + mTK_cryptType: 0, + mTK_maxLength: 100, + mTK_minLength: 0, + mTK_keypadUpper: false, + mTK_languageType: 1 + ) + } + + private func initNumberKeypad(){ + numberPad.mTK_Init(self) + numberPad.delegate = self + numberPad.mTK_MakeSecureKey() + numberPad.mTK_LicenseCheck("license_mtranskey") + numberPad.mTK_ShowMessageIfMinLength("0자리 이상 입력해주세요.") + numberPad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.") + numberPad.mTK_UseVoiceOver(false) + numberPad.mTK_setIgnoreStatusbar(false) + numberPad.mTK_SetControlCenter(false) + numberPad.mTK_UseAllDeleteButton(false) + numberPad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape) + } + + private func updateNumber(){ + numberPad.mTK_SetHint(self.placeholder, font: self.placeholderFont) + numberPad.setKeyboardType( + self, + keypadType: TransKeyKeypadTypeText, + mTK_inputType: 2, + mTK_inputTitle: self.title, + mTK_cryptType: 0, + mTK_maxLength: 16, + mTK_minLength: 0, + mTK_keypadUpper: false, + mTK_languageType: Int(mTK_Language_English.rawValue) + ) + } +} + +extension SecureKeypad: TransKeyViewDelegate { + func secureInputFinish(_ type: Int) { + let vc: TransKeyView - - private func updateUI() { - switch self.keypadType { - case .ascii: - self.updateASCIIUI() - case .numberic: - self.updateNumber() - } - } - - private func initKeypad(){ - switch self.keypadType { - case .ascii: - self.initASCIIKeypad() - self.updateASCIIUI() - case.numberic: - //TODO: Numberic keypad - self.initNumberKeypad() - self.updateNumber() - break - } + switch keypadType { + case .ascii: + vc = self.asciiKeypad + case .numberic: + vc = self.numberPad } + self.encryptedString = vc.mTK_GetSecureData() - /// init ASCII keypad - private func initASCIIKeypad() { - asciiKeypad.mTK_Init(self) - asciiKeypad.delegate = self - asciiKeypad.mTK_MakeSecureKey() - asciiKeypad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.") - asciiKeypad.mTK_UseCursor(true) - asciiKeypad.mTK_UseAllDeleteButton(true) - asciiKeypad.mTK_UseNavigationBar(true) - asciiKeypad.mTK_UseVoiceOver(true) - asciiKeypad.mTK_setHideInputPasswordDelay(3) - asciiKeypad.mTK_SetControlCenter(false) - asciiKeypad.mTK_setIgnoreStatusbar(false) - asciiKeypad.mTK_UseShiftOptional(true) - asciiKeypad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape) - asciiKeypad.mTK_EnableSamekeyInputDataEncrypt(true) - asciiKeypad.mTK_SetUseBalloonImageButton(true) - asciiKeypad.mTK_LicenseCheck("license_mtranskey") + if vc.mTK_GetDataLength() == 0 { + self.encryptedString = "" } - /// update ASCII UI - private func updateASCIIUI() { - asciiKeypad.mTK_SetHint(self.placeholder, font: self.placeholderFont) - asciiKeypad.setKeyboardType( - self, - keypadType: 0, - mTK_inputType: 2, - mTK_inputTitle: self.title, - mTK_cryptType: 0, - mTK_maxLength: 100, - mTK_minLength: 0, - mTK_keypadUpper: false, - mTK_languageType: 1 - ) - } - private func initNumberKeypad(){ - numberPad.mTK_Init(self) - numberPad.delegate = self - numberPad.mTK_MakeSecureKey() - numberPad.mTK_LicenseCheck("license_mtranskey") - numberPad.mTK_ShowMessageIfMinLength("0자리 이상 입력해주세요.") - numberPad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.") - numberPad.mTK_UseVoiceOver(false) - numberPad.mTK_setIgnoreStatusbar(false) - numberPad.mTK_SetControlCenter(false) - numberPad.mTK_UseAllDeleteButton(false) - numberPad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape) - } - - private func updateNumber(){ - numberPad.mTK_SetHint(self.placeholder, font: self.placeholderFont) - numberPad.setKeyboardType( - self, - keypadType: TransKeyKeypadTypeText, - mTK_inputType: 2, - mTK_inputTitle: self.title, - mTK_cryptType: 0, - mTK_maxLength: 16, - mTK_minLength: 0, - mTK_keypadUpper: false, - mTK_languageType: Int(mTK_Language_English.rawValue) - ) - } -} - -extension SecureKeypad: TransKeyViewDelegate { - func secureInputFinish(_ type: Int) { - - let vc: TransKeyView - - switch keypadType { - case .ascii: - vc = self.asciiKeypad - case .numberic: - vc = self.numberPad - } - - self.encryptedString = vc.mTK_GetSecureData() - - if vc.mTK_GetDataLength() == 0 { - self.encryptedString = "" - } - - - vc.dismiss(animated: true){ - self.delegate?.didComplete(self.encryptedString) - } + vc.dismiss(animated: true){ + self.delegate?.didComplete(self.encryptedString) } + } }