Browse Source

change keychain

pull/1/head
james 6 years ago
parent
commit
0d45c2f0a3
  1. 4
      GME Remit.xcodeproj/project.pbxproj
  2. 34
      GMERemittance/AppDelegate.swift
  3. 3
      GMERemittance/Module/Main/User Interface/Wireframe/MainWireframe.swift
  4. 17
      GMERemittance/Utility/AppConstants.swift
  5. 83
      GMERemittance/Utility/UserKeychain.swift
  6. 83
      GMERemittanceTests/KeychainTest.swift

4
GME Remit.xcodeproj/project.pbxproj

@ -204,6 +204,7 @@
730197B522535135001954AB /* kycForm2.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7301978922535135001954AB /* kycForm2.storyboard */; };
730197B622535135001954AB /* kycForm2ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7301978A22535135001954AB /* kycForm2ViewController.swift */; };
7310475C226960E70025D77D /* KeychainTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7310475B226960E70025D77D /* KeychainTest.swift */; };
7310475E22696D570025D77D /* UserKeychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7310475D22696D560025D77D /* UserKeychain.swift */; };
73FDCE1D225C167700CC6912 /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73FDCE1C225C167700CC6912 /* KeyChain.swift */; };
917C3001C903ECEF46A5D6D0 /* Pods_GMERemittanceUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4028C5A57499BB54764190C /* Pods_GMERemittanceUITests.framework */; };
9F02058F20171BBF00F7AE23 /* KYCenum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F02058E20171BBF00F7AE23 /* KYCenum.swift */; };
@ -2378,6 +2379,7 @@
7301978922535135001954AB /* kycForm2.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = kycForm2.storyboard; sourceTree = "<group>"; };
7301978A22535135001954AB /* kycForm2ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = kycForm2ViewController.swift; sourceTree = "<group>"; };
7310475B226960E70025D77D /* KeychainTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainTest.swift; sourceTree = "<group>"; };
7310475D22696D560025D77D /* UserKeychain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserKeychain.swift; sourceTree = "<group>"; };
73FDCE1C225C167700CC6912 /* KeyChain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyChain.swift; sourceTree = "<group>"; };
745256B2A0B78E97CD1E1E4C /* Pods-GMERemittanceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GMERemittanceTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-GMERemittanceTests/Pods-GMERemittanceTests.release.xcconfig"; sourceTree = "<group>"; };
9F02058E20171BBF00F7AE23 /* KYCenum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KYCenum.swift; sourceTree = "<group>"; };
@ -9504,6 +9506,7 @@
73FDCE1C225C167700CC6912 /* KeyChain.swift */,
D96A4FBB2146079600CFD507 /* AppConstants.swift */,
BEF000C6226757D600AB5663 /* SecureKeypad.swift */,
7310475D22696D560025D77D /* UserKeychain.swift */,
);
path = Utility;
sourceTree = "<group>";
@ -12767,6 +12770,7 @@
D922D98521351AAE00D43053 /* SendMoneyExchangeRateServiceType.swift in Sources */,
73FDCE1D225C167700CC6912 /* KeyChain.swift in Sources */,
D922D91E2134DCF000D43053 /* EditReciepientService.swift in Sources */,
7310475E22696D570025D77D /* UserKeychain.swift in Sources */,
7301979522535135001954AB /* KycViewController.swift in Sources */,
9F1F7A5C1FF2146000A4DD82 /* ReviewViewController.swift in Sources */,
D9380D2B2165A27B00E45156 /* ProfileChangePasswordViewController.swift in Sources */,

34
GMERemittance/AppDelegate.swift

@ -119,22 +119,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
}
private func setEntryPoint() {
guard let _ = UserKeychain().fetch() else {
// do not exist user informations
self.goSplashScreen()
return
}
let encryptedPW = KeyChain.shared.get(key: .password)
let isStoredPW = encryptedPW != nil &&
encryptedPW != "" &&
UserDefaults.standard.string(forKey: UserKeys.email) != nil
if isStoredPW {
let biometricAuthenticationWireframe = BiometricAuthenticationWireframe()
biometricAuthenticationWireframe.openWithDelegate(on: self.window!, delegate: self)
} else {
// go to splashscreen
self.goSplashScreen()
}
biometricAuthenticationWireframe.openWithDelegate(
on: self.window!,
delegate: self
)
}
private func registerForNotification(application: UIApplication) {
@ -241,15 +237,19 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
let loginService = LoginService()
let userID = UserDefaults.standard.string(forKey: UserKeys.email) ?? ""
let encryptedPassword = KeyChain.shared.get(key: .password) ?? ""
guard let userinfo = UserKeychain().fetch() else {
return
}
loginService._login(
userId: userID,
password: encryptedPassword,
password: userinfo.encryptedPassword,
success: { (user) in
let accessCode = user?.accessCode ?? ""
let accessCodeBase64 = accessCode
Utility.save(user: user, accessCodeBase64: accessCodeBase64, password: encryptedPassword, login: true)
Utility.save(user: user, accessCodeBase64: accessCodeBase64, password: userinfo.encryptedPassword, login: true)
let mainWireFrame = MainWireframe.shared
let tabBarViewController = mainWireFrame?.getMainView()
@ -330,7 +330,7 @@ extension AppDelegate: BiometricAuthenticationViewControllerDelegate{
extension AppDelegate: SecureKeypadDelegate {
func didComplete(_ encryptedString: String) {
if encryptedString != "" {
KeyChain.shared.save(data: encryptedString, key: .password)
//
self.doLogin()
}
}

3
GMERemittance/Module/Main/User Interface/Wireframe/MainWireframe.swift

@ -92,10 +92,9 @@ extension MainWireframe: MainWireframeInput {
store.removeObject(forKey: UserKeys.availableBalance)
store.removeObject(forKey: UserKeys.availableBalance)
store.removeObject(forKey: UserKeys.isUseBiometricAuth)
store.setValue(nil, forKey: UserKeys.accessCode)
KeyChain.shared.remove(key: .password)
store.set(false, forKey: AppConstants.pennyTestPresentedOnce)

17
GMERemittance/Utility/AppConstants.swift

@ -375,7 +375,7 @@ class Utility {
save(value: user?.email ?? "", forKey: UserKeys.email)
save(value: user?.mobileNumber ?? "", forKey: UserKeys.mobileNumber)
save(value: user?.sourceId ?? "", forKey: UserKeys.sourceId)
save(value: password, forKey: "com.gmeremit.password")
save(value: "111111", forKey: "com.gmeremit.password")
save(value: user?.isReferred ?? "", forKey: UserKeys.isReferred)
save(value: user?.idType ?? "", forKey: UserKeys.idType)
save(value: user?.idNumber ?? "", forKey: UserKeys.idNumber)
@ -389,7 +389,20 @@ class Utility {
//TODO: save encrypted password into keychain
if let password = password {
KeyChain.shared.save(data: password, key: .password)
let keychain = UserKeychain()
guard var userinfo = keychain.fetch() else {
keychain.set(
UserKeychain.UserKeychainInfo(
encryptedPassword: password,
isUseBiometricAuth: false
)
)
return
}
userinfo.encryptedPassword = password
keychain.set(userinfo)
}
}

83
GMERemittance/Utility/UserKeychain.swift

@ -0,0 +1,83 @@
//
// UserKeychain.swift
// GME Remit
//
// Created by InKwon Devik Kim on 19/04/2019.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
import KeychainAccess
final class UserKeychain {
struct UserKeychainInfo {
var encryptedPassword: String
var isUseBiometricAuth: Bool
}
private enum Keys: String{
case encryptedPassword = "encryptedPassword"
case isUseBiometricAuth = "isUseBiometricAuth"
}
private let keychain: Keychain!
init(email: String? = nil){
var userId = ""
if email == nil {
userId = UserDefaults.standard.string(forKey: UserKeys.email) ?? ""
}
self.keychain = Keychain(service: userId)
}
func fetch() -> UserKeychainInfo? {
do {
guard
let encryptedPassword = try self.keychain.getString(Keys.encryptedPassword.rawValue),
let isUseBiometricAuth = try self.keychain.getString(Keys.isUseBiometricAuth.rawValue) else { return nil }
return UserKeychainInfo(
encryptedPassword: encryptedPassword,
isUseBiometricAuth: isUseBiometricAuth == "1" ? true : false)
} catch _ {
return nil
}
}
func set(_ userInfo: UserKeychainInfo) {
do {
try keychain.set(
userInfo.encryptedPassword,
key: Keys.encryptedPassword.rawValue
)
try keychain.set(
userInfo.isUseBiometricAuth ? "1" : "0",
key: Keys.isUseBiometricAuth.rawValue
)
}
catch let error {
print("UserKeychain Error: \(error)")
}
}
func removeAll() {
do {
try keychain.removeAll()
}
catch let error {
print("UserKeychain Error: \(error)")
}
}
func removePassword() {
do {
try keychain.remove(Keys.encryptedPassword.rawValue)
}
catch let error {
print("UserKeychain Error: \(error)")
}
}
}

83
GMERemittanceTests/KeychainTest.swift

@ -12,81 +12,36 @@ import KeychainAccess
class KeychainTest: XCTestCase {
func testSave(){
let keychain = Keychain(service: "ubrai13@gmail.com")
do {
try keychain.set("4D544B3169614D6E6565546C6531724B6F734B6C0FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F23", key: "encryptedPassword")
let email = "ubrai13@gmail.com"
let keychain = UserKeychain(email)
try keychain.set("0", key: "isUseBiometricAuth")
try keychain.set("0", key: "wasLogin")
}
catch let error {
print(error)
}
}
func testGet(){
let keychain = Keychain(service: "ubrai13@gmail.com")
do {
let pw = try keychain.getString("encryptedPassword")
let isUseBiometricAuth = try keychain.getString("isUseBiometricAuth")
let wasLogin = try keychain.getString("wasLogin")
XCTAssert(pw == "4D544B3169614D6E6565546C6531724B6F734B6C0FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F230FCFCE14CF10F24A3BCAB8A101931F23")
let userInfo = UserKeychain.UserKeychainInfo(
encryptedPassword: "111111",
isUseBiometricAuth: false
)
XCTAssert(isUseBiometricAuth == "0")
XCTAssert(wasLogin == "0")
}
catch let error {
XCTAssert(false, error.localizedDescription)
}
keychain.set(userInfo)
}
func testUpdate(){
let keychain = Keychain(service: "com.gme.gmeremit")
do {
try keychain.set("Test Encrypted Password", key: "encryptedPassword")
let pw = try keychain.get("encryptedPassword")
func testFetch(){
let keychain = UserKeychain("ubrai13@gmail.com")
XCTAssert(pw == "Test Encrypted Password")
}
catch let error {
XCTAssert(false, error.localizedDescription)
}
guard let userInfo = keychain.fetch() else {
XCTAssert(false)
return
}
func testRemove() {
let keychain = Keychain(service: "com.gme.gmeremit")
do {
try keychain.remove("encryptedPassword")
let pw = try keychain.get("encryptedPassword")
XCTAssert(pw == nil)
}
catch let error {
XCTAssert(false, error.localizedDescription)
XCTAssert(userInfo.encryptedPassword == "111111")
XCTAssert(userInfo.isUseBiometricAuth == false)
}
}
func testFetServiceName(){
let keychain = Keychain(service: "test@gmail.com")
do {
let pw = try keychain.getString("encryptedPassword")
let isUseBiometricAuth = try keychain.getString("isUseBiometricAuth")
let wasLogin = try keychain.getString("wasLogin")
print(pw)
print(isUseBiometricAuth)
print(wasLogin)
guard let pw1 = pw, let isUseBiometricAuth1 = isUseBiometricAuth, let wasLogin1 = wasLogin else {
XCTAssert(false)
}
func testNoUser(){
let keychain = UserKeychain("test@gmail.com")
guard let _ = keychain.fetch() else {
return
}
catch let error {
XCTAssert(false, error.localizedDescription)
}
XCTAssert(false)
}
}
Loading…
Cancel
Save