OASIS_LINUX/src/server/ssb_config.js
SITO 7d0d7066bb identidades: selector en los ajustes
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 del disco, 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.
- 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, que es quien sabe hacerlo.

No se cambia en caliente a proposito: media aplicacion captura la referencia al
sbot al cargarse, asi que cambiarla con el proceso vivo dejaria modulos
hablando con la identidad anterior.

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.

El nombre se valida igual que en ssb_config.js: 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.
2026-08-19 11:08:35 +02:00

57 lines
2.2 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const Config = require('ssb-config/inject');
const minimist = require('minimist');
const configPath = path.resolve(__dirname, '../configs', 'server-config.json');
const configData = JSON.parse(fs.readFileSync(configPath, 'utf8'));
const argv = process.argv.slice(2);
const i = argv.indexOf('--');
const conf = argv.slice(i + 1);
const cliArgs = ~i ? argv.slice(0, i) : argv;
// Nombre de la cuenta: define donde vive todo (~/.<cuenta>) y de ahi cuelgan el
// secret, la base de datos, los blobs y el socket. Sin la variable se usa 'ssb',
// que es lo de siempre, asi que las instalaciones existentes no notan nada.
//
// 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}$/;
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] cuenta no valida (${rawAccount}); se usa 'ssb'`);
}
let config = Config(account, minimist(conf));
config = { ...config, ...configData };
const debug = process.argv.includes('--debug') || process.env.OASIS_DEBUG === '1' || process.env.OASIS_DEBUG === 'true';
if (debug) {
config.logging = { ...(config.logging || {}), level: 'debug' };
}
const megabyte = Math.pow(2, 20);
config.blobs = config.blobs || {};
config.blobs.max = 50 * megabyte;
config.account = account;
config.statePath = (name) => {
// El directorio externo se separa por cuenta: sin esto dos identidades
// compartirian estado, que es justo lo que hay que evitar.
if (process.env.OASIS_STATE_DIR) return path.join(process.env.OASIS_STATE_DIR, account, name);
return config.path ? path.join(config.path, name) : null;
};
module.exports = config;