mirror of
https://github.com/acmesh-official/acme.sh.git
synced 2026-08-13 12:33:30 +02:00
dns_cpanel: resolve the most specific zone in _get_root
With both domain.tld and sub.domain.tld zones on the account, the first endswith hit could pick the parent zone while cPanel stores the record in the most specific one, so the cleanup never found the record and left an orphaned _acme-challenge TXT entry. Pick the longest matching zone with an exact literal suffix match (_endswith treats the needle as a regex, letting xdomain.tld wrongly match zone domain.tld). https://github.com/acmesh-official/acme.sh/issues/6807
This commit is contained in:
parent
2e4acba105
commit
9366c2e065
1 changed files with 21 additions and 7 deletions
|
|
@ -38,7 +38,7 @@ dns_cpanel_add() {
|
|||
fi
|
||||
# adding entry
|
||||
_info "Adding the entry"
|
||||
stripped_fulldomain=$(echo "$fulldomain" | sed "s/.$_domain//")
|
||||
stripped_fulldomain="${fulldomain%.$_domain}"
|
||||
_debug "Adding $stripped_fulldomain to $_domain zone"
|
||||
_myget "json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=add_zone_record&domain=$_domain&name=$stripped_fulldomain&type=TXT&txtdata=$txtvalue&ttl=1"
|
||||
if _successful_update; then return 0; fi
|
||||
|
|
@ -128,13 +128,27 @@ _get_root() {
|
|||
_err "Primary domain list not found!"
|
||||
return 1
|
||||
fi
|
||||
for _domain in $_domains; do
|
||||
_debug "Checking if $fulldomain ends with $_domain"
|
||||
if (_endswith "$fulldomain" "$_domain"); then
|
||||
_debug "Root domain: $_domain"
|
||||
return 0
|
||||
fi
|
||||
# Pick the LONGEST matching zone, dot-anchored: with both domain.tld and
|
||||
# sub.domain.tld zones on the account, cPanel stores the record in the
|
||||
# most specific zone, so add and rm must both resolve to that one.
|
||||
_domain=""
|
||||
for d in $_domains; do
|
||||
_debug "Checking if $fulldomain ends with $d"
|
||||
# case with quoted patterns gives an exact literal suffix match;
|
||||
# _endswith treats the needle as a regex, so its dots would let
|
||||
# xdomain.tld wrongly match zone domain.tld
|
||||
case "$fulldomain" in
|
||||
"$d" | *".$d")
|
||||
if [ "${#d}" -gt "${#_domain}" ]; then
|
||||
_domain="$d"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
if [ -n "$_domain" ]; then
|
||||
_debug "Root domain: $_domain"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue