@dotrino/identity 0.76.0 → 0.77.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.76.0",
3
+ "version": "0.77.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
@@ -489,7 +489,14 @@ export class Identity {
489
489
  // Podés tener varios perfiles (identidades) en el mismo navegador, cada uno conectado o no
490
490
  // a su propio vault. Crear/cambiar setea el perfil activo; la app RECARGA la página y toma
491
491
  // el nuevo (no reactivo: las apps abiertas conservan el perfil con el que cargaron).
492
- /** Lista de perfiles: [{ id, name, pubkey, current }]. */
492
+ /**
493
+ * Lista de perfiles: `[{ id, name, pubkey, avatar, current, pendingJoin, vault, approve }]`.
494
+ *
495
+ * `vault` = ese perfil está conectado a una bóveda · `approve` = además su certificado
496
+ * le deja aprobar pedidos. Los dos salen de leer el cert guardado de cada perfil, sin
497
+ * cambiar el activo ni firmar nada — es lo que necesita la pantalla de Pedidos para
498
+ * saber a QUÉ perfil pertenece lo que timbró el teléfono.
499
+ */
493
500
  async listProfiles () { return this._call('listProfiles') }
494
501
  /** El perfil activo: { id, name, pubkey }. */
495
502
  async currentProfile () { return this._call('currentProfile') }
package/vault/core.js CHANGED
@@ -1524,9 +1524,24 @@ export async function createIdentityCore ({ kv: rawKv, peers, makeSync = null, k
1524
1524
  const m = raw ? JSON.parse(raw) : null
1525
1525
  if (m && typeof m.avatar === 'string') avatar = m.avatar
1526
1526
  } catch (_) {}
1527
- // `pendingJoin`: nació para adoptar la cuenta de una bóveda y todavía no se unió.
1528
- // La consola lo usa para no ofrecerlo como una cuenta normal a medio hacer.
1529
- return { id: p.id, name: p.name || '', pubkey: p.pubkey || null, avatar, current: p.id === currentPid, pendingJoin: !!p.pendingJoin }
1527
+ // QUÉ PERFIL ESTÁ CONECTADO A UNA BÓVEDA, Y CUÁL APRUEBA.
1528
+ //
1529
+ // Con varios perfiles en el mismo aparato, el pedido que timbra el teléfono es de
1530
+ // UNO de ellos, y puede no ser el activo. Sin esto la pantalla de Pedidos abría con
1531
+ // el que hubiera y decía «este aparato no aprueba pedidos» — falso: el que aprueba
1532
+ // era otro perfil, y no había forma de saber cuál.
1533
+ //
1534
+ // Se lee el CERT de cada perfil, que está en claro en el kv (no es un secreto: dice
1535
+ // qué puede hacer este aparato, no cómo). Es solo lectura y no hace falta la llave
1536
+ // del otro perfil, así que no se cambia el activo ni se firma nada.
1537
+ let vault = false; let approve = false
1538
+ try {
1539
+ const raw = p.id === currentPid ? kv.getItem(VAULT_CERT_STORAGE) : rawKv.getItem(`dotrino.identity.p.${p.id}.vault.cert`)
1540
+ const v = raw ? JSON.parse(raw) : null
1541
+ vault = !!v?.cert
1542
+ approve = vault && (v.cert.scope || []).includes('vault:approve')
1543
+ } catch (_) {}
1544
+ return { id: p.id, name: p.name || '', pubkey: p.pubkey || null, avatar, current: p.id === currentPid, pendingJoin: !!p.pendingJoin, vault, approve }
1530
1545
  })
1531
1546
  },
1532
1547
  async currentProfile () {