@dotrino/vaultd 0.124.0 → 0.124.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/ctl.js +5 -1
- package/src/vault.js +17 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dotrino/vaultd",
|
|
3
|
-
"version": "0.124.
|
|
3
|
+
"version": "0.124.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Certificador personal de Dotrino: daemon headless que custodia la clave maestra y delega capacidades a tus dispositivos por el proxy. Tu CA propia.",
|
|
6
6
|
"bin": {
|
package/src/ctl.js
CHANGED
|
@@ -612,7 +612,11 @@ async function cmdMembers () {
|
|
|
612
612
|
// Un servicio SIN llave de cifrado no puede leer ninguna variable privada: van
|
|
613
613
|
// selladas a esa llave. Se dice aquí, junto a él, porque es el único sitio donde
|
|
614
614
|
// se mira quién es quién — y en la lista de variables ya seria tarde.
|
|
615
|
-
|
|
615
|
+
//
|
|
616
|
+
// Solo si LEE variables (`secrets`). La llave de comunicación de la bóveda entra con
|
|
617
|
+
// `cn: 'vault'` y solo `firma`, y no tiene llave de cifrado a propósito: salía marcada
|
|
618
|
+
// en rojo «NO puede leer sus variables» cuando no tiene ninguna que leer.
|
|
619
|
+
if (m.cn && !m.canSeal && m.caps.includes('secrets')) console.log(' %ssin llave de cifrado: NO puede leer sus variables%s', R, Z)
|
|
616
620
|
// QUÉ CORRE, y si cuadra con esta bóveda (CONVENCIONES §14). Sin esto una
|
|
617
621
|
// incompatibilidad de versiones se ve como que ese aparato «no responde», que es el
|
|
618
622
|
// fallo más caro que ha tenido el ecosistema. No bloquea nada: se enseña.
|
package/src/vault.js
CHANGED
|
@@ -27,7 +27,7 @@ import { startSealersPublisher } from './sealers.js'
|
|
|
27
27
|
import { assertKeyOwnsDir } from './keyowner.js'
|
|
28
28
|
import { openStore } from './store.js'
|
|
29
29
|
import { openThreadStore, STORE_READ_METHODS, PROFILE_EDIT_METHODS } from './threadStore.js'
|
|
30
|
-
import { openSecretsStore, assertVar, RECOVERY as RECOVERY_WRAP, PROFILE_OWNER } from './secretsStore.js'
|
|
30
|
+
import { openSecretsStore, assertVar, RECOVERY as RECOVERY_WRAP, PROFILE_NS, PROFILE_OWNER } from './secretsStore.js'
|
|
31
31
|
import { openSubacta } from './subacta.js'
|
|
32
32
|
import { makeEphemeralKey, openSealed } from '../lib/src/sealed.js'
|
|
33
33
|
import { VERSION } from './version.js'
|
|
@@ -2785,8 +2785,8 @@ export async function startVault ({ dir = dataDir(), proxyUrl, log = console.log
|
|
|
2785
2785
|
}
|
|
2786
2786
|
|
|
2787
2787
|
/**
|
|
2788
|
-
*
|
|
2789
|
-
* envoltura que falta. La falta de una envoltura no se anota nunca: se mira. Una nota
|
|
2788
|
+
* Lo que deben las VARIABLES, por cajón: las rotaciones anotadas y, CALCULADO, cada
|
|
2789
|
+
* envoltura que falta. El perfil no entra (ver el bucle). La falta de una envoltura no se anota nunca: se mira. Una nota
|
|
2790
2790
|
* se desincroniza en cuanto alguien salda la deuda por un camino que no pasa por donde
|
|
2791
2791
|
* se anotó (pasó dos veces: el reparto por el hermano y el rehacer al abrir), y
|
|
2792
2792
|
* entonces la consola avisa de algo que ya no existe. Lo que se calcula no miente.
|
|
@@ -2796,6 +2796,11 @@ export async function startVault ({ dir = dataDir(), proxyUrl, log = console.log
|
|
|
2796
2796
|
const out = rotationsDue()
|
|
2797
2797
|
for (const m of await incompleteMembers()) {
|
|
2798
2798
|
for (const [owner, keys] of Object.entries(m.owners)) {
|
|
2799
|
+
// El perfil tampoco va aquí: esto es lo que se enseña como «variables sin
|
|
2800
|
+
// entregar». Lo que un aparato no puede abrir del perfil sigue a la vista en SU
|
|
2801
|
+
// fila (`incomplete`), y `secret settle` y abrir la bóveda lo saldan igual, porque
|
|
2802
|
+
// leen `incompleteMembers` y no esto.
|
|
2803
|
+
if (owner === PROFILE_OWNER) continue
|
|
2799
2804
|
if (out[owner]?.kind === 'rotate') continue
|
|
2800
2805
|
out[owner] = out[owner] || { kind: 'rewrap', members: [] }
|
|
2801
2806
|
out[owner].members.push({ pub: m.pub, keys })
|
|
@@ -3409,7 +3414,15 @@ export async function startVault ({ dir = dataDir(), proxyUrl, log = console.log
|
|
|
3409
3414
|
// sobre, «pública» dejó de significar «en claro»: dice a quién se le despacha sin
|
|
3410
3415
|
// aprobación, nada más. Para ver un valor hay que poder abrirlo, igual que cualquiera —
|
|
3411
3416
|
// y en un cajón con dueño, quien administra deliberadamente no puede.
|
|
3412
|
-
|
|
3417
|
+
//
|
|
3418
|
+
// EL PERFIL NO ES UN GRUPO DE VARIABLES (dueño, 2026-09-21). `@me` vive en este
|
|
3419
|
+
// almacén porque se guarda igual —mismo sobre, mismo llavero—, pero no es configuración
|
|
3420
|
+
// de nadie: salía en `secret list` como «scope vault:secrets:@me», un scope que por
|
|
3421
|
+
// diseño no puede existir, y en la pantalla de variables como un grupo más. El perfil
|
|
3422
|
+
// tiene su sitio (`dotrino-vault me`, profile.dotrino.com).
|
|
3423
|
+
const variables = secrets.list()
|
|
3424
|
+
delete variables[PROFILE_NS]
|
|
3425
|
+
return variables
|
|
3413
3426
|
}
|
|
3414
3427
|
/** Cambiar SOLO quién puede ver el valor (no toca el valor ni avisa: el servicio lee lo mismo). */
|
|
3415
3428
|
async function setSecretVisibility (ns, key, isPublic, adminKey) {
|