From 242741a950b5f0fb7e80202a26856e7fa1e1530f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jake=20Van=20Alstyne=20=F0=9F=8E=A9?= Date: Wed, 9 Aug 2017 14:17:56 -0600 Subject: [PATCH 1/3] add ssh agent authentication --- SwiftGit2/Credentials.swift | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/SwiftGit2/Credentials.swift b/SwiftGit2/Credentials.swift index df750d3..a501eb5 100644 --- a/SwiftGit2/Credentials.swift +++ b/SwiftGit2/Credentials.swift @@ -16,8 +16,18 @@ private class Wrapper { } } +/// Convert libgit2 string to Swift string +/// +/// - parameter cStr: C string pointer +/// +/// - returns: Swift string +func git_string_converter(_ cStr: UnsafePointer) -> String { + return String(cString: cStr) +} + public enum Credentials { case `default` + case agent case plaintext(username: String, password: String) case sshMemory(username: String, publicKey: String, privateKey: String, passphrase: String) @@ -33,13 +43,24 @@ public enum Credentials { /// Handle the request of credentials, passing through to a wrapped block after converting the arguments. /// Converts the result to the correct error code required by libgit2 (0 = success, 1 = rejected setting creds, /// -1 = error) -internal func credentialsCallback(cred: UnsafeMutablePointer?>?, _: UnsafePointer?, - _: UnsafePointer?, _: UInt32, payload: UnsafeMutableRawPointer?) -> Int32 { +internal func credentialsCallback(cred: UnsafeMutablePointer?>?, + url: UnsafePointer?, username: UnsafePointer?, + _: UInt32, payload: UnsafeMutableRawPointer?) -> Int32 { let result: Int32 + // Find username_from_url + let name: String? + if username == nil { + name = nil + } else { + name = git_string_converter(username!) + } + switch Credentials.fromPointer(payload!) { case .default: result = git_cred_default_new(cred) + case .agent: + result = git_cred_ssh_key_from_agent(cred, name!) case .plaintext(let username, let password): result = git_cred_userpass_plaintext_new(cred, username, password) case .sshMemory(let username, let publicKey, let privateKey, let passphrase): From f635f50b84aea9fdeca5c830fe0148c3d5ddc674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jake=20Van=20Alstyne=20=F0=9F=8E=A9?= Date: Wed, 9 Aug 2017 14:52:57 -0600 Subject: [PATCH 2/3] incorporate requested changes --- SwiftGit2/Credentials.swift | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/SwiftGit2/Credentials.swift b/SwiftGit2/Credentials.swift index a501eb5..d120069 100644 --- a/SwiftGit2/Credentials.swift +++ b/SwiftGit2/Credentials.swift @@ -16,15 +16,6 @@ private class Wrapper { } } -/// Convert libgit2 string to Swift string -/// -/// - parameter cStr: C string pointer -/// -/// - returns: Swift string -func git_string_converter(_ cStr: UnsafePointer) -> String { - return String(cString: cStr) -} - public enum Credentials { case `default` case agent @@ -43,18 +34,18 @@ public enum Credentials { /// Handle the request of credentials, passing through to a wrapped block after converting the arguments. /// Converts the result to the correct error code required by libgit2 (0 = success, 1 = rejected setting creds, /// -1 = error) -internal func credentialsCallback(cred: UnsafeMutablePointer?>?, - url: UnsafePointer?, username: UnsafePointer?, - _: UInt32, payload: UnsafeMutableRawPointer?) -> Int32 { +internal func credentialsCallback( + cred: UnsafeMutablePointer?>?, + url: UnsafePointer?, + username: UnsafePointer?, + _: UInt32, + payload: UnsafeMutableRawPointer? + ) -> Int32 { + let result: Int32 // Find username_from_url - let name: String? - if username == nil { - name = nil - } else { - name = git_string_converter(username!) - } + let name = username.map(String.init(cString:)) switch Credentials.fromPointer(payload!) { case .default: From 31680a50a3118f10dce5967da998c733c4f37129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jake=20Van=20Alstyne=20=F0=9F=8E=A9?= Date: Thu, 10 Aug 2017 14:53:35 -0600 Subject: [PATCH 3/3] rename it sshAgent --- SwiftGit2/Credentials.swift | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SwiftGit2/Credentials.swift b/SwiftGit2/Credentials.swift index d120069..2ac5884 100644 --- a/SwiftGit2/Credentials.swift +++ b/SwiftGit2/Credentials.swift @@ -18,7 +18,7 @@ private class Wrapper { public enum Credentials { case `default` - case agent + case sshAgent case plaintext(username: String, password: String) case sshMemory(username: String, publicKey: String, privateKey: String, passphrase: String) @@ -39,8 +39,7 @@ internal func credentialsCallback( url: UnsafePointer?, username: UnsafePointer?, _: UInt32, - payload: UnsafeMutableRawPointer? - ) -> Int32 { + payload: UnsafeMutableRawPointer? ) -> Int32 { let result: Int32 @@ -50,7 +49,7 @@ internal func credentialsCallback( switch Credentials.fromPointer(payload!) { case .default: result = git_cred_default_new(cred) - case .agent: + case .sshAgent: result = git_cred_ssh_key_from_agent(cred, name!) case .plaintext(let username, let password): result = git_cred_userpass_plaintext_new(cred, username, password)