Skip to content

Commit 9f84003

Browse files
authored
Merge pull request libgit2#6009 from libgit2/ethomson/custom_cert_locations
opts: test GIT_OPT_SET_SSL_CERT_LOCATIONS
2 parents 2998a84 + cdb9f39 commit 9f84003

File tree

10 files changed

+190
-19
lines changed

10 files changed

+190
-19
lines changed

ci/test.sh

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ TMPDIR=${TMPDIR:-/tmp}
1717
USER=${USER:-$(whoami)}
1818

1919
SUCCESS=1
20+
CONTINUE_ON_FAILURE=0
2021

2122
cleanup() {
2223
echo "Cleaning up..."
@@ -64,6 +65,10 @@ run_test() {
6465
done
6566

6667
if [ "$FAILED" -ne 0 ]; then
68+
if [ "$CONTINUE_ON_FAILURE" -ne 1 ]; then
69+
exit 1
70+
fi
71+
6772
SUCCESS=0
6873
fi
6974
}
@@ -174,9 +179,9 @@ if [ -n "$RUN_INVASIVE_TESTS" ]; then
174179
fi
175180

176181
if [ -z "$SKIP_ONLINE_TESTS" ]; then
177-
# Run the various online tests. The "online" test suite only includes the
178-
# default online tests that do not require additional configuration. The
179-
# "proxy" and "ssh" test suites require further setup.
182+
# Run the online tests. The "online" test suite only includes the
183+
# default online tests that do not require additional configuration.
184+
# The "proxy" and "ssh" test suites require further setup.
180185

181186
echo ""
182187
echo "##############################################################################"
@@ -186,6 +191,14 @@ if [ -z "$SKIP_ONLINE_TESTS" ]; then
186191
export GITTEST_FLAKY_RETRY=5
187192
run_test online
188193
unset GITTEST_FLAKY_RETRY
194+
195+
# Run the online tests that immutably change global state separately
196+
# to avoid polluting the test environment.
197+
echo ""
198+
echo "##############################################################################"
199+
echo "## Running (online_customcert) tests"
200+
echo "##############################################################################"
201+
run_test online_customcert
189202
fi
190203

191204
if [ -z "$SKIP_GITDAEMON_TESTS" ]; then

src/libgit2.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,7 @@ int git_libgit2_opts(int key, ...)
261261
{
262262
const char *file = va_arg(ap, const char *);
263263
const char *path = va_arg(ap, const char *);
264-
if (file)
265-
error = git_mbedtls__set_cert_location(file, 0);
266-
if (error && path)
267-
error = git_mbedtls__set_cert_location(path, 1);
264+
error = git_mbedtls__set_cert_location(file, path);
268265
}
269266
#else
270267
git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support certificate locations");

src/streams/mbedtls.c

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ static void shutdown_ssl(void)
6868
}
6969
}
7070

71-
int git_mbedtls__set_cert_location(const char *path, int is_dir);
72-
7371
int git_mbedtls_stream_global_init(void)
7472
{
7573
int loaded = 0;
@@ -148,9 +146,9 @@ int git_mbedtls_stream_global_init(void)
148146

149147
/* load default certificates */
150148
if (crtpath != NULL && stat(crtpath, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
151-
loaded = (git_mbedtls__set_cert_location(crtpath, 0) == 0);
149+
loaded = (git_mbedtls__set_cert_location(crtpath, NULL) == 0);
152150
if (!loaded && crtpath != NULL && stat(crtpath, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
153-
loaded = (git_mbedtls__set_cert_location(crtpath, 1) == 0);
151+
loaded = (git_mbedtls__set_cert_location(NULL, crtpath) == 0);
154152

155153
return git_runtime_shutdown_register(shutdown_ssl);
156154

@@ -438,23 +436,22 @@ int git_mbedtls_stream_new(
438436
return error;
439437
}
440438

441-
int git_mbedtls__set_cert_location(const char *path, int is_dir)
439+
int git_mbedtls__set_cert_location(const char *file, const char *path)
442440
{
443441
int ret = 0;
444442
char errbuf[512];
445443
mbedtls_x509_crt *cacert;
446444

447-
GIT_ASSERT_ARG(path);
445+
GIT_ASSERT_ARG(file || path);
448446

449447
cacert = git__malloc(sizeof(mbedtls_x509_crt));
450448
GIT_ERROR_CHECK_ALLOC(cacert);
451449

452450
mbedtls_x509_crt_init(cacert);
453-
if (is_dir) {
451+
if (file)
452+
ret = mbedtls_x509_crt_parse_file(cacert, file);
453+
if (ret >= 0 && path)
454454
ret = mbedtls_x509_crt_parse_path(cacert, path);
455-
} else {
456-
ret = mbedtls_x509_crt_parse_file(cacert, path);
457-
}
458455
/* mbedtls_x509_crt_parse_path returns the number of invalid certs on success */
459456
if (ret < 0) {
460457
mbedtls_x509_crt_free(cacert);

src/streams/mbedtls.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
extern int git_mbedtls_stream_global_init(void);
1515

1616
#ifdef GIT_MBEDTLS
17-
extern int git_mbedtls__set_cert_location(const char *path, int is_dir);
17+
extern int git_mbedtls__set_cert_location(const char *file, const char *path);
1818

1919
extern int git_mbedtls_stream_new(git_stream **out, const char *host, const char *port);
2020
extern int git_mbedtls_stream_wrap(git_stream **out, git_stream *in, const char *host);

tests/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ ENDFUNCTION(ADD_CLAR_TEST)
6464

6565
ADD_CLAR_TEST(offline -v -xonline)
6666
ADD_CLAR_TEST(invasive -v -score::ftruncate -sfilter::stream::bigfile -sodb::largefiles -siterator::workdir::filesystem_gunk -srepo::init -srepo::init::at_filesystem_root)
67-
ADD_CLAR_TEST(online -v -sonline)
67+
ADD_CLAR_TEST(online -v -sonline -xonline::customcert)
68+
ADD_CLAR_TEST(online_customcert -v -sonline::customcert)
6869
ADD_CLAR_TEST(gitdaemon -v -sonline::push)
6970
ADD_CLAR_TEST(ssh -v -sonline::push -sonline::clone::ssh_cert -sonline::clone::ssh_with_paths -sonline::clone::path_whitespace_ssh)
7071
ADD_CLAR_TEST(proxy -v -sonline::clone::proxy)

tests/online/clone.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ void test_online_clone__cleanup(void)
114114
git__free(_orig_http_proxy);
115115
git__free(_orig_https_proxy);
116116
}
117+
118+
git_libgit2_opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, NULL, NULL);
117119
}
118120

119121
void test_online_clone__network_full(void)

tests/online/customcert.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#include "clar_libgit2.h"
2+
3+
#include "path.h"
4+
#include "git2/clone.h"
5+
#include "git2/cred_helpers.h"
6+
#include "remote.h"
7+
#include "futils.h"
8+
#include "refs.h"
9+
10+
/*
11+
* Certificate one is in the `certs` folder; certificate two is in the
12+
* `self-signed.pem` file.
13+
*/
14+
#define CUSTOM_CERT_ONE_URL "https://test.libgit2.org:1443/anonymous/test.git"
15+
#define CUSTOM_CERT_ONE_PATH "certs"
16+
17+
#define CUSTOM_CERT_TWO_URL "https://test.libgit2.org:2443/anonymous/test.git"
18+
#define CUSTOM_CERT_TWO_FILE "self-signed.pem"
19+
20+
#if (GIT_OPENSSL || GIT_MBEDTLS)
21+
static git_repository *g_repo;
22+
static int initialized = false;
23+
#endif
24+
25+
void test_online_customcert__initialize(void)
26+
{
27+
#if (GIT_OPENSSL || GIT_MBEDTLS)
28+
g_repo = NULL;
29+
30+
if (!initialized) {
31+
git_buf path = GIT_BUF_INIT, file = GIT_BUF_INIT;
32+
char cwd[GIT_PATH_MAX];
33+
34+
cl_fixture_sandbox(CUSTOM_CERT_ONE_PATH);
35+
cl_fixture_sandbox(CUSTOM_CERT_TWO_FILE);
36+
37+
cl_must_pass(p_getcwd(cwd, GIT_PATH_MAX));
38+
cl_git_pass(git_buf_joinpath(&path, cwd, CUSTOM_CERT_ONE_PATH));
39+
cl_git_pass(git_buf_joinpath(&file, cwd, CUSTOM_CERT_TWO_FILE));
40+
41+
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SSL_CERT_LOCATIONS,
42+
file.ptr, path.ptr));
43+
initialized = true;
44+
45+
git_buf_dispose(&file);
46+
git_buf_dispose(&path);
47+
}
48+
#endif
49+
}
50+
51+
void test_online_customcert__cleanup(void)
52+
{
53+
#if (GIT_OPENSSL || GIT_MBEDTLS)
54+
if (g_repo) {
55+
git_repository_free(g_repo);
56+
g_repo = NULL;
57+
}
58+
59+
cl_fixture_cleanup("./cloned");
60+
cl_fixture_cleanup(CUSTOM_CERT_ONE_PATH);
61+
cl_fixture_cleanup(CUSTOM_CERT_TWO_FILE);
62+
#endif
63+
}
64+
65+
void test_online_customcert__file(void)
66+
{
67+
#if (GIT_OPENSSL || GIT_MBEDTLS)
68+
cl_git_pass(git_clone(&g_repo, CUSTOM_CERT_ONE_URL, "./cloned", NULL));
69+
cl_assert(git_path_exists("./cloned/master.txt"));
70+
#endif
71+
}
72+
73+
void test_online_customcert__path(void)
74+
{
75+
#if (GIT_OPENSSL || GIT_MBEDTLS)
76+
cl_git_pass(git_clone(&g_repo, CUSTOM_CERT_TWO_URL, "./cloned", NULL));
77+
cl_assert(git_path_exists("./cloned/master.txt"));
78+
#endif
79+
}

tests/resources/certs/61f2ddb6.0

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFWzCCA0MCFESY816VkhBPUOsdp7djKW5q4ZVzMA0GCSqGSIb3DQEBCwUAMGox
3+
CzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNzYWNodXNldHRzMRIwEAYDVQQHDAlD
4+
YW1icmlkZ2UxFDASBgNVBAoMC2xpYmdpdDIub3JnMRkwFwYDVQQDDBB0ZXN0Lmxp
5+
YmdpdDIub3JnMB4XDTIxMDgyNTE4NTExMVoXDTMxMDgyMzE4NTExMVowajELMAkG
6+
A1UEBhMCVVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxEjAQBgNVBAcMCUNhbWJy
7+
aWRnZTEUMBIGA1UECgwLbGliZ2l0Mi5vcmcxGTAXBgNVBAMMEHRlc3QubGliZ2l0
8+
Mi5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvaRUaM3IJh9N
9+
G6Yc7tHioUsIGU0MkzSvy/X6O/vONnuuioiJQyPIvfRSvZR2iQj8THTypDGhWn3r
10+
6h2wk5eOUGwJH2N9FrrlEBdpsMc7SKdiJXwTI30mkK3/qru8NzE71dgCkYp1xhKw
11+
edTkAFK+PkvyVLFL7K35cx8Bxfamyssdb+qGWa7g4P27CWUdvQgmurrzzPIMZiLD
12+
/cI1Kwer/N7nTY/6CSs9dcHTlanyZdf+mQ50+//vI4F6+OduGHJkxRF48jLUz1rz
13+
P3WGRMRbHjCmvWpX/9DLgqGk7XTy0hNgNUCit6kawwcv5y7SP/ii86MkynAHn5i8
14+
d+zhXjdrSSy8i0IbRJafnxmtrsmjGeIzraJSRqMlv7KKWEBz+alm6vlePnRUbWB7
15+
0po5uSsRPya6kJJCzMjIfKq1dgXq33m9jCG2wU+L4fEHVlEkFGXYTspMlIBNUjTc
16+
c45+e1EpamF8aHm32PP8gTF8fGZzQjOXmNW5g7t0joWMGZ+Ao2jYc1pG3SOARi36
17+
azrmB5/XJqbbfVZEzIue01fO/5R8RgabOP1qWUjH2KLb8zTDok+CW0ULNseU+MKf
18+
PHXG2OjxcR0vTqop2V6JlKTXXx3/TOD16/+mSrrPzNDejLrkvAH9oN38YpMBM8eg
19+
vfivHNRm0jjdGbv2OOPEBLEf1cNimQIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQBZ
20+
znFta24sWoqdgKXKAK5RHAh/HyOvTInwcXi9RU4XjYlbqNVs0ODR74VRZINoyAL2
21+
bo+x/iUuAp9+b8fjr79fpVof3nSMU7UtMcT1nvzVmaUYSkKQ0f/9vK4yg0kao1bV
22+
WwhIc0slKgOJjEicPVs3kd+duv5vakQeUajLPGM8SiS1F/nF67rIuZLdJn2Qp+im
23+
w5Q3Pjgqw5VrJxyk3AaUcntKHpWy1POLyNV79tXra6BxbtQVlRS0+h1MHELARDFx
24+
1ZtgyAe5YbWM7WrIiFKD4mmKZu4GMnJDXVpfUub5g0U/e7L/gg6Z1UyYZuln6axw
25+
RojuAHo1uAWFUsjhWLYV/7P/l/dC+7gFjvSsUqb1+U7jXObzfKjXo/FwYcy4VsVv
26+
xNbglbhdVjAo/YBTJuf3L0UZjSbxvQIYS+v8u1ECeWE6SH6cHRzryeo5wO4h8NJR
27+
n30xsvocHFbs4LWy5BVfMUo6wGUy0Y+1gSwSqVMv3JPuLwxUsv0HPdeC00Ab9cHq
28+
kYXPNZXg3a6orTDa4hJLdAm2V/fn/2KKJYlNj7iCL664QgoCHl7LFyLMiwFVCu5h
29+
4JjGL3Q+8MondaLZlq5YDmvtj979AyM/7qL4XAE2oofQ4J5dqnKKpMkWdAM/fI/9
30+
N5DK/4zMXJWgIED0yo2SSZHQmuqZplacOhmfjjZigQ==
31+
-----END CERTIFICATE-----

tests/resources/certs/db4f60b0.0

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFWzCCA0MCFESY816VkhBPUOsdp7djKW5q4ZVzMA0GCSqGSIb3DQEBCwUAMGox
3+
CzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNzYWNodXNldHRzMRIwEAYDVQQHDAlD
4+
YW1icmlkZ2UxFDASBgNVBAoMC2xpYmdpdDIub3JnMRkwFwYDVQQDDBB0ZXN0Lmxp
5+
YmdpdDIub3JnMB4XDTIxMDgyNTE4NTExMVoXDTMxMDgyMzE4NTExMVowajELMAkG
6+
A1UEBhMCVVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxEjAQBgNVBAcMCUNhbWJy
7+
aWRnZTEUMBIGA1UECgwLbGliZ2l0Mi5vcmcxGTAXBgNVBAMMEHRlc3QubGliZ2l0
8+
Mi5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvaRUaM3IJh9N
9+
G6Yc7tHioUsIGU0MkzSvy/X6O/vONnuuioiJQyPIvfRSvZR2iQj8THTypDGhWn3r
10+
6h2wk5eOUGwJH2N9FrrlEBdpsMc7SKdiJXwTI30mkK3/qru8NzE71dgCkYp1xhKw
11+
edTkAFK+PkvyVLFL7K35cx8Bxfamyssdb+qGWa7g4P27CWUdvQgmurrzzPIMZiLD
12+
/cI1Kwer/N7nTY/6CSs9dcHTlanyZdf+mQ50+//vI4F6+OduGHJkxRF48jLUz1rz
13+
P3WGRMRbHjCmvWpX/9DLgqGk7XTy0hNgNUCit6kawwcv5y7SP/ii86MkynAHn5i8
14+
d+zhXjdrSSy8i0IbRJafnxmtrsmjGeIzraJSRqMlv7KKWEBz+alm6vlePnRUbWB7
15+
0po5uSsRPya6kJJCzMjIfKq1dgXq33m9jCG2wU+L4fEHVlEkFGXYTspMlIBNUjTc
16+
c45+e1EpamF8aHm32PP8gTF8fGZzQjOXmNW5g7t0joWMGZ+Ao2jYc1pG3SOARi36
17+
azrmB5/XJqbbfVZEzIue01fO/5R8RgabOP1qWUjH2KLb8zTDok+CW0ULNseU+MKf
18+
PHXG2OjxcR0vTqop2V6JlKTXXx3/TOD16/+mSrrPzNDejLrkvAH9oN38YpMBM8eg
19+
vfivHNRm0jjdGbv2OOPEBLEf1cNimQIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQBZ
20+
znFta24sWoqdgKXKAK5RHAh/HyOvTInwcXi9RU4XjYlbqNVs0ODR74VRZINoyAL2
21+
bo+x/iUuAp9+b8fjr79fpVof3nSMU7UtMcT1nvzVmaUYSkKQ0f/9vK4yg0kao1bV
22+
WwhIc0slKgOJjEicPVs3kd+duv5vakQeUajLPGM8SiS1F/nF67rIuZLdJn2Qp+im
23+
w5Q3Pjgqw5VrJxyk3AaUcntKHpWy1POLyNV79tXra6BxbtQVlRS0+h1MHELARDFx
24+
1ZtgyAe5YbWM7WrIiFKD4mmKZu4GMnJDXVpfUub5g0U/e7L/gg6Z1UyYZuln6axw
25+
RojuAHo1uAWFUsjhWLYV/7P/l/dC+7gFjvSsUqb1+U7jXObzfKjXo/FwYcy4VsVv
26+
xNbglbhdVjAo/YBTJuf3L0UZjSbxvQIYS+v8u1ECeWE6SH6cHRzryeo5wO4h8NJR
27+
n30xsvocHFbs4LWy5BVfMUo6wGUy0Y+1gSwSqVMv3JPuLwxUsv0HPdeC00Ab9cHq
28+
kYXPNZXg3a6orTDa4hJLdAm2V/fn/2KKJYlNj7iCL664QgoCHl7LFyLMiwFVCu5h
29+
4JjGL3Q+8MondaLZlq5YDmvtj979AyM/7qL4XAE2oofQ4J5dqnKKpMkWdAM/fI/9
30+
N5DK/4zMXJWgIED0yo2SSZHQmuqZplacOhmfjjZigQ==
31+
-----END CERTIFICATE-----

tests/resources/self-signed.pem

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDUzCCAjsCFAb11im6DYQyGJ0GNQCIehXtegq6MA0GCSqGSIb3DQEBCwUAMGYx
3+
CzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNzYWNodXNldHRzMRIwEAYDVQQHDAlD
4+
YW1icmlkZ2UxEDAOBgNVBAoMB2xpYmdpdDIxGTAXBgNVBAMMEHRlc3QubGliZ2l0
5+
Mi5vcmcwHhcNMjEwODMwMDAyMTQyWhcNMzEwODI4MDAyMTQyWjBmMQswCQYDVQQG
6+
EwJVUzEWMBQGA1UECAwNTWFzc2FjaHVzZXR0czESMBAGA1UEBwwJQ2FtYnJpZGdl
7+
MRAwDgYDVQQKDAdsaWJnaXQyMRkwFwYDVQQDDBB0ZXN0LmxpYmdpdDIub3JnMIIB
8+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtqe6b1vnMni+z8Z+a2bGtykI
9+
ITvBged15rn+0qG6Fz+sn9bYG+ceFupztFfoN3cVpUgQDBTzr3CaAx036BlV0z8i
10+
CrG0Oh/XGL+9TITQLumEe4iGi8NoMSujBAyXPSNgmpzDmCTGrNFfmq3HzUtO8t3x
11+
i8OT7d9qCVjFimLvZbgnfHGQ38xvt1XyPgYIVqDQczmMEZ5BdYWB0A1VmnWuP2dH
12+
BgjwPEC3HwMmm1+PL0VoPTdvE5Su092Qdt8QsiA56466DQyll1d/omnOJfrK7z0N
13+
OnfDmnDpARSTy6vDofEAYUQoc3dyvBUk8IIzv2UDcR7fTVvYqseQReIOTEnXmQID
14+
AQABMA0GCSqGSIb3DQEBCwUAA4IBAQBmUEq+JhwWTbB5ODGOKrMG1fKJ+sf6ZH6M
15+
c4BgLEcdoi/nOTfPuw+ols72LuhH7NKaEcqxWev0jGF0WKqMcM8AGVbywZJ3mBWo
16+
sKdh6rAGFNkikW4TzhjtDfFbMR45Didl28Be7ieHQL4CQ0Lse3RMOxp250WpiEYV
17+
W2hIKMwIqOLKGShVD7lI+eHlv+QSH4yOYKHfRHve8s82Tac5OXinc8CJm9ySOtkO
18+
MfLgfkHtHdFBnV6OVbf4p/596MfMXdwT/bBxT6WPkDGc1AYhoDlmLFTpRgHIDCSK
19+
2wgV+qHppl7Kn+p3mFQ9sW/1IaRd+jNZOrgZ8Uu5tJ00OaqR/LVG
20+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)