More tests

This commit is contained in:
Fang-Pen Lin
2025-11-11 17:17:55 -08:00
parent 771b026175
commit d7cf08790b
5 changed files with 32 additions and 7 deletions

View File

@@ -2,6 +2,8 @@ import json
import os
import pathlib
import typing
import httpx
from behave.runner import Context
from dotenv import load_dotenv
@@ -198,3 +200,8 @@ def before_all(context: Context):
"AUTH_TOKEN": AUTH_TOKEN,
}
context.http_client = httpx.Client(base_url=BASE_URL)
def after_feature(context: Context, feature: typing.Any):
if hasattr(context, "web_server"):
context.web_server.shutdown_and_server_close()

View File

@@ -93,3 +93,24 @@ Feature: Challenge
"""
Then the value response.status_code should be equal to 200
And the value response with jq ".status" should be equal to "pending"
# finalize should not be allowed when all auths are not valid yet
And I memorize response.headers with jq ".["replay-nonce"]" as nonce
When I send a raw ACME request to "{order.body.finalize}"
"""
{
"protected": {
"alg": "RS256",
"nonce": "{nonce}",
"url": "{order.body.finalize}",
"kid": "{acme_account.uri}"
},
"payload": {
"csr": "{csr_pem}"
}
}
"""
Then the value response.status_code should be equal to 400
Then the value response with jq ".status" should be equal to 400
Then the value response with jq ".type" should be equal to "urn:ietf:params:acme:error:orderNotReady"
Then the value response with jq ".detail" should be equal to "ACME order is not ready"

View File

@@ -1,7 +1,6 @@
import json
import logging
import re
import threading
import urllib.parse
import acme.client
@@ -632,11 +631,8 @@ def serve_challenge(
)
# TODO: make port configurable
servers = standalone.HTTP01DualNetworkedServers(("0.0.0.0", 8087), {resource})
# Start client standalone web server.
web_server = threading.Thread(name="web_server", target=servers.serve_forever)
web_server.daemon = True
web_server.start()
context.web_server = web_server
servers.serve_forever()
context.web_server = servers
def notify_challenge_ready(context: Context, challenge: messages.ChallengeBody):

View File

@@ -107,6 +107,7 @@ export const pkiAcmeChallengeServiceFactory = ({
if (fetchError.code === "ENOTFOUND" || fetchError.message.includes("ENOTFOUND")) {
return new AcmeDnsFailureError({ message: "Hostname could not be resolved (DNS failure)" });
}
logger.error(exp, "Unknown error validating ACME challenge response");
return new AcmeServerInternalError({ message: "Unknown error validating ACME challenge response" });
}
} else if (exp instanceof DOMException) {

View File

@@ -468,7 +468,7 @@ export class AcmeOrderNotReadyError extends AcmeError {
super({
type: AcmeErrorType.OrderNotReady,
message,
status: 403,
status: 400,
error
});
this.name = "AcmeOrderNotReadyError";