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.

199 lines
5.0 KiB

  1. //
  2. // SecureKeypad.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon Kim on 17/04/2019.
  6. // Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. protocol SecureKeypadDelegate: class {
  10. func didComplete(_ encryptedString: String, garbagePassword: String, length: Int)
  11. }
  12. enum SecureKeypadType {
  13. case ascii
  14. case numberic
  15. }
  16. class SecureKeypad: NSObject {
  17. weak var delegate: SecureKeypadDelegate?
  18. var title = "Enter Your GME Password" {
  19. didSet {
  20. self.updateUI()
  21. }
  22. }
  23. var placeholder = "Enter Your GME Password" {
  24. didSet {
  25. self.updateUI()
  26. }
  27. }
  28. var placeholderFont: UIFont? = .sanfrancisco(.regular, size: 15) {
  29. didSet {
  30. self.updateUI()
  31. }
  32. }
  33. private lazy var asciiKeypad = TransKeyView()
  34. private lazy var numberPad = TransKeyView()
  35. private var target: UIViewController!
  36. private var keypadType: SecureKeypadType = .ascii
  37. private var encryptedString = ""
  38. private var decryptedLength = 0
  39. init(target: UIViewController, keypadType: SecureKeypadType = .ascii) {
  40. super.init()
  41. self.target = target
  42. self.keypadType = keypadType
  43. self.initKeypad()
  44. }
  45. deinit {
  46. self.asciiKeypad.mTK_ClearDelegateSubviews()
  47. self.numberPad.mTK_ClearDelegateSubviews()
  48. self.asciiKeypad.delegate = nil
  49. self.numberPad.delegate = nil
  50. }
  51. func present(animated: Bool, completion: (() -> Void)? = nil) {
  52. let vc: TransKeyView
  53. switch keypadType {
  54. case .ascii:
  55. vc = self.asciiKeypad
  56. case .numberic:
  57. vc = self.numberPad
  58. }
  59. vc.modalPresentationStyle = .fullScreen
  60. self.target.present(vc, animated: true, completion: completion)
  61. }
  62. private func updateUI() {
  63. switch self.keypadType {
  64. case .ascii:
  65. self.updateASCIIUI()
  66. case .numberic:
  67. self.updateNumber()
  68. }
  69. }
  70. private func initKeypad() {
  71. switch self.keypadType {
  72. case .ascii:
  73. self.initASCIIKeypad()
  74. self.updateASCIIUI()
  75. case.numberic:
  76. self.initNumberKeypad()
  77. self.updateNumber()
  78. }
  79. }
  80. /// init ASCII keypad
  81. private func initASCIIKeypad() {
  82. asciiKeypad.mTK_Init(self)
  83. asciiKeypad.delegate = self
  84. asciiKeypad.mTK_MakeSecureKey()
  85. asciiKeypad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.")
  86. asciiKeypad.mTK_UseCursor(true)
  87. asciiKeypad.mTK_UseAllDeleteButton(true)
  88. asciiKeypad.mTK_UseNavigationBar(true)
  89. asciiKeypad.mTK_UseVoiceOver(true)
  90. asciiKeypad.mTK_setHideInputPasswordDelay(3)
  91. asciiKeypad.mTK_SetControlCenter(false)
  92. asciiKeypad.mTK_setIgnoreStatusbar(false)
  93. asciiKeypad.mTK_UseShiftOptional(true)
  94. asciiKeypad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape)
  95. asciiKeypad.mTK_EnableSamekeyInputDataEncrypt(true)
  96. asciiKeypad.mTK_SetUseBalloonImageButton(true)
  97. asciiKeypad.mTK_LicenseCheck("license_mtranskey")
  98. }
  99. /// update ASCII UI
  100. private func updateASCIIUI() {
  101. asciiKeypad.mTK_SetHint(self.placeholder, font: self.placeholderFont)
  102. asciiKeypad.setKeyboardType(
  103. self,
  104. keypadType: 0,
  105. mTK_inputType: 2,
  106. mTK_inputTitle: self.title,
  107. mTK_cryptType: 0,
  108. mTK_maxLength: 100,
  109. mTK_minLength: 0,
  110. mTK_keypadUpper: false,
  111. mTK_languageType: 1
  112. )
  113. }
  114. private func initNumberKeypad() {
  115. numberPad.mTK_Init(self)
  116. numberPad.delegate = self
  117. numberPad.mTK_MakeSecureKey()
  118. numberPad.mTK_LicenseCheck("license_mtranskey")
  119. numberPad.mTK_ShowMessageIfMinLength("0자리 이상 입력해주세요.")
  120. numberPad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.")
  121. numberPad.mTK_UseVoiceOver(false)
  122. numberPad.mTK_setIgnoreStatusbar(false)
  123. numberPad.mTK_SetControlCenter(false)
  124. numberPad.mTK_UseAllDeleteButton(false)
  125. numberPad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape)
  126. }
  127. private func updateNumber() {
  128. numberPad.mTK_SetHint(self.placeholder, font: self.placeholderFont)
  129. numberPad.setKeyboardType(
  130. self,
  131. keypadType: TransKeyKeypadTypeText,
  132. mTK_inputType: 2,
  133. mTK_inputTitle: self.title,
  134. mTK_cryptType: 0,
  135. mTK_maxLength: 16,
  136. mTK_minLength: 0,
  137. mTK_keypadUpper: false,
  138. mTK_languageType: Int(mTK_Language_English.rawValue)
  139. )
  140. }
  141. }
  142. extension SecureKeypad: TransKeyViewDelegate {
  143. func secureInputFinish(_ type: Int) {
  144. let vc: TransKeyView
  145. switch keypadType {
  146. case .ascii:
  147. vc = self.asciiKeypad
  148. case .numberic:
  149. vc = self.numberPad
  150. }
  151. self.encryptedString = vc.mTK_GetSecureData()
  152. self.decryptedLength = vc.mTK_GetDataLength()
  153. if self.decryptedLength == 0 {
  154. self.encryptedString = ""
  155. }
  156. vc.dismiss(animated: true) {
  157. var garbagePW = ""
  158. for _ in 0..<self.decryptedLength {
  159. garbagePW += ""
  160. }
  161. self.delegate?.didComplete(
  162. self.encryptedString,
  163. garbagePassword: garbagePW,
  164. length: self.decryptedLength
  165. )
  166. }
  167. }
  168. }