summaryrefslogtreecommitdiff
path: root/src/transports
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2018-11-06 14:15:43 +0000
committerEdward Thomson <ethomson@edwardthomson.com>2018-11-21 23:06:12 +0000
commita2e6e0ea0e947954836b27572e753c7f95e5a1f4 (patch)
tree5314f62c8e903b4799f253b8c1ef9a77a60964b5 /src/transports
parent8ee1009874d11a61ccd4b89322432c3633b4cc1f (diff)
downloadlibgit2-a2e6e0ea0e947954836b27572e753c7f95e5a1f4.tar.gz
transport: allow cred/cert callbacks to return GIT_PASSTHROUGHethomson/defer_cert_cred_cb
Allow credential and certificate checking callbacks to return GIT_PASSTHROUGH, indicating that they do not want to act. Introduce this to support in both the http and ssh callbacks. Additionally, enable the same mechanism for certificate validation. This is most useful to disambiguate any meaning in the publicly exposed credential and certificate functions (`git_transport_smart_credentials` and `git_transport_smart_certificate_check`) but it may be more generally useful for callers to be able to defer back to libgit2.
Diffstat (limited to 'src/transports')
-rw-r--r--src/transports/http.c4
-rw-r--r--src/transports/ssh.c9
-rw-r--r--src/transports/winhttp.c5
3 files changed, 13 insertions, 5 deletions
diff --git a/src/transports/http.c b/src/transports/http.c
index 0942daf3e..3190c464c 100644
--- a/src/transports/http.c
+++ b/src/transports/http.c
@@ -367,6 +367,7 @@ static int on_headers_complete(http_parser *parser)
allowed_auth_types,
t->owner->cred_acquire_payload);
+ /* treat GIT_PASSTHROUGH as if callback isn't set */
if (error == GIT_PASSTHROUGH) {
no_callback = 1;
} else if (error < 0) {
@@ -635,6 +636,9 @@ static int http_connect(http_subtransport *t)
giterr_clear();
error = t->owner->certificate_check_cb(cert, is_valid, t->connection_data.host, t->owner->message_cb_payload);
+ if (error == GIT_PASSTHROUGH)
+ error = is_valid ? 0 : GIT_ECERTIFICATE;
+
if (error < 0) {
if (!giterr_last())
giterr_set(GITERR_NET, "user cancelled certificate check");
diff --git a/src/transports/ssh.c b/src/transports/ssh.c
index 7d9114c26..9e01a4aea 100644
--- a/src/transports/ssh.c
+++ b/src/transports/ssh.c
@@ -447,11 +447,11 @@ static int request_creds(git_cred **out, ssh_subtransport *t, const char *user,
error = t->owner->cred_acquire_cb(&cred, t->owner->url, user, auth_methods,
t->owner->cred_acquire_payload);
- if (error == GIT_PASSTHROUGH)
+ if (error == GIT_PASSTHROUGH) {
no_callback = 1;
- else if (error < 0)
+ } else if (error < 0) {
return error;
- else if (!cred) {
+ } else if (!cred) {
giterr_set(GITERR_SSH, "callback failed to initialize SSH credentials");
return -1;
}
@@ -584,7 +584,8 @@ post_extract:
cert_ptr = &cert;
error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, host, t->owner->message_cb_payload);
- if (error < 0) {
+
+ if (error < 0 && error != GIT_PASSTHROUGH) {
if (!giterr_last())
giterr_set(GITERR_NET, "user cancelled hostkey check");
diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c
index e925dbdc0..5e7bde73c 100644
--- a/src/transports/winhttp.c
+++ b/src/transports/winhttp.c
@@ -228,7 +228,7 @@ static int fallback_cred_acquire_cb(
}
hCoInitResult = CoInitializeEx(NULL, COINIT_MULTITHREADED);
-
+
if (SUCCEEDED(hCoInitResult) || hCoInitResult == RPC_E_CHANGED_MODE) {
IInternetSecurityManager* pISM;
@@ -295,6 +295,9 @@ static int certificate_check(winhttp_stream *s, int valid)
error = t->owner->certificate_check_cb((git_cert *) &cert, valid, t->connection_data.host, t->owner->message_cb_payload);
CertFreeCertificateContext(cert_ctx);
+ if (error == GIT_PASSTHROUGH)
+ error = valid ? 0 : GIT_ECERTIFICATE;
+
if (error < 0 && !giterr_last())
giterr_set(GITERR_NET, "user cancelled certificate check");