@dotrino/identity 0.86.0 → 0.86.2
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/src/index.js +7 -1
- package/vault/vault.js +20 -1
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -278,7 +278,13 @@ export class Identity {
|
|
|
278
278
|
async revokeGrant (origin) { return this._call('revokeGrant', { origin }) }
|
|
279
279
|
|
|
280
280
|
async requestAssertion ({ audience, nonce, scopes, ttlMs } = {}) {
|
|
281
|
-
|
|
281
|
+
// ESPERA LO QUE TARDE UNA PERSONA. Los cinco segundos de siempre valen para una
|
|
282
|
+
// llamada que solo hace cuentas; esta puede abrir la pantalla de permiso (§permiso por
|
|
283
|
+
// origen) y ahí quien contesta es un humano. Con el plazo corto, el cliente se rendía
|
|
284
|
+
// con «Vault timeout» mientras el usuario todavía miraba el panel — y pulsar «Permitir»
|
|
285
|
+
// ya no servía de nada. El tope es un poco mayor que el del propio panel, para que el
|
|
286
|
+
// error que llegue sea «no lo concedió», que dice lo que pasó.
|
|
287
|
+
const { assertion } = await this._call('requestAssertion', { audience, nonce, scopes, ttlMs }, 65000)
|
|
282
288
|
return assertion
|
|
283
289
|
}
|
|
284
290
|
|
package/vault/vault.js
CHANGED
|
@@ -77,6 +77,24 @@ import { pubkeyId } from './capabilities.js'
|
|
|
77
77
|
: { 'profile:name': 'tu nombre', 'profile:avatar': 'tu foto', 'profile:email': 'tu correo', 'profile:social': 'tus enlaces', 'id:whoami': 'quién eres' }
|
|
78
78
|
})()
|
|
79
79
|
|
|
80
|
+
/**
|
|
81
|
+
* CÓMO SE LLAMA QUIEN PIDE. Una dirección cruda no dice nada —y quien la lee deprisa no
|
|
82
|
+
* distingue `chat.dotrino.com` de `chat.dotrlno.com`—, así que se enseña el nombre y
|
|
83
|
+
* DEBAJO la dirección entera, que es lo que de verdad identifica.
|
|
84
|
+
*
|
|
85
|
+
* No se importa el catálogo de aplicaciones: eso ataría este iframe al repositorio del
|
|
86
|
+
* home y habría que subirlo cada vez que nace una app. El subdominio ya es el nombre.
|
|
87
|
+
*/
|
|
88
|
+
function nombreDeOrigen (origin) {
|
|
89
|
+
try {
|
|
90
|
+
const h = new URL(origin).hostname
|
|
91
|
+
if (h === 'dotrino.com' || h === 'www.dotrino.com') return 'Dotrino'
|
|
92
|
+
const m = /^([a-z0-9-]+)\.dotrino\.com$/.exec(h)
|
|
93
|
+
if (m) return m[1].charAt(0).toUpperCase() + m[1].slice(1)
|
|
94
|
+
return h
|
|
95
|
+
} catch (_) { return String(origin) }
|
|
96
|
+
}
|
|
97
|
+
|
|
80
98
|
let consentAbierto = null
|
|
81
99
|
function askConsent ({ origin, scopes }) {
|
|
82
100
|
if (consentAbierto) return Promise.resolve(false) // una pregunta a la vez
|
|
@@ -86,7 +104,8 @@ import { pubkeyId } from './capabilities.js'
|
|
|
86
104
|
const lista = scopes.map((x) => `<li>${SCOPE_TXT[x] || x}</li>`).join('')
|
|
87
105
|
host.innerHTML = `<div style="background:#171331;border:1px solid #2a2350;border-radius:16px;padding:22px;min-width:min(320px,90vw);max-width:90vw;color:#e7e3ff">
|
|
88
106
|
<div style="opacity:.7;font-size:13px">${T_CONSENT.who}</div>
|
|
89
|
-
<div style="font-weight:700;margin:8px 0 4px">${
|
|
107
|
+
<div style="font-weight:700;margin:8px 0 4px">${nombreDeOrigen(origin)} ${T_CONSENT.title}:</div>
|
|
108
|
+
<div style="opacity:.55;font-size:12px;margin-bottom:6px">${String(origin).replace(/^https?:\/\//, '')}</div>
|
|
90
109
|
<ul style="margin:6px 0 12px 18px;padding:0">${lista}</ul>
|
|
91
110
|
<div style="opacity:.7;font-size:12px;margin-bottom:12px">${T_CONSENT.once}</div>
|
|
92
111
|
<div style="display:flex;gap:8px">
|