A couple of socket fixes so root fenrir and user fenrir do not battle.

This commit is contained in:
Storm Dragon
2026-05-07 23:37:01 -04:00
parent 8638bca1d5
commit 6d4f55ffe5
2 changed files with 30 additions and 13 deletions
@@ -14,10 +14,7 @@ INSTANCE_TIMEOUT_SEC = 30.0
def get_registry_dir(): def get_registry_dir():
return os.path.join( return os.path.join(tempfile.gettempdir(), "fenrirscreenreader-instances")
tempfile.gettempdir(),
f"fenrirscreenreader-instances-{os.getuid()}",
)
def get_instance_file(pid=None): def get_instance_file(pid=None):
@@ -28,13 +25,14 @@ def get_instance_file(pid=None):
def write_instance(instance_data): def write_instance(instance_data):
registry_dir = get_registry_dir() registry_dir = get_registry_dir()
os.makedirs(registry_dir, mode=0o700, exist_ok=True) os.makedirs(registry_dir, mode=0o755, exist_ok=True)
os.chmod(registry_dir, 0o700) os.chmod(registry_dir, 0o755)
instance_data["updated_at"] = time.time() instance_data["updated_at"] = time.time()
instance_path = get_instance_file(instance_data.get("pid")) instance_path = get_instance_file(instance_data.get("pid"))
with open(instance_path, "w", encoding="utf-8") as instance_file: with open(instance_path, "w", encoding="utf-8") as instance_file:
json.dump(instance_data, instance_file, sort_keys=True) json.dump(instance_data, instance_file, sort_keys=True)
instance_file.write("\n") instance_file.write("\n")
os.chmod(instance_path, 0o644)
def remove_instance(pid=None): def remove_instance(pid=None):
@@ -23,7 +23,7 @@ class driver(remoteDriver):
def __init__(self): def __init__(self):
remoteDriver.__init__(self) remoteDriver.__init__(self)
self.fenrirSocks = [] self.fenrirSocks = []
self.socket_files = [] self.bound_sockets = []
def initialize(self, environment): def initialize(self, environment):
self.env = environment self.env = environment
@@ -94,11 +94,16 @@ class driver(remoteDriver):
def _register_instance(self): def _register_instance(self):
settings_manager = self.env["runtime"]["SettingsManager"] settings_manager = self.env["runtime"]["SettingsManager"]
active_socket_files = [
socket_file
for fenrir_sock, socket_file in self.bound_sockets
if self._socket_file_matches_socket(fenrir_sock, socket_file)
]
instance_data = { instance_data = {
"pid": os.getpid(), "pid": os.getpid(),
"ppid": os.getppid(), "ppid": os.getppid(),
"socket_files": self.socket_files, "socket_files": active_socket_files,
"main_socket": MAIN_SOCKET_FILE in self.socket_files, "main_socket": MAIN_SOCKET_FILE in active_socket_files,
"screen_driver": settings_manager.get_setting("screen", "driver"), "screen_driver": settings_manager.get_setting("screen", "driver"),
"keyboard_driver": settings_manager.get_setting("keyboard", "driver"), "keyboard_driver": settings_manager.get_setting("keyboard", "driver"),
"x11_window_id": settings_manager.get_setting( "x11_window_id": settings_manager.get_setting(
@@ -108,6 +113,17 @@ class driver(remoteDriver):
} }
remoteInstanceRegistry.write_instance(instance_data) remoteInstanceRegistry.write_instance(instance_data)
def _socket_file_matches_socket(self, fenrir_sock, socket_file):
try:
socket_stat = os.stat(socket_file)
fd_stat = os.fstat(fenrir_sock.fileno())
except OSError:
return False
return (
socket_stat.st_dev == fd_stat.st_dev
and socket_stat.st_ino == fd_stat.st_ino
)
def _cleanup(self): def _cleanup(self):
for fenrir_sock in self.fenrirSocks: for fenrir_sock in self.fenrirSocks:
try: try:
@@ -116,13 +132,16 @@ class driver(remoteDriver):
pass pass
self.fenrirSocks = [] self.fenrirSocks = []
for socket_file in self.socket_files: for _, socket_file in self.bound_sockets:
try: try:
if os.path.exists(socket_file): if (
os.path.exists(socket_file)
and not self._is_socket_active(socket_file)
):
os.unlink(socket_file) os.unlink(socket_file)
except OSError: except OSError:
pass pass
self.socket_files = [] self.bound_sockets = []
remoteInstanceRegistry.remove_instance() remoteInstanceRegistry.remove_instance()
def _handle_client(self, client_sock, event_queue): def _handle_client(self, client_sock, event_queue):
@@ -167,7 +186,7 @@ class driver(remoteDriver):
if fenrir_sock is None: if fenrir_sock is None:
continue continue
self.fenrirSocks.append(fenrir_sock) self.fenrirSocks.append(fenrir_sock)
self.socket_files.append(socket_file) self.bound_sockets.append((fenrir_sock, socket_file))
if not self.fenrirSocks: if not self.fenrirSocks:
return return