Skip to content

Commit 4460bf4

Browse files
authored
Merge pull request libgit2#5286 from libgit2/ethomson/gssapi
HTTP: Support Apache-based servers with Negotiate
2 parents 9bcf10e + e9cef7c commit 4460bf4

File tree

28 files changed

+2846
-1576
lines changed

28 files changed

+2846
-1576
lines changed

azure-pipelines.yml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ jobs:
1919
environmentVariables: |
2020
CC=gcc
2121
CMAKE_GENERATOR=Ninja
22-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on
22+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on -DUSE_GSSAPI=ON
23+
GITTEST_NEGOTIATE_PASSWORD=$(GITTEST_NEGOTIATE_PASSWORD)
2324
2425
- job: linux_amd64_xenial_gcc_mbedtls
2526
displayName: 'Linux (amd64; Xenial; GCC; mbedTLS)'
@@ -34,7 +35,8 @@ jobs:
3435
environmentVariables: |
3536
CC=gcc
3637
CMAKE_GENERATOR=Ninja
37-
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on
38+
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on -DUSE_GSSAPI=ON
39+
GITTEST_NEGOTIATE_PASSWORD=$(GITTEST_NEGOTIATE_PASSWORD)
3840
3941
- job: linux_amd64_xenial_clang_openssl
4042
displayName: 'Linux (amd64; Xenial; Clang; OpenSSL)'
@@ -49,7 +51,8 @@ jobs:
4951
environmentVariables: |
5052
CC=clang
5153
CMAKE_GENERATOR=Ninja
52-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on
54+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on -DUSE_GSSAPI=ON
55+
GITTEST_NEGOTIATE_PASSWORD=$(GITTEST_NEGOTIATE_PASSWORD)
5356
5457
- job: linux_amd64_xenial_clang_mbedtls
5558
displayName: 'Linux (amd64; Xenial; Clang; mbedTLS)'
@@ -64,7 +67,8 @@ jobs:
6467
environmentVariables: |
6568
CC=clang
6669
CMAKE_GENERATOR=Ninja
67-
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on
70+
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DVALGRIND=on -DUSE_GSSAPI=ON
71+
GITTEST_NEGOTIATE_PASSWORD=$(GITTEST_NEGOTIATE_PASSWORD)
6872
6973
- job: macos
7074
displayName: 'macOS'
@@ -81,6 +85,7 @@ jobs:
8185
CMAKE_GENERATOR: Ninja
8286
CMAKE_OPTIONS: -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=leaks -DUSE_GSSAPI=ON
8387
SKIP_SSH_TESTS: true
88+
GITTEST_NEGOTIATE_PASSWORD: $(GITTEST_NEGOTIATE_PASSWORD)
8489

8590
- job: windows_vs_amd64
8691
displayName: 'Windows (amd64; Visual Studio)'
@@ -92,6 +97,7 @@ jobs:
9297
CMAKE_GENERATOR: Visual Studio 12 2013 Win64
9398
CMAKE_OPTIONS: -DMSVC_CRTDBG=ON -DDEPRECATE_HARD=ON
9499
SKIP_SSH_TESTS: true
100+
SKIP_NEGOTIATE_TESTS: true
95101

96102
- job: windows_vs_x86
97103
displayName: 'Windows (x86; Visual Studio)'
@@ -103,6 +109,7 @@ jobs:
103109
CMAKE_GENERATOR: Visual Studio 12 2013
104110
CMAKE_OPTIONS: -DMSVC_CRTDBG=ON -DDEPRECATE_HARD=ON -DUSE_SHA1=HTTPS
105111
SKIP_SSH_TESTS: true
112+
SKIP_NEGOTIATE_TESTS: true
106113

107114
- job: windows_mingw_amd64
108115
displayName: 'Windows (amd64; MinGW)'
@@ -120,6 +127,7 @@ jobs:
120127
CMAKE_GENERATOR: MinGW Makefiles
121128
CMAKE_OPTIONS: -DDEPRECATE_HARD=ON
122129
SKIP_SSH_TESTS: true
130+
SKIP_NEGOTIATE_TESTS: true
123131

124132
- job: windows_mingw_x86
125133
displayName: 'Windows (x86; MinGW)'
@@ -138,6 +146,7 @@ jobs:
138146
CMAKE_GENERATOR: MinGW Makefiles
139147
CMAKE_OPTIONS: -DDEPRECATE_HARD=ON
140148
SKIP_SSH_TESTS: true
149+
SKIP_NEGOTIATE_TESTS: true
141150

142151
- job: documentation
143152
displayName: 'Generate Documentation'

azure-pipelines/docker/xenial

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
ARG BASE
22
FROM $BASE AS apt
33
RUN apt-get update && \
4-
apt-get install -y --no-install-recommends \
4+
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
55
bzip2 \
66
clang \
77
cmake \
88
curl \
99
gcc \
1010
git \
1111
gosu \
12+
krb5-user \
1213
libcurl4-gnutls-dev \
1314
libgcrypt20-dev \
15+
libkrb5-dev \
1416
libpcre3-dev \
1517
libssl-dev \
1618
libz-dev \

azure-pipelines/test.sh

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ if [ -n "$SKIP_TESTS" ]; then
66
exit 0
77
fi
88

9+
# Windows doesn't run the NTLM tests properly (yet)
10+
if [[ "$(uname -s)" == MINGW* ]]; then
11+
SKIP_NTLM_TESTS=1
12+
fi
13+
914
SOURCE_DIR=${SOURCE_DIR:-$( cd "$( dirname "${BASH_SOURCE[0]}" )" && dirname $( pwd ) )}
1015
BUILD_DIR=$(pwd)
1116
TMPDIR=${TMPDIR:-/tmp}
@@ -89,6 +94,16 @@ if [ -z "$SKIP_PROXY_TESTS" ]; then
8994
java -jar poxyproxy.jar --address 127.0.0.1 --port 8090 --credentials foo:bar --auth-type ntlm --quiet &
9095
fi
9196

97+
if [ -z "$SKIP_NTLM_TESTS" ]; then
98+
curl -L https://github.com/ethomson/poxygit/releases/download/v0.4.0/poxygit-0.4.0.jar >poxygit.jar
99+
100+
echo ""
101+
echo "Starting HTTP server..."
102+
NTLM_DIR=`mktemp -d ${TMPDIR}/ntlm.XXXXXXXX`
103+
git init --bare "${NTLM_DIR}/test.git"
104+
java -jar poxygit.jar --address 127.0.0.1 --port 9000 --credentials foo:baz --quiet "${NTLM_DIR}" &
105+
fi
106+
92107
if [ -z "$SKIP_SSH_TESTS" ]; then
93108
echo "Starting ssh daemon..."
94109
HOME=`mktemp -d ${TMPDIR}/home.XXXXXXXX`
@@ -207,6 +222,65 @@ if [ -z "$SKIP_PROXY_TESTS" ]; then
207222
unset GITTEST_REMOTE_PROXY_PASS
208223
fi
209224

225+
if [ -z "$SKIP_NTLM_TESTS" ]; then
226+
echo ""
227+
echo "Running NTLM tests (IIS emulation)"
228+
echo ""
229+
230+
export GITTEST_REMOTE_URL="http://localhost:9000/ntlm/test.git"
231+
export GITTEST_REMOTE_USER="foo"
232+
export GITTEST_REMOTE_PASS="baz"
233+
run_test auth_clone_and_push
234+
unset GITTEST_REMOTE_URL
235+
unset GITTEST_REMOTE_USER
236+
unset GITTEST_REMOTE_PASS
237+
238+
echo ""
239+
echo "Running NTLM tests (Apache emulation)"
240+
echo ""
241+
242+
export GITTEST_REMOTE_URL="http://localhost:9000/broken-ntlm/test.git"
243+
export GITTEST_REMOTE_USER="foo"
244+
export GITTEST_REMOTE_PASS="baz"
245+
run_test auth_clone_and_push
246+
unset GITTEST_REMOTE_URL
247+
unset GITTEST_REMOTE_USER
248+
unset GITTEST_REMOTE_PASS
249+
fi
250+
251+
if [ -z "$SKIP_NEGOTIATE_TESTS" -a -n "$GITTEST_NEGOTIATE_PASSWORD" ]; then
252+
echo ""
253+
echo "Running SPNEGO tests"
254+
echo ""
255+
256+
if [ "$(uname -s)" = "Darwin" ]; then
257+
KINIT_FLAGS="--password-file=STDIN"
258+
fi
259+
260+
echo $GITTEST_NEGOTIATE_PASSWORD | kinit $KINIT_FLAGS test@LIBGIT2.ORG
261+
klist -5f
262+
263+
export GITTEST_REMOTE_URL="https://test.libgit2.org/kerberos/empty.git"
264+
export GITTEST_REMOTE_DEFAULT="true"
265+
run_test auth_clone
266+
unset GITTEST_REMOTE_URL
267+
unset GITTEST_REMOTE_DEFAULT
268+
269+
echo ""
270+
echo "Running SPNEGO tests (expect/continue)"
271+
echo ""
272+
273+
export GITTEST_REMOTE_URL="https://test.libgit2.org/kerberos/empty.git"
274+
export GITTEST_REMOTE_DEFAULT="true"
275+
export GITTEST_REMOTE_EXPECTCONTINUE="true"
276+
run_test auth_clone
277+
unset GITTEST_REMOTE_URL
278+
unset GITTEST_REMOTE_DEFAULT
279+
unset GITTEST_REMOTE_EXPECTCONTINUE
280+
281+
kdestroy -A
282+
fi
283+
210284
if [ -z "$SKIP_SSH_TESTS" ]; then
211285
echo ""
212286
echo "Running ssh tests"

cmake/Modules/SelectGSSAPI.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,5 @@ IF(GSS_BACKEND)
4949
ENDIF()
5050
ELSE()
5151
SET(GIT_GSSAPI 0)
52-
ADD_FEATURE_INFO(SPNEGO NO "")
52+
ADD_FEATURE_INFO(SPNEGO NO "SPNEGO authentication support")
5353
ENDIF()

include/git2/common.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,8 @@ typedef enum {
203203
GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY,
204204
GIT_OPT_GET_PACK_MAX_OBJECTS,
205205
GIT_OPT_SET_PACK_MAX_OBJECTS,
206-
GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS
206+
GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS,
207+
GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE
207208
} git_libgit2_opt_t;
208209

209210
/**
@@ -397,6 +398,11 @@ typedef enum {
397398
* > This will cause .keep file existence checks to be skipped when
398399
* > accessing packfiles, which can help performance with remote filesystems.
399400
*
401+
* opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)
402+
* > When connecting to a server using NTLM or Negotiate
403+
* > authentication, use expect/continue when POSTing data.
404+
* > This option is not available on Windows.
405+
*
400406
* @param option Option key
401407
* @param ... value to set the option
402408
* @return 0 on success, <0 on failure

include/git2/errors.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ typedef enum {
106106
GIT_ERROR_FILESYSTEM,
107107
GIT_ERROR_PATCH,
108108
GIT_ERROR_WORKTREE,
109-
GIT_ERROR_SHA1
109+
GIT_ERROR_SHA1,
110+
GIT_ERROR_HTTP
110111
} git_error_t;
111112

112113
/**

src/buffer.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,11 @@ void git_buf_copy_cstr(char *data, size_t datasize, const git_buf *buf)
567567
data[copylen] = '\0';
568568
}
569569

570+
void git_buf_consume_bytes(git_buf *buf, size_t len)
571+
{
572+
git_buf_consume(buf, buf->ptr + len);
573+
}
574+
570575
void git_buf_consume(git_buf *buf, const char *end)
571576
{
572577
if (end > buf->ptr && end <= buf->ptr + buf->size) {

src/buffer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ int git_buf_puts(git_buf *buf, const char *string);
113113
int git_buf_printf(git_buf *buf, const char *format, ...) GIT_FORMAT_PRINTF(2, 3);
114114
int git_buf_vprintf(git_buf *buf, const char *format, va_list ap);
115115
void git_buf_clear(git_buf *buf);
116+
void git_buf_consume_bytes(git_buf *buf, size_t len);
116117
void git_buf_consume(git_buf *buf, const char *end);
117118
void git_buf_truncate(git_buf *buf, size_t len);
118119
void git_buf_shorten(git_buf *buf, size_t amount);

0 commit comments

Comments
 (0)