From 4d8ebe5b25d67d58237fa68aa07a4ece65057140 Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Sun, 14 Jan 2018 21:54:38 -0800 Subject: [PATCH 01/11] Update ObjectivePGP --- Podfile | 2 +- passKit/Models/PasswordStore.swift | 29 ++++++++++++++++------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Podfile b/Podfile index 20987bf..a95879a 100644 --- a/Podfile +++ b/Podfile @@ -2,7 +2,7 @@ platform :ios, '10.2' use_frameworks! target 'passKit' do - pod 'ObjectivePGP', :git => 'https://github.com/krzyzanowskim/ObjectivePGP.git', :tag => '0.9.0' + pod 'ObjectivePGP', :git => 'https://github.com/krzyzanowskim/ObjectivePGP.git', :tag => '0.10.0-beta2' target 'pass' do inherit! :search_paths end diff --git a/passKit/Models/PasswordStore.swift b/passKit/Models/PasswordStore.swift index 945cb32..a39b810 100644 --- a/passKit/Models/PasswordStore.swift +++ b/passKit/Models/PasswordStore.swift @@ -40,7 +40,7 @@ public class PasswordStore { } } - public var pgp: ObjectivePGP = ObjectivePGP() + public let keyring = ObjectivePGP.defaultKeyring public var pgpKeyPassphrase: String? { set { @@ -192,7 +192,7 @@ public class PasswordStore { try initPGPKey(.secret) } - public func initPGPKey(_ keyType: PGPPartialKeyType) throws { + public func initPGPKey(_ keyType: PGPKeyType) throws { switch keyType { case .public: let keyPath = Globals.pgpPublicKeyPath @@ -211,7 +211,7 @@ public class PasswordStore { } } - public func initPGPKey(from url: URL, keyType: PGPPartialKeyType) throws { + public func initPGPKey(from url: URL, keyType: PGPKeyType) throws { var pgpKeyLocalPath = "" if keyType == .public { pgpKeyLocalPath = Globals.pgpPublicKeyPath @@ -223,7 +223,7 @@ public class PasswordStore { try initPGPKey(keyType) } - public func initPGPKey(with armorKey: String, keyType: PGPPartialKeyType) throws { + public func initPGPKey(with armorKey: String, keyType: PGPKeyType) throws { var pgpKeyLocalPath = "" if keyType == .public { pgpKeyLocalPath = Globals.pgpPublicKeyPath @@ -237,8 +237,8 @@ public class PasswordStore { private func importKey(from keyPath: String) -> Key? { if fm.fileExists(atPath: keyPath) { - let keys = ObjectivePGP.readKeys(from: keyPath) - pgp.import(keys: keys) + let keys = try! ObjectivePGP.readKeys(fromPath: keyPath) + keyring.import(keys: keys) if !keys.isEmpty { return keys.first } @@ -247,7 +247,7 @@ public class PasswordStore { } public func getPgpPrivateKey() -> Key { - return pgp.keys.filter({$0.secretKey != nil})[0] + return keyring.keys.filter({$0.secretKey != nil})[0] } public func repositoryExisted() -> Bool { @@ -840,20 +840,23 @@ public class PasswordStore { if passphrase == nil { passphrase = requestPGPKeyPassphrase() } - let decryptedData = try PasswordStore.shared.pgp.decrypt(encryptedData, passphrase: passphrase) + let decryptedData = try ObjectivePGP.decrypt(encryptedData, andVerifySignature: false, using: keyring.keys, passphraseForKey: {(_) in passphrase}) let plainText = String(data: decryptedData, encoding: .utf8) ?? "" let escapedPath = passwordEntity.path!.stringByAddingPercentEncodingForRFC3986() ?? "" return Password(name: passwordEntity.name!, url: URL(string: escapedPath), plainText: plainText) } public func encrypt(password: Password) throws -> Data { - let publicKey = pgp.keys.filter({$0.publicKey != nil}) - guard publicKey.count > 0 else { + guard keyring.keys.count > 0 else { throw AppError.PGPPublicKeyNotExistError } let plainData = password.getPlainData() - let encryptedData = try pgp.encrypt(plainData, using: Array(publicKey), armored: SharedDefaults[.encryptInArmored]) - return encryptedData + let encryptedData = try ObjectivePGP.encrypt(plainData, addSignature: false, using: keyring.keys, passphraseForKey: nil) + if SharedDefaults[.encryptInArmored] { + return Armor.armored(encryptedData, as: .message).data(using: .utf8)! + } else { + return encryptedData + } } public func removePGPKeys() { @@ -865,7 +868,7 @@ public class PasswordStore { SharedDefaults.remove(.pgpPrivateKeyURL) SharedDefaults.remove(.pgpPublicKeyURL) Utils.removeKeychain(name: ".pgpKeyPassphrase") - pgp = ObjectivePGP() + keyring.deleteAll() publicKey = nil privateKey = nil } From e1650a7dbc5276403b7ab4f45cec33ac1916db0e Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Sun, 14 Jan 2018 22:22:48 -0800 Subject: [PATCH 02/11] Use xcode9.2 image to build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index edb3f0d..2387501 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode9 +osx_image: xcode9.2 branches: only: - develop From 3e8046eb29d4c6377300b2924be29e9cf5f60b64 Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Sun, 14 Jan 2018 22:35:21 -0800 Subject: [PATCH 03/11] Fix UI bug: #152 --- pass/Controllers/PasswordsViewController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pass/Controllers/PasswordsViewController.swift b/pass/Controllers/PasswordsViewController.swift index c4e18c8..fe51731 100644 --- a/pass/Controllers/PasswordsViewController.swift +++ b/pass/Controllers/PasswordsViewController.swift @@ -49,7 +49,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV }() private lazy var searchBarView: UIView? = { guard #available(iOS 11, *) else { - let uiView = UIView(frame: CGRect(x: 0, y: 64, width: self.view.bounds.width, height: 56)) + let uiView = UIView(frame: CGRect(x: 0, y: 64, width: self.view.bounds.width, height: 44)) uiView.addSubview(self.searchController.searchBar) return uiView } @@ -215,7 +215,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV navigationItem.hidesSearchBarWhenScrolling = false } else { // Fallback on earlier versions - tableView.contentInset = UIEdgeInsetsMake(56, 0, 0, 0) + tableView.contentInset = UIEdgeInsetsMake(44, 0, 0, 0) view.addSubview(searchBarView!) } tableView.refreshControl = syncControl @@ -242,7 +242,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() guard #available(iOS 11, *) else { - searchBarView?.frame = CGRect(x: 0, y: navigationController!.navigationBar.bounds.size.height + UIApplication.shared.statusBarFrame.height, width: UIScreen.main.bounds.width, height: 56) + searchBarView?.frame = CGRect(x: 0, y: navigationController!.navigationBar.bounds.size.height + UIApplication.shared.statusBarFrame.height, width: UIScreen.main.bounds.width, height: 44) searchController.searchBar.sizeToFit() return } From b4e1dddd45ffb209b61c25f1d22a0a1fab3ae4fd Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Mon, 15 Jan 2018 19:46:38 -0800 Subject: [PATCH 04/11] Fix Travis CI --- fastlane/Fastfile | 2 +- fastlane/travis.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 607740b..1ce0f8c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -7,7 +7,7 @@ # All lines starting with a # are ignored when running `fastlane` # If you want to automatically update fastlane if a new version is available: -# update_fastlane +update_fastlane # This is the minimum version number required. # Update this, if you use features of a newer version diff --git a/fastlane/travis.sh b/fastlane/travis.sh index 1f3e185..f6e503e 100755 --- a/fastlane/travis.sh +++ b/fastlane/travis.sh @@ -1,6 +1,7 @@ #!/bin/sh gem update fastlane +gem install xcodeproj if [ "$TRAVIS_PULL_REQUEST" == "true" ]; then fastlane test; else From 374c6c8c10b1f3951f6bac95165184b1c11b5bbb Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Tue, 16 Jan 2018 20:04:16 -0800 Subject: [PATCH 05/11] Fix double tap scroll to top issue --- pass/Controllers/PasswordsViewController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pass/Controllers/PasswordsViewController.swift b/pass/Controllers/PasswordsViewController.swift index fe51731..2ac3275 100644 --- a/pass/Controllers/PasswordsViewController.swift +++ b/pass/Controllers/PasswordsViewController.swift @@ -554,9 +554,9 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV self.tapTabBarTime = currentTime if duration < 0.35 { let topIndexPath = IndexPath(row: 0, section: 0) - if let _ = tableView.cellForRow(at: topIndexPath) { - tableView.scrollToRow(at: topIndexPath, at: .bottom, animated: true) - } + if tableView.numberOfSections > 0 { + tableView.scrollToRow(at: topIndexPath, at: .bottom, animated: true) + } self.tapTabBarTime = 0 return } From a0ecc6c0e4770810a0229304da6247bc94d2c356 Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Tue, 16 Jan 2018 20:26:41 -0800 Subject: [PATCH 06/11] Fix #155 --- pass/Base.lproj/Main.storyboard | 94 +++++++++---------- .../SettingsTableViewController.swift | 7 +- 2 files changed, 53 insertions(+), 48 deletions(-) diff --git a/pass/Base.lproj/Main.storyboard b/pass/Base.lproj/Main.storyboard index cdbb4b6..326131e 100644 --- a/pass/Base.lproj/Main.storyboard +++ b/pass/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - + - + @@ -100,11 +100,11 @@ - + - + - + - + - + @@ -244,11 +244,11 @@ - + - + @@ -425,13 +425,13 @@ diff --git a/pass/Controllers/SettingsTableViewController.swift b/pass/Controllers/SettingsTableViewController.swift index cc24bc1..d4cc7da 100644 --- a/pass/Controllers/SettingsTableViewController.swift +++ b/pass/Controllers/SettingsTableViewController.swift @@ -13,7 +13,7 @@ import PasscodeLock import LocalAuthentication import passKit -class SettingsTableViewController: UITableViewController { +class SettingsTableViewController: UITableViewController, UITabBarControllerDelegate { lazy var touchIDSwitch: UISwitch = { let uiSwitch = UISwitch(frame: CGRect.zero) @@ -29,6 +29,10 @@ class SettingsTableViewController: UITableViewController { let passwordStore = PasswordStore.shared var passcodeLockConfig = PasscodeLockConfiguration.shared + func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { + navigationController?.popViewController(animated: true) + } + @IBAction func savePGPKey(segue: UIStoryboardSegue) { if let controller = segue.source as? PGPKeySettingTableViewController { SharedDefaults[.pgpPrivateKeyURL] = URL(string: controller.pgpPrivateKeyURLTextField.text!) @@ -132,6 +136,7 @@ class SettingsTableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() + tabBarController!.delegate = self NotificationCenter.default.addObserver(self, selector: #selector(SettingsTableViewController.actOnPasswordStoreErasedNotification), name: .passwordStoreErased, object: nil) self.passwordRepositoryTableViewCell.detailTextLabel?.text = SharedDefaults[.gitURL]?.host touchIDTableViewCell.accessoryView = touchIDSwitch From 9c02fabc31b326d57f429aef17cb41f48c5788dd Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Tue, 16 Jan 2018 20:47:21 -0800 Subject: [PATCH 07/11] Add adjustable font size (using system body font size) --- pass/Base.lproj/Main.storyboard | 96 +++++++++++++++---------------- pass/Views/LabelTableViewCell.xib | 12 ++-- 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/pass/Base.lproj/Main.storyboard b/pass/Base.lproj/Main.storyboard index 326131e..e63afec 100644 --- a/pass/Base.lproj/Main.storyboard +++ b/pass/Base.lproj/Main.storyboard @@ -45,17 +45,17 @@ -