Add 2FA support to dns_he

Hurricane Electric doesn’t permit 2FA logins or calls in one step and requires cookies to be used for calls, so this depends on cookie support in acme.sh.
This commit is contained in:
Chris Gelatt 2017-09-21 09:48:20 -07:00
parent 8fa8852075
commit 9559f3514b

View File

@ -28,12 +28,19 @@ dns_he_add() {
_saveaccountconf HE_Username "$HE_Username" _saveaccountconf HE_Username "$HE_Username"
_saveaccountconf HE_Password "$HE_Password" _saveaccountconf HE_Password "$HE_Password"
if [ ! -z "$HE_OTP_Secret" ]; then
_saveaccountconf HE_OTP_Secret "$HE_OTP_Secret"
else
_clearaccountconf HE_OTP_Secret
fi
_sign_in
# Fills in the $_zone_id # Fills in the $_zone_id
_find_zone "$_full_domain" || return 1 _find_zone "$_full_domain" || return 1
_debug "Zone id \"$_zone_id\" will be used." _debug "Zone id \"$_zone_id\" will be used."
body="email=${HE_Username}&pass=${HE_Password}" body="account="
body="$body&account="
body="$body&menu=edit_zone" body="$body&menu=edit_zone"
body="$body&Type=TXT" body="$body&Type=TXT"
body="$body&hosted_dns_zoneid=$_zone_id" body="$body&hosted_dns_zoneid=$_zone_id"
@ -52,6 +59,9 @@ dns_he_add() {
_err "Couldn't add the TXT record." _err "Couldn't add the TXT record."
fi fi
_debug2 response "$response" _debug2 response "$response"
_sign_out
return "$exit_code" return "$exit_code"
} }
@ -63,13 +73,14 @@ dns_he_rm() {
_txt_value=$2 _txt_value=$2
_info "Cleaning up after DNS-01 Hurricane Electric hook" _info "Cleaning up after DNS-01 Hurricane Electric hook"
_sign_in
# fills in the $_zone_id # fills in the $_zone_id
_find_zone "$_full_domain" || return 1 _find_zone "$_full_domain" || return 1
_debug "Zone id \"$_zone_id\" will be used." _debug "Zone id \"$_zone_id\" will be used."
# Find the record id to clean # Find the record id to clean
body="email=${HE_Username}&pass=${HE_Password}" body="hosted_dns_zoneid=$_zone_id"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&menu=edit_zone" body="$body&menu=edit_zone"
body="$body&hosted_dns_editzone=" body="$body&hosted_dns_editzone="
domain_regex="$(echo "$_full_domain" | sed 's/\./\\./g')" # escape dots domain_regex="$(echo "$_full_domain" | sed 's/\./\\./g')" # escape dots
@ -84,8 +95,7 @@ dns_he_rm() {
# HE changes their website somehow). # HE changes their website somehow).
# Remove the record # Remove the record
body="email=${HE_Username}&pass=${HE_Password}" body="menu=edit_zone"
body="$body&menu=edit_zone"
body="$body&hosted_dns_zoneid=$_zone_id" body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&hosted_dns_recordid=$_record_id" body="$body&hosted_dns_recordid=$_record_id"
body="$body&hosted_dns_editzone=1" body="$body&hosted_dns_editzone=1"
@ -97,14 +107,53 @@ dns_he_rm() {
exit_code="$?" exit_code="$?"
if [ "$exit_code" -eq 0 ]; then if [ "$exit_code" -eq 0 ]; then
_info "Record removed successfully." _info "Record removed successfully."
_sign_out
else else
_err "Could not clean (remove) up the record. Please go to HE administration interface and clean it by hand." _err "Could not clean (remove) up the record. Please go to HE administration interface and clean it by hand."
_sign_out
return "$exit_code" return "$exit_code"
fi fi
} }
########################## PRIVATE FUNCTIONS ########################### ########################## PRIVATE FUNCTIONS ###########################
#-- _sign_in() ---------------------------------------------------------
# Signs into the Hurricane Electric account.
# This assumes cookies are usable and available.
_sign_in() {
_debug "Signing into Hurricane Electric account."
body="email=${HE_Username}&pass=${HE_Password}&submit=Login%21"
response="$(_post "$body" "https://dns.he.net/")"
# Check whether we're using an OTP code
if [ ! -z "$HE_OTP_Secret" ]; then
_debug " - Using OTP code..."
_saveaccountconf HE_OTP_Secret "$HE_OTP_Secret"
if ! _exists oathtool; then
_err "Please install oathtool to use 2 Factor Authentication."
_err ""
return 1
fi
otp_code="$(oathtool --base32 --totp "${HE_OTP_Secret}" 2>/dev/null)"
body="tfacode=${otp_code}&submit=Submit"
response="$(_post "$body" "https://dns.he.net/")"
fi
}
#-- _sign_out() --------------------------------------------------------
# Signs out of the Hurricane Electric account.
# This assumes cookies are usable and available.
_sign_out() {
_debug "Signing out of Hurricane Electric account."
_get "https://dns.he.net/?action=logout"
}
#-- _find_zone() ------------------------------------------------------- #-- _find_zone() -------------------------------------------------------
# Returns the most specific zone found in administration interface. # Returns the most specific zone found in administration interface.
# #
@ -128,7 +177,6 @@ _find_zone() {
_domain="$1" _domain="$1"
body="email=${HE_Username}&pass=${HE_Password}"
_matches=$(_post "$body" "https://dns.he.net/" \ _matches=$(_post "$body" "https://dns.he.net/" \
| _egrep_o "delete_dom.*name=\"[^\"]+\" value=\"[0-9]+" | _egrep_o "delete_dom.*name=\"[^\"]+\" value=\"[0-9]+"
) )