rugged 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -0
- data/README.md +3 -3
- data/ext/rugged/rugged.c +7 -4
- data/ext/rugged/rugged_commit.c +1 -1
- data/ext/rugged/rugged_config.c +1 -1
- data/ext/rugged/rugged_object.c +1 -1
- data/ext/rugged/rugged_remote.c +32 -2
- data/ext/rugged/rugged_repo.c +13 -3
- data/lib/rugged/commit.rb +17 -4
- data/lib/rugged/repository.rb +7 -8
- data/lib/rugged/submodule_collection.rb +4 -4
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +41 -74
- data/vendor/libgit2/COPYING +109 -1
- data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
- data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
- data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
- data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +29 -32
- data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +21 -28
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
- data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +24 -10
- data/vendor/libgit2/deps/ntlmclient/compat.h +0 -27
- data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +164 -135
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
- data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
- data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
- data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
- data/vendor/libgit2/deps/pcre/LICENCE +93 -0
- data/vendor/libgit2/deps/pcre/pcre.h +2 -2
- data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
- data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
- data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
- data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
- data/vendor/libgit2/deps/zlib/deflate.c +1 -0
- data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
- data/vendor/libgit2/include/git2/apply.h +2 -0
- data/vendor/libgit2/include/git2/attr.h +89 -0
- data/vendor/libgit2/include/git2/blame.h +95 -42
- data/vendor/libgit2/include/git2/blob.h +31 -3
- data/vendor/libgit2/include/git2/branch.h +25 -0
- data/vendor/libgit2/include/git2/cert.h +42 -5
- data/vendor/libgit2/include/git2/checkout.h +28 -12
- data/vendor/libgit2/include/git2/commit.h +35 -19
- data/vendor/libgit2/include/git2/common.h +33 -6
- data/vendor/libgit2/include/git2/config.h +1 -1
- data/vendor/libgit2/include/git2/deprecated.h +248 -8
- data/vendor/libgit2/include/git2/diff.h +35 -20
- data/vendor/libgit2/include/git2/errors.h +8 -7
- data/vendor/libgit2/include/git2/filter.h +57 -17
- data/vendor/libgit2/include/git2/graph.h +20 -2
- data/vendor/libgit2/include/git2/index.h +4 -5
- data/vendor/libgit2/include/git2/indexer.h +2 -1
- data/vendor/libgit2/include/git2/odb.h +44 -20
- data/vendor/libgit2/include/git2/pack.h +1 -1
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/rebase.h +25 -1
- data/vendor/libgit2/include/git2/refs.h +9 -5
- data/vendor/libgit2/include/git2/remote.h +59 -6
- data/vendor/libgit2/include/git2/repository.h +95 -52
- data/vendor/libgit2/include/git2/revparse.h +5 -5
- data/vendor/libgit2/include/git2/status.h +115 -59
- data/vendor/libgit2/include/git2/strarray.h +6 -10
- data/vendor/libgit2/include/git2/submodule.h +9 -0
- data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
- data/vendor/libgit2/include/git2/sys/filter.h +49 -28
- data/vendor/libgit2/include/git2/sys/midx.h +74 -0
- data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
- data/vendor/libgit2/include/git2/sys/transport.h +1 -0
- data/vendor/libgit2/include/git2/tag.h +12 -0
- data/vendor/libgit2/include/git2/transport.h +1 -1
- data/vendor/libgit2/include/git2/tree.h +2 -14
- data/vendor/libgit2/include/git2/types.h +9 -0
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/include/git2/worktree.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +77 -44
- data/vendor/libgit2/src/alloc.c +21 -8
- data/vendor/libgit2/src/allocators/failalloc.c +92 -0
- data/vendor/libgit2/src/allocators/failalloc.h +23 -0
- data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
- data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
- data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
- data/vendor/libgit2/src/annotated_commit.c +21 -9
- data/vendor/libgit2/src/apply.c +21 -8
- data/vendor/libgit2/src/array.h +11 -11
- data/vendor/libgit2/src/assert_safe.h +58 -0
- data/vendor/libgit2/src/attr.c +181 -74
- data/vendor/libgit2/src/attr_file.c +92 -42
- data/vendor/libgit2/src/attr_file.h +32 -11
- data/vendor/libgit2/src/attrcache.c +44 -40
- data/vendor/libgit2/src/attrcache.h +4 -5
- data/vendor/libgit2/src/blame.c +28 -15
- data/vendor/libgit2/src/blame_git.c +6 -3
- data/vendor/libgit2/src/blob.c +46 -24
- data/vendor/libgit2/src/branch.c +87 -37
- data/vendor/libgit2/src/buffer.c +339 -27
- data/vendor/libgit2/src/buffer.h +153 -2
- data/vendor/libgit2/src/cache.c +3 -24
- data/vendor/libgit2/src/cache.h +7 -7
- data/vendor/libgit2/src/cc-compat.h +10 -2
- data/vendor/libgit2/src/checkout.c +97 -98
- data/vendor/libgit2/src/cherrypick.c +8 -2
- data/vendor/libgit2/src/clone.c +104 -29
- data/vendor/libgit2/src/commit.c +41 -28
- data/vendor/libgit2/src/commit_graph.c +1209 -0
- data/vendor/libgit2/src/commit_graph.h +162 -0
- data/vendor/libgit2/src/commit_list.c +46 -0
- data/vendor/libgit2/src/commit_list.h +2 -0
- data/vendor/libgit2/src/common.h +26 -2
- data/vendor/libgit2/src/config.c +40 -22
- data/vendor/libgit2/src/config_cache.c +9 -4
- data/vendor/libgit2/src/config_entries.c +35 -27
- data/vendor/libgit2/src/config_file.c +25 -8
- data/vendor/libgit2/src/config_parse.c +5 -7
- data/vendor/libgit2/src/config_snapshot.c +2 -1
- data/vendor/libgit2/src/crlf.c +16 -6
- data/vendor/libgit2/src/date.c +4 -3
- data/vendor/libgit2/src/delta.c +1 -1
- data/vendor/libgit2/src/describe.c +11 -4
- data/vendor/libgit2/src/diff.c +23 -19
- data/vendor/libgit2/src/diff_driver.c +21 -17
- data/vendor/libgit2/src/diff_file.c +5 -7
- data/vendor/libgit2/src/diff_generate.c +56 -28
- data/vendor/libgit2/src/diff_parse.c +2 -3
- data/vendor/libgit2/src/diff_print.c +81 -65
- data/vendor/libgit2/src/diff_stats.c +19 -16
- data/vendor/libgit2/src/diff_tform.c +13 -13
- data/vendor/libgit2/src/diff_xdiff.c +4 -2
- data/vendor/libgit2/src/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/errors.c +26 -19
- data/vendor/libgit2/src/features.h.in +5 -1
- data/vendor/libgit2/src/fetch.c +7 -2
- data/vendor/libgit2/src/fetchhead.c +8 -4
- data/vendor/libgit2/src/filebuf.c +9 -7
- data/vendor/libgit2/src/filter.c +209 -113
- data/vendor/libgit2/src/filter.h +24 -5
- data/vendor/libgit2/src/futils.c +8 -8
- data/vendor/libgit2/src/futils.h +4 -4
- data/vendor/libgit2/src/graph.c +64 -9
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
- data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
- data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
- data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
- data/vendor/libgit2/src/hash.c +16 -13
- data/vendor/libgit2/src/hash.h +1 -1
- data/vendor/libgit2/src/hashsig.c +23 -10
- data/vendor/libgit2/src/ident.c +13 -3
- data/vendor/libgit2/src/idxmap.c +0 -22
- data/vendor/libgit2/src/ignore.c +35 -19
- data/vendor/libgit2/src/index.c +126 -84
- data/vendor/libgit2/src/index.h +1 -1
- data/vendor/libgit2/src/indexer.c +60 -36
- data/vendor/libgit2/src/integer.h +79 -2
- data/vendor/libgit2/src/iterator.c +40 -28
- data/vendor/libgit2/src/iterator.h +1 -1
- data/vendor/libgit2/src/khash.h +2 -11
- data/vendor/libgit2/src/{settings.c → libgit2.c} +125 -49
- data/vendor/libgit2/src/libgit2.h +15 -0
- data/vendor/libgit2/src/mailmap.c +23 -10
- data/vendor/libgit2/src/map.h +3 -3
- data/vendor/libgit2/src/merge.c +108 -46
- data/vendor/libgit2/src/merge.h +2 -1
- data/vendor/libgit2/src/merge_driver.c +19 -13
- data/vendor/libgit2/src/merge_file.c +15 -9
- data/vendor/libgit2/src/message.c +3 -1
- data/vendor/libgit2/src/midx.c +879 -0
- data/vendor/libgit2/src/midx.h +110 -0
- data/vendor/libgit2/src/mwindow.c +214 -95
- data/vendor/libgit2/src/mwindow.h +3 -3
- data/vendor/libgit2/src/net.c +133 -4
- data/vendor/libgit2/src/net.h +16 -2
- data/vendor/libgit2/src/netops.c +6 -4
- data/vendor/libgit2/src/netops.h +2 -2
- data/vendor/libgit2/src/notes.c +10 -10
- data/vendor/libgit2/src/object.c +24 -15
- data/vendor/libgit2/src/odb.c +298 -57
- data/vendor/libgit2/src/odb.h +16 -2
- data/vendor/libgit2/src/odb_loose.c +31 -21
- data/vendor/libgit2/src/odb_mempack.c +3 -1
- data/vendor/libgit2/src/odb_pack.c +391 -114
- data/vendor/libgit2/src/oid.c +7 -4
- data/vendor/libgit2/src/pack-objects.c +83 -69
- data/vendor/libgit2/src/pack.c +383 -150
- data/vendor/libgit2/src/pack.h +44 -9
- data/vendor/libgit2/src/patch.c +14 -7
- data/vendor/libgit2/src/patch_generate.c +3 -5
- data/vendor/libgit2/src/patch_parse.c +6 -3
- data/vendor/libgit2/src/path.c +102 -57
- data/vendor/libgit2/src/path.h +79 -6
- data/vendor/libgit2/src/pathspec.c +12 -11
- data/vendor/libgit2/src/pool.c +34 -22
- data/vendor/libgit2/src/pool.h +9 -1
- data/vendor/libgit2/src/posix.c +43 -12
- data/vendor/libgit2/src/posix.h +9 -0
- data/vendor/libgit2/src/proxy.c +2 -0
- data/vendor/libgit2/src/push.c +2 -0
- data/vendor/libgit2/src/reader.c +10 -6
- data/vendor/libgit2/src/rebase.c +95 -49
- data/vendor/libgit2/src/refdb.c +165 -13
- data/vendor/libgit2/src/refdb.h +69 -0
- data/vendor/libgit2/src/refdb_fs.c +144 -152
- data/vendor/libgit2/src/reflog.c +21 -20
- data/vendor/libgit2/src/refs.c +151 -231
- data/vendor/libgit2/src/refs.h +2 -20
- data/vendor/libgit2/src/refspec.c +80 -44
- data/vendor/libgit2/src/regexp.c +2 -2
- data/vendor/libgit2/src/remote.c +312 -121
- data/vendor/libgit2/src/remote.h +2 -1
- data/vendor/libgit2/src/repository.c +351 -189
- data/vendor/libgit2/src/repository.h +23 -29
- data/vendor/libgit2/src/reset.c +7 -6
- data/vendor/libgit2/src/revert.c +8 -2
- data/vendor/libgit2/src/revparse.c +19 -13
- data/vendor/libgit2/src/revwalk.c +35 -20
- data/vendor/libgit2/src/runtime.c +162 -0
- data/vendor/libgit2/src/runtime.h +62 -0
- data/vendor/libgit2/src/{refdb_fs.h → settings.h} +3 -11
- data/vendor/libgit2/src/signature.c +6 -5
- data/vendor/libgit2/src/sortedcache.c +2 -3
- data/vendor/libgit2/src/sortedcache.h +10 -8
- data/vendor/libgit2/src/stash.c +7 -3
- data/vendor/libgit2/src/status.c +9 -4
- data/vendor/libgit2/src/strarray.c +64 -0
- data/vendor/libgit2/src/streams/mbedtls.c +14 -17
- data/vendor/libgit2/src/streams/mbedtls.h +1 -1
- data/vendor/libgit2/src/streams/openssl.c +113 -207
- data/vendor/libgit2/src/streams/openssl.h +9 -1
- data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
- data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
- data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
- data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
- data/vendor/libgit2/src/streams/registry.c +10 -9
- data/vendor/libgit2/src/streams/socket.c +6 -2
- data/vendor/libgit2/src/streams/stransport.c +6 -3
- data/vendor/libgit2/src/streams/tls.c +5 -3
- data/vendor/libgit2/src/submodule.c +134 -66
- data/vendor/libgit2/src/submodule.h +9 -9
- data/vendor/libgit2/src/sysdir.c +8 -26
- data/vendor/libgit2/src/sysdir.h +0 -11
- data/vendor/libgit2/src/tag.c +49 -11
- data/vendor/libgit2/src/thread.c +140 -0
- data/vendor/libgit2/src/thread.h +479 -0
- data/vendor/libgit2/src/threadstate.c +83 -0
- data/vendor/libgit2/src/threadstate.h +24 -0
- data/vendor/libgit2/src/trace.c +2 -2
- data/vendor/libgit2/src/trace.h +17 -13
- data/vendor/libgit2/src/transaction.c +21 -9
- data/vendor/libgit2/src/transport.c +3 -3
- data/vendor/libgit2/src/transports/auth.c +1 -1
- data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
- data/vendor/libgit2/src/transports/credential.c +17 -7
- data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
- data/vendor/libgit2/src/transports/git.c +1 -3
- data/vendor/libgit2/src/transports/http.c +19 -17
- data/vendor/libgit2/src/transports/http.h +1 -0
- data/vendor/libgit2/src/transports/httpclient.c +84 -42
- data/vendor/libgit2/src/transports/httpclient.h +1 -1
- data/vendor/libgit2/src/transports/local.c +5 -5
- data/vendor/libgit2/src/transports/smart.c +14 -9
- data/vendor/libgit2/src/transports/smart.h +1 -1
- data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
- data/vendor/libgit2/src/transports/ssh.c +51 -17
- data/vendor/libgit2/src/transports/winhttp.c +156 -88
- data/vendor/libgit2/src/tree.c +100 -77
- data/vendor/libgit2/src/tree.h +1 -0
- data/vendor/libgit2/src/tsort.c +0 -2
- data/vendor/libgit2/src/unix/map.c +3 -1
- data/vendor/libgit2/src/unix/posix.h +16 -1
- data/vendor/libgit2/src/unix/pthread.h +2 -1
- data/vendor/libgit2/src/utf8.c +150 -0
- data/vendor/libgit2/src/utf8.h +52 -0
- data/vendor/libgit2/src/util.c +74 -183
- data/vendor/libgit2/src/util.h +33 -39
- data/vendor/libgit2/src/vector.c +23 -19
- data/vendor/libgit2/src/vector.h +4 -2
- data/vendor/libgit2/src/win32/findfile.c +4 -2
- data/vendor/libgit2/src/win32/git2.rc +18 -3
- data/vendor/libgit2/src/win32/map.c +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
- data/vendor/libgit2/src/win32/path_w32.c +23 -25
- data/vendor/libgit2/src/win32/path_w32.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +77 -1
- data/vendor/libgit2/src/win32/precompiled.h +0 -1
- data/vendor/libgit2/src/win32/reparse.h +4 -4
- data/vendor/libgit2/src/win32/thread.c +24 -15
- data/vendor/libgit2/src/win32/thread.h +1 -1
- data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
- data/vendor/libgit2/src/win32/w32_common.h +18 -9
- data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
- data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
- data/vendor/libgit2/src/win32/w32_util.h +6 -6
- data/vendor/libgit2/src/worktree.c +37 -15
- data/vendor/libgit2/src/zstream.c +1 -1
- metadata +56 -38
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
- data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
- data/vendor/libgit2/src/buf_text.c +0 -316
- data/vendor/libgit2/src/buf_text.h +0 -122
- data/vendor/libgit2/src/global.c +0 -361
- data/vendor/libgit2/src/global.h +0 -41
- data/vendor/libgit2/src/thread-utils.c +0 -58
- data/vendor/libgit2/src/thread-utils.h +0 -246
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
- data/vendor/libgit2/src/win32/w32_stack.c +0 -188
- data/vendor/libgit2/src/win32/w32_stack.h +0 -140
|
@@ -90,7 +90,7 @@ extern int git_http_client_new(
|
|
|
90
90
|
|
|
91
91
|
/*
|
|
92
92
|
* Sends a request to the host specified by the request URL. If the
|
|
93
|
-
* method is POST, either the
|
|
93
|
+
* method is POST, either the content_length or the chunked flag must
|
|
94
94
|
* be specified. The body should be provided in subsequent calls to
|
|
95
95
|
* git_http_client_send_body.
|
|
96
96
|
*
|
|
@@ -36,7 +36,7 @@ typedef struct {
|
|
|
36
36
|
char *url;
|
|
37
37
|
int direction;
|
|
38
38
|
int flags;
|
|
39
|
-
|
|
39
|
+
git_atomic32 cancelled;
|
|
40
40
|
git_repository *repo;
|
|
41
41
|
git_transport_message_cb progress_cb;
|
|
42
42
|
git_transport_message_cb error_cb;
|
|
@@ -158,7 +158,7 @@ static int store_refs(transport_local *t)
|
|
|
158
158
|
git_remote_head *head;
|
|
159
159
|
git_strarray ref_names = {0};
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
GIT_ASSERT_ARG(t);
|
|
162
162
|
|
|
163
163
|
if (git_reference_list(&ref_names, t->repo) < 0)
|
|
164
164
|
goto on_error;
|
|
@@ -185,12 +185,12 @@ static int store_refs(transport_local *t)
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
t->have_refs = 1;
|
|
188
|
-
|
|
188
|
+
git_strarray_dispose(&ref_names);
|
|
189
189
|
return 0;
|
|
190
190
|
|
|
191
191
|
on_error:
|
|
192
192
|
git_vector_free(&t->refs);
|
|
193
|
-
|
|
193
|
+
git_strarray_dispose(&ref_names);
|
|
194
194
|
return -1;
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -671,7 +671,7 @@ static void local_cancel(git_transport *transport)
|
|
|
671
671
|
{
|
|
672
672
|
transport_local *t = (transport_local *)transport;
|
|
673
673
|
|
|
674
|
-
|
|
674
|
+
git_atomic32_set(&t->cancelled, 1);
|
|
675
675
|
}
|
|
676
676
|
|
|
677
677
|
static int local_close(git_transport *transport)
|
|
@@ -18,7 +18,7 @@ static int git_smart__recv_cb(gitno_buffer *buf)
|
|
|
18
18
|
size_t old_len, bytes_read;
|
|
19
19
|
int error;
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
GIT_ASSERT(t->current_stream);
|
|
22
22
|
|
|
23
23
|
old_len = buf->offset;
|
|
24
24
|
|
|
@@ -30,7 +30,7 @@ static int git_smart__recv_cb(gitno_buffer *buf)
|
|
|
30
30
|
if (t->packetsize_cb && !t->cancelled.val) {
|
|
31
31
|
error = t->packetsize_cb(bytes_read, t->packetsize_payload);
|
|
32
32
|
if (error) {
|
|
33
|
-
|
|
33
|
+
git_atomic32_set(&t->cancelled, 1);
|
|
34
34
|
return GIT_EUSER;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -132,7 +132,7 @@ static int git_smart__set_custom_headers(
|
|
|
132
132
|
size_t i;
|
|
133
133
|
|
|
134
134
|
if (t->custom_headers.count)
|
|
135
|
-
|
|
135
|
+
git_strarray_dispose(&t->custom_headers);
|
|
136
136
|
|
|
137
137
|
if (!custom_headers)
|
|
138
138
|
return 0;
|
|
@@ -226,6 +226,8 @@ static int git_smart__connect(
|
|
|
226
226
|
t->url = git__strdup(url);
|
|
227
227
|
GIT_ERROR_CHECK_ALLOC(t->url);
|
|
228
228
|
|
|
229
|
+
git_proxy_options_clear(&t->proxy);
|
|
230
|
+
|
|
229
231
|
if (git_proxy_options_dup(&t->proxy, proxy) < 0)
|
|
230
232
|
return -1;
|
|
231
233
|
|
|
@@ -346,7 +348,7 @@ int git_smart__negotiation_step(git_transport *transport, void *data, size_t len
|
|
|
346
348
|
return error;
|
|
347
349
|
|
|
348
350
|
/* If this is a stateful implementation, the stream we get back should be the same */
|
|
349
|
-
|
|
351
|
+
GIT_ASSERT(t->rpc || t->current_stream == stream);
|
|
350
352
|
|
|
351
353
|
/* Save off the current stream (i.e. socket) that we are working with */
|
|
352
354
|
t->current_stream = stream;
|
|
@@ -375,7 +377,7 @@ int git_smart__get_push_stream(transport_smart *t, git_smart_subtransport_stream
|
|
|
375
377
|
return error;
|
|
376
378
|
|
|
377
379
|
/* If this is a stateful implementation, the stream we get back should be the same */
|
|
378
|
-
|
|
380
|
+
GIT_ASSERT(t->rpc || t->current_stream == *stream);
|
|
379
381
|
|
|
380
382
|
/* Save off the current stream (i.e. socket) that we are working with */
|
|
381
383
|
t->current_stream = *stream;
|
|
@@ -389,7 +391,7 @@ static void git_smart__cancel(git_transport *transport)
|
|
|
389
391
|
{
|
|
390
392
|
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
|
|
391
393
|
|
|
392
|
-
|
|
394
|
+
git_atomic32_set(&t->cancelled, 1);
|
|
393
395
|
}
|
|
394
396
|
|
|
395
397
|
static int git_smart__is_connected(git_transport *transport)
|
|
@@ -465,7 +467,7 @@ static void git_smart__free(git_transport *transport)
|
|
|
465
467
|
git_vector_free(refs);
|
|
466
468
|
git__free((char *)t->proxy.url);
|
|
467
469
|
|
|
468
|
-
|
|
470
|
+
git_strarray_dispose(&t->custom_headers);
|
|
469
471
|
|
|
470
472
|
git__free(t);
|
|
471
473
|
}
|
|
@@ -481,7 +483,9 @@ int git_transport_smart_certificate_check(git_transport *transport, git_cert *ce
|
|
|
481
483
|
{
|
|
482
484
|
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
|
|
483
485
|
|
|
484
|
-
|
|
486
|
+
GIT_ASSERT_ARG(transport);
|
|
487
|
+
GIT_ASSERT_ARG(cert);
|
|
488
|
+
GIT_ASSERT_ARG(hostname);
|
|
485
489
|
|
|
486
490
|
if (!t->certificate_check_cb)
|
|
487
491
|
return GIT_PASSTHROUGH;
|
|
@@ -493,7 +497,8 @@ int git_transport_smart_credentials(git_credential **out, git_transport *transpo
|
|
|
493
497
|
{
|
|
494
498
|
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
|
|
495
499
|
|
|
496
|
-
|
|
500
|
+
GIT_ASSERT_ARG(out);
|
|
501
|
+
GIT_ASSERT_ARG(transport);
|
|
497
502
|
|
|
498
503
|
if (!t->cred_acquire_cb)
|
|
499
504
|
return GIT_PASSTHROUGH;
|
|
@@ -64,7 +64,9 @@ int git_smart__store_refs(transport_smart *t, int flushes)
|
|
|
64
64
|
continue;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
gitno_consume(buf, line_end)
|
|
67
|
+
if (gitno_consume(buf, line_end) < 0)
|
|
68
|
+
return -1;
|
|
69
|
+
|
|
68
70
|
if (pkt->type == GIT_PKT_ERR) {
|
|
69
71
|
git_error_set(GIT_ERROR_NET, "remote error: %s", ((git_pkt_err *)pkt)->error);
|
|
70
72
|
git__free(pkt);
|
|
@@ -236,7 +238,9 @@ static int recv_pkt(git_pkt **out_pkt, git_pkt_type *out_type, gitno_buffer *buf
|
|
|
236
238
|
}
|
|
237
239
|
} while (error);
|
|
238
240
|
|
|
239
|
-
gitno_consume(buf, line_end)
|
|
241
|
+
if (gitno_consume(buf, line_end) < 0)
|
|
242
|
+
return -1;
|
|
243
|
+
|
|
240
244
|
if (out_type != NULL)
|
|
241
245
|
*out_type = pkt->type;
|
|
242
246
|
if (out_pkt != NULL)
|
|
@@ -531,7 +535,7 @@ int git_smart__download_pack(
|
|
|
531
535
|
/* We might have something in the buffer already from negotiate_fetch */
|
|
532
536
|
if (t->buffer.offset > 0 && !t->cancelled.val)
|
|
533
537
|
if (t->packetsize_cb(t->buffer.offset, t->packetsize_payload))
|
|
534
|
-
|
|
538
|
+
git_atomic32_set(&t->cancelled, 1);
|
|
535
539
|
}
|
|
536
540
|
|
|
537
541
|
if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 ||
|
|
@@ -791,7 +795,8 @@ static int parse_report(transport_smart *transport, git_push *push)
|
|
|
791
795
|
continue;
|
|
792
796
|
}
|
|
793
797
|
|
|
794
|
-
gitno_consume(buf, line_end)
|
|
798
|
+
if (gitno_consume(buf, line_end) < 0)
|
|
799
|
+
return -1;
|
|
795
800
|
|
|
796
801
|
error = 0;
|
|
797
802
|
|
|
@@ -970,9 +975,10 @@ static int stream_thunk(void *buf, size_t size, void *data)
|
|
|
970
975
|
|
|
971
976
|
if (payload->cb) {
|
|
972
977
|
double current_time = git__timer();
|
|
978
|
+
double elapsed = current_time - payload->last_progress_report_time;
|
|
973
979
|
payload->last_bytes += size;
|
|
974
980
|
|
|
975
|
-
if (
|
|
981
|
+
if (elapsed < 0 || elapsed >= MIN_PROGRESS_UPDATE_INTERVAL) {
|
|
976
982
|
payload->last_progress_report_time = current_time;
|
|
977
983
|
error = payload->cb(payload->pb->nr_written, payload->pb->nr_objects, payload->last_bytes, payload->cb_payload);
|
|
978
984
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#include <libssh2.h>
|
|
12
12
|
#endif
|
|
13
13
|
|
|
14
|
-
#include "
|
|
14
|
+
#include "runtime.h"
|
|
15
15
|
#include "git2.h"
|
|
16
16
|
#include "buffer.h"
|
|
17
17
|
#include "net.h"
|
|
@@ -238,7 +238,7 @@ static int ssh_stream_alloc(
|
|
|
238
238
|
{
|
|
239
239
|
ssh_stream *s;
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
GIT_ASSERT_ARG(stream);
|
|
242
242
|
|
|
243
243
|
s = git__calloc(sizeof(ssh_stream), 1);
|
|
244
244
|
GIT_ERROR_CHECK_ALLOC(s);
|
|
@@ -404,8 +404,8 @@ static int _git_ssh_authenticate_session(
|
|
|
404
404
|
case GIT_CREDENTIAL_SSH_MEMORY: {
|
|
405
405
|
git_credential_ssh_key *c = (git_credential_ssh_key *)cred;
|
|
406
406
|
|
|
407
|
-
|
|
408
|
-
|
|
407
|
+
GIT_ASSERT(c->username);
|
|
408
|
+
GIT_ASSERT(c->privatekey);
|
|
409
409
|
|
|
410
410
|
rc = libssh2_userauth_publickey_frommemory(
|
|
411
411
|
session,
|
|
@@ -461,13 +461,13 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
|
|
|
461
461
|
|
|
462
462
|
if (no_callback) {
|
|
463
463
|
git_error_set(GIT_ERROR_SSH, "authentication required but no callback set");
|
|
464
|
-
return
|
|
464
|
+
return GIT_EAUTH;
|
|
465
465
|
}
|
|
466
466
|
|
|
467
467
|
if (!(cred->credtype & auth_methods)) {
|
|
468
468
|
cred->free(cred);
|
|
469
|
-
git_error_set(GIT_ERROR_SSH, "callback returned unsupported credentials type");
|
|
470
|
-
return
|
|
469
|
+
git_error_set(GIT_ERROR_SSH, "authentication callback returned unsupported credentials type");
|
|
470
|
+
return GIT_EAUTH;
|
|
471
471
|
}
|
|
472
472
|
|
|
473
473
|
*out = cred;
|
|
@@ -483,7 +483,7 @@ static int _git_ssh_session_create(
|
|
|
483
483
|
LIBSSH2_SESSION* s;
|
|
484
484
|
git_socket_stream *socket = GIT_CONTAINER_OF(io, git_socket_stream, parent);
|
|
485
485
|
|
|
486
|
-
|
|
486
|
+
GIT_ASSERT_ARG(session);
|
|
487
487
|
|
|
488
488
|
s = libssh2_session_init();
|
|
489
489
|
if (!s) {
|
|
@@ -563,9 +563,46 @@ post_extract:
|
|
|
563
563
|
if (t->owner->certificate_check_cb != NULL) {
|
|
564
564
|
git_cert_hostkey cert = {{ 0 }}, *cert_ptr;
|
|
565
565
|
const char *key;
|
|
566
|
+
size_t cert_len;
|
|
567
|
+
int cert_type;
|
|
566
568
|
|
|
567
569
|
cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
|
|
568
570
|
|
|
571
|
+
key = libssh2_session_hostkey(session, &cert_len, &cert_type);
|
|
572
|
+
if (key != NULL) {
|
|
573
|
+
cert.type |= GIT_CERT_SSH_RAW;
|
|
574
|
+
cert.hostkey = key;
|
|
575
|
+
cert.hostkey_len = cert_len;
|
|
576
|
+
switch (cert_type) {
|
|
577
|
+
case LIBSSH2_HOSTKEY_TYPE_RSA:
|
|
578
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
|
|
579
|
+
break;
|
|
580
|
+
case LIBSSH2_HOSTKEY_TYPE_DSS:
|
|
581
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
|
|
582
|
+
break;
|
|
583
|
+
|
|
584
|
+
#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
|
|
585
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
|
|
586
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
|
|
587
|
+
break;
|
|
588
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
|
|
589
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
|
|
590
|
+
break;
|
|
591
|
+
case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
|
|
592
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
|
|
593
|
+
break;
|
|
594
|
+
#endif
|
|
595
|
+
|
|
596
|
+
#ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
|
|
597
|
+
case LIBSSH2_HOSTKEY_TYPE_ED25519:
|
|
598
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
|
|
599
|
+
break;
|
|
600
|
+
#endif
|
|
601
|
+
default:
|
|
602
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
569
606
|
#ifdef LIBSSH2_HOSTKEY_HASH_SHA256
|
|
570
607
|
key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
|
|
571
608
|
if (key != NULL) {
|
|
@@ -772,7 +809,7 @@ static int _ssh_close(git_smart_subtransport *subtransport)
|
|
|
772
809
|
{
|
|
773
810
|
ssh_subtransport *t = GIT_CONTAINER_OF(subtransport, ssh_subtransport, parent);
|
|
774
811
|
|
|
775
|
-
|
|
812
|
+
GIT_ASSERT(!t->current_stream);
|
|
776
813
|
|
|
777
814
|
GIT_UNUSED(t);
|
|
778
815
|
|
|
@@ -783,8 +820,6 @@ static void _ssh_free(git_smart_subtransport *subtransport)
|
|
|
783
820
|
{
|
|
784
821
|
ssh_subtransport *t = GIT_CONTAINER_OF(subtransport, ssh_subtransport, parent);
|
|
785
822
|
|
|
786
|
-
assert(!t->current_stream);
|
|
787
|
-
|
|
788
823
|
git__free(t->cmd_uploadpack);
|
|
789
824
|
git__free(t->cmd_receivepack);
|
|
790
825
|
git__free(t);
|
|
@@ -805,7 +840,7 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
|
|
|
805
840
|
/* either error, or the remote accepts NONE auth, which is bizarre, let's punt */
|
|
806
841
|
if (list == NULL && !libssh2_userauth_authenticated(session)) {
|
|
807
842
|
ssh_error(session, "Failed to retrieve list of SSH authentication methods");
|
|
808
|
-
return
|
|
843
|
+
return GIT_EAUTH;
|
|
809
844
|
}
|
|
810
845
|
|
|
811
846
|
ptr = list;
|
|
@@ -849,7 +884,7 @@ int git_smart_subtransport_ssh(
|
|
|
849
884
|
#ifdef GIT_SSH
|
|
850
885
|
ssh_subtransport *t;
|
|
851
886
|
|
|
852
|
-
|
|
887
|
+
GIT_ASSERT_ARG(out);
|
|
853
888
|
|
|
854
889
|
GIT_UNUSED(param);
|
|
855
890
|
|
|
@@ -867,7 +902,7 @@ int git_smart_subtransport_ssh(
|
|
|
867
902
|
GIT_UNUSED(owner);
|
|
868
903
|
GIT_UNUSED(param);
|
|
869
904
|
|
|
870
|
-
|
|
905
|
+
GIT_ASSERT_ARG(out);
|
|
871
906
|
*out = NULL;
|
|
872
907
|
|
|
873
908
|
git_error_set(GIT_ERROR_INVALID, "cannot create SSH transport. Library was built without SSH support");
|
|
@@ -911,7 +946,7 @@ int git_transport_ssh_with_paths(git_transport **out, git_remote *owner, void *p
|
|
|
911
946
|
GIT_UNUSED(owner);
|
|
912
947
|
GIT_UNUSED(payload);
|
|
913
948
|
|
|
914
|
-
|
|
949
|
+
GIT_ASSERT_ARG(out);
|
|
915
950
|
*out = NULL;
|
|
916
951
|
|
|
917
952
|
git_error_set(GIT_ERROR_INVALID, "cannot create SSH transport. Library was built without SSH support");
|
|
@@ -934,8 +969,7 @@ int git_transport_ssh_global_init(void)
|
|
|
934
969
|
return -1;
|
|
935
970
|
}
|
|
936
971
|
|
|
937
|
-
|
|
938
|
-
return 0;
|
|
972
|
+
return git_runtime_shutdown_register(shutdown_ssh);
|
|
939
973
|
|
|
940
974
|
#else
|
|
941
975
|
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
#include "smart.h"
|
|
18
18
|
#include "remote.h"
|
|
19
19
|
#include "repository.h"
|
|
20
|
-
#include "global.h"
|
|
21
20
|
#include "http.h"
|
|
22
21
|
#include "git2/sys/credential.h"
|
|
23
22
|
|
|
@@ -41,14 +40,22 @@
|
|
|
41
40
|
#define WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH 0
|
|
42
41
|
#endif
|
|
43
42
|
|
|
44
|
-
#ifndef
|
|
43
|
+
#ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1
|
|
45
44
|
# define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 0x00000200
|
|
46
45
|
#endif
|
|
47
46
|
|
|
48
|
-
#ifndef
|
|
47
|
+
#ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2
|
|
49
48
|
# define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 0x00000800
|
|
50
49
|
#endif
|
|
51
50
|
|
|
51
|
+
#ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3
|
|
52
|
+
# define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3 0x00002000
|
|
53
|
+
#endif
|
|
54
|
+
|
|
55
|
+
#ifndef WINHTTP_NO_CLIENT_CERT_CONTEXT
|
|
56
|
+
# define WINHTTP_NO_CLIENT_CERT_CONTEXT NULL
|
|
57
|
+
#endif
|
|
58
|
+
|
|
52
59
|
#ifndef HTTP_STATUS_PERMANENT_REDIRECT
|
|
53
60
|
# define HTTP_STATUS_PERMANENT_REDIRECT 308
|
|
54
61
|
#endif
|
|
@@ -108,7 +115,8 @@ typedef struct {
|
|
|
108
115
|
DWORD post_body_len;
|
|
109
116
|
unsigned sent_request : 1,
|
|
110
117
|
received_response : 1,
|
|
111
|
-
chunked : 1
|
|
118
|
+
chunked : 1,
|
|
119
|
+
status_sending_request_reached: 1;
|
|
112
120
|
} winhttp_stream;
|
|
113
121
|
|
|
114
122
|
typedef struct {
|
|
@@ -146,7 +154,7 @@ static int apply_userpass_credentials(HINTERNET request, DWORD target, int mecha
|
|
|
146
154
|
native_scheme = WINHTTP_AUTH_SCHEME_BASIC;
|
|
147
155
|
} else {
|
|
148
156
|
git_error_set(GIT_ERROR_HTTP, "invalid authentication scheme");
|
|
149
|
-
error =
|
|
157
|
+
error = GIT_EAUTH;
|
|
150
158
|
goto done;
|
|
151
159
|
}
|
|
152
160
|
|
|
@@ -185,7 +193,7 @@ static int apply_default_credentials(HINTERNET request, DWORD target, int mechan
|
|
|
185
193
|
native_scheme = WINHTTP_AUTH_SCHEME_NTLM;
|
|
186
194
|
} else {
|
|
187
195
|
git_error_set(GIT_ERROR_HTTP, "invalid authentication scheme");
|
|
188
|
-
return
|
|
196
|
+
return GIT_EAUTH;
|
|
189
197
|
}
|
|
190
198
|
|
|
191
199
|
/*
|
|
@@ -265,7 +273,7 @@ static int acquire_fallback_cred(
|
|
|
265
273
|
pISM->lpVtbl->Release(pISM);
|
|
266
274
|
}
|
|
267
275
|
|
|
268
|
-
/* Only
|
|
276
|
+
/* Only uninitialize if the call to CoInitializeEx was successful. */
|
|
269
277
|
if (SUCCEEDED(hCoInitResult))
|
|
270
278
|
CoUninitialize();
|
|
271
279
|
}
|
|
@@ -421,7 +429,7 @@ static int winhttp_stream_connect(winhttp_stream *s)
|
|
|
421
429
|
proxy_opts = &t->owner->proxy;
|
|
422
430
|
if (proxy_opts->type == GIT_PROXY_AUTO) {
|
|
423
431
|
/* Set proxy if necessary */
|
|
424
|
-
if (
|
|
432
|
+
if (git_remote__http_proxy(&proxy_url, t->owner->owner, &t->server.url) < 0)
|
|
425
433
|
goto on_error;
|
|
426
434
|
}
|
|
427
435
|
else if (proxy_opts->type == GIT_PROXY_SPECIFIED) {
|
|
@@ -448,8 +456,14 @@ static int winhttp_stream_connect(winhttp_stream *s)
|
|
|
448
456
|
git_buf_puts(&processed_url, t->proxy.url.scheme);
|
|
449
457
|
git_buf_PUTS(&processed_url, "://");
|
|
450
458
|
|
|
459
|
+
if (git_net_url_is_ipv6(&t->proxy.url))
|
|
460
|
+
git_buf_putc(&processed_url, '[');
|
|
461
|
+
|
|
451
462
|
git_buf_puts(&processed_url, t->proxy.url.host);
|
|
452
463
|
|
|
464
|
+
if (git_net_url_is_ipv6(&t->proxy.url))
|
|
465
|
+
git_buf_putc(&processed_url, ']');
|
|
466
|
+
|
|
453
467
|
if (!git_net_url_is_default_port(&t->proxy.url))
|
|
454
468
|
git_buf_printf(&processed_url, ":%s", t->proxy.url.port);
|
|
455
469
|
|
|
@@ -602,7 +616,7 @@ static int parse_unauthorized_response(
|
|
|
602
616
|
*/
|
|
603
617
|
if (!WinHttpQueryAuthSchemes(request, &supported, &first, &target)) {
|
|
604
618
|
git_error_set(GIT_ERROR_OS, "failed to parse supported auth schemes");
|
|
605
|
-
return
|
|
619
|
+
return GIT_EAUTH;
|
|
606
620
|
}
|
|
607
621
|
|
|
608
622
|
if (WINHTTP_AUTH_SCHEME_NTLM & supported) {
|
|
@@ -704,46 +718,54 @@ static void CALLBACK winhttp_status(
|
|
|
704
718
|
DWORD status;
|
|
705
719
|
|
|
706
720
|
GIT_UNUSED(connection);
|
|
707
|
-
GIT_UNUSED(ctx);
|
|
708
721
|
GIT_UNUSED(info_len);
|
|
709
722
|
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
723
|
+
switch (code) {
|
|
724
|
+
case WINHTTP_CALLBACK_STATUS_SECURE_FAILURE:
|
|
725
|
+
status = *((DWORD *)info);
|
|
726
|
+
|
|
727
|
+
if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID))
|
|
728
|
+
git_error_set(GIT_ERROR_HTTP, "SSL certificate issued for different common name");
|
|
729
|
+
else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID))
|
|
730
|
+
git_error_set(GIT_ERROR_HTTP, "SSL certificate has expired");
|
|
731
|
+
else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA))
|
|
732
|
+
git_error_set(GIT_ERROR_HTTP, "SSL certificate signed by unknown CA");
|
|
733
|
+
else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT))
|
|
734
|
+
git_error_set(GIT_ERROR_HTTP, "SSL certificate is invalid");
|
|
735
|
+
else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED))
|
|
736
|
+
git_error_set(GIT_ERROR_HTTP, "certificate revocation check failed");
|
|
737
|
+
else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED))
|
|
738
|
+
git_error_set(GIT_ERROR_HTTP, "SSL certificate was revoked");
|
|
739
|
+
else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR))
|
|
740
|
+
git_error_set(GIT_ERROR_HTTP, "security libraries could not be loaded");
|
|
741
|
+
else
|
|
742
|
+
git_error_set(GIT_ERROR_HTTP, "unknown security error %lu", status);
|
|
743
|
+
|
|
744
|
+
break;
|
|
745
|
+
|
|
746
|
+
case WINHTTP_CALLBACK_STATUS_SENDING_REQUEST:
|
|
747
|
+
((winhttp_stream *) ctx)->status_sending_request_reached = 1;
|
|
748
|
+
|
|
749
|
+
break;
|
|
750
|
+
}
|
|
731
751
|
}
|
|
732
752
|
|
|
733
753
|
static int winhttp_connect(
|
|
734
754
|
winhttp_subtransport *t)
|
|
735
755
|
{
|
|
736
|
-
wchar_t *wide_host;
|
|
756
|
+
wchar_t *wide_host = NULL;
|
|
737
757
|
int32_t port;
|
|
738
|
-
wchar_t *wide_ua;
|
|
739
|
-
git_buf ua = GIT_BUF_INIT;
|
|
758
|
+
wchar_t *wide_ua = NULL;
|
|
759
|
+
git_buf ipv6 = GIT_BUF_INIT, ua = GIT_BUF_INIT;
|
|
760
|
+
const char *host;
|
|
740
761
|
int error = -1;
|
|
741
762
|
int default_timeout = TIMEOUT_INFINITE;
|
|
742
763
|
int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT;
|
|
743
764
|
DWORD protocols =
|
|
744
765
|
WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 |
|
|
745
766
|
WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 |
|
|
746
|
-
WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2
|
|
767
|
+
WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 |
|
|
768
|
+
WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
|
|
747
769
|
|
|
748
770
|
t->session = NULL;
|
|
749
771
|
t->connection = NULL;
|
|
@@ -751,29 +773,33 @@ static int winhttp_connect(
|
|
|
751
773
|
/* Prepare port */
|
|
752
774
|
if (git__strntol32(&port, t->server.url.port,
|
|
753
775
|
strlen(t->server.url.port), NULL, 10) < 0)
|
|
754
|
-
|
|
776
|
+
goto on_error;
|
|
777
|
+
|
|
778
|
+
/* IPv6? Add braces around the host. */
|
|
779
|
+
if (git_net_url_is_ipv6(&t->server.url)) {
|
|
780
|
+
if (git_buf_printf(&ipv6, "[%s]", t->server.url.host) < 0)
|
|
781
|
+
goto on_error;
|
|
782
|
+
|
|
783
|
+
host = ipv6.ptr;
|
|
784
|
+
} else {
|
|
785
|
+
host = t->server.url.host;
|
|
786
|
+
}
|
|
755
787
|
|
|
756
788
|
/* Prepare host */
|
|
757
|
-
if (git__utf8_to_16_alloc(&wide_host,
|
|
789
|
+
if (git__utf8_to_16_alloc(&wide_host, host) < 0) {
|
|
758
790
|
git_error_set(GIT_ERROR_OS, "unable to convert host to wide characters");
|
|
759
|
-
|
|
791
|
+
goto on_error;
|
|
760
792
|
}
|
|
761
793
|
|
|
762
794
|
|
|
763
|
-
if (
|
|
764
|
-
|
|
765
|
-
return error;
|
|
766
|
-
}
|
|
795
|
+
if (git_http__user_agent(&ua) < 0)
|
|
796
|
+
goto on_error;
|
|
767
797
|
|
|
768
798
|
if (git__utf8_to_16_alloc(&wide_ua, git_buf_cstr(&ua)) < 0) {
|
|
769
799
|
git_error_set(GIT_ERROR_OS, "unable to convert host to wide characters");
|
|
770
|
-
|
|
771
|
-
git_buf_dispose(&ua);
|
|
772
|
-
return -1;
|
|
800
|
+
goto on_error;
|
|
773
801
|
}
|
|
774
802
|
|
|
775
|
-
git_buf_dispose(&ua);
|
|
776
|
-
|
|
777
803
|
/* Establish session */
|
|
778
804
|
t->session = WinHttpOpen(
|
|
779
805
|
wide_ua,
|
|
@@ -788,14 +814,20 @@ static int winhttp_connect(
|
|
|
788
814
|
}
|
|
789
815
|
|
|
790
816
|
/*
|
|
791
|
-
* Do a best-effort attempt to enable TLS 1.2 but allow this to
|
|
792
|
-
* fail; if TLS 1.2 support is not available for some reason,
|
|
817
|
+
* Do a best-effort attempt to enable TLS 1.3 and 1.2 but allow this to
|
|
818
|
+
* fail; if TLS 1.2 or 1.3 support is not available for some reason,
|
|
793
819
|
* ignore the failure (it will keep the default protocols).
|
|
794
820
|
*/
|
|
795
|
-
WinHttpSetOption(t->session,
|
|
821
|
+
if (WinHttpSetOption(t->session,
|
|
796
822
|
WINHTTP_OPTION_SECURE_PROTOCOLS,
|
|
797
823
|
&protocols,
|
|
798
|
-
sizeof(protocols))
|
|
824
|
+
sizeof(protocols)) == FALSE) {
|
|
825
|
+
protocols &= ~WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
|
|
826
|
+
WinHttpSetOption(t->session,
|
|
827
|
+
WINHTTP_OPTION_SECURE_PROTOCOLS,
|
|
828
|
+
&protocols,
|
|
829
|
+
sizeof(protocols));
|
|
830
|
+
}
|
|
799
831
|
|
|
800
832
|
if (!WinHttpSetTimeouts(t->session, default_timeout, default_connect_timeout, default_timeout, default_timeout)) {
|
|
801
833
|
git_error_set(GIT_ERROR_OS, "failed to set timeouts for WinHTTP");
|
|
@@ -815,7 +847,12 @@ static int winhttp_connect(
|
|
|
815
847
|
goto on_error;
|
|
816
848
|
}
|
|
817
849
|
|
|
818
|
-
if (WinHttpSetStatusCallback(
|
|
850
|
+
if (WinHttpSetStatusCallback(
|
|
851
|
+
t->connection,
|
|
852
|
+
winhttp_status,
|
|
853
|
+
WINHTTP_CALLBACK_FLAG_SECURE_FAILURE | WINHTTP_CALLBACK_FLAG_SEND_REQUEST,
|
|
854
|
+
0
|
|
855
|
+
) == WINHTTP_INVALID_STATUS_CALLBACK) {
|
|
819
856
|
git_error_set(GIT_ERROR_OS, "failed to set status callback");
|
|
820
857
|
goto on_error;
|
|
821
858
|
}
|
|
@@ -826,6 +863,8 @@ on_error:
|
|
|
826
863
|
if (error < 0)
|
|
827
864
|
winhttp_close_connection(t);
|
|
828
865
|
|
|
866
|
+
git_buf_dispose(&ua);
|
|
867
|
+
git_buf_dispose(&ipv6);
|
|
829
868
|
git__free(wide_host);
|
|
830
869
|
git__free(wide_ua);
|
|
831
870
|
|
|
@@ -847,12 +886,12 @@ static int do_send_request(winhttp_stream *s, size_t len, bool chunked)
|
|
|
847
886
|
success = WinHttpSendRequest(s->request,
|
|
848
887
|
WINHTTP_NO_ADDITIONAL_HEADERS, 0,
|
|
849
888
|
WINHTTP_NO_REQUEST_DATA, 0,
|
|
850
|
-
WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH,
|
|
889
|
+
WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, (DWORD_PTR)s);
|
|
851
890
|
} else {
|
|
852
891
|
success = WinHttpSendRequest(s->request,
|
|
853
892
|
WINHTTP_NO_ADDITIONAL_HEADERS, 0,
|
|
854
893
|
WINHTTP_NO_REQUEST_DATA, 0,
|
|
855
|
-
(DWORD)len,
|
|
894
|
+
(DWORD)len, (DWORD_PTR)s);
|
|
856
895
|
}
|
|
857
896
|
|
|
858
897
|
if (success || GetLastError() != (DWORD)SEC_E_BUFFER_TOO_SMALL)
|
|
@@ -864,42 +903,71 @@ static int do_send_request(winhttp_stream *s, size_t len, bool chunked)
|
|
|
864
903
|
|
|
865
904
|
static int send_request(winhttp_stream *s, size_t len, bool chunked)
|
|
866
905
|
{
|
|
867
|
-
int request_failed =
|
|
868
|
-
DWORD ignore_flags;
|
|
906
|
+
int request_failed = 1, error, attempts = 0;
|
|
907
|
+
DWORD ignore_flags, send_request_error;
|
|
869
908
|
|
|
870
909
|
git_error_clear();
|
|
871
|
-
if ((error = do_send_request(s, len, chunked)) < 0) {
|
|
872
|
-
if (GetLastError() != ERROR_WINHTTP_SECURE_FAILURE) {
|
|
873
|
-
git_error_set(GIT_ERROR_OS, "failed to send request");
|
|
874
|
-
return -1;
|
|
875
|
-
}
|
|
876
910
|
|
|
877
|
-
|
|
878
|
-
cert_valid =
|
|
879
|
-
|
|
911
|
+
while (request_failed && attempts++ < 3) {
|
|
912
|
+
int cert_valid = 1;
|
|
913
|
+
int client_cert_requested = 0;
|
|
914
|
+
request_failed = 0;
|
|
915
|
+
if ((error = do_send_request(s, len, chunked)) < 0) {
|
|
916
|
+
send_request_error = GetLastError();
|
|
917
|
+
request_failed = 1;
|
|
918
|
+
switch (send_request_error) {
|
|
919
|
+
case ERROR_WINHTTP_SECURE_FAILURE:
|
|
920
|
+
cert_valid = 0;
|
|
921
|
+
break;
|
|
922
|
+
case ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED:
|
|
923
|
+
client_cert_requested = 1;
|
|
924
|
+
break;
|
|
925
|
+
default:
|
|
926
|
+
git_error_set(GIT_ERROR_OS, "failed to send request");
|
|
927
|
+
return -1;
|
|
928
|
+
}
|
|
929
|
+
}
|
|
880
930
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
931
|
+
/*
|
|
932
|
+
* Only check the certificate if we were able to reach the sending request phase, or
|
|
933
|
+
* received a secure failure error. Otherwise, the server certificate won't be available
|
|
934
|
+
* since the request wasn't able to complete (e.g. proxy auth required)
|
|
935
|
+
*/
|
|
936
|
+
if (!cert_valid ||
|
|
937
|
+
(!request_failed && s->status_sending_request_reached)) {
|
|
938
|
+
git_error_clear();
|
|
939
|
+
if ((error = certificate_check(s, cert_valid)) < 0) {
|
|
940
|
+
if (!git_error_last())
|
|
941
|
+
git_error_set(GIT_ERROR_OS, "user cancelled certificate check");
|
|
885
942
|
|
|
886
|
-
|
|
887
|
-
|
|
943
|
+
return error;
|
|
944
|
+
}
|
|
945
|
+
}
|
|
888
946
|
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
947
|
+
/* if neither the request nor the certificate check returned errors, we're done */
|
|
948
|
+
if (!request_failed)
|
|
949
|
+
return 0;
|
|
892
950
|
|
|
893
|
-
|
|
951
|
+
if (!cert_valid) {
|
|
952
|
+
ignore_flags = no_check_cert_flags;
|
|
953
|
+
if (!WinHttpSetOption(s->request, WINHTTP_OPTION_SECURITY_FLAGS, &ignore_flags, sizeof(ignore_flags))) {
|
|
954
|
+
git_error_set(GIT_ERROR_OS, "failed to set security options");
|
|
955
|
+
return -1;
|
|
956
|
+
}
|
|
957
|
+
}
|
|
894
958
|
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
959
|
+
if (client_cert_requested) {
|
|
960
|
+
/*
|
|
961
|
+
* Client certificates are not supported, explicitly tell the server that
|
|
962
|
+
* (it's possible a client certificate was requested but is not required)
|
|
963
|
+
*/
|
|
964
|
+
if (!WinHttpSetOption(s->request, WINHTTP_OPTION_CLIENT_CERT_CONTEXT, WINHTTP_NO_CLIENT_CERT_CONTEXT, 0)) {
|
|
965
|
+
git_error_set(GIT_ERROR_OS, "failed to set client cert context");
|
|
966
|
+
return -1;
|
|
967
|
+
}
|
|
968
|
+
}
|
|
898
969
|
}
|
|
899
970
|
|
|
900
|
-
if ((error = do_send_request(s, len, chunked)) < 0)
|
|
901
|
-
git_error_set(GIT_ERROR_OS, "failed to send request with unchecked certificate");
|
|
902
|
-
|
|
903
971
|
return error;
|
|
904
972
|
}
|
|
905
973
|
|
|
@@ -972,7 +1040,7 @@ replay:
|
|
|
972
1040
|
/* Enforce a reasonable cap on the number of replays */
|
|
973
1041
|
if (replay_count++ >= GIT_HTTP_REPLAY_MAX) {
|
|
974
1042
|
git_error_set(GIT_ERROR_HTTP, "too many redirects or authentication replays");
|
|
975
|
-
return
|
|
1043
|
+
return GIT_ERROR; /* not GIT_EAUTH because the exact cause is not clear */
|
|
976
1044
|
}
|
|
977
1045
|
|
|
978
1046
|
/* Connect if necessary */
|
|
@@ -993,7 +1061,7 @@ replay:
|
|
|
993
1061
|
}
|
|
994
1062
|
|
|
995
1063
|
if (s->chunked) {
|
|
996
|
-
|
|
1064
|
+
GIT_ASSERT(s->verb == post_verb);
|
|
997
1065
|
|
|
998
1066
|
/* Flush, if necessary */
|
|
999
1067
|
if (s->chunk_buffer_len > 0 &&
|
|
@@ -1044,7 +1112,7 @@ replay:
|
|
|
1044
1112
|
}
|
|
1045
1113
|
|
|
1046
1114
|
len -= bytes_read;
|
|
1047
|
-
|
|
1115
|
+
GIT_ASSERT(bytes_read == bytes_written);
|
|
1048
1116
|
}
|
|
1049
1117
|
|
|
1050
1118
|
git__free(buffer);
|
|
@@ -1156,7 +1224,7 @@ replay:
|
|
|
1156
1224
|
if (error < 0) {
|
|
1157
1225
|
return error;
|
|
1158
1226
|
} else if (!error) {
|
|
1159
|
-
|
|
1227
|
+
GIT_ASSERT(t->server.cred);
|
|
1160
1228
|
winhttp_stream_close(s);
|
|
1161
1229
|
goto replay;
|
|
1162
1230
|
}
|
|
@@ -1170,7 +1238,7 @@ replay:
|
|
|
1170
1238
|
if (error < 0) {
|
|
1171
1239
|
return error;
|
|
1172
1240
|
} else if (!error) {
|
|
1173
|
-
|
|
1241
|
+
GIT_ASSERT(t->proxy.cred);
|
|
1174
1242
|
winhttp_stream_close(s);
|
|
1175
1243
|
goto replay;
|
|
1176
1244
|
}
|
|
@@ -1256,7 +1324,7 @@ static int winhttp_stream_write_single(
|
|
|
1256
1324
|
return -1;
|
|
1257
1325
|
}
|
|
1258
1326
|
|
|
1259
|
-
|
|
1327
|
+
GIT_ASSERT((DWORD)len == bytes_written);
|
|
1260
1328
|
|
|
1261
1329
|
return 0;
|
|
1262
1330
|
}
|
|
@@ -1355,7 +1423,7 @@ static int winhttp_stream_write_buffered(
|
|
|
1355
1423
|
return -1;
|
|
1356
1424
|
}
|
|
1357
1425
|
|
|
1358
|
-
|
|
1426
|
+
GIT_ASSERT((DWORD)len == bytes_written);
|
|
1359
1427
|
|
|
1360
1428
|
s->post_body_len += bytes_written;
|
|
1361
1429
|
|
|
@@ -1562,7 +1630,7 @@ static int winhttp_action(
|
|
|
1562
1630
|
break;
|
|
1563
1631
|
|
|
1564
1632
|
default:
|
|
1565
|
-
|
|
1633
|
+
GIT_ASSERT(0);
|
|
1566
1634
|
}
|
|
1567
1635
|
|
|
1568
1636
|
if (!ret)
|