tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Definitions

⎇ 2907e74a8f41b07296102c14adc378cea53f57f9 recipes/arje-polkit-compat.toml TOML · 101 lines · 6.3 KB History raw

feat(recetas): pata y churay entran al catálogo — «no hay pata» era que no existía el paquete 5ba9b5365 · Sergio ·

1# arje-polkit-compat — el shim de `org.freedesktop.PolicyKit1.Authority` del fractal.
2#
3# POR QUÉ HACE FALTA, y es un diagnóstico que su propio autor ya había escrito: el comentario del
4# crate dice literalmente «apps que usan polkit bloquean en `CheckAuthorization` si no responde
5# nadie». Eso es exactamente lo que pasaba al arrancar la sesión GNOME:
6#
7#   !! bus: org.freedesktop.Accounts NO apareció en 10s
8#   !! bus: org.freedesktop.UPower   NO apareció en 10s
9#   nombres en el bus: org.freedesktop.DBus, org.freedesktop.login1, :1.0, :1.1, :1.2
10#
11# Los dos daemons estaban CONECTADOS al bus (`:1.x`) pero sin adquirir su nombre: se quedaban en
12# `polkit_authority_get_sync()` esperando a un `org.freedesktop.PolicyKit1` que no existía. Y como no
13# adquirían el nombre, gnome-shell esperaba 25 s a cada uno.
14#
15# **Ese dato no se sacó del log del daemon sino de la LISTA DE NOMBRES DEL BUS**: una conexión anónima
16# sin nombre bien conocido dice «arrancó y no llegó a pedirlo», que es distinto de «no arrancó» y de
17# «lo pidió y se lo negaron». Vale para cualquier servicio D-Bus que parezca colgado.
18#
19# POR QUÉ ESTE SHIM Y NO EL polkitd DE VERDAD: nuestra receta `polkit` va con `-Dlibs-only=true` —el
20# bloque `if not libs_only` es justo el que pide expat y duktape— y la decisión estaba tomada desde
21# entonces: **el demonio lo pone arje**. La autorización real del fractal no es polkit sino SO_PEERCRED
22# + capability grants sobre el bus interno; polkit es sólo la interfaz que el escritorio espera
23# encontrar.
24#
25# ⚠ POSTURA DE SEGURIDAD, explícita porque no es un detalle: este shim responde
26# `is_authorized = true` a TODO, y deja traza en el log de qué se pidió. Es la decisión que arje ya
27# había tomado —el fractal es un sistema confiado y la puerta está en otro lado—, no algo que esta
28# receta introduzca. Su propio comentario marca el camino de producción: que `CheckAuthorization` pida
29# un token al grafo y devuelva el resultado. Mientras eso no exista, **cualquier cliente de polkit en
30# esta distro está autorizado**, y quien lea esta receta tiene que saberlo.
31#
32# YA NO ES HUB-ONLY (2026-09-14): la fuente pasó a `https://git.tawasuyu.net/…`, que el gitea sirve
33# PÚBLICO y sin credencial. Antes apuntaba a `gitea@git.tawasuyu.net` por SSH y el worker —que no
34# tiene ni debe tener esa clave— moría con «access rights». La URL es locator y NO entra en
35# `hash_inputs` (ADR 0013): el cambio se hizo con control y NINGÚN ArtifactHash se movió.
36name    = "arje-polkit-compat"
37version = "0.0.1"
38license = "MIT"
39
40[source]
41# Mismo commit y misma rama que arje-logind-compat: `selfhost/arje-zero-attest-lockfile` es la única
42# que versiona el `Cargo.lock` de la raíz, sin el cual el vendoreo `--locked` no es reproducible.
43repo   = "https://git.tawasuyu.net/tawasuyu/tawasuyu.git"
44commit = "619431cac9753cd55d0f9e2d99ff8efe7fab651b"
45# El monorepo commitea su propio `vendor/` (la copia parcheada de smithay que mirada necesita) y el
46# `cargo vendor` de takana lo pisaría. Ver [[takana-cargo-vendor-clobbers-project-vendor]].
47cargo_vendor_dir = ".hammer-cargo-vendor"
48
49[build]
50compiler = "zig-cc"
51target   = "x86_64-linux-musl"
52link     = "static"
53flags    = ["-p", "arje-compat", "--bin", "arje-polkit-compat"]
54
55# ── La POLÍTICA D-Bus viaja con el artefacto ───────────────────────────────────────────────────
56# Misma razón que en arje-logind-compat: un servicio que no puede adueñarse de su nombre no es un
57# servicio, así que su política es parte de lo que el paquete promete. Hasta hoy la escribía el script
58# de la imagen de GNOME, con lo cual el shim existía para las otras imágenes y no servía en ellas.
59#
60# ⚠ EL NOMBRE `zz-` NO ES DECORATIVO. A diferencia de login1, acá el nombre YA TIENE política: la trae
61# el artefacto de `polkit`, y permite `own` sólo al usuario **polkitd** — este shim corre como root, así
62# que con ella sola se lo niegan. dbus lee `system.d` en ORDEN ALFABÉTICO y las reglas posteriores
63# ganan, de modo que un fichero que ordene después AÑADE el permiso sin descartar el resto de la
64# política de upstream (que además trae las reglas de `AuthenticationAgent`). Reescribir la de polkit
65# habría sido pisar un artefacto sellado.
66[build.phases]
67install = '''
68set -e
69mkdir -p /out/usr/bin /out/usr/share/dbus-1/system.d
70find target/release -maxdepth 1 -type f -perm -100 -exec cp {} /out/usr/bin/ \;
71cat > /out/usr/share/dbus-1/system.d/zz-arje-polkit-compat.conf <<'XML'
72<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
73 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
74<!-- Añade a la política de polkit el permiso que el shim del fractal necesita: la de upstream sólo
75     deja adueñarse del nombre al usuario `polkitd`, y arje-polkit-compat corre como root. -->
76<busconfig>
77  <policy user="root">
78    <allow own="org.freedesktop.PolicyKit1"/>
79  </policy>
80  <policy context="default">
81    <allow send_destination="org.freedesktop.PolicyKit1"/>
82    <allow receive_sender="org.freedesktop.PolicyKit1"/>
83  </policy>
84</busconfig>
85XML
86'''
87
88# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
89# ⚠ EL `argv` ESPERA AL BUS ANTES DEL `exec`, Y NO ES UNA MAÑA DE ESTA RECETA. arje ordena el
90# arranque por capacidades (orden topológico real), pero eso ordena el SPAWN, no el ESTAR LISTO: no
91# existe primitiva «esperá a que aparezca este socket» (DE-SYSTEMD-A-ARJE.md §13 lo lista como hueco
92# abierto). Sin la espera, este daemon puede arrancar antes de que dbus-daemon escuche y quedarse en
93# modo idle sin registrar nunca su nombre — un fallo que NO se ve: el proceso vive, el bus no lo
94# tiene. Mientras el hueco siga abierto la espera va DENTRO del card, a la vista en el argv y no
95# escondida en un wrapper, para que se pueda contar cuántos servicios la están pagando.
96[[service]]
97label   = "polkit-compat"
98id      = "01HQAR53D4M2NBV8KZTYXFQA22"
99exec    = "/bin/busybox"
100argv    = ["sh", "-c", "i=0; while [ ! -S /run/dbus/system_bus_socket ] && [ $i -lt 100 ]; do i=$((i+1)); sleep 0.2; done; exec /usr/bin/arje-polkit-compat"]
101restart = { initial_ms = 500, max_ms = 20000 }