#!/usr/bin/env bash
# onx-clamav-read-file — tespit edilen/karantinadaki bir dosyanın içeriğini (boyut limitli) döndür.
# input:  {path, max_bytes}
# output: {path, size, truncated, binary, content}
source "$(dirname "$0")/_lib/common.sh"
require_root
require_cmd realpath
onx_json_input
FILE="$(onx_json_field path '')"
MAX="$(onx_json_field max_bytes '65536')"
[[ -n "$FILE" ]] || onx_die 1 "path required"
[[ "$MAX" =~ ^[0-9]+$ ]] || MAX=65536
# [[ ]] kullan: set -e altında koşul false olunca script ölmez ('&&' liste güvenli ama bu daha açık).
[[ "$MAX" -gt 262144 ]] && MAX=262144
[[ "$MAX" -lt 1 ]] && MAX=65536
# Yol allowlist (orijinal konumlar + karantina dizini)
case "$FILE" in /home/*|/var/www/*|/tmp/*|/var/lib/onoxsoft/quarantine/*) : ;; *) onx_die 1 "path not allowed" ;; esac
FILE="$(realpath -e "$FILE" 2>/dev/null)" || onx_die 2 "file not found"
case "$FILE" in /home/*|/var/www/*|/tmp/*|/var/lib/onoxsoft/quarantine/*) : ;; *) onx_die 1 "path not allowed (resolved)" ;; esac
[[ -f "$FILE" ]] || onx_die 2 "not a regular file"
SIZE="$(stat -c %s -- "$FILE" 2>/dev/null || echo 0)"
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT
head -c "$MAX" -- "$FILE" > "$TMP" 2>/dev/null || onx_die 3 "read failed"
if (( SIZE > MAX )); then TRUNC=true; else TRUNC=false; fi
# NUL byte sayısı > 0 ise binary say (içerik döndürme). bash NUL'u değişkende tutamaz —
# `grep $'\x00'` BOŞ desene dönüşüp HER dosyayı binary işaretliyordu. tr+wc ile NUL say (taşınabilir).
NULS="$(LC_ALL=C tr -dc '\000' < "$TMP" 2>/dev/null | wc -c | tr -d ' ')"
if [ "${NULS:-0}" -gt 0 ]; then
    onx_json_out path "$FILE" size "$SIZE" truncated "$TRUNC" binary true content ""
else
    CONTENT="$(cat "$TMP")"
    onx_json_out path "$FILE" size "$SIZE" truncated "$TRUNC" binary false content "$CONTENT"
fi
