# 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" license = "MIT" [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 takana lo pisaría. Ver [[takana-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' XML '''