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:
parent
37937e8363
commit
a22e4a49d4
7 changed files with 231 additions and 2 deletions
69
src/views/fork/identities.js
Normal file
69
src/views/fork/identities.js
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/**
|
||||
* Selector de identidades para los ajustes.
|
||||
*
|
||||
* Vive aparte de settings_view.js para que las reescrituras de upstream sobre ese
|
||||
* fichero no arrastren esto: alli solo hay una linea que llama a renderIdentities().
|
||||
*
|
||||
* No cambia de identidad en caliente. Anota cual sera la del proximo arranque y lo
|
||||
* dice; el porque esta en src/backend/accounts.js.
|
||||
*/
|
||||
|
||||
module.exports = ({ i18n, html }) => {
|
||||
const { form, button, div, h2, p, section, input, span, ul, li } = html;
|
||||
const accounts = require('../../backend/accounts.js');
|
||||
|
||||
const renderIdentities = (activeAccount) => {
|
||||
const names = accounts.list();
|
||||
const feeds = new Map(names.map((n) => [n, accounts.feedIdOf(n)]));
|
||||
|
||||
// dos carpetas con el mismo feed son la misma identidad copiada: publicar desde
|
||||
// las dos parte el registro y no tiene arreglo, asi que se avisa en la lista
|
||||
const seen = new Map();
|
||||
for (const [n, id] of feeds) {
|
||||
if (!id) continue;
|
||||
seen.set(id, (seen.get(id) || 0) + 1);
|
||||
}
|
||||
|
||||
const row = (name) => {
|
||||
const id = feeds.get(name);
|
||||
const isActive = name === activeAccount;
|
||||
const duplicated = id && seen.get(id) > 1;
|
||||
return li({ class: "identity-row" },
|
||||
div({ class: "identity-info" },
|
||||
span({ class: "identity-name" }, name),
|
||||
span({ class: "identity-feed" }, id ? `${id.slice(0, 18)}…` : "—"),
|
||||
duplicated ? span({ class: "identity-warn" }, i18n.identitiesSameFeed) : null
|
||||
),
|
||||
isActive
|
||||
? span({ class: "identity-active" }, i18n.identitiesActive)
|
||||
: form({ method: "POST", action: "/settings/identity/use" },
|
||||
input({ type: "hidden", name: "account", value: name }),
|
||||
button({ type: "submit" }, i18n.identitiesUse)
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
// en movil el backend lo mantiene vivo un servicio en primer plano, asi que
|
||||
// cerrar la app no basta para reiniciarlo: hace falta pedirlo
|
||||
const restart = process.env.OASIS_MOBILE === '1'
|
||||
? form({ method: "POST", action: "/settings/identity/restart" },
|
||||
button({ type: "submit" }, i18n.identitiesRestart))
|
||||
: null;
|
||||
|
||||
return section(
|
||||
div({ class: "tags-header" },
|
||||
h2(i18n.identitiesTitle),
|
||||
p(i18n.identitiesDescription),
|
||||
ul({ class: "identity-list" }, names.map(row)),
|
||||
form({ method: "POST", action: "/settings/identity/create" },
|
||||
input({ type: "text", name: "account", placeholder: i18n.identitiesNewName,
|
||||
maxlength: "32", autocomplete: "off" }),
|
||||
button({ type: "submit" }, i18n.identitiesCreate)
|
||||
),
|
||||
restart
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
return { renderIdentities };
|
||||
};
|
||||
|
|
@ -5,6 +5,9 @@ const { getConfig } = require('../configs/config-manager.js');
|
|||
const { template, selectedLanguage, i18n, setLanguage } = require('./main_views');
|
||||
const i18nBase = require("../client/assets/translations/i18n");
|
||||
const { WORKFLOWS, currentWorkflow } = require('../models/workflows_model');
|
||||
const html = require("../server/node_modules/hyperaxe");
|
||||
// selector de identidades: la implementacion vive en ./fork/identities.js
|
||||
const { renderIdentities } = require('./fork/identities')({ i18n, html });
|
||||
|
||||
const snhUrl = "https://wiki.solarnethub.com/socialnet/overview";
|
||||
|
||||
|
|
@ -89,6 +92,7 @@ const settingsView = ({ version, aiPrompt, fediverseAccount, fediverseError }) =
|
|||
updateButton
|
||||
)
|
||||
),
|
||||
renderIdentities(require('../server/ssb_config').account),
|
||||
section(
|
||||
div({ class: "tags-header" },
|
||||
h2(i18n.language),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue