#!/bin/bash
# 8Core Scanner — potpuni uninstall. Pokretati isključivo kao root.
set -euo pipefail

fail() { echo "GREŠKA: $*" >&2; exit 1; }
[ "$(id -u)" = "0" ] || fail "uninstall mora biti pokrenut kao root"
[ "${1:-}" = "--confirm=UNINSTALL" ] || fail "potvrda nedostaje; koristi --confirm=UNINSTALL"

ROOT_ENGINE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG="$ROOT_ENGINE_PATH/scanner-db.conf"
[ -f "$CONFIG" ] || fail "nedostaje root konfiguracija: $CONFIG"
[ ! -L "$CONFIG" ] || fail "scanner-db.conf ne smije biti symlink"
[ "$(stat -c %u "$CONFIG")" = "0" ] || fail "scanner-db.conf mora biti root-owned"

# shellcheck disable=SC1090
source "$CONFIG"

# safe_path: odbija prazne/relativne putanje, nedopuštene znakove i bilo koji
# ".." segment doslovno u stringu, PA dodatno (ako put postoji na disku)
# razriješi simboličke poveznice preko `readlink -f` i istu blokada-listu
# provjeri i nad RAZRIJEŠENOM putanjom — string koji sam po sebi izgleda
# bezazleno (npr. kroz lanac symlinkova) ne smije proći ako stvarno vodi u
# jedan od zaštićenih sistemskih direktorija.
safe_path() {
  local value="$1" resolved
  [ -n "$value" ] || fail "prazna putanja"
  case "$value" in /*) ;; *) fail "putanja nije apsolutna: $value" ;; esac
  [[ "$value" =~ ^/[A-Za-z0-9._/-]+$ ]] || fail "nedopušten znak u putanji: $value"
  case "/$value/" in *"/../"*) fail "putanja sadrži '..': $value" ;; esac
  case "$value" in /|/root|/home|/var|/usr|/etc|/tmp) fail "preširoka putanja: $value" ;; esac
  if [ -e "$value" ]; then
    resolved="$(readlink -f -- "$value")" || fail "putanju nije moguće razriješiti: $value"
    case "$resolved" in /|/root|/home|/var|/usr|/etc|/tmp) fail "preširoka putanja (nakon razrješenja symlinkova): $value -> $resolved" ;; esac
  fi
}

# require_marker: prije nego se povjeri "ovaj direktorij je stvarno naš i smije
# se obrisati", provjeri da sadrži datoteku s očekivanim, prepoznatljivim
# sadržajem. Radi na SVAKOJ postojećoj instalaciji bez ikakve migracije, jer
# koristi datoteke koje već postoje na svakom radnom Scanneru (version.php,
# ioc_scan.sh) — ne novi marker koji bi trebalo naknadno dodati.
require_marker() {
  local dir="$1" check_file="$2" needle="$3" label="$4"
  [ -d "$dir" ] || return 0
  [ -f "$dir/$check_file" ] \
    || fail "$label ($dir) ne izgleda kao 8Core Scanner instalacija — nedostaje $check_file. Brisanje odbijeno radi sigurnosti."
  grep -qF -- "$needle" "$dir/$check_file" 2>/dev/null \
    || fail "$label ($dir) ne izgleda kao 8Core Scanner instalacija — $check_file nema očekivani sadržaj. Brisanje odbijeno radi sigurnosti."
}

# require_naming_hint: za direktorije bez pouzdanog "koda unutra" markera
# (karantena, backup — mogu legitimno biti prazni), tražimo barem da putanja
# nosi projektnu oznaku ("8core"/"scanner"), kao jeftinu branu protiv očito
# krive vrijednosti u configu (npr. slučajno postavljeno na tuđi direktorij).
require_naming_hint() {
  local dir="$1" label="$2"
  [ -n "$dir" ] || return 0
  case "$(printf '%s' "$dir" | tr '[:upper:]' '[:lower:]')" in
    *8core*|*scanner*) ;;
    *) fail "$label ($dir) ne sadrži prepoznatljivu 8Core Scanner oznaku u putanji. Brisanje odbijeno radi sigurnosti — preimenuj direktorij ili provjeri config." ;;
  esac
}

WEB_APP_PATH="${WEB_APP_PATH:-}"
QUARANTINE_BASE_PATH="${QUARANTINE_BASE_PATH:-}"
LOG_PATH="${LOG_PATH:-$ROOT_ENGINE_PATH/logs}"
ENGINE_SOURCE_PATH="${ENGINE_SOURCE_PATH:-$(dirname "$WEB_APP_PATH")/8core_scanner}"
UPDATE_BACKUP_PATH="${UPDATE_BACKUP_PATH:-/var/backups/8core-scanner}"
for path in "$ROOT_ENGINE_PATH" "$WEB_APP_PATH" "$QUARANTINE_BASE_PATH" "$LOG_PATH" "$ENGINE_SOURCE_PATH" "$UPDATE_BACKUP_PATH"; do safe_path "$path"; done

require_marker "$WEB_APP_PATH" "includes/version.php" "SCANNER_VERSION" "web aplikacija"
require_marker "$ROOT_ENGINE_PATH" "ioc_scan.sh" "8Core IOC Scanner" "root engine"
[ "$ENGINE_SOURCE_PATH" = "$ROOT_ENGINE_PATH" ] || require_marker "$ENGINE_SOURCE_PATH" "ioc_scan.sh" "8Core IOC Scanner" "engine source"
require_naming_hint "$QUARANTINE_BASE_PATH" "karantena"
[ "$UPDATE_BACKUP_PATH" = "$ROOT_ENGINE_PATH" ] || require_naming_hint "$UPDATE_BACKUP_PATH" "backup direktorij"

echo "Trajno uklanjanje 8Core Scannera..."

# Baza je instalacijski resurs Scannera; uklanja se cijela konfigurirana baza.
if command -v mysql >/dev/null 2>&1 && [ -n "${DB_NAME:-}" ]; then
  [[ "$DB_NAME" =~ ^[A-Za-z0-9_$-]+$ ]] || fail "nevaljan naziv baze"
  MYSQL_DEFAULTS="$(mktemp /tmp/8core-uninstall-mysql.XXXXXX)"
  trap 'rm -f -- "${MYSQL_DEFAULTS:-}"' EXIT
  chmod 600 "$MYSQL_DEFAULTS"
  {
    echo '[client]'
    printf 'host=%s\nuser=%s\npassword=%s\n' "${DB_HOST:-localhost}" "${DB_USER:-}" "${DB_PASS:-}"
  } > "$MYSQL_DEFAULTS"
  mysql --defaults-extra-file="$MYSQL_DEFAULTS" -e "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
  rm -f -- "$MYSQL_DEFAULTS"
  trap - EXIT
else
  fail "mysql CLI ili DB_NAME nije dostupan; baza nije uklonjena"
fi

rm -f -- /etc/cron.d/8core-scanner-worker /etc/cron.d/8core-scanner-mail
rm -f -- /usr/local/sbin/8core-scanner-log-reader /usr/local/sbin/8core-scanner-file-reader
rm -f -- /etc/sudoers.d/8core-scanner-log
rm -f -- /etc/8core-scanner/update-public.pem
rmdir /etc/8core-scanner 2>/dev/null || true
rm -f -- /var/run/8core-scanner-worker.lock

# Sadržaj se uklanja posljednji; pokrenuta skripta ostaje u memoriji do završetka.
rm -rf -- "$QUARANTINE_BASE_PATH"
[ "$UPDATE_BACKUP_PATH" = "$ROOT_ENGINE_PATH" ] || rm -rf -- "$UPDATE_BACKUP_PATH"
[ "$LOG_PATH" = "$ROOT_ENGINE_PATH/logs" ] || rm -rf -- "$LOG_PATH"
rm -rf -- "$WEB_APP_PATH"
[ "$ENGINE_SOURCE_PATH" = "$ROOT_ENGINE_PATH" ] || rm -rf -- "$ENGINE_SOURCE_PATH"
rm -rf -- "$ROOT_ENGINE_PATH"

echo "8Core Scanner je potpuno uklonjen."
