umbau 1.2
This commit is contained in:
@ -419,6 +419,20 @@ async def rdp_tunnel(
|
|||||||
host, password.decode(), session_id=session_id, username=cred_row[1], domain=cred_row[2],
|
host, password.decode(), session_id=session_id, username=cred_row[1], domain=cred_row[2],
|
||||||
client_name=f"jumphost-{user.username}", timezone=safe_timezone,
|
client_name=f"jumphost-{user.username}", timezone=safe_timezone,
|
||||||
)
|
)
|
||||||
|
if host.get("file_transfer_enabled"):
|
||||||
|
# Bug-Fix (Live-Test, RDP-Teilstrecke, 2.9.): guacd/FreeRDPs
|
||||||
|
# "create-drive-path" legt nur das BLATT-Verzeichnis an, keine
|
||||||
|
# fehlenden Elternverzeichnisse (kein "mkdir -p"). Bisher wurde
|
||||||
|
# ausschliesslich data_dir/recordings_dir beim Start angelegt
|
||||||
|
# (siehe app/db.py) -- das Elternverzeichnis .../rdp-drives/<host_id>/
|
||||||
|
# existierte fuer einen frischen Host nie, wodurch guacd mit
|
||||||
|
# "Unable to create directory ... No such file or directory"
|
||||||
|
# abbrach. Deshalb hier explizit VOR dem Tunnelaufbau mit
|
||||||
|
# parents=True anlegen (blockierendes Datei-I/O -> Thread, wie
|
||||||
|
# bei _cleanup_rdp_drive_path()).
|
||||||
|
await asyncio.to_thread(
|
||||||
|
rdp_drive_path(host_id, session_id).mkdir, parents=True, exist_ok=True
|
||||||
|
)
|
||||||
tunnel = await open_tunnel(
|
tunnel = await open_tunnel(
|
||||||
guacd_host=settings.guacd_host, guacd_port=settings.guacd_port,
|
guacd_host=settings.guacd_host, guacd_port=settings.guacd_port,
|
||||||
protocol="rdp", params=params, screen_width=width, screen_height=height, dpi=dpi,
|
protocol="rdp", params=params, screen_width=width, screen_height=height, dpi=dpi,
|
||||||
|
|||||||
@ -1325,16 +1325,19 @@
|
|||||||
});
|
});
|
||||||
const fitAddon = new FitAddon.FitAddon();
|
const fitAddon = new FitAddon.FitAddon();
|
||||||
term.loadAddon(fitAddon);
|
term.loadAddon(fitAddon);
|
||||||
|
term.open(container);
|
||||||
// Bug-Fix (Live-Test, F.6/Aufgabe#11, siehe terminal.js _setupTerminal()
|
// Bug-Fix (Live-Test, F.6/Aufgabe#11, siehe terminal.js _setupTerminal()
|
||||||
// fuer die ausfuehrliche Begruendung): DOM-Renderer-Faerbung wird durch
|
// fuer die ausfuehrliche Begruendung): DOM-Renderer-Faerbung wird durch
|
||||||
// die strikte CSP (style-src 'self') stillschweigend verworfen. Canvas-
|
// die strikte CSP (style-src 'self') stillschweigend verworfen. Canvas-
|
||||||
// Renderer zeichnet stattdessen direkt auf <canvas> und ist CSP-unabhaengig.
|
// Renderer zeichnet stattdessen direkt auf <canvas> und ist CSP-unabhaengig.
|
||||||
|
// Muss NACH term.open() geladen werden -- vorher hat der Container noch
|
||||||
|
// keine echten Masse, das <canvas> wird dann zu klein angelegt (Live-Test
|
||||||
|
// am 2.9. gefunden: sah wie eine haengende Markierung aus).
|
||||||
try {
|
try {
|
||||||
term.loadAddon(new CanvasAddon.CanvasAddon());
|
term.loadAddon(new CanvasAddon.CanvasAddon());
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn("CanvasAddon konnte nicht geladen werden, Fallback auf DOM-Renderer:", err);
|
console.warn("CanvasAddon konnte nicht geladen werden, Fallback auf DOM-Renderer:", err);
|
||||||
}
|
}
|
||||||
term.open(container);
|
|
||||||
fitAddon.fit();
|
fitAddon.fit();
|
||||||
|
|
||||||
const proto = window.location.protocol === "https:" ? "wss:" : "ws:";
|
const proto = window.location.protocol === "https:" ? "wss:" : "ws:";
|
||||||
@ -1436,16 +1439,19 @@
|
|||||||
});
|
});
|
||||||
const fitAddon = new FitAddon.FitAddon();
|
const fitAddon = new FitAddon.FitAddon();
|
||||||
term.loadAddon(fitAddon);
|
term.loadAddon(fitAddon);
|
||||||
|
term.open(container);
|
||||||
// Bug-Fix (Live-Test, F.6/Aufgabe#11, siehe terminal.js _setupTerminal()
|
// Bug-Fix (Live-Test, F.6/Aufgabe#11, siehe terminal.js _setupTerminal()
|
||||||
// fuer die ausfuehrliche Begruendung): DOM-Renderer-Faerbung wird durch
|
// fuer die ausfuehrliche Begruendung): DOM-Renderer-Faerbung wird durch
|
||||||
// die strikte CSP (style-src 'self') stillschweigend verworfen. Canvas-
|
// die strikte CSP (style-src 'self') stillschweigend verworfen. Canvas-
|
||||||
// Renderer zeichnet stattdessen direkt auf <canvas> und ist CSP-unabhaengig.
|
// Renderer zeichnet stattdessen direkt auf <canvas> und ist CSP-unabhaengig.
|
||||||
|
// Muss NACH term.open() geladen werden -- vorher hat der Container noch
|
||||||
|
// keine echten Masse, das <canvas> wird dann zu klein angelegt (Live-Test
|
||||||
|
// am 2.9. gefunden: sah wie eine haengende Markierung aus).
|
||||||
try {
|
try {
|
||||||
term.loadAddon(new CanvasAddon.CanvasAddon());
|
term.loadAddon(new CanvasAddon.CanvasAddon());
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn("CanvasAddon konnte nicht geladen werden, Fallback auf DOM-Renderer:", err);
|
console.warn("CanvasAddon konnte nicht geladen werden, Fallback auf DOM-Renderer:", err);
|
||||||
}
|
}
|
||||||
term.open(container);
|
|
||||||
fitAddon.fit();
|
fitAddon.fit();
|
||||||
|
|
||||||
const playBtn = document.getElementById("rec-playpause-btn");
|
const playBtn = document.getElementById("rec-playpause-btn");
|
||||||
|
|||||||
@ -299,6 +299,7 @@
|
|||||||
});
|
});
|
||||||
this.fitAddon = new FitAddon.FitAddon();
|
this.fitAddon = new FitAddon.FitAddon();
|
||||||
this.term.loadAddon(this.fitAddon);
|
this.term.loadAddon(this.fitAddon);
|
||||||
|
this.term.open(this.terminalContainer);
|
||||||
// Bug-Fix (Live-Test, F.6/Aufgabe#11): xterm.js' Standard-DOM-Renderer
|
// Bug-Fix (Live-Test, F.6/Aufgabe#11): xterm.js' Standard-DOM-Renderer
|
||||||
// faerbt Zellen (inkl. Markierungs-Hintergrund) teils per dynamisch
|
// faerbt Zellen (inkl. Markierungs-Hintergrund) teils per dynamisch
|
||||||
// erzeugtem <style>-Element, teils per element.setAttribute("style", ...).
|
// erzeugtem <style>-Element, teils per element.setAttribute("style", ...).
|
||||||
@ -309,6 +310,14 @@
|
|||||||
// funktioniert. Der Canvas-Renderer zeichnet Zeichen/Farben stattdessen
|
// funktioniert. Der Canvas-Renderer zeichnet Zeichen/Farben stattdessen
|
||||||
// direkt auf ein <canvas> (Pixel statt CSS) und ist von style-src nicht
|
// direkt auf ein <canvas> (Pixel statt CSS) und ist von style-src nicht
|
||||||
// betroffen -- CSP bleibt dadurch unveraendert strikt.
|
// betroffen -- CSP bleibt dadurch unveraendert strikt.
|
||||||
|
//
|
||||||
|
// WICHTIG: erst NACH term.open() laden. Vor dem Oeffnen hat der
|
||||||
|
// Container noch keine echten Masse (Flex-Layout noch nicht berechnet);
|
||||||
|
// ein zu frueh geladener CanvasAddon legt sein <canvas> mit einer viel
|
||||||
|
// zu kleinen Zeilenzahl an. Ergebnis: das <canvas> deckt nur die
|
||||||
|
// obersten paar Zeilen ab, darunter blieb der reine DOM-Hintergrund
|
||||||
|
// (schwarz) sichtbar -- sah wie eine falsche/haengende Markierung aus,
|
||||||
|
// war aber ein Groessen-Mismatch (im Live-Test am 2.9. gefunden).
|
||||||
try {
|
try {
|
||||||
this.canvasAddon = new CanvasAddon.CanvasAddon();
|
this.canvasAddon = new CanvasAddon.CanvasAddon();
|
||||||
this.term.loadAddon(this.canvasAddon);
|
this.term.loadAddon(this.canvasAddon);
|
||||||
@ -319,7 +328,6 @@
|
|||||||
// CSP-Fix abhaengig, aber die Sitzung funktioniert weiterhin.
|
// CSP-Fix abhaengig, aber die Sitzung funktioniert weiterhin.
|
||||||
console.warn("CanvasAddon konnte nicht geladen werden, Fallback auf DOM-Renderer:", err);
|
console.warn("CanvasAddon konnte nicht geladen werden, Fallback auf DOM-Renderer:", err);
|
||||||
}
|
}
|
||||||
this.term.open(this.terminalContainer);
|
|
||||||
if (this.themeSelect) this.themeSelect.value = this._themeName;
|
if (this.themeSelect) this.themeSelect.value = this._themeName;
|
||||||
|
|
||||||
this.term.onData((data) => {
|
this.term.onData((data) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user