rugged 1.6.5 → 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/rugged/rugged_allocator.c +0 -54
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +3 -8
- data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
- data/vendor/libgit2/cmake/SelectGSSAPI.cmake +3 -3
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +21 -2
- data/vendor/libgit2/cmake/SelectHashes.cmake +4 -0
- data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
- data/vendor/libgit2/deps/pcre/LICENCE +5 -5
- data/vendor/libgit2/deps/pcre/pcre.h +2 -2
- data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
- data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
- data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +24 -22
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
- data/vendor/libgit2/include/git2/common.h +26 -1
- data/vendor/libgit2/include/git2/diff.h +41 -3
- data/vendor/libgit2/include/git2/errors.h +4 -2
- data/vendor/libgit2/include/git2/index.h +9 -0
- data/vendor/libgit2/include/git2/oid.h +1 -1
- data/vendor/libgit2/include/git2/remote.h +18 -0
- data/vendor/libgit2/include/git2/repository.h +12 -2
- data/vendor/libgit2/include/git2/sys/alloc.h +0 -34
- data/vendor/libgit2/include/git2/sys/commit_graph.h +12 -2
- data/vendor/libgit2/include/git2/sys/midx.h +5 -1
- data/vendor/libgit2/include/git2/sys/stream.h +16 -2
- data/vendor/libgit2/include/git2/sys/transport.h +20 -2
- data/vendor/libgit2/include/git2/version.h +4 -4
- data/vendor/libgit2/include/git2/worktree.h +3 -1
- data/vendor/libgit2/src/CMakeLists.txt +34 -11
- data/vendor/libgit2/src/cli/cmd_clone.c +22 -6
- data/vendor/libgit2/src/cli/progress.c +9 -8
- data/vendor/libgit2/src/cli/progress.h +4 -4
- data/vendor/libgit2/src/libgit2/CMakeLists.txt +1 -19
- data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
- data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
- data/vendor/libgit2/src/libgit2/apply.c +4 -3
- data/vendor/libgit2/src/libgit2/blame.c +23 -16
- data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
- data/vendor/libgit2/src/libgit2/branch.c +2 -2
- data/vendor/libgit2/src/libgit2/cherrypick.c +3 -3
- data/vendor/libgit2/src/libgit2/clone.c +3 -1
- data/vendor/libgit2/src/libgit2/commit.c +31 -9
- data/vendor/libgit2/src/libgit2/commit_graph.c +110 -43
- data/vendor/libgit2/src/libgit2/commit_graph.h +20 -4
- data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
- data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
- data/vendor/libgit2/src/libgit2/config_file.c +14 -8
- data/vendor/libgit2/src/libgit2/describe.c +10 -7
- data/vendor/libgit2/src/libgit2/diff.c +16 -7
- data/vendor/libgit2/src/libgit2/diff.h +6 -6
- data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
- data/vendor/libgit2/src/libgit2/diff_generate.c +36 -15
- data/vendor/libgit2/src/libgit2/diff_parse.c +20 -4
- data/vendor/libgit2/src/libgit2/diff_print.c +26 -7
- data/vendor/libgit2/src/libgit2/diff_tform.c +4 -4
- data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/libgit2/email.c +4 -3
- data/vendor/libgit2/src/libgit2/errors.c +73 -18
- data/vendor/libgit2/src/libgit2/fetch.c +37 -9
- data/vendor/libgit2/src/libgit2/fetch.h +0 -2
- data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
- data/vendor/libgit2/src/libgit2/grafts.c +272 -0
- data/vendor/libgit2/src/libgit2/grafts.h +36 -0
- data/vendor/libgit2/src/libgit2/ident.c +3 -3
- data/vendor/libgit2/src/libgit2/index.c +325 -125
- data/vendor/libgit2/src/libgit2/index.h +14 -1
- data/vendor/libgit2/src/libgit2/indexer.c +10 -3
- data/vendor/libgit2/src/libgit2/iterator.c +20 -5
- data/vendor/libgit2/src/libgit2/iterator.h +3 -0
- data/vendor/libgit2/src/libgit2/libgit2.c +39 -0
- data/vendor/libgit2/src/libgit2/merge.c +14 -9
- data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
- data/vendor/libgit2/src/libgit2/midx.c +66 -37
- data/vendor/libgit2/src/libgit2/midx.h +13 -3
- data/vendor/libgit2/src/libgit2/notes.c +9 -8
- data/vendor/libgit2/src/libgit2/object.c +40 -15
- data/vendor/libgit2/src/libgit2/object.h +6 -0
- data/vendor/libgit2/src/libgit2/odb.c +11 -5
- data/vendor/libgit2/src/libgit2/odb_pack.c +16 -3
- data/vendor/libgit2/src/libgit2/oid.c +7 -1
- data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
- data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
- data/vendor/libgit2/src/libgit2/pack-objects.c +19 -12
- data/vendor/libgit2/src/libgit2/pack-objects.h +5 -2
- data/vendor/libgit2/src/libgit2/pack.c +3 -3
- data/vendor/libgit2/src/libgit2/parse.c +7 -4
- data/vendor/libgit2/src/libgit2/parse.h +1 -1
- data/vendor/libgit2/src/libgit2/patch.h +7 -1
- data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
- data/vendor/libgit2/src/libgit2/patch_parse.c +16 -8
- data/vendor/libgit2/src/libgit2/push.c +2 -2
- data/vendor/libgit2/src/libgit2/reader.c +1 -1
- data/vendor/libgit2/src/libgit2/rebase.c +72 -84
- data/vendor/libgit2/src/libgit2/refdb_fs.c +22 -13
- data/vendor/libgit2/src/libgit2/refs.c +8 -1
- data/vendor/libgit2/src/libgit2/remote.c +15 -6
- data/vendor/libgit2/src/libgit2/remote.h +1 -0
- data/vendor/libgit2/src/libgit2/repository.c +580 -301
- data/vendor/libgit2/src/libgit2/repository.h +17 -2
- data/vendor/libgit2/src/libgit2/reset.c +2 -2
- data/vendor/libgit2/src/libgit2/revert.c +8 -11
- data/vendor/libgit2/src/libgit2/revparse.c +1 -4
- data/vendor/libgit2/src/libgit2/revwalk.c +26 -4
- data/vendor/libgit2/src/libgit2/stash.c +9 -8
- data/vendor/libgit2/src/libgit2/streams/mbedtls.c +0 -1
- data/vendor/libgit2/src/libgit2/streams/openssl.c +8 -16
- data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
- data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
- data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
- data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
- data/vendor/libgit2/src/libgit2/streams/stransport.c +40 -12
- data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
- data/vendor/libgit2/src/libgit2/submodule.h +3 -3
- data/vendor/libgit2/src/libgit2/threadstate.c +15 -2
- data/vendor/libgit2/src/libgit2/threadstate.h +1 -3
- data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
- data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
- data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
- data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
- data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
- data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
- data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
- data/vendor/libgit2/src/libgit2/transports/http.c +7 -2
- data/vendor/libgit2/src/libgit2/transports/httpclient.c +5 -0
- data/vendor/libgit2/src/libgit2/transports/local.c +13 -4
- data/vendor/libgit2/src/libgit2/transports/smart.c +33 -27
- data/vendor/libgit2/src/libgit2/transports/smart.h +23 -8
- data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +136 -17
- data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +154 -47
- data/vendor/libgit2/src/libgit2/transports/ssh.c +3 -3
- data/vendor/libgit2/src/libgit2/transports/winhttp.c +14 -15
- data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
- data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
- data/vendor/libgit2/src/libgit2/tree.c +1 -1
- data/vendor/libgit2/src/libgit2/worktree.c +25 -10
- data/vendor/libgit2/src/util/alloc.c +65 -6
- data/vendor/libgit2/src/util/alloc.h +34 -9
- data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
- data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
- data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -105
- data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
- data/vendor/libgit2/src/util/array.h +6 -1
- data/vendor/libgit2/src/util/cc-compat.h +2 -0
- data/vendor/libgit2/src/util/filebuf.c +6 -1
- data/vendor/libgit2/src/util/filebuf.h +19 -6
- data/vendor/libgit2/src/util/fs_path.c +1 -1
- data/vendor/libgit2/src/util/futils.c +8 -5
- data/vendor/libgit2/src/util/git2_features.h.in +9 -3
- data/vendor/libgit2/src/util/net.c +308 -157
- data/vendor/libgit2/src/util/net.h +25 -0
- data/vendor/libgit2/src/util/posix.c +54 -0
- data/vendor/libgit2/src/util/posix.h +22 -0
- data/vendor/libgit2/src/util/rand.c +6 -4
- data/vendor/libgit2/src/util/staticstr.h +66 -0
- data/vendor/libgit2/src/util/util.c +15 -10
- data/vendor/libgit2/src/util/util.h +24 -16
- data/vendor/libgit2/src/util/win32/error.c +1 -1
- data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
- data/vendor/libgit2/src/util/win32/posix_w32.c +1 -1
- data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
- data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
- data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
- metadata +29 -23
- data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
- data/vendor/libgit2/src/libgit2/netops.c +0 -124
- data/vendor/libgit2/src/libgit2/netops.h +0 -68
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xtypes.h +0 -0
@@ -20,13 +20,13 @@
|
|
20
20
|
#include <krb5.h>
|
21
21
|
#endif
|
22
22
|
|
23
|
-
static gss_OID_desc
|
23
|
+
static gss_OID_desc gssapi_oid_spnego =
|
24
24
|
{ 6, (void *) "\x2b\x06\x01\x05\x05\x02" };
|
25
|
-
static gss_OID_desc
|
25
|
+
static gss_OID_desc gssapi_oid_krb5 =
|
26
26
|
{ 9, (void *) "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02" };
|
27
27
|
|
28
|
-
static gss_OID
|
29
|
-
{ &
|
28
|
+
static gss_OID gssapi_oids[] =
|
29
|
+
{ &gssapi_oid_spnego, &gssapi_oid_krb5, NULL };
|
30
30
|
|
31
31
|
typedef struct {
|
32
32
|
git_http_auth_context parent;
|
@@ -36,9 +36,9 @@ typedef struct {
|
|
36
36
|
char *challenge;
|
37
37
|
gss_ctx_id_t gss_context;
|
38
38
|
gss_OID oid;
|
39
|
-
}
|
39
|
+
} http_auth_gssapi_context;
|
40
40
|
|
41
|
-
static void
|
41
|
+
static void gssapi_err_set(
|
42
42
|
OM_uint32 status_major,
|
43
43
|
OM_uint32 status_minor,
|
44
44
|
const char *message)
|
@@ -58,11 +58,11 @@ static void negotiate_err_set(
|
|
58
58
|
}
|
59
59
|
}
|
60
60
|
|
61
|
-
static int
|
61
|
+
static int gssapi_set_challenge(
|
62
62
|
git_http_auth_context *c,
|
63
63
|
const char *challenge)
|
64
64
|
{
|
65
|
-
|
65
|
+
http_auth_gssapi_context *ctx = (http_auth_gssapi_context *)c;
|
66
66
|
|
67
67
|
GIT_ASSERT_ARG(ctx);
|
68
68
|
GIT_ASSERT_ARG(challenge);
|
@@ -76,7 +76,7 @@ static int negotiate_set_challenge(
|
|
76
76
|
return 0;
|
77
77
|
}
|
78
78
|
|
79
|
-
static void
|
79
|
+
static void gssapi_context_dispose(http_auth_gssapi_context *ctx)
|
80
80
|
{
|
81
81
|
OM_uint32 status_minor;
|
82
82
|
|
@@ -92,12 +92,12 @@ static void negotiate_context_dispose(http_auth_negotiate_context *ctx)
|
|
92
92
|
ctx->challenge = NULL;
|
93
93
|
}
|
94
94
|
|
95
|
-
static int
|
95
|
+
static int gssapi_next_token(
|
96
96
|
git_str *buf,
|
97
97
|
git_http_auth_context *c,
|
98
98
|
git_credential *cred)
|
99
99
|
{
|
100
|
-
|
100
|
+
http_auth_gssapi_context *ctx = (http_auth_gssapi_context *)c;
|
101
101
|
OM_uint32 status_major, status_minor;
|
102
102
|
gss_buffer_desc target_buffer = GSS_C_EMPTY_BUFFER,
|
103
103
|
input_token = GSS_C_EMPTY_BUFFER,
|
@@ -126,7 +126,7 @@ static int negotiate_next_token(
|
|
126
126
|
GSS_C_NT_HOSTBASED_SERVICE, &server);
|
127
127
|
|
128
128
|
if (GSS_ERROR(status_major)) {
|
129
|
-
|
129
|
+
gssapi_err_set(status_major, status_minor,
|
130
130
|
"could not parse principal");
|
131
131
|
error = -1;
|
132
132
|
goto done;
|
@@ -152,10 +152,10 @@ static int negotiate_next_token(
|
|
152
152
|
input_token.length = input_buf.size;
|
153
153
|
input_token_ptr = &input_token;
|
154
154
|
} else if (ctx->gss_context != GSS_C_NO_CONTEXT) {
|
155
|
-
|
155
|
+
gssapi_context_dispose(ctx);
|
156
156
|
}
|
157
157
|
|
158
|
-
mech = &
|
158
|
+
mech = &gssapi_oid_spnego;
|
159
159
|
|
160
160
|
status_major = gss_init_sec_context(
|
161
161
|
&status_minor,
|
@@ -173,14 +173,14 @@ static int negotiate_next_token(
|
|
173
173
|
NULL);
|
174
174
|
|
175
175
|
if (GSS_ERROR(status_major)) {
|
176
|
-
|
176
|
+
gssapi_err_set(status_major, status_minor, "negotiate failure");
|
177
177
|
error = -1;
|
178
178
|
goto done;
|
179
179
|
}
|
180
180
|
|
181
181
|
/* This message merely told us auth was complete; we do not respond. */
|
182
182
|
if (status_major == GSS_S_COMPLETE) {
|
183
|
-
|
183
|
+
gssapi_context_dispose(ctx);
|
184
184
|
ctx->complete = 1;
|
185
185
|
goto done;
|
186
186
|
}
|
@@ -204,20 +204,20 @@ done:
|
|
204
204
|
return error;
|
205
205
|
}
|
206
206
|
|
207
|
-
static int
|
207
|
+
static int gssapi_is_complete(git_http_auth_context *c)
|
208
208
|
{
|
209
|
-
|
209
|
+
http_auth_gssapi_context *ctx = (http_auth_gssapi_context *)c;
|
210
210
|
|
211
211
|
GIT_ASSERT_ARG(ctx);
|
212
212
|
|
213
213
|
return (ctx->complete == 1);
|
214
214
|
}
|
215
215
|
|
216
|
-
static void
|
216
|
+
static void gssapi_context_free(git_http_auth_context *c)
|
217
217
|
{
|
218
|
-
|
218
|
+
http_auth_gssapi_context *ctx = (http_auth_gssapi_context *)c;
|
219
219
|
|
220
|
-
|
220
|
+
gssapi_context_dispose(ctx);
|
221
221
|
|
222
222
|
ctx->configured = 0;
|
223
223
|
ctx->complete = 0;
|
@@ -226,8 +226,8 @@ static void negotiate_context_free(git_http_auth_context *c)
|
|
226
226
|
git__free(ctx);
|
227
227
|
}
|
228
228
|
|
229
|
-
static int
|
230
|
-
|
229
|
+
static int gssapi_init_context(
|
230
|
+
http_auth_gssapi_context *ctx,
|
231
231
|
const git_net_url *url)
|
232
232
|
{
|
233
233
|
OM_uint32 status_major, status_minor;
|
@@ -239,13 +239,13 @@ static int negotiate_init_context(
|
|
239
239
|
status_major = gss_indicate_mechs(&status_minor, &mechanism_list);
|
240
240
|
|
241
241
|
if (GSS_ERROR(status_major)) {
|
242
|
-
|
242
|
+
gssapi_err_set(status_major, status_minor,
|
243
243
|
"could not query mechanisms");
|
244
244
|
return -1;
|
245
245
|
}
|
246
246
|
|
247
247
|
if (mechanism_list) {
|
248
|
-
for (oid =
|
248
|
+
for (oid = gssapi_oids; *oid; oid++) {
|
249
249
|
for (i = 0; i < mechanism_list->count; i++) {
|
250
250
|
item = &mechanism_list->elements[i];
|
251
251
|
|
@@ -285,14 +285,14 @@ int git_http_auth_negotiate(
|
|
285
285
|
git_http_auth_context **out,
|
286
286
|
const git_net_url *url)
|
287
287
|
{
|
288
|
-
|
288
|
+
http_auth_gssapi_context *ctx;
|
289
289
|
|
290
290
|
*out = NULL;
|
291
291
|
|
292
|
-
ctx = git__calloc(1, sizeof(
|
292
|
+
ctx = git__calloc(1, sizeof(http_auth_gssapi_context));
|
293
293
|
GIT_ERROR_CHECK_ALLOC(ctx);
|
294
294
|
|
295
|
-
if (
|
295
|
+
if (gssapi_init_context(ctx, url) < 0) {
|
296
296
|
git__free(ctx);
|
297
297
|
return -1;
|
298
298
|
}
|
@@ -300,10 +300,10 @@ int git_http_auth_negotiate(
|
|
300
300
|
ctx->parent.type = GIT_HTTP_AUTH_NEGOTIATE;
|
301
301
|
ctx->parent.credtypes = GIT_CREDENTIAL_DEFAULT;
|
302
302
|
ctx->parent.connection_affinity = 1;
|
303
|
-
ctx->parent.set_challenge =
|
304
|
-
ctx->parent.next_token =
|
305
|
-
ctx->parent.is_complete =
|
306
|
-
ctx->parent.free =
|
303
|
+
ctx->parent.set_challenge = gssapi_set_challenge;
|
304
|
+
ctx->parent.next_token = gssapi_next_token;
|
305
|
+
ctx->parent.is_complete = gssapi_is_complete;
|
306
|
+
ctx->parent.free = gssapi_context_free;
|
307
307
|
|
308
308
|
*out = (git_http_auth_context *)ctx;
|
309
309
|
|
@@ -23,7 +23,7 @@ typedef struct {
|
|
23
23
|
bool complete;
|
24
24
|
} http_auth_ntlm_context;
|
25
25
|
|
26
|
-
static int
|
26
|
+
static int ntlmclient_set_challenge(
|
27
27
|
git_http_auth_context *c,
|
28
28
|
const char *challenge)
|
29
29
|
{
|
@@ -40,7 +40,7 @@ static int ntlm_set_challenge(
|
|
40
40
|
return 0;
|
41
41
|
}
|
42
42
|
|
43
|
-
static int
|
43
|
+
static int ntlmclient_set_credentials(http_auth_ntlm_context *ctx, git_credential *_cred)
|
44
44
|
{
|
45
45
|
git_credential_userpass_plaintext *cred;
|
46
46
|
const char *sep, *username;
|
@@ -76,7 +76,7 @@ done:
|
|
76
76
|
return error;
|
77
77
|
}
|
78
78
|
|
79
|
-
static int
|
79
|
+
static int ntlmclient_next_token(
|
80
80
|
git_str *buf,
|
81
81
|
git_http_auth_context *c,
|
82
82
|
git_credential *cred)
|
@@ -104,7 +104,7 @@ static int ntlm_next_token(
|
|
104
104
|
*/
|
105
105
|
ctx->complete = true;
|
106
106
|
|
107
|
-
if (cred &&
|
107
|
+
if (cred && ntlmclient_set_credentials(ctx, cred) != 0)
|
108
108
|
goto done;
|
109
109
|
|
110
110
|
if (challenge_len < 4) {
|
@@ -162,7 +162,7 @@ done:
|
|
162
162
|
return error;
|
163
163
|
}
|
164
164
|
|
165
|
-
static int
|
165
|
+
static int ntlmclient_is_complete(git_http_auth_context *c)
|
166
166
|
{
|
167
167
|
http_auth_ntlm_context *ctx = (http_auth_ntlm_context *)c;
|
168
168
|
|
@@ -170,7 +170,7 @@ static int ntlm_is_complete(git_http_auth_context *c)
|
|
170
170
|
return (ctx->complete == true);
|
171
171
|
}
|
172
172
|
|
173
|
-
static void
|
173
|
+
static void ntlmclient_context_free(git_http_auth_context *c)
|
174
174
|
{
|
175
175
|
http_auth_ntlm_context *ctx = (http_auth_ntlm_context *)c;
|
176
176
|
|
@@ -179,7 +179,7 @@ static void ntlm_context_free(git_http_auth_context *c)
|
|
179
179
|
git__free(ctx);
|
180
180
|
}
|
181
181
|
|
182
|
-
static int
|
182
|
+
static int ntlmclient_init_context(
|
183
183
|
http_auth_ntlm_context *ctx,
|
184
184
|
const git_net_url *url)
|
185
185
|
{
|
@@ -206,7 +206,7 @@ int git_http_auth_ntlm(
|
|
206
206
|
ctx = git__calloc(1, sizeof(http_auth_ntlm_context));
|
207
207
|
GIT_ERROR_CHECK_ALLOC(ctx);
|
208
208
|
|
209
|
-
if (
|
209
|
+
if (ntlmclient_init_context(ctx, url) < 0) {
|
210
210
|
git__free(ctx);
|
211
211
|
return -1;
|
212
212
|
}
|
@@ -214,10 +214,10 @@ int git_http_auth_ntlm(
|
|
214
214
|
ctx->parent.type = GIT_HTTP_AUTH_NTLM;
|
215
215
|
ctx->parent.credtypes = GIT_CREDENTIAL_USERPASS_PLAINTEXT;
|
216
216
|
ctx->parent.connection_affinity = 1;
|
217
|
-
ctx->parent.set_challenge =
|
218
|
-
ctx->parent.next_token =
|
219
|
-
ctx->parent.is_complete =
|
220
|
-
ctx->parent.free =
|
217
|
+
ctx->parent.set_challenge = ntlmclient_set_challenge;
|
218
|
+
ctx->parent.next_token = ntlmclient_next_token;
|
219
|
+
ctx->parent.is_complete = ntlmclient_is_complete;
|
220
|
+
ctx->parent.free = ntlmclient_context_free;
|
221
221
|
|
222
222
|
*out = (git_http_auth_context *)ctx;
|
223
223
|
|
@@ -0,0 +1,341 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
3
|
+
*
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "auth_ntlm.h"
|
9
|
+
#include "auth_negotiate.h"
|
10
|
+
|
11
|
+
#ifdef GIT_WIN32
|
12
|
+
|
13
|
+
#define SECURITY_WIN32
|
14
|
+
|
15
|
+
#include "git2.h"
|
16
|
+
#include "auth.h"
|
17
|
+
#include "git2/sys/credential.h"
|
18
|
+
|
19
|
+
#include <windows.h>
|
20
|
+
#include <security.h>
|
21
|
+
|
22
|
+
typedef struct {
|
23
|
+
git_http_auth_context parent;
|
24
|
+
wchar_t *target;
|
25
|
+
|
26
|
+
const char *package_name;
|
27
|
+
size_t package_name_len;
|
28
|
+
wchar_t *package_name_w;
|
29
|
+
SecPkgInfoW *package_info;
|
30
|
+
SEC_WINNT_AUTH_IDENTITY_W identity;
|
31
|
+
CredHandle cred;
|
32
|
+
CtxtHandle context;
|
33
|
+
|
34
|
+
int has_identity : 1,
|
35
|
+
has_credentials : 1,
|
36
|
+
has_context : 1,
|
37
|
+
complete : 1;
|
38
|
+
git_str challenge;
|
39
|
+
} http_auth_sspi_context;
|
40
|
+
|
41
|
+
static void sspi_reset_context(http_auth_sspi_context *ctx)
|
42
|
+
{
|
43
|
+
if (ctx->has_identity) {
|
44
|
+
git__free(ctx->identity.User);
|
45
|
+
git__free(ctx->identity.Domain);
|
46
|
+
git__free(ctx->identity.Password);
|
47
|
+
|
48
|
+
memset(&ctx->identity, 0, sizeof(SEC_WINNT_AUTH_IDENTITY_W));
|
49
|
+
|
50
|
+
ctx->has_identity = 0;
|
51
|
+
}
|
52
|
+
|
53
|
+
if (ctx->has_credentials) {
|
54
|
+
FreeCredentialsHandle(&ctx->cred);
|
55
|
+
memset(&ctx->cred, 0, sizeof(CredHandle));
|
56
|
+
|
57
|
+
ctx->has_credentials = 0;
|
58
|
+
}
|
59
|
+
|
60
|
+
if (ctx->has_context) {
|
61
|
+
DeleteSecurityContext(&ctx->context);
|
62
|
+
memset(&ctx->context, 0, sizeof(CtxtHandle));
|
63
|
+
|
64
|
+
ctx->has_context = 0;
|
65
|
+
}
|
66
|
+
|
67
|
+
ctx->complete = 0;
|
68
|
+
|
69
|
+
git_str_dispose(&ctx->challenge);
|
70
|
+
}
|
71
|
+
|
72
|
+
static int sspi_set_challenge(
|
73
|
+
git_http_auth_context *c,
|
74
|
+
const char *challenge)
|
75
|
+
{
|
76
|
+
http_auth_sspi_context *ctx = (http_auth_sspi_context *)c;
|
77
|
+
size_t challenge_len = strlen(challenge);
|
78
|
+
|
79
|
+
git_str_clear(&ctx->challenge);
|
80
|
+
|
81
|
+
if (strncmp(challenge, ctx->package_name, ctx->package_name_len) != 0) {
|
82
|
+
git_error_set(GIT_ERROR_NET, "invalid %s challenge from server", ctx->package_name);
|
83
|
+
return -1;
|
84
|
+
}
|
85
|
+
|
86
|
+
/*
|
87
|
+
* A package type indicator without a base64 payload indicates the
|
88
|
+
* mechanism; it's not an actual challenge. Ignore it.
|
89
|
+
*/
|
90
|
+
if (challenge[ctx->package_name_len] == 0) {
|
91
|
+
return 0;
|
92
|
+
} else if (challenge[ctx->package_name_len] != ' ') {
|
93
|
+
git_error_set(GIT_ERROR_NET, "invalid %s challenge from server", ctx->package_name);
|
94
|
+
return -1;
|
95
|
+
}
|
96
|
+
|
97
|
+
if (git_str_decode_base64(&ctx->challenge,
|
98
|
+
challenge + (ctx->package_name_len + 1),
|
99
|
+
challenge_len - (ctx->package_name_len + 1)) < 0) {
|
100
|
+
git_error_set(GIT_ERROR_NET, "invalid %s challenge from server", ctx->package_name);
|
101
|
+
return -1;
|
102
|
+
}
|
103
|
+
|
104
|
+
GIT_ASSERT(ctx->challenge.size <= ULONG_MAX);
|
105
|
+
return 0;
|
106
|
+
}
|
107
|
+
|
108
|
+
static int create_identity(
|
109
|
+
SEC_WINNT_AUTH_IDENTITY_W **out,
|
110
|
+
http_auth_sspi_context *ctx,
|
111
|
+
git_credential *cred)
|
112
|
+
{
|
113
|
+
git_credential_userpass_plaintext *userpass;
|
114
|
+
wchar_t *username = NULL, *domain = NULL, *password = NULL;
|
115
|
+
int username_len = 0, domain_len = 0, password_len = 0;
|
116
|
+
const char *sep;
|
117
|
+
|
118
|
+
if (cred->credtype == GIT_CREDENTIAL_DEFAULT) {
|
119
|
+
*out = NULL;
|
120
|
+
return 0;
|
121
|
+
}
|
122
|
+
|
123
|
+
if (cred->credtype != GIT_CREDENTIAL_USERPASS_PLAINTEXT) {
|
124
|
+
git_error_set(GIT_ERROR_NET, "unknown credential type: %d", cred->credtype);
|
125
|
+
return -1;
|
126
|
+
}
|
127
|
+
|
128
|
+
userpass = (git_credential_userpass_plaintext *)cred;
|
129
|
+
|
130
|
+
if ((sep = strchr(userpass->username, '\\')) != NULL) {
|
131
|
+
GIT_ASSERT(sep - userpass->username < INT_MAX);
|
132
|
+
|
133
|
+
username_len = git_utf8_to_16_alloc(&username, sep + 1);
|
134
|
+
domain_len = git_utf8_to_16_alloc_with_len(&domain,
|
135
|
+
userpass->username, (int)(sep - userpass->username));
|
136
|
+
} else {
|
137
|
+
username_len = git_utf8_to_16_alloc(&username,
|
138
|
+
userpass->username);
|
139
|
+
}
|
140
|
+
|
141
|
+
password_len = git_utf8_to_16_alloc(&password, userpass->password);
|
142
|
+
|
143
|
+
if (username_len < 0 || domain_len < 0 || password_len < 0) {
|
144
|
+
git__free(username);
|
145
|
+
git__free(domain);
|
146
|
+
git__free(password);
|
147
|
+
return -1;
|
148
|
+
}
|
149
|
+
|
150
|
+
ctx->identity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
|
151
|
+
ctx->identity.User = username;
|
152
|
+
ctx->identity.UserLength = (unsigned long)username_len;
|
153
|
+
ctx->identity.Password = password;
|
154
|
+
ctx->identity.PasswordLength = (unsigned long)password_len;
|
155
|
+
ctx->identity.Domain = domain;
|
156
|
+
ctx->identity.DomainLength = (unsigned long)domain_len;
|
157
|
+
|
158
|
+
ctx->has_identity = 1;
|
159
|
+
|
160
|
+
*out = &ctx->identity;
|
161
|
+
|
162
|
+
return 0;
|
163
|
+
}
|
164
|
+
|
165
|
+
static int sspi_next_token(
|
166
|
+
git_str *buf,
|
167
|
+
git_http_auth_context *c,
|
168
|
+
git_credential *cred)
|
169
|
+
{
|
170
|
+
http_auth_sspi_context *ctx = (http_auth_sspi_context *)c;
|
171
|
+
SEC_WINNT_AUTH_IDENTITY_W *identity = NULL;
|
172
|
+
TimeStamp timestamp;
|
173
|
+
DWORD context_flags;
|
174
|
+
SecBuffer input_buf = { 0, SECBUFFER_TOKEN, NULL };
|
175
|
+
SecBuffer output_buf = { 0, SECBUFFER_TOKEN, NULL };
|
176
|
+
SecBufferDesc input_buf_desc = { SECBUFFER_VERSION, 1, &input_buf };
|
177
|
+
SecBufferDesc output_buf_desc = { SECBUFFER_VERSION, 1, &output_buf };
|
178
|
+
SECURITY_STATUS status;
|
179
|
+
|
180
|
+
if (ctx->complete)
|
181
|
+
sspi_reset_context(ctx);
|
182
|
+
|
183
|
+
if (!ctx->has_context) {
|
184
|
+
if (create_identity(&identity, ctx, cred) < 0)
|
185
|
+
return -1;
|
186
|
+
|
187
|
+
status = AcquireCredentialsHandleW(NULL, ctx->package_name_w,
|
188
|
+
SECPKG_CRED_BOTH, NULL, identity, NULL,
|
189
|
+
NULL, &ctx->cred, ×tamp);
|
190
|
+
|
191
|
+
if (status != SEC_E_OK) {
|
192
|
+
git_error_set(GIT_ERROR_OS, "could not acquire credentials");
|
193
|
+
return -1;
|
194
|
+
}
|
195
|
+
|
196
|
+
ctx->has_credentials = 1;
|
197
|
+
}
|
198
|
+
|
199
|
+
context_flags = ISC_REQ_ALLOCATE_MEMORY |
|
200
|
+
ISC_REQ_CONFIDENTIALITY |
|
201
|
+
ISC_REQ_MUTUAL_AUTH;
|
202
|
+
|
203
|
+
if (ctx->challenge.size > 0) {
|
204
|
+
input_buf.BufferType = SECBUFFER_TOKEN;
|
205
|
+
input_buf.cbBuffer = (unsigned long)ctx->challenge.size;
|
206
|
+
input_buf.pvBuffer = ctx->challenge.ptr;
|
207
|
+
}
|
208
|
+
|
209
|
+
status = InitializeSecurityContextW(&ctx->cred,
|
210
|
+
ctx->has_context ? &ctx->context : NULL,
|
211
|
+
ctx->target,
|
212
|
+
context_flags,
|
213
|
+
0,
|
214
|
+
SECURITY_NETWORK_DREP,
|
215
|
+
ctx->has_context ? &input_buf_desc : NULL,
|
216
|
+
0,
|
217
|
+
ctx->has_context ? NULL : &ctx->context,
|
218
|
+
&output_buf_desc,
|
219
|
+
&context_flags,
|
220
|
+
NULL);
|
221
|
+
|
222
|
+
if (status == SEC_I_COMPLETE_AND_CONTINUE ||
|
223
|
+
status == SEC_I_COMPLETE_NEEDED)
|
224
|
+
status = CompleteAuthToken(&ctx->context, &output_buf_desc);
|
225
|
+
|
226
|
+
if (status == SEC_E_OK) {
|
227
|
+
ctx->complete = 1;
|
228
|
+
} else if (status != SEC_I_CONTINUE_NEEDED) {
|
229
|
+
git_error_set(GIT_ERROR_OS, "could not initialize security context");
|
230
|
+
return -1;
|
231
|
+
}
|
232
|
+
|
233
|
+
ctx->has_context = 1;
|
234
|
+
git_str_clear(&ctx->challenge);
|
235
|
+
|
236
|
+
if (output_buf.cbBuffer > 0) {
|
237
|
+
git_str_put(buf, ctx->package_name, ctx->package_name_len);
|
238
|
+
git_str_putc(buf, ' ');
|
239
|
+
git_str_encode_base64(buf, output_buf.pvBuffer, output_buf.cbBuffer);
|
240
|
+
|
241
|
+
FreeContextBuffer(output_buf.pvBuffer);
|
242
|
+
|
243
|
+
if (git_str_oom(buf))
|
244
|
+
return -1;
|
245
|
+
}
|
246
|
+
|
247
|
+
return 0;
|
248
|
+
}
|
249
|
+
|
250
|
+
static int sspi_is_complete(git_http_auth_context *c)
|
251
|
+
{
|
252
|
+
http_auth_sspi_context *ctx = (http_auth_sspi_context *)c;
|
253
|
+
|
254
|
+
return ctx->complete;
|
255
|
+
}
|
256
|
+
|
257
|
+
static void sspi_context_free(git_http_auth_context *c)
|
258
|
+
{
|
259
|
+
http_auth_sspi_context *ctx = (http_auth_sspi_context *)c;
|
260
|
+
|
261
|
+
sspi_reset_context(ctx);
|
262
|
+
|
263
|
+
FreeContextBuffer(ctx->package_info);
|
264
|
+
git__free(ctx->target);
|
265
|
+
git__free(ctx);
|
266
|
+
}
|
267
|
+
|
268
|
+
static int sspi_init_context(
|
269
|
+
git_http_auth_context **out,
|
270
|
+
git_http_auth_t type,
|
271
|
+
const git_net_url *url)
|
272
|
+
{
|
273
|
+
http_auth_sspi_context *ctx;
|
274
|
+
git_str target = GIT_STR_INIT;
|
275
|
+
|
276
|
+
*out = NULL;
|
277
|
+
|
278
|
+
ctx = git__calloc(1, sizeof(http_auth_sspi_context));
|
279
|
+
GIT_ERROR_CHECK_ALLOC(ctx);
|
280
|
+
|
281
|
+
switch (type) {
|
282
|
+
case GIT_HTTP_AUTH_NTLM:
|
283
|
+
ctx->package_name = "NTLM";
|
284
|
+
ctx->package_name_len = CONST_STRLEN("NTLM");
|
285
|
+
ctx->package_name_w = L"NTLM";
|
286
|
+
ctx->parent.credtypes = GIT_CREDENTIAL_USERPASS_PLAINTEXT |
|
287
|
+
GIT_CREDENTIAL_DEFAULT;
|
288
|
+
break;
|
289
|
+
case GIT_HTTP_AUTH_NEGOTIATE:
|
290
|
+
ctx->package_name = "Negotiate";
|
291
|
+
ctx->package_name_len = CONST_STRLEN("Negotiate");
|
292
|
+
ctx->package_name_w = L"Negotiate";
|
293
|
+
ctx->parent.credtypes = GIT_CREDENTIAL_DEFAULT;
|
294
|
+
break;
|
295
|
+
default:
|
296
|
+
git_error_set(GIT_ERROR_NET, "unknown SSPI auth type: %d", ctx->parent.type);
|
297
|
+
git__free(ctx);
|
298
|
+
return -1;
|
299
|
+
}
|
300
|
+
|
301
|
+
if (QuerySecurityPackageInfoW(ctx->package_name_w, &ctx->package_info) != SEC_E_OK) {
|
302
|
+
git_error_set(GIT_ERROR_OS, "could not query security package");
|
303
|
+
git__free(ctx);
|
304
|
+
return -1;
|
305
|
+
}
|
306
|
+
|
307
|
+
if (git_str_printf(&target, "http/%s", url->host) < 0 ||
|
308
|
+
git_utf8_to_16_alloc(&ctx->target, target.ptr) < 0) {
|
309
|
+
FreeContextBuffer(ctx->package_info);
|
310
|
+
git__free(ctx);
|
311
|
+
return -1;
|
312
|
+
}
|
313
|
+
|
314
|
+
ctx->parent.type = type;
|
315
|
+
ctx->parent.connection_affinity = 1;
|
316
|
+
ctx->parent.set_challenge = sspi_set_challenge;
|
317
|
+
ctx->parent.next_token = sspi_next_token;
|
318
|
+
ctx->parent.is_complete = sspi_is_complete;
|
319
|
+
ctx->parent.free = sspi_context_free;
|
320
|
+
|
321
|
+
*out = (git_http_auth_context *)ctx;
|
322
|
+
|
323
|
+
git_str_dispose(&target);
|
324
|
+
return 0;
|
325
|
+
}
|
326
|
+
|
327
|
+
int git_http_auth_negotiate(
|
328
|
+
git_http_auth_context **out,
|
329
|
+
const git_net_url *url)
|
330
|
+
{
|
331
|
+
return sspi_init_context(out, GIT_HTTP_AUTH_NEGOTIATE, url);
|
332
|
+
}
|
333
|
+
|
334
|
+
int git_http_auth_ntlm(
|
335
|
+
git_http_auth_context **out,
|
336
|
+
const git_net_url *url)
|
337
|
+
{
|
338
|
+
return sspi_init_context(out, GIT_HTTP_AUTH_NTLM, url);
|
339
|
+
}
|
340
|
+
|
341
|
+
#endif /* GIT_WIN32 */
|
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
#include "common.h"
|
9
9
|
|
10
|
-
#include "
|
10
|
+
#include "net.h"
|
11
11
|
#include "stream.h"
|
12
12
|
#include "streams/socket.h"
|
13
13
|
#include "git2/sys/transport.h"
|
@@ -95,22 +95,21 @@ static int git_proto_stream_read(
|
|
95
95
|
size_t buf_size,
|
96
96
|
size_t *bytes_read)
|
97
97
|
{
|
98
|
-
int error;
|
99
98
|
git_proto_stream *s = (git_proto_stream *)stream;
|
100
|
-
|
99
|
+
ssize_t ret;
|
100
|
+
int error;
|
101
101
|
|
102
102
|
*bytes_read = 0;
|
103
103
|
|
104
104
|
if (!s->sent_command && (error = send_command(s)) < 0)
|
105
105
|
return error;
|
106
106
|
|
107
|
-
|
107
|
+
ret = git_stream_read(s->io, buffer, min(buf_size, INT_MAX));
|
108
108
|
|
109
|
-
if (
|
110
|
-
return
|
111
|
-
|
112
|
-
*bytes_read = buf.offset;
|
109
|
+
if (ret < 0)
|
110
|
+
return -1;
|
113
111
|
|
112
|
+
*bytes_read = (size_t)ret;
|
114
113
|
return 0;
|
115
114
|
}
|
116
115
|
|
@@ -11,7 +11,6 @@
|
|
11
11
|
|
12
12
|
#include "http_parser.h"
|
13
13
|
#include "net.h"
|
14
|
-
#include "netops.h"
|
15
14
|
#include "remote.h"
|
16
15
|
#include "smart.h"
|
17
16
|
#include "auth.h"
|
@@ -336,9 +335,15 @@ static int lookup_proxy(
|
|
336
335
|
}
|
337
336
|
|
338
337
|
if (!proxy ||
|
339
|
-
(error =
|
338
|
+
(error = git_net_url_parse_http(&transport->proxy.url, proxy)) < 0)
|
340
339
|
goto done;
|
341
340
|
|
341
|
+
if (!git_net_url_valid(&transport->proxy.url)) {
|
342
|
+
git_error_set(GIT_ERROR_HTTP, "invalid URL: '%s'", proxy);
|
343
|
+
error = -1;
|
344
|
+
goto done;
|
345
|
+
}
|
346
|
+
|
342
347
|
*out_use = true;
|
343
348
|
|
344
349
|
done:
|