From de066abb54cddbc15e3197aa9c9521eb15f99c09 Mon Sep 17 00:00:00 2001 From: Johan LEROY Date: Fri, 17 Jul 2026 17:44:36 +0200 Subject: [PATCH] feat(server): handshake token pour un shell embarquant le daemon (app de bureau) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dans runDaemon, si ARBORETUM_EMIT_TOKEN_FD est fourni, mint un token 'desktop' et l'écrit en JSON {token,url} sur ce descripteur (pipe stdio privé parent-enfant). Additif et gardé : sans la variable, comportement strictement inchangé. Permettra à l'app Electron d'ouvrir la SPA déjà authentifiée sans écran de login. Vérifié (handshake OK), 431 tests. --- packages/server/src/index.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index b25da24..a73775b 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { readFileSync } from 'node:fs'; +import { readFileSync, writeSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { loadConfig, type Config } from './config.js'; @@ -48,6 +48,20 @@ export async function runDaemon(config: Config): Promise { console.log('Tokens are stored hashed and cannot be re-printed. Create a new one from Settings (or reset the db).'); } + // Handshake pour un shell embarquant le daemon (app de bureau) : si ARBORETUM_EMIT_TOKEN_FD est + // fourni, on mint un token frais et on l'écrit en JSON sur ce descripteur (pipe stdio privé + // parent<->enfant). Additif : sans cette variable, comportement strictement inchangé. Le token ne + // transite jamais par le renderer et n'est pas affiché. + const emitFd = process.env.ARBORETUM_EMIT_TOKEN_FD; + if (emitFd) { + try { + const token = auth.createToken('desktop'); + writeSync(Number(emitFd), `${JSON.stringify({ token, url })}\n`); + } catch (err) { + app.log.warn(`token handshake failed: ${err instanceof Error ? err.message : String(err)}`); + } + } + let shuttingDown = false; const shutdown = (signal: string): void => { if (shuttingDown) return;