ssb: base de multicuenta y arreglo de las rutas fijas a ~/.ssb

ssb_config pasa a derivar la cuenta de OASIS_ACCOUNT. Como ssb-config construye la
ruta desde el appname y gui.js saca el socket de config.path, cambiar ese literal
arrastra de forma coherente el almacen, la base de datos, los blobs, el secret y el
socket. Sin la variable se usa 'ssb', asi que las instalaciones existentes siguen en
~/.ssb y no notan nada.

El nombre se valida contra [a-zA-Z0-9][a-zA-Z0-9_-]{0,31} y cae a 'ssb' si no encaja.
No es de adorno: acaba en rutas de fichero y hay operaciones destructivas detras.
Comprobado que OASIS_ACCOUNT=../../etc no sale de sitio.

statePath separa tambien por cuenta cuando se usa OASIS_STATE_DIR. Sin eso, dos
identidades compartirian el estado que 0.9.5 empezo a guardar ahi, que es justo el
camino a partir el registro.

Y el arreglo que importa: doce sitios construian la ruta como os.homedir() + '/.ssb'
en vez de usar la de la cuenta. El peor era panicmode_model, que con varias
identidades habria borrado la equivocada; tambien exportmode y legacy_model, que
habrian exportado o restaurado la identidad de otra cuenta. Los de lectura
—main_models, stats_model y backend.js con gossip.json y ebt— habrian mirado siempre
la cuenta por defecto.

Falta la parte visible: el selector de identidad y el reinicio del proceso al
cambiar. Esta base es la que hacia falta para que eso no sea peligroso.

Verificado: con OASIS_ACCOUNT sin definir la ruta sigue siendo ~/.ssb; con 'trabajo'
pasa a ~/.trabajo; con un valor con .. o espacios se rechaza. Diez rutas OK con la
app en marcha, incluidas /peers y /stats, que son las que leen esos ficheros.
This commit is contained in:
SITO 2026-08-19 00:44:23 +02:00
parent f80b2e04f0
commit f354069af7
7 changed files with 39 additions and 21 deletions

View file

@ -66,8 +66,8 @@ const configure = (...customOptions) =>
Object.assign({}, defaultOptions, ...customOptions);
// PEERS
const ebtDir = path.join(os.homedir(), '.ssb', 'ebt');
const unfollowedPath = path.join(os.homedir(), '.ssb', 'gossip_unfollowed.json');
const ebtDir = path.join(require('../server/ssb_config').path, 'ebt');
const unfollowedPath = path.join(require('../server/ssb_config').path, 'gossip_unfollowed.json');
async function loadPeersFromEbt() {
let result = [];
@ -789,7 +789,7 @@ models.meta = {
discovered: async () => {
const ssb = await cooler.open();
const snapshot = await ssb.conn.dbPeers();
const gossipPath = path.join(os.homedir(), '.ssb', 'gossip.json');
const gossipPath = path.join(require('../server/ssb_config').path, 'gossip.json');
let gossipMap = new Map();
try {
const gossipData = JSON.parse(await fs.readFile(gossipPath, 'utf8'));