mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-11 12:09:07 +00:00
transports: allow the creds callback to say it doesn't exist
Allow the credentials callback to return GIT_PASSTHROUGH to make the transports code behave as though none was set. This should make it easier for bindings to behave closer to the C code when there is no credentials callback set at their level.
This commit is contained in:
parent
2efd7df6b1
commit
bc0a619867
@ -468,6 +468,9 @@ struct git_remote_callbacks {
|
|||||||
/**
|
/**
|
||||||
* This will be called if the remote host requires
|
* This will be called if the remote host requires
|
||||||
* authentication in order to connect to it.
|
* authentication in order to connect to it.
|
||||||
|
*
|
||||||
|
* Returning GIT_PASSTHROUGH will make libgit2 behave as
|
||||||
|
* though this field isn't set.
|
||||||
*/
|
*/
|
||||||
int (*credentials)(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *data);
|
int (*credentials)(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *data);
|
||||||
|
|
||||||
|
@ -248,6 +248,7 @@ static int on_headers_complete(http_parser *parser)
|
|||||||
http_subtransport *t = ctx->t;
|
http_subtransport *t = ctx->t;
|
||||||
http_stream *s = ctx->s;
|
http_stream *s = ctx->s;
|
||||||
git_buf buf = GIT_BUF_INIT;
|
git_buf buf = GIT_BUF_INIT;
|
||||||
|
int error = 0, no_callback = 0;
|
||||||
|
|
||||||
/* Both parse_header_name and parse_header_value are populated
|
/* Both parse_header_name and parse_header_value are populated
|
||||||
* and ready for consumption. */
|
* and ready for consumption. */
|
||||||
@ -256,29 +257,43 @@ static int on_headers_complete(http_parser *parser)
|
|||||||
return t->parse_error = PARSE_ERROR_GENERIC;
|
return t->parse_error = PARSE_ERROR_GENERIC;
|
||||||
|
|
||||||
/* Check for an authentication failure. */
|
/* Check for an authentication failure. */
|
||||||
|
|
||||||
if (parser->status_code == 401 &&
|
if (parser->status_code == 401 &&
|
||||||
get_verb == s->verb &&
|
get_verb == s->verb) {
|
||||||
t->owner->cred_acquire_cb) {
|
if (!t->owner->cred_acquire_payload) {
|
||||||
int allowed_types = 0;
|
no_callback = 1;
|
||||||
|
} else {
|
||||||
|
int allowed_types = 0;
|
||||||
|
|
||||||
if (parse_unauthorized_response(&t->www_authenticate,
|
if (parse_unauthorized_response(&t->www_authenticate,
|
||||||
&allowed_types, &t->auth_mechanism) < 0)
|
&allowed_types, &t->auth_mechanism) < 0)
|
||||||
|
return t->parse_error = PARSE_ERROR_GENERIC;
|
||||||
|
|
||||||
|
if (allowed_types &&
|
||||||
|
(!t->cred || 0 == (t->cred->credtype & allowed_types))) {
|
||||||
|
|
||||||
|
error = t->owner->cred_acquire_cb(&t->cred,
|
||||||
|
t->owner->url,
|
||||||
|
t->connection_data.user,
|
||||||
|
allowed_types,
|
||||||
|
t->owner->cred_acquire_payload);
|
||||||
|
|
||||||
|
if (error == GIT_PASSTHROUGH) {
|
||||||
|
no_callback = 1;
|
||||||
|
} else if (error < 0) {
|
||||||
|
return PARSE_ERROR_GENERIC;
|
||||||
|
} else {
|
||||||
|
assert(t->cred);
|
||||||
|
|
||||||
|
/* Successfully acquired a credential. */
|
||||||
|
return t->parse_error = PARSE_ERROR_REPLAY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_callback) {
|
||||||
|
giterr_set(GITERR_NET, "authentication required but no callback set");
|
||||||
return t->parse_error = PARSE_ERROR_GENERIC;
|
return t->parse_error = PARSE_ERROR_GENERIC;
|
||||||
|
|
||||||
if (allowed_types &&
|
|
||||||
(!t->cred || 0 == (t->cred->credtype & allowed_types))) {
|
|
||||||
|
|
||||||
if (t->owner->cred_acquire_cb(&t->cred,
|
|
||||||
t->owner->url,
|
|
||||||
t->connection_data.user,
|
|
||||||
allowed_types,
|
|
||||||
t->owner->cred_acquire_payload) < 0)
|
|
||||||
return PARSE_ERROR_GENERIC;
|
|
||||||
|
|
||||||
assert(t->cred);
|
|
||||||
|
|
||||||
/* Successfully acquired a credential. */
|
|
||||||
return t->parse_error = PARSE_ERROR_REPLAY;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,6 +387,7 @@ static int _git_ssh_setup_conn(
|
|||||||
{
|
{
|
||||||
char *host=NULL, *port=NULL, *path=NULL, *user=NULL, *pass=NULL;
|
char *host=NULL, *port=NULL, *path=NULL, *user=NULL, *pass=NULL;
|
||||||
const char *default_port="22";
|
const char *default_port="22";
|
||||||
|
int no_callback = 0;
|
||||||
ssh_stream *s;
|
ssh_stream *s;
|
||||||
LIBSSH2_SESSION* session=NULL;
|
LIBSSH2_SESSION* session=NULL;
|
||||||
LIBSSH2_CHANNEL* channel=NULL;
|
LIBSSH2_CHANNEL* channel=NULL;
|
||||||
@ -413,24 +414,31 @@ static int _git_ssh_setup_conn(
|
|||||||
if (user && pass) {
|
if (user && pass) {
|
||||||
if (git_cred_userpass_plaintext_new(&t->cred, user, pass) < 0)
|
if (git_cred_userpass_plaintext_new(&t->cred, user, pass) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
} else if (t->owner->cred_acquire_cb) {
|
} else if (!t->owner->cred_acquire_cb) {
|
||||||
if (t->owner->cred_acquire_cb(
|
no_callback = 1;
|
||||||
&t->cred, t->owner->url, user,
|
} else {
|
||||||
GIT_CREDTYPE_USERPASS_PLAINTEXT |
|
int error;
|
||||||
GIT_CREDTYPE_SSH_KEY |
|
error = t->owner->cred_acquire_cb(&t->cred, t->owner->url, user,
|
||||||
GIT_CREDTYPE_SSH_INTERACTIVE |
|
GIT_CREDTYPE_USERPASS_PLAINTEXT |
|
||||||
GIT_CREDTYPE_SSH_CUSTOM,
|
GIT_CREDTYPE_SSH_KEY | GIT_CREDTYPE_SSH_CUSTOM |
|
||||||
t->owner->cred_acquire_payload) < 0)
|
GIT_CREDTYPE_SSH_INTERACTIVE,
|
||||||
goto on_error;
|
t->owner->cred_acquire_payload);
|
||||||
|
|
||||||
if (!t->cred) {
|
if (error == GIT_PASSTHROUGH)
|
||||||
|
no_callback = 1;
|
||||||
|
else if (error < 0)
|
||||||
|
goto on_error;
|
||||||
|
else if (!t->cred) {
|
||||||
giterr_set(GITERR_SSH, "Callback failed to initialize SSH credentials");
|
giterr_set(GITERR_SSH, "Callback failed to initialize SSH credentials");
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
giterr_set(GITERR_SSH, "Cannot set up SSH connection without credentials");
|
|
||||||
|
if (no_callback) {
|
||||||
|
giterr_set(GITERR_SSH, "authentication required but no callback set");
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(t->cred);
|
assert(t->cred);
|
||||||
|
|
||||||
if (_git_ssh_session_create(&session, s->socket) < 0)
|
if (_git_ssh_session_create(&session, s->socket) < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user