diff options
Diffstat (limited to 'src/transports')
-rw-r--r-- | src/transports/http.c | 28 | ||||
-rw-r--r-- | src/transports/local.c | 160 | ||||
-rw-r--r-- | src/transports/smart.c | 163 | ||||
-rw-r--r-- | src/transports/smart.h | 20 | ||||
-rw-r--r-- | src/transports/smart_protocol.c | 19 | ||||
-rw-r--r-- | src/transports/ssh.c | 18 | ||||
-rw-r--r-- | src/transports/winhttp.c | 32 |
7 files changed, 165 insertions, 275 deletions
diff --git a/src/transports/http.c b/src/transports/http.c index adcb1ac43..fa576ff3e 100644 --- a/src/transports/http.c +++ b/src/transports/http.c @@ -174,6 +174,7 @@ GIT_INLINE(int) handle_remote_auth( git_http_response *response) { http_subtransport *transport = OWNING_SUBTRANSPORT(stream); + git_remote_connect_options *connect_opts = &transport->owner->connect_opts; if (response->server_auth_credtypes == 0) { git_error_set(GIT_ERROR_HTTP, "server requires authentication that we do not support"); @@ -187,8 +188,8 @@ GIT_INLINE(int) handle_remote_auth( transport->owner->url, response->server_auth_schemetypes, response->server_auth_credtypes, - transport->owner->cred_acquire_cb, - transport->owner->cred_acquire_payload); + connect_opts->callbacks.credentials, + connect_opts->callbacks.payload); } GIT_INLINE(int) handle_proxy_auth( @@ -196,6 +197,7 @@ GIT_INLINE(int) handle_proxy_auth( git_http_response *response) { http_subtransport *transport = OWNING_SUBTRANSPORT(stream); + git_remote_connect_options *connect_opts = &transport->owner->connect_opts; if (response->proxy_auth_credtypes == 0) { git_error_set(GIT_ERROR_HTTP, "proxy requires authentication that we do not support"); @@ -206,11 +208,11 @@ GIT_INLINE(int) handle_proxy_auth( return handle_auth( &transport->proxy, SERVER_TYPE_PROXY, - transport->owner->proxy.url, + connect_opts->proxy_opts.url, response->server_auth_schemetypes, response->proxy_auth_credtypes, - transport->owner->proxy.credentials, - transport->owner->proxy.payload); + connect_opts->proxy_opts.credentials, + connect_opts->proxy_opts.payload); } @@ -286,6 +288,7 @@ static int lookup_proxy( bool *out_use, http_subtransport *transport) { + git_remote_connect_options *connect_opts = &transport->owner->connect_opts; const char *proxy; git_remote *remote; char *config = NULL; @@ -294,9 +297,9 @@ static int lookup_proxy( *out_use = false; git_net_url_dispose(&transport->proxy.url); - switch (transport->owner->proxy.type) { + switch (connect_opts->proxy_opts.type) { case GIT_PROXY_SPECIFIED: - proxy = transport->owner->proxy.url; + proxy = connect_opts->proxy_opts.url; break; case GIT_PROXY_AUTO: @@ -345,7 +348,7 @@ static int generate_request( request->credentials = transport->server.cred; request->proxy = use_proxy ? &transport->proxy.url : NULL; request->proxy_credentials = transport->proxy.cred; - request->custom_headers = &transport->owner->custom_headers; + request->custom_headers = &transport->owner->connect_opts.custom_headers; if (stream->service->method == GIT_HTTP_METHOD_POST) { request->chunked = stream->service->chunked; @@ -633,6 +636,7 @@ static int http_action( git_smart_service_t action) { http_subtransport *transport = GIT_CONTAINER_OF(t, http_subtransport, parent); + git_remote_connect_options *connect_opts = &transport->owner->connect_opts; http_stream *stream; const http_service *service; int error; @@ -664,10 +668,10 @@ static int http_action( if (!transport->http_client) { git_http_client_options opts = {0}; - opts.server_certificate_check_cb = transport->owner->certificate_check_cb; - opts.server_certificate_check_payload = transport->owner->message_cb_payload; - opts.proxy_certificate_check_cb = transport->owner->proxy.certificate_check; - opts.proxy_certificate_check_payload = transport->owner->proxy.payload; + opts.server_certificate_check_cb = connect_opts->callbacks.certificate_check; + opts.server_certificate_check_payload = connect_opts->callbacks.payload; + opts.proxy_certificate_check_cb = connect_opts->proxy_opts.certificate_check; + opts.proxy_certificate_check_payload = connect_opts->proxy_opts.payload; if (git_http_client_new(&transport->http_client, &opts) < 0) return -1; diff --git a/src/transports/local.c b/src/transports/local.c index 0983914b1..6065d4020 100644 --- a/src/transports/local.c +++ b/src/transports/local.c @@ -34,12 +34,9 @@ typedef struct { git_remote *owner; char *url; int direction; - int flags; git_atomic32 cancelled; git_repository *repo; - git_transport_message_cb progress_cb; - git_transport_message_cb error_cb; - void *message_cb_payload; + git_remote_connect_options connect_opts; git_vector refs; unsigned connected : 1, have_refs : 1; @@ -200,30 +197,26 @@ on_error: static int local_connect( git_transport *transport, const char *url, - git_credential_acquire_cb cred_acquire_cb, - void *cred_acquire_payload, - const git_proxy_options *proxy, - int direction, int flags) + int direction, + const git_remote_connect_options *connect_opts) { git_repository *repo; int error; - transport_local *t = (transport_local *) transport; + transport_local *t = (transport_local *)transport; const char *path; git_str buf = GIT_STR_INIT; - GIT_UNUSED(cred_acquire_cb); - GIT_UNUSED(cred_acquire_payload); - GIT_UNUSED(proxy); - if (t->connected) return 0; + if (git_remote_connect_options_normalize(&t->connect_opts, connect_opts) < 0) + return -1; + free_heads(&t->refs); t->url = git__strdup(url); GIT_ERROR_CHECK_ALLOC(t->url); t->direction = direction; - t->flags = flags; /* 'url' may be a url or path; convert to a path */ if ((error = git_fs_path_from_url_or_path(&buf, url)) < 0) { @@ -249,6 +242,20 @@ static int local_connect( return 0; } +static int local_set_connect_opts( + git_transport *transport, + const git_remote_connect_options *connect_opts) +{ + transport_local *t = (transport_local *)transport; + + if (!t->connected) { + git_error_set(GIT_ERROR_NET, "cannot reconfigure a transport that is not connected"); + return -1; + } + + return git_remote_connect_options_normalize(&t->connect_opts, connect_opts); +} + static int local_ls(const git_remote_head ***out, size_t *size, git_transport *transport) { transport_local *t = (transport_local *)transport; @@ -337,10 +344,10 @@ static int transfer_to_push_transfer(const git_indexer_progress *stats, void *pa static int local_push( git_transport *transport, - git_push *push, - const git_remote_callbacks *cbs) + git_push *push) { transport_local *t = (transport_local *)transport; + git_remote_callbacks *cbs = &t->connect_opts.callbacks; git_repository *remote_repo = NULL; push_spec *spec; char *url = NULL; @@ -349,8 +356,6 @@ static int local_push( int error; size_t j; - GIT_UNUSED(cbs); - /* 'push->remote->url' may be a url or path; convert to a path */ if ((error = git_fs_path_from_url_or_path(&buf, push->remote->url)) < 0) { git_str_dispose(&buf); @@ -440,12 +445,11 @@ static int local_push( } if (push->specs.length) { - int flags = t->flags; url = git__strdup(t->url); if (!url || t->parent.close(&t->parent) < 0 || t->parent.connect(&t->parent, url, - NULL, NULL, NULL, GIT_DIRECTION_PUSH, flags)) + GIT_DIRECTION_PUSH, NULL)) goto on_error; } @@ -482,7 +486,7 @@ static int local_counting(int stage, unsigned int current, unsigned int total, v transport_local *t = payload; int error; - if (!t->progress_cb) + if (!t->connect_opts.callbacks.sideband_progress) return 0; if (stage == GIT_PACKBUILDER_ADDING_OBJECTS) { @@ -500,9 +504,19 @@ static int local_counting(int stage, unsigned int current, unsigned int total, v if (git_str_oom(&progress_info)) return -1; - error = t->progress_cb(git_str_cstr(&progress_info), (int)git_str_len(&progress_info), t->message_cb_payload); - git_str_dispose(&progress_info); + if (progress_info.size > INT_MAX) { + git_error_set(GIT_ERROR_NET, "remote sent overly large progress data"); + git_str_dispose(&progress_info); + return -1; + } + + + error = t->connect_opts.callbacks.sideband_progress( + progress_info.ptr, + (int)progress_info.size, + t->connect_opts.callbacks.payload); + git_str_dispose(&progress_info); return error; } @@ -532,9 +546,7 @@ static int foreach_reference_cb(git_reference *reference, void *payload) static int local_download_pack( git_transport *transport, git_repository *repo, - git_indexer_progress *stats, - git_indexer_progress_cb progress_cb, - void *progress_payload) + git_indexer_progress *stats) { transport_local *t = (transport_local*)transport; git_revwalk *walk = NULL; @@ -545,9 +557,11 @@ static int local_download_pack( git_odb_writepack *writepack = NULL; git_odb *odb = NULL; git_str progress_info = GIT_STR_INIT; + foreach_data data = {0}; if ((error = git_revwalk_new(&walk, t->repo)) < 0) goto cleanup; + git_revwalk_sorting(walk, GIT_SORT_TIME); if ((error = git_packbuilder_new(&pack, t->repo)) < 0) @@ -583,44 +597,56 @@ static int local_download_pack( if ((error = git_packbuilder_insert_walk(pack, walk))) goto cleanup; - if ((error = git_str_printf(&progress_info, counting_objects_fmt, git_packbuilder_object_count(pack))) < 0) - goto cleanup; - - if (t->progress_cb && - (error = t->progress_cb(git_str_cstr(&progress_info), (int)git_str_len(&progress_info), t->message_cb_payload)) < 0) - goto cleanup; + if (t->connect_opts.callbacks.sideband_progress) { + if ((error = git_str_printf( + &progress_info, + counting_objects_fmt, + git_packbuilder_object_count(pack))) < 0 || + (error = t->connect_opts.callbacks.sideband_progress( + progress_info.ptr, + (int)progress_info.size, + t->connect_opts.callbacks.payload)) < 0) + goto cleanup; + } /* Walk the objects, building a packfile */ if ((error = git_repository_odb__weakptr(&odb, repo)) < 0) goto cleanup; /* One last one with the newline */ - git_str_clear(&progress_info); - git_str_printf(&progress_info, counting_objects_fmt, git_packbuilder_object_count(pack)); - if ((error = git_str_putc(&progress_info, '\n')) < 0) - goto cleanup; - - if (t->progress_cb && - (error = t->progress_cb(git_str_cstr(&progress_info), (int)git_str_len(&progress_info), t->message_cb_payload)) < 0) - goto cleanup; + if (t->connect_opts.callbacks.sideband_progress) { + git_str_clear(&progress_info); + + if ((error = git_str_printf( + &progress_info, + counting_objects_fmt, + git_packbuilder_object_count(pack))) < 0 || + (error = git_str_putc(&progress_info, '\n')) < 0 || + (error = t->connect_opts.callbacks.sideband_progress( + progress_info.ptr, + (int)progress_info.size, + t->connect_opts.callbacks.payload)) < 0) + goto cleanup; + } - if ((error = git_odb_write_pack(&writepack, odb, progress_cb, progress_payload)) != 0) + if ((error = git_odb_write_pack( + &writepack, + odb, + t->connect_opts.callbacks.transfer_progress, + t->connect_opts.callbacks.payload)) < 0) goto cleanup; /* Write the data to the ODB */ - { - foreach_data data = {0}; - data.stats = stats; - data.progress_cb = progress_cb; - data.progress_payload = progress_payload; - data.writepack = writepack; + data.stats = stats; + data.progress_cb = t->connect_opts.callbacks.transfer_progress; + data.progress_payload = t->connect_opts.callbacks.payload; + data.writepack = writepack; - /* autodetect */ - git_packbuilder_set_threads(pack, 0); + /* autodetect */ + git_packbuilder_set_threads(pack, 0); - if ((error = git_packbuilder_foreach(pack, foreach_cb, &data)) != 0) - goto cleanup; - } + if ((error = git_packbuilder_foreach(pack, foreach_cb, &data)) != 0) + goto cleanup; error = writepack->commit(writepack, stats); @@ -632,24 +658,6 @@ cleanup: return error; } -static int local_set_callbacks( - git_transport *transport, - git_transport_message_cb progress_cb, - git_transport_message_cb error_cb, - git_transport_certificate_check_cb certificate_check_cb, - void *message_cb_payload) -{ - transport_local *t = (transport_local *)transport; - - GIT_UNUSED(certificate_check_cb); - - t->progress_cb = progress_cb; - t->error_cb = error_cb; - t->message_cb_payload = message_cb_payload; - - return 0; -} - static int local_is_connected(git_transport *transport) { transport_local *t = (transport_local *)transport; @@ -657,15 +665,6 @@ static int local_is_connected(git_transport *transport) return t->connected; } -static int local_read_flags(git_transport *transport, int *flags) -{ - transport_local *t = (transport_local *)transport; - - *flags = t->flags; - - return 0; -} - static void local_cancel(git_transport *transport) { transport_local *t = (transport_local *)transport; @@ -720,8 +719,8 @@ int git_transport_local(git_transport **out, git_remote *owner, void *param) GIT_ERROR_CHECK_ALLOC(t); t->parent.version = GIT_TRANSPORT_VERSION; - t->parent.set_callbacks = local_set_callbacks; t->parent.connect = local_connect; + t->parent.set_connect_opts = local_set_connect_opts; t->parent.negotiate_fetch = local_negotiate_fetch; t->parent.download_pack = local_download_pack; t->parent.push = local_push; @@ -729,7 +728,6 @@ int git_transport_local(git_transport **out, git_remote *owner, void *param) t->parent.free = local_free; t->parent.ls = local_ls; t->parent.is_connected = local_is_connected; - t->parent.read_flags = local_read_flags; t->parent.cancel = local_cancel; if ((error = git_vector_init(&t->refs, 0, NULL)) < 0) { diff --git a/src/transports/smart.c b/src/transports/smart.c index fe024de2f..4267e8841 100644 --- a/src/transports/smart.c +++ b/src/transports/smart.c @@ -56,101 +56,6 @@ GIT_INLINE(int) git_smart__reset_stream(transport_smart *t, bool close_subtransp return 0; } -static int git_smart__set_callbacks( - git_transport *transport, - git_transport_message_cb progress_cb, - git_transport_message_cb error_cb, - git_transport_certificate_check_cb certificate_check_cb, - void *message_cb_payload) -{ - transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); - - t->progress_cb = progress_cb; - t->error_cb = error_cb; - t->certificate_check_cb = certificate_check_cb; - t->message_cb_payload = message_cb_payload; - - return 0; -} - -static size_t http_header_name_length(const char *http_header) -{ - const char *colon = strchr(http_header, ':'); - if (!colon) - return 0; - return colon - http_header; -} - -static bool is_malformed_http_header(const char *http_header) -{ - const char *c; - size_t name_len; - - /* Disallow \r and \n */ - c = strchr(http_header, '\r'); - if (c) - return true; - c = strchr(http_header, '\n'); - if (c) - return true; - - /* Require a header name followed by : */ - name_len = http_header_name_length(http_header); - if (name_len < 1) - return true; - - return false; -} - -static char *forbidden_custom_headers[] = { - "User-Agent", - "Host", - "Accept", - "Content-Type", - "Transfer-Encoding", - "Content-Length", -}; - -static bool is_forbidden_custom_header(const char *custom_header) -{ - unsigned long i; - size_t name_len = http_header_name_length(custom_header); - - /* Disallow headers that we set */ - for (i = 0; i < ARRAY_SIZE(forbidden_custom_headers); i++) - if (strncmp(forbidden_custom_headers[i], custom_header, name_len) == 0) - return true; - - return false; -} - -static int git_smart__set_custom_headers( - git_transport *transport, - const git_strarray *custom_headers) -{ - transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); - size_t i; - - if (t->custom_headers.count) - git_strarray_dispose(&t->custom_headers); - - if (!custom_headers) - return 0; - - for (i = 0; i < custom_headers->count; i++) { - if (is_malformed_http_header(custom_headers->strings[i])) { - git_error_set(GIT_ERROR_INVALID, "custom HTTP header '%s' is malformed", custom_headers->strings[i]); - return -1; - } - if (is_forbidden_custom_header(custom_headers->strings[i])) { - git_error_set(GIT_ERROR_INVALID, "custom HTTP header '%s' is already set by libgit2", custom_headers->strings[i]); - return -1; - } - } - - return git_strarray_copy(&t->custom_headers, custom_headers); -} - int git_smart__update_heads(transport_smart *t, git_vector *symrefs) { size_t i; @@ -206,11 +111,8 @@ static void free_symrefs(git_vector *symrefs) static int git_smart__connect( git_transport *transport, const char *url, - git_credential_acquire_cb cred_acquire_cb, - void *cred_acquire_payload, - const git_proxy_options *proxy, int direction, - int flags) + const git_remote_connect_options *connect_opts) { transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); git_smart_subtransport_stream *stream; @@ -223,24 +125,19 @@ static int git_smart__connect( if (git_smart__reset_stream(t, true) < 0) return -1; + if (git_remote_connect_options_normalize(&t->connect_opts, connect_opts) < 0) + return -1; + t->url = git__strdup(url); GIT_ERROR_CHECK_ALLOC(t->url); - git_proxy_options_clear(&t->proxy); - - if (git_proxy_options_dup(&t->proxy, proxy) < 0) - return -1; - t->direction = direction; - t->flags = flags; - t->cred_acquire_cb = cred_acquire_cb; - t->cred_acquire_payload = cred_acquire_payload; - if (GIT_DIRECTION_FETCH == t->direction) + if (GIT_DIRECTION_FETCH == t->direction) { service = GIT_SERVICE_UPLOADPACK_LS; - else if (GIT_DIRECTION_PUSH == t->direction) + } else if (GIT_DIRECTION_PUSH == t->direction) { service = GIT_SERVICE_RECEIVEPACK_LS; - else { + } else { git_error_set(GIT_ERROR_NET, "invalid direction"); return -1; } @@ -315,6 +212,20 @@ cleanup: return error; } +static int git_smart__set_connect_opts( + git_transport *transport, + const git_remote_connect_options *opts) +{ + transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); + + if (!t->connected) { + git_error_set(GIT_ERROR_NET, "cannot reconfigure a transport that is not connected"); + return -1; + } + + return git_remote_connect_options_normalize(&t->connect_opts, opts); +} + static int git_smart__ls(const git_remote_head ***out, size_t *size, git_transport *transport) { transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); @@ -401,15 +312,6 @@ static int git_smart__is_connected(git_transport *transport) return t->connected; } -static int git_smart__read_flags(git_transport *transport, int *flags) -{ - transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); - - *flags = t->flags; - - return 0; -} - static int git_smart__close(git_transport *transport) { transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); @@ -465,9 +367,8 @@ static void git_smart__free(git_transport *transport) git_pkt_free(p); git_vector_free(refs); - git__free((char *)t->proxy.url); - git_strarray_dispose(&t->custom_headers); + git_remote_connect_options_dispose(&t->connect_opts); git__free(t); } @@ -482,34 +383,30 @@ static int ref_name_cmp(const void *a, const void *b) int git_transport_smart_certificate_check(git_transport *transport, git_cert *cert, int valid, const char *hostname) { transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); + git_remote_connect_options *connect_opts = &t->connect_opts; GIT_ASSERT_ARG(transport); GIT_ASSERT_ARG(cert); GIT_ASSERT_ARG(hostname); - if (!t->certificate_check_cb) + if (!connect_opts->callbacks.certificate_check) return GIT_PASSTHROUGH; - return t->certificate_check_cb(cert, valid, hostname, t->message_cb_payload); + return connect_opts->callbacks.certificate_check(cert, valid, hostname, connect_opts->callbacks.payload); } int git_transport_smart_credentials(git_credential **out, git_transport *transport, const char *user, int methods) { transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); + git_remote_connect_options *connect_opts = &t->connect_opts; GIT_ASSERT_ARG(out); GIT_ASSERT_ARG(transport); - if (!t->cred_acquire_cb) + if (!connect_opts->callbacks.credentials) return GIT_PASSTHROUGH; - return t->cred_acquire_cb(out, t->url, user, methods, t->cred_acquire_payload); -} - -int git_transport_smart_proxy_options(git_proxy_options *out, git_transport *transport) -{ - transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent); - return git_proxy_options_dup(out, &t->proxy); + return connect_opts->callbacks.credentials(out, t->url, user, methods, connect_opts->callbacks.payload); } int git_transport_smart(git_transport **out, git_remote *owner, void *param) @@ -524,9 +421,8 @@ int git_transport_smart(git_transport **out, git_remote *owner, void *param) GIT_ERROR_CHECK_ALLOC(t); t->parent.version = GIT_TRANSPORT_VERSION; - t->parent.set_callbacks = git_smart__set_callbacks; - t->parent.set_custom_headers = git_smart__set_custom_headers; t->parent.connect = git_smart__connect; + t->parent.set_connect_opts = git_smart__set_connect_opts; t->parent.close = git_smart__close; t->parent.free = git_smart__free; t->parent.negotiate_fetch = git_smart__negotiate_fetch; @@ -534,7 +430,6 @@ int git_transport_smart(git_transport **out, git_remote *owner, void *param) t->parent.push = git_smart__push; t->parent.ls = git_smart__ls; t->parent.is_connected = git_smart__is_connected; - t->parent.read_flags = git_smart__read_flags; t->parent.cancel = git_smart__cancel; t->owner = owner; diff --git a/src/transports/smart.h b/src/transports/smart.h index a9cab31ac..726bf40b4 100644 --- a/src/transports/smart.h +++ b/src/transports/smart.h @@ -137,16 +137,8 @@ typedef struct { git_transport parent; git_remote *owner; char *url; - git_credential_acquire_cb cred_acquire_cb; - void *cred_acquire_payload; - git_proxy_options proxy; + git_remote_connect_options connect_opts; int direction; - int flags; - git_transport_message_cb progress_cb; - git_transport_message_cb error_cb; - git_transport_certificate_check_cb certificate_check_cb; - void *message_cb_payload; - git_strarray custom_headers; git_smart_subtransport *wrapped; git_smart_subtransport_stream *current_stream; transport_smart_caps caps; @@ -157,8 +149,8 @@ typedef struct { packetsize_cb packetsize_cb; void *packetsize_payload; unsigned rpc : 1, - have_refs : 1, - connected : 1; + have_refs : 1, + connected : 1; gitno_buffer buffer; char buffer_data[65536]; } transport_smart; @@ -166,7 +158,7 @@ typedef struct { /* smart_protocol.c */ int git_smart__store_refs(transport_smart *t, int flushes); int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vector *symrefs); -int git_smart__push(git_transport *transport, git_push *push, const git_remote_callbacks *cbs); +int git_smart__push(git_transport *transport, git_push *push); int git_smart__negotiate_fetch( git_transport *transport, @@ -177,9 +169,7 @@ int git_smart__negotiate_fetch( int git_smart__download_pack( git_transport *transport, git_repository *repo, - git_indexer_progress *stats, - git_indexer_progress_cb progress_cb, - void *progress_payload); + git_indexer_progress *stats); /* smart.c */ int git_smart__negotiation_step(git_transport *transport, void *data, size_t len); diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c index a9a623cc7..f1f111715 100644 --- a/src/transports/smart_protocol.c +++ b/src/transports/smart_protocol.c @@ -512,9 +512,7 @@ static int network_packetsize(size_t received, void *payload) int git_smart__download_pack( git_transport *transport, git_repository *repo, - git_indexer_progress *stats, - git_indexer_progress_cb progress_cb, - void *progress_payload) + git_indexer_progress *stats) { transport_smart *t = (transport_smart *)transport; gitno_buffer *buf = &t->buffer; @@ -523,6 +521,10 @@ int git_smart__download_pack( int error = 0; struct network_packetsize_payload npp = {0}; + // TODO + git_indexer_progress_cb progress_cb = t->connect_opts.callbacks.transfer_progress; + void *progress_payload = t->connect_opts.callbacks.payload; + memset(stats, 0, sizeof(git_indexer_progress)); if (progress_cb) { @@ -568,7 +570,7 @@ int git_smart__download_pack( git_error_clear(); error = GIT_EUSER; } else if (pkt->type == GIT_PKT_PROGRESS) { - if (t->progress_cb) { + if (t->connect_opts.callbacks.sideband_progress) { git_pkt_progress *p = (git_pkt_progress *) pkt; if (p->len > INT_MAX) { @@ -577,7 +579,7 @@ int git_smart__download_pack( goto done; } - error = t->progress_cb(p->data, (int)p->len, t->message_cb_payload); + error = t->connect_opts.callbacks.sideband_progress(p->data, (int)p->len, t->connect_opts.callbacks.payload); } } else if (pkt->type == GIT_PKT_DATA) { git_pkt_data *p = (git_pkt_data *) pkt; @@ -811,7 +813,7 @@ static int parse_report(transport_smart *transport, git_push *push) error = -1; break; case GIT_PKT_PROGRESS: - if (transport->progress_cb) { + if (transport->connect_opts.callbacks.sideband_progress) { git_pkt_progress *p = (git_pkt_progress *) pkt; if (p->len > INT_MAX) { @@ -820,7 +822,7 @@ static int parse_report(transport_smart *transport, git_push *push) goto done; } - error = transport->progress_cb(p->data, (int)p->len, transport->message_cb_payload); + error = transport->connect_opts.callbacks.sideband_progress(p->data, (int)p->len, transport->connect_opts.callbacks.payload); } break; default: @@ -987,9 +989,10 @@ static int stream_thunk(void *buf, size_t size, void *data) return error; } -int git_smart__push(git_transport *transport, git_push *push, const git_remote_callbacks *cbs) +int git_smart__push(git_transport *transport, git_push *push) { transport_smart *t = (transport_smart *)transport; + git_remote_callbacks *cbs = &t->connect_opts.callbacks; struct push_packbuilder_payload packbuilder_payload = {0}; git_str pktline = GIT_STR_INIT; int error = 0, need_pack = 0; diff --git a/src/transports/ssh.c b/src/transports/ssh.c index e3bb5eef6..f37bf70bb 100644 --- a/src/transports/ssh.c +++ b/src/transports/ssh.c @@ -441,11 +441,15 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char * int error, no_callback = 0; git_credential *cred = NULL; - if (!t->owner->cred_acquire_cb) { + if (!t->owner->connect_opts.callbacks.credentials) { no_callback = 1; } else { - error = t->owner->cred_acquire_cb(&cred, t->owner->url, user, auth_methods, - t->owner->cred_acquire_payload); + error = t->owner->connect_opts.callbacks.credentials( + &cred, + t->owner->url, + user, + auth_methods, + t->owner->connect_opts.callbacks.payload); if (error == GIT_PASSTHROUGH) { no_callback = 1; @@ -558,7 +562,7 @@ post_extract: if ((error = _git_ssh_session_create(&session, s->io)) < 0) goto done; - if (t->owner->certificate_check_cb != NULL) { + if (t->owner->connect_opts.callbacks.certificate_check != NULL) { git_cert_hostkey cert = {{ 0 }}, *cert_ptr; const char *key; size_t cert_len; @@ -632,7 +636,11 @@ post_extract: cert_ptr = &cert; - error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, urldata.host, t->owner->message_cb_payload); + error = t->owner->connect_opts.callbacks.certificate_check( + (git_cert *)cert_ptr, + 0, + urldata.host, + t->owner->connect_opts.callbacks.payload); if (error < 0 && error != GIT_PASSTHROUGH) { if (!git_error_last()) diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c index 60f536fdb..9b5a67d3b 100644 --- a/src/transports/winhttp.c +++ b/src/transports/winhttp.c @@ -293,14 +293,14 @@ static int certificate_check(winhttp_stream *s, int valid) git_cert_x509 cert; /* If there is no override, we should fail if WinHTTP doesn't think it's fine */ - if (t->owner->certificate_check_cb == NULL && !valid) { + if (t->owner->connect_opts.callbacks.certificate_check == NULL && !valid) { if (!git_error_last()) git_error_set(GIT_ERROR_HTTP, "unknown certificate check failure"); return GIT_ECERTIFICATE; } - if (t->owner->certificate_check_cb == NULL || git__strcmp(t->server.url.scheme, "https") != 0) + if (t->owner->connect_opts.callbacks.certificate_check == NULL || git__strcmp(t->server.url.scheme, "https") != 0) return 0; if (!WinHttpQueryOption(s->request, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &cert_ctx, &cert_ctx_size)) { @@ -312,7 +312,7 @@ static int certificate_check(winhttp_stream *s, int valid) cert.parent.cert_type = GIT_CERT_X509; cert.data = cert_ctx->pbCertEncoded; cert.len = cert_ctx->cbCertEncoded; - error = t->owner->certificate_check_cb((git_cert *) &cert, valid, t->server.url.host, t->owner->message_cb_payload); + error = t->owner->connect_opts.callbacks.certificate_check((git_cert *) &cert, valid, t->server.url.host, t->owner->connect_opts.callbacks.payload); CertFreeCertificateContext(cert_ctx); if (error == GIT_PASSTHROUGH) @@ -426,7 +426,7 @@ static int winhttp_stream_connect(winhttp_stream *s) goto on_error; } - proxy_opts = &t->owner->proxy; + proxy_opts = &t->owner->connect_opts.proxy_opts; if (proxy_opts->type == GIT_PROXY_AUTO) { /* Set proxy if necessary */ if (git_remote__http_proxy(&proxy_url, t->owner->owner, &t->server.url) < 0) @@ -560,10 +560,10 @@ static int winhttp_stream_connect(winhttp_stream *s) } } - for (i = 0; i < t->owner->custom_headers.count; i++) { - if (t->owner->custom_headers.strings[i]) { + for (i = 0; i < t->owner->connect_opts.custom_headers.count; i++) { + if (t->owner->connect_opts.custom_headers.strings[i]) { git_str_clear(&buf); - git_str_puts(&buf, t->owner->custom_headers.strings[i]); + git_str_puts(&buf, t->owner->connect_opts.custom_headers.strings[i]); if (git__utf8_to_16(ct, MAX_CONTENT_TYPE_LEN, git_str_cstr(&buf)) < 0) { git_error_set(GIT_ERROR_OS, "failed to convert custom header to wide characters"); goto on_error; @@ -577,14 +577,6 @@ static int winhttp_stream_connect(winhttp_stream *s) } } - /* If requested, disable certificate validation */ - if (strcmp(t->server.url.scheme, "https") == 0) { - int flags; - - if (t->owner->parent.read_flags(&t->owner->parent, &flags) < 0) - goto on_error; - } - if ((error = apply_credentials(s->request, &t->server.url, WINHTTP_AUTH_TARGET_SERVER, t->server.cred, t->server.auth_mechanisms)) < 0) goto on_error; @@ -1218,8 +1210,8 @@ replay: int error = acquire_credentials(s->request, &t->server, t->owner->url, - t->owner->cred_acquire_cb, - t->owner->cred_acquire_payload); + t->owner->connect_opts.callbacks.credentials, + t->owner->connect_opts.callbacks.payload); if (error < 0) { return error; @@ -1231,9 +1223,9 @@ replay: } else if (status_code == HTTP_STATUS_PROXY_AUTH_REQ) { int error = acquire_credentials(s->request, &t->proxy, - t->owner->proxy.url, - t->owner->proxy.credentials, - t->owner->proxy.payload); + t->owner->connect_opts.proxy_opts.url, + t->owner->connect_opts.proxy_opts.credentials, + t->owner->connect_opts.proxy_opts.payload); if (error < 0) { return error; |