return rv;
}
+static int md_job_json_seems_valid(md_json_t *json, md_store_t *store,
+ md_store_group_t group, const char *name,
+ apr_pool_t *p)
+{
+
+ if (!json) return FALSE;
+ if ((group == MD_SG_STAGING) &&
+ md_json_getb(json, MD_KEY_FINISHED, NULL) &&
+ md_json_getb(json, MD_KEY_NOTIFIED_RENEWED, NULL)) {
+ md_t *md;
+ /* A finished job in the staging area needs to have produced results */
+ if(!md_exists(store, group, name, p)) return FALSE;
+
+ if (APR_SUCCESS == md_load(store, MD_SG_DOMAINS, name, &md, p)) {
+ int i;
+ for (i = 0; i < md_cert_count(md); ++i) {
+ md_pkey_spec_t *spec = md_pkeys_spec_get(md->pks, i);
+ if(md_pubcert_load(store, group, name, spec, NULL, p) != APR_SUCCESS)
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
static apr_status_t job_loadj(md_json_t **pjson, md_store_group_t group, const char *name,
struct md_reg_t *reg, int with_log, apr_pool_t *p)
{
md_store_t *store = md_reg_store_get(reg);
rv = md_store_load_json(store, group, name, MD_FN_JOB, pjson, p);
- if (APR_SUCCESS == rv && !with_log) md_json_del(*pjson, MD_KEY_LOG, NULL);
+ if (APR_SUCCESS == rv) {
+ if (!md_job_json_seems_valid(*pjson, store, group, name, p)) {
+ *pjson = NULL;
+ return APR_ENOENT;
+ }
+ if(!with_log) md_json_del(*pjson, MD_KEY_LOG, NULL);
+ }
return rv;
}
apr_status_t rv;
rv = md_store_load_json(job->store, job->group, job->mdomain, MD_FN_JOB, &jprops, job->p);
- if (APR_SUCCESS == rv) {
+ if ((APR_SUCCESS == rv) &&
+ md_job_json_seems_valid(jprops, job->store, job->group, job->mdomain, job->p)) {
md_job_from_json(job, jprops, job->p);
}
return rv;
md_store_group_t group;
} md_group_ctx;
+int md_exists(md_store_t *store, md_store_group_t group,
+ const char *name, apr_pool_t *p)
+{
+ return (md_store_load_json(store, group, name, MD_FN_MD, NULL, p) == APR_SUCCESS);
+}
+
apr_status_t md_load(md_store_t *store, md_store_group_t group,
const char *name, md_t **pmd, apr_pool_t *p)
{
/**************************************************************************************************/
/* Storage handling utils */
-apr_status_t md_load(md_store_t *store, md_store_group_t group,
+int md_exists(md_store_t *store, md_store_group_t group,
+ const char *name, apr_pool_t *p);
+apr_status_t md_load(md_store_t *store, md_store_group_t group,
const char *name, md_t **pmd, apr_pool_t *p);
apr_status_t md_save(struct md_store_t *store, apr_pool_t *p, md_store_group_t group,
md_t *md, int create);
* @macro
* Version number of the md module as c string
*/
-#define MOD_MD_VERSION "2.6.9"
+#define MOD_MD_VERSION "2.6.10"
/**
* @macro
* release. This is a 24 bit number with 8 bits for major number, 8 bits
* for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203.
*/
-#define MOD_MD_VERSION_NUM 0x020609
+#define MOD_MD_VERSION_NUM 0x02060a
#define MD_ACME_DEF_URL "https://acme-v02.api.letsencrypt.org/directory"