diff --git a/.gitignore b/.gitignore index 9b0095b..9ab84dd 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,7 @@ internal/server/static/utils/ internal/server/static/novnc-original.html # Downloaded VNC server (installed via scripts/get-vnc.ps1) -/vnc/ \ No newline at end of file +/vnc/ + +# Stored web access password + hash (created by set-password.bat) +webvnc.conf diff --git a/AGENTS.md b/AGENTS.md index 93657d7..2a480d9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -63,22 +63,30 @@ scripts/get-novnc.{ps1,sh} скачать noVNC scripts/get-vnc.ps1 скачать портативный UltraVNC в vnc/ (с верификацией zip) scripts/list-ips.ps1 список IPv4 машины (используется run.bat) scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (от админа) -scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с паролем из run.bat (пишет только при несовпадении; UAC только при смене) — вызывается из run.bat -run.bat запуск в один клик (спрашивает только пароль); синхронизирует VNC-пароль UltraVNC с введённым (см. ensure-vnc-password.ps1); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему +scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat +set-password.bat настройка пароля: спрашивает пароль, синхронизирует VNC-пароль UltraVNC (ensure-vnc-password.ps1), генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored). Если установлено задание «web-vnc» — перезапускает его через scripts/restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс). +webvnc.conf создаётся set-password.bat; содержит HASH= и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore). +run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему +scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ищет только ЛОКАЛЬНЫЙ VNC-сервер (ничего не качает), запускает web-vnc.exe в foreground. Вызывается плановым заданием из install-autostart.bat. +scripts/install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf. +scripts/uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа). +scripts/restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную. ``` ## Соглашения и подводные камни -- **Кодировка файлов `.bat`:** **UTF-8 с BOM**, окончания строк **CRLF**, и `chcp 65001 >nul` - после `@echo off`. Именно **BOM** заставляет `cmd` читать .bat как UTF-8 независимо - от OEM-кодировки консоли (без BOM + `chcp 65001` в `cmd` даёт `????` — cmd читает - файл по OEM-кодировке, а не по `chcp`). BOM + `chcp 65001` проверено: кириллица в - `echo`/`set /p`/`for /f` отображается корректно, `@echo off` работает. Альтернатива - без BOM — включить системную опцию «Beta: Use Unicode UTF-8 for worldwide language - support» (тогда OEM-кодировка = 65001), но это влияет на всю систему (нужен reboot, - могут ломаться legacy-приложения под cp866/cp1251) — поэтому по умолчанию BOM. - Пиши через `[System.IO.File]::WriteAllText(path, content -replace "(?nul` + после `@echo off` (BOM заставлял `cmd` читать файл как UTF-8; без BOM + `chcp 65001` в + `cmd` давал `????`, т.к. cmd читает файл по OEM-кодировке, а не по `chcp`). Альтернатива + без BOM — системная опция «Beta: Use Unicode UTF-8 for worldwide language support» + (OEM=65001), но она влияет на всю систему (reboot, могут ломаться legacy-приложения + под cp866/cp1251). Если когда-нибудь вернёшь кириллицу в `.bat` — пиши через + `[System.IO.File]::WriteAllText(path, content -replace "(? --listen :8080` в foreground (задание держит + процесс живым). Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) — запускает + **без** `--spawn` и **без** `--spawn-command`, подключаясь к существующему серверу + (иначе попытка породить второй VNC-сервер конфликтовала бы с сервисом). +4. Снять автостарт: `scripts/uninstall-autostart.bat` (от админа) — `schtasks /Delete`. + +Замечания: +- Задание выполняется от `SYSTEM`, поэтому VNC-сервер, отдавающий рабочий стол, должен + быть отдельным сервисом (UltraVNC `uvnc_service`) — `autostart-run.bat` его НЕ порождает, + а лишь подключается к `127.0.0.1:5900`. Портативный `vnc\winvnc.exe` используется только + если 5900 ещё не слушает. +- **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз + при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому + `set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через + `scripts\restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли + `web-vnc.exe`, и делает `schtasks /End` + `/Run` (или только `/Run`, если процесс не + запущен). Рестарт пропускается, если пароль не изменился (детект по старому `VNC_PASSWORD` + из `webvnc.conf`, т.к. PBKDF2-хэш всегда новый из-за соли). Если задание не установлено — + `set-password.bat` только пишет `webvnc.conf` и подсказывает `install-autostart.bat`. Для + интерактивного `run.bat` нового пароля — просто перезапусти его вручную. ## Что делать дальше (известные TODO) - Надёжный авто-скачиватель VNC-сервера (URL UltraVNC на SourceForge нестабилен — @@ -122,6 +165,6 @@ run.bat запуск в один клик (спрашивае **UltraVNC как сервис (`uvnc_service`, LocalSystem):** пароль хранится в `%ProgramData%\UltraVNC\ultravnc.ini`; задать его обычным пользователем через tray-иконку молча не получается (нет прав на запись). - `run.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1` + `set-password.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1` (пишет только при несовпадении; UAC только при смене пароля). VNC-пароль = первые 8 байт, - поэтому используй ASCII-пароль <= 8 символов и там, и в `run.bat`. + поэтому используй ASCII-пароль <= 8 символов и в `set-password.bat`, и в VNC-сервере. diff --git a/README.md b/README.md index f8f0242..53a7f86 100644 --- a/README.md +++ b/README.md @@ -18,29 +18,53 @@ Go-модулей, собирается офлайн. └─ прозрачный релей WS↔TCP ``` -## Самый простой запуск (Windows) — одним батником +## Самый простой запуск (Windows) -В папке проекта есть `run.bat`. Он делает всё сам и спрашивает **только пароль**: +Запуск состоит из двух шагов: один раз задаётся пароль, затем `run.bat` поднимает +gateway без запросов. -```bat -run.bat -``` +1. **Один раз** задайте пароль: + ```bat + set-password.bat + ``` + Спросит пароль доступа, синхронизирует им пароль UltraVNC-сервиса + (`scripts\ensure-vnc-password.ps1`, UAC только при смене), сгенерирует хэш и + сохранит его вместе с паролем в `webvnc.conf` (секрет, в git не коммитится). + Используйте ASCII-пароль длиной до 8 символов (VNC-пароль = первые 8 байт). -Что делает `run.bat`: -1. Если `web-vnc.exe` отсутствует — собирает его (нужен установленный Go). - Если Go нет — подсказывает, что сделать. -2. Если noVNC-клиент ещё не встроен — пытается его скачать (нужен интернет). - Без интернета продолжит работу, но в браузере будет страница-заглушка. -3. Спрашивает пароль доступа. -4. Генерирует из него хэш. -5. Ищет VNC-сервер: если он не установлен — пытается скачать портативный - UltraVNC (`scripts\get-vnc.ps1`) и запускать его. -6. Выводит список всех адресов для подключения (`http://localhost:8080` и - `http://<каждый IPv4 машины>:8080`) и запускает сервер с флагом `--spawn`. +2. **Запустите gateway**: + ```bat + run.bat + ``` + `run.bat` собирает `web-vnc.exe` (нужен Go, если бинарника нет), встраивает + noVNC-клиент (качает при наличии интернета), находит/докачивает VNC-сервер, + читает пароль из `webvnc.conf` (больше не спрашивает), печатает адреса + (`http://localhost:8080` и `http://<каждый IPv4 машины>:8080`) и запускает + сервер с флагом `--spawn`. Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) — + запускается без `--spawn`, подключаясь к существующему серверу. После запуска откройте в браузере один из выведенных адресов, введите тот же пароль — и попадёте на рабочий стол. +### Автостарт при загрузке ОС (вместо ручного `run.bat`) + +```bat +set-password.bat :: один раз: пароль -> webvnc.conf +scripts\install-autostart.bat :: один раз (от админа): плановое задание «web-vnc» +``` +`install-autostart.bat` регистрирует через `schtasks` задание (`ONSTART`, `SYSTEM`, +`HIGHEST`), которое при загрузке запускает `scripts\autostart-run.bat` — +неинтерактивный launcher, читающий `webvnc.conf` и не качающий ничего на старте. +Запустить сразу без перезагрузки: `schtasks /Run /TN "web-vnc"`. +Снять автостарт: `scripts\uninstall-autostart.bat` (от админа). + +**Смена пароля:** `web-vnc.exe` читает пароль из `webvnc.conf` только при старте и не +перечитывает его в runtime. Поэтому `set-password.bat` (если задание «web-vnc» установлено) +перезапускает его через `scripts\restart-autostart.bat` (с elevation) — тот проверяет, +запущен ли `web-vnc.exe` (если да — стоп + старт, если нет — только старт). Рестарт +пропускается, если пароль не изменился. Для интерактивного `run.bat` просто перезапустите +его вручную. + ## Быстрый старт вручную (Windows) ```powershell @@ -186,7 +210,13 @@ scripts/get-novnc.{ps1,sh} скачать noVNC во встроенную ста scripts/get-vnc.ps1 скачать портативный VNC-сервер (UltraVNC) в папку vnc/ scripts/list-ips.ps1 список IPv4 машины (используется run.bat) scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа) -run.bat запуск в один клик (спрашивает только пароль) +run.bat интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает) +set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC +webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored) +scripts/autostart-run.bat неинтерактивный launcher для автостарта (читает webvnc.conf) +scripts/install-autostart.bat автостарт при загрузке ОС (schtasks ONSTART/SYSTEM) — от админа +scripts/uninstall-autostart.bat снять автостарт — от админа +scripts/restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа ``` ## Кросс-компиляция под другую ОС diff --git a/run.bat b/run.bat index 188b170..143a5f4 100644 --- a/run.bat +++ b/run.bat @@ -1,6 +1,9 @@ @echo off REM ============================================================ -REM web-vnc launcher - one-click start, asks only for the password. +REM web-vnc launcher - starts the gateway without prompting. +REM The password is set up once with set-password.bat (stored in +REM webvnc.conf). If webvnc.conf is missing, this script tells you +REM to run set-password.bat first. REM ============================================================ cd /d "%~dp0" @@ -70,31 +73,29 @@ echo Install UltraVNC/TightVNC manually or retry: scripts\get-vnc.ps1 echo. :vncdone -REM --- 4. Password --- -:getpw -set "PW=" -set /p "PW=Enter access password: " -if "%PW%"=="" goto emptypw -goto gotpw -:emptypw -echo Password cannot be empty. -goto getpw -:gotpw - -REM --- 4b. Sync UltraVNC password with the one entered (only when it differs) --- -echo Syncing UltraVNC password with the one entered. It will ask for admin rights if they differ... -powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%" -if errorlevel 1 echo [warning] Could not sync the UltraVNC password - continuing. - -REM --- 5. Password hash + same password for the VNC server --- -echo Generating password hash ... -for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i" -if "%HASH%"=="" goto hashfail +REM --- 4. Stored password (set up once via set-password.bat) --- +if not exist "webvnc.conf" goto nopwconf +set "HASH=" +set "VNC_PW=" +for /f "tokens=1,* delims==" %%a in (webvnc.conf) do ( + if /i "%%a"=="HASH" set "HASH=%%b" + if /i "%%a"=="VNC_PASSWORD" set "VNC_PW=%%b" +) +if "%HASH%"=="" goto nopwconf +if "%VNC_PW%"=="" goto nopwconf REM The same password is auto-sent to noVNC to authenticate against the VNC server. -set "WEBVNC_VNC_PASSWORD=%PW%" -set "PW=" +set "WEBVNC_VNC_PASSWORD=%VNC_PW%" +set "VNC_PW=" +goto havepw +:nopwconf +echo [error] Password is not configured yet. +echo Run set-password.bat once to set the password, then start run.bat. +echo. +pause +exit /b 1 +:havepw -REM --- 6. Available addresses --- +REM --- 5. Available addresses --- echo. echo === Addresses to connect to (port 8080) === echo http://localhost:8080 @@ -104,7 +105,7 @@ echo If it does not open from another machine, run once as administrator: echo scripts\open-firewall.bat echo. -REM --- 7. Launch --- +REM --- 6. Launch --- echo Starting web-vnc on http://localhost:8080 echo Stop: Ctrl+C echo. @@ -114,6 +115,7 @@ powershell -NoProfile -Command "try{$c=New-Object Net.Sockets.TcpClient('127.0.0 if not errorlevel 1 ( echo VNC server already listening on 127.0.0.1:5900 - connecting to it without --spawn. set "SPAWNFLAG=" + set "SPAWNARGS=" ) web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080 echo. @@ -124,9 +126,4 @@ exit /b :buildfail echo Build failed. pause -exit /b 1 - -:hashfail -echo [error] Could not generate the password hash. -pause exit /b 1 \ No newline at end of file diff --git a/scripts/autostart-run.bat b/scripts/autostart-run.bat new file mode 100644 index 0000000..27d9dca --- /dev/null +++ b/scripts/autostart-run.bat @@ -0,0 +1,52 @@ +@echo off +REM ============================================================ +REM autostart-run.bat - non-interactive launcher used by the +REM scheduled task created by install-autostart.bat. +REM Reads the password from webvnc.conf, finds a LOCAL VNC server +REM (does NOT download anything), and starts web-vnc.exe in the +REM foreground. The task keeps the process alive and restarts it +REM on next boot. +REM Exit codes: 0 = server ran and stopped; 1 = no binary; +REM 2 = password not configured; other = web-vnc error. +REM ============================================================ +cd /d "%~dp0" + +REM --- 1. Binary (build if Go is available, else fail) --- +if not exist "web-vnc.exe" ( + where go >nul 2>nul + if not errorlevel 1 ( + go build -o web-vnc.exe .\cmd\web-vnc >nul 2>nul + ) +) +if not exist "web-vnc.exe" exit /b 1 + +REM --- 2. Stored password --- +if not exist "webvnc.conf" exit /b 2 +set "HASH=" +set "VNC_PW=" +for /f "tokens=1,* delims==" %%a in (webvnc.conf) do ( + if /i "%%a"=="HASH" set "HASH=%%b" + if /i "%%a"=="VNC_PASSWORD" set "VNC_PW=%%b" +) +if "%HASH%"=="" exit /b 2 +if "%VNC_PW%"=="" exit /b 2 +set "WEBVNC_VNC_PASSWORD=%VNC_PW%" +set "VNC_PW=" + +REM --- 3. VNC server (detect local only; never download at boot) --- +set "SPAWNARGS=" +set "SPAWN_CMD=" +if exist "vnc\winvnc.exe" set "SPAWN_CMD=vnc\winvnc.exe -run" +if exist "vnc\tvnserver.exe" if not defined SPAWN_CMD set "SPAWN_CMD=vnc\tvnserver.exe -run" +if defined SPAWN_CMD set "SPAWNARGS=--spawn-command "%SPAWN_CMD%"" + +set "SPAWNFLAG=--spawn" +powershell -NoProfile -Command "try{$c=New-Object Net.Sockets.TcpClient('127.0.0.1',5900);$c.Close();exit 0}catch{exit 1}" +if not errorlevel 1 ( + set "SPAWNFLAG=" + set "SPAWNARGS=" +) + +REM --- 4. Launch (foreground; the task host keeps it alive) --- +web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080 +exit /b %errorlevel% \ No newline at end of file diff --git a/scripts/install-autostart.bat b/scripts/install-autostart.bat new file mode 100644 index 0000000..893db86 --- /dev/null +++ b/scripts/install-autostart.bat @@ -0,0 +1,48 @@ +@echo off +REM ============================================================ +REM install-autostart.bat - register web-vnc as a startup task. +REM Creates a scheduled task "web-vnc" that runs at system startup +REM (as SYSTEM, highest privileges) and launches +REM scripts\autostart-run.bat in the foreground. +REM Requires administrator rights (auto-elevates). +REM Run set-password.bat first to configure the password. +REM ============================================================ +cd /d "%~dp0" + +REM Admin check + auto-elevate. +net session >nul 2>nul +if errorlevel 1 ( + echo Requesting administrator rights ... + powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs" + exit /b +) + +if not exist "webvnc.conf" ( + echo [error] Password is not configured. Run set-password.bat first. + pause + exit /b 1 +) +if not exist "scripts\autostart-run.bat" ( + echo [error] scripts\autostart-run.bat not found. + pause + exit /b 1 +) + +set "TASK=web-vnc" +set "CMD=%~dp0scripts\autostart-run.bat" + +echo Creating scheduled task "%TASK%" (startup, SYSTEM, highest) ... +schtasks /Create /TN "%TASK%" /TR "cmd /c \"%CMD%\"" /SC ONSTART /RU SYSTEM /RL HIGHEST /F +if errorlevel 1 ( + echo [error] Could not create the task. + pause + exit /b 1 +) + +echo. +echo Done. web-vnc will start automatically on every boot. +echo Start it now (without rebooting): +echo schtasks /Run /TN "%TASK%" +echo Remove it with: scripts\uninstall-autostart.bat +echo. +pause \ No newline at end of file diff --git a/scripts/restart-autostart.bat b/scripts/restart-autostart.bat new file mode 100644 index 0000000..94eda42 --- /dev/null +++ b/scripts/restart-autostart.bat @@ -0,0 +1,58 @@ +@echo off +REM ============================================================ +REM restart-autostart.bat - restart the "web-vnc" task so the +REM running gateway reloads webvnc.conf (e.g. after set-password.bat +REM changed the password). web-vnc.exe reads the hash and the VNC +REM password only once at startup, so a restart is the only way to +REM apply a new password to the live gateway. +REM +REM It first checks whether web-vnc.exe is actually running: +REM - running -> stop the task (schtasks /End) and start it again; +REM - not running -> just start it (no /End). +REM Requires administrator rights (the task runs as SYSTEM), so it +REM auto-elevates. Called from set-password.bat, or run manually. +REM ============================================================ +cd /d "%~dp0" + +net session >nul 2>nul +if errorlevel 1 ( + echo Requesting administrator rights ... + powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs" + exit /b +) + +set "TASK=web-vnc" + +schtasks /Query /TN "%TASK%" >nul 2>nul +if errorlevel 1 ( + echo [error] Task "%TASK%" is not installed. Run scripts\install-autostart.bat first. + pause + exit /b 1 +) + +REM --- Is web-vnc.exe currently running? --- +set "RUNNING=0" +tasklist /FI "IMAGENAME eq web-vnc.exe" 2>nul | findstr /I /B /C:"web-vnc.exe" >nul +if not errorlevel 1 set "RUNNING=1" + +if "%RUNNING%"=="1" ( + echo web-vnc.exe is running - restarting task "%TASK%" ... + schtasks /End /TN "%TASK%" >nul 2>nul + REM give the previous process a moment to release port 8080 + timeout /t 2 /nobreak >nul +) else ( + echo web-vnc.exe is NOT running - just starting task "%TASK%" ... +) + +schtasks /Run /TN "%TASK%" +if errorlevel 1 ( + echo [error] Could not start the task. + pause + exit /b 1 +) + +echo. +echo Done. web-vnc reloaded the password from webvnc.conf. +echo Check it at http://localhost:8080 +echo. +pause \ No newline at end of file diff --git a/scripts/uninstall-autostart.bat b/scripts/uninstall-autostart.bat new file mode 100644 index 0000000..44165a1 --- /dev/null +++ b/scripts/uninstall-autostart.bat @@ -0,0 +1,26 @@ +@echo off +REM ============================================================ +REM uninstall-autostart.bat - remove the web-vnc startup task. +REM Deletes the scheduled task "web-vnc" created by +REM install-autostart.bat. Requires administrator rights +REM (auto-elevates). +REM ============================================================ +cd /d "%~dp0" + +net session >nul 2>nul +if errorlevel 1 ( + echo Requesting administrator rights ... + powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs" + exit /b +) + +set "TASK=web-vnc" +echo Removing scheduled task "%TASK%" ... +schtasks /Delete /TN "%TASK%" /F +if errorlevel 1 ( + echo [error] Could not remove the task (maybe it does not exist). + pause + exit /b 1 +) +echo Done. +pause \ No newline at end of file diff --git a/set-password.bat b/set-password.bat new file mode 100644 index 0000000..5a94261 --- /dev/null +++ b/set-password.bat @@ -0,0 +1,108 @@ +@echo off +REM ============================================================ +REM set-password.bat - setup of the web access password. +REM Asks for the password, syncs the UltraVNC service password, +REM generates a hash and saves both to webvnc.conf (gitignored). +REM After this, run.bat and the autostart task start without asking. +REM +REM If the "web-vnc" autostart task is installed, this script also +REM restarts it (elevated, via scripts\restart-autostart.bat) so the +REM running gateway reloads the new password. The restart is skipped +REM only when the password did not actually change (the running gateway +REM already accepts it). restart-autostart.bat checks whether +REM web-vnc.exe is running and stops+starts it, or just starts it. +REM ============================================================ +cd /d "%~dp0" + +echo. +echo === web-vnc: password setup === +echo. + +REM --- 1. Binary (needed for --gen-hash) --- +if exist "web-vnc.exe" goto havebin +where go >nul 2>nul +if errorlevel 1 ( + echo [error] web-vnc.exe not found and Go is not installed. + echo Build it first with: go build -o web-vnc.exe .\cmd\web-vnc + echo or run run.bat once interactively. + pause + exit /b 1 +) +echo Building web-vnc.exe ... +go build -o web-vnc.exe .\cmd\web-vnc +if errorlevel 1 ( + echo Build failed. + pause + exit /b 1 +) +:havebin + +REM --- 2. Remember the previous password (to detect a real change) --- +set "OLD_PW=" +if exist "webvnc.conf" ( + for /f "tokens=1,* delims==" %%a in (webvnc.conf) do if /i "%%a"=="VNC_PASSWORD" set "OLD_PW=%%b" +) + +REM --- 3. Ask password --- +:getpw +set "PW=" +set /p "PW=Enter access password (ASCII, max 8 chars for VNC): " +if "%PW%"=="" ( + echo Password cannot be empty. + goto getpw +) + +REM --- 4. Sync UltraVNC service password (UAC only if it differs) --- +echo Syncing UltraVNC password with the one entered ... +powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%" +if errorlevel 1 echo [warning] Could not sync the UltraVNC password - continuing. + +REM --- 5. Generate hash --- +echo Generating password hash ... +set "HASH=" +for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i" +if "%HASH%"=="" ( + echo [error] Could not generate the password hash. + pause + exit /b 1 +) + +REM --- 6. Save to webvnc.conf (overwrite) --- +echo HASH=%HASH%> "webvnc.conf" +echo VNC_PASSWORD=%PW%>> "webvnc.conf" +set "HASH=" +echo Saved to webvnc.conf. + +REM --- 7. Apply to the running gateway (if the autostart task is installed) --- +REM web-vnc.exe reads the hash + VNC password only at startup, so a +REM restart is required for the new password to take effect. +schtasks /Query /TN "web-vnc" >nul 2>nul +if errorlevel 1 goto no_task + +REM Skip the restart if the password did not change (the running gateway +REM already accepts it; PBKDF2 hash is always new due to salt, so we compare +REM the entered password with the old VNC_PASSWORD from webvnc.conf). +if not defined OLD_PW goto do_restart +if /i not "%OLD_PW%"=="%PW%" goto do_restart +echo. +echo Password unchanged - the running gateway keeps accepting it. No restart needed. +echo If the gateway is not running, start it with: scripts\restart-autostart.bat ^(admin^) +goto cleanup + +:do_restart +echo. +echo Applying the new password to the "web-vnc" task ^(needs admin^) ... +powershell -NoProfile -Command "Start-Process -FilePath '%~dp0scripts\restart-autostart.bat' -Verb RunAs -Wait" +goto cleanup + +:no_task +echo. +echo Autostart task "web-vnc" is not installed. +echo To start on every boot, run once as administrator: +echo scripts\install-autostart.bat + +:cleanup +set "PW=" +set "OLD_PW=" +echo. +pause \ No newline at end of file