]> git.proxmox.com Git - libgit2.git/blob - src/settings.c
odb: add option to turn off hash verification
[libgit2.git] / src / settings.c
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 #ifdef GIT_OPENSSL
9 # include <openssl/err.h>
10 #endif
11
12 #include <git2.h>
13 #include "common.h"
14 #include "sysdir.h"
15 #include "cache.h"
16 #include "global.h"
17 #include "object.h"
18 #include "odb.h"
19 #include "refs.h"
20 #include "transports/smart.h"
21
22 void git_libgit2_version(int *major, int *minor, int *rev)
23 {
24 *major = LIBGIT2_VER_MAJOR;
25 *minor = LIBGIT2_VER_MINOR;
26 *rev = LIBGIT2_VER_REVISION;
27 }
28
29 int git_libgit2_features(void)
30 {
31 return 0
32 #ifdef GIT_THREADS
33 | GIT_FEATURE_THREADS
34 #endif
35 #if defined(GIT_OPENSSL) || defined(GIT_WINHTTP) || defined(GIT_SECURE_TRANSPORT)
36 | GIT_FEATURE_HTTPS
37 #endif
38 #if defined(GIT_SSH)
39 | GIT_FEATURE_SSH
40 #endif
41 #if defined(GIT_USE_NSEC)
42 | GIT_FEATURE_NSEC
43 #endif
44 ;
45 }
46
47 /* Declarations for tuneable settings */
48 extern size_t git_mwindow__window_size;
49 extern size_t git_mwindow__mapped_limit;
50
51 static int config_level_to_sysdir(int config_level)
52 {
53 int val = -1;
54
55 switch (config_level) {
56 case GIT_CONFIG_LEVEL_SYSTEM:
57 val = GIT_SYSDIR_SYSTEM;
58 break;
59 case GIT_CONFIG_LEVEL_XDG:
60 val = GIT_SYSDIR_XDG;
61 break;
62 case GIT_CONFIG_LEVEL_GLOBAL:
63 val = GIT_SYSDIR_GLOBAL;
64 break;
65 case GIT_CONFIG_LEVEL_PROGRAMDATA:
66 val = GIT_SYSDIR_PROGRAMDATA;
67 break;
68 default:
69 giterr_set(
70 GITERR_INVALID, "invalid config path selector %d", config_level);
71 }
72
73 return val;
74 }
75
76 extern char *git__user_agent;
77 extern char *git__ssl_ciphers;
78
79 const char *git_libgit2__user_agent(void)
80 {
81 return git__user_agent;
82 }
83
84 const char *git_libgit2__ssl_ciphers(void)
85 {
86 return git__ssl_ciphers;
87 }
88
89 int git_libgit2_opts(int key, ...)
90 {
91 int error = 0;
92 va_list ap;
93
94 va_start(ap, key);
95
96 switch (key) {
97 case GIT_OPT_SET_MWINDOW_SIZE:
98 git_mwindow__window_size = va_arg(ap, size_t);
99 break;
100
101 case GIT_OPT_GET_MWINDOW_SIZE:
102 *(va_arg(ap, size_t *)) = git_mwindow__window_size;
103 break;
104
105 case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
106 git_mwindow__mapped_limit = va_arg(ap, size_t);
107 break;
108
109 case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
110 *(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
111 break;
112
113 case GIT_OPT_GET_SEARCH_PATH:
114 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
115 git_buf *out = va_arg(ap, git_buf *);
116 const git_buf *tmp;
117
118 git_buf_sanitize(out);
119 if ((error = git_sysdir_get(&tmp, error)) < 0)
120 break;
121
122 error = git_buf_sets(out, tmp->ptr);
123 }
124 break;
125
126 case GIT_OPT_SET_SEARCH_PATH:
127 if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
128 error = git_sysdir_set(error, va_arg(ap, const char *));
129 break;
130
131 case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
132 {
133 git_otype type = (git_otype)va_arg(ap, int);
134 size_t size = va_arg(ap, size_t);
135 error = git_cache_set_max_object_size(type, size);
136 break;
137 }
138
139 case GIT_OPT_SET_CACHE_MAX_SIZE:
140 git_cache__max_storage = va_arg(ap, ssize_t);
141 break;
142
143 case GIT_OPT_ENABLE_CACHING:
144 git_cache__enabled = (va_arg(ap, int) != 0);
145 break;
146
147 case GIT_OPT_GET_CACHED_MEMORY:
148 *(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
149 *(va_arg(ap, ssize_t *)) = git_cache__max_storage;
150 break;
151
152 case GIT_OPT_GET_TEMPLATE_PATH:
153 {
154 git_buf *out = va_arg(ap, git_buf *);
155 const git_buf *tmp;
156
157 git_buf_sanitize(out);
158 if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
159 break;
160
161 error = git_buf_sets(out, tmp->ptr);
162 }
163 break;
164
165 case GIT_OPT_SET_TEMPLATE_PATH:
166 error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
167 break;
168
169 case GIT_OPT_SET_SSL_CERT_LOCATIONS:
170 #ifdef GIT_OPENSSL
171 {
172 const char *file = va_arg(ap, const char *);
173 const char *path = va_arg(ap, const char *);
174 if (!SSL_CTX_load_verify_locations(git__ssl_ctx, file, path)) {
175 giterr_set(GITERR_NET, "SSL error: %s",
176 ERR_error_string(ERR_get_error(), NULL));
177 error = -1;
178 }
179 }
180 #else
181 giterr_set(GITERR_NET, "cannot set certificate locations: OpenSSL is not enabled");
182 error = -1;
183 #endif
184 break;
185 case GIT_OPT_SET_USER_AGENT:
186 git__free(git__user_agent);
187 git__user_agent = git__strdup(va_arg(ap, const char *));
188 if (!git__user_agent) {
189 giterr_set_oom();
190 error = -1;
191 }
192
193 break;
194
195 case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
196 git_object__strict_input_validation = (va_arg(ap, int) != 0);
197 break;
198
199 case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
200 git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
201 break;
202
203 case GIT_OPT_SET_SSL_CIPHERS:
204 #ifdef GIT_OPENSSL
205 {
206 git__free(git__ssl_ciphers);
207 git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
208 if (!git__ssl_ciphers) {
209 giterr_set_oom();
210 error = -1;
211 }
212 }
213 #else
214 giterr_set(GITERR_NET, "cannot set custom ciphers: OpenSSL is not enabled");
215 error = -1;
216 #endif
217 break;
218
219 case GIT_OPT_GET_USER_AGENT:
220 {
221 git_buf *out = va_arg(ap, git_buf *);
222 git_buf_sanitize(out);
223 error = git_buf_sets(out, git__user_agent);
224 }
225 break;
226
227 case GIT_OPT_ENABLE_OFS_DELTA:
228 git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
229 break;
230
231 case GIT_OPT_ENABLE_SYNCHRONOUS_OBJECT_CREATION:
232 git_object__synchronous_writing = (va_arg(ap, int) != 0);
233 break;
234
235 case GIT_OPT_GET_WINDOWS_SHAREMODE:
236 #ifdef GIT_WIN32
237 *(va_arg(ap, unsigned long *)) = git_win32__createfile_sharemode;
238 #endif
239 break;
240
241 case GIT_OPT_SET_WINDOWS_SHAREMODE:
242 #ifdef GIT_WIN32
243 git_win32__createfile_sharemode = va_arg(ap, unsigned long);
244 #endif
245 break;
246
247 case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION:
248 git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
249 break;
250
251 default:
252 giterr_set(GITERR_INVALID, "invalid option key");
253 error = -1;
254 }
255
256 va_end(ap);
257
258 return error;
259 }
260