struct ist auth; /* auth URI */
struct ist chall; /* challenge URI */
struct ist token; /* token */
+ int validated; /* already validated */
int ready; /* is the challenge ready ? */
void *next;
};
auth->dns = istdup(ist2(t2->area, t2->data));
+ ret = mjson_get_string(hc->res.buf.area, hc->res.buf.data, "$.status", trash.area, trash.size);
+ if (ret == -1) {
+ memprintf(errmsg, "couldn't get a \"status\" from Authorization URL \"%s\"", auth->auth.ptr);
+ goto error;
+ }
+ trash.data = ret;
+
+ /* if auth is already valid we need to skip solving challenges */
+ if (strncasecmp("valid", trash.area, trash.data) == 0) {
+ auth->validated = 1;
+ goto out;
+ }
+
/* get the multiple challenges and select the one from the configuration */
for (i = 0; ; i++) {
int ret;
break;
}
+out:
ret = 0;
error:
break;
case ACME_CHALLENGE:
if (http_st == ACME_HTTP_REQ) {
+ /* if challenge is already validated we skip this stage */
+ if (ctx->next_auth->validated) {
+ if ((ctx->next_auth = ctx->next_auth->next) == NULL) {
+ st = ACME_CHKCHALLENGE;
+ ctx->next_auth = ctx->auths;
+ }
+ goto nextreq;
+ }
/* if the challenge is not ready, wait to be wakeup */
if (!ctx->next_auth->ready)
break;
case ACME_CHKCHALLENGE:
if (http_st == ACME_HTTP_REQ) {
+ /* if challenge is already validated we skip this stage */
+ if (ctx->next_auth->validated) {
+ if ((ctx->next_auth = ctx->next_auth->next) == NULL)
+ st = ACME_FINALIZE;
+
+ goto nextreq;
+ }
+
if (acme_post_as_get(task, ctx, ctx->next_auth->chall, &errmsg) != 0)
goto retry;
}