@dotrino/identity 0.70.0 → 0.71.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 +32 -1
package/package.json
CHANGED
package/vault/acta.js
CHANGED
|
@@ -62,6 +62,18 @@ const ACTA_LEIBLES = Object.freeze([1, 2, 3, 4])
|
|
|
62
62
|
const V_CON_CADENA = 4
|
|
63
63
|
/** ¿Esta acta lleva el eslabón? Las anteriores se leen igual; no pueden encadenar. */
|
|
64
64
|
const conCadena = (acta) => Number(acta?.v) >= V_CON_CADENA
|
|
65
|
+
/**
|
|
66
|
+
* Solo `https`, y sin excepción para localhost: esta dirección la va a abrir un TERCERO
|
|
67
|
+
* que no te conoce, y mandarlo por texto plano es dejar que cualquiera en el camino le
|
|
68
|
+
* conteste otra cosa. Que no lleve `#` ni credenciales: no es un enlace para una persona.
|
|
69
|
+
*/
|
|
70
|
+
const isChainUrl = (u) => {
|
|
71
|
+
if (typeof u !== 'string' || u.length > 300) return false
|
|
72
|
+
try {
|
|
73
|
+
const x = new URL(u)
|
|
74
|
+
return x.protocol === 'https:' && !x.hash && !x.username && !x.password
|
|
75
|
+
} catch (_) { return false }
|
|
76
|
+
}
|
|
65
77
|
/** Desde esta versión, sellar es solo un permiso y no hay campo `sealer`. */
|
|
66
78
|
const V_SIN_CAMPO_SELLADOR = 3
|
|
67
79
|
/** ¿Este acta es de las viejas, con el campo? */
|
|
@@ -221,12 +233,30 @@ export const canSeal = (acta, pub, renounces = []) =>
|
|
|
221
233
|
* sellador, con todas las capacidades. `profileId` = su pubkey → el nombre del perfil es
|
|
222
234
|
* estable para siempre y coincide con la identidad que el usuario ya tenía (cero migración).
|
|
223
235
|
*/
|
|
224
|
-
export function genesisActa ({ pub, encPub = null, sealPub = null, label = '', now = Date.now() }) {
|
|
236
|
+
export function genesisActa ({ pub, encPub = null, sealPub = null, label = '', chainUrl = null, now = Date.now() }) {
|
|
225
237
|
if (!isPub(pub)) throw new Error('genesisActa: missing genesis pubkey')
|
|
238
|
+
if (chainUrl != null && !isChainUrl(chainUrl)) throw new Error('genesisActa: chainUrl must be https')
|
|
226
239
|
return {
|
|
227
240
|
v: ACTA_V,
|
|
228
241
|
profileId: pub,
|
|
229
242
|
sealedBy: pub,
|
|
243
|
+
/**
|
|
244
|
+
* DÓNDE PREGUNTAR SI ESTA CADENA SIGUE VIGENTE. Va en el GÉNESIS y en ningún otro
|
|
245
|
+
* sitio, y esa es toda la idea.
|
|
246
|
+
*
|
|
247
|
+
* La cadena que te llega prueba quién puede sellar, pero no que no haya algo más
|
|
248
|
+
* nuevo — si retiraste una bóveda, quien tenga la cadena vieja la sigue aceptando.
|
|
249
|
+
* Para enterarse hay que poder mirar a algún lado.
|
|
250
|
+
*
|
|
251
|
+
* Si la dirección viajara en la parte cambiable, el sellador expulsado la cambiaría
|
|
252
|
+
* a la suya y te mandaría a mirar su rama. En el génesis no puede: está autofirmada
|
|
253
|
+
* por la llave que da nombre al perfil, y cambiarla exige esa llave.
|
|
254
|
+
*
|
|
255
|
+
* `null` es lo normal y no es un defecto: una cuenta de una sola bóveda no tiene nada
|
|
256
|
+
* que pueda quedar obsoleto —su conjunto de selladores no puede cambiar— así que no
|
|
257
|
+
* hay a dónde preguntar ni falta que hace.
|
|
258
|
+
*/
|
|
259
|
+
chainUrl: chainUrl || null,
|
|
230
260
|
seq: 1,
|
|
231
261
|
prev: null,
|
|
232
262
|
// LA CADENA DE SELLADORES. El génesis es el ancla: está autofirmado por la llave que
|
|
@@ -258,6 +288,7 @@ export function checkShape (acta) {
|
|
|
258
288
|
if (!acta || typeof acta !== 'object') return 'no-acta'
|
|
259
289
|
if (!ACTA_LEIBLES.includes(acta.v)) return 'version'
|
|
260
290
|
if (!isPub(acta.profileId) || !isPub(acta.sealedBy)) return 'shape'
|
|
291
|
+
if (acta.chainUrl != null && !isChainUrl(acta.chainUrl)) return 'chainurl'
|
|
261
292
|
// El campo solo existe —y solo se exige— en las viejas.
|
|
262
293
|
if (conCampoSellador(acta) && !isPub(acta.sealer)) return 'shape'
|
|
263
294
|
if (!conCampoSellador(acta) && acta.sealer != null) return 'sealer-no-va-en-v3'
|