| 328 | } |
| 329 | |
| 330 | md_t *md_from_json(md_json_t *json, apr_pool_t *p) |
| 331 | { |
| 332 | const char *s; |
| 333 | md_t *md = md_create_empty(p); |
| 334 | if (md) { |
| 335 | md->name = md_json_dups(p, json, MD_KEY_NAME, NULL); |
| 336 | md_json_dupsa(md->domains, p, json, MD_KEY_DOMAINS, NULL); |
| 337 | md_json_dupsa(md->contacts, p, json, MD_KEY_CONTACTS, NULL); |
| 338 | md->ca_account = md_json_dups(p, json, MD_KEY_CA, MD_KEY_ACCOUNT, NULL); |
| 339 | md->ca_proto = md_json_dups(p, json, MD_KEY_CA, MD_KEY_PROTO, NULL); |
| 340 | md->ca_effective = md_json_dups(p, json, MD_KEY_CA, MD_KEY_URL, NULL); |
| 341 | if (md_json_has_key(json, MD_KEY_CA, MD_KEY_URLS, NULL)) { |
| 342 | md->ca_urls = apr_array_make(p, 5, sizeof(const char*)); |
| 343 | md_json_dupsa(md->ca_urls, p, json, MD_KEY_CA, MD_KEY_URLS, NULL); |
| 344 | } |
| 345 | else if (md->ca_effective) { |
| 346 | /* compat for old format where we had only a single url */ |
| 347 | md->ca_urls = apr_array_make(p, 5, sizeof(const char*)); |
| 348 | APR_ARRAY_PUSH(md->ca_urls, const char*) = md->ca_effective; |
| 349 | } |
| 350 | md->ca_agreement = md_json_dups(p, json, MD_KEY_CA, MD_KEY_AGREEMENT, NULL); |
| 351 | if (md_json_has_key(json, MD_KEY_PKEY, NULL)) { |
| 352 | md->pks = md_pkeys_spec_from_json(md_json_getj(json, MD_KEY_PKEY, NULL), p); |
| 353 | } |
| 354 | md->state = (md_state_t)md_json_getl(json, MD_KEY_STATE, NULL); |
| 355 | md->state_descr = md_json_dups(p, json, MD_KEY_STATE_DESCR, NULL); |
| 356 | if (MD_S_EXPIRED_DEPRECATED == md->state) md->state = MD_S_COMPLETE; |
| 357 | md->renew_mode = (int)md_json_getl(json, MD_KEY_RENEW_MODE, NULL); |
| 358 | md->domains = md_array_str_compact(p, md->domains, 0); |
| 359 | md->transitive = (int)md_json_getl(json, MD_KEY_TRANSITIVE, NULL); |
| 360 | s = md_json_gets(json, MD_KEY_RENEW_WINDOW, NULL); |
| 361 | md_timeslice_parse(&md->renew_window, p, s, MD_TIME_LIFE_NORM); |
| 362 | s = md_json_gets(json, MD_KEY_WARN_WINDOW, NULL); |
| 363 | md_timeslice_parse(&md->warn_window, p, s, MD_TIME_LIFE_NORM); |
| 364 | if (md_json_has_key(json, MD_KEY_CA, MD_KEY_CHALLENGES, NULL)) { |
| 365 | md->ca_challenges = apr_array_make(p, 5, sizeof(const char*)); |
| 366 | md_json_dupsa(md->ca_challenges, p, json, MD_KEY_CA, MD_KEY_CHALLENGES, NULL); |
| 367 | } |
| 368 | md->require_https = MD_REQUIRE_OFF; |
| 369 | s = md_json_gets(json, MD_KEY_REQUIRE_HTTPS, NULL); |
| 370 | if (s && !strcmp(MD_KEY_TEMPORARY, s)) { |
| 371 | md->require_https = MD_REQUIRE_TEMPORARY; |
| 372 | } |
| 373 | else if (s && !strcmp(MD_KEY_PERMANENT, s)) { |
| 374 | md->require_https = MD_REQUIRE_PERMANENT; |
| 375 | } |
| 376 | md->must_staple = (int)md_json_getb(json, MD_KEY_MUST_STAPLE, NULL); |
| 377 | md_json_dupsa(md->acme_tls_1_domains, p, json, MD_KEY_PROTO, MD_KEY_ACME_TLS_1, NULL); |
| 378 | |
| 379 | if (md_json_has_key(json, MD_KEY_CERT_FILES, NULL)) { |
| 380 | md->cert_files = apr_array_make(p, 3, sizeof(char*)); |
| 381 | md->pkey_files = apr_array_make(p, 3, sizeof(char*)); |
| 382 | md_json_dupsa(md->cert_files, p, json, MD_KEY_CERT_FILES, NULL); |
| 383 | md_json_dupsa(md->pkey_files, p, json, MD_KEY_PKEY_FILES, NULL); |
| 384 | } |
| 385 | md->stapling = (int)md_json_getb(json, MD_KEY_STAPLING, NULL); |
| 386 | md->dns01_cmd = md_json_dups(p, json, MD_KEY_CMD_DNS01, NULL); |
| 387 | if (md_json_has_key(json, MD_KEY_EAB, NULL)) { |
no test coverage detected