mirror of
https://github.com/kbumsik/VirtScreen.git
synced 2025-03-09 15:40:18 +00:00
Security: Sanitized /home/kbumsik and /opt/anaconda/bin:/opt/anaconda/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/lib/emscripten:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/opt/staruml/:/usr/lib/emscripten:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/opt/staruml/:/home/kbumsik/opt/emsdk-portable:/opt/cdt-stand-alone-debugger:/home/kbumsik/opt/emsdk-portable:/opt/cdt-stand-alone-debugger
This commit is contained in:
parent
b0baf026c5
commit
a5bc16ddda
1 changed files with 82 additions and 75 deletions
157
virtscreen.py
157
virtscreen.py
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
import sys, os, subprocess, signal, re, atexit, time, json, shutil
|
import sys, os, subprocess, signal, re, atexit, time, json, shutil
|
||||||
|
from pathlib import Path
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import List, Dict
|
from typing import List, Dict
|
||||||
|
|
||||||
|
@ -15,7 +16,13 @@ from netifaces import interfaces, ifaddresses, AF_INET
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# file path definitions
|
# file path definitions
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
HOME_PATH = os.getenv('HOME', None)
|
# Sanitize environment variables
|
||||||
|
# https://wiki.sei.cmu.edu/confluence/display/c/ENV03-C.+Sanitize+the+environment+when+invoking+external+programs
|
||||||
|
del os.environ['HOME'] # Delete $HOME env for security reason. This will make
|
||||||
|
# Path.home() to look up in the password directory (pwd module)
|
||||||
|
os.environ['PATH'] = os.confstr("CS_PATH") # Sanitize $PATH
|
||||||
|
|
||||||
|
HOME_PATH = str(Path.home())
|
||||||
if HOME_PATH is not None:
|
if HOME_PATH is not None:
|
||||||
HOME_PATH = HOME_PATH + "/.virtscreen"
|
HOME_PATH = HOME_PATH + "/.virtscreen"
|
||||||
X11VNC_LOG_PATH = HOME_PATH + "/x11vnc_log.txt"
|
X11VNC_LOG_PATH = HOME_PATH + "/x11vnc_log.txt"
|
||||||
|
@ -46,6 +53,80 @@ class SubprocessWrapper:
|
||||||
|
|
||||||
def run(self, arg: str) -> str:
|
def run(self, arg: str) -> str:
|
||||||
return subprocess.run(arg.split(), stdout=subprocess.PIPE).stdout.decode('utf-8')
|
return subprocess.run(arg.split(), stdout=subprocess.PIPE).stdout.decode('utf-8')
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Twisted class
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
class ProcessProtocol(protocol.ProcessProtocol):
|
||||||
|
def __init__(self, onConnected, onOutReceived, onErrRecevied, onProcessEnded, logfile=None):
|
||||||
|
self.onConnected = onConnected
|
||||||
|
self.onOutReceived = onOutReceived
|
||||||
|
self.onErrRecevied = onErrRecevied
|
||||||
|
self.onProcessEnded = onProcessEnded
|
||||||
|
self.logfile = logfile
|
||||||
|
|
||||||
|
def run(self, arg: str):
|
||||||
|
"""Spawn a process
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
arg {str} -- arguments in string
|
||||||
|
"""
|
||||||
|
|
||||||
|
args = arg.split()
|
||||||
|
reactor.spawnProcess(self, args[0], args=args, env=os.environ)
|
||||||
|
|
||||||
|
def kill(self):
|
||||||
|
"""Kill a spawned process
|
||||||
|
"""
|
||||||
|
self.transport.signalProcess('INT')
|
||||||
|
|
||||||
|
def connectionMade(self):
|
||||||
|
print("connectionMade!")
|
||||||
|
self.onConnected()
|
||||||
|
self.transport.closeStdin() # No more input
|
||||||
|
|
||||||
|
def outReceived(self, data):
|
||||||
|
# print("outReceived! with %d bytes!" % len(data))
|
||||||
|
self.onOutReceived(data)
|
||||||
|
if self.logfile is not None:
|
||||||
|
self.logfile.write(data)
|
||||||
|
|
||||||
|
def errReceived(self, data):
|
||||||
|
# print("errReceived! with %d bytes!" % len(data))
|
||||||
|
self.onErrRecevied(data)
|
||||||
|
if self.logfile is not None:
|
||||||
|
self.logfile.write(data)
|
||||||
|
|
||||||
|
def inConnectionLost(self):
|
||||||
|
print("inConnectionLost! stdin is closed! (we probably did it)")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def outConnectionLost(self):
|
||||||
|
print("outConnectionLost! The child closed their stdout!")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def errConnectionLost(self):
|
||||||
|
print("errConnectionLost! The child closed their stderr.")
|
||||||
|
pass
|
||||||
|
|
||||||
|
def processExited(self, reason):
|
||||||
|
exitCode = reason.value.exitCode
|
||||||
|
if exitCode is None:
|
||||||
|
print("Unknown exit")
|
||||||
|
return
|
||||||
|
print("processEnded, status", exitCode)
|
||||||
|
|
||||||
|
def processEnded(self, reason):
|
||||||
|
if self.logfile is not None:
|
||||||
|
self.logfile.close()
|
||||||
|
exitCode = reason.value.exitCode
|
||||||
|
if exitCode is None:
|
||||||
|
print("Unknown exit")
|
||||||
|
self.onProcessEnded(1)
|
||||||
|
return
|
||||||
|
print("processEnded, status", exitCode)
|
||||||
|
print("quitting")
|
||||||
|
self.onProcessEnded(exitCode)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Display properties
|
# Display properties
|
||||||
|
@ -249,80 +330,6 @@ class XRandR(SubprocessWrapper):
|
||||||
self.call(f"xrandr --delmode {self.virt.name} {self.mode_name}")
|
self.call(f"xrandr --delmode {self.virt.name} {self.mode_name}")
|
||||||
atexit.unregister(self.delete_virtual_screen)
|
atexit.unregister(self.delete_virtual_screen)
|
||||||
self._update_screens()
|
self._update_screens()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
# Twisted class
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
class ProcessProtocol(protocol.ProcessProtocol):
|
|
||||||
def __init__(self, onConnected, onOutReceived, onErrRecevied, onProcessEnded, logfile=None):
|
|
||||||
self.onConnected = onConnected
|
|
||||||
self.onOutReceived = onOutReceived
|
|
||||||
self.onErrRecevied = onErrRecevied
|
|
||||||
self.onProcessEnded = onProcessEnded
|
|
||||||
self.logfile = logfile
|
|
||||||
|
|
||||||
def run(self, arg: str):
|
|
||||||
"""Spawn a process
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
arg {str} -- arguments in string
|
|
||||||
"""
|
|
||||||
|
|
||||||
args = arg.split()
|
|
||||||
reactor.spawnProcess(self, args[0], args=args, env=os.environ)
|
|
||||||
|
|
||||||
def kill(self):
|
|
||||||
"""Kill a spawned process
|
|
||||||
"""
|
|
||||||
self.transport.signalProcess('INT')
|
|
||||||
|
|
||||||
def connectionMade(self):
|
|
||||||
print("connectionMade!")
|
|
||||||
self.onConnected()
|
|
||||||
self.transport.closeStdin() # No more input
|
|
||||||
|
|
||||||
def outReceived(self, data):
|
|
||||||
# print("outReceived! with %d bytes!" % len(data))
|
|
||||||
self.onOutReceived(data)
|
|
||||||
if self.logfile is not None:
|
|
||||||
self.logfile.write(data)
|
|
||||||
|
|
||||||
def errReceived(self, data):
|
|
||||||
# print("errReceived! with %d bytes!" % len(data))
|
|
||||||
self.onErrRecevied(data)
|
|
||||||
if self.logfile is not None:
|
|
||||||
self.logfile.write(data)
|
|
||||||
|
|
||||||
def inConnectionLost(self):
|
|
||||||
print("inConnectionLost! stdin is closed! (we probably did it)")
|
|
||||||
pass
|
|
||||||
|
|
||||||
def outConnectionLost(self):
|
|
||||||
print("outConnectionLost! The child closed their stdout!")
|
|
||||||
pass
|
|
||||||
|
|
||||||
def errConnectionLost(self):
|
|
||||||
print("errConnectionLost! The child closed their stderr.")
|
|
||||||
pass
|
|
||||||
|
|
||||||
def processExited(self, reason):
|
|
||||||
exitCode = reason.value.exitCode
|
|
||||||
if exitCode is None:
|
|
||||||
print("Unknown exit")
|
|
||||||
return
|
|
||||||
print("processEnded, status", exitCode)
|
|
||||||
|
|
||||||
def processEnded(self, reason):
|
|
||||||
if self.logfile is not None:
|
|
||||||
self.logfile.close()
|
|
||||||
exitCode = reason.value.exitCode
|
|
||||||
if exitCode is None:
|
|
||||||
print("Unknown exit")
|
|
||||||
self.onProcessEnded(1)
|
|
||||||
return
|
|
||||||
print("processEnded, status", exitCode)
|
|
||||||
print("quitting")
|
|
||||||
self.onProcessEnded(exitCode)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# QML Backend class
|
# QML Backend class
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue