@dotrino/vaultd 0.75.0 → 0.75.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/vault.js +20 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/vaultd",
3
- "version": "0.75.0",
3
+ "version": "0.75.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/vault.js CHANGED
@@ -615,14 +615,29 @@ export async function startVault ({ dir = dataDir(), proxyUrl, log = console.log
615
615
  if (!isFresh(p.data)) return staleReply(from)
616
616
  const chk = await verifyChain({ data: p.data, signature: p.signature, cert: p.cert, ...(await contextoActa()), revoked: await revocationSet() })
617
617
  if (!chk.ok) return denyChain(from, chk, p, null)
618
- // La lista de aparatos es el perfil: quién eres, cómo se llama cada máquina y qué puede.
619
- // Este mostrador no preguntaba al acta, así que un aparato al que le quitaste `lee`
620
- // seguía viendo tu inventario entero hasta que caducara su papel.
621
- if (!await actaAllows(from, chk, SCOPE.READ, 'devices')) return
618
+ // DOS RESPUESTAS, PORQUE SON DOS PREGUNTAS DISTINTAS.
619
+ //
620
+ // Un SERVICIO pregunta aquí para enterarse de dos cosas suyas: si le revocaron el papel
621
+ // y cuál es el acta vigente. Eso no es tu inventario y no puede exigir `lee` — se lo
622
+ // exigí, y en producción dejó ciegos a los servicios (`rejected devices/acta` en la
623
+ // bitácora del VPS, dos veces, antes de que lo viera).
624
+ //
625
+ // La LISTA DE APARATOS sí es el perfil —cómo se llama cada máquina y qué puede— y esa
626
+ // sigue pidiendo `lee`. Antes no preguntaba nada, así que un aparato al que le quitaste
627
+ // el permiso seguía viéndolo todo hasta que su papel caducara.
628
+ const record = (await identity.profileActa?.().catch(() => null))?.acta || null
629
+ const puedeVerTodo = !!record && Acta.memberCanScope(record, chk.device, SCOPE.READ)
622
630
  const { issued, revoked } = await identity.listDelegations()
631
+ if (!puedeVerTodo) {
632
+ if (!record) {
633
+ audit('rejected', { what: 'devices', reason: 'sin-acta' })
634
+ return reply(from, { type: MSG.ERROR, error: 'unauthorized: this vault has no record to decide with' })
635
+ }
636
+ audit('devices', { device: await deviceIdOf(chk.device).catch(() => null), solo: 'revocaciones' })
637
+ return reply(from, { type: MSG.DEVICES_RESULT, devices: [], revoked, acta: record })
638
+ }
623
639
  // El acta viaja con la lista: así cada dispositivo se entera de los cambios de
624
640
  // política (quién manda, quién puede qué) sin un canal aparte.
625
- const record = (await identity.profileActa?.().catch(() => null))?.acta || null
626
641
  // Si el dispositivo estuvo apagado y viene con un `seq` viejo, se le manda la CADENA
627
642
  // que falta (ventana de retención, §1.3) para que compruebe el encadenamiento en vez
628
643
  // de tragarse un salto a ciegas. Si se salió de la ventana, llega vacía y toca