1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <apr_file_info.h>
24 #include <apr_file_io.h>
25 #include <apr_fnmatch.h>
27 #include <apr_strings.h>
36 /**************************************************************************************************/
37 /* generic callback handling */
39 #define ASPECT_MD "md.json"
40 #define ASPECT_CERT "cert.pem"
41 #define ASPECT_PKEY "key.pem"
42 #define ASPECT_CHAIN "chain.pem"
44 #define GNAME_ACCOUNTS
45 #define GNAME_CHALLENGES
50 static const char *GROUP_NAME[] = {
61 const char *md_store_group_name(int group)
63 if ((size_t)group < sizeof(GROUP_NAME)/sizeof(GROUP_NAME[0])) {
64 return GROUP_NAME[group];
69 void md_store_destroy(md_store_t *store)
71 if (store->destroy) store->destroy(store);
74 apr_status_t md_store_load(md_store_t *store, md_store_group_t group,
75 const char *name, const char *aspect,
76 md_store_vtype_t vtype, void **pdata,
79 return store->load(store, group, name, aspect, vtype, pdata, p);
82 apr_status_t md_store_save(md_store_t *store, apr_pool_t *p, md_store_group_t group,
83 const char *name, const char *aspect,
84 md_store_vtype_t vtype, void *data,
87 return store->save(store, p, group, name, aspect, vtype, data, create);
90 apr_status_t md_store_remove(md_store_t *store, md_store_group_t group,
91 const char *name, const char *aspect,
92 apr_pool_t *p, int force)
94 return store->remove(store, group, name, aspect, p, force);
97 apr_status_t md_store_purge(md_store_t *store, apr_pool_t *p, md_store_group_t group,
100 return store->purge(store, p, group, name);
103 apr_status_t md_store_iter(md_store_inspect *inspect, void *baton, md_store_t *store,
104 apr_pool_t *p, md_store_group_t group, const char *pattern,
105 const char *aspect, md_store_vtype_t vtype)
107 return store->iterate(inspect, baton, store, p, group, pattern, aspect, vtype);
110 apr_status_t md_store_load_json(md_store_t *store, md_store_group_t group,
111 const char *name, const char *aspect,
112 struct md_json_t **pdata, apr_pool_t *p)
114 return md_store_load(store, group, name, aspect, MD_SV_JSON, (void**)pdata, p);
117 apr_status_t md_store_save_json(md_store_t *store, apr_pool_t *p, md_store_group_t group,
118 const char *name, const char *aspect,
119 struct md_json_t *data, int create)
121 return md_store_save(store, p, group, name, aspect, MD_SV_JSON, (void*)data, create);
124 apr_status_t md_store_move(md_store_t *store, apr_pool_t *p,
125 md_store_group_t from, md_store_group_t to,
126 const char *name, int archive)
128 return store->move(store, p, from, to, name, archive);
131 apr_status_t md_store_get_fname(const char **pfname,
132 md_store_t *store, md_store_group_t group,
133 const char *name, const char *aspect,
136 if (store->get_fname) {
137 return store->get_fname(pfname, store, group, name, aspect, p);
142 int md_store_is_newer(md_store_t *store, md_store_group_t group1, md_store_group_t group2,
143 const char *name, const char *aspect, apr_pool_t *p)
145 return store->is_newer(store, group1, group2, name, aspect, p);
148 apr_status_t md_store_iter_names(md_store_inspect *inspect, void *baton, md_store_t *store,
149 apr_pool_t *p, md_store_group_t group, const char *pattern)
151 return store->iterate_names(inspect, baton, store, p, group, pattern);
154 /**************************************************************************************************/
159 md_store_group_t group;
162 apr_status_t md_load(md_store_t *store, md_store_group_t group,
163 const char *name, md_t **pmd, apr_pool_t *p)
168 rv = md_store_load_json(store, group, name, MD_FN_MD, pmd? &json : NULL, p);
169 if (APR_SUCCESS == rv) {
171 *pmd = md_from_json(json, p);
178 static apr_status_t p_save(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
180 md_group_ctx *ctx = baton;
185 md = va_arg(ap, md_t *);
186 create = va_arg(ap, int);
188 json = md_to_json(md, ptemp);
191 return md_store_save_json(ctx->store, p, ctx->group, md->name, MD_FN_MD, json, create);
194 apr_status_t md_save(md_store_t *store, apr_pool_t *p,
195 md_store_group_t group, md_t *md, int create)
201 return md_util_pool_vdo(p_save, &ctx, p, md, create, NULL);
204 static apr_status_t p_remove(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
206 md_group_ctx *ctx = baton;
211 name = va_arg(ap, const char *);
212 force = va_arg(ap, int);
215 return md_store_remove(ctx->store, ctx->group, name, MD_FN_MD, ptemp, force);
218 apr_status_t md_remove(md_store_t *store, apr_pool_t *p,
219 md_store_group_t group, const char *name, int force)
225 return md_util_pool_vdo(p_remove, &ctx, p, name, force, NULL);
228 int md_is_newer(md_store_t *store, md_store_group_t group1, md_store_group_t group2,
229 const char *name, apr_pool_t *p)
231 return md_store_is_newer(store, group1, group2, name, MD_FN_MD, p);
237 apr_array_header_t *mds;
240 apr_status_t md_pkey_load(md_store_t *store, md_store_group_t group, const char *name,
241 md_pkey_t **ppkey, apr_pool_t *p)
243 return md_store_load(store, group, name, MD_FN_PRIVKEY, MD_SV_PKEY, (void**)ppkey, p);
246 apr_status_t md_pkey_save(md_store_t *store, apr_pool_t *p, md_store_group_t group, const char *name,
247 struct md_pkey_t *pkey, int create)
249 return md_store_save(store, p, group, name, MD_FN_PRIVKEY, MD_SV_PKEY, pkey, create);
252 apr_status_t md_pubcert_load(md_store_t *store, md_store_group_t group, const char *name,
253 struct apr_array_header_t **ppubcert, apr_pool_t *p)
255 return md_store_load(store, group, name, MD_FN_PUBCERT, MD_SV_CHAIN, (void**)ppubcert, p);
258 apr_status_t md_pubcert_save(md_store_t *store, apr_pool_t *p,
259 md_store_group_t group, const char *name,
260 struct apr_array_header_t *pubcert, int create)
262 return md_store_save(store, p, group, name, MD_FN_PUBCERT, MD_SV_CHAIN, pubcert, create);
267 md_store_group_t group;
270 md_store_md_inspect *inspect;
274 static int insp_md(void *baton, const char *name, const char *aspect,
275 md_store_vtype_t vtype, void *value, apr_pool_t *ptemp)
277 inspect_md_ctx *ctx = baton;
279 if (!strcmp(MD_FN_MD, aspect) && vtype == MD_SV_JSON) {
280 md_t *md = md_from_json(value, ptemp);
281 md_log_perror(MD_LOG_MARK, MD_LOG_TRACE3, 0, ptemp, "inspecting md at: %s", name);
282 return ctx->inspect(ctx->baton, ctx->store, md, ptemp);
287 apr_status_t md_store_md_iter(md_store_md_inspect *inspect, void *baton, md_store_t *store,
288 apr_pool_t *p, md_store_group_t group, const char *pattern)
294 ctx.inspect = inspect;
297 return md_store_iter(insp_md, &ctx, store, p, group, pattern, MD_FN_MD, MD_SV_JSON);