Обновление файла
This commit is contained in:
@@ -9,15 +9,16 @@
|
|||||||
3. Проксирует бинарный VNC-поток между браузером клиента и Proxmox.
|
3. Проксирует бинарный VNC-поток между браузером клиента и Proxmox.
|
||||||
|
|
||||||
Особенности Proxmox:
|
Особенности Proxmox:
|
||||||
- PVE может вернуть HTTP redirect (302) на `https://...` вместо `wss://...`
|
- В Proxmox 8.x+ vncticket может содержать спецсимволы (#, /, %, :),
|
||||||
при WebSocket-handshake. Библиотека `websockets` не умеет следовать за
|
которые ломают парсинг URL (RFC 3986). Кодируем их через quote().
|
||||||
такими redirect (https ≠ ws/wss), поэтому перехватываем redirect
|
- PVE может вернуть HTTP redirect (302) на `https://...` вместо `wss://...`;
|
||||||
и переписываем scheme.
|
перехватываем и переписываем scheme через process_redirect.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from typing import Optional, Tuple
|
from typing import Optional, Tuple
|
||||||
|
from urllib.parse import quote
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
import websockets
|
import websockets
|
||||||
@@ -93,9 +94,14 @@ async def console_ws(
|
|||||||
|
|
||||||
guest_path = "qemu" if guest_type == "vm" else "lxc"
|
guest_path = "qemu" if guest_type == "vm" else "lxc"
|
||||||
pve_host_only = settings.pve_host.replace("http://", "").replace("https://", "")
|
pve_host_only = settings.pve_host.replace("http://", "").replace("https://", "")
|
||||||
|
# quote() экранирует спецсимволы в тикете и порте по правилам RFC 3986,
|
||||||
|
# не затрагивая уже экранированные символы. Без этого в Proxmox 8.x+
|
||||||
|
# vncticket может содержать # / % : которые ломают URL.
|
||||||
|
safe_ticket = quote(ticket, safe="")
|
||||||
|
safe_port = quote(str(port), safe="")
|
||||||
upstream_url = (
|
upstream_url = (
|
||||||
f"wss://{pve_host_only}/api2/json/nodes/{node}/{guest_path}/{vmid}/vncwebsocket"
|
f"wss://{pve_host_only}/api2/json/nodes/{node}/{guest_path}/{vmid}/vncwebsocket"
|
||||||
f"?port={port}&vncticket={ticket}"
|
f"?port={safe_port}&vncticket={safe_ticket}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Определяем способ аутентификации.
|
# Определяем способ аутентификации.
|
||||||
|
|||||||
Reference in New Issue
Block a user