Andrey Antukh b5fbc4fd8c
✨ Add size limits to profile props and plugin registry (#11596)
* ✨ Add size limits to profile props and plugin registry

Bound the total serialized size of profile settings to 2 MiB
(:profile-props-max-size), checked on the merged result before
persisting, with a controlled :props-too-large error. Profiles
that already exceed the limit can still shrink but cannot grow.

Cap plugin registry entries in the shared schema (code 1 MiB, 50
plugins max, bounded name/host/description/icon) and restore rate
limiting on the plugin RPCs (profile-mutations bucket, one write
at a time per profile). The plugin manager now asks for
confirmation before removal and ignores repeated clicks while a
persist request is in flight.

Closes #11592

AI-assisted-by: muse-spark-1.3-contributor

* 🐛 Enforce plugin count cap, byte sizes and removal guard

Enforce the declared 50-plugin cap in add-profile-plugin with a
specific :too-many-plugins error (updates of existing entries
still pass); the cap lives in a shared max-plugins constant.

Measure profile props size in UTF-8 bytes instead of chars so
multibyte content cannot slip past the limit.

Cover install/remove persist logic with mocked-RPC frontend tests
(release semantics, in-flight dedupe, validation vs rollback
split) and add the missing boundary tests in common.

Expose the in-flight persist set from the plugin registry and
disable the remove button of entries being saved.

Closes #11592

AI-assisted-by: muse-spark-1.3-contributor

* 🐛 Fix rollback loops and restore paths in plugin registry

Restore the previous plugin version instead of dropping the entry
when a validation error rejects an update of an installed plugin.

Make compensating writes one-shot with terminal callbacks so a
persistent failure cannot ping-pong between install and remove.
Restores keep the original list position; the unused public
plugin-persisting? predicate is removed.

Pin count-before-size precedence with a dedicated test and fix
translation source refs to their canonical lines.

Closes #11592

AI-assisted-by: muse-spark-1.3-contributor

* 🐛 Guard notifications write and fix restore ordering

Route update-profile-notifications through check-props-size! so
oversized profiles cannot grow through that path; document the
exempt system writers. Remove the duplicated stale entries in
en.po, keeping the canonical translation refs.

Restore rejected plugin updates at their original list position
instead of leaving the optimistic move in place.

Closes #11592

AI-assisted-by: muse-spark-1.3-contributor

* 🐛 Skip no-op plugin removal and clarify size comments

Return early from remove-profile-plugin when the id is absent:
no wasted write, no size check, and no manufactured :plugins key
that could spuriously fail on oversized profiles.

Clarify that per-field string caps count chars while the byte
budget is enforced by profile-props-max-size.

Closes #11592

AI-assisted-by: muse-spark-1.3-contributor

* 📎 Fix formatting in rlimit.edn for profile operations

Signed-off-by: Andrey Antukh <niwi@niwi.nz>

* 📎 Fix formatting of import-binfile/global entry

Signed-off-by: Andrey Antukh <niwi@niwi.nz>

* ♻️ Simplify props size check and tighten plugin entry caps

Measure props with transit bytes directly instead of the
PGobject string roundtrip.

Rename check-props-size! to check-props-size: single hard limit
on the merged props, no growth comparison, and return props so
writers thread the check into the update.

Move the 2 MiB default into default-props-max-size on the
profile namespace, still overridable with the optional
:profile-props-max-size config entry.

Tighten registry-entry :code and :icon to 500 chars: they hold
manifest paths, not content.

Closes #11592

AI-assisted-by: muse-spark-1.3-contributor

* 🐛 Fix compatibility problems

---------

Signed-off-by: Andrey Antukh <niwi@niwi.nz>
Co-authored-by: alonso.torres <alonso.torres@kaleidos.net>
2026-10-01 14:31:30 +02:00

326 lines
2.8 KiB
Plaintext

# Word catalog for check-translations.js (Spanish).
# Comment lines start with #. Blank lines are ignored.
# [function] short function words; a token starting with one of
# these is likely missing a space.
# [common] ordinary words used to judge the other half of a split.
# [ok] correct words the splitter would flag; never report
# these. Add new valid words here when the gate trips.
# [brands] extra locale-specific brands/terms kept as-is.
# [elision] letters elided with an apostrophe (Spanish has none).
[elision]
[function]
el
la
los
las
un
una
unos
unas
al
del
de
en
y
e
o
u
que
como
con
por
para
sin
sobre
entre
hasta
desde
donde
cuando
porque
pues
si
no
ni
mas
más
muy
tan
tanto
todo
todos
toda
todas
cada
otro
otra
otros
otras
este
esta
estos
estas
ese
esa
eso
aquel
aquella
aquello
mi
mis
tu
tus
su
sus
nuestro
nuestra
nuestros
nuestras
vuestro
vuestra
vuestros
vuestras
me
te
se
nos
os
le
les
lo
yo
tú
él
ella
ello
nosotros
vosotros
ellos
ellas
esto
eso
aquello
algo
alguien
nada
nadie
quien
quienes
cual
cuales
cuanto
cuanta
cuantos
cuantas
[common]
habilitar
crear
eliminar
guardar
abrir
cerrar
enviar
compartir
invitar
mover
copiar
pegar
subir
bajar
editar
configurar
activar
desactivar
permitir
necesitar
poder
deber
querer
saber
hacer
poner
salir
entrar
volver
llegar
pasar
quedar
dar
estar
ser
haber
tener
ir
ver
usar
buscar
cambiar
seguir
encontrar
mostrar
ocultar
añadir
quitar
seleccionar
aplicar
cancelar
aceptar
probar
comprobar
generar
descargar
equipo
archivo
proyecto
cuenta
nombre
correo
error
aviso
ventana
página
botón
campo
lista
tabla
imagen
forma
capa
color
tamaño
fecha
enlace
nuevo
nueva
grande
pequeño
bueno
actual
siguiente
anterior
mismo
otra
primer
último
único
libre
público
[ok]
abandonarla
abrirlo
activarlos
actuales
actualizada
adicionales
administradores
algunos
alto
aplicarse
asignarse
aun
aunque
autoguardada
autoguardado
autoreferencia
ayudarnos
ayudarte
borradores
borrarlo
bloquearla
cambiada
caracteres
como
comparte
compartir
comprobar
comprueba
compuesto
comunidad
conectarlo
conectarse
conjunto
conocerte
consigue
contactarnos
contener
contiene
contexto
danos
demás
desactivarlos
desbloquearla
deseleccionar
desuscripción
durante
editores
eje
eliminarla
eliminarlo
eliminarlos
ella
eso
esos
este
estoy
estándar
expirada
funcionalidades
granulares
hay
hubo
importada
iniciarse
instalarla
invitaciones
lectores
letras
manifiesto
menos
nosotros
otras
pero
personales
peso
primero
principales
propiedades
proveedores
publicarla
publicarlo
puesto
regenerada
restaurarlo
restaurarlos
seleccionada
selector
servidores
sino
solicitudes
soportada
sufijo
tanto
temas
tenerte
tipográfico
tono
unidades
unir
unirse
uno
unos
usarlas
utilizada
verla
versiones
verticales
vincularse
visuales
volverlo
porque
[brands]