@dotrino/identity 0.64.0 → 0.65.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/vault/acta.js +28 -1
package/package.json
CHANGED
package/vault/acta.js
CHANGED
|
@@ -551,6 +551,33 @@ export function effectiveCaps (acta, pub, extraRenounces = []) {
|
|
|
551
551
|
* ¿Puede este miembro leer el cajón de secretos `ns`? Solo si su CN es exactamente ése.
|
|
552
552
|
* Es la frontera que pediste: la llave del proxy no ve nada más que lo del proxy.
|
|
553
553
|
*/
|
|
554
|
+
/**
|
|
555
|
+
* ¿PUEDE ESTE MIEMBRO FIRMAR POR LA IDENTIDAD, Y QUÉ?
|
|
556
|
+
*
|
|
557
|
+
* Manda el acta, no el certificado (dueño, 2026-08-31). Y el matiz que hace falta decir en
|
|
558
|
+
* voz alta: `sign` **no** es «firma lo que quiera». Va enmascarado, igual que `secrets` lo
|
|
559
|
+
* va por el `cn` — *«puede firmar por identidad pero solo lo que permitan los permisos»*.
|
|
560
|
+
*
|
|
561
|
+
* Por qué existe con nombre propio en vez de un `memberCan(acta, pub, 'sign')` suelto: la
|
|
562
|
+
* regla se comprueba en DOS bóvedas (el daemon y la de navegador) y se comprobaba mal en
|
|
563
|
+
* las dos —miraban el papel—. Con un solo sitio, cuando el enmascarado crezca, crece una
|
|
564
|
+
* vez y las dos lo heredan.
|
|
565
|
+
*
|
|
566
|
+
* `ns` es opcional y es para lo que va atado a un cajón: un servicio (miembro con `cn`)
|
|
567
|
+
* solo firma dentro del suyo. Sin `ns`, se pregunta por la capacidad a secas.
|
|
568
|
+
*/
|
|
569
|
+
export function memberCanSign (acta, pub, ns = null) {
|
|
570
|
+
if (!memberCan(acta, pub, 'sign')) return false
|
|
571
|
+
const m = (acta?.members || []).find((x) => x.pub === pub)
|
|
572
|
+
// SIN `cn` = un aparato TUYO: firma como tú, y no hay nada que preguntarle a nadie.
|
|
573
|
+
if (!m?.cn) return true
|
|
574
|
+
// CON `cn` = un servicio, y el cajón lo dice EL ACTA. Así que no hace falta —ni vale—
|
|
575
|
+
// preguntarle al contenido de qué es: quien pregunta sin decir cajón está pidiendo
|
|
576
|
+
// «firma por la identidad, en general», y eso un servicio no lo hace. Solo se le
|
|
577
|
+
// reconoce la firma dentro del suyo.
|
|
578
|
+
return ns != null && m.cn === ns
|
|
579
|
+
}
|
|
580
|
+
|
|
554
581
|
export function memberCanReadSecrets (acta, pub, ns) {
|
|
555
582
|
const m = (acta?.members || []).find((x) => x.pub === pub)
|
|
556
583
|
if (!m || !m.cn) return false
|
|
@@ -735,5 +762,5 @@ export default {
|
|
|
735
762
|
sealActa, verifyActa, applyChanges, makeRenounce, verifyRenounce,
|
|
736
763
|
makeContinuity, verifyContinuity,
|
|
737
764
|
cardBody, makeProfileCard, verifyProfileCard, canAdoptCard, sealersOf, canSeal,
|
|
738
|
-
effectiveCaps, memberCan, memberCanReadSecrets, memberScopes, isService, capScope, isValidCn, canAdopt
|
|
765
|
+
effectiveCaps, memberCan, memberCanSign, memberCanReadSecrets, memberScopes, isService, capScope, isValidCn, canAdopt
|
|
739
766
|
}
|