@dotrino/identity 0.58.0 → 0.59.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/identity",
3
- "version": "0.58.0",
3
+ "version": "0.59.0",
4
4
  "description": "Identidad y rating de usuarios compartidos entre apps de Dotrino (vault iframe + postMessage)",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/index.js CHANGED
@@ -404,6 +404,19 @@ export class Identity {
404
404
  return this._call('vaultAdmin', { op, ...(args || {}) }, 20000)
405
405
  }
406
406
 
407
+ /**
408
+ * PEDIDOS DE APROBACIÓN de la bóveda (cajones con `approval`): `op` = `approvals` ·
409
+ * `approve` · `deny` (estos dos con `{ id }`). Requiere `vault:approve` en el cert.
410
+ */
411
+ async vaultApprovals (op, args) {
412
+ return this._call('vaultApprovals', { op, ...(args || {}) }, 20000)
413
+ }
414
+
415
+ /** ¿El cert de este dispositivo le permite aprobar pedidos de la bóveda? */
416
+ async canApproveVault () {
417
+ return this._call('canApproveVault', {}, 20000)
418
+ }
419
+
407
420
  /** ¿El cert de este dispositivo le permite administrar el perfil a distancia? */
408
421
  async canAdminVault () {
409
422
  return this._call('canAdminVault', {}, 20000)
package/vault/core.js CHANGED
@@ -22,7 +22,7 @@ import { signDelegationWith, MAX_DELEGATION_MS, DEFAULT_DELEGATION_MS } from './
22
22
  import * as Acta from './acta.js'
23
23
  import * as Content from './content.js'
24
24
  import { pubkeyId as pubkeyIdOf } from './capabilities.js'
25
- import { enrollDevice as remoteEnroll, requestSign as remoteSign, requestStore as remoteStore, requestDevices as remoteDevices, requestRenew as remoteRenew, requestAdmin as remoteAdmin, requestRenounce as remoteRenounce, checkMembership as remoteCheck } from './remote.js'
25
+ import { enrollDevice as remoteEnroll, requestSign as remoteSign, requestStore as remoteStore, requestDevices as remoteDevices, requestRenew as remoteRenew, requestAdmin as remoteAdmin, requestApproval as remoteApproval, requestRenounce as remoteRenounce, checkMembership as remoteCheck } from './remote.js'
26
26
 
27
27
  export const KEY_STORAGE = 'dotrino.identity.keypair'
28
28
  export const ENC_KEY_STORAGE = 'dotrino.identity.enc-keypair'
@@ -1956,6 +1956,26 @@ export async function createIdentityCore ({ kv: rawKv, peers, makeSync = null, k
1956
1956
  catch (e) { return handleVaultError(e) }
1957
1957
  },
1958
1958
 
1959
+ /**
1960
+ * PEDIDOS DE APROBACIÓN: lo que le toca al teléfono cuando un cajón de la bóveda exige
1961
+ * el visto bueno por uso. `op`: `approvals` (listar) · `approve` · `deny` (con `id`).
1962
+ * Requiere `vault:approve` en el cert, que se concede a mano (`caps <ID> +aprueba`).
1963
+ */
1964
+ async vaultApprovals ({ op, id } = {}) {
1965
+ const v = loadVaultCert(); const device = loadVaultDevice()
1966
+ if (!v?.cert || !device) throw new Error('this device is not paired with a vault')
1967
+ maybeRenewVaultCert()
1968
+ try { return await remoteApproval({ master: v.master, proxy: v.proxy, device, cert: v.cert, op, id, onRevoked: wipeVaultLink }) }
1969
+ catch (e) { return handleVaultError(e) }
1970
+ },
1971
+
1972
+ /** ¿Puede ESTE dispositivo aprobar pedidos? Mismo criterio que `canAdminVault`. */
1973
+ async canApproveVault () {
1974
+ if (certDesfasadoDelActa()) { try { await renovarCert() } catch (_) {} }
1975
+ const v = loadVaultCert()
1976
+ return !!v?.cert && (v.cert.scope || []).includes('vault:approve')
1977
+ },
1978
+
1959
1979
  /**
1960
1980
  * ¿Puede ESTE dispositivo administrar el perfil a distancia? Sale del scope del
1961
1981
  * cert que le dio la bóveda, no de una preferencia: la interfaz pregunta para
package/vault/remote.js CHANGED
@@ -395,6 +395,21 @@ export async function requestAdmin ({ master, proxy, device, cert, op, onRevoked
395
395
  return res.result
396
396
  }
397
397
 
398
+ /**
399
+ * PEDIDOS DE APROBACIÓN (cajones con `approval`): `approvals` (listar) · `approve` ·
400
+ * `deny`. Van por `vault.secrets`, firmados por un aparato cuyo cert lleve
401
+ * `vault:approve` — que, como `admin`, no se recibe al emparejar: se concede a mano.
402
+ * La bóveda contesta un cuerpo firmado por la maestra (`{ op, items | ok }`).
403
+ */
404
+ export async function requestApproval ({ master, proxy, device, cert, op, id, onRevoked } = {}) {
405
+ const res = await vaultRpc({
406
+ master, proxy, device, cert, onRevoked,
407
+ sendType: MSG.SECRETS, okType: MSG.SECRETS_RESULT,
408
+ data: id ? { op, id } : { op }
409
+ })
410
+ return res.body
411
+ }
412
+
398
413
  /**
399
414
  * ¿Es AUTÉNTICO este `vault.admin.event` (entró o salió alguien del perfil)? Solo si va
400
415
  * firmado por la maestra PINEADA. Un aviso sin firma no se muestra: si no, cualquiera