@dotrino/remote-agent 0.9.2 → 0.10.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/package.json +5 -5
- package/src/agent.js +6 -10
- package/src/link.js +6 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dotrino/remote-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Middleware compartido del ecosistema Dotrino para apps de agente remoto cifrado punto a punto (handshake E2E, emparejamiento SAS con vault, revocación, descubrimiento). Lo consumen dotrino-terminal (PTY) y dotrino-ia (chat con IA).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -45,13 +45,13 @@
|
|
|
45
45
|
"p2p"
|
|
46
46
|
],
|
|
47
47
|
"peerDependencies": {
|
|
48
|
-
"@dotrino/identity": ">=0.
|
|
48
|
+
"@dotrino/identity": ">=0.92.0",
|
|
49
49
|
"@dotrino/proxy-client": ">=0.18.2",
|
|
50
|
-
"@dotrino/vault": ">=0.
|
|
50
|
+
"@dotrino/vault": ">=0.64.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@dotrino/identity": "0.
|
|
53
|
+
"@dotrino/identity": "0.92.0",
|
|
54
54
|
"@dotrino/proxy-client": "0.18.2",
|
|
55
|
-
"@dotrino/vault": "0.
|
|
55
|
+
"@dotrino/vault": "0.64.0"
|
|
56
56
|
}
|
|
57
57
|
}
|
package/src/agent.js
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import fs from 'node:fs'
|
|
23
23
|
import path from 'node:path'
|
|
24
|
-
import { verifyChain, signWithDevice, verifyDeviceSig,
|
|
25
|
-
import { sealersOf, memberCan } from '@dotrino/identity/acta'
|
|
24
|
+
import { verifyChain, signWithDevice, verifyDeviceSig, pubkeyId } from '@dotrino/identity/capabilities'
|
|
25
|
+
import { sealersOf, memberCan, checkVaultReply } from '@dotrino/identity/acta'
|
|
26
26
|
import { installNodeGlobals } from '../node-globals.js'
|
|
27
27
|
import { makeEphemeral, deriveKey, seal, open } from '../e2e.js'
|
|
28
28
|
import { HS, ACK, DATA, PING, PONG, ERROR, VMSG, SIGN_SCOPE, SESSION_TTL_MS, REVOKE_REFRESH_MS } from '../protocol.js'
|
|
@@ -191,14 +191,10 @@ export async function startRemoteAgent (opts = {}) {
|
|
|
191
191
|
const res = await vaultRpc(VMSG.RENEW, VMSG.RENEWED, { op: 'renew', publickey: myPub, ts: Date.now() })
|
|
192
192
|
const cert = res?.cert
|
|
193
193
|
const acta = res?.acta
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
cert, expectedSub: myPub, expectedScope: SIGN_SCOPE,
|
|
199
|
-
actaSeq: acta.seq, sealers: sealersOf(acta)
|
|
200
|
-
})
|
|
201
|
-
if (!v.ok) throw new Error(v.reason)
|
|
194
|
+
// La regla del pilar, contra la bóveda a la que se le pidió (`master`). Aquí se exigía
|
|
195
|
+
// `acta.profileId === master`, que con una segunda bóveda nunca es verdad.
|
|
196
|
+
const chk = await checkVaultReply({ acta, cert, vault: master, sub: myPub, scope: SIGN_SCOPE })
|
|
197
|
+
if (!chk.ok) throw new Error('invalid renewed cert: ' + chk.reason)
|
|
202
198
|
link.cert = cert
|
|
203
199
|
link.actaSeq = acta.seq
|
|
204
200
|
saveLink(dir, link)
|
package/src/link.js
CHANGED
|
@@ -16,8 +16,7 @@
|
|
|
16
16
|
import fs from 'node:fs'
|
|
17
17
|
import path from 'node:path'
|
|
18
18
|
import os from 'node:os'
|
|
19
|
-
import { signWithDevice, pubkeyId
|
|
20
|
-
import { sealersOf } from '@dotrino/identity/acta'
|
|
19
|
+
import { signWithDevice, pubkeyId } from '@dotrino/identity/capabilities'
|
|
21
20
|
import { requestDevices, requestRenew } from '@dotrino/identity/vault/remote.js'
|
|
22
21
|
import { installNodeGlobals } from '../node-globals.js'
|
|
23
22
|
|
|
@@ -169,17 +168,11 @@ export async function renewLink (link, { dir = dataDir(), force = false } = {})
|
|
|
169
168
|
if (!force && !legado && !atrasado) return { renewed: false, seq: link.cert.seq, reason: 'not due' }
|
|
170
169
|
installNodeGlobals(dir)
|
|
171
170
|
try {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// SELLADORA de este perfil. Ya no se compara `cert.iss` con una llave fija — con varias
|
|
178
|
-
// bóvedas el emisor puede ser otra del mismo perfil; lo que se fija es el PERFIL.
|
|
179
|
-
if (!acta) throw new Error('the vault did not send its record: cannot check who signed this cert')
|
|
180
|
-
if (acta.profileId !== link.iss) throw new Error('the record is from a profile other than the pinned one')
|
|
181
|
-
const v = await verifyDelegation({ cert, expectedSub: link.device.publickey, actaSeq: acta.seq, sealers: sealersOf(acta) })
|
|
182
|
-
if (!v.ok) throw new Error(v.reason)
|
|
171
|
+
// `requestRenew` ya JUZGA lo que devuelve (`checkVaultReply` del pilar: acta bien
|
|
172
|
+
// firmada, esta bóveda puede sellarla, el papel lo firmó ella y es para esta llave) y
|
|
173
|
+
// lanza si no cuadra. Aquí se comparaba `acta.profileId` con `link.iss`, que solo vale
|
|
174
|
+
// en una cuenta que nació en esa bóveda: con una segunda bóveda no renovaba nunca.
|
|
175
|
+
const { cert, acta } = await requestRenew({ master: link.iss, proxy: link.proxy || 'wss://proxy.dotrino.com', device: link.device, cert: link.cert })
|
|
183
176
|
// SE GUARDA ANTES DE DAR NADA POR BUENO. Emitir un papel RETIRA el anterior, así que si
|
|
184
177
|
// esto no se persiste la máquina se queda usando uno revocado y fuera para siempre. Le
|
|
185
178
|
// pasó al registro de selladores en la migración, y por eso está dicho aquí.
|