Skip to content

Commit 0d25f76

Browse files
authored
Merge pull request #4609 from acmesh-official/dev
sync
2 parents cf3ff4c + 84e4181 commit 0d25f76

File tree

5 files changed

+202
-25
lines changed

5 files changed

+202
-25
lines changed

acme.sh

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2229,15 +2229,19 @@ _send_signed_request() {
22292229
_debug3 _body "$_body"
22302230
fi
22312231

2232-
_retryafter=$(echo "$responseHeaders" | grep -i "^Retry-After *:" | cut -d : -f 2 | tr -d ' ' | tr -d '\r')
2233-
if [ "$code" = '503' ] || [ "$_retryafter" ]; then
2232+
_retryafter=$(echo "$responseHeaders" | grep -i "^Retry-After *: *[0-9]\+ *" | cut -d : -f 2 | tr -d ' ' | tr -d '\r')
2233+
if [ "$code" = '503' ]; then
22342234
_sleep_overload_retry_sec=$_retryafter
22352235
if [ -z "$_sleep_overload_retry_sec" ]; then
22362236
_sleep_overload_retry_sec=5
22372237
fi
2238-
_info "It seems the CA server is currently overloaded, let's wait and retry. Sleeping $_sleep_overload_retry_sec seconds."
2239-
_sleep $_sleep_overload_retry_sec
2240-
continue
2238+
if [ $_sleep_overload_retry_sec -le 600 ]; then
2239+
_info "It seems the CA server is currently overloaded, let's wait and retry. Sleeping $_sleep_overload_retry_sec seconds."
2240+
_sleep $_sleep_overload_retry_sec
2241+
continue
2242+
else
2243+
_info "The retryafter=$_retryafter is too large > 600, not retry anymore."
2244+
fi
22412245
fi
22422246
if _contains "$_body" "JWS has invalid anti-replay nonce" || _contains "$_body" "JWS has an invalid anti-replay nonce"; then
22432247
_info "It seems the CA server is busy now, let's wait and retry. Sleeping $_sleep_retry_sec seconds."
@@ -2408,7 +2412,7 @@ _getdeployconf() {
24082412
return 0 # do nothing
24092413
fi
24102414
_saved="$(_readdomainconf "SAVED_$_rac_key")"
2411-
eval $_rac_key="$_saved"
2415+
eval $_rac_key=\$_saved
24122416
export $_rac_key
24132417
}
24142418

@@ -5782,6 +5786,7 @@ deploy() {
57825786
return 1
57835787
fi
57845788

5789+
_debug2 DOMAIN_CONF "$DOMAIN_CONF"
57855790
. "$DOMAIN_CONF"
57865791

57875792
_savedomainconf Le_DeployHook "$_hooks"
@@ -6141,8 +6146,22 @@ revoke() {
61416146

61426147
uri="${ACME_REVOKE_CERT}"
61436148

6149+
_info "Try account key first."
6150+
if _send_signed_request "$uri" "$data" "" "$ACCOUNT_KEY_PATH"; then
6151+
if [ -z "$response" ]; then
6152+
_info "Revoke success."
6153+
rm -f "$CERT_PATH"
6154+
cat "$CERT_KEY_PATH" >"$CERT_KEY_PATH.revoked"
6155+
cat "$CSR_PATH" >"$CSR_PATH.revoked"
6156+
return 0
6157+
else
6158+
_err "Revoke error."
6159+
_debug "$response"
6160+
fi
6161+
fi
6162+
61446163
if [ -f "$CERT_KEY_PATH" ]; then
6145-
_info "Try domain key first."
6164+
_info "Try domain key."
61466165
if _send_signed_request "$uri" "$data" "" "$CERT_KEY_PATH"; then
61476166
if [ -z "$response" ]; then
61486167
_info "Revoke success."
@@ -6158,21 +6177,6 @@ revoke() {
61586177
else
61596178
_info "Domain key file doesn't exist."
61606179
fi
6161-
6162-
_info "Try account key."
6163-
6164-
if _send_signed_request "$uri" "$data" "" "$ACCOUNT_KEY_PATH"; then
6165-
if [ -z "$response" ]; then
6166-
_info "Revoke success."
6167-
rm -f "$CERT_PATH"
6168-
cat "$CERT_KEY_PATH" >"$CERT_KEY_PATH.revoked"
6169-
cat "$CSR_PATH" >"$CSR_PATH.revoked"
6170-
return 0
6171-
else
6172-
_err "Revoke error."
6173-
_debug "$response"
6174-
fi
6175-
fi
61766180
return 1
61776181
}
61786182

dnsapi/dns_cloudns.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ dns_cloudns_rm() {
7878
return 1
7979
fi
8080

81-
for i in $(echo "$response" | tr '{' "\n" | grep "$record"); do
81+
for i in $(echo "$response" | tr '{' "\n" | grep -- "$record"); do
8282
record_id=$(echo "$i" | tr ',' "\n" | grep -E '^"id"' | sed -re 's/^\"id\"\:\"([0-9]+)\"$/\1/g')
8383

8484
if [ -n "$record_id" ]; then

dnsapi/dns_googledomains.sh

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
#!/usr/bin/env sh
2+
3+
# Author: Alex Leigh <leigh at alexleigh dot me>
4+
# Created: 2023-03-02
5+
6+
#GOOGLEDOMAINS_ACCESS_TOKEN="xxxx"
7+
#GOOGLEDOMAINS_ZONE="xxxx"
8+
GOOGLEDOMAINS_API="https://acmedns.googleapis.com/v1/acmeChallengeSets"
9+
10+
######## Public functions ########
11+
12+
#Usage: dns_googledomains_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
13+
dns_googledomains_add() {
14+
fulldomain=$1
15+
txtvalue=$2
16+
17+
_info "Invoking Google Domains ACME DNS API."
18+
19+
if ! _dns_googledomains_setup; then
20+
return 1
21+
fi
22+
23+
zone="$(_dns_googledomains_get_zone "$fulldomain")"
24+
if [ -z "$zone" ]; then
25+
_err "Could not find a Google Domains-managed zone containing the requested domain."
26+
return 1
27+
fi
28+
29+
_debug zone "$zone"
30+
_debug txtvalue "$txtvalue"
31+
32+
_info "Adding TXT record for $fulldomain."
33+
if _dns_googledomains_api "$zone" ":rotateChallenges" "{\"accessToken\":\"$GOOGLEDOMAINS_ACCESS_TOKEN\",\"recordsToAdd\":[{\"fqdn\":\"$fulldomain\",\"digest\":\"$txtvalue\"}],\"keepExpiredRecords\":true}"; then
34+
if _contains "$response" "$txtvalue"; then
35+
_info "TXT record added."
36+
return 0
37+
else
38+
_err "Error adding TXT record."
39+
return 1
40+
fi
41+
fi
42+
43+
_err "Error adding TXT record."
44+
return 1
45+
}
46+
47+
#Usage: dns_googledomains_rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
48+
dns_googledomains_rm() {
49+
fulldomain=$1
50+
txtvalue=$2
51+
52+
_info "Invoking Google Domains ACME DNS API."
53+
54+
if ! _dns_googledomains_setup; then
55+
return 1
56+
fi
57+
58+
zone="$(_dns_googledomains_get_zone "$fulldomain")"
59+
if [ -z "$zone" ]; then
60+
_err "Could not find a Google Domains-managed domain based on request."
61+
return 1
62+
fi
63+
64+
_debug zone "$zone"
65+
_debug txtvalue "$txtvalue"
66+
67+
_info "Removing TXT record for $fulldomain."
68+
if _dns_googledomains_api "$zone" ":rotateChallenges" "{\"accessToken\":\"$GOOGLEDOMAINS_ACCESS_TOKEN\",\"recordsToRemove\":[{\"fqdn\":\"$fulldomain\",\"digest\":\"$txtvalue\"}],\"keepExpiredRecords\":true}"; then
69+
if _contains "$response" "$txtvalue"; then
70+
_err "Error removing TXT record."
71+
return 1
72+
else
73+
_info "TXT record removed."
74+
return 0
75+
fi
76+
fi
77+
78+
_err "Error removing TXT record."
79+
return 1
80+
}
81+
82+
######## Private functions ########
83+
84+
_dns_googledomains_setup() {
85+
if [ -n "$GOOGLEDOMAINS_SETUP_COMPLETED" ]; then
86+
return 0
87+
fi
88+
89+
GOOGLEDOMAINS_ACCESS_TOKEN="${GOOGLEDOMAINS_ACCESS_TOKEN:-$(_readaccountconf_mutable GOOGLEDOMAINS_ACCESS_TOKEN)}"
90+
GOOGLEDOMAINS_ZONE="${GOOGLEDOMAINS_ZONE:-$(_readaccountconf_mutable GOOGLEDOMAINS_ZONE)}"
91+
92+
if [ -z "$GOOGLEDOMAINS_ACCESS_TOKEN" ]; then
93+
GOOGLEDOMAINS_ACCESS_TOKEN=""
94+
_err "Google Domains access token was not specified."
95+
_err "Please visit Google Domains Security settings to provision an ACME DNS API access token."
96+
return 1
97+
fi
98+
99+
if [ "$GOOGLEDOMAINS_ZONE" ]; then
100+
_savedomainconf GOOGLEDOMAINS_ACCESS_TOKEN "$GOOGLEDOMAINS_ACCESS_TOKEN"
101+
_savedomainconf GOOGLEDOMAINS_ZONE "$GOOGLEDOMAINS_ZONE"
102+
else
103+
_saveaccountconf_mutable GOOGLEDOMAINS_ACCESS_TOKEN "$GOOGLEDOMAINS_ACCESS_TOKEN"
104+
_clearaccountconf_mutable GOOGLEDOMAINS_ZONE
105+
_clearaccountconf GOOGLEDOMAINS_ZONE
106+
fi
107+
108+
_debug GOOGLEDOMAINS_ACCESS_TOKEN "$GOOGLEDOMAINS_ACCESS_TOKEN"
109+
_debug GOOGLEDOMAINS_ZONE "$GOOGLEDOMAINS_ZONE"
110+
111+
GOOGLEDOMAINS_SETUP_COMPLETED=1
112+
return 0
113+
}
114+
115+
_dns_googledomains_get_zone() {
116+
domain=$1
117+
118+
# Use zone directly if provided
119+
if [ "$GOOGLEDOMAINS_ZONE" ]; then
120+
if ! _dns_googledomains_api "$GOOGLEDOMAINS_ZONE"; then
121+
return 1
122+
fi
123+
124+
echo "$GOOGLEDOMAINS_ZONE"
125+
return 0
126+
fi
127+
128+
i=2
129+
while true; do
130+
curr=$(printf "%s" "$domain" | cut -d . -f $i-100)
131+
_debug curr "$curr"
132+
133+
if [ -z "$curr" ]; then
134+
return 1
135+
fi
136+
137+
if _dns_googledomains_api "$curr"; then
138+
echo "$curr"
139+
return 0
140+
fi
141+
142+
i=$(_math "$i" + 1)
143+
done
144+
145+
return 1
146+
}
147+
148+
_dns_googledomains_api() {
149+
zone=$1
150+
apimethod=$2
151+
data="$3"
152+
153+
if [ -z "$data" ]; then
154+
response="$(_get "$GOOGLEDOMAINS_API/$zone$apimethod")"
155+
else
156+
_debug data "$data"
157+
export _H1="Content-Type: application/json"
158+
response="$(_post "$data" "$GOOGLEDOMAINS_API/$zone$apimethod")"
159+
fi
160+
161+
_debug response "$response"
162+
163+
if [ "$?" != "0" ]; then
164+
_err "Error"
165+
return 1
166+
fi
167+
168+
if _contains "$response" "\"error\": {"; then
169+
return 1
170+
fi
171+
172+
return 0
173+
}

dnsapi/dns_kas.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ _get_record_id() {
215215
return 1
216216
fi
217217

218-
_record_id="$(echo "$response" | tr -d '\n\r' | sed "s/<item xsi:type=\"ns2:Map\">/\n/g" | grep -i "$_record_name" | grep -i ">TXT<" | sed "s/<item><key xsi:type=\"xsd:string\">record_id<\/key><value xsi:type=\"xsd:string\">/=>/g" | sed "s/<\/value><\/item>/\n/g" | grep "=>" | sed "s/=>//g")"
218+
_record_id="$(echo "$response" | tr -d '\n\r' | sed "s/<item xsi:type=\"ns2:Map\">/\n/g" | grep -i "$_record_name" | grep -i ">TXT<" | sed "s/<item><key xsi:type=\"xsd:string\">record_id<\/key><value xsi:type=\"xsd:string\">/=>/g" | grep -i "$_txtvalue" | sed "s/<\/value><\/item>/\n/g" | grep "=>" | sed "s/=>//g")"
219219
_debug "[KAS] -> Record Id: " "$_record_id"
220220
return 0
221221
}

dnsapi/dns_leaseweb.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#See https://developer.leaseweb.com for more information.
77
######## Public functions #####################
88

9-
LSW_API="https://api.leaseweb.com/hosting/v2/domains/"
9+
LSW_API="https://api.leaseweb.com/hosting/v2/domains"
1010

1111
#Usage: dns_leaseweb_add _acme-challenge.www.domain.com
1212
dns_leaseweb_add() {

0 commit comments

Comments
 (0)