aboutsummaryrefslogtreecommitdiff
path: root/rwa/support/sessionservice/vnc.py
diff options
context:
space:
mode:
Diffstat (limited to 'rwa/support/sessionservice/vnc.py')
-rw-r--r--rwa/support/sessionservice/vnc.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/rwa/support/sessionservice/vnc.py b/rwa/support/sessionservice/vnc.py
new file mode 100644
index 0000000..1725532
--- /dev/null
+++ b/rwa/support/sessionservice/vnc.py
@@ -0,0 +1,57 @@
+# This file is part of Remote Support Desktop
+# https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.sessionservice
+# Copyright 2020, 2021 Jonathan Weth <dev@jonathanweth.de>
+# Copyright 2020 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
+# Copyright 2020 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+import os
+import subprocess
+from typing import Dict
+from uuid import uuid4
+
+import port_for
+
+
+def save_password(pw: str) -> str:
+ """Save password in x11vnc format in temporary directory."""
+ filename = f"/tmp/rwa/{uuid4()}.pw"
+ os.makedirs("/tmp/rwa/", exist_ok=True)
+ p = subprocess.Popen(["x11vnc", "-storepasswd", f"{pw}", filename])
+ p.communicate()
+ return filename
+
+
+def run_vnc(pw_filename: str) -> Dict[str, Dict[str, int]]:
+ """Run x11vnc and websockify with random, unique ports in background."""
+ port = port_for.select_random()
+ port_vnc = port_for.select_random()
+
+ # Start VNC process
+ p = subprocess.Popen(["x11vnc", "-rfbauth", pw_filename, "-rfbport", f"{port_vnc}"])
+
+ # Start websockify
+ p2 = subprocess.Popen(f"websockify {port} 127.0.0.1:{port_vnc}", shell=True,)
+
+ return {
+ "ws": {"pid": p2.pid, "port": port},
+ "vnc": {"port": port_vnc, "pid": p.pid},
+ }