Pedido del equipo de campo (Leo, 28-oct 12:10). Cada foto de un acta tiene «Tomar foto» (cámara) y «Elegir de la galería»; sección «Documentos» al final de toda acta para el documento terminado. /api/archivos acepta PDF, Word, Excel, ODT/ODS y PowerPoint revisando los primeros bytes; /api/adjunto con nosniff, descarga lo que no es foto, PDF o texto. Pruebas: tests-1028.sh (15) + 1027 (55) + 1023 (35) + campeón (25). Desplegado: páginas con rsync y backend con HUP a gunicorn (DESPLIEGUE A12). Lote 2026-10-28_actas-galeria-documentos. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013SfRSvDd335NPYEbBrDFGE
63 lines
3.5 KiB
Bash
Executable File
63 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Pruebas del 28-oct: documentos terminados en las actas (/api/archivos acepta PDF, Word, Excel…, con revisión del
|
|
# contenido) y cómo se sirven (/api/adjunto: PDF y fotos en el navegador, lo demás se descarga, nosniff).
|
|
# Arranca app.py con carpetas temporales. No toca el servidor.
|
|
# Uso: bash backend/tests-1028.sh <ruta-a-hbox-docs> [puerto]
|
|
set -u
|
|
REPO=${1:?ruta a hbox-docs}; PORT=${2:-8098}
|
|
T=$(mktemp -d); export ACTAS_DIR=$T/actas HTPASSWD_FILE=$T/htpasswd HTPASSWD_LOCK=$T/.lock SESION_COOKIE_INSEGURA=1 \
|
|
ACTAS_ADMINS=leo PORT ADJUNTOS_DIR=$T/adjuntos
|
|
mkdir -p $ACTAS_DIR $T/equipo $T/tareas $T/f
|
|
touch $T/htpasswd
|
|
python3 $REPO/backend/app.py > $T/app.log 2>&1 &
|
|
APP=$!; trap "kill $APP 2>/dev/null" EXIT; sleep 1.8
|
|
U="http://127.0.0.1:$PORT"
|
|
ok=0; fail=0
|
|
check() { if [[ "$3" == *"$2"* ]]; then ok=$((ok+1)); echo " ✓ $1"; else fail=$((fail+1)); echo " ✕ $1 — esperaba «$2», obtuve: ${3:0:220}"; fi; }
|
|
sube() { curl -s -H "X-Remote-User: jesush" -F tipo=instalacion-campo -F serie=HBOX5-E15 -F etiqueta=Documento -F "archivo=@$1" $U/api/archivos; }
|
|
|
|
# archivos de prueba
|
|
python3 - "$T/f" <<'EOF'
|
|
import sys, os, zipfile, io
|
|
d = sys.argv[1]
|
|
open(os.path.join(d, "hoja-firmada.pdf"), "wb").write(b"%PDF-1.4\n1 0 obj<<>>endobj\ntrailer<<>>\n%%EOF\n")
|
|
z = io.BytesIO(); zipfile.ZipFile(z, "w").writestr("word/document.xml", "<w:document/>")
|
|
open(os.path.join(d, "reporte.docx"), "wb").write(z.getvalue())
|
|
open(os.path.join(d, "conteo.xlsx"), "wb").write(z.getvalue())
|
|
open(os.path.join(d, "viejo.xls"), "wb").write(b"\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" + b"\0" * 64)
|
|
open(os.path.join(d, "falso.pdf"), "wb").write(b"<html><script>alert(1)</script></html>")
|
|
open(os.path.join(d, "pagina.html"), "wb").write(b"<html></html>")
|
|
open(os.path.join(d, "programa.exe"), "wb").write(b"MZ\x90\x00")
|
|
open(os.path.join(d, "captura.log"), "wb").write(b"$GNGGA,1,2,3\n")
|
|
EOF
|
|
|
|
echo "## documentos en /api/archivos"
|
|
R=$(sube $T/f/hoja-firmada.pdf); check "PDF se acepta" '"ok":true' "$R"
|
|
PDF=$(echo "$R" | python3 -c "import sys,json; print(json.load(sys.stdin)['archivos'][0]['ruta'])")
|
|
R=$(sube $T/f/reporte.docx); check "Word (.docx) se acepta" '"ok":true' "$R"
|
|
DOCX=$(echo "$R" | python3 -c "import sys,json; print(json.load(sys.stdin)['archivos'][0]['ruta'])")
|
|
check "Excel (.xlsx) se acepta" '"ok":true' "$(sube $T/f/conteo.xlsx)"
|
|
check "Excel viejo (.xls) se acepta" '"ok":true' "$(sube $T/f/viejo.xls)"
|
|
check "PDF falso (HTML con .pdf) se rechaza" 'no es un PDF' "$(sube $T/f/falso.pdf)"
|
|
check ".html se rechaza" 'n no permitida' "$(sube $T/f/pagina.html)"
|
|
check ".exe se rechaza" 'n no permitida' "$(sube $T/f/programa.exe)"
|
|
check "los logs siguen igual" '"ok":true' "$(sube $T/f/captura.log)"
|
|
|
|
echo "## cómo se sirven (/api/adjunto)"
|
|
H=$(curl -s -D - -o /dev/null -H "X-Remote-User: leo" "$U/api/adjunto?ruta=$PDF")
|
|
check "PDF abre en el navegador (inline)" 'inline' "$H"
|
|
check "PDF con su nombre original" 'hoja-firmada.pdf' "$H"
|
|
check "PDF con nosniff" 'nosniff' "$H"
|
|
check "PDF como application/pdf" 'application/pdf' "$H"
|
|
H=$(curl -s -D - -o /dev/null -H "X-Remote-User: leo" "$U/api/adjunto?ruta=$DOCX")
|
|
check "Word se descarga (attachment)" 'attachment' "$H"
|
|
check "Word con su nombre original" 'reporte.docx' "$H"
|
|
|
|
echo "## el expediente los lista"
|
|
E=$(curl -s -H "X-Remote-User: leo" "$U/api/unidad?serie=HBOX5-E15")
|
|
check "expediente cuenta 5 archivos (4 documentos + 1 log)" '"total_logs":5' "$E"
|
|
|
|
echo
|
|
echo "RESULTADO: $ok correctas · $fail fallidas · datos en $T"
|
|
[ $fail -eq 0 ]
|