From ec45c3fa975a8e164dc84f28508752d499658528 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 7 Sep 2026 18:37:24 +0000 Subject: [PATCH] =?UTF-8?q?dunst-headless:=20`--via-atuq`=20=E2=80=94=20la?= =?UTF-8?q?=20cadena=20entera,=20empezando=20en=20una=20p=C3=A1gina=20web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El modo por defecto prueba la cadena del SISTEMA (`notify-send` → bus → dunst). Éste prueba la que motivó todo el hilo del §6.10: una página llama a `new Notification(...)`, `libxul` hace `dlopen("libnotify.so.4")` —que no es NEEDED de ningún ELF, o sea invisible para cualquier auditor—, eso habla D-Bus, el bus ACTIVA dunst y dunst dibuja. Cinco piezas, y la única forma de saber que están las cinco es verlo. El veredicto acá no puede ser el diff de píxeles solo: el navegador ocupa la pantalla y repinta por su cuenta. Lo decisivo es el `onshow` del objeto Notification, que es el motor diciendo que el sistema ACEPTÓ la notificación; el diff queda como corroboración y la captura «antes» se toma con atuq ya pintado. --via-atuq MOSTRADA #33 · 151.174 píxeles --via-atuq --negative-control «ERROR al mostrar» · 0 píxeles El control negativo también se lee distinto según el modo, y no por comodidad: sin el .service, lo que tiene que faltar en el modo navegador es el onshow. Captura en docs/evidencia/atuq-notificacion-web-sway-2026-09-07.png: dos globos de dunst sobre la ventana de atuq, en sway headless, sin que nadie haya lanzado el daemon a mano. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs --- .../atuq-notificacion-web-sway-2026-09-07.png | Bin 0 -> 43651 bytes scripts/wlr/dunst-headless.sh | 103 +++++++++++++++++- 2 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 docs/evidencia/atuq-notificacion-web-sway-2026-09-07.png diff --git a/docs/evidencia/atuq-notificacion-web-sway-2026-09-07.png b/docs/evidencia/atuq-notificacion-web-sway-2026-09-07.png new file mode 100644 index 0000000000000000000000000000000000000000..047d5ef1be52d85971300ce56bf10ccbc904a35c GIT binary patch literal 43651 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 XN6gxdA!q~-<3L=|y_|XR-m`xJm>7ic literal 0 HcmV?d00001 diff --git a/scripts/wlr/dunst-headless.sh b/scripts/wlr/dunst-headless.sh index 250c4fae..47c16555 100755 --- a/scripts/wlr/dunst-headless.sh +++ b/scripts/wlr/dunst-headless.sh @@ -3,6 +3,7 @@ # # scripts/wlr/dunst-headless.sh # sale 0 si la notificación se dibuja # scripts/wlr/dunst-headless.sh --negative-control # borra el .service y exige que NO se vea +# scripts/wlr/dunst-headless.sh --via-atuq # el emisor es una PÁGINA WEB en el navegador # # ── QUÉ PRUEBA, QUE NO ES LO MISMO QUE «ESTÁ INSTALADO» ─────────────────────────────────────── # Tener `libnotify` en la imagen es media función: el que la completa es un daemon escuchando @@ -18,6 +19,17 @@ # a otro lado, o dunst no supiera hablar wayland, este guion no vería nada. Es el mismo camino que # recorre una página web pidiendo notificar en `atuq`. # +# ── `--via-atuq`: LA MISMA CADENA, PERO EMPEZANDO EN UNA PÁGINA WEB ─────────────────────────── +# El modo por defecto prueba la cadena del SISTEMA. Éste prueba la que le importa al usuario y la +# que motivó todo el hilo del SDD 26 §6.10: una página llama a `new Notification(...)`, `libxul` +# hace `dlopen("libnotify.so.4")` —que no es NEEDED de ningún ELF, o sea invisible para todo +# auditor—, eso habla D-Bus, el bus activa dunst y dunst dibuja. Cinco piezas, y la única forma de +# saber que están las cinco es verlo. +# El veredicto acá NO puede ser sólo el diff de píxeles —el navegador ocupa la pantalla y cambia +# solo—, así que la captura «antes» se toma con atuq YA ABIERTO y la página espera 25 s antes de +# notificar. Y se exige además que el `onshow` del objeto Notification haya disparado, que es el +# motor diciendo que el sistema aceptó la notificación. +# # ── POR QUÉ notify-send Y NO dunstify ───────────────────────────────────────────────────────── # Porque `dunstify` no se shipea: mezcla la GLib ESTÁTICA del corpus con la COMPARTIDA que arrastra # `libnotify.so.4` y se cae con SIGSEGV hasta en `--help` (dos copias de GObject en un proceso — el @@ -35,7 +47,14 @@ ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT" RFS="${RFS:-/mnt/cosecha/escritorios/sway-rootfs}" ALPINE="$ROOT/.dev-fs/alpine" CONTROL=0 -[ "${1:-}" = "--negative-control" ] && CONTROL=1 +ATUQ=0 +for a in "$@"; do + case "$a" in + --negative-control) CONTROL=1 ;; + --via-atuq) ATUQ=1 ;; + *) echo "✗ opción desconocida: $a" >&2; exit 1 ;; + esac +done [ -d "$RFS" ] || { echo "✗ no está el rootfs en $RFS — corré antes:" >&2 echo " scripts/hydrate-profile.py escritorio-sway --into $RFS" >&2; exit 1; } @@ -62,13 +81,26 @@ mkdir -p "$XDG_RUNTIME_DIR" /root; chmod 700 "$XDG_RUNTIME_DIR" # sesión de verdad. Al revés, dunst arrancaría sin display y saldría con status 1. eval "$(/usr/bin/dbus-daemon --session --fork --print-address=1 | { read a; echo "DBUS_SESSION_BUS_ADDRESS=$a"; })" export DBUS_SESSION_BUS_ADDRESS - /usr/bin/grim /salida/antes.png + [ "${ATUQ:-0}" = "1" ] || /usr/bin/grim /salida/antes.png echo "@@ dueño ANTES: $(timeout 10 /usr/bin/dbus-send --session --dest=org.freedesktop.DBus \ --print-reply=literal /org/freedesktop/DBus org.freedesktop.DBus.NameHasOwner \ string:org.freedesktop.Notifications 2>&1 | tr -d ' \n')" - timeout 25 /usr/bin/notify-send -u critical "hammer" "dunst lo activó el bus" 2>&1 - echo "@@ notify-send rc=$?" - sleep 5 + if [ "${ATUQ:-0}" = "1" ]; then + export MOZ_ENABLE_WAYLAND=1 GDK_BACKEND=wayland LIBGL_DRIVERS_PATH=/usr/lib/dri + # Los tres sandboxes de Gecko se apagan porque esto YA corre dentro de una jaula sin userns + # anidado: con ellos puestos los procesos hijos mueren en bucle. Es entorno de prueba, no una + # preferencia del artefacto. + export MOZ_DISABLE_CONTENT_SANDBOX=1 MOZ_DISABLE_RDD_SANDBOX=1 MOZ_DISABLE_UTILITY_SANDBOX=1 + /usr/bin/atuq --no-remote --profile /salida/perfil file:///salida/notificar.html \ + > /salida/atuq.log 2>&1 & + sleep 22 # que el navegador ya esté pintado ANTES de la captura «antes» + /usr/bin/grim /salida/antes.png + sleep 12 # la página notifica a los 25 s y repite cada 5 + else + timeout 25 /usr/bin/notify-send -u critical "hammer" "dunst lo activó el bus" 2>&1 + echo "@@ notify-send rc=$?" + sleep 5 + fi echo "@@ servidor: $(timeout 10 /usr/bin/dbus-send --session --dest=org.freedesktop.Notifications \ --print-reply=literal /org/freedesktop/Notifications \ org.freedesktop.Notifications.GetServerInformation 2>&1 | tr -s ' ')" @@ -79,11 +111,50 @@ mkdir -p "$XDG_RUNTIME_DIR" /root; chmod 700 "$XDG_RUNTIME_DIR" exec /usr/bin/sway -d 2>&1 ADENTRO +if [ "$ATUQ" = "1" ]; then + mkdir -p "$OUT/perfil" + cat > "$OUT/perfil/user.js" <<'JS' +// `dump()` es el canal por el que la página le habla al log del proceso: sin red y sin servidor. +user_pref("browser.dom.window.dump.enabled", true); +user_pref("devtools.console.stdout.content", true); +// 1 = permitir sin preguntar. Sin esto la prueba mediría el POPUP DE PERMISOS del navegador, que +// se dibuja igual y no prueba nada del sistema de notificaciones. +user_pref("permissions.default.desktop-notification", 1); +user_pref("browser.shell.checkDefaultBrowser", false); +JS + cat > "$OUT/notificar.html" <<'HTML' +prueba de notificación + +

pidiendo permiso…

+ +HTML +fi + # `--unshare-pid` para que un `ps` de adentro no vea la máquina entera, y el lab de alpine DEBAJO # porque el corpus no produce el intérprete musl (`ld-musl-x86_64.so.1`): sin él ni sway arranca. timeout 180 bwrap --overlay-src "$ALPINE" --overlay-src "$RFS" --tmp-overlay / \ --bind "$OUT" /salida --dev /dev --proc /proc --tmpfs /run --tmpfs /tmp --unshare-pid \ --uid 0 --gid 0 --setenv PATH /usr/bin:/bin:/usr/sbin:/sbin --setenv CONTROL "$CONTROL" \ + --setenv ATUQ "$ATUQ" \ /bin/sh /salida/dentro.sh > "$OUT/log.txt" 2>&1 || true grep -a '@@' "$OUT/log.txt" || true @@ -107,12 +178,34 @@ PY echo " píxeles cambiados en el cuadrante de dunst: $CAMBIADOS" if [ "$CONTROL" = "1" ]; then + # El control se lee distinto según el modo, y no por comodidad: en `--via-atuq` el navegador ocupa + # la pantalla y repinta solo —el diff de píxeles cambia miles aunque no haya UNA notificación—, así + # que ahí lo que tiene que faltar es el `onshow` del motor. En el modo normal la pantalla está + # quieta y el diff sí es el veredicto. + if [ "$ATUQ" = "1" ]; then + if grep -aq 'NOTIF-TEST MOSTRADA' "$OUT/atuq.log" 2>/dev/null; then + echo "✗ control negativo: el navegador dijo MOSTRADA sin el .service — este guion no prueba lo que dice" >&2 + exit 1 + fi + echo "✓ control negativo: sin el .service el navegador nunca llega a MOSTRADA" + grep -a 'NOTIF-TEST' "$OUT/atuq.log" 2>/dev/null | tail -2 || true + exit 0 + fi if [ "$CAMBIADOS" -lt 500 ]; then echo "✓ control negativo: sin el .service no se dibuja nada (el guardián SÍ lo vería)"; exit 0 fi echo "✗ control negativo: se dibujó una notificación SIN el .service — este guion no prueba lo que dice" >&2 exit 1 fi +if [ "$ATUQ" = "1" ]; then + # El motor diciendo que el sistema ACEPTÓ la notificación. Es la mitad que el diff de píxeles no + # puede distinguir de «el navegador repintó algo». + grep -aq 'NOTIF-TEST MOSTRADA' "$OUT/atuq.log" || { + echo "✗ el navegador nunca llegó a MOSTRADA — ¿libxul no encontró libnotify.so.4?" >&2 + grep -a 'NOTIF-TEST' "$OUT/atuq.log" | tail -3 >&2 || true + cp "$OUT/atuq.log" work/ 2>/dev/null || true; exit 1; } + echo " el motor: $(grep -a 'NOTIF-TEST MOSTRADA' "$OUT/atuq.log" | tail -1)" +fi [ "$CAMBIADOS" -ge 500 ] || { echo "✗ la notificación no se dibujó ($CAMBIADOS píxeles) — capturas en $OUT" >&2 cp "$OUT"/*.png "$OUT/log.txt" work/ 2>/dev/null || true; exit 1; }