88 const char *proxy_url,
const char *ca_file,
90 int use_store_locks,
apr_time_t lock_wait_timeout)
142 "empty domain list: %s", md->
name);
150 "md %s with invalid domain name: %s", md->
name, domain);
157 "md %s shares domain '%s' with md %s",
187 "CA url for %s invalid (%s): %s", md->
name,
err,
url);
220 const char *state_descr =
NULL;
232 "md{%s}: state_init called with foreign pool", md->
name);
244 state_descr =
apr_psprintf(
p,
"certificate(%s) does not cover all domains.",
250 state_descr =
apr_psprintf(
p,
"'must-staple' is%s requested, but "
251 "certificate(%s) has it%s enabled.",
269 state_descr =
"error initializing";
277 md->
name, state, state_descr);
301 return ctx->cb(
ctx->baton,
ctx->reg, md);
525 nmd->acme_tls_1_domains =
updates->acme_tls_1_domains;
584 if (certs->
nelts == 0) {
692 "md[%s]: certificate(%d) valid[%s] renewal[%s]",
734 "md[%s]: certificate(%d) life[%s] warn[%s]",
845 ctx.master_mds = master_mds;
858 for (
i = 0;
i <
ctx.master_mds->nelts; ++
i) {
867 if (
ctx.maybe_new_mds->nelts == 0)
goto leave;
868 if (
ctx.store_names->nelts == 0)
goto leave;
871 "sync MDs, %d potentially new MDs detected, looking for renames among "
872 "the %d unassigned store domains", (
int)
ctx.maybe_new_mds->nelts,
873 (
int)
ctx.store_names->nelts);
874 for (
i = 0;
i <
ctx.store_names->nelts; ++
i) {
882 "sync MDs, %d MDs maybe new, checking store", (
int)
ctx.maybe_new_mds->nelts);
883 for (
i = 0;
i <
ctx.maybe_new_mds->nelts; ++
i) {
889 "sync MDs, found MD %s under previous name %s", md->
name,
oldmd->name);
893 "sync MDs, renaming MD %s to %s failed",
oldmd->name, md->
name);
906 "sync MDs, %d existing, %d moved, %d new.",
907 (
int)
ctx.master_mds->nelts -
ctx.maybe_new_mds->nelts,
908 (
int)
ctx.maybe_new_mds->nelts -
ctx.new_mds->nelts,
909 (
int)
ctx.new_mds->nelts);
932 "[%s] uses unknown CA protocol '%s'",
1016 for (used = 0,
i = 0;
i <
ctx->mds->nelts && !used; ++
i) {
1022 "challenges/%s: not in use, purging",
name);
1026 "challenges/%s: unable to purge",
name);
1085 driver->activation_delay = 0;
1110 result->detail?
result->detail :
"<see error log for details>");
1160 driver->attempt = attempt;
1169 int reset,
int attempt,
1258 "%s: staged set activated", md->
name);
1262 "%s: error loading staged set", md->
name);
1277 "unable to acquire global store lock");
APR general purpose library routines.
ap_vhost_iterate_conn_cb void * baton
#define APR_STATUS_IS_ENOENT(s)
apr_brigade_flush void * ctx
const char const apr_dbd_driver_t ** driver
void const char apr_status_t(* cleanup)(void *))
apr_array_header_t ** result
apr_vformatter_buff_t const char va_list ap
char const *const char const *const ** env
#define apr_pcalloc(p, size)
#define APR_ARRAY_PUSH(ary, type)
#define APR_ARRAY_IDX(ary, i, type)
apr_int32_t apr_int32_t apr_int32_t err
int md_equal_domains(const md_t *md1, const md_t *md2, int case_sensitive)
int md_cert_count(const md_t *md)
apr_status_t md_job_notify_cb(struct md_job_t *job, const char *reason, struct md_result_t *result, apr_pool_t *p, void *baton)
#define MD_SVAL_UPDATE(n, o, s)
int md_is_covered_by_alt_names(const md_t *md, const struct apr_array_header_t *alt_names)
#define MD_VAL_UPDATE(n, o, s)
#define MD_TIME_LIFE_NORM
md_t * md_clone(apr_pool_t *p, const md_t *src)
md_t * md_get_by_name(struct apr_array_header_t *mds, const char *name)
#define MD_TIME_WARN_WINDOW_DEF
const char * md_common_name(const md_t *md1, const md_t *md2)
md_t * md_copy(apr_pool_t *p, const md_t *src)
apr_size_t md_common_name_count(const md_t *md1, const md_t *md2)
#define MD_TIME_RENEW_WINDOW_DEF
int md_contains_domains(const md_t *md1, const md_t *md2)
#define MD_KEY_ACTIVATION_DELAY
int md_contains(const md_t *md, const char *domain, int case_sensitive)
apr_status_t md_acme_protos_add(struct apr_hash_t *protos, apr_pool_t *p)
apr_status_t md_chain_fload(apr_array_header_t **pcerts, apr_pool_t *p, const char *fname)
md_pkey_spec_t * md_pkeys_spec_get(const md_pkeys_spec_t *pks, int index)
int md_cert_must_staple(const md_cert_t *cert)
const char * md_pkey_spec_name(const md_pkey_spec_t *spec)
apr_time_t md_cert_get_not_before(const md_cert_t *cert)
int md_pkeys_spec_count(const md_pkeys_spec_t *pks)
apr_status_t md_cert_get_alt_names(apr_array_header_t **pnames, const md_cert_t *cert, apr_pool_t *p)
int md_pkeys_spec_eq(md_pkeys_spec_t *pks1, md_pkeys_spec_t *pks2)
md_pkeys_spec_t * md_pkeys_spec_clone(apr_pool_t *p, const md_pkeys_spec_t *pks)
md_cert_state_t md_cert_state_get(const md_cert_t *cert)
apr_time_t md_cert_get_not_after(const md_cert_t *cert)
void md_event_holler(const char *event, const char *mdomain, struct md_job_t *job, struct md_result_t *result, apr_pool_t *p)
md_json_t * md_json_create(apr_pool_t *pool)
int md_json_getb(const md_json_t *json,...)
int md_json_has_key(const md_json_t *json,...)
apr_status_t md_json_setb(int value, md_json_t *json,...)
void md_log_perror(const char *file, int line, md_log_level_t level, apr_status_t rv, apr_pool_t *p, const char *fmt,...)
int md_log_is_level(apr_pool_t *p, md_log_level_t level)
apr_status_t md_ocsp_get_meta(md_ocsp_cert_stat_t *pstat, md_timeperiod_t *pvalid, md_ocsp_reg_t *reg, const md_cert_t *cert, apr_pool_t *p, const md_t *md)
@ MD_OCSP_CERT_ST_REVOKED
static int reg_md_iter(void *baton, md_store_t *store, md_t *md, apr_pool_t *ptemp)
apr_time_t md_reg_valid_until(md_reg_t *reg, const md_t *md, apr_pool_t *p)
static int find_domain(void *baton, md_reg_t *reg, md_t *md)
apr_status_t md_reg_remove(md_reg_t *reg, apr_pool_t *p, const char *name, int archive)
apr_status_t md_reg_cleanup_challenges(md_reg_t *reg, apr_pool_t *p, apr_pool_t *ptemp, apr_array_header_t *mds)
apr_status_t md_reg_sync_start(md_reg_t *reg, apr_array_header_t *master_mds, apr_pool_t *p)
md_t * md_reg_find_overlap(md_reg_t *reg, const md_t *md, const char **pdomain, apr_pool_t *p)
void md_reg_set_warn_window_default(md_reg_t *reg, md_timeslice_t *warn_window)
static int reg_do(md_reg_do_cb *cb, void *baton, md_reg_t *reg, apr_pool_t *p, const char *exclude)
apr_status_t md_reg_freeze_domains(md_reg_t *reg, apr_array_header_t *mds)
apr_status_t md_reg_get_pubcert(const md_pubcert_t **ppubcert, md_reg_t *reg, const md_t *md, int i, apr_pool_t *p)
static int get_cert_count(const md_t *md)
int md_reg_should_renew(md_reg_t *reg, const md_t *md, apr_pool_t *p)
apr_status_t md_reg_renew(md_reg_t *reg, const md_t *md, apr_table_t *env, int reset, int attempt, md_result_t *result, apr_pool_t *p)
apr_status_t md_reg_set_props(md_reg_t *reg, apr_pool_t *p, int can_http, int can_https)
void md_reg_unlock_global(md_reg_t *reg, apr_pool_t *p)
static int iter_add_name(void *baton, const char *dir, const char *name, md_store_vtype_t vtype, void *value, apr_pool_t *ptemp)
static apr_status_t run_init(void *baton, apr_pool_t *p,...)
apr_status_t md_reg_lock_global(md_reg_t *reg, apr_pool_t *p)
static apr_status_t p_md_update(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
static apr_status_t p_md_add(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
static apr_status_t pubcert_load(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
apr_status_t md_reg_create(md_reg_t **preg, apr_pool_t *p, struct md_store_t *store, const char *proxy_url, const char *ca_file, apr_time_t min_delay, int retry_failover, int use_store_locks, apr_time_t lock_wait_timeout)
apr_status_t md_reg_load_staging(md_reg_t *reg, const md_t *md, apr_table_t *env, md_result_t *result, apr_pool_t *p)
int md_reg_do(md_reg_do_cb *cb, void *baton, md_reg_t *reg, apr_pool_t *p)
static apr_status_t load_props(md_reg_t *reg, apr_pool_t *p)
static apr_status_t run_test_init(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
static apr_status_t add_md(md_reg_t *reg, md_t *md, apr_pool_t *p, int do_checks)
static apr_status_t cleanup_challenge_inspector(void *baton, const char *dir, const char *name, md_store_vtype_t vtype, void *value, apr_pool_t *ptemp)
int md_reg_has_revoked_certs(md_reg_t *reg, struct md_ocsp_reg_t *ocsp, const md_t *md, apr_pool_t *p)
md_t * md_reg_find(md_reg_t *reg, const char *domain, apr_pool_t *p)
apr_status_t md_reg_update(md_reg_t *reg, apr_pool_t *p, const char *name, const md_t *md, int fields, int do_checks)
static apr_status_t state_init(md_reg_t *reg, apr_pool_t *p, md_t *md)
apr_status_t md_reg_get_cred_files(const char **pkeyfile, const char **pcertfile, md_reg_t *reg, md_store_group_t group, const md_t *md, md_pkey_spec_t *spec, apr_pool_t *p)
apr_status_t md_reg_load_stagings(md_reg_t *reg, apr_array_header_t *mds, apr_table_t *env, apr_pool_t *p)
md_t * md_reg_get(md_reg_t *reg, const char *name, apr_pool_t *p)
static apr_status_t run_renew(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
static apr_status_t run_load_staging(void *baton, apr_pool_t *p, apr_pool_t *ptemp, va_list ap)
void md_reg_set_renew_window_default(md_reg_t *reg, md_timeslice_t *renew_window)
md_job_t * md_reg_job_make(md_reg_t *reg, const char *mdomain, apr_pool_t *p)
static apr_status_t check_values(md_reg_t *reg, apr_pool_t *p, const md_t *md, int fields)
apr_status_t md_reg_test_init(md_reg_t *reg, const md_t *md, struct apr_table_t *env, md_result_t *result, apr_pool_t *p)
int md_reg_should_warn(md_reg_t *reg, const md_t *md, apr_pool_t *p)
static int find_overlap(void *baton, md_reg_t *reg, md_t *md)
apr_status_t md_reg_delete_acct(md_reg_t *reg, apr_pool_t *p, const char *acct_id)
apr_status_t md_reg_add(md_reg_t *reg, md_t *md, apr_pool_t *p)
apr_status_t md_reg_sync_finish(md_reg_t *reg, md_t *md, apr_pool_t *p, apr_pool_t *ptemp)
struct md_store_t * md_reg_store_get(md_reg_t *reg)
static md_t * find_closest_match(apr_array_header_t *mds, const md_t *md)
apr_time_t md_reg_renew_at(md_reg_t *reg, const md_t *md, apr_pool_t *p)
#define MD_UPD_DRIVE_MODE
#define MD_UPD_CA_CHALLENGES
#define MD_UPD_RENEW_WINDOW
#define MD_UPD_TRANSITIVE
#define MD_UPD_REQUIRE_HTTPS
int md_reg_do_cb(void *baton, md_reg_t *reg, md_t *md)
#define MD_UPD_CA_ACCOUNT
#define MD_UPD_WARN_WINDOW
#define MD_UPD_MUST_STAPLE
void md_result_activity_setn(md_result_t *result, const char *activity)
void md_result_printf(md_result_t *result, apr_status_t status, const char *fmt,...)
void md_result_set(md_result_t *result, apr_status_t status, const char *detail)
md_result_t * md_result_md_make(apr_pool_t *p, const char *md_name)
md_job_t * md_job_make(apr_pool_t *p, md_store_t *store, md_store_group_t group, const char *name, apr_time_t min_delay)
void md_job_set_group(md_job_t *job, md_store_group_t group)
apr_status_t md_job_load(md_job_t *job)
apr_status_t md_job_save(md_job_t *job, md_result_t *result, apr_pool_t *p)
apr_status_t md_store_save(md_store_t *store, apr_pool_t *p, md_store_group_t group, const char *name, const char *aspect, md_store_vtype_t vtype, void *data, int create)
apr_status_t md_store_md_iter(md_store_md_inspect *inspect, void *baton, md_store_t *store, apr_pool_t *p, md_store_group_t group, const char *pattern)
const char * md_pkey_filename(md_pkey_spec_t *spec, apr_pool_t *p)
apr_status_t md_pubcert_load(md_store_t *store, md_store_group_t group, const char *name, md_pkey_spec_t *spec, struct apr_array_header_t **ppubcert, apr_pool_t *p)
apr_status_t md_store_iter_names(md_store_inspect *inspect, void *baton, md_store_t *store, apr_pool_t *p, md_store_group_t group, const char *pattern)
void md_store_unlock_global(md_store_t *store, apr_pool_t *p)
apr_status_t md_store_remove(md_store_t *store, md_store_group_t group, const char *name, const char *aspect, apr_pool_t *p, int force)
apr_status_t md_store_get_fname(const char **pfname, md_store_t *store, md_store_group_t group, const char *name, const char *aspect, apr_pool_t *p)
const char * md_chain_filename(md_pkey_spec_t *spec, apr_pool_t *p)
apr_status_t md_save(md_store_t *store, apr_pool_t *p, md_store_group_t group, md_t *md, int create)
apr_status_t md_store_lock_global(md_store_t *store, apr_pool_t *p, apr_time_t max_wait)
apr_status_t md_store_purge(md_store_t *store, apr_pool_t *p, md_store_group_t group, const char *name)
apr_status_t md_store_move(md_store_t *store, apr_pool_t *p, md_store_group_t from, md_store_group_t to, const char *name, int archive)
apr_status_t md_store_rename(md_store_t *store, apr_pool_t *p, md_store_group_t group, const char *name, const char *to)
apr_status_t md_store_load(md_store_t *store, md_store_group_t group, const char *name, const char *aspect, md_store_vtype_t vtype, void **pdata, 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_tailscale_protos_add(apr_hash_t *protos, apr_pool_t *p)
apr_status_t md_duration_parse(apr_interval_time_t *ptimeout, const char *value, const char *def_unit)
int md_timeperiod_has_started(const md_timeperiod_t *period, apr_time_t time)
int md_timeslice_eq(const md_timeslice_t *ts1, const md_timeslice_t *ts2)
apr_status_t md_timeslice_create(md_timeslice_t **pts, apr_pool_t *p, apr_interval_time_t norm, apr_interval_time_t len)
char * md_timeperiod_print(apr_pool_t *p, const md_timeperiod_t *period)
md_timeperiod_t md_timeperiod_slice_before_end(const md_timeperiod_t *period, const md_timeslice_t *ts)
apr_array_header_t * md_array_str_clone(apr_pool_t *p, apr_array_header_t *src)
apr_status_t md_util_pool_vdo(md_util_vaction *cb, void *baton, apr_pool_t *p,...)
int md_array_remove(struct apr_array_header_t *a, void *elem)
int md_dns_is_wildcard(apr_pool_t *p, const char *domain)
apr_status_t md_util_abs_uri_check(apr_pool_t *p, const char *uri, const char **perr)
int md_array_str_eq(const struct apr_array_header_t *a1, const struct apr_array_header_t *a2, int case_sensitive)
struct apr_array_header_t * md_array_str_compact(apr_pool_t *p, struct apr_array_header_t *src, int case_sensitive)
int md_array_str_index(const apr_array_header_t *array, const char *s, int start, int case_sensitive)
int md_array_remove_at(struct apr_array_header_t *a, int idx)
int md_dns_is_name(apr_pool_t *p, const char *hostname, int need_fqdn)
int md_file_exists(const char *fname, apr_pool_t *p)
static apr_status_t reset(proxy_balancer *balancer, server_rec *s)
void(* init)(apr_pool_t *pool)
md_proto_complete_md_cb * complete_md
struct apr_array_header_t * certs
struct apr_array_header_t * alt_names
apr_time_t lock_wait_timeout
md_timeslice_t * warn_window
struct md_store_t * store
struct apr_hash_t * certs
md_timeslice_t * renew_window
md_job_notify_cb * notify
struct apr_hash_t * protos
md_timeslice_t * renew_window
struct apr_array_header_t * domains
md_timeslice_t * warn_window
struct apr_array_header_t * acme_tls_1_domains
struct apr_array_header_t * pkey_files
const char * ca_effective
struct apr_array_header_t * ca_urls
struct md_pkeys_spec_t * pks
const char * ca_agreement
struct apr_array_header_t * contacts
struct apr_array_header_t * cert_files
struct apr_array_header_t * ca_challenges
apr_array_header_t * new_mds
apr_array_header_t * unassigned_mds
apr_array_header_t * maybe_new_mds
apr_array_header_t * store_names
apr_array_header_t * master_mds