79 lines
3.4 KiB
Bash
Executable file
79 lines
3.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# bank-helper — BastionGuard™
|
|
# Copia banks.json nella directory di sistema e aggiorna version.txt.
|
|
#
|
|
# Può essere invocato in due modi:
|
|
# 1. Direttamente da utente: bank-helper <sorgente> <url>
|
|
# → si auto-rilancia con sudo se non è già root
|
|
# 2. Tramite sudo (da BankPage): sudo bank-helper <sorgente> <url>
|
|
# → esegue direttamente senza dialog
|
|
#
|
|
# Argomenti:
|
|
# $1 percorso assoluto del file banks.json sorgente (utente)
|
|
# $2 URL da cui è stata scaricata la lista (scritto in version.txt)
|
|
|
|
set -euo pipefail
|
|
|
|
readonly DEST_DIR="/usr/share/BastionGuard/data/bank"
|
|
readonly DEST_FILE="${DEST_DIR}/banks.json"
|
|
readonly VERSION_FILE="${DEST_DIR}/version.txt"
|
|
|
|
# ── Auto-elevazione ──────────────────────────────────────────────────────────
|
|
# Se non siamo root, ci rilanciamo con sudo (che grazie al sudoers non
|
|
# chiederà password). Questo permette di invocare bank-helper direttamente
|
|
# dal terminale senza dover premettere "sudo".
|
|
if [[ $EUID -ne 0 ]]; then
|
|
exec sudo /usr/bin/bank-helper "$@"
|
|
fi
|
|
|
|
# ── Validazione argomenti ────────────────────────────────────────────────────
|
|
if [[ $# -ne 2 ]]; then
|
|
echo "Utilizzo: bank-helper <percorso_banks_json> <url_sorgente>" >&2
|
|
exit 1
|
|
fi
|
|
|
|
SOURCE_FILE="$1"
|
|
SOURCE_URL="$2"
|
|
|
|
# ── Controlli di sicurezza ───────────────────────────────────────────────────
|
|
# 1. Il file sorgente deve esistere ed essere un file regolare.
|
|
if [[ ! -f "${SOURCE_FILE}" ]]; then
|
|
echo "bank-helper: file sorgente non trovato: ${SOURCE_FILE}" >&2
|
|
exit 2
|
|
fi
|
|
|
|
# 2. Il percorso sorgente deve stare dentro la home dell'utente reale.
|
|
# SUDO_USER è impostato da sudo; se siamo root diretto usiamo LOGNAME/USER.
|
|
REAL_USER="${SUDO_USER:-${LOGNAME:-${USER:-}}}"
|
|
if [[ -z "${REAL_USER}" ]] || [[ "${REAL_USER}" == "root" ]]; then
|
|
# Fallback: accettiamo qualsiasi percorso se lanciato come root diretto
|
|
# (caso d'uso: script di packaging/CI).
|
|
true
|
|
else
|
|
REAL_HOME=$(getent passwd "${REAL_USER}" | cut -d: -f6)
|
|
RESOLVED_SOURCE=$(realpath -e "${SOURCE_FILE}" 2>/dev/null || true)
|
|
|
|
if [[ -z "${RESOLVED_SOURCE}" ]] || \
|
|
[[ "${RESOLVED_SOURCE}" != "${REAL_HOME}/"* ]]; then
|
|
echo "bank-helper: percorso sorgente non autorizzato: ${SOURCE_FILE}" >&2
|
|
exit 4
|
|
fi
|
|
fi
|
|
|
|
# 3. Il file deve sembrare JSON (primo byte '{').
|
|
FIRST_CHAR=$(head -c 1 "${SOURCE_FILE}")
|
|
if [[ "${FIRST_CHAR}" != "{" ]]; then
|
|
echo "bank-helper: il file sorgente non sembra JSON valido." >&2
|
|
exit 5
|
|
fi
|
|
|
|
# ── Copia ────────────────────────────────────────────────────────────────────
|
|
install -d -m 755 "${DEST_DIR}"
|
|
install -m 644 "${SOURCE_FILE}" "${DEST_FILE}"
|
|
|
|
# ── version.txt ──────────────────────────────────────────────────────────────
|
|
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
|
|
printf "URL: %s\nAggiornato il: %s\n" "${SOURCE_URL}" "${TIMESTAMP}" \
|
|
> "${VERSION_FILE}"
|
|
|
|
exit 0
|