@dotrino/vault 0.60.4 → 0.61.0
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/LICENSE +0 -0
- package/README.md +0 -0
- package/bin/dotrino-env.js +0 -0
- package/package.json +1 -1
- package/src/admin.js +0 -0
- package/src/atrest.js +0 -0
- package/src/config.js +0 -0
- package/src/enroll.js +0 -0
- package/src/env.js +0 -0
- package/src/envtext.js +0 -0
- package/src/index.js +0 -0
- package/src/invite.js +0 -0
- package/src/kek.js +0 -0
- package/src/localdesk.js +0 -0
- package/src/lock.js +0 -0
- package/src/protocol.js +15 -0
- package/src/revocation.js +0 -0
- package/src/sealed.js +0 -0
- package/src/service.js +23 -2
- package/src/sshAgent.js +0 -0
- package/src/sshKeys.js +0 -0
- package/src/version.js +30 -0
package/LICENSE
CHANGED
|
File without changes
|
package/README.md
CHANGED
|
File without changes
|
package/bin/dotrino-env.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dotrino/vault",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.61.0",
|
|
4
4
|
"description": "Usa ESTE dispositivo (navegador) como bóveda/CA del ecosistema Dotrino: atiende enrolamientos por el proxy y firma certificados de delegación a tus máquinas. Incluye el cliente de SERVICIO (Node): un proyecto se enrola una vez y jala sus credenciales del vault en vez del .env (`import '@dotrino/vault/config'`).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
package/src/admin.js
CHANGED
|
File without changes
|
package/src/atrest.js
CHANGED
|
File without changes
|
package/src/config.js
CHANGED
|
File without changes
|
package/src/enroll.js
CHANGED
|
File without changes
|
package/src/env.js
CHANGED
|
File without changes
|
package/src/envtext.js
CHANGED
|
File without changes
|
package/src/index.js
CHANGED
|
File without changes
|
package/src/invite.js
CHANGED
|
File without changes
|
package/src/kek.js
CHANGED
|
File without changes
|
package/src/localdesk.js
CHANGED
|
File without changes
|
package/src/lock.js
CHANGED
|
File without changes
|
package/src/protocol.js
CHANGED
|
@@ -128,3 +128,18 @@ export const isValidSecretsNs = (ns) => typeof ns === 'string' && /^[a-z0-9-]{1,
|
|
|
128
128
|
* remota y el lector de `.env`, y tres copias de una regla son tres reglas.
|
|
129
129
|
*/
|
|
130
130
|
export const isValidVarKey = (key) => typeof key === 'string' && /^[A-Z0-9_]{1,64}$/.test(key)
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* LA VERSIÓN DEL CABLE (CONVENCIONES §14, `@dotrino/compat`).
|
|
134
|
+
*
|
|
135
|
+
* Sube **solo cuando cambia el protocolo**, no con cada release: es lo que decide *si dos
|
|
136
|
+
* piezas pueden hablar*. La `version` del paquete decide otra cosa —si esa build concreta
|
|
137
|
+
* está rota— y por eso hacen falta las dos.
|
|
138
|
+
*
|
|
139
|
+
* Empieza en 1 hoy, con todo lo anterior sin declarar nada: a quien calla se le atiende
|
|
140
|
+
* hasta que cierre la ventana de migración del pilar, y después no.
|
|
141
|
+
*/
|
|
142
|
+
export const VAULT_PROTOCOL = 1
|
|
143
|
+
|
|
144
|
+
/** Los protocolos que esta build entiende. Al añadir el 2, aquí van `[1, 2]`. */
|
|
145
|
+
export const VAULT_SPEAKS = [1]
|
package/src/revocation.js
CHANGED
|
File without changes
|
package/src/sealed.js
CHANGED
|
File without changes
|
package/src/service.js
CHANGED
|
@@ -26,7 +26,8 @@ import {
|
|
|
26
26
|
verifyDeviceSig, makePairingCode, commitCode, pubkeyId } from '@dotrino/identity/capabilities'
|
|
27
27
|
import { openWrap, wrapForMember, decryptWithCek } from '@dotrino/identity/content'
|
|
28
28
|
import { verifyActa, sealKeyAt, sealersOf, memberCan } from '@dotrino/identity/acta'
|
|
29
|
-
import { MSG, secretsScope, isValidSecretsNs } from './protocol.js'
|
|
29
|
+
import { MSG, secretsScope, isValidSecretsNs, VAULT_PROTOCOL, VAULT_SPEAKS } from './protocol.js'
|
|
30
|
+
import { PKG_VERSION } from './version.js'
|
|
30
31
|
import { makeEphemeralKey, openSealed } from './sealed.js'
|
|
31
32
|
import { parseInvite } from './invite.js'
|
|
32
33
|
import { atRestFor } from './atrest.js'
|
|
@@ -35,6 +36,26 @@ import { connectLocal, hasLocalVault } from './localdesk.js'
|
|
|
35
36
|
const IDENTITY_FILE = 'service-identity.json'
|
|
36
37
|
const FRESH_WINDOW_MS = 5 * 60 * 1000
|
|
37
38
|
|
|
39
|
+
/**
|
|
40
|
+
* QUÉ SOMOS, dentro de lo que ya va firmado (CONVENCIONES §14).
|
|
41
|
+
*
|
|
42
|
+
* Va DENTRO de `data` y no en el envoltorio a propósito: `data` lo firma la llave del
|
|
43
|
+
* aparato, así que lo que la bóveda apunta y enseña es lo que ese aparato dijo **con su
|
|
44
|
+
* llave**. Un inventario de versiones que cualquiera puede escribir no es un inventario.
|
|
45
|
+
*
|
|
46
|
+
* `PRODUCT` es el cliente de la bóveda —el que se instala con `@dotrino/env`—, que es
|
|
47
|
+
* justo la pieza que se quedaba atrás sin que nadie se enterara: pedía `^0.33.2` con la
|
|
48
|
+
* librería en 0.60 y enrolar contestaba `invalid cert: no-acta`, que es verdad y no es la
|
|
49
|
+
* causa.
|
|
50
|
+
*/
|
|
51
|
+
const PRODUCT = 'vault'
|
|
52
|
+
export const MY_VERSION = {
|
|
53
|
+
product: PRODUCT,
|
|
54
|
+
version: PKG_VERSION,
|
|
55
|
+
protocol: VAULT_PROTOCOL,
|
|
56
|
+
speaks: VAULT_SPEAKS
|
|
57
|
+
}
|
|
58
|
+
|
|
38
59
|
let _globalsInstalled = false
|
|
39
60
|
function installNodeGlobals () {
|
|
40
61
|
if (_globalsInstalled) return
|
|
@@ -593,7 +614,7 @@ export async function fetchSecrets ({ dir, ns, proxyUrl, masterPubkey, device, c
|
|
|
593
614
|
const eph = await makeEphemeralKey()
|
|
594
615
|
// `publicOnly` VIAJA FIRMADO (va dentro de `data`), así que nadie lo puede quitar ni
|
|
595
616
|
// poner por el camino. Quien decide qué se manda es la bóveda; esto solo es la petición.
|
|
596
|
-
const data = { op: 'secrets', ns, ek: eph.ek, publickey: device.publickey, ts: Date.now(), ...(publicOnly ? { publicOnly: true } : {}) }
|
|
617
|
+
const data = { op: 'secrets', ns, ek: eph.ek, publickey: device.publickey, ts: Date.now(), v: MY_VERSION, ...(publicOnly ? { publicOnly: true } : {}) }
|
|
597
618
|
const { signature } = await signWithDevice({ privateJwk: device.privateJwk, data })
|
|
598
619
|
// A QUIÉN SE LE PREGUNTA: primero a la bóveda, y si no contesta, a los REPLICADORES
|
|
599
620
|
// que el acta nombraba la última vez que la vimos (`docs/replicas.md` §8: «el servicio
|
package/src/sshAgent.js
CHANGED
|
File without changes
|
package/src/sshKeys.js
CHANGED
|
File without changes
|
package/src/version.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* version.js — la versión de `@dotrino/vault` (el CLIENTE, no el daemon).
|
|
3
|
+
*
|
|
4
|
+
* Existe porque el cliente tiene que poder decir qué versión es (CONVENCIONES §14), y esta
|
|
5
|
+
* es justo la pieza que se quedaba atrás sin que nadie se enterara: `@dotrino/env` pedía
|
|
6
|
+
* `^0.33.2` con la librería en 0.60, y enrolar contestaba `invalid cert: no-acta` — verdad,
|
|
7
|
+
* y no la causa.
|
|
8
|
+
*
|
|
9
|
+
* Se lee del `package.json` que viaja con el paquete. Si no se puede leer se dice `0.0.0`,
|
|
10
|
+
* que es un número imposible y por tanto legible como «no lo sé» — no se inventa uno
|
|
11
|
+
* plausible, que sería peor que no decir nada.
|
|
12
|
+
*/
|
|
13
|
+
import fs from 'node:fs'
|
|
14
|
+
import { dirname, join } from 'node:path'
|
|
15
|
+
import { fileURLToPath } from 'node:url'
|
|
16
|
+
|
|
17
|
+
function leer () {
|
|
18
|
+
try {
|
|
19
|
+
const aqui = dirname(fileURLToPath(import.meta.url))
|
|
20
|
+
for (const p of [join(aqui, '..', 'package.json'), join(aqui, '..', '..', 'package.json')]) {
|
|
21
|
+
try {
|
|
22
|
+
const v = JSON.parse(fs.readFileSync(p, 'utf8'))
|
|
23
|
+
if (v?.name === '@dotrino/vault' && typeof v.version === 'string') return v.version
|
|
24
|
+
} catch (_) {}
|
|
25
|
+
}
|
|
26
|
+
} catch (_) {}
|
|
27
|
+
return '0.0.0'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const PKG_VERSION = leer()
|