rugged 1.3.2 → 1.6.2
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/README.md +34 -2
- data/ext/rugged/extconf.rb +7 -4
- data/ext/rugged/rugged.c +16 -0
- data/ext/rugged/rugged.h +4 -0
- data/ext/rugged/rugged_blame.c +2 -0
- data/ext/rugged/rugged_blob.c +3 -0
- data/ext/rugged/rugged_commit.c +1 -0
- data/ext/rugged/rugged_config.c +9 -2
- data/ext/rugged/rugged_diff.c +1 -0
- data/ext/rugged/rugged_index.c +2 -0
- data/ext/rugged/rugged_patch.c +1 -0
- data/ext/rugged/rugged_rebase.c +1 -0
- data/ext/rugged/rugged_reference.c +1 -0
- data/ext/rugged/rugged_remote.c +28 -10
- data/ext/rugged/rugged_repo.c +7 -9
- data/ext/rugged/rugged_revwalk.c +5 -1
- data/ext/rugged/rugged_settings.c +5 -0
- data/ext/rugged/rugged_submodule.c +1 -0
- data/ext/rugged/rugged_tag.c +1 -0
- data/ext/rugged/rugged_tree.c +4 -0
- data/lib/rugged/index.rb +1 -1
- data/lib/rugged/tree.rb +5 -1
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +132 -288
- data/vendor/libgit2/COPYING +106 -19
- data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
- data/vendor/libgit2/cmake/AddClarTest.cmake +7 -0
- data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
- data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
- data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
- data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
- data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
- data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
- data/vendor/libgit2/cmake/{FindHTTP_Parser.cmake → FindHTTPParser.cmake} +17 -17
- data/vendor/libgit2/cmake/FindIconv.cmake +27 -27
- data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
- data/vendor/libgit2/cmake/FindPCRE.cmake +12 -13
- data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
- data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
- data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
- data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
- data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
- data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
- data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
- data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
- data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
- data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
- data/vendor/libgit2/cmake/SelectHTTPParser.cmake +19 -0
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +100 -100
- data/vendor/libgit2/cmake/SelectHashes.cmake +91 -53
- data/vendor/libgit2/cmake/SelectRegex.cmake +51 -0
- data/vendor/libgit2/cmake/SelectSSH.cmake +41 -0
- data/vendor/libgit2/cmake/SelectWinHTTP.cmake +17 -0
- data/vendor/libgit2/cmake/SelectZlib.cmake +34 -0
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +33 -31
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +3 -1
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +4 -4
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
- data/vendor/libgit2/deps/pcre/CMakeLists.txt +88 -88
- data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
- data/vendor/libgit2/deps/zlib/adler32.c +7 -0
- data/vendor/libgit2/deps/zlib/crc32.c +975 -288
- data/vendor/libgit2/deps/zlib/crc32.h +9441 -436
- data/vendor/libgit2/deps/zlib/deflate.c +83 -31
- data/vendor/libgit2/deps/zlib/deflate.h +12 -15
- data/vendor/libgit2/deps/zlib/gzguts.h +3 -2
- data/vendor/libgit2/deps/zlib/infback.c +2 -1
- data/vendor/libgit2/deps/zlib/inffast.c +14 -14
- data/vendor/libgit2/deps/zlib/inflate.c +39 -8
- data/vendor/libgit2/deps/zlib/inflate.h +3 -2
- data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
- data/vendor/libgit2/deps/zlib/trees.c +27 -48
- data/vendor/libgit2/deps/zlib/zlib.h +126 -100
- data/vendor/libgit2/deps/zlib/zutil.c +2 -2
- data/vendor/libgit2/deps/zlib/zutil.h +12 -9
- data/vendor/libgit2/include/git2/apply.h +16 -2
- data/vendor/libgit2/include/git2/attr.h +11 -2
- data/vendor/libgit2/include/git2/blame.h +4 -1
- data/vendor/libgit2/include/git2/blob.h +14 -1
- data/vendor/libgit2/include/git2/branch.h +4 -2
- data/vendor/libgit2/include/git2/buffer.h +18 -78
- data/vendor/libgit2/include/git2/cert.h +2 -2
- data/vendor/libgit2/include/git2/checkout.h +5 -2
- data/vendor/libgit2/include/git2/clone.h +3 -3
- data/vendor/libgit2/include/git2/commit.h +2 -0
- data/vendor/libgit2/include/git2/common.h +28 -7
- data/vendor/libgit2/include/git2/config.h +25 -9
- data/vendor/libgit2/include/git2/credential.h +2 -1
- data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
- data/vendor/libgit2/include/git2/deprecated.h +9 -1
- data/vendor/libgit2/include/git2/describe.h +7 -2
- data/vendor/libgit2/include/git2/diff.h +18 -10
- data/vendor/libgit2/include/git2/email.h +1 -1
- data/vendor/libgit2/include/git2/errors.h +17 -3
- data/vendor/libgit2/include/git2/experimental.h +20 -0
- data/vendor/libgit2/include/git2/filter.h +7 -2
- data/vendor/libgit2/include/git2/graph.h +1 -0
- data/vendor/libgit2/include/git2/ignore.h +1 -1
- data/vendor/libgit2/include/git2/index.h +11 -5
- data/vendor/libgit2/include/git2/indexer.h +48 -0
- data/vendor/libgit2/include/git2/merge.h +24 -4
- data/vendor/libgit2/include/git2/message.h +2 -0
- data/vendor/libgit2/include/git2/object.h +49 -0
- data/vendor/libgit2/include/git2/odb.h +94 -13
- data/vendor/libgit2/include/git2/odb_backend.h +107 -19
- data/vendor/libgit2/include/git2/oid.h +115 -15
- data/vendor/libgit2/include/git2/pack.h +24 -8
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/pathspec.h +1 -1
- data/vendor/libgit2/include/git2/proxy.h +1 -1
- data/vendor/libgit2/include/git2/rebase.h +9 -1
- data/vendor/libgit2/include/git2/refdb.h +3 -0
- data/vendor/libgit2/include/git2/reflog.h +1 -1
- data/vendor/libgit2/include/git2/refs.h +2 -2
- data/vendor/libgit2/include/git2/remote.h +184 -37
- data/vendor/libgit2/include/git2/repository.h +34 -10
- data/vendor/libgit2/include/git2/reset.h +2 -2
- data/vendor/libgit2/include/git2/revparse.h +1 -1
- data/vendor/libgit2/include/git2/revwalk.h +4 -1
- data/vendor/libgit2/include/git2/signature.h +1 -1
- data/vendor/libgit2/include/git2/stash.h +61 -7
- data/vendor/libgit2/include/git2/status.h +14 -5
- data/vendor/libgit2/include/git2/strarray.h +0 -13
- data/vendor/libgit2/include/git2/submodule.h +7 -2
- data/vendor/libgit2/include/git2/sys/commit_graph.h +1 -1
- data/vendor/libgit2/include/git2/sys/odb_backend.h +3 -6
- data/vendor/libgit2/include/git2/sys/remote.h +46 -0
- data/vendor/libgit2/include/git2/sys/stream.h +1 -1
- data/vendor/libgit2/include/git2/sys/transport.h +46 -39
- data/vendor/libgit2/include/git2/tag.h +1 -0
- data/vendor/libgit2/include/git2/tree.h +4 -3
- data/vendor/libgit2/include/git2/types.h +7 -7
- data/vendor/libgit2/include/git2/version.h +27 -6
- data/vendor/libgit2/include/git2/worktree.h +12 -2
- data/vendor/libgit2/include/git2.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +177 -419
- data/vendor/libgit2/src/README.md +12 -0
- data/vendor/libgit2/src/cli/CMakeLists.txt +57 -0
- data/vendor/libgit2/src/cli/README.md +26 -0
- data/vendor/libgit2/src/cli/cli.h +20 -0
- data/vendor/libgit2/src/cli/cmd.c +21 -0
- data/vendor/libgit2/src/cli/cmd.h +33 -0
- data/vendor/libgit2/src/cli/cmd_cat_file.c +204 -0
- data/vendor/libgit2/src/cli/cmd_clone.c +176 -0
- data/vendor/libgit2/src/cli/cmd_hash_object.c +154 -0
- data/vendor/libgit2/src/cli/cmd_help.c +86 -0
- data/vendor/libgit2/src/cli/error.h +51 -0
- data/vendor/libgit2/src/cli/main.c +106 -0
- data/vendor/libgit2/src/cli/opt.c +669 -0
- data/vendor/libgit2/src/cli/opt.h +349 -0
- data/vendor/libgit2/src/cli/opt_usage.c +194 -0
- data/vendor/libgit2/src/cli/opt_usage.h +35 -0
- data/vendor/libgit2/src/cli/progress.c +345 -0
- data/vendor/libgit2/src/cli/progress.h +117 -0
- data/vendor/libgit2/src/cli/sighandler.h +20 -0
- data/vendor/libgit2/src/cli/unix/sighandler.c +36 -0
- data/vendor/libgit2/src/cli/win32/precompiled.h +3 -0
- data/vendor/libgit2/src/cli/win32/sighandler.c +37 -0
- data/vendor/libgit2/src/libgit2/CMakeLists.txt +141 -0
- data/vendor/libgit2/src/{annotated_commit.c → libgit2/annotated_commit.c} +1 -1
- data/vendor/libgit2/src/{annotated_commit.h → libgit2/annotated_commit.h} +2 -2
- data/vendor/libgit2/src/{apply.c → libgit2/apply.c} +18 -18
- data/vendor/libgit2/src/{apply.h → libgit2/apply.h} +2 -2
- data/vendor/libgit2/src/{attr.c → libgit2/attr.c} +18 -18
- data/vendor/libgit2/src/{attr_file.c → libgit2/attr_file.c} +18 -18
- data/vendor/libgit2/src/{attr_file.h → libgit2/attr_file.h} +4 -4
- data/vendor/libgit2/src/{attrcache.c → libgit2/attrcache.c} +18 -13
- data/vendor/libgit2/src/{blame.c → libgit2/blame.c} +2 -0
- data/vendor/libgit2/src/{blame_git.c → libgit2/blame_git.c} +1 -1
- data/vendor/libgit2/src/{blob.c → libgit2/blob.c} +38 -29
- data/vendor/libgit2/src/{blob.h → libgit2/blob.h} +3 -3
- data/vendor/libgit2/src/{branch.c → libgit2/branch.c} +164 -118
- data/vendor/libgit2/src/{branch.h → libgit2/branch.h} +15 -3
- data/vendor/libgit2/src/libgit2/buf.c +126 -0
- data/vendor/libgit2/src/libgit2/buf.h +50 -0
- data/vendor/libgit2/src/{checkout.c → libgit2/checkout.c} +74 -68
- data/vendor/libgit2/src/{cherrypick.c → libgit2/cherrypick.c} +13 -13
- data/vendor/libgit2/src/{clone.c → libgit2/clone.c} +96 -67
- data/vendor/libgit2/src/{commit.c → libgit2/commit.c} +178 -73
- data/vendor/libgit2/src/libgit2/commit.h +87 -0
- data/vendor/libgit2/src/{commit_graph.c → libgit2/commit_graph.c} +122 -89
- data/vendor/libgit2/src/{commit_graph.h → libgit2/commit_graph.h} +14 -4
- data/vendor/libgit2/src/{commit_list.c → libgit2/commit_list.c} +7 -4
- data/vendor/libgit2/src/libgit2/common.h +55 -0
- data/vendor/libgit2/src/{config.c → libgit2/config.c} +101 -69
- data/vendor/libgit2/src/{config.h → libgit2/config.h} +15 -2
- data/vendor/libgit2/src/{config_file.c → libgit2/config_file.c} +105 -93
- data/vendor/libgit2/src/{config_mem.c → libgit2/config_mem.c} +9 -9
- data/vendor/libgit2/src/{config_parse.c → libgit2/config_parse.c} +27 -23
- data/vendor/libgit2/src/{crlf.c → libgit2/crlf.c} +24 -21
- data/vendor/libgit2/src/{describe.c → libgit2/describe.c} +35 -27
- data/vendor/libgit2/src/{diff.c → libgit2/diff.c} +30 -9
- data/vendor/libgit2/src/{diff.h → libgit2/diff.h} +2 -4
- data/vendor/libgit2/src/{diff_driver.c → libgit2/diff_driver.c} +34 -36
- data/vendor/libgit2/src/{diff_driver.h → libgit2/diff_driver.h} +3 -3
- data/vendor/libgit2/src/{diff_file.c → libgit2/diff_file.c} +44 -26
- data/vendor/libgit2/src/{diff_generate.c → libgit2/diff_generate.c} +47 -18
- data/vendor/libgit2/src/{diff_generate.h → libgit2/diff_generate.h} +5 -3
- data/vendor/libgit2/src/{diff_print.c → libgit2/diff_print.c} +112 -100
- data/vendor/libgit2/src/{diff_stats.c → libgit2/diff_stats.c} +40 -29
- data/vendor/libgit2/src/libgit2/diff_stats.h +18 -0
- data/vendor/libgit2/src/{diff_tform.c → libgit2/diff_tform.c} +13 -8
- data/vendor/libgit2/src/{diff_xdiff.c → libgit2/diff_xdiff.c} +4 -8
- data/vendor/libgit2/src/{email.c → libgit2/email.c} +55 -39
- data/vendor/libgit2/src/{email.h → libgit2/email.h} +1 -1
- data/vendor/libgit2/src/{errors.c → libgit2/errors.c} +18 -18
- data/vendor/libgit2/src/{errors.h → libgit2/errors.h} +1 -2
- data/vendor/libgit2/src/libgit2/experimental.h.in +13 -0
- data/vendor/libgit2/src/{fetch.c → libgit2/fetch.c} +72 -27
- data/vendor/libgit2/src/{fetch.h → libgit2/fetch.h} +1 -1
- data/vendor/libgit2/src/{fetchhead.c → libgit2/fetchhead.c} +23 -23
- data/vendor/libgit2/src/{filter.c → libgit2/filter.c} +127 -53
- data/vendor/libgit2/src/{filter.h → libgit2/filter.h} +26 -5
- data/vendor/libgit2/src/{ident.c → libgit2/ident.c} +20 -20
- data/vendor/libgit2/src/{ignore.c → libgit2/ignore.c} +35 -34
- data/vendor/libgit2/src/{ignore.h → libgit2/ignore.h} +2 -2
- data/vendor/libgit2/src/{index.c → libgit2/index.c} +91 -90
- data/vendor/libgit2/src/{index.h → libgit2/index.h} +6 -3
- data/vendor/libgit2/src/{indexer.c → libgit2/indexer.c} +173 -92
- data/vendor/libgit2/src/{iterator.c → libgit2/iterator.c} +71 -61
- data/vendor/libgit2/src/{iterator.h → libgit2/iterator.h} +5 -5
- data/vendor/libgit2/src/{libgit2.c → libgit2/libgit2.c} +46 -11
- data/vendor/libgit2/src/{mailmap.c → libgit2/mailmap.c} +38 -36
- data/vendor/libgit2/src/{merge.c → libgit2/merge.c} +30 -30
- data/vendor/libgit2/src/{merge.h → libgit2/merge.h} +1 -14
- data/vendor/libgit2/src/{merge_driver.c → libgit2/merge_driver.c} +2 -2
- data/vendor/libgit2/src/{merge_file.c → libgit2/merge_file.c} +13 -3
- data/vendor/libgit2/src/{message.c → libgit2/message.c} +21 -10
- data/vendor/libgit2/src/{midx.c → libgit2/midx.c} +112 -92
- data/vendor/libgit2/src/{midx.h → libgit2/midx.h} +5 -4
- data/vendor/libgit2/src/{mwindow.c → libgit2/mwindow.c} +15 -12
- data/vendor/libgit2/src/{mwindow.h → libgit2/mwindow.h} +5 -2
- data/vendor/libgit2/src/{netops.c → libgit2/netops.c} +1 -2
- data/vendor/libgit2/src/{netops.h → libgit2/netops.h} +1 -1
- data/vendor/libgit2/src/{notes.c → libgit2/notes.c} +25 -34
- data/vendor/libgit2/src/{object.c → libgit2/object.c} +135 -30
- data/vendor/libgit2/src/{object.h → libgit2/object.h} +12 -3
- data/vendor/libgit2/src/{odb.c → libgit2/odb.c} +228 -81
- data/vendor/libgit2/src/{odb.h → libgit2/odb.h} +44 -5
- data/vendor/libgit2/src/{odb_loose.c → libgit2/odb_loose.c} +192 -134
- data/vendor/libgit2/src/{odb_mempack.c → libgit2/odb_mempack.c} +18 -5
- data/vendor/libgit2/src/{odb_pack.c → libgit2/odb_pack.c} +137 -85
- data/vendor/libgit2/src/{oid.c → libgit2/oid.c} +136 -90
- data/vendor/libgit2/src/libgit2/oid.h +273 -0
- data/vendor/libgit2/src/{oidmap.c → libgit2/oidmap.c} +1 -1
- data/vendor/libgit2/src/{pack-objects.c → libgit2/pack-objects.c} +56 -30
- data/vendor/libgit2/src/{pack-objects.h → libgit2/pack-objects.h} +11 -6
- data/vendor/libgit2/src/{pack.c → libgit2/pack.c} +114 -84
- data/vendor/libgit2/src/{pack.h → libgit2/pack.h} +31 -16
- data/vendor/libgit2/src/{parse.c → libgit2/parse.c} +4 -3
- data/vendor/libgit2/src/{patch.c → libgit2/patch.c} +3 -3
- data/vendor/libgit2/src/{patch.h → libgit2/patch.h} +1 -0
- data/vendor/libgit2/src/{patch_generate.c → libgit2/patch_generate.c} +27 -11
- data/vendor/libgit2/src/{patch_generate.h → libgit2/patch_generate.h} +5 -5
- data/vendor/libgit2/src/{patch_parse.c → libgit2/patch_parse.c} +29 -29
- data/vendor/libgit2/src/libgit2/path.c +375 -0
- data/vendor/libgit2/src/libgit2/path.h +68 -0
- data/vendor/libgit2/src/{pathspec.c → libgit2/pathspec.c} +6 -6
- data/vendor/libgit2/src/{pathspec.h → libgit2/pathspec.h} +2 -2
- data/vendor/libgit2/src/{proxy.c → libgit2/proxy.c} +4 -1
- data/vendor/libgit2/src/{proxy.h → libgit2/proxy.h} +1 -1
- data/vendor/libgit2/src/{push.c → libgit2/push.c} +43 -38
- data/vendor/libgit2/src/{push.h → libgit2/push.h} +4 -16
- data/vendor/libgit2/src/{reader.c → libgit2/reader.c} +9 -9
- data/vendor/libgit2/src/{reader.h → libgit2/reader.h} +2 -2
- data/vendor/libgit2/src/{rebase.c → libgit2/rebase.c} +119 -107
- data/vendor/libgit2/src/{refdb_fs.c → libgit2/refdb_fs.c} +506 -197
- data/vendor/libgit2/src/{reflog.c → libgit2/reflog.c} +7 -5
- data/vendor/libgit2/src/{reflog.h → libgit2/reflog.h} +1 -2
- data/vendor/libgit2/src/{refs.c → libgit2/refs.c} +34 -32
- data/vendor/libgit2/src/{refs.h → libgit2/refs.h} +2 -2
- data/vendor/libgit2/src/{refspec.c → libgit2/refspec.c} +32 -37
- data/vendor/libgit2/src/{refspec.h → libgit2/refspec.h} +5 -2
- data/vendor/libgit2/src/{remote.c → libgit2/remote.c} +718 -420
- data/vendor/libgit2/src/libgit2/remote.h +100 -0
- data/vendor/libgit2/src/{repository.c → libgit2/repository.c} +629 -386
- data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +20 -9
- data/vendor/libgit2/src/{reset.c → libgit2/reset.c} +8 -5
- data/vendor/libgit2/src/{revert.c → libgit2/revert.c} +14 -14
- data/vendor/libgit2/src/{revparse.c → libgit2/revparse.c} +71 -42
- data/vendor/libgit2/src/{revwalk.c → libgit2/revwalk.c} +12 -8
- data/vendor/libgit2/src/{signature.c → libgit2/signature.c} +12 -6
- data/vendor/libgit2/src/{signature.h → libgit2/signature.h} +1 -1
- data/vendor/libgit2/src/{stash.c → libgit2/stash.c} +235 -61
- data/vendor/libgit2/src/{status.c → libgit2/status.c} +4 -1
- data/vendor/libgit2/src/{strarray.c → libgit2/strarray.c} +1 -0
- data/vendor/libgit2/src/libgit2/strarray.h +25 -0
- data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.c +8 -6
- data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.c +1 -1
- data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.c +7 -3
- data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.h +3 -3
- data/vendor/libgit2/src/{streams → libgit2/streams}/socket.c +4 -1
- data/vendor/libgit2/src/{submodule.c → libgit2/submodule.c} +177 -161
- data/vendor/libgit2/src/{submodule.h → libgit2/submodule.h} +1 -1
- data/vendor/libgit2/src/libgit2/sysdir.c +650 -0
- data/vendor/libgit2/src/{sysdir.h → libgit2/sysdir.h} +53 -18
- data/vendor/libgit2/src/{tag.c → libgit2/tag.c} +73 -42
- data/vendor/libgit2/src/{tag.h → libgit2/tag.h} +2 -2
- data/vendor/libgit2/src/{threadstate.c → libgit2/threadstate.c} +3 -3
- data/vendor/libgit2/src/{threadstate.h → libgit2/threadstate.h} +2 -2
- data/vendor/libgit2/src/{trace.c → libgit2/trace.c} +1 -14
- data/vendor/libgit2/src/{trace.h → libgit2/trace.h} +5 -22
- data/vendor/libgit2/src/{trailer.c → libgit2/trailer.c} +1 -1
- data/vendor/libgit2/src/{transaction.c → libgit2/transaction.c} +1 -1
- data/vendor/libgit2/src/{transport.c → libgit2/transport.c} +10 -10
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth.c +7 -9
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth.h +2 -3
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.c +12 -13
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.c +10 -10
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.h +0 -1
- data/vendor/libgit2/src/{transports → libgit2/transports}/git.c +9 -11
- data/vendor/libgit2/src/{transports → libgit2/transports}/http.c +41 -20
- data/vendor/libgit2/src/{transports → libgit2/transports}/http.h +2 -3
- data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.c +75 -66
- data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.h +10 -0
- data/vendor/libgit2/src/{transports → libgit2/transports}/local.c +138 -116
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart.c +92 -133
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart.h +35 -32
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart_pkt.c +177 -65
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart_protocol.c +97 -49
- data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.c +365 -198
- data/vendor/libgit2/src/{transports → libgit2/transports}/winhttp.c +58 -59
- data/vendor/libgit2/src/{tree-cache.c → libgit2/tree-cache.c} +8 -8
- data/vendor/libgit2/src/{tree-cache.h → libgit2/tree-cache.h} +2 -2
- data/vendor/libgit2/src/{tree.c → libgit2/tree.c} +93 -83
- data/vendor/libgit2/src/{tree.h → libgit2/tree.h} +4 -4
- data/vendor/libgit2/src/{worktree.c → libgit2/worktree.c} +121 -94
- data/vendor/libgit2/src/{worktree.h → libgit2/worktree.h} +1 -1
- data/vendor/libgit2/src/libgit2/xdiff/git-xdiff.h +53 -0
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiff.h +15 -15
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.c +134 -108
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.c +23 -7
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xhistogram.c +87 -78
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xinclude.h +1 -12
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmerge.c +104 -117
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xpatience.c +6 -17
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.c +15 -20
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.c +18 -7
- data/vendor/libgit2/src/util/CMakeLists.txt +80 -0
- data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.h +1 -1
- data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.h +1 -1
- data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.h +1 -1
- data/vendor/libgit2/src/{array.h → util/array.h} +1 -1
- data/vendor/libgit2/src/{assert_safe.h → util/assert_safe.h} +16 -0
- data/vendor/libgit2/src/{cc-compat.h → util/cc-compat.h} +1 -1
- data/vendor/libgit2/src/{date.c → util/date.c} +14 -20
- data/vendor/libgit2/src/util/date.h +33 -0
- data/vendor/libgit2/src/{filebuf.c → util/filebuf.c} +29 -29
- data/vendor/libgit2/src/{filebuf.h → util/filebuf.h} +2 -2
- data/vendor/libgit2/src/{path.c → util/fs_path.c} +453 -647
- data/vendor/libgit2/src/{path.h → util/fs_path.h} +221 -188
- data/vendor/libgit2/src/{futils.c → util/futils.c} +135 -90
- data/vendor/libgit2/src/{futils.h → util/futils.h} +28 -15
- data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +15 -1
- data/vendor/libgit2/src/{common.h → util/git2_util.h} +20 -59
- data/vendor/libgit2/src/util/hash/builtin.c +53 -0
- data/vendor/libgit2/src/{hash/sha1/openssl.h → util/hash/builtin.h} +6 -6
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.c +3 -3
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.h +3 -3
- data/vendor/libgit2/src/util/hash/common_crypto.c +112 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.h +11 -3
- data/vendor/libgit2/src/util/hash/mbedtls.c +92 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.h +14 -4
- data/vendor/libgit2/src/util/hash/openssl.c +195 -0
- data/vendor/libgit2/src/util/hash/openssl.h +45 -0
- data/vendor/libgit2/src/util/hash/rfc6234/sha.h +243 -0
- data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +601 -0
- data/vendor/libgit2/src/util/hash/sha.h +70 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.c +1 -1
- data/vendor/libgit2/src/util/hash/win32.c +549 -0
- data/vendor/libgit2/src/util/hash/win32.h +60 -0
- data/vendor/libgit2/src/util/hash.c +158 -0
- data/vendor/libgit2/src/util/hash.h +61 -0
- data/vendor/libgit2/src/{khash.h → util/khash.h} +1 -1
- data/vendor/libgit2/src/{map.h → util/map.h} +1 -1
- data/vendor/libgit2/src/util/net.c +1003 -0
- data/vendor/libgit2/src/{net.h → util/net.h} +18 -4
- data/vendor/libgit2/src/{pool.h → util/pool.h} +1 -1
- data/vendor/libgit2/src/{posix.c → util/posix.c} +3 -3
- data/vendor/libgit2/src/{posix.h → util/posix.h} +4 -1
- data/vendor/libgit2/src/{pqueue.h → util/pqueue.h} +2 -2
- data/vendor/libgit2/src/util/rand.c +234 -0
- data/vendor/libgit2/src/util/rand.h +37 -0
- data/vendor/libgit2/src/{regexp.c → util/regexp.c} +4 -4
- data/vendor/libgit2/src/{regexp.h → util/regexp.h} +1 -1
- data/vendor/libgit2/src/{runtime.c → util/runtime.c} +1 -1
- data/vendor/libgit2/src/{runtime.h → util/runtime.h} +1 -1
- data/vendor/libgit2/src/{sortedcache.c → util/sortedcache.c} +1 -1
- data/vendor/libgit2/src/{sortedcache.h → util/sortedcache.h} +2 -2
- data/vendor/libgit2/src/{buffer.c → util/str.c} +157 -151
- data/vendor/libgit2/src/util/str.h +357 -0
- data/vendor/libgit2/src/{strmap.h → util/strmap.h} +1 -1
- data/vendor/libgit2/src/{thread.c → util/thread.c} +1 -1
- data/vendor/libgit2/src/{thread.h → util/thread.h} +23 -22
- data/vendor/libgit2/src/{tsort.c → util/tsort.c} +1 -1
- data/vendor/libgit2/src/{unix → util/unix}/map.c +1 -3
- data/vendor/libgit2/src/{unix → util/unix}/posix.h +1 -4
- data/vendor/libgit2/src/{unix → util/unix}/realpath.c +1 -3
- data/vendor/libgit2/src/{utf8.c → util/utf8.c} +1 -1
- data/vendor/libgit2/src/{utf8.h → util/utf8.h} +1 -1
- data/vendor/libgit2/src/{util.c → util/util.c} +15 -15
- data/vendor/libgit2/src/{util.h → util/util.h} +4 -29
- data/vendor/libgit2/src/{varint.h → util/varint.h} +1 -1
- data/vendor/libgit2/src/{vector.h → util/vector.h} +2 -2
- data/vendor/libgit2/src/{wildmatch.h → util/wildmatch.h} +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/dir.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/error.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/map.c +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/path_w32.c +140 -9
- data/vendor/libgit2/src/{win32 → util/win32}/path_w32.h +3 -1
- data/vendor/libgit2/src/{win32 → util/win32}/posix.h +1 -2
- data/vendor/libgit2/src/{win32 → util/win32}/posix_w32.c +12 -28
- data/vendor/libgit2/src/util/win32/precompiled.c +1 -0
- data/vendor/libgit2/src/{win32 → util/win32}/precompiled.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/thread.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.c +2 -3
- data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.h +3 -4
- data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.c +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_util.h +1 -1
- data/vendor/libgit2/src/{zstream.c → util/zstream.c} +5 -5
- data/vendor/libgit2/src/{zstream.h → util/zstream.h} +5 -5
- metadata +402 -356
- data/vendor/libgit2/src/buffer.h +0 -374
- data/vendor/libgit2/src/commit.h +0 -46
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +0 -57
- data/vendor/libgit2/src/hash/sha1/generic.c +0 -300
- data/vendor/libgit2/src/hash/sha1/generic.h +0 -19
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +0 -46
- data/vendor/libgit2/src/hash/sha1/openssl.c +0 -59
- data/vendor/libgit2/src/hash/sha1/win32.c +0 -333
- data/vendor/libgit2/src/hash/sha1/win32.h +0 -128
- data/vendor/libgit2/src/hash/sha1.h +0 -38
- data/vendor/libgit2/src/hash.c +0 -110
- data/vendor/libgit2/src/hash.h +0 -46
- data/vendor/libgit2/src/message.h +0 -17
- data/vendor/libgit2/src/net.c +0 -540
- data/vendor/libgit2/src/oid.h +0 -51
- data/vendor/libgit2/src/remote.h +0 -55
- data/vendor/libgit2/src/sysdir.c +0 -347
- data/vendor/libgit2/src/win32/findfile.c +0 -230
- data/vendor/libgit2/src/win32/findfile.h +0 -19
- /data/vendor/libgit2/src/{win32 → cli/win32}/precompiled.c +0 -0
- /data/vendor/libgit2/src/{attr.h → libgit2/attr.h} +0 -0
- /data/vendor/libgit2/src/{attrcache.h → libgit2/attrcache.h} +0 -0
- /data/vendor/libgit2/src/{blame.h → libgit2/blame.h} +0 -0
- /data/vendor/libgit2/src/{blame_git.h → libgit2/blame_git.h} +0 -0
- /data/vendor/libgit2/src/{cache.c → libgit2/cache.c} +0 -0
- /data/vendor/libgit2/src/{cache.h → libgit2/cache.h} +0 -0
- /data/vendor/libgit2/src/{checkout.h → libgit2/checkout.h} +0 -0
- /data/vendor/libgit2/src/{clone.h → libgit2/clone.h} +0 -0
- /data/vendor/libgit2/src/{commit_list.h → libgit2/commit_list.h} +0 -0
- /data/vendor/libgit2/src/{config_backend.h → libgit2/config_backend.h} +0 -0
- /data/vendor/libgit2/src/{config_cache.c → libgit2/config_cache.c} +0 -0
- /data/vendor/libgit2/src/{config_entries.c → libgit2/config_entries.c} +0 -0
- /data/vendor/libgit2/src/{config_entries.h → libgit2/config_entries.h} +0 -0
- /data/vendor/libgit2/src/{config_parse.h → libgit2/config_parse.h} +0 -0
- /data/vendor/libgit2/src/{config_snapshot.c → libgit2/config_snapshot.c} +0 -0
- /data/vendor/libgit2/src/{delta.c → libgit2/delta.c} +0 -0
- /data/vendor/libgit2/src/{delta.h → libgit2/delta.h} +0 -0
- /data/vendor/libgit2/src/{diff_file.h → libgit2/diff_file.h} +0 -0
- /data/vendor/libgit2/src/{diff_parse.c → libgit2/diff_parse.c} +0 -0
- /data/vendor/libgit2/src/{diff_parse.h → libgit2/diff_parse.h} +0 -0
- /data/vendor/libgit2/src/{diff_tform.h → libgit2/diff_tform.h} +0 -0
- /data/vendor/libgit2/src/{diff_xdiff.h → libgit2/diff_xdiff.h} +0 -0
- /data/vendor/libgit2/src/{fetchhead.h → libgit2/fetchhead.h} +0 -0
- /data/vendor/libgit2/src/{win32 → libgit2}/git2.rc +0 -0
- /data/vendor/libgit2/src/{graph.c → libgit2/graph.c} +0 -0
- /data/vendor/libgit2/src/{hashsig.c → libgit2/hashsig.c} +0 -0
- /data/vendor/libgit2/src/{idxmap.c → libgit2/idxmap.c} +0 -0
- /data/vendor/libgit2/src/{idxmap.h → libgit2/idxmap.h} +0 -0
- /data/vendor/libgit2/src/{indexer.h → libgit2/indexer.h} +0 -0
- /data/vendor/libgit2/src/{libgit2.h → libgit2/libgit2.h} +0 -0
- /data/vendor/libgit2/src/{mailmap.h → libgit2/mailmap.h} +0 -0
- /data/vendor/libgit2/src/{merge_driver.h → libgit2/merge_driver.h} +0 -0
- /data/vendor/libgit2/src/{notes.h → libgit2/notes.h} +0 -0
- /data/vendor/libgit2/src/{object_api.c → libgit2/object_api.c} +0 -0
- /data/vendor/libgit2/src/{offmap.c → libgit2/offmap.c} +0 -0
- /data/vendor/libgit2/src/{offmap.h → libgit2/offmap.h} +0 -0
- /data/vendor/libgit2/src/{oidarray.c → libgit2/oidarray.c} +0 -0
- /data/vendor/libgit2/src/{oidarray.h → libgit2/oidarray.h} +0 -0
- /data/vendor/libgit2/src/{oidmap.h → libgit2/oidmap.h} +0 -0
- /data/vendor/libgit2/src/{parse.h → libgit2/parse.h} +0 -0
- /data/vendor/libgit2/src/{patch_parse.h → libgit2/patch_parse.h} +0 -0
- /data/vendor/libgit2/src/{refdb.c → libgit2/refdb.c} +0 -0
- /data/vendor/libgit2/src/{refdb.h → libgit2/refdb.h} +0 -0
- /data/vendor/libgit2/src/{repo_template.h → libgit2/repo_template.h} +0 -0
- /data/vendor/libgit2/src/{revwalk.h → libgit2/revwalk.h} +0 -0
- /data/vendor/libgit2/src/{settings.h → libgit2/settings.h} +0 -0
- /data/vendor/libgit2/src/{status.h → libgit2/status.h} +0 -0
- /data/vendor/libgit2/src/{stream.h → libgit2/stream.h} +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/socket.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.h +0 -0
- /data/vendor/libgit2/src/{transaction.h → libgit2/transaction.h} +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/credential.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/credential_helpers.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.h +0 -0
- /data/vendor/libgit2/src/{userdiff.h → libgit2/userdiff.h} +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmacros.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xtypes.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.h +0 -0
- /data/vendor/libgit2/src/{alloc.c → util/alloc.c} +0 -0
- /data/vendor/libgit2/src/{alloc.h → util/alloc.h} +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.c +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.c +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.c +0 -0
- /data/vendor/libgit2/src/{bitvec.h → util/bitvec.h} +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.h +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.c +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.h +0 -0
- /data/vendor/libgit2/src/{integer.h → util/integer.h} +0 -0
- /data/vendor/libgit2/src/{pool.c → util/pool.c} +0 -0
- /data/vendor/libgit2/src/{pqueue.c → util/pqueue.c} +0 -0
- /data/vendor/libgit2/src/{strmap.c → util/strmap.c} +0 -0
- /data/vendor/libgit2/src/{strnlen.h → util/strnlen.h} +0 -0
- /data/vendor/libgit2/src/{unix → util/unix}/pthread.h +0 -0
- /data/vendor/libgit2/src/{varint.c → util/varint.c} +0 -0
- /data/vendor/libgit2/src/{vector.c → util/vector.c} +0 -0
- /data/vendor/libgit2/src/{wildmatch.c → util/wildmatch.c} +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/dir.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/error.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/mingw-compat.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/msvc-compat.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/reparse.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/thread.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/version.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_common.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_util.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/win32-compat.h +0 -0
|
@@ -12,12 +12,11 @@
|
|
|
12
12
|
#endif
|
|
13
13
|
|
|
14
14
|
#include "runtime.h"
|
|
15
|
-
#include "git2.h"
|
|
16
|
-
#include "buffer.h"
|
|
17
15
|
#include "net.h"
|
|
18
16
|
#include "netops.h"
|
|
19
17
|
#include "smart.h"
|
|
20
18
|
#include "streams/socket.h"
|
|
19
|
+
#include "sysdir.h"
|
|
21
20
|
|
|
22
21
|
#include "git2/credential.h"
|
|
23
22
|
#include "git2/sys/credential.h"
|
|
@@ -26,8 +25,6 @@
|
|
|
26
25
|
|
|
27
26
|
#define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport)
|
|
28
27
|
|
|
29
|
-
static const char *ssh_prefixes[] = { "ssh://", "ssh+git://", "git+ssh://" };
|
|
30
|
-
|
|
31
28
|
static const char cmd_uploadpack[] = "git-upload-pack";
|
|
32
29
|
static const char cmd_receivepack[] = "git-receive-pack";
|
|
33
30
|
|
|
@@ -37,7 +34,7 @@ typedef struct {
|
|
|
37
34
|
LIBSSH2_SESSION *session;
|
|
38
35
|
LIBSSH2_CHANNEL *channel;
|
|
39
36
|
const char *cmd;
|
|
40
|
-
|
|
37
|
+
git_net_url url;
|
|
41
38
|
unsigned sent_command : 1;
|
|
42
39
|
} ssh_stream;
|
|
43
40
|
|
|
@@ -65,42 +62,26 @@ static void ssh_error(LIBSSH2_SESSION *session, const char *errmsg)
|
|
|
65
62
|
*
|
|
66
63
|
* For example: git-upload-pack '/libgit2/libgit2'
|
|
67
64
|
*/
|
|
68
|
-
static int gen_proto(
|
|
65
|
+
static int gen_proto(git_str *request, const char *cmd, git_net_url *url)
|
|
69
66
|
{
|
|
70
67
|
const char *repo;
|
|
71
|
-
int len;
|
|
72
|
-
size_t i;
|
|
73
|
-
|
|
74
|
-
for (i = 0; i < ARRAY_SIZE(ssh_prefixes); ++i) {
|
|
75
|
-
const char *p = ssh_prefixes[i];
|
|
76
68
|
|
|
77
|
-
|
|
78
|
-
url = url + strlen(p);
|
|
79
|
-
repo = strchr(url, '/');
|
|
80
|
-
if (repo && repo[1] == '~')
|
|
81
|
-
++repo;
|
|
69
|
+
repo = url->path;
|
|
82
70
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
repo = strchr(url, ':');
|
|
87
|
-
if (repo) repo++;
|
|
71
|
+
if (repo && repo[0] == '/' && repo[1] == '~')
|
|
72
|
+
repo++;
|
|
88
73
|
|
|
89
|
-
|
|
90
|
-
if (!repo) {
|
|
74
|
+
if (!repo || !repo[0]) {
|
|
91
75
|
git_error_set(GIT_ERROR_NET, "malformed git protocol URL");
|
|
92
76
|
return -1;
|
|
93
77
|
}
|
|
94
78
|
|
|
95
|
-
|
|
79
|
+
git_str_puts(request, cmd);
|
|
80
|
+
git_str_puts(request, " '");
|
|
81
|
+
git_str_puts(request, repo);
|
|
82
|
+
git_str_puts(request, "'");
|
|
96
83
|
|
|
97
|
-
|
|
98
|
-
git_buf_puts(request, cmd);
|
|
99
|
-
git_buf_puts(request, " '");
|
|
100
|
-
git_buf_decode_percent(request, repo, strlen(repo));
|
|
101
|
-
git_buf_puts(request, "'");
|
|
102
|
-
|
|
103
|
-
if (git_buf_oom(request))
|
|
84
|
+
if (git_str_oom(request))
|
|
104
85
|
return -1;
|
|
105
86
|
|
|
106
87
|
return 0;
|
|
@@ -109,9 +90,9 @@ done:
|
|
|
109
90
|
static int send_command(ssh_stream *s)
|
|
110
91
|
{
|
|
111
92
|
int error;
|
|
112
|
-
|
|
93
|
+
git_str request = GIT_STR_INIT;
|
|
113
94
|
|
|
114
|
-
error = gen_proto(&request, s->cmd, s->url);
|
|
95
|
+
error = gen_proto(&request, s->cmd, &s->url);
|
|
115
96
|
if (error < 0)
|
|
116
97
|
goto cleanup;
|
|
117
98
|
|
|
@@ -124,7 +105,7 @@ static int send_command(ssh_stream *s)
|
|
|
124
105
|
s->sent_command = 1;
|
|
125
106
|
|
|
126
107
|
cleanup:
|
|
127
|
-
|
|
108
|
+
git_str_dispose(&request);
|
|
128
109
|
return error;
|
|
129
110
|
}
|
|
130
111
|
|
|
@@ -226,13 +207,12 @@ static void ssh_stream_free(git_smart_subtransport_stream *stream)
|
|
|
226
207
|
s->io = NULL;
|
|
227
208
|
}
|
|
228
209
|
|
|
229
|
-
|
|
210
|
+
git_net_url_dispose(&s->url);
|
|
230
211
|
git__free(s);
|
|
231
212
|
}
|
|
232
213
|
|
|
233
214
|
static int ssh_stream_alloc(
|
|
234
215
|
ssh_subtransport *t,
|
|
235
|
-
const char *url,
|
|
236
216
|
const char *cmd,
|
|
237
217
|
git_smart_subtransport_stream **stream)
|
|
238
218
|
{
|
|
@@ -250,47 +230,10 @@ static int ssh_stream_alloc(
|
|
|
250
230
|
|
|
251
231
|
s->cmd = cmd;
|
|
252
232
|
|
|
253
|
-
s->url = git__strdup(url);
|
|
254
|
-
if (!s->url) {
|
|
255
|
-
git__free(s);
|
|
256
|
-
return -1;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
233
|
*stream = &s->parent;
|
|
260
234
|
return 0;
|
|
261
235
|
}
|
|
262
236
|
|
|
263
|
-
static int git_ssh_extract_url_parts(
|
|
264
|
-
git_net_url *urldata,
|
|
265
|
-
const char *url)
|
|
266
|
-
{
|
|
267
|
-
char *colon, *at;
|
|
268
|
-
const char *start;
|
|
269
|
-
|
|
270
|
-
colon = strchr(url, ':');
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
at = strchr(url, '@');
|
|
274
|
-
if (at) {
|
|
275
|
-
start = at + 1;
|
|
276
|
-
urldata->username = git__substrdup(url, at - url);
|
|
277
|
-
GIT_ERROR_CHECK_ALLOC(urldata->username);
|
|
278
|
-
} else {
|
|
279
|
-
start = url;
|
|
280
|
-
urldata->username = NULL;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
if (colon == NULL || (colon < start)) {
|
|
284
|
-
git_error_set(GIT_ERROR_NET, "malformed URL");
|
|
285
|
-
return -1;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
urldata->host = git__substrdup(start, colon - start);
|
|
289
|
-
GIT_ERROR_CHECK_ALLOC(urldata->host);
|
|
290
|
-
|
|
291
|
-
return 0;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
237
|
static int ssh_agent_auth(LIBSSH2_SESSION *session, git_credential_ssh_key *c) {
|
|
295
238
|
int rc = LIBSSH2_ERROR_NONE;
|
|
296
239
|
|
|
@@ -303,8 +246,10 @@ static int ssh_agent_auth(LIBSSH2_SESSION *session, git_credential_ssh_key *c) {
|
|
|
303
246
|
|
|
304
247
|
rc = libssh2_agent_connect(agent);
|
|
305
248
|
|
|
306
|
-
if (rc != LIBSSH2_ERROR_NONE)
|
|
249
|
+
if (rc != LIBSSH2_ERROR_NONE) {
|
|
250
|
+
rc = LIBSSH2_ERROR_AUTHENTICATION_FAILED;
|
|
307
251
|
goto shutdown;
|
|
252
|
+
}
|
|
308
253
|
|
|
309
254
|
rc = libssh2_agent_list_identities(agent);
|
|
310
255
|
|
|
@@ -443,11 +388,15 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
|
|
|
443
388
|
int error, no_callback = 0;
|
|
444
389
|
git_credential *cred = NULL;
|
|
445
390
|
|
|
446
|
-
if (!t->owner->
|
|
391
|
+
if (!t->owner->connect_opts.callbacks.credentials) {
|
|
447
392
|
no_callback = 1;
|
|
448
393
|
} else {
|
|
449
|
-
error = t->owner->
|
|
450
|
-
|
|
394
|
+
error = t->owner->connect_opts.callbacks.credentials(
|
|
395
|
+
&cred,
|
|
396
|
+
t->owner->url,
|
|
397
|
+
user,
|
|
398
|
+
auth_methods,
|
|
399
|
+
t->owner->connect_opts.callbacks.payload);
|
|
451
400
|
|
|
452
401
|
if (error == GIT_PASSTHROUGH) {
|
|
453
402
|
no_callback = 1;
|
|
@@ -475,15 +424,116 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
|
|
|
475
424
|
return 0;
|
|
476
425
|
}
|
|
477
426
|
|
|
427
|
+
#define SSH_DIR ".ssh"
|
|
428
|
+
#define KNOWN_HOSTS_FILE "known_hosts"
|
|
429
|
+
|
|
430
|
+
/*
|
|
431
|
+
* Load the known_hosts file.
|
|
432
|
+
*
|
|
433
|
+
* Returns success but leaves the output NULL if we couldn't find the file.
|
|
434
|
+
*/
|
|
435
|
+
static int load_known_hosts(LIBSSH2_KNOWNHOSTS **hosts, LIBSSH2_SESSION *session)
|
|
436
|
+
{
|
|
437
|
+
git_str path = GIT_STR_INIT, sshdir = GIT_STR_INIT;
|
|
438
|
+
LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
|
|
439
|
+
int error;
|
|
440
|
+
|
|
441
|
+
GIT_ASSERT_ARG(hosts);
|
|
442
|
+
|
|
443
|
+
if ((error = git_sysdir_expand_homedir_file(&sshdir, SSH_DIR)) < 0 ||
|
|
444
|
+
(error = git_str_joinpath(&path, git_str_cstr(&sshdir), KNOWN_HOSTS_FILE)) < 0)
|
|
445
|
+
goto out;
|
|
446
|
+
|
|
447
|
+
if ((known_hosts = libssh2_knownhost_init(session)) == NULL) {
|
|
448
|
+
ssh_error(session, "error initializing known hosts");
|
|
449
|
+
error = -1;
|
|
450
|
+
goto out;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/*
|
|
454
|
+
* Try to read the file and consider not finding it as not trusting the
|
|
455
|
+
* host rather than an error.
|
|
456
|
+
*/
|
|
457
|
+
error = libssh2_knownhost_readfile(known_hosts, git_str_cstr(&path), LIBSSH2_KNOWNHOST_FILE_OPENSSH);
|
|
458
|
+
if (error == LIBSSH2_ERROR_FILE)
|
|
459
|
+
error = 0;
|
|
460
|
+
if (error < 0)
|
|
461
|
+
ssh_error(session, "error reading known_hosts");
|
|
462
|
+
|
|
463
|
+
out:
|
|
464
|
+
*hosts = known_hosts;
|
|
465
|
+
|
|
466
|
+
git_str_dispose(&sshdir);
|
|
467
|
+
git_str_dispose(&path);
|
|
468
|
+
|
|
469
|
+
return error;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
static void add_hostkey_pref_if_avail(
|
|
473
|
+
LIBSSH2_KNOWNHOSTS *known_hosts,
|
|
474
|
+
const char *hostname,
|
|
475
|
+
int port,
|
|
476
|
+
git_str *prefs,
|
|
477
|
+
int type,
|
|
478
|
+
const char *type_name)
|
|
479
|
+
{
|
|
480
|
+
struct libssh2_knownhost *host = NULL;
|
|
481
|
+
const char key = '\0';
|
|
482
|
+
int mask = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW | type;
|
|
483
|
+
int error;
|
|
484
|
+
|
|
485
|
+
error = libssh2_knownhost_checkp(known_hosts, hostname, port, &key, 1, mask, &host);
|
|
486
|
+
if (error == LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
|
|
487
|
+
if (git_str_len(prefs) > 0) {
|
|
488
|
+
git_str_putc(prefs, ',');
|
|
489
|
+
}
|
|
490
|
+
git_str_puts(prefs, type_name);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/*
|
|
495
|
+
* We figure out what kind of key we want to ask the remote for by trying to
|
|
496
|
+
* look it up with a nonsense key and using that mismatch to figure out what key
|
|
497
|
+
* we do have stored for the host.
|
|
498
|
+
*
|
|
499
|
+
* Populates prefs with the string to pass to libssh2_session_method_pref.
|
|
500
|
+
*/
|
|
501
|
+
static void find_hostkey_preference(
|
|
502
|
+
LIBSSH2_KNOWNHOSTS *known_hosts,
|
|
503
|
+
const char *hostname,
|
|
504
|
+
int port,
|
|
505
|
+
git_str *prefs)
|
|
506
|
+
{
|
|
507
|
+
/*
|
|
508
|
+
* The order here is important as it indicates the priority of what will
|
|
509
|
+
* be preferred.
|
|
510
|
+
*/
|
|
511
|
+
#ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
|
|
512
|
+
add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ED25519, "ssh-ed25519");
|
|
513
|
+
#endif
|
|
514
|
+
#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
|
|
515
|
+
add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_256, "ecdsa-sha2-nistp256");
|
|
516
|
+
add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_384, "ecdsa-sha2-nistp384");
|
|
517
|
+
add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_521, "ecdsa-sha2-nistp521");
|
|
518
|
+
#endif
|
|
519
|
+
add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_SSHRSA, "ssh-rsa");
|
|
520
|
+
}
|
|
521
|
+
|
|
478
522
|
static int _git_ssh_session_create(
|
|
479
523
|
LIBSSH2_SESSION **session,
|
|
524
|
+
LIBSSH2_KNOWNHOSTS **hosts,
|
|
525
|
+
const char *hostname,
|
|
526
|
+
int port,
|
|
480
527
|
git_stream *io)
|
|
481
528
|
{
|
|
482
|
-
int rc = 0;
|
|
483
|
-
LIBSSH2_SESSION *s;
|
|
484
529
|
git_socket_stream *socket = GIT_CONTAINER_OF(io, git_socket_stream, parent);
|
|
530
|
+
LIBSSH2_SESSION *s;
|
|
531
|
+
LIBSSH2_KNOWNHOSTS *known_hosts;
|
|
532
|
+
git_str prefs = GIT_STR_INIT;
|
|
533
|
+
int rc = 0;
|
|
485
534
|
|
|
486
535
|
GIT_ASSERT_ARG(session);
|
|
536
|
+
GIT_ASSERT_ARG(hosts);
|
|
487
537
|
|
|
488
538
|
s = libssh2_session_init();
|
|
489
539
|
if (!s) {
|
|
@@ -491,175 +541,292 @@ static int _git_ssh_session_create(
|
|
|
491
541
|
return -1;
|
|
492
542
|
}
|
|
493
543
|
|
|
544
|
+
if ((rc = load_known_hosts(&known_hosts, s)) < 0) {
|
|
545
|
+
ssh_error(s, "error loading known_hosts");
|
|
546
|
+
libssh2_session_free(s);
|
|
547
|
+
return -1;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
find_hostkey_preference(known_hosts, hostname, port, &prefs);
|
|
551
|
+
if (git_str_len(&prefs) > 0) {
|
|
552
|
+
do {
|
|
553
|
+
rc = libssh2_session_method_pref(s, LIBSSH2_METHOD_HOSTKEY, git_str_cstr(&prefs));
|
|
554
|
+
} while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
|
|
555
|
+
if (rc != LIBSSH2_ERROR_NONE) {
|
|
556
|
+
ssh_error(s, "failed to set hostkey preference");
|
|
557
|
+
goto on_error;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
git_str_dispose(&prefs);
|
|
561
|
+
|
|
494
562
|
do {
|
|
495
563
|
rc = libssh2_session_handshake(s, socket->s);
|
|
496
564
|
} while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
|
|
497
565
|
|
|
498
566
|
if (rc != LIBSSH2_ERROR_NONE) {
|
|
499
567
|
ssh_error(s, "failed to start SSH session");
|
|
500
|
-
|
|
501
|
-
return -1;
|
|
568
|
+
goto on_error;
|
|
502
569
|
}
|
|
503
570
|
|
|
504
571
|
libssh2_session_set_blocking(s, 1);
|
|
505
572
|
|
|
506
573
|
*session = s;
|
|
574
|
+
*hosts = known_hosts;
|
|
507
575
|
|
|
508
576
|
return 0;
|
|
577
|
+
|
|
578
|
+
on_error:
|
|
579
|
+
libssh2_knownhost_free(known_hosts);
|
|
580
|
+
libssh2_session_free(s);
|
|
581
|
+
return -1;
|
|
509
582
|
}
|
|
510
583
|
|
|
511
|
-
#define SSH_DEFAULT_PORT "22"
|
|
512
584
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
585
|
+
/*
|
|
586
|
+
* Returns the typemask argument to pass to libssh2_knownhost_check{,p} based on
|
|
587
|
+
* the type of key that libssh2_session_hostkey returns.
|
|
588
|
+
*/
|
|
589
|
+
static int fingerprint_type_mask(int keytype)
|
|
518
590
|
{
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
591
|
+
int mask = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW;
|
|
592
|
+
return mask;
|
|
593
|
+
|
|
594
|
+
switch (keytype) {
|
|
595
|
+
case LIBSSH2_HOSTKEY_TYPE_RSA:
|
|
596
|
+
mask |= LIBSSH2_KNOWNHOST_KEY_SSHRSA;
|
|
597
|
+
break;
|
|
598
|
+
case LIBSSH2_HOSTKEY_TYPE_DSS:
|
|
599
|
+
mask |= LIBSSH2_KNOWNHOST_KEY_SSHDSS;
|
|
600
|
+
break;
|
|
601
|
+
#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
|
|
602
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
|
|
603
|
+
mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_256;
|
|
604
|
+
break;
|
|
605
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
|
|
606
|
+
mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_384;
|
|
607
|
+
break;
|
|
608
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_521:
|
|
609
|
+
mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_521;
|
|
610
|
+
break;
|
|
611
|
+
#endif
|
|
612
|
+
#ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
|
|
613
|
+
case LIBSSH2_HOSTKEY_TYPE_ED25519:
|
|
614
|
+
mask |= LIBSSH2_KNOWNHOST_KEY_ED25519;
|
|
615
|
+
break;
|
|
616
|
+
#endif
|
|
617
|
+
}
|
|
526
618
|
|
|
527
|
-
|
|
619
|
+
return mask;
|
|
620
|
+
}
|
|
528
621
|
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
622
|
+
/*
|
|
623
|
+
* Check the host against the user's known_hosts file.
|
|
624
|
+
*
|
|
625
|
+
* Returns 1/0 for valid/''not-valid or <0 for an error
|
|
626
|
+
*/
|
|
627
|
+
static int check_against_known_hosts(
|
|
628
|
+
LIBSSH2_SESSION *session,
|
|
629
|
+
LIBSSH2_KNOWNHOSTS *known_hosts,
|
|
630
|
+
const char *hostname,
|
|
631
|
+
int port,
|
|
632
|
+
const char *key,
|
|
633
|
+
size_t key_len,
|
|
634
|
+
int key_type)
|
|
635
|
+
{
|
|
636
|
+
int check, typemask, ret = 0;
|
|
637
|
+
struct libssh2_knownhost *host = NULL;
|
|
532
638
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
s->channel = NULL;
|
|
639
|
+
if (known_hosts == NULL)
|
|
640
|
+
return 0;
|
|
536
641
|
|
|
537
|
-
|
|
538
|
-
|
|
642
|
+
typemask = fingerprint_type_mask(key_type);
|
|
643
|
+
check = libssh2_knownhost_checkp(known_hosts, hostname, port, key, key_len, typemask, &host);
|
|
644
|
+
if (check == LIBSSH2_KNOWNHOST_CHECK_FAILURE) {
|
|
645
|
+
ssh_error(session, "error checking for known host");
|
|
646
|
+
return -1;
|
|
647
|
+
}
|
|
539
648
|
|
|
540
|
-
|
|
541
|
-
if ((error = git_net_url_parse(&urldata, url)) < 0)
|
|
542
|
-
goto done;
|
|
649
|
+
ret = check == LIBSSH2_KNOWNHOST_CHECK_MATCH ? 1 : 0;
|
|
543
650
|
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
}
|
|
547
|
-
if ((error = git_ssh_extract_url_parts(&urldata, url)) < 0)
|
|
548
|
-
goto done;
|
|
651
|
+
return ret;
|
|
652
|
+
}
|
|
549
653
|
|
|
550
|
-
|
|
551
|
-
|
|
654
|
+
/*
|
|
655
|
+
* Perform the check for the session's certificate against known hosts if
|
|
656
|
+
* possible and then ask the user if they have a callback.
|
|
657
|
+
*
|
|
658
|
+
* Returns 1/0 for valid/not-valid or <0 for an error
|
|
659
|
+
*/
|
|
660
|
+
static int check_certificate(
|
|
661
|
+
LIBSSH2_SESSION *session,
|
|
662
|
+
LIBSSH2_KNOWNHOSTS *known_hosts,
|
|
663
|
+
git_transport_certificate_check_cb check_cb,
|
|
664
|
+
void *check_cb_payload,
|
|
665
|
+
const char *host,
|
|
666
|
+
int port)
|
|
667
|
+
{
|
|
668
|
+
git_cert_hostkey cert = {{ 0 }};
|
|
669
|
+
const char *key;
|
|
670
|
+
size_t cert_len;
|
|
671
|
+
int cert_type, cert_valid = 0, error = 0;
|
|
552
672
|
|
|
553
|
-
|
|
673
|
+
if ((key = libssh2_session_hostkey(session, &cert_len, &cert_type)) == NULL) {
|
|
674
|
+
ssh_error(session, "failed to retrieve hostkey");
|
|
675
|
+
return -1;
|
|
676
|
+
}
|
|
554
677
|
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
(error = git_stream_connect(s->io)) < 0)
|
|
558
|
-
goto done;
|
|
678
|
+
if ((cert_valid = check_against_known_hosts(session, known_hosts, host, port, key, cert_len, cert_type)) < 0)
|
|
679
|
+
return -1;
|
|
559
680
|
|
|
560
|
-
|
|
561
|
-
|
|
681
|
+
cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
|
|
682
|
+
if (key != NULL) {
|
|
683
|
+
cert.type |= GIT_CERT_SSH_RAW;
|
|
684
|
+
cert.hostkey = key;
|
|
685
|
+
cert.hostkey_len = cert_len;
|
|
686
|
+
switch (cert_type) {
|
|
687
|
+
case LIBSSH2_HOSTKEY_TYPE_RSA:
|
|
688
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
|
|
689
|
+
break;
|
|
690
|
+
case LIBSSH2_HOSTKEY_TYPE_DSS:
|
|
691
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
|
|
692
|
+
break;
|
|
562
693
|
|
|
563
|
-
if (t->owner->certificate_check_cb != NULL) {
|
|
564
|
-
git_cert_hostkey cert = {{ 0 }}, *cert_ptr;
|
|
565
|
-
const char *key;
|
|
566
|
-
size_t cert_len;
|
|
567
|
-
int cert_type;
|
|
568
|
-
|
|
569
|
-
cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
|
|
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
694
|
#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
695
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
|
|
696
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
|
|
697
|
+
break;
|
|
698
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
|
|
699
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
|
|
700
|
+
break;
|
|
701
|
+
case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
|
|
702
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
|
|
703
|
+
break;
|
|
594
704
|
#endif
|
|
595
|
-
|
|
705
|
+
|
|
596
706
|
#ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
707
|
+
case LIBSSH2_HOSTKEY_TYPE_ED25519:
|
|
708
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
|
|
709
|
+
break;
|
|
600
710
|
#endif
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
}
|
|
711
|
+
default:
|
|
712
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
|
|
604
713
|
}
|
|
714
|
+
}
|
|
605
715
|
|
|
606
716
|
#ifdef LIBSSH2_HOSTKEY_HASH_SHA256
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
717
|
+
key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
|
|
718
|
+
if (key != NULL) {
|
|
719
|
+
cert.type |= GIT_CERT_SSH_SHA256;
|
|
720
|
+
memcpy(&cert.hash_sha256, key, 32);
|
|
721
|
+
}
|
|
612
722
|
#endif
|
|
613
723
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
724
|
+
key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
|
|
725
|
+
if (key != NULL) {
|
|
726
|
+
cert.type |= GIT_CERT_SSH_SHA1;
|
|
727
|
+
memcpy(&cert.hash_sha1, key, 20);
|
|
728
|
+
}
|
|
619
729
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
730
|
+
key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);
|
|
731
|
+
if (key != NULL) {
|
|
732
|
+
cert.type |= GIT_CERT_SSH_MD5;
|
|
733
|
+
memcpy(&cert.hash_md5, key, 16);
|
|
734
|
+
}
|
|
625
735
|
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
736
|
+
if (cert.type == 0) {
|
|
737
|
+
git_error_set(GIT_ERROR_SSH, "unable to get the host key");
|
|
738
|
+
return -1;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
git_error_clear();
|
|
742
|
+
error = 0;
|
|
743
|
+
if (!cert_valid) {
|
|
744
|
+
git_error_set(GIT_ERROR_SSH, "invalid or unknown remote ssh hostkey");
|
|
745
|
+
error = GIT_ECERTIFICATE;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
if (check_cb != NULL) {
|
|
749
|
+
git_cert_hostkey *cert_ptr = &cert;
|
|
750
|
+
git_error_state previous_error = {0};
|
|
751
|
+
|
|
752
|
+
git_error_state_capture(&previous_error, error);
|
|
753
|
+
error = check_cb((git_cert *) cert_ptr, cert_valid, host, check_cb_payload);
|
|
754
|
+
if (error == GIT_PASSTHROUGH) {
|
|
755
|
+
error = git_error_state_restore(&previous_error);
|
|
756
|
+
} else if (error < 0 && !git_error_last()) {
|
|
757
|
+
git_error_set(GIT_ERROR_NET, "unknown remote host key");
|
|
630
758
|
}
|
|
631
759
|
|
|
632
|
-
|
|
633
|
-
|
|
760
|
+
git_error_state_free(&previous_error);
|
|
761
|
+
}
|
|
634
762
|
|
|
635
|
-
|
|
763
|
+
return error;
|
|
764
|
+
}
|
|
636
765
|
|
|
637
|
-
|
|
766
|
+
#define SSH_DEFAULT_PORT "22"
|
|
638
767
|
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
768
|
+
static int _git_ssh_setup_conn(
|
|
769
|
+
ssh_subtransport *t,
|
|
770
|
+
const char *url,
|
|
771
|
+
const char *cmd,
|
|
772
|
+
git_smart_subtransport_stream **stream)
|
|
773
|
+
{
|
|
774
|
+
int auth_methods, error = 0, port;
|
|
775
|
+
ssh_stream *s;
|
|
776
|
+
git_credential *cred = NULL;
|
|
777
|
+
LIBSSH2_SESSION *session=NULL;
|
|
778
|
+
LIBSSH2_CHANNEL *channel=NULL;
|
|
779
|
+
LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
|
|
642
780
|
|
|
643
|
-
|
|
644
|
-
|
|
781
|
+
t->current_stream = NULL;
|
|
782
|
+
|
|
783
|
+
*stream = NULL;
|
|
784
|
+
if (ssh_stream_alloc(t, cmd, stream) < 0)
|
|
785
|
+
return -1;
|
|
786
|
+
|
|
787
|
+
s = (ssh_stream *)*stream;
|
|
788
|
+
s->session = NULL;
|
|
789
|
+
s->channel = NULL;
|
|
790
|
+
|
|
791
|
+
if ((error = git_net_url_parse_standard_or_scp(&s->url, url)) < 0 ||
|
|
792
|
+
(error = git_socket_stream_new(&s->io, s->url.host, s->url.port)) < 0 ||
|
|
793
|
+
(error = git_stream_connect(s->io)) < 0)
|
|
794
|
+
goto done;
|
|
795
|
+
|
|
796
|
+
/*
|
|
797
|
+
* Try to parse the port as a number, if we can't then fall back to
|
|
798
|
+
* default. It would be nice if we could get the port that was resolved
|
|
799
|
+
* as part of the stream connection, but that's not something that's
|
|
800
|
+
* exposed.
|
|
801
|
+
*/
|
|
802
|
+
if (git__strntol32(&port, s->url.port, strlen(s->url.port), NULL, 10) < 0) {
|
|
803
|
+
git_error_set(GIT_ERROR_NET, "invalid port to ssh: %s", s->url.port);
|
|
804
|
+
error = -1;
|
|
805
|
+
goto done;
|
|
645
806
|
}
|
|
646
807
|
|
|
808
|
+
if ((error = _git_ssh_session_create(&session, &known_hosts, s->url.host, port, s->io)) < 0)
|
|
809
|
+
goto done;
|
|
810
|
+
|
|
811
|
+
if ((error = check_certificate(session, known_hosts, t->owner->connect_opts.callbacks.certificate_check, t->owner->connect_opts.callbacks.payload, s->url.host, port)) < 0)
|
|
812
|
+
goto done;
|
|
813
|
+
|
|
647
814
|
/* we need the username to ask for auth methods */
|
|
648
|
-
if (!
|
|
815
|
+
if (!s->url.username) {
|
|
649
816
|
if ((error = request_creds(&cred, t, NULL, GIT_CREDENTIAL_USERNAME)) < 0)
|
|
650
817
|
goto done;
|
|
651
818
|
|
|
652
|
-
|
|
819
|
+
s->url.username = git__strdup(((git_credential_username *) cred)->username);
|
|
653
820
|
cred->free(cred);
|
|
654
821
|
cred = NULL;
|
|
655
|
-
if (!
|
|
822
|
+
if (!s->url.username)
|
|
656
823
|
goto done;
|
|
657
|
-
} else if (
|
|
658
|
-
if ((error = git_credential_userpass_plaintext_new(&cred,
|
|
824
|
+
} else if (s->url.username && s->url.password) {
|
|
825
|
+
if ((error = git_credential_userpass_plaintext_new(&cred, s->url.username, s->url.password)) < 0)
|
|
659
826
|
goto done;
|
|
660
827
|
}
|
|
661
828
|
|
|
662
|
-
if ((error = list_auth_methods(&auth_methods, session,
|
|
829
|
+
if ((error = list_auth_methods(&auth_methods, session, s->url.username)) < 0)
|
|
663
830
|
goto done;
|
|
664
831
|
|
|
665
832
|
error = GIT_EAUTH;
|
|
@@ -673,10 +840,10 @@ post_extract:
|
|
|
673
840
|
cred = NULL;
|
|
674
841
|
}
|
|
675
842
|
|
|
676
|
-
if ((error = request_creds(&cred, t,
|
|
843
|
+
if ((error = request_creds(&cred, t, s->url.username, auth_methods)) < 0)
|
|
677
844
|
goto done;
|
|
678
845
|
|
|
679
|
-
if (strcmp(
|
|
846
|
+
if (strcmp(s->url.username, git_credential_get_username(cred))) {
|
|
680
847
|
git_error_set(GIT_ERROR_SSH, "username does not match previous request");
|
|
681
848
|
error = -1;
|
|
682
849
|
goto done;
|
|
@@ -686,7 +853,7 @@ post_extract:
|
|
|
686
853
|
|
|
687
854
|
if (error == GIT_EAUTH) {
|
|
688
855
|
/* refresh auth methods */
|
|
689
|
-
if ((error = list_auth_methods(&auth_methods, session,
|
|
856
|
+
if ((error = list_auth_methods(&auth_methods, session, s->url.username)) < 0)
|
|
690
857
|
goto done;
|
|
691
858
|
else
|
|
692
859
|
error = GIT_EAUTH;
|
|
@@ -714,6 +881,8 @@ done:
|
|
|
714
881
|
if (error < 0) {
|
|
715
882
|
ssh_stream_free(*stream);
|
|
716
883
|
|
|
884
|
+
if (known_hosts)
|
|
885
|
+
libssh2_knownhost_free(known_hosts);
|
|
717
886
|
if (session)
|
|
718
887
|
libssh2_session_free(session);
|
|
719
888
|
}
|
|
@@ -721,8 +890,6 @@ done:
|
|
|
721
890
|
if (cred)
|
|
722
891
|
cred->free(cred);
|
|
723
892
|
|
|
724
|
-
git_net_url_dispose(&urldata);
|
|
725
|
-
|
|
726
893
|
return error;
|
|
727
894
|
}
|
|
728
895
|
|
|
@@ -839,7 +1006,7 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
|
|
|
839
1006
|
|
|
840
1007
|
/* either error, or the remote accepts NONE auth, which is bizarre, let's punt */
|
|
841
1008
|
if (list == NULL && !libssh2_userauth_authenticated(session)) {
|
|
842
|
-
ssh_error(session, "
|
|
1009
|
+
ssh_error(session, "remote rejected authentication");
|
|
843
1010
|
return GIT_EAUTH;
|
|
844
1011
|
}
|
|
845
1012
|
|
|
@@ -870,7 +1037,7 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
|
|
|
870
1037
|
continue;
|
|
871
1038
|
}
|
|
872
1039
|
|
|
873
|
-
/*
|
|
1040
|
+
/* Skip it if we don't know it */
|
|
874
1041
|
ptr = strchr(ptr, ',');
|
|
875
1042
|
}
|
|
876
1043
|
|