identidades: selector en los ajustes, con reinicio en movil

La base de multicuenta ya estaba en el arranque (OASIS_ACCOUNT), pero solo se
podia elegir por linea de comandos. Ahora hay una seccion en los ajustes que
lista las identidades, marca cual esta en uso y permite crear una.

Como funciona:

- accounts.js encuentra las identidades buscando directorios ~/.<algo> con un
  secret dentro, y lee de el su @id. En Android ese HOME es el almacenamiento
  privado de la app, asi que quedan aisladas del resto del sistema.
- El selector anota la elegida en src/configs/active-account; ssb_config.js la
  usa al arrancar si no hay OASIS_ACCOUNT (que sigue mandando).
- Crear una identidad solo anota el nombre: el secret lo genera ssb-config al
  arrancar con esa cuenta.

En movil hay ademas un boton de reinicio, porque aqui cerrar la app no basta:
el backend vive en un servicio en primer plano que sobrevive. La ruta responde
la pagina y luego termina el proceso; el servicio se recrea y node arranca con
la identidad nueva. No se puede levantar el runtime dos veces en el mismo
proceso, de ahi salir en vez de reiniciar por dentro.

Comprobado en el emulador: al reiniciar, el feed pasa a ser el de la otra
identidad y la anterior sigue intacta.

Dos carpetas pueden tener el mismo secret copiado, y publicar desde las dos
parte el registro sin arreglo posible. La lista lo detecta comparando los @id
y lo avisa en rojo en las dos filas.
This commit is contained in:
s1to 2026-08-19 11:08:55 +02:00
parent 37937e8363
commit a22e4a49d4
7 changed files with 231 additions and 2 deletions

View file

@ -18,11 +18,19 @@ const cliArgs = ~i ? argv.slice(0, i) : argv;
// Se valida a proposito: este nombre acaba en rutas de fichero y hay operaciones
// destructivas (el modo panico borra el directorio de la cuenta) que no deben poder
// apuntar fuera de sitio.
//
// Manda la variable de entorno; si no esta, la cuenta que dejo anotada el selector
// de identidades de los ajustes; y si tampoco, 'ssb'.
const ACCOUNT_RE = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,31}$/;
const rawAccount = process.env.OASIS_ACCOUNT || 'ssb';
let annotated = null;
try {
const f = path.resolve(__dirname, '../configs', 'active-account');
annotated = fs.readFileSync(f, 'utf8').trim() || null;
} catch (_) {}
const rawAccount = process.env.OASIS_ACCOUNT || annotated || 'ssb';
const account = ACCOUNT_RE.test(rawAccount) ? rawAccount : 'ssb';
if (account !== rawAccount) {
console.error(`[oasis] OASIS_ACCOUNT no valido (${rawAccount}); se usa 'ssb'`);
console.error(`[oasis] cuenta no valida (${rawAccount}); se usa 'ssb'`);
}
let config = Config(account, minimist(conf));