@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.
- package/package.json +1 -1
- 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.
|
|
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
|
-
//
|
|
619
|
-
//
|
|
620
|
-
//
|
|
621
|
-
|
|
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
|