Repartir por ventana
El reparto que hace que el modelo valga la pena: cada ventana con lo suyo. Cómo se decide, los comodines para ventanas que no existen todavía, y el caso que lo justifica todo.
El reparto típico
capabilities/├── base.json windows: [] … todas — solo core:default├── principal.json windows: ["main"] — diálogos, ficheros, shell├── ajustes.json windows: ["settings"] — el almacén de preferencias, nada más└── documentos.json windows: ["doc-*"] — lectura del directorio de proyectosY lo que cada una concede, con el criterio detrás:
Fíjate en la tercera fila: la ventana de ajustes es un formulario y no necesita casi nada. Con una capability global, tendría exactamente lo mismo que la principal. Ese es el reparto en su forma más simple y ya devuelve.
Ventanas que no existen todavía
Las de etiqueta generada del nivel 12.1 —una por documento— no se pueden nombrar una a una. El campo admite comodines:
{ "identifier": "documentos", "windows": ["doc-*"], "permissions": [ … ] }Dos consecuencias que hay que tener presentes:
El comodín es una decisión sobre el futuro. Cualquier ventana que se cree con una etiqueta que encaje va a tener esos permisos, incluida una que alguien añada dentro de un año con un propósito distinto. Conviene que el prefijo sea específico —doc- y no v-— para que encajar sea deliberado.
Y por eso la etiqueta importa. Es el argumento del nivel 7.2 con consecuencias de seguridad: la etiqueta de una ventana no es un nombre interno cualquiera, es la clave con la que se le conceden permisos. Una etiqueta derivada de algo que el usuario controla —el nombre de un fichero— podría, en el peor caso, encajar en un comodín que no le correspondía.
La regla: etiquetas con prefijo fijo y sufijo derivado de un identificador interno, nunca de texto del usuario.
El caso que lo justifica todo
El reparto por ventana no existe para aplicaciones con cinco ventanas propias. Existe para esto:
Ése es el ejercicio entero. Sin reparto por ventana, esa vista previa tendría los mismos permisos que tu ventana principal, y todo el trabajo de la fase V estaría protegiendo una puerta con la otra abierta.
Y si tu aplicación no tiene ninguna ventana así, el reparto sigue mereciendo la pena por lo del nivel 26.5 —limitar el daño de una dependencia comprometida— aunque el beneficio sea menor.
El error de conceder a todas
Es el que se comete por comodidad y tiene una forma reconocible: una capability sin campo de ventanas, con muchos permisos, llamada default. Es lo que deja el subcomando que instala plugins —nivel 9.3— acumulado durante meses.
La corrección es un ejercicio de una tarde:
- Lista tus ventanas y qué hace cada una.
- Para cada permiso de la capability global, decide en qué ventanas hace falta.
- Parte el fichero.
- Prueba cada ventana. Lo que falle, se concede donde falte.
El paso 4 es el que da miedo y el que hay que hacer: lo que no falle al quitarlo, sobraba.