From 6eafe5ee188b877cfa6ebec78d7c26b741fd8338 Mon Sep 17 00:00:00 2001 From: hacklab Date: Mon, 19 Oct 2026 14:19:54 +0200 Subject: [PATCH] coherencia con la guia: lo de movil del dev vuelve a ser suyo Comparando con el nodejs-project de la APK oficial (la referencia buena para el movil, no el git del dev) salia que parte de lo que se saco de backend.js era codigo de movil del propio dev: apagar los modulos que no van, cortar rutas, retocar el HTML, las descargas de la copia de seguridad y ocultar tema y workflow en la bienvenida. - backend.js vuelve a ser su version de movil mas dos lineas (montar nuestro router); modules_view.js, su version de movil - mobile_layer.js se queda con lo nuestro: avatar, filtro y lanzador - la guia lista las 17 diferencias que quedan con la APK oficial (561 lineas) y explica que hay que comparar con la APK, no con el git --- GUIA_DE_DESARROLLO.md | 44 ++++++----- docs/FRONTERA_UPSTREAM.md | 5 ++ docs/capturas/esquema-rama.png | Bin 55960 -> 55395 bytes docs/capturas/generar_portada.py | 4 +- src/backend/backend.js | 68 ++++++++++++++++- src/backend/fork_routes.js | 8 +- src/backend/mobile_layer.js | 125 ++++--------------------------- src/views/modules_view.js | 17 +++-- 8 files changed, 124 insertions(+), 147 deletions(-) diff --git a/GUIA_DE_DESARROLLO.md b/GUIA_DE_DESARROLLO.md index a46f338..3ca2aee 100644 --- a/GUIA_DE_DESARROLLO.md +++ b/GUIA_DE_DESARROLLO.md @@ -84,9 +84,8 @@ Aquí se puede hacer lo que haga falta. - `src/views/hive_views.js`: lanzador y barras de arriba y abajo. - `src/views/mobile_icons.js`: los iconos. - `src/backend/fork_routes.js`: nuestro router. Va justo delante del del dev. -- `src/backend/mobile_layer.js`: lo que el móvil necesita del backend (rutas que se - cortan, módulos que no van, avatar y lanzador, retoques del HTML, descargas de la - copia de seguridad). La monta `fork_routes.js`. +- `src/backend/mobile_layer.js`: lo que nuestra interfaz necesita del backend + (avatar, filtro y lanzador de la barra de arriba). La monta `fork_routes.js`. - `src/models/fork_workflows.js`: nuestros workflows. - `src/client/assets/translations/i18n_fork.js`: nuestros textos. - `src/client/assets/images/ux-*.svg`: nuestras imágenes. @@ -156,7 +155,8 @@ nombre es el de la ruta: `/tribes` es `tribes`. ## Cuando sale versión nueva del dev -1. Lo suyo se coge tal cual. +1. Lo suyo se coge tal cual, y para los ficheros con versión de móvil, la de su APK + oficial (`assets/nodejs-project.zip`), no la de su git. 2. En sus vistas se vuelven a poner los enganches. El `grep -n mobileUi` sobre la versión anterior de la rama dice dónde iban. 3. Se repite la medición de `docs/FRONTERA_UPSTREAM.md`: qué ha tocado y si ha @@ -188,19 +188,25 @@ inspeccionar la WebView desde `chrome://inspect`. ## Lo que todavía está mal -Cosas de antes de estas normas que aún no las cumplen, por orden de lo que más -duele: +Para el móvil, la referencia es el `nodejs-project` de la APK oficial del dev, no su +git: él mete cambios de móvil (en `backend.js`, `SSB_server.js`, `phone_module.js`...) +que solo están en la APK. Comparado con eso, la rama cambia 17 ficheros suyos, 561 +líneas (19/10/2026). Por tamaño: -1. En `backend.js` quedan 9 trozos pequeños (21 líneas) que no se pueden sacar desde - fuera: tres expresiones regulares que con el Node 18 de Android tumbaban el - arranque (esto habría que contárselo al dev), no abrir el navegador al arrancar, - no repetir fotos ya limpiadas, el modo chats y la línea que monta nuestro router. - Lo demás ya está en `src/backend/mobile_layer.js`. -2. En `workflows_model.js` queda la logica de skins del movil (`themeOf`, `sameTheme`): - `settings_view.js` coge `currentWorkflow` al cargar y no se puede envolver desde - fuera sin tocar esa vista. Es poco, pero es del dev. -3. `src/server/phone_module.js` escribe el estado de la llamada en - `.phone_state.json` para que la app Android enseñe la notificación (9 líneas). El - módulo del dev no avisa hacia fuera de los cambios de estado; habría que pedírselo. -4. `src/server/SSB_server.js` quita la publicación de la dirección del banco al - arrancar. Hay que mirar por qué se quitó y si sigue haciendo falta. +- `backend/blobHandler.js` (190): limpiar los metadatos de las fotos también en + Android. Es una función nuestra metida en su fichero; habría que proponérsela al dev. +- `configs/oasis-config.json` (87) y `configs/config-manager.js` (18): la config de + serie del móvil (tema Acampada, workflow acampada, barra de abajo). +- `views/main_views.js` (62), `settings_view.js` (34), `welcome_view.js` (11), + `tribes_view.js` (9), `vote_view.js` (7): enganches a `mobile_ui.js` y el orden de + carga de las hojas. Es lo que la guía permite, pero hay que revisarlo en cada versión. +- `main.js` (45): DNS del sistema primero, para respetar la VPN. +- `server/ssb_config.js` (30): varias identidades en el mismo móvil. +- `models/workflows_model.js` (17): la lógica de skins del móvil (`themeOf`, + `sameTheme`). `settings_view.js` coge `currentWorkflow` al cargar y no se puede + envolver desde fuera. +- `styles/mobile.css` (14), `bookmark_view.js` (13), `forum_view.js` (7), + `translations/i18n.js` (5, la mezcla con `i18n_fork.js`): arreglos sueltos de antes. +- `backend/backend.js` (2): la línea que monta nuestro router. + +Cuando el dev saque versión, se repite esta comparación con su APK nueva. diff --git a/docs/FRONTERA_UPSTREAM.md b/docs/FRONTERA_UPSTREAM.md index 9f67da1..e8bde8a 100644 --- a/docs/FRONTERA_UPSTREAM.md +++ b/docs/FRONTERA_UPSTREAM.md @@ -138,6 +138,11 @@ nada, pero son peso muerto y confunden. `acampada` se registran desde `models/fork_workflows.js`. La config de serie del movil coincide con `acampada`. Queda en `workflows_model.js` la logica de skins del movil. +- Correccion (19/10, noche): para el movil la referencia buena es el nodejs-project de + la APK oficial, no el git del dev. Parte de lo que la fase C saco de backend.js era + codigo de movil del propio dev; backend.js vuelve a ser su version de movil mas dos + lineas (montar nuestro router), y modules_view.js su version de movil. Contra la APK + oficial la rama cambia 17 ficheros y 561 lineas; la lista esta en la guia. - Fuera Karvan (19/10): el dev ya trae Telefono y Salas, asi que se quita el modulo propio de salas y llamadas (modelo, vista, JS, CSS, router, pruebas, textos). `Clear-SNH.css` y `modules_view.js` vuelven a ser identicos a los del dev y la linea diff --git a/docs/capturas/esquema-rama.png b/docs/capturas/esquema-rama.png index 8d8269fb38a2801e7e74d0c9609958d40fa4549c..6ff6027be77a37d458c113fdd19016f75a2c2f9d 100644 GIT binary patch literal 55395 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 y>NKVv`aA;1m_3Id7hGM|?6 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 diff --git a/docs/capturas/generar_portada.py b/docs/capturas/generar_portada.py index c794be4..4973ba7 100644 --- a/docs/capturas/generar_portada.py +++ b/docs/capturas/generar_portada.py @@ -161,7 +161,7 @@ def esquema_rama(): ((400, 210, 720, 400), "PANTALLAS", ["mobile_ui.js y las vistas", "mobile_*.js. En una vista", "del dev, como mucho una", "línea que las llama"], NEON), ((740, 210, 1060, 400), "RUTAS", - ["fork_routes.js y", "mobile_layer.js, delante", "del router del dev: lo que", "no atienden pasa al suyo"], NEON), + ["fork_routes.js, delante", "del router del dev: lo", "que no atiende pasa al", "suyo"], NEON), ((1080, 210, 1340, 400), "ANDROID", ["la app del dev tal cual,", "con nuestro backend", "dentro y paquete", "propio"], NEON), ] @@ -173,7 +173,7 @@ def esquema_rama(): caja(d, (60, 500, 1340, 690), "OASIS DEL DEV: NO SE TOCA", ["backend.js y su middleware · los modelos (lo que se publica y cómo se cuenta) · SSB y su arranque", "las traducciones · style.css y mobile.css · los temas, también OasisMobile.css", - "De 6.400 líneas cambiadas en 43 ficheros suyos (octubre) a 1.045 en 40. Ver GUIA_DE_DESARROLLO.md"], BG) + "Comparado con su APK oficial, la rama cambia 17 ficheros suyos y 561 líneas. Ver GUIA_DE_DESARROLLO.md"], BG) out.save(HERE / "esquema-rama.png", optimize=True) diff --git a/src/backend/backend.js b/src/backend/backend.js index 6374a55..39ef244 100644 --- a/src/backend/backend.js +++ b/src/backend/backend.js @@ -1644,6 +1644,17 @@ debug("Current configuration: %O", config); debug(`You can save the above to ${defaultConfigFile} to make \ these settings the default. See the readme for details.`); const { saveConfig, getConfig } = require('../configs/config-manager'); +if (process.env.OASIS_MOBILE === '1') { + try { + const cfg = getConfig(); + const forced = ['ai', 'aiNav', 'dev', 'games', 'logs', 'maps', 'pixelia'].filter(m => cfg.modules && cfg.modules[`${m}Mod`] !== 'off'); + let dirty = false; + if (forced.length) { forced.forEach(m => { cfg.modules[`${m}Mod`] = 'off'; }); dirty = true; } + const w = cfg.wallet || {}; + if (w.url === 'http://127.0.0.1:17474' && w.user === 'oasis' && w.pass === 'testpass123') { cfg.wallet = { ...w, url: 'http://127.0.0.1:7474', user: '', pass: '' }; dirty = true; } + if (dirty) saveConfig(cfg); + } catch (_) {} +} const oasisCheckPath = "/.well-known/oasis"; process.on("uncaughtException", function (err) { if (err["code"] === "EADDRINUSE") { @@ -5103,6 +5114,7 @@ router }) .get('/blockexplorer', async (ctx) => { + if (process.env.OASIS_MOBILE === '1') { ctx.redirect('/'); return; } const userId = getViewerId(); const query = ctx.query || {}; const search = { @@ -5153,6 +5165,7 @@ router ctx.body = renderBlockchainView(blockchainData, filter, userId, search, { inspect, censusBlocks }); }) .get('/blockexplorer/block/:id', async (ctx) => { + if (process.env.OASIS_MOBILE === '1') { ctx.redirect('/'); return; } const userId = getViewerId(); const query = ctx.query || {}; const search = { @@ -8473,8 +8486,8 @@ router const available = { profile: true, ux: true, - workflow: isLoopbackRequest(ctx), - theme: true, + workflow: process.env.OASIS_MOBILE !== '1' && isLoopbackRequest(ctx), + theme: process.env.OASIS_MOBILE !== '1', community: checkMod(ctx, 'invitesMod'), greeting: checkMod(ctx, 'feedMod') }; @@ -11509,6 +11522,40 @@ router try { await forumModel.removeOpenInvite(ctx.params.id); } catch (_) { actionFail(ctx); return; } ctx.redirect(safeReturnTo(ctx, `/forum/${encodeURIComponent(ctx.params.id)}`, ['/forum'])); }) + .get('/backup/keys/export', async (ctx) => { + if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } + if (process.env.OASIS_MOBILE !== '1') { ctx.redirect('/backup'); return; } + const pw = String(ctx.query.password || ''); + if (!pw || pw.length < 32) return ctx.redirect('/backup'); + try { + const { filename, data } = await backupModel.exportKeys({ password: pw }); + ctx.set('Content-Type', 'application/octet-stream'); + ctx.set('Content-Disposition', `attachment; filename="${filename}"`); + ctx.set('Content-Length', String(data.length)); + ctx.body = data; + try { onboardingModel.markStep('backup'); } catch (_) {} + } catch (error) { sendErrorPage(ctx, error.message); } + }) + .get('/backup/export', async (ctx) => { + if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } + if (process.env.OASIS_MOBILE !== '1') { ctx.redirect('/backup'); return; } + if (!checkMod(ctx, 'backupMod')) return ctx.redirect('/modules'); + const b = ctx.query || {}; + const pw = String(b.password || ''); + if (pw.length < 32) return ctx.redirect('/backup'); + const rawMods = b.modules === undefined ? [] : (Array.isArray(b.modules) ? b.modules : [b.modules]); + const outPath = path.join(os.tmpdir(), `oasis-backup-${process.pid}-${Date.now()}.oasisbk`); + try { + const res = await backupModel.createBackup({ scope: b.scope, blobs: b.blobs, modules: rawMods, since: b.since }, pw, outPath); + ctx.set('Content-Type', 'application/octet-stream'); + ctx.set('Content-Disposition', `attachment; filename="${res.filename}"`); + ctx.set('Content-Length', String(res.bytes)); + const stream = fs.createReadStream(outPath); + stream.on('close', () => { try { fs.unlinkSync(outPath); } catch (_) {} }); + ctx.body = stream; + try { onboardingModel.markStep('backup'); } catch (_) {} + } catch (error) { try { fs.unlinkSync(outPath); } catch (_) {} sendErrorPage(ctx, error.message); } + }) .post('/backup/keys/export', koaBody(), async (ctx) => { if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } const pw = ctx.request.body.password; @@ -14601,6 +14648,7 @@ router }) .post("/update", koaBody(), async (ctx) => { if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } + if (process.env.OASIS_MOBILE === '1') { ctx.redirect('/settings'); return; } const exec = require("node:util").promisify(require("node:child_process").exec); const repoRoot = path.resolve(__dirname, '..', '..'); const { stdout, stderr } = await exec("git reset --hard && git pull", { cwd: repoRoot }); @@ -15127,6 +15175,7 @@ router }) .post("/modules/preset", koaBody(), async (ctx) => { if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } + if (process.env.OASIS_MOBILE === '1') { ctx.redirect('/modules'); return; } const ALL_MODULES = workflowsModel.ALL_MODULES; const PRESETS = workflowsModel.PRESETS; const preset = String(ctx.request.body.preset || ''); @@ -15138,10 +15187,14 @@ router ctx.redirect('/modules'); }) .post("/save-modules", koaBody(), async (ctx) => { + const MOBILE_UNAVAILABLE_MODS = ['ai', 'aiNav', 'dev', 'games', 'logs', 'maps', 'pixelia']; if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } const modules = workflowsModel.ALL_MODULES; const cfg = getConfig(); modules.forEach(mod => cfg.modules[`${mod}Mod`] = ctx.request.body[`${mod}Form`] === 'on' ? 'on' : 'off'); + if (process.env.OASIS_MOBILE === '1') { + MOBILE_UNAVAILABLE_MODS.forEach(mod => cfg.modules[`${mod}Mod`] = 'off'); + } saveConfig(cfg); ctx.redirect(`/modules`); }) @@ -15411,6 +15464,14 @@ const kickRefresh = () => { }; setTimeout(() => { if (!sharedState.getLastRefresh()) kickRefresh(); }, 5000); const middleware = [ + async (ctx, next) => { + await next(); + if (process.env.OASIS_MOBILE !== '1' || typeof ctx.body !== 'string' || !String(ctx.type || '').includes('html')) return; + ctx.body = ctx.body.replace(/]*>/g, (tag) => tag.replace(/\bsrc="(\/blob\/[^"#]+)"/, 'src="$1#t=0.1"')); + const tab = ['/mentions', '/inbox', '/phone', '/data', '/tags', '/search', '/settings'].find((t) => ctx.path === t || ctx.path.startsWith(t + '/')); + const headerEnd = ctx.body.indexOf('
'); + if (tab && headerEnd > 0) ctx.body = ctx.body.slice(0, headerEnd).replace(` { if (ctx.method === 'GET' && /^recent$/i.test(String(ctx.query.filter || '')) && ['q', 'search'].some(k => String(ctx.query[k] || '').trim())) ctx.query = { ...ctx.query, filter: ctx.query.filter === 'RECENT' ? 'ALL' : 'all' }; await next(); @@ -15515,8 +15576,7 @@ const middleware = [ await next(); }, // la rama movil: su router y su capa de backend (ver GUIA_DE_DESARROLLO.md) - require('./fork_routes')({ checkMod, getViewerId, getConfig, saveConfig, isLoopbackRequest, sendErrorPage, - about, backupModel, onboardingModel }), + require('./fork_routes')({ checkMod, getViewerId, getConfig, saveConfig, isLoopbackRequest, sendErrorPage, about }), routes, async (ctx) => { if (ctx.body != null || (ctx.method !== 'GET' && ctx.method !== 'HEAD')) return; diff --git a/src/backend/fork_routes.js b/src/backend/fork_routes.js index 7a064e8..368ef0c 100644 --- a/src/backend/fork_routes.js +++ b/src/backend/fork_routes.js @@ -3,7 +3,7 @@ // // Va en la cadena justo delante de las rutas del dev (backend.js lo monta con una // sola linea). Lo que no atiende pasa al del dev con next(). Aqui viven: -// - mobile_layer.js: lo que el movil necesita del backend +// - mobile_layer.js: lanzador, filtro y avatar de la barra de arriba // - wrapUpstream: mira lo que contesta el dev (seccion apagada, guardar modulos) // - las rutas propias: tema y Modulos en el movil, barra de abajo, identidades // @@ -51,10 +51,8 @@ const wrapUpstream = async (ctx, next) => { } }; -module.exports = ({ checkMod, getViewerId, getConfig, saveConfig, isLoopbackRequest, sendErrorPage, - about, backupModel, onboardingModel }) => { -const mobileLayer = require('./mobile_layer')({ getConfig, saveConfig, getViewerId, about, backupModel, onboardingModel, - checkMod, isLoopbackRequest, sendErrorPage }); +module.exports = ({ checkMod, getViewerId, getConfig, saveConfig, isLoopbackRequest, sendErrorPage, about }) => { +const mobileLayer = require('./mobile_layer')({ getViewerId, about }); const forkRouter = new koaRouter(); forkRouter diff --git a/src/backend/mobile_layer.js b/src/backend/mobile_layer.js index c89f8ed..3fc3f18 100644 --- a/src/backend/mobile_layer.js +++ b/src/backend/mobile_layer.js @@ -1,49 +1,20 @@ "use strict"; -// Lo que el movil necesita del backend, fuera de backend.js. +// Lo que la interfaz de la rama necesita del backend, fuera de backend.js. // -// Antes eran trozos metidos en backend.js (rutas, middleware y refreshAll), que es -// del dev y cambia en 34 de cada 39 versiones. Ahora va aqui y lo monta el router -// propio (fork_routes.js) delante de las rutas del dev. Nada de esto corre en -// escritorio. Ver GUIA_DE_DESARROLLO.md. +// Prepara lo que leen la barra de arriba y el lanzador de hive_views.js: el filtro +// Personal/Social, si el lanzador se ensena en esta pagina y el avatar propio. Lo +// monta el router propio (fork_routes.js) delante de las rutas del dev. Nada de +// esto corre en escritorio. Ver GUIA_DE_DESARROLLO.md. // -// Hace cuatro cosas: -// - corta en el movil rutas que alli no tienen sentido (blockexplorer, actualizar -// con git, presets de modulos); el cambio de tema lo atiende fork_routes.js -// - mantiene apagados los modulos que no van en el movil, al arrancar y al guardar -// - prepara lo que leen la barra de arriba y el lanzador (avatar, filtro, lanzador) -// - retoca el HTML que sale (videos con fotograma, pestaña actual marcada) -// Y sirve las dos descargas de la copia de seguridad, que en el movil van por GET. +// Lo demas que el movil necesita del backend (modulos que no van, rutas que se +// cortan, retoques del HTML, descargas de la copia de seguridad) lo hace el propio +// dev en la version de movil de su backend.js, la que va dentro de su APK. -const fs = require('fs'); -const os = require('os'); -const path = require('path'); -const compose = require('../server/node_modules/koa-compose'); - -const MOBILE_UNAVAILABLE_MODS = ['ai', 'aiNav', 'dev', 'games', 'logs', 'maps', 'pixelia']; const NULL_IMG = '&' + '0'.repeat(43) + '=.sha256'; -const TAB_PATHS = ['/mentions', '/inbox', '/phone', '/data', '/tags', '/search', '/settings']; const isMobile = () => process.env.OASIS_MOBILE === '1'; const isPage = (p) => !/^\/(assets|image|blob|qr|c)(\/|$)/.test(p); -module.exports = ({ getConfig, saveConfig, getViewerId, about, backupModel, onboardingModel, - checkMod, isLoopbackRequest, sendErrorPage }) => { - // --- al arrancar: modulos que no van en el movil, apagados; y la cartera de - // pruebas que traia la config de serie, fuera - if (isMobile()) { - try { - const cfg = getConfig(); - let dirty = false; - MOBILE_UNAVAILABLE_MODS.forEach(m => { if (cfg.modules && cfg.modules[`${m}Mod`] !== 'off') { cfg.modules[`${m}Mod`] = 'off'; dirty = true; } }); - const w = cfg.wallet || {}; - if (w.url === 'http://127.0.0.1:17474' && w.user === 'oasis' && w.pass === 'testpass123') { - cfg.wallet = { ...w, url: 'http://127.0.0.1:7474', user: '', pass: '' }; - dirty = true; - } - if (dirty) saveConfig(cfg); - } catch (_) {} - } - - // --- avatar propio para el circulo de la barra de arriba (lo lee hive_views) +module.exports = ({ getViewerId, about }) => { let avatarAt = 0; const refreshAvatar = async () => { avatarAt = Date.now(); @@ -56,78 +27,12 @@ module.exports = ({ getConfig, saveConfig, getViewerId, about, backupModel, onbo } catch (_) {} }; - // --- rutas que en el movil se cortan antes de llegar al dev - const guards = async (ctx, next) => { - if (!isMobile()) return next(); - const p = ctx.path; - if (ctx.method === 'GET' && (p === '/blockexplorer' || p.startsWith('/blockexplorer/block/'))) { ctx.redirect('/'); return; } - if (ctx.method === 'POST' && p === '/update') { ctx.redirect('/settings'); return; } - if (ctx.method === 'POST' && p === '/modules/preset') { ctx.redirect('/modules'); return; } + return async (ctx, next) => { + if (!isMobile() || !isPage(ctx.path)) return next(); + global.__OASIS_HIVE_FILTER__ = (ctx.path === '/activity' && (ctx.query.hive === 'personal' || ctx.query.hive === 'community')) ? ctx.query.hive : ''; + global.__OASIS_SHOW_HIVE__ = (ctx.path === '/activity' || ctx.path === '/'); + if (!avatarAt) await refreshAvatar(); + else if (Date.now() - avatarAt > 60000) refreshAvatar(); return next(); }; - - // --- antes y despues de las rutas del dev - const around = async (ctx, next) => { - if (!isMobile()) return next(); - if (isPage(ctx.path)) { - // filtro de la home (Personal/Social) y lanzador solo en la portada - global.__OASIS_HIVE_FILTER__ = (ctx.path === '/activity' && (ctx.query.hive === 'personal' || ctx.query.hive === 'community')) ? ctx.query.hive : ''; - global.__OASIS_SHOW_HIVE__ = (ctx.path === '/activity' || ctx.path === '/'); - if (!avatarAt) await refreshAvatar(); - else if (Date.now() - avatarAt > 60000) refreshAvatar(); - } - await next(); - // guardar modulos: los que no van en el movil siguen apagados - if (ctx.method === 'POST' && ctx.path === '/save-modules' && ctx.status >= 300 && ctx.status < 400) { - try { - const cfg = getConfig(); - MOBILE_UNAVAILABLE_MODS.forEach(m => { cfg.modules[`${m}Mod`] = 'off'; }); - saveConfig(cfg); - } catch (_) {} - } - if (typeof ctx.body !== 'string' || !String(ctx.type || '').includes('html')) return; - // los videos sin poster salen en negro en el WebView: se pide el fotograma 0.1 - ctx.body = ctx.body.replace(/]*>/g, (tag) => tag.replace(/\bsrc="(\/blob\/[^"#]+)"/, 'src="$1#t=0.1"')); - // la pestaña de la cabecera que corresponde a esta pagina - const tab = TAB_PATHS.find((t) => ctx.path === t || ctx.path.startsWith(t + '/')); - const headerEnd = ctx.body.indexOf('
'); - if (tab && headerEnd > 0) ctx.body = ctx.body.slice(0, headerEnd).replace(` { - if (ctx.method !== 'GET' || (ctx.path !== '/backup/keys/export' && ctx.path !== '/backup/export')) return next(); - if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; } - if (!isMobile()) { ctx.redirect('/backup'); return; } - const q = ctx.query || {}; - const pw = String(q.password || ''); - if (!pw || pw.length < 32) { ctx.redirect('/backup'); return; } - if (ctx.path === '/backup/keys/export') { - try { - const { filename, data } = await backupModel.exportKeys({ password: pw }); - ctx.set('Content-Type', 'application/octet-stream'); - ctx.set('Content-Disposition', `attachment; filename="${filename}"`); - ctx.set('Content-Length', String(data.length)); - ctx.body = data; - try { onboardingModel.markStep('backup'); } catch (_) {} - } catch (error) { sendErrorPage(ctx, error.message); } - return; - } - if (!checkMod(ctx, 'backupMod')) { ctx.redirect('/modules'); return; } - const rawMods = q.modules === undefined ? [] : (Array.isArray(q.modules) ? q.modules : [q.modules]); - const outPath = path.join(os.tmpdir(), `oasis-backup-${process.pid}-${Date.now()}.oasisbk`); - try { - const res = await backupModel.createBackup({ scope: q.scope, blobs: q.blobs, modules: rawMods, since: q.since }, pw, outPath); - ctx.set('Content-Type', 'application/octet-stream'); - ctx.set('Content-Disposition', `attachment; filename="${res.filename}"`); - ctx.set('Content-Length', String(res.bytes)); - const stream = fs.createReadStream(outPath); - stream.on('close', () => { try { fs.unlinkSync(outPath); } catch (_) {} }); - ctx.body = stream; - try { onboardingModel.markStep('backup'); } catch (_) {} - } catch (error) { try { fs.unlinkSync(outPath); } catch (_) {} sendErrorPage(ctx, error.message); } - }; - - return compose([around, guards, backup]); }; diff --git a/src/views/modules_view.js b/src/views/modules_view.js index 9aeb4a9..c558559 100644 --- a/src/views/modules_view.js +++ b/src/views/modules_view.js @@ -66,13 +66,17 @@ const modulesView = () => { { name: 'wiki', label: i18n.modulesWikiLabel, description: i18n.modulesWikiDescription } ].sort((x, y) => String(x.label || x.name).localeCompare(String(y.label || y.name), undefined, { sensitivity: 'base' })); - const moduleStates = modules.reduce((acc, mod) => { + const MOBILE_UNAVAILABLE = ['ai', 'aiNav', 'dev', 'games', 'logs', 'maps', 'pixelia']; + const isMobile = process.env.OASIS_MOBILE === '1'; + const visibleModules = isMobile ? modules.filter(mod => !MOBILE_UNAVAILABLE.includes(mod.name)) : modules; + + const moduleStates = visibleModules.reduce((acc, mod) => { acc[`${mod.name}Mod`] = config[`${mod.name}Mod`] === 'on' ? 'on' : 'off'; return acc; }, {}); - const activeModulesCount = modules.filter(mod => moduleStates[`${mod.name}Mod`] === 'on').length; - const totalModulesCount = modules.length; + const activeModulesCount = visibleModules.filter(mod => moduleStates[`${mod.name}Mod`] === 'on').length; + const totalModulesCount = visibleModules.length; const disabledModulesCount = totalModulesCount - activeModulesCount; const header = [div({ class: 'tags-header module-header-line' }, @@ -100,7 +104,7 @@ const modulesView = () => { const presetButtons = div({ class: 'preset-group' }, Object.entries(PRESETS).map(([key, mods]) => { const presetLabel = (i18n[`modulesPreset_${key}`] || key).toUpperCase(); - const isActive = modules.every(m => mods.includes(m.name) === (moduleStates[`${m.name}Mod`] === 'on')); + const isActive = visibleModules.every(m => mods.includes(m.name) === (moduleStates[`${m.name}Mod`] === 'on')); return form({ action: "/modules/preset", method: "post", class: "modules-preset-form" }, input({ type: "hidden", name: "preset", value: key }), button({ @@ -115,8 +119,7 @@ const modulesView = () => { i18n.modules, section(header), section( - h2(i18n.modulesPresetTitle || "Common Configurations"), - presetButtons, + ...(isMobile ? [] : [h2(i18n.modulesPresetTitle || "Common Configurations"), presetButtons]), counts, form( { action: "/save-modules", method: "post" }, @@ -127,7 +130,7 @@ const modulesView = () => { td(i18n.modulesModuleDescription), td({ class: 'module-status-cell' }, i18n.modulesModuleStatus) ), - modules.map(mod => + visibleModules.map(mod => tr( td(a({ href: `/${mod.name}` }, mod.label)), td(p(mod.description)),