summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2014-10-10 17:42:52 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2014-10-10 17:42:52 +0200
commit9b36537de4d3db38e4c45a177cc42736fba0e3b8 (patch)
tree6f419e0db22ca2de721293a2f7fad441f2e966be
parent0625638f061589634df70a5c6b69818706375703 (diff)
parent737b445a1866706f271e163427823471bee8fb95 (diff)
downloadlibgit2-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.h14
-rw-r--r--src/settings.c22
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);