rugged 1.6.5 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_allocator.c +0 -54
  3. data/lib/rugged/version.rb +1 -1
  4. data/vendor/libgit2/CMakeLists.txt +3 -8
  5. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  6. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +3 -3
  7. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +21 -2
  8. data/vendor/libgit2/cmake/SelectHashes.cmake +4 -0
  9. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  10. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  11. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  12. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  13. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  14. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  15. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
  16. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
  17. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
  18. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
  19. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
  20. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
  21. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +24 -22
  22. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
  23. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
  24. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
  25. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
  26. data/vendor/libgit2/include/git2/common.h +26 -1
  27. data/vendor/libgit2/include/git2/diff.h +41 -3
  28. data/vendor/libgit2/include/git2/errors.h +4 -2
  29. data/vendor/libgit2/include/git2/index.h +9 -0
  30. data/vendor/libgit2/include/git2/oid.h +1 -1
  31. data/vendor/libgit2/include/git2/remote.h +18 -0
  32. data/vendor/libgit2/include/git2/repository.h +12 -2
  33. data/vendor/libgit2/include/git2/sys/alloc.h +0 -34
  34. data/vendor/libgit2/include/git2/sys/commit_graph.h +12 -2
  35. data/vendor/libgit2/include/git2/sys/midx.h +5 -1
  36. data/vendor/libgit2/include/git2/sys/stream.h +16 -2
  37. data/vendor/libgit2/include/git2/sys/transport.h +20 -2
  38. data/vendor/libgit2/include/git2/version.h +4 -4
  39. data/vendor/libgit2/include/git2/worktree.h +3 -1
  40. data/vendor/libgit2/src/CMakeLists.txt +34 -11
  41. data/vendor/libgit2/src/cli/cmd_clone.c +22 -6
  42. data/vendor/libgit2/src/cli/progress.c +9 -8
  43. data/vendor/libgit2/src/cli/progress.h +4 -4
  44. data/vendor/libgit2/src/libgit2/CMakeLists.txt +1 -19
  45. data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
  46. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  47. data/vendor/libgit2/src/libgit2/apply.c +4 -3
  48. data/vendor/libgit2/src/libgit2/blame.c +23 -16
  49. data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
  50. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  51. data/vendor/libgit2/src/libgit2/cherrypick.c +3 -3
  52. data/vendor/libgit2/src/libgit2/clone.c +3 -1
  53. data/vendor/libgit2/src/libgit2/commit.c +31 -9
  54. data/vendor/libgit2/src/libgit2/commit_graph.c +110 -43
  55. data/vendor/libgit2/src/libgit2/commit_graph.h +20 -4
  56. data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
  57. data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
  58. data/vendor/libgit2/src/libgit2/config_file.c +14 -8
  59. data/vendor/libgit2/src/libgit2/describe.c +10 -7
  60. data/vendor/libgit2/src/libgit2/diff.c +16 -7
  61. data/vendor/libgit2/src/libgit2/diff.h +6 -6
  62. data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
  63. data/vendor/libgit2/src/libgit2/diff_generate.c +36 -15
  64. data/vendor/libgit2/src/libgit2/diff_parse.c +20 -4
  65. data/vendor/libgit2/src/libgit2/diff_print.c +26 -7
  66. data/vendor/libgit2/src/libgit2/diff_tform.c +4 -4
  67. data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
  68. data/vendor/libgit2/src/libgit2/email.c +4 -3
  69. data/vendor/libgit2/src/libgit2/errors.c +73 -18
  70. data/vendor/libgit2/src/libgit2/fetch.c +37 -9
  71. data/vendor/libgit2/src/libgit2/fetch.h +0 -2
  72. data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
  73. data/vendor/libgit2/src/libgit2/grafts.c +272 -0
  74. data/vendor/libgit2/src/libgit2/grafts.h +36 -0
  75. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  76. data/vendor/libgit2/src/libgit2/index.c +325 -125
  77. data/vendor/libgit2/src/libgit2/index.h +14 -1
  78. data/vendor/libgit2/src/libgit2/indexer.c +10 -3
  79. data/vendor/libgit2/src/libgit2/iterator.c +20 -5
  80. data/vendor/libgit2/src/libgit2/iterator.h +3 -0
  81. data/vendor/libgit2/src/libgit2/libgit2.c +39 -0
  82. data/vendor/libgit2/src/libgit2/merge.c +14 -9
  83. data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
  84. data/vendor/libgit2/src/libgit2/midx.c +66 -37
  85. data/vendor/libgit2/src/libgit2/midx.h +13 -3
  86. data/vendor/libgit2/src/libgit2/notes.c +9 -8
  87. data/vendor/libgit2/src/libgit2/object.c +40 -15
  88. data/vendor/libgit2/src/libgit2/object.h +6 -0
  89. data/vendor/libgit2/src/libgit2/odb.c +11 -5
  90. data/vendor/libgit2/src/libgit2/odb_pack.c +16 -3
  91. data/vendor/libgit2/src/libgit2/oid.c +7 -1
  92. data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
  93. data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
  94. data/vendor/libgit2/src/libgit2/pack-objects.c +19 -12
  95. data/vendor/libgit2/src/libgit2/pack-objects.h +5 -2
  96. data/vendor/libgit2/src/libgit2/pack.c +3 -3
  97. data/vendor/libgit2/src/libgit2/parse.c +7 -4
  98. data/vendor/libgit2/src/libgit2/parse.h +1 -1
  99. data/vendor/libgit2/src/libgit2/patch.h +7 -1
  100. data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
  101. data/vendor/libgit2/src/libgit2/patch_parse.c +16 -8
  102. data/vendor/libgit2/src/libgit2/push.c +2 -2
  103. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  104. data/vendor/libgit2/src/libgit2/rebase.c +72 -84
  105. data/vendor/libgit2/src/libgit2/refdb_fs.c +22 -13
  106. data/vendor/libgit2/src/libgit2/refs.c +8 -1
  107. data/vendor/libgit2/src/libgit2/remote.c +15 -6
  108. data/vendor/libgit2/src/libgit2/remote.h +1 -0
  109. data/vendor/libgit2/src/libgit2/repository.c +580 -301
  110. data/vendor/libgit2/src/libgit2/repository.h +17 -2
  111. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  112. data/vendor/libgit2/src/libgit2/revert.c +8 -11
  113. data/vendor/libgit2/src/libgit2/revparse.c +1 -4
  114. data/vendor/libgit2/src/libgit2/revwalk.c +26 -4
  115. data/vendor/libgit2/src/libgit2/stash.c +9 -8
  116. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +0 -1
  117. data/vendor/libgit2/src/libgit2/streams/openssl.c +8 -16
  118. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  119. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  120. data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
  121. data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
  122. data/vendor/libgit2/src/libgit2/streams/stransport.c +40 -12
  123. data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
  124. data/vendor/libgit2/src/libgit2/submodule.h +3 -3
  125. data/vendor/libgit2/src/libgit2/threadstate.c +15 -2
  126. data/vendor/libgit2/src/libgit2/threadstate.h +1 -3
  127. data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
  128. data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
  129. data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
  130. data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
  131. data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
  132. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  133. data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
  134. data/vendor/libgit2/src/libgit2/transports/http.c +7 -2
  135. data/vendor/libgit2/src/libgit2/transports/httpclient.c +5 -0
  136. data/vendor/libgit2/src/libgit2/transports/local.c +13 -4
  137. data/vendor/libgit2/src/libgit2/transports/smart.c +33 -27
  138. data/vendor/libgit2/src/libgit2/transports/smart.h +23 -8
  139. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +136 -17
  140. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +154 -47
  141. data/vendor/libgit2/src/libgit2/transports/ssh.c +3 -3
  142. data/vendor/libgit2/src/libgit2/transports/winhttp.c +14 -15
  143. data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
  144. data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
  145. data/vendor/libgit2/src/libgit2/tree.c +1 -1
  146. data/vendor/libgit2/src/libgit2/worktree.c +25 -10
  147. data/vendor/libgit2/src/util/alloc.c +65 -6
  148. data/vendor/libgit2/src/util/alloc.h +34 -9
  149. data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
  150. data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
  151. data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -105
  152. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
  153. data/vendor/libgit2/src/util/array.h +6 -1
  154. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  155. data/vendor/libgit2/src/util/filebuf.c +6 -1
  156. data/vendor/libgit2/src/util/filebuf.h +19 -6
  157. data/vendor/libgit2/src/util/fs_path.c +1 -1
  158. data/vendor/libgit2/src/util/futils.c +8 -5
  159. data/vendor/libgit2/src/util/git2_features.h.in +9 -3
  160. data/vendor/libgit2/src/util/net.c +308 -157
  161. data/vendor/libgit2/src/util/net.h +25 -0
  162. data/vendor/libgit2/src/util/posix.c +54 -0
  163. data/vendor/libgit2/src/util/posix.h +22 -0
  164. data/vendor/libgit2/src/util/rand.c +6 -4
  165. data/vendor/libgit2/src/util/staticstr.h +66 -0
  166. data/vendor/libgit2/src/util/util.c +15 -10
  167. data/vendor/libgit2/src/util/util.h +24 -16
  168. data/vendor/libgit2/src/util/win32/error.c +1 -1
  169. data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
  170. data/vendor/libgit2/src/util/win32/posix_w32.c +1 -1
  171. data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
  172. data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
  173. data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
  174. metadata +29 -23
  175. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
  176. data/vendor/libgit2/src/libgit2/netops.c +0 -124
  177. data/vendor/libgit2/src/libgit2/netops.h +0 -68
  178. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
  179. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
  180. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
  181. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
  182. /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 negotiate_oid_spnego =
23
+ static gss_OID_desc gssapi_oid_spnego =
24
24
  { 6, (void *) "\x2b\x06\x01\x05\x05\x02" };
25
- static gss_OID_desc negotiate_oid_krb5 =
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 negotiate_oids[] =
29
- { &negotiate_oid_spnego, &negotiate_oid_krb5, NULL };
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
- } http_auth_negotiate_context;
39
+ } http_auth_gssapi_context;
40
40
 
41
- static void negotiate_err_set(
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 negotiate_set_challenge(
61
+ static int gssapi_set_challenge(
62
62
  git_http_auth_context *c,
63
63
  const char *challenge)
64
64
  {
65
- http_auth_negotiate_context *ctx = (http_auth_negotiate_context *)c;
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 negotiate_context_dispose(http_auth_negotiate_context *ctx)
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 negotiate_next_token(
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
- http_auth_negotiate_context *ctx = (http_auth_negotiate_context *)c;
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
- negotiate_err_set(status_major, status_minor,
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
- negotiate_context_dispose(ctx);
155
+ gssapi_context_dispose(ctx);
156
156
  }
157
157
 
158
- mech = &negotiate_oid_spnego;
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
- negotiate_err_set(status_major, status_minor, "negotiate failure");
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
- negotiate_context_dispose(ctx);
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 negotiate_is_complete(git_http_auth_context *c)
207
+ static int gssapi_is_complete(git_http_auth_context *c)
208
208
  {
209
- http_auth_negotiate_context *ctx = (http_auth_negotiate_context *)c;
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 negotiate_context_free(git_http_auth_context *c)
216
+ static void gssapi_context_free(git_http_auth_context *c)
217
217
  {
218
- http_auth_negotiate_context *ctx = (http_auth_negotiate_context *)c;
218
+ http_auth_gssapi_context *ctx = (http_auth_gssapi_context *)c;
219
219
 
220
- negotiate_context_dispose(ctx);
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 negotiate_init_context(
230
- http_auth_negotiate_context *ctx,
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
- negotiate_err_set(status_major, status_minor,
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 = negotiate_oids; *oid; 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
- http_auth_negotiate_context *ctx;
288
+ http_auth_gssapi_context *ctx;
289
289
 
290
290
  *out = NULL;
291
291
 
292
- ctx = git__calloc(1, sizeof(http_auth_negotiate_context));
292
+ ctx = git__calloc(1, sizeof(http_auth_gssapi_context));
293
293
  GIT_ERROR_CHECK_ALLOC(ctx);
294
294
 
295
- if (negotiate_init_context(ctx, url) < 0) {
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 = negotiate_set_challenge;
304
- ctx->parent.next_token = negotiate_next_token;
305
- ctx->parent.is_complete = negotiate_is_complete;
306
- ctx->parent.free = negotiate_context_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
 
@@ -12,7 +12,7 @@
12
12
  #include "git2.h"
13
13
  #include "auth.h"
14
14
 
15
- #if defined(GIT_GSSAPI) || defined(GIT_GSSFRAMEWORK)
15
+ #if defined(GIT_GSSAPI) || defined(GIT_GSSFRAMEWORK) || defined(GIT_WIN32)
16
16
 
17
17
  extern int git_http_auth_negotiate(
18
18
  git_http_auth_context **out,
@@ -13,7 +13,7 @@
13
13
  /* NTLM requires a full request/challenge/response */
14
14
  #define GIT_AUTH_STEPS_NTLM 2
15
15
 
16
- #ifdef GIT_NTLM
16
+ #if defined(GIT_NTLM) || defined(GIT_WIN32)
17
17
 
18
18
  #if defined(GIT_OPENSSL)
19
19
  # define CRYPT_OPENSSL
@@ -23,7 +23,7 @@ typedef struct {
23
23
  bool complete;
24
24
  } http_auth_ntlm_context;
25
25
 
26
- static int ntlm_set_challenge(
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 ntlm_set_credentials(http_auth_ntlm_context *ctx, git_credential *_cred)
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 ntlm_next_token(
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 && ntlm_set_credentials(ctx, cred) != 0)
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 ntlm_is_complete(git_http_auth_context *c)
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 ntlm_context_free(git_http_auth_context *c)
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 ntlm_init_context(
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 (ntlm_init_context(ctx, url) < 0) {
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 = ntlm_set_challenge;
218
- ctx->parent.next_token = ntlm_next_token;
219
- ctx->parent.is_complete = ntlm_is_complete;
220
- ctx->parent.free = ntlm_context_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, &timestamp);
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 "netops.h"
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
- gitno_buffer buf;
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
- gitno_buffer_setup_fromstream(s->io, &buf, buffer, buf_size);
107
+ ret = git_stream_read(s->io, buffer, min(buf_size, INT_MAX));
108
108
 
109
- if ((error = gitno_recv(&buf)) < 0)
110
- return error;
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 = git_net_url_parse(&transport->proxy.url, proxy)) < 0)
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: