You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

399 lines
12 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // ProfileChangePasswordViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Fm-user on 1/9/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import Localize_Swift
  10. class ProfileChangePasswordViewController: UIViewController {
  11. struct StringConstants {
  12. let passwordErrorText = "password_policy_text".localized()
  13. let newPasswordTitleText = "new_password_text".localized()
  14. let currentPasswordTitleText = "current_password_text".localized()
  15. let confirmPasswordTitleText = "confirm_password_text".localized()
  16. let saveText = "save_text".localized()
  17. let titleText = "change_password_title_text".localized()
  18. let successText = "success_text".localized()
  19. let emptyPasswordError = "password_empty_error".localized()
  20. let confirmPasswordError = "password_confirm_empty_error".localized()
  21. let passwordLengthError = "password_length_error".localized()
  22. let passwordPolicy = "password_policy_error".localized()
  23. let passwordMatchError = "password_match_error".localized()
  24. }
  25. @IBOutlet weak var textFieldCurrentPassword: UITextField!
  26. @IBOutlet weak var textFieldNewPassword: UITextField!
  27. @IBOutlet weak var textFieldConfirmPassword: UITextField!
  28. @IBOutlet weak var topLabel: UILabel!
  29. @IBOutlet weak var contentView: UIView!
  30. @IBOutlet weak var currentPasswowrdTitleLabel: UILabel!
  31. @IBOutlet weak var newPasswordTitleLabel: UILabel!
  32. @IBOutlet weak var confirmPasswordTitlelabel: UILabel!
  33. @IBOutlet weak var saveButton: UIButton!
  34. // MARK: - Properties
  35. var mQwertyTransKeyView : TransKeyView?
  36. var mNumberTransKeyView : TransKeyView?
  37. var secureKey : NSData!
  38. var numberCipherString : String!
  39. var qwertyCipherString : String!
  40. var isTranskeyShowing : Bool!
  41. var isShowQwerty : Bool! = true
  42. var isShowNumber : Bool!
  43. var password: String! {
  44. didSet {
  45. self.textFieldNewPassword.text = password
  46. }
  47. }
  48. var encryptedPassword: String!
  49. var confirmPassword: String! {
  50. didSet {
  51. self.textFieldConfirmPassword.text = confirmPassword
  52. }
  53. }
  54. var oldPassword: String! {
  55. didSet {
  56. self.textFieldCurrentPassword.text = oldPassword
  57. }
  58. }
  59. var encryptedOldPassword: String!
  60. var encryptedConfirmPassword: String!
  61. var showingPasswordField = false
  62. var showingConfirmPasswordField: Bool = false
  63. var showingOldPasswordField = true
  64. // MARK: Life Cycle
  65. override func viewDidLoad() {
  66. super.viewDidLoad()
  67. self.setupNormalNavigation()
  68. topLabel.font = .sanfrancisco(.regular, size: 14)
  69. topLabel.textColor = UIColor.init(hex: "4a4a4a")
  70. self.setupKeyboard()
  71. self.textFieldNewPassword.delegate = self
  72. self.textFieldConfirmPassword.delegate = self
  73. self.textFieldCurrentPassword.delegate = self
  74. configureLanguage()
  75. saveButton.backgroundColor = .themeRed
  76. saveButton.layer.cornerRadius = 5
  77. }
  78. override func viewWillAppear(_ animated: Bool) {
  79. super.viewWillDisappear(animated)
  80. self.navigationItem.title = StringConstants().titleText
  81. }
  82. override func viewWillDisappear(_ animated: Bool) {
  83. super.viewWillDisappear(animated)
  84. self.navigationItem.title = ""
  85. }
  86. func configureLanguage() {
  87. self.topLabel.text = "password_policy_text".localized()
  88. self.textFieldCurrentPassword.placeholder = "current_password_placeholder_text".localized()
  89. self.textFieldNewPassword.placeholder = "new_password_placeholder_text".localized()
  90. self.textFieldConfirmPassword.placeholder = "confirm_password_text".localized()
  91. self.newPasswordTitleLabel.text = "new_password_text".localized()
  92. self.currentPasswowrdTitleLabel.text = "current_password_placeholder_text".localized()
  93. self.confirmPasswordTitlelabel.text = "confirm_password_text".localized()
  94. self.saveButton.setTitle("save_text".localized(), for: UIControl.State.normal)
  95. }
  96. @IBAction func savePasswordChanges(_ sender: Any) {
  97. let currentPassword = self.encryptedOldPassword ?? ""
  98. let newPassword = self.encryptedPassword ?? ""
  99. let confirmPassword = self.encryptedConfirmPassword ?? ""
  100. let result = self.isValid(
  101. currentPassword: currentPassword,
  102. password: newPassword,
  103. confirmPassword: confirmPassword
  104. )
  105. if result.isValid {
  106. let userId = Utility.getMyUserName()
  107. let param =
  108. [
  109. "UserId" : userId,
  110. "OldPassword": currentPassword,
  111. "NewPassword": newPassword,
  112. "ConfirmPassword": confirmPassword
  113. // todo: send encrypted password
  114. ]
  115. self.updatePassword(param: param)
  116. } else {
  117. let message = result.error
  118. self.alert(type: .error, message: message.localizedDescription)
  119. }
  120. }
  121. func updatePassword(param: [String: String]) {
  122. self.updatePassword(
  123. params: param,
  124. success: { (message) in
  125. self.alert(message: message, title: StringConstants().successText, okAction: {
  126. KeyChain.shared.save(data: self.encryptedPassword, key: .password)
  127. self.navigationController?.popViewController(animated: true)
  128. })
  129. },
  130. failure: { (error) in
  131. self.alert(type: .error, message: error.localizedDescription)
  132. }
  133. )
  134. }
  135. func setupKeyboard() {
  136. isShowNumber = false
  137. isShowQwerty = true
  138. isTranskeyShowing = false
  139. let iv: [String] = [
  140. "M", "o", "b", "i", "l", "e", "T", "r" , "a", "n", "s", "K", "e", "y", "1", "0"
  141. ]
  142. secureKey = NSData(bytes: iv, length: 16)
  143. setQwertyTranskey()
  144. // self.showQwertyTranskeyAction()
  145. }
  146. func setQwertyTranskey() {
  147. mQwertyTransKeyView = TransKeyView()
  148. mQwertyTransKeyView?.mTK_Init(self)
  149. mQwertyTransKeyView?.delegate = self
  150. mQwertyTransKeyView?.mTK_MakeSecureKey()
  151. mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortrait)
  152. // ccr key
  153. mQwertyTransKeyView?.mTK_LicenseCheck("license_mtranskey")
  154. }
  155. }
  156. extension ProfileChangePasswordViewController {
  157. private func isValidPasword(password: String, confirmPassword: String) -> (isValid: Bool, error: String) {
  158. var error = ""
  159. var isValid = true
  160. if password.isEmpty {
  161. error = "\(error)\n\(StringConstants().emptyPasswordError)"
  162. isValid = false
  163. }
  164. if confirmPassword.isEmpty {
  165. error = "\(error)\n\(StringConstants().emptyPasswordError)"
  166. isValid = false
  167. }
  168. return (isValid, error)
  169. }
  170. // MARK: Converting entities
  171. private func isValid(
  172. currentPassword: String,
  173. password: String,
  174. confirmPassword: String
  175. ) -> (isValid: Bool, error: Error) {
  176. var error = ""
  177. var isValid = true
  178. // user name
  179. if currentPassword.isEmpty {
  180. error = "\(error)\n\(StringConstants().emptyPasswordError)"
  181. isValid = false
  182. }
  183. let result = self.isValidPasword(password: password, confirmPassword: confirmPassword)
  184. if !result.isValid {
  185. error = "\(error) \(result.error)"
  186. isValid = false
  187. }
  188. let newError = NSError(
  189. domain: "LoginInteractor",
  190. code: 0,
  191. userInfo: [NSLocalizedDescriptionKey : error]
  192. )
  193. return (isValid, newError)
  194. }
  195. }
  196. extension ProfileChangePasswordViewController: UpdatePasswordService {
  197. }
  198. protocol UpdatePasswordService: ApiServiceType {
  199. func updatePassword(
  200. params: [String: String],
  201. success: @escaping (String?) -> Void,
  202. failure: @escaping (Error) -> Void
  203. )
  204. }
  205. extension UpdatePasswordService {
  206. func updatePassword(
  207. params: [String: String],
  208. success: @escaping (String?) -> Void,
  209. failure: @escaping (Error) -> Void
  210. ) {
  211. let url = baseUrl + "/mobile/ChangePassword"
  212. auth.request(
  213. method: .post,
  214. url: url,
  215. params: params,
  216. needsAuthorization: true,
  217. success: { (response: SuccessMessageContainer) in
  218. if (response.errorCode ?? "") == "1" {
  219. let error = NSError(
  220. domain: "Network",
  221. code: 0,
  222. userInfo: [NSLocalizedDescriptionKey : response.message ?? ""]
  223. )
  224. failure(error)
  225. } else {
  226. success(response.data?.message)
  227. }
  228. },
  229. failure: { (error) in
  230. failure(error)
  231. }
  232. )
  233. }
  234. }
  235. extension ProfileChangePasswordViewController: TransKeyViewDelegate {
  236. func secureInputFinish(_ type: Int) {
  237. var targetView : TransKeyView?
  238. NSLog("qwerty : " + isShowQwerty.description + " number : " + isShowNumber.description)
  239. if isShowQwerty == true {
  240. qwertyCipherString = mQwertyTransKeyView?.mTK_GetSecureData()
  241. if showingPasswordField {
  242. if mQwertyTransKeyView?.mTK_GetDataLength() == 0 {
  243. self.encryptedPassword = ""
  244. self.password = ""
  245. } else {
  246. self.encryptedPassword = qwertyCipherString
  247. self.password = "password"
  248. }
  249. }
  250. if showingConfirmPasswordField {
  251. if mQwertyTransKeyView?.mTK_GetDataLength() == 0 {
  252. confirmPassword = ""
  253. self.encryptedConfirmPassword = ""
  254. } else {
  255. confirmPassword = "password"
  256. self.encryptedConfirmPassword = qwertyCipherString
  257. }
  258. }
  259. if showingOldPasswordField {
  260. if mQwertyTransKeyView?.mTK_GetDataLength() == 0 {
  261. oldPassword = ""
  262. encryptedOldPassword = ""
  263. } else {
  264. oldPassword = "password"
  265. encryptedOldPassword = qwertyCipherString
  266. }
  267. }
  268. targetView = mQwertyTransKeyView
  269. }
  270. isShowQwerty = false
  271. isShowNumber = false
  272. isTranskeyShowing = false
  273. targetView?.dismiss(animated: true, completion: nil)
  274. }
  275. func showQwertyPasswordTranskeyAction() {
  276. if mQwertyTransKeyView?.isBeingPresented == false {
  277. isShowQwerty = true
  278. isTranskeyShowing = true
  279. let hintStr = String(format:"password", 0)
  280. let font = UIFont(name: "Arial", size: 15)
  281. mQwertyTransKeyView?.mTK_SetHint(hintStr, font: font)
  282. mQwertyTransKeyView?.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.")
  283. mQwertyTransKeyView?.mTK_UseCursor(true)
  284. mQwertyTransKeyView?.mTK_UseAllDeleteButton(true)
  285. mQwertyTransKeyView?.mTK_UseNavigationBar(true)
  286. mQwertyTransKeyView?.mTK_UseVoiceOver(true)
  287. mQwertyTransKeyView?.mTK_setHideInputPasswordDelay(3)
  288. mQwertyTransKeyView?.mTK_SetControlCenter(false)
  289. mQwertyTransKeyView?.mTK_setIgnoreStatusbar(false)
  290. // mQwertyTransKeyView?.mTK_SetLanguage(1)
  291. mQwertyTransKeyView?.mTK_UseShiftOptional(true)
  292. mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape)
  293. mQwertyTransKeyView?.setKeyboardType(
  294. self,
  295. keypadType: 0,
  296. mTK_inputType: 2,
  297. mTK_inputTitle: "password",
  298. mTK_cryptType: 0,
  299. mTK_maxLength: 100,
  300. mTK_minLength: 0,
  301. mTK_keypadUpper: false,
  302. mTK_languageType: 1
  303. )
  304. mQwertyTransKeyView?.mTK_EnableSamekeyInputDataEncrypt(false)
  305. mQwertyTransKeyView?.mTK_SetUseBalloonImageButton(true)
  306. if let mQwertyTransKeyView = mQwertyTransKeyView {
  307. self.present(mQwertyTransKeyView, animated: true, completion: nil)
  308. }
  309. }
  310. }
  311. }
  312. extension ProfileChangePasswordViewController: UITextFieldDelegate {
  313. func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  314. if textField == textFieldCurrentPassword {
  315. self.showingOldPasswordField = true
  316. self.showingConfirmPasswordField = false
  317. self.showingPasswordField = false
  318. self.showQwertyPasswordTranskeyAction()
  319. return false
  320. }
  321. if textField == textFieldConfirmPassword {
  322. self.showingConfirmPasswordField = true
  323. self.showingOldPasswordField = false
  324. self.showingPasswordField = false
  325. self.showQwertyPasswordTranskeyAction()
  326. return false
  327. }
  328. if textField == textFieldNewPassword {
  329. self.showingPasswordField = true
  330. self.showingConfirmPasswordField = false
  331. self.showingOldPasswordField = false
  332. self.showQwertyPasswordTranskeyAction()
  333. return false
  334. }
  335. return true
  336. }
  337. }