@dotrino/identity 0.65.0 → 0.66.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 +1 -1
- package/vault/acta.js +33 -4
package/package.json
CHANGED
package/vault/acta.js
CHANGED
|
@@ -568,10 +568,39 @@ export function effectiveCaps (acta, pub, extraRenounces = []) {
|
|
|
568
568
|
*/
|
|
569
569
|
export function memberCanSign (acta, pub, ns = null) {
|
|
570
570
|
if (!memberCan(acta, pub, 'sign')) return false
|
|
571
|
-
if (ns == null) return true
|
|
572
571
|
const m = (acta?.members || []).find((x) => x.pub === pub)
|
|
573
|
-
//
|
|
574
|
-
|
|
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
|
+
|
|
581
|
+
/**
|
|
582
|
+
* ¿PUEDE ESTE MIEMBRO LO QUE PIDE EL SCOPE? La misma pregunta para todos los mostradores.
|
|
583
|
+
*
|
|
584
|
+
* El certificado dice a qué se comprometió la bóveda cuando conectó el aparato; el ACTA
|
|
585
|
+
* dice lo que puede hoy. Y no coinciden: cambiar los permisos sella el acta pero NO
|
|
586
|
+
* reemite ni revoca el papel, que vive hasta 30 días. Quitarle `lee` a un aparato y que
|
|
587
|
+
* siguiera leyendo un mes es el mismo fallo que estaba en `sign`, en cada mostrador que
|
|
588
|
+
* se olvidara de preguntar.
|
|
589
|
+
*
|
|
590
|
+
* Por eso esto existe y por eso traduce el SCOPE (el idioma del certificado) a la
|
|
591
|
+
* capacidad (el idioma del acta): así el guardia se pone UNA vez, junto a la verificación
|
|
592
|
+
* de la cadena, y un mostrador nuevo lo hereda en lugar de tener que acordarse.
|
|
593
|
+
*
|
|
594
|
+
* Devuelve `false` ante un scope que no reconoce: si aparece uno nuevo, lo que toca es
|
|
595
|
+
* añadirlo aquí, no que se cuele por no estar en la lista.
|
|
596
|
+
*/
|
|
597
|
+
export function memberCanScope (acta, pub, scope) {
|
|
598
|
+
if (!acta || typeof scope !== 'string') return false
|
|
599
|
+
const secretos = /^vault:secrets:([a-z0-9-]{1,32})$/.exec(scope)
|
|
600
|
+
if (secretos) return memberCanReadSecrets(acta, pub, secretos[1])
|
|
601
|
+
if (scope === 'vault:sign') return memberCanSign(acta, pub)
|
|
602
|
+
const cap = Object.keys(CAP_SCOPE).find((c) => CAP_SCOPE[c] === scope)
|
|
603
|
+
return cap ? memberCan(acta, pub, cap) : false
|
|
575
604
|
}
|
|
576
605
|
|
|
577
606
|
export function memberCanReadSecrets (acta, pub, ns) {
|
|
@@ -758,5 +787,5 @@ export default {
|
|
|
758
787
|
sealActa, verifyActa, applyChanges, makeRenounce, verifyRenounce,
|
|
759
788
|
makeContinuity, verifyContinuity,
|
|
760
789
|
cardBody, makeProfileCard, verifyProfileCard, canAdoptCard, sealersOf, canSeal,
|
|
761
|
-
effectiveCaps, memberCan, memberCanSign, memberCanReadSecrets, memberScopes, isService, capScope, isValidCn, canAdopt
|
|
790
|
+
effectiveCaps, memberCan, memberCanSign, memberCanScope, memberCanReadSecrets, memberScopes, isService, capScope, isValidCn, canAdopt
|
|
762
791
|
}
|