#!/usr/bin/env bash
# =============================================================================
# onx-ftp-pure-user-toggle — PureDB FTP kullanıcısını disable/enable (suspend)
#
# v3.65: Account suspend/unsuspend'de FTP erişimini kilitle/aç.
#
# SORUN: v3.61 PAM/Unix auth'u kapattı → FTP auth artık SADECE PureDB. Linux
# user kilidi (usermod -L) PureDB virtual user'ı etkilemez → askıdaki hesap
# FTP'ye girip dosya indirebiliyordu. Suspend akışı pure-pw'ye dokunmuyordu.
#
# YÖNTEM (kesin + non-destructive):
#   disable: pureftpd.passwd'deki user satırını yedekle (bcrypt dahil) →
#            pure-pw userdel + mkdb → .pdb'den çıkar → login İMKANSIZ.
#   enable:  yedek satırı geri yaz + mkdb → user restore (ORİJİNAL bcrypt,
#            şifre DEĞİŞMEZ). Yedek yoksa no-op (zaten aktif).
#
# Neden -R IP-deny değil: pure-pw -R deny-all bazı sürümlerde login'i kesin
# bloklamayabilir. userdel .pdb'den fiziksel çıkarma = %100 kesin.
#
# Input (stdin JSON):
#   {
#     "username": "onx_xxx",          -- zorunlu
#     "action":   "disable"|"enable"  -- zorunlu
#   }
#
# Output (stdout JSON):
#   {"ok":true,"username":"onx_xxx","action":"disable","changed":true,"mkdb_run":true}
#
# Exit: 0=ok 1=invalid-input 2=preflight 3=exec-fail
# =============================================================================

set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=_lib/common.sh
source "${SCRIPT_DIR}/_lib/common.sh"

require_root
command -v jq >/dev/null 2>&1 || onx_die 2 "jq gerekli"
command -v pure-pw >/dev/null 2>&1 || onx_die 2 "pure-pw bulunamadi (pure-ftpd kurulu degil)"

INPUT="$(cat 2>/dev/null || echo '{}')"
echo "${INPUT}" | jq -e 'type == "object"' >/dev/null 2>&1 || onx_die 1 "stdin gecersiz JSON"

USERNAME=$(onx_json_get "${INPUT}" "username" "")
ACTION=$(onx_json_get   "${INPUT}" "action"   "")

[[ -z "${USERNAME}" ]] && onx_die 1 "username zorunlu"
[[ "${USERNAME}" =~ ^[a-z][a-z0-9_]{2,40}$ ]] || onx_die 1 "username gecersiz format: ${USERNAME}"
case "${ACTION}" in
    disable|enable) ;;
    *) onx_die 1 "action 'disable' veya 'enable' olmali (gelen: ${ACTION})" ;;
esac

PASSWD="/etc/pure-ftpd/pureftpd.passwd"
PUREDB="/etc/pure-ftpd/pureftpd.pdb"
SUSPEND_DIR="/etc/pure-ftpd/onx-suspended"

[[ -f "${PASSWD}" ]] || onx_die 2 "pureftpd.passwd yok: ${PASSWD}"
install -d -m 0700 "${SUSPEND_DIR}" 2>/dev/null || true

CHANGED="false"
MKDB_RUN="false"

run_mkdb() {
    if pure-pw mkdb "${PUREDB}" -f "${PASSWD}" 2>/dev/null; then
        MKDB_RUN="true"
    else
        onx_die 3 "pure-pw mkdb basarisiz"
    fi
}

if [[ "${ACTION}" == "disable" ]]; then
    # Kullanıcı .pdb/.passwd'de var mı?
    if pure-pw show "${USERNAME}" -f "${PASSWD}" >/dev/null 2>&1; then
        # Satırı yedekle (idempotent — varsa üstüne yaz)
        if grep -q "^${USERNAME}:" "${PASSWD}"; then
            grep "^${USERNAME}:" "${PASSWD}" > "${SUSPEND_DIR}/${USERNAME}.line"
            chmod 0600 "${SUSPEND_DIR}/${USERNAME}.line"
        fi
        # .pdb/.passwd'den çıkar
        if pure-pw userdel "${USERNAME}" -f "${PASSWD}" 2>/dev/null; then
            CHANGED="true"
            run_mkdb
            onx_log "ftp-toggle: disabled ${USERNAME} (line backed up + userdel)"
        else
            onx_die 3 "pure-pw userdel basarisiz: ${USERNAME}"
        fi
    else
        # Zaten yok (belki önceden disable) — yedek var mı kontrol, yoksa no-op
        onx_log "ftp-toggle: ${USERNAME} zaten PureDB'de yok (disable no-op)"
    fi

elif [[ "${ACTION}" == "enable" ]]; then
    BACKUP="${SUSPEND_DIR}/${USERNAME}.line"
    if pure-pw show "${USERNAME}" -f "${PASSWD}" >/dev/null 2>&1; then
        # Zaten aktif — yedek varsa temizle, no-op
        [[ -f "${BACKUP}" ]] && rm -f "${BACKUP}"
        onx_log "ftp-toggle: ${USERNAME} zaten aktif (enable no-op)"
    elif [[ -f "${BACKUP}" ]]; then
        # Yedek satırı geri yaz (orijinal bcrypt korunur)
        cat "${BACKUP}" >> "${PASSWD}"
        rm -f "${BACKUP}"
        CHANGED="true"
        run_mkdb
        onx_log "ftp-toggle: enabled ${USERNAME} (line restored from backup)"
    else
        # Ne aktif ne yedek var — restore edilemez (account create ile yeniden gelir)
        onx_log "ftp-toggle: ${USERNAME} yedek yok, restore edilemedi (enable no-op)"
    fi
fi

jq -nc \
    --arg user "${USERNAME}" \
    --arg action "${ACTION}" \
    --argjson changed "${CHANGED}" \
    --argjson mkdb "${MKDB_RUN}" \
    '{ok: true, username: $user, action: $action, changed: $changed, mkdb_run: $mkdb}'
