// // ProfileChangePasswordViewController.swift // GMERemittance // // Created by Fm-user on 1/9/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import Localize_Swift // there is not time to take this to viper archi. so applying mvc here. class ProfileChangePasswordViewController: UIViewController { struct StringConstants { let passwordErrorText = "password_policy_text".localized() let newPasswordTitleText = "new_password_text".localized() let currentPasswordTitleText = "current_password_text".localized() let confirmPasswordTitleText = "confirm_password_text".localized() let saveText = "save_text".localized() let titleText = "change_password_title_text".localized() let successText = "success_text".localized() let emptyPasswordError = "password_empty_error".localized() let confirmPasswordError = "password_confirm_empty_error".localized() let passwordLengthError = "password_length_error".localized() let passwordPolicy = "password_policy_error".localized() let passwordMatchError = "password_match_error".localized() } @IBOutlet weak var textFieldCurrentPassword: UITextField! @IBOutlet weak var textFieldNewPassword: UITextField! @IBOutlet weak var textFieldConfirmPassword: UITextField! @IBOutlet weak var topLabel: UILabel! @IBOutlet weak var contentView: UIView! @IBOutlet weak var currentPasswowrdTitleLabel: UILabel! @IBOutlet weak var newPasswordTitleLabel: UILabel! @IBOutlet weak var confirmPasswordTitlelabel: UILabel! @IBOutlet weak var saveButton: UIButton! // MARK:- Properties // keyboard var mQwertyTransKeyView : TransKeyView? var mNumberTransKeyView : TransKeyView? var secureKey : NSData! var numberCipherString : String! var qwertyCipherString : String! var isTranskeyShowing : Bool! var isShowQwerty : Bool! = true var isShowNumber : Bool! var password: String! { didSet { self.textFieldNewPassword.text = password } } var encryptedPassword: String! var confirmPassword: String! { didSet { self.textFieldConfirmPassword.text = confirmPassword } } var oldPassword: String! { didSet { self.textFieldCurrentPassword.text = oldPassword } } var encryptedOldPassword: String! var encryptedConfirmPassword: String! var showingPasswordField = false var showingConfirmPasswordField: Bool = false var showingOldPasswordField = true // MARK: Life Cycle override func viewDidLoad() { super.viewDidLoad() self.setupNormalNavigation() topLabel.font = UIFont.init(name: Fonts.Family.regular, size: 14) topLabel.textColor = UIColor.init(hex: "4a4a4a") self.setupKeyboard() self.textFieldNewPassword.delegate = self self.textFieldConfirmPassword.delegate = self self.textFieldCurrentPassword.delegate = self configureLanguage() } override func viewWillAppear(_ animated: Bool) { super.viewWillDisappear(animated) self.navigationItem.title = StringConstants().titleText } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.navigationItem.title = "" } func configureLanguage() { self.topLabel.text = "password_policy_text".localized() self.textFieldCurrentPassword.placeholder = "current_password_placeholder_text".localized() self.textFieldNewPassword.placeholder = "new_password_placeholder_text".localized() self.textFieldConfirmPassword.placeholder = "confirm_password_text".localized() self.newPasswordTitleLabel.text = "new_password_text".localized() self.currentPasswowrdTitleLabel.text = "current_password_placeholder_text".localized() self.confirmPasswordTitlelabel.text = "confirm_password_text".localized() self.saveButton.setTitle("save_text".localized(), for: UIControlState.normal) } @IBAction func savePasswordChanges(_ sender: Any) { let currentPassword = self.encryptedOldPassword ?? "" let newPassword = self.encryptedPassword ?? "" let confirmPassword = self.encryptedConfirmPassword ?? "" let result = self.isValid(currentPassword: currentPassword, password: newPassword, confirmPassword: confirmPassword) if result.isValid { let userId = Utility.getMyUserName() let param = [ "UserId" : userId, "OldPassword": currentPassword, "NewPassword": newPassword, "ConfirmPassword": confirmPassword // todo: send encrypted password ] self.updatePassword(param: param) }else { let message = result.error self.alert(message: message.localizedDescription) } } func updatePassword(param: [String: String]) { self.updatePassword(params: param, success: { (message) in self.alert(message: message, title: StringConstants().successText, okAction: { self.navigationController?.popViewController(animated: true) }) }) { (error) in self.alert(message: error.localizedDescription) } } 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_IBK_TEST_IONEBANK_20181105_20190531") } } extension ProfileChangePasswordViewController { private func isValidPasword(password: String, confirmPassword: String) -> (isValid: Bool, error: String) { var error = "" var isValid = true // >= 9, 1 special character, 1 number // // func isValidLength() -> Bool { // return password.count >= 9 // } // // func hasNumber() -> Bool { // let characterSet = CharacterSet.init(charactersIn: "1234567890") // return password.rangeOfCharacter(from: characterSet) != nil // } // // func hasLetter() -> Bool { // let characterSet = CharacterSet.letters // return password.rangeOfCharacter(from: characterSet) != nil // } // // func hasSpecialCharacter() -> Bool { // let characterSet = CharacterSet.alphanumerics // return password.rangeOfCharacter(from: characterSet.inverted) != nil // } // // // func hasUpperCase() -> Bool { // let characterSet = CharacterSet.uppercaseLetters // return password.rangeOfCharacter(from: characterSet) != nil // } // if password.isEmpty { error = error + "\n \(StringConstants().emptyPasswordError)" isValid = false } if confirmPassword.isEmpty { error = error + "\n \(StringConstants().emptyPasswordError)" isValid = false } // else { // // if !isValidLength() { // error = error + "\n \(StringConstants().passwordLengthError)" // isValid = false // return (isValid, error) // } // // let validPassword = hasNumber() && hasLetter() && hasSpecialCharacter() && hasUpperCase() // // if !validPassword { // isValid = false // error = error + "\n \(StringConstants().passwordLengthError)" // return (isValid, error) // } // // if password != confirmPassword { // error = error + "\n \(StringConstants().passwordMatchError)" // isValid = false // } // } return (isValid, error) } // MARK: Converting entities private func isValid(currentPassword: String, password: String, confirmPassword: String) -> (isValid: Bool, error: Error) { var error = "" var isValid = true // user name if currentPassword.isEmpty { error = error + "\(StringConstants().emptyPasswordError)"; isValid = false } let result = self.isValidPasword(password: password, confirmPassword: confirmPassword) if !result.isValid { error = error + result.error isValid = false } let _error = NSError.init(domain: "LoginInteractor", code: 0, userInfo: [NSLocalizedDescriptionKey : error]) return (isValid, _error) } } extension ProfileChangePasswordViewController: UpdatePasswordService { } protocol UpdatePasswordService: ApiServiceType { func updatePassword(params: [String: String], success: @escaping (String?) -> (), failure: @escaping (Error) -> ()) } extension UpdatePasswordService { func updatePassword(params: [String: String], success: @escaping (String?) -> (), failure: @escaping (Error) -> ()) { let url = baseUrl + "/mobile/ChangePassword" auth.request(method: .post, url: url, params: params, needsAuthorization: true, success: { (response: SuccessMessageContainer) in if (response.errorCode ?? "") == "1" { let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""]) failure(error) }else { success(response.data?.message) } }) { (error) in failure(error) } } } extension ProfileChangePasswordViewController: TransKeyViewDelegate { func secureInputFinish(_ type: Int) { var targetView : TransKeyView? NSLog("qwerty : " + isShowQwerty.description + " number : " + isShowNumber.description) if isShowQwerty == true{ qwertyCipherString = mQwertyTransKeyView?.mTK_GetSecureData() if showingPasswordField { if mQwertyTransKeyView?.mTK_GetDataLength() == 0 { self.encryptedPassword = "" self.password = "" }else { self.encryptedPassword = qwertyCipherString self.password = "password" } } if showingConfirmPasswordField { if mQwertyTransKeyView?.mTK_GetDataLength() == 0 { confirmPassword = "" self.encryptedConfirmPassword = "" }else { confirmPassword = "password" self.encryptedConfirmPassword = qwertyCipherString } } if showingOldPasswordField { if mQwertyTransKeyView?.mTK_GetDataLength() == 0 { oldPassword = "" encryptedOldPassword = "" }else { oldPassword = "password" encryptedOldPassword = qwertyCipherString } } targetView = mQwertyTransKeyView } if isShowNumber == true{ } isShowQwerty = false isShowNumber = false isTranskeyShowing = false targetView?.dismiss(animated: true, completion: nil) } func showQwertyPasswordTranskeyAction(){ 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_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(false) mQwertyTransKeyView?.mTK_SetUseBalloonImageButton(true) if let mQwertyTransKeyView = mQwertyTransKeyView { self.present(mQwertyTransKeyView, animated: true, completion: nil) } } } } extension ProfileChangePasswordViewController: UITextFieldDelegate { func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { if textField == textFieldCurrentPassword { self.showingOldPasswordField = true self.showingConfirmPasswordField = false self.showingPasswordField = false self.showQwertyPasswordTranskeyAction() return false } if textField == textFieldConfirmPassword { self.showingConfirmPasswordField = true self.showingOldPasswordField = false self.showingPasswordField = false self.showQwertyPasswordTranskeyAction() return false } if textField == textFieldNewPassword { self.showingPasswordField = true self.showingConfirmPasswordField = false self.showingOldPasswordField = false self.showQwertyPasswordTranskeyAction() return false } return true } }