diff --git a/pass/Password.swift b/pass/Password.swift index db40da2..8bcd2a7 100644 --- a/pass/Password.swift +++ b/pass/Password.swift @@ -10,10 +10,16 @@ import Foundation import SwiftyUserDefaults class Password { - var name = "" - var password = "" + var name: String + var password: String var additions: [String: String] + init() { + name = "" + password = "" + additions = [:] + } + init(name: String, password: String, additions: [String: String]) { self.name = name self.password = password @@ -22,29 +28,25 @@ class Password { } extension PasswordEntity { - func decrypt() -> Password? { + func decrypt() throws -> Password? { var password: Password? let encryptedDataPath = URL(fileURLWithPath: "\(Globals.shared.documentPath)/\(rawPath!)") - do { - let encryptedData = try Data(contentsOf: encryptedDataPath) - let decryptedData = try PasswordStore.shared.pgp.decryptData(encryptedData, passphrase: Defaults[.pgpKeyPassphrase]) - let plain = String(data: decryptedData, encoding: .ascii) ?? "" - var decrypted_password = "" - var decrypted_addtions = [String: String]() - plain.enumerateLines(invoking: { line, _ in - let item = line.characters.split(separator: ":").map(String.init) - if item.count == 1 { - decrypted_password = item[0] - } else { - let key = item[0] - let value = item[1].trimmingCharacters(in: .whitespaces) - decrypted_addtions[key] = value - } - }) - password = Password(name: name!, password: decrypted_password, additions: decrypted_addtions) - } catch let error as NSError { - print(error.debugDescription) - } + let encryptedData = try Data(contentsOf: encryptedDataPath) + let decryptedData = try PasswordStore.shared.pgp.decryptData(encryptedData, passphrase: Defaults[.pgpKeyPassphrase]) + let plain = String(data: decryptedData, encoding: .ascii) ?? "" + var decrypted_password = "" + var decrypted_addtions = [String: String]() + plain.enumerateLines(invoking: { line, _ in + let item = line.characters.split(separator: ":").map(String.init) + if item.count == 1 { + decrypted_password = item[0] + } else { + let key = item[0] + let value = item[1].trimmingCharacters(in: .whitespaces) + decrypted_addtions[key] = value + } + }) + password = Password(name: name!, password: decrypted_password, additions: decrypted_addtions) return password } } diff --git a/pass/PasswordDetailTableViewController.swift b/pass/PasswordDetailTableViewController.swift index 5c2d27e..8d81882 100644 --- a/pass/PasswordDetailTableViewController.swift +++ b/pass/PasswordDetailTableViewController.swift @@ -10,6 +10,7 @@ import UIKit class PasswordDetailTableViewController: UITableViewController, UIGestureRecognizerDelegate { var passwordEntity: PasswordEntity? + var password = Password() struct TableCell { var title: String @@ -26,7 +27,15 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni override func viewDidLoad() { super.viewDidLoad() tableView.register(UINib(nibName: "LabelTableViewCell", bundle: nil), forCellReuseIdentifier: "labelCell") - let password = passwordEntity!.decrypt()! + do { + password = try passwordEntity!.decrypt()! + } catch { + let alert = UIAlertController(title: "Cannot Show Password", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.alert) + alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: {(UIAlertAction) -> Void in + self.navigationController!.popViewController(animated: true) + })) + self.present(alert, animated: true, completion: nil) + } var tableDataIndex = 0 tableData.append(TableSection(title: "", item: [])) diff --git a/pass/PasswordsViewController.swift b/pass/PasswordsViewController.swift index 6642976..18ca65b 100644 --- a/pass/PasswordsViewController.swift +++ b/pass/PasswordsViewController.swift @@ -121,8 +121,12 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } else { password = passwordEntities![index] } - let decryptedPassword = password.decrypt()! - UIPasteboard.general.string = decryptedPassword.password + do { + let decryptedPassword = try password.decrypt()! + UIPasteboard.general.string = decryptedPassword.password + } catch { + print(error) + } } func generateSections(item: [PasswordEntity]) { @@ -174,14 +178,14 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV if let viewController = segue.destination as? PasswordDetailTableViewController { let selectedIndexPath = self.tableView.indexPath(for: sender as! UITableViewCell)! let index = sections[selectedIndexPath.section].index + selectedIndexPath.row - let password: PasswordEntity + let passwordEntity: PasswordEntity if searchController.isActive && searchController.searchBar.text != "" { - password = filteredPasswordEntities[index] + passwordEntity = filteredPasswordEntities[index] } else { - password = passwordEntities![index] + passwordEntity = passwordEntities![index] } - viewController.passwordEntity = password - viewController.navigationItem.title = password.name + viewController.passwordEntity = passwordEntity + viewController.navigationItem.title = passwordEntity.name } } }