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
+5 -1
View File
@@ -5,7 +5,7 @@ set -euo pipefail
# Run as the user who will own the VNC session (not root). # Run as the user who will own the VNC session (not root).
# Usage: ./scripts/setup-desktop.sh <vnc-password> [resolution] # Usage: ./scripts/setup-desktop.sh <vnc-password> [resolution]
VNC_PASS="${1:-$(head -c 6 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 8)}" VNC_PASS="${1:-$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 8)}"
RESOLUTION="${2:-1920x1080}" RESOLUTION="${2:-1920x1080}"
USER_NAME="$(whoami)" USER_NAME="$(whoami)"
ENV_FILE="$(cd "$(dirname "$0")/.." && pwd)/.env" ENV_FILE="$(cd "$(dirname "$0")/.." && pwd)/.env"
@@ -51,6 +51,10 @@ echo "[3/8] Configuring VNC password..."
mkdir -p ~/.vnc mkdir -p ~/.vnc
echo "$VNC_PASS" | vncpasswd -f > ~/.vnc/passwd echo "$VNC_PASS" | vncpasswd -f > ~/.vnc/passwd
chmod 600 ~/.vnc/passwd chmod 600 ~/.vnc/passwd
# Plain-text password + port for the Officer server to read
echo -n "$VNC_PASS" > ~/.vnc/password
chmod 600 ~/.vnc/password
echo "5901" > ~/.vnc/port
echo " Done." echo " Done."
# --- Step 4: Create xstartup --- # --- Step 4: Create xstartup ---
+4 -2
View File
@@ -1,9 +1,11 @@
import { createRouter } from '../../create-router'; import { createRouter } from '../../create-router';
import { getVncPassword } from './vnc-config';
export const desktopRouter = createRouter(); export const desktopRouter = createRouter();
desktopRouter.get('/vnc-password', (ctx) => { desktopRouter.get('/vnc-password', async (ctx) => {
const password = process.env.VNC_PASSWORD; const user = ctx.get('user');
const password = await getVncPassword(user.email, user.role);
if (!password) { if (!password) {
return ctx.json({ error: 'VNC password not configured' }, 500); 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 { ServerWebSocket } from 'bun';
import type { Socket } 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 }; type WSData = { userId: number; email: string; username: string; role: string; sandboxed: boolean; sessionId?: string };
@@ -8,8 +9,6 @@ type VncSession = {
pendingMessages: Buffer[]; pendingMessages: Buffer[];
}; };
const VNC_PORT = Number(process.env.VNC_PORT || 5901);
const sessions = new Map<ServerWebSocket<WSData>, VncSession>(); const sessions = new Map<ServerWebSocket<WSData>, VncSession>();
export const desktopWebsocket = { export const desktopWebsocket = {
@@ -19,13 +18,14 @@ export const desktopWebsocket = {
return; return;
} }
const port = await getVncPort(ws.data.email, ws.data.role);
const session: VncSession = { tcpSocket: null, pendingMessages: [] }; const session: VncSession = { tcpSocket: null, pendingMessages: [] };
sessions.set(ws, session); sessions.set(ws, session);
try { try {
const tcpSocket = await Bun.connect({ const tcpSocket = await Bun.connect({
hostname: '127.0.0.1', hostname: '127.0.0.1',
port: VNC_PORT, port,
socket: { socket: {
data(_socket, data) { data(_socket, data) {
try { try {