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 Sutichaykuna

⎇ main recipes/atuq/atuq.cfg 133 siq'ikuna · 9.3 KB Ñawpa willay ch'uya

feat(atuq): la boveda de la suite guarda las contrasenas, y el gestor de Gecko se aparta 6f0ba974c · sergio ·

1// ⚠ LA PRIMERA LÍNEA DE UN FICHERO AUTOCONFIG SE IGNORA — SIEMPRE, POR DISEÑO.
2// El parser de Gecko salta la línea 1 sin mirarla (herencia del formato de Netscape). Si acá
3// hubiera código en vez de este comentario, no correría y no habría ningún error: el fallo más caro
4// de este fichero es el que no dice nada. Por eso la línea 1 es, deliberadamente, un comentario.
5
6// ── PREFS DE FÁBRICA ───────────────────────────────────────────────────────────────────────────
7// `defaultPref` y no `lockPref`: son valores de arranque, no una cárcel. Una distro que decide POR
8// el usuario y no lo deja cambiar de idea es exactamente lo que atuq no quiere ser. Lo que sí se
9// bloquea con política de verdad va en `distribution/policies.json`.
10
11// Los dientes: pestañas verticales, que Firefox trae nativas desde la 133 y vienen apagadas.
12defaultPref("sidebar.revamp", true);
13defaultPref("sidebar.verticalTabs", true);
14
15// ── LOS CONTENEDORES, PRENDIDOS DE FÁBRICA (SDD 26 §6.8) ───────────────────────────────────────
16// Firefox trae los contenedores en el motor desde hace años y los deja APAGADOS: para usarlos hay
17// que prender una pref escondida o instalar la extensión de Mozilla. atuq los prende de fábrica
18// porque son la mitad de abajo del proxy por contenedor —la que separa cookies, sesión y
19// almacenamiento—; la otra mitad, la que separa por dónde SALEN los paquetes, la pone la extensión
20// `proxy@atuq.tawasuyu`.
21//
22// Los contenedores CONCRETOS (Personal/Trabajo/Banco/Compras) no se declaran acá sino en
23// `distribution/policies.json`, con la política `Containers.Default`: es el único mecanismo que
24// crea contenedores en un perfil NUEVO sin que el usuario los escriba a mano. Comprobado dentro del
25// artefacto, no en la documentación: `ContextualIdentityService.sys.mjs` los lee de
26// `Services.policies.getActivePolicies().Containers.Default` en su `init()`.
27//
28// ⚠ `privacy.userContext.enabled` es la pref que ese mismo servicio observa: si alguna vez pasa a
29// false, Gecko CIERRA las pestañas de contenedor y borra la lista. Va como `defaultPref` igual que
30// todo lo demás —el usuario puede apagarlo—, pero apagarlo no es cosmético y por eso queda dicho.
31defaultPref("privacy.userContext.enabled", true);
32defaultPref("privacy.userContext.ui.enabled", true);
33
34// La distro se actualiza con hammer. Un navegador que se auto-actualiza por su cuenta rompería el
35// invariante entero: el binario dejaría de ser el que el artefacto dice que es.
36defaultPref("app.update.auto", false);
37defaultPref("browser.shell.checkDefaultBrowser", false);
38
39// Telemetría. No es «apagar una casilla»: es que la distro no reporta, punto. Lo verificable de
40// verdad —que la clausura no tenga a dónde reportar— es otro frente (SDD 26 §6); esto es el suelo.
41defaultPref("datareporting.healthreport.uploadEnabled", false);
42defaultPref("datareporting.policy.dataSubmissionEnabled", false);
43defaultPref("toolkit.telemetry.enabled", false);
44defaultPref("toolkit.telemetry.unified", false);
45defaultPref("toolkit.telemetry.archive.enabled", false);
46
47// Extensiones que la distro deja en `distribution/extensions/`: sin esto Gecko las instala
48// DESACTIVADAS y el usuario ve una lista de complementos apagados que nunca pidió apagar.
49// El otro lado de esto es `--with-unsigned-addon-scopes=app,system`, que va en el CONFIGURE de
50// `recipes/firefox.toml` y por eso no se puede resolver desde acá.
51defaultPref("extensions.autoDisableScopes", 0);
52
53// ── LA FIRMA DE COMPLEMENTOS ───────────────────────────────────────────────────────────────────
54// Sin esto la política de instalación muere con un error que no menciona la firma por su nombre:
55//     Policies: Download failed - ERROR_SIGNEDSTATE_REQUIRED - file:///…/inicio@atuq…xpi
56// Firefox exige que todo XPI esté firmado por Mozilla, y `--with-unsigned-addon-scopes=app,system`
57// —que sí está en el build— NO cubre el camino de instalación por política.
58//
59// Esta pref sólo tiene efecto en builds **unbranded**, y la nuestra lo es: `recipes/firefox.toml`
60// construye con `--with-branding=browser/branding/unofficial`. O sea que esto funciona por una
61// decisión que ya estaba tomada, no por una excepción nueva.
62//
63// ⚠ Lo que se pierde, dicho: atuq deja de exigir la firma de Mozilla para CUALQUIER complemento,
64// no sólo el suyo. Es la misma postura que toman las distros que empaquetan extensiones propias, y
65// la alternativa real —firmar con AMO— exige una cuenta y una revisión de Mozilla por cada versión,
66// que es exactamente la dependencia externa que esta distro existe para no tener.
67lockPref("xpinstall.signatures.required", false);
68
69// La página de inicio la pone la extensión `inicio@atuq.tawasuyu` con
70// `chrome_settings_overrides.homepage`; acá sólo se dice que al arrancar se abra la HOME y no la
71// sesión anterior. Poner la URL a mano en `browser.startup.homepage` pelearía con la extensión, y
72// gana la última que escribe: dos dueños para un valor es la forma de que el arranque sea sorpresa.
73defaultPref("browser.startup.page", 1);
74
75// ── EL CHROME ──────────────────────────────────────────────────────────────────────────────────
76// Por qué acá y no en `userChrome.css`: ese fichero vive en el PERFIL y exige que el usuario prenda
77// `toolkit.legacyUserProfileCustomizations.stylesheets`. atuq tiene que verse como atuq en el
78// primer arranque, con un perfil recién creado, sin que nadie prenda nada. El único gancho a nivel
79// de APLICACIÓN es nsIStyleSheetService, y llegar a él es la razón de `sandbox_enabled = false`.
80//
81// USER_SHEET y no AGENT_SHEET: es el mismo nivel de cascada que usa `userChrome.css`, así que lo
82// que se escriba en `chrome/atuq.css` se comporta como la gente espera y el usuario puede seguir
83// pisándolo con el suyo. AGENT_SHEET ganaría siempre y además alcanzaría al CONTENIDO de las
84// páginas, que no es lo que queremos tocar.
85try {
86  const { classes: Cc, interfaces: Ci } = Components;
87  // ── TESTIGO: «¿corrió este fichero?» es la PRIMERA pregunta de cualquier diagnóstico ─────────
88  // `defaultPref` no deja rastro en `prefs.js` (sólo se guardan los valores que difieren del
89  // default), así que un autoconfig que no se ejecuta es INDISTINGUIBLE de uno que se ejecutó y no
90  // hizo nada. Esto escribe una pref de USUARIO, que sí queda en el perfil y se puede leer desde
91  // fuera sin abrir el navegador.
92  Cc["@mozilla.org/preferences-service;1"]
93    .getService(Ci.nsIPrefBranch)
94    .setBoolPref("atuq.autoconfig.ok", true);
95  const sss = Cc["@mozilla.org/content/style-sheet-service;1"]
96    .getService(Ci.nsIStyleSheetService);
97  const ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
98  const dirs = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties);
99  // "GreD" = el directorio de la aplicación (donde vive el binario). En una instalación normal es
100  // el mismo que "XCurProcD"; se usa GreD porque es el que no cambia si algún día atuq se lanza
101  // con un `-app`.
102  const css = dirs.get("GreD", Ci.nsIFile);
103  css.append("chrome");
104  css.append("atuq.css");
105  if (css.exists()) {
106    const uri = ios.newFileURI(css);
107    if (!sss.sheetRegistered(uri, sss.USER_SHEET)) {
108      sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
109    }
110  }
111} catch (e) {
112  // Un fallo acá NO debe impedir que el navegador arranque: sin estilo es feo, sin navegador no hay
113  // nada. Queda en la consola de errores, que es donde se mira cuando «atuq se ve como Firefox».
114  Components.utils.reportError("atuq.cfg: no pude registrar chrome/atuq.css: " + e);
115}
116
117// ── LA BÓVEDA, Y EL GESTOR QUE SE APAGA PARA DEJARLE LUGAR (SDD-BOVEDA D7) ─────────────────────
118// Las contraseñas las guarda la suite: la bóveda las ofrece en el sitio que corresponde, las
119// sincroniza entre los equipos de la persona y se puede recuperar si se pierde el equipo. Gecko
120// trae su propio gestor, y DOS gestores peleando por el mismo campo es la peor experiencia que
121// puede tener alguien que sólo quiere entrar a su correo: el sitio se rellena dos veces, o ninguna,
122// y no hay forma de saber cuál de los dos tiene la contraseña buena.
123//
124// Por eso de fábrica manda la bóveda. Pero va como `defaultPref` y NO como política: el que
125// prefiera el de Gecko lo prende y listo. Prohibírselo sería decidir por él, que es exactamente lo
126// que este fichero dice en su cabecera que atuq no quiere ser — y el costo de equivocarse acá lo
127// paga alguien que se queda sin poder guardar una contraseña en su propia máquina.
128defaultPref("signon.rememberSignons", false);
129defaultPref("signon.autofillForms", false);
130// Y que tampoco ofrezca la que ya tenga guardada de antes: el usuario que migra sus claves con
131// `foreign-mozlogins` se las lleva a la bóveda, y ver las dos listas a la vez es confuso sin
132// motivo.
133defaultPref("signon.autofillForms.autocompleteOff", false);