#!/usr/bin/env bash
# site/wp-admin -- put a password in front of /wp-admin
#
# admin-ajax.php stays open, because the front end breaks without it.
set -o pipefail
SELF=$(readlink -f "${BASH_SOURCE[0]}")
NV_BASE=$(cd "$(dirname "$SELF")/../../.." && pwd)
export NV_BASE
# shellcheck source=/dev/null
. "$NV_BASE/lib/core/bootstrap.sh"

nv_require_root || exit 1
ui_header "$(t site_m_wpadmin)"

site_pick_domain "${1:-}" || exit $?
domain=$SITE_DOMAIN
cur=$(nv_site_get "$domain" wp_admin_guard 0)
f="$NV_STATE_DIR/sites/$domain.admin.htpasswd"

ui_kv "$(t col_domain)" "$domain"
ui_kv "$(t web_state)"  "$([ "$cur" = "1" ] && t state_enabled || t state_disabled)"
ui_info "$(t wpadmin_desc)"
ui_blank

if [ "$cur" = "1" ]; then
    ui_confirm "$(t web_disable_q)" n || exit 0
    nv_site_set "$domain" wp_admin_guard 0
    rm -f "$f"
    site_apply_vhost "$domain" || exit 1
    svc_reload "$(nv_site_get "$domain" php_version "$NV_SITE_PHP_VERSION")"
    nv_trace wp-admin "$domain off"
    ui_ok "$(t wpadmin_off)"
    exit 0
fi

printf '  %s [admin]: ' "$(t web_prompt_user)"
read -r user || exit 130
user=$(nv_trim "$user"); [ -z "$user" ] && user='admin'
nv_valid_ident "$user" || { ui_err "$(t db_bad_user)"; exit 2; }

printf '  %s: ' "$(t web_prompt_pass)"
read -r -s pass || exit 130
printf '\n'
[ ${#pass} -ge 8 ] || { ui_err "$(t web_weak_pass)"; exit 2; }

install -d -m 0700 "$(dirname "$f")"
if nv_have htpasswd; then
    htpasswd -bcB "$f" "$user" "$pass" >/dev/null 2>&1 || { nv_fail 3401 "$(t web_htpasswd_failed)"; exit 1; }
else
    hash=$(openssl passwd -apr1 "$pass" 2>/dev/null) || { nv_fail 3401 "$(t web_htpasswd_failed)"; exit 1; }
    printf '%s:%s\n' "$user" "$hash" >"$f"
fi
chmod 0640 "$f"; chown root:www-data "$f" 2>/dev/null || true

nv_site_set "$domain" wp_admin_guard 1
if ! site_apply_vhost "$domain"; then
    nv_site_set "$domain" wp_admin_guard 0
    site_apply_vhost "$domain" >/dev/null 2>&1 || true
    exit 1
fi
svc_reload "$(nv_site_get "$domain" php_version "$NV_SITE_PHP_VERSION")"
nv_trace wp-admin "$domain on user=$user"

ui_ok "$(t wpadmin_on "$domain")"
ui_kv "$(t web_user_is)" "$user"
ui_info "$(t wpadmin_ajax_note)"
exit 0
