diff --git a/pass/Base.lproj/Main.storyboard b/pass/Base.lproj/Main.storyboard index d8df061..179888a 100644 --- a/pass/Base.lproj/Main.storyboard +++ b/pass/Base.lproj/Main.storyboard @@ -23,11 +23,11 @@ - + - + @@ -81,11 +81,11 @@ - + - + @@ -101,11 +101,11 @@ - + - + @@ -125,18 +125,18 @@ - + - + - + @@ -169,18 +169,18 @@ - + - + - + @@ -189,7 +189,7 @@ - + @@ -205,6 +205,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -229,6 +287,8 @@ + + @@ -251,7 +311,7 @@ - + @@ -283,7 +343,7 @@ - + @@ -312,7 +372,7 @@ - + diff --git a/pass/DefaultKeys.swift b/pass/DefaultKeys.swift index cec1e51..0a10759 100644 --- a/pass/DefaultKeys.swift +++ b/pass/DefaultKeys.swift @@ -17,4 +17,11 @@ extension DefaultsKeys { static let pgpKeyUserID = DefaultsKey("pgpKeyUserID") static let gitRepositoryURL = DefaultsKey("gitRepositoryURL") + static let gitRepositoryUsername = DefaultsKey("gitRepositoryUsername") + static let gitRepositoryPassword = DefaultsKey("gitRepositoryPassword") + static let gitRepositorySSHPublicKeyURL = DefaultsKey("gitRepositorySSHPublicKeyURL") + static let gitRepositorySSHPrivateKeyURL = DefaultsKey("gitRepositorySSHPrivateKeyURL") + static let gitRepositorySSHPrivateKeyPassphrase = DefaultsKey("gitRepositorySSHPrivateKeyPassphrase") + + } diff --git a/pass/GitServerSettingTableViewController.swift b/pass/GitServerSettingTableViewController.swift index f166ba0..f9946f8 100644 --- a/pass/GitServerSettingTableViewController.swift +++ b/pass/GitServerSettingTableViewController.swift @@ -13,11 +13,17 @@ class GitServerSettingTableViewController: UITableViewController { @IBOutlet weak var gitRepositoryURLTextField: UITextField! + @IBOutlet weak var usernameTextField: UITextField! + + @IBOutlet weak var passwordTextField: UITextField! + override func viewDidLoad() { super.viewDidLoad() if let url = Defaults[.gitRepositoryURL] { gitRepositoryURLTextField.text = url.absoluteString } + usernameTextField.text = Defaults[.gitRepositoryUsername] + passwordTextField.text = Defaults[.gitRepositoryPassword] } override func viewDidAppear(_ animated: Bool) { diff --git a/pass/PasswordStore.swift b/pass/PasswordStore.swift index b6e879a..7c58e46 100644 --- a/pass/PasswordStore.swift +++ b/pass/PasswordStore.swift @@ -13,11 +13,36 @@ import UIKit import SwiftyUserDefaults import ObjectiveGit +struct GitCredential { + + enum Credential { + case http(userName: String, password: String) + case ssh(userName: String, password: String, publicKeyFile: URL, privateKeyFile: URL) + } + + var credential: Credential + + func credentialProvider() throws -> GTCredentialProvider { + return GTCredentialProvider { (_, _, _) -> (GTCredential) in + let credential: GTCredential? + switch self.credential { + case let .http(userName, password): + print("username \(userName), password \(password)") + credential = try? GTCredential(userName: userName, password: password) + case let .ssh(userName, password, publicKeyFile, privateKeyFile): + credential = try? GTCredential(userName: userName, publicKeyURL: publicKeyFile, privateKeyURL: privateKeyFile, passphrase: password) + } + return credential ?? GTCredential() + } + } +} + class PasswordStore { static let shared = PasswordStore() let storeURL = URL(fileURLWithPath: "\(Globals.shared.documentPath)/password-store") var storeRepository: GTRepository? + var gitCredential: GitCredential let pgp: ObjectivePGP = ObjectivePGP() @@ -32,8 +57,9 @@ class PasswordStore { } if Defaults[.pgpKeyID] != "" { pgp.importKeys(fromFile: Globals.shared.secringPath, allowDuplicates: false) - } + gitCredential = GitCredential(credential: GitCredential.Credential.http(userName: Defaults[.gitRepositoryUsername], password: Defaults[.gitRepositoryPassword])) + } func initPGP(pgpKeyURL: URL, pgpKeyLocalPath: String) -> Bool { @@ -55,9 +81,10 @@ class PasswordStore { func cloneRepository(remoteRepoURL: URL, + credential: GitCredential, transferProgressBlock: @escaping (UnsafePointer, UnsafeMutablePointer) -> Void, checkoutProgressBlock: @escaping (String?, UInt, UInt) -> Void) -> Bool { - print("start cloning remote repo") + print("start cloning remote repo: \(remoteRepoURL)") let fm = FileManager.default if (storeRepository != nil) { print("remove item") @@ -69,11 +96,16 @@ class PasswordStore { } do { print("start cloning...") - storeRepository = try GTRepository.clone(from: remoteRepoURL, toWorkingDirectory: storeURL, options: nil, transferProgressBlock:transferProgressBlock, checkoutProgressBlock: checkoutProgressBlock) + let credentialProvider = try credential.credentialProvider() + let options: [String: Any] = [ + GTRepositoryCloneOptionsCredentialProvider: credentialProvider + ] + storeRepository = try GTRepository.clone(from: remoteRepoURL, toWorkingDirectory: storeURL, options: options, transferProgressBlock:transferProgressBlock, checkoutProgressBlock: checkoutProgressBlock) + print("clone finish") updatePasswordEntityCoreData() + gitCredential = credential return true } catch { - storeRepository = nil print(error) return false } diff --git a/pass/PasswordsTableViewController.swift b/pass/PasswordsTableViewController.swift index b01e7e5..17a3b51 100644 --- a/pass/PasswordsTableViewController.swift +++ b/pass/PasswordsTableViewController.swift @@ -44,7 +44,7 @@ class PasswordsTableViewController: UITableViewController { searchController.dimsBackgroundDuringPresentation = false definesPresentationContext = true tableView.tableHeaderView = searchController.searchBar - tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false) +// tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false) } func filterContentForSearchText(searchText: String, scope: String = "All") { diff --git a/pass/SettingsTableViewController.swift b/pass/SettingsTableViewController.swift index 86645e8..c9731f6 100644 --- a/pass/SettingsTableViewController.swift +++ b/pass/SettingsTableViewController.swift @@ -20,15 +20,18 @@ class SettingsTableViewController: UITableViewController { @IBAction func save(segue: UIStoryboardSegue) { if let controller = segue.source as? GitServerSettingTableViewController { - if Defaults[.gitRepositoryURL] == nil || controller.gitRepositoryURLTextField.text != Defaults[.gitRepositoryURL]!.absoluteString { - Defaults[.gitRepositoryURL] = URL(string: controller.gitRepositoryURLTextField.text!) - + let gitRepostiroyURL = controller.gitRepositoryURLTextField.text! + let username = controller.usernameTextField.text! + let password = controller.passwordTextField.text! + + if Defaults[.gitRepositoryURL] == nil || gitRepostiroyURL != Defaults[.gitRepositoryURL]!.absoluteString { SVProgressHUD.setDefaultMaskType(.black) SVProgressHUD.show(withStatus: "Prepare Repository") - //SVProgressHUD.showProgress(0.0, status: "Clone Remote Repository") - + let gitCredential = GitCredential(credential: GitCredential.Credential.http(userName: username, password: password)) + DispatchQueue.global(qos: .userInitiated).async { - let ret = PasswordStore.shared.cloneRepository(remoteRepoURL: Defaults[.gitRepositoryURL]!, + let ret = PasswordStore.shared.cloneRepository(remoteRepoURL: URL(string: gitRepostiroyURL)!, + credential: gitCredential, transferProgressBlock:{ (git_transfer_progress, stop) in DispatchQueue.main.async { SVProgressHUD.showProgress(Float(git_transfer_progress.pointee.received_objects)/Float(git_transfer_progress.pointee.total_objects), status: "Clone Remote Repository") @@ -44,6 +47,10 @@ class SettingsTableViewController: UITableViewController { if ret { SVProgressHUD.showSuccess(withStatus: "Done") SVProgressHUD.dismiss(withDelay: 1) + Defaults[.gitRepositoryURL] = URL(string: gitRepostiroyURL) + Defaults[.gitRepositoryUsername] = username + Defaults[.gitRepositoryPassword] = password + NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) } else { SVProgressHUD.showError(withStatus: "Error")