read vnc password and port from user home instead of env vars

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-04 19:59:59 +00:00
co-authored by Claude Opus 4.6
parent 79668e436b
commit d5245e5418
4 changed files with 34 additions and 6 deletions
+4 -2
View File
@@ -1,9 +1,11 @@
import { createRouter } from '../../create-router';
import { getVncPassword } from './vnc-config';
export const desktopRouter = createRouter();
desktopRouter.get('/vnc-password', (ctx) => {
const password = process.env.VNC_PASSWORD;
desktopRouter.get('/vnc-password', async (ctx) => {
const user = ctx.get('user');
const password = await getVncPassword(user.email, user.role);
if (!password) {
return ctx.json({ error: 'VNC password not configured' }, 500);
}
+22
View File
@@ -0,0 +1,22 @@
import { join } from 'node:path';
import { getHomeDir } from '@@/data-path';
function getVncDir(email: string, role: string | null): string {
const home = role === 'Super Admin' && process.env.HOME_DIR
? process.env.HOME_DIR
: getHomeDir(email);
return join(home, '.vnc');
}
export async function getVncPassword(email: string, role: string | null): Promise<string | null> {
const file = Bun.file(join(getVncDir(email, role), 'password'));
if (!(await file.exists())) return null;
return (await file.text()).trim();
}
export async function getVncPort(email: string, role: string | null): Promise<number> {
const file = Bun.file(join(getVncDir(email, role), 'port'));
if (!(await file.exists())) return 5901;
const port = parseInt((await file.text()).trim(), 10);
return isNaN(port) ? 5901 : port;
}
+3 -3
View File
@@ -1,5 +1,6 @@
import type { ServerWebSocket } from 'bun';
import type { Socket } from 'bun';
import { getVncPort } from './vnc-config';
type WSData = { userId: number; email: string; username: string; role: string; sandboxed: boolean; sessionId?: string };
@@ -8,8 +9,6 @@ type VncSession = {
pendingMessages: Buffer[];
};
const VNC_PORT = Number(process.env.VNC_PORT || 5901);
const sessions = new Map<ServerWebSocket<WSData>, VncSession>();
export const desktopWebsocket = {
@@ -19,13 +18,14 @@ export const desktopWebsocket = {
return;
}
const port = await getVncPort(ws.data.email, ws.data.role);
const session: VncSession = { tcpSocket: null, pendingMessages: [] };
sessions.set(ws, session);
try {
const tcpSocket = await Bun.connect({
hostname: '127.0.0.1',
port: VNC_PORT,
port,
socket: {
data(_socket, data) {
try {