Files
hammer/recipes/arje-polkit-compat.toml
T
sergioandClaude Opus 5 2430528c16 dbus: las políticas de login1 y PolicyKit1 viajan en su ARTEFACTO, no en el script de imagen
Cierra un TODO que el propio script tenía escrito («esto pertenece al artefacto de
arje-logind-compat, no a la imagen») y que estaba bien puesto: **un servicio que no puede
adueñarse de su nombre no es un servicio**, así que su política D-Bus es parte de lo que el
paquete promete, igual que el binario. Con la política en el script de UNA imagen,
cualquier otra —metal, KDE, mirada— se llevaba el daemon y no podía usarlo.

arje-logind-compat b3:b4795829 · arje-polkit-compat b3:6c82f44b. Radio de las dos: 0.

**Y la comprobación que reemplaza a escribirlas atrapó un bug de verdad en el primer
intento.** Mover algo a un artefacto sólo es una mejora si se NOTA cuando falta, así que el
script pasó de ESCRIBIR los .conf a EXIGIRLOS. Falló al toque: `✗ falta
org.freedesktop.login1.conf`. Causa — el script inyectaba **sólo el binario** del artefacto
(`install -Dm755 .../usr/bin/...`), así que el .conf existía en el store y nunca llegaba a
la imagen. Sin esa comprobación habría sido el fallo tardío de siempre: daemon que arranca,
no adquiere el nombre, y 25s de espera por servicio sin decir por qué.

Verificado de punta a punta con las políticas viniendo del artefacto: los cuatro nombres
del bus arriba (login1, PolicyKit1, Accounts, UPower) y el audio intacto.

El `zz-` de la de polkit no es decorativo y queda explicado en su receta: a diferencia de
login1, ese nombre YA tiene política —la trae el artefacto de polkit— y permite `own` sólo
al usuario polkitd; dbus lee system.d en orden alfabético y las reglas posteriores ganan, así
que un fichero que ordene después AÑADE el permiso sin descartar el resto de upstream.

ColorManager sigue sin aparecer: es lo de colord, ya diagnosticado hasta dónde llega y
fuera del alcance de este cambio.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 17:18:42 -04:00

85 lines
5.0 KiB
TOML

# arje-polkit-compat — el shim de `org.freedesktop.PolicyKit1.Authority` del fractal.
#
# POR QUÉ HACE FALTA, y es un diagnóstico que su propio autor ya había escrito: el comentario del
# crate dice literalmente «apps que usan polkit bloquean en `CheckAuthorization` si no responde
# nadie». Eso es exactamente lo que pasaba al arrancar la sesión GNOME:
#
# !! bus: org.freedesktop.Accounts NO apareció en 10s
# !! bus: org.freedesktop.UPower NO apareció en 10s
# nombres en el bus: org.freedesktop.DBus, org.freedesktop.login1, :1.0, :1.1, :1.2
#
# Los dos daemons estaban CONECTADOS al bus (`:1.x`) pero sin adquirir su nombre: se quedaban en
# `polkit_authority_get_sync()` esperando a un `org.freedesktop.PolicyKit1` que no existía. Y como no
# adquirían el nombre, gnome-shell esperaba 25 s a cada uno.
#
# **Ese dato no se sacó del log del daemon sino de la LISTA DE NOMBRES DEL BUS**: una conexión anónima
# sin nombre bien conocido dice «arrancó y no llegó a pedirlo», que es distinto de «no arrancó» y de
# «lo pidió y se lo negaron». Vale para cualquier servicio D-Bus que parezca colgado.
#
# POR QUÉ ESTE SHIM Y NO EL polkitd DE VERDAD: nuestra receta `polkit` va con `-Dlibs-only=true` —el
# bloque `if not libs_only` es justo el que pide expat y duktape— y la decisión estaba tomada desde
# entonces: **el demonio lo pone arje**. La autorización real del fractal no es polkit sino SO_PEERCRED
# + capability grants sobre el bus interno; polkit es sólo la interfaz que el escritorio espera
# encontrar.
#
# ⚠ POSTURA DE SEGURIDAD, explícita porque no es un detalle: este shim responde
# `is_authorized = true` a TODO, y deja traza en el log de qué se pidió. Es la decisión que arje ya
# había tomado —el fractal es un sistema confiado y la puerta está en otro lado—, no algo que esta
# receta introduzca. Su propio comentario marca el camino de producción: que `CheckAuthorization` pida
# un token al grafo y devuelva el resultado. Mientras eso no exista, **cualquier cliente de polkit en
# esta distro está autorizado**, y quien lea esta receta tiene que saberlo.
#
# HUB-ONLY, como toda receta con fuente tawasuyu: el clone va a `gitea@git.tawasuyu.net` por el puerto
# 22 y la gitea escucha en :2345; el worker efímero es secretless por diseño y recibe
# `Connection refused`. Se muele en el hub. Ver [[rootfs-laptop-worker-divergen]].
name = "arje-polkit-compat"
version = "0.0.1"
[source]
# Mismo commit y misma rama que arje-logind-compat: `selfhost/arje-zero-attest-lockfile` es la única
# que versiona el `Cargo.lock` de la raíz, sin el cual el vendoreo `--locked` no es reproducible.
repo = "gitea@git.tawasuyu.net:tawasuyu/tawasuyu.git"
commit = "98db584fd28d9ff2bf34c9cf7d7db2e1de0b3fd0"
# El monorepo commitea su propio `vendor/` (la copia parcheada de smithay que mirada necesita) y el
# `cargo vendor` de hammer lo pisaría. Ver [[hammer-cargo-vendor-clobbers-project-vendor]].
cargo_vendor_dir = ".hammer-cargo-vendor"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = ["-p", "arje-compat", "--bin", "arje-polkit-compat"]
# ── La POLÍTICA D-Bus viaja con el artefacto ───────────────────────────────────────────────────
# Misma razón que en arje-logind-compat: un servicio que no puede adueñarse de su nombre no es un
# servicio, así que su política es parte de lo que el paquete promete. Hasta hoy la escribía el script
# de la imagen de GNOME, con lo cual el shim existía para las otras imágenes y no servía en ellas.
#
# ⚠ EL NOMBRE `zz-` NO ES DECORATIVO. A diferencia de login1, acá el nombre YA TIENE política: la trae
# el artefacto de `polkit`, y permite `own` sólo al usuario **polkitd** — este shim corre como root, así
# que con ella sola se lo niegan. dbus lee `system.d` en ORDEN ALFABÉTICO y las reglas posteriores
# ganan, de modo que un fichero que ordene después AÑADE el permiso sin descartar el resto de la
# política de upstream (que además trae las reglas de `AuthenticationAgent`). Reescribir la de polkit
# habría sido pisar un artefacto sellado.
[build.phases]
install = '''
set -e
mkdir -p /out/usr/bin /out/usr/share/dbus-1/system.d
find target/release -maxdepth 1 -type f -perm -100 -exec cp {} /out/usr/bin/ \;
cat > /out/usr/share/dbus-1/system.d/zz-arje-polkit-compat.conf <<'XML'
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<!-- Añade a la política de polkit el permiso que el shim del fractal necesita: la de upstream sólo
deja adueñarse del nombre al usuario `polkitd`, y arje-polkit-compat corre como root. -->
<busconfig>
<policy user="root">
<allow own="org.freedesktop.PolicyKit1"/>
</policy>
<policy context="default">
<allow send_destination="org.freedesktop.PolicyKit1"/>
<allow receive_sender="org.freedesktop.PolicyKit1"/>
</policy>
</busconfig>
XML
'''