diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2014-10-10 17:42:52 +0200 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2014-10-10 17:42:52 +0200 |
commit | 9b36537de4d3db38e4c45a177cc42736fba0e3b8 (patch) | |
tree | 6f419e0db22ca2de721293a2f7fad441f2e966be | |
parent | 0625638f061589634df70a5c6b69818706375703 (diff) | |
parent | 737b445a1866706f271e163427823471bee8fb95 (diff) | |
download | libgit2-9b36537de4d3db38e4c45a177cc42736fba0e3b8.tar.gz |
Merge pull request #2588 from swansontec/ssl-cert-path2
Add support for setting the SSL CA location
-rw-r--r-- | include/git2/common.h | 14 | ||||
-rw-r--r-- | src/settings.c | 22 |
2 files changed, 35 insertions, 1 deletions
diff --git a/include/git2/common.h b/include/git2/common.h index ceb27205a..ddeaf77a2 100644 --- a/include/git2/common.h +++ b/include/git2/common.h @@ -138,7 +138,8 @@ typedef enum { GIT_OPT_ENABLE_CACHING, GIT_OPT_GET_CACHED_MEMORY, GIT_OPT_GET_TEMPLATE_PATH, - GIT_OPT_SET_TEMPLATE_PATH + GIT_OPT_SET_TEMPLATE_PATH, + GIT_OPT_SET_SSL_CERT_LOCATIONS, } git_libgit2_opt_t; /** @@ -223,6 +224,17 @@ typedef enum { * > * > - `path` directory of template. * + * * opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path) + * + * > Set the SSL certificate-authority locations. + * > + * > - `file` is the location of a file containing several + * > certificates concatenated together. + * > - `path` is the location of a directory holding several + * > certificates, one per file. + * > + * > Either parameter may be `NULL`, but not both. + * * @param option Option key * @param ... value to set the option * @return 0 on success, <0 on failure diff --git a/src/settings.c b/src/settings.c index 1a21ea024..971b50935 100644 --- a/src/settings.c +++ b/src/settings.c @@ -5,10 +5,15 @@ * a Linking Exception. For full terms see the included COPYING file. */ +#ifdef GIT_SSL +# include <openssl/err.h> +#endif + #include <git2.h> #include "common.h" #include "sysdir.h" #include "cache.h" +#include "global.h" void git_libgit2_version(int *major, int *minor, int *rev) { @@ -131,6 +136,23 @@ int git_libgit2_opts(int key, ...) case GIT_OPT_SET_TEMPLATE_PATH: error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *)); break; + + case GIT_OPT_SET_SSL_CERT_LOCATIONS: +#ifdef GIT_SSL + { + const char *file = va_arg(ap, const char *); + const char *path = va_arg(ap, const char *); + if (!SSL_CTX_load_verify_locations(git__ssl_ctx, file, path)) { + giterr_set(GITERR_NET, "SSL error: %s", + ERR_error_string(ERR_get_error(), NULL)); + error = -1; + } + } +#else + giterr_set(GITERR_NET, "Cannot set certificate locations: OpenSSL is not enabled"); + error = -1; +#endif + break; } va_end(ap); |