Fix to socket routing for self-voicing.
This commit is contained in:
@@ -4,5 +4,5 @@
|
||||
# Fenrir TTY screen reader
|
||||
# By Chrys, Storm Dragon, and contributors.
|
||||
|
||||
version = "2026.07.26"
|
||||
version = "2026.07.30"
|
||||
code_name = "testing"
|
||||
|
||||
@@ -161,6 +161,23 @@ class driver(remoteDriver):
|
||||
except OSError:
|
||||
return 0
|
||||
|
||||
def _get_peer_uid(self, client_sock):
|
||||
so_peercred = getattr(socket, "SO_PEERCRED", 17)
|
||||
try:
|
||||
creds = client_sock.getsockopt(
|
||||
socket.SOL_SOCKET, so_peercred, struct.calcsize("3i")
|
||||
)
|
||||
_pid, uid, _gid = struct.unpack("3i", creds)
|
||||
return uid
|
||||
except OSError:
|
||||
return -1
|
||||
|
||||
def _get_socket_owner_uid(self, socket_file):
|
||||
try:
|
||||
return os.stat(socket_file).st_uid
|
||||
except OSError:
|
||||
return -1
|
||||
|
||||
def _get_parent_pid(self, pid):
|
||||
try:
|
||||
with open(f"/proc/{pid}/stat", "r", encoding="utf-8") as proc_file:
|
||||
@@ -206,13 +223,20 @@ class driver(remoteDriver):
|
||||
socket_files.append(socket_file)
|
||||
return socket_files
|
||||
|
||||
def _find_available_private_socket(self, preferred_socket=""):
|
||||
def _find_available_private_socket(
|
||||
self, preferred_socket="", owner_uid=None
|
||||
):
|
||||
socket_files = self._get_registered_private_sockets()
|
||||
if preferred_socket and preferred_socket in socket_files:
|
||||
socket_files.remove(preferred_socket)
|
||||
socket_files.insert(0, preferred_socket)
|
||||
|
||||
for socket_file in socket_files:
|
||||
if (
|
||||
owner_uid is not None
|
||||
and self._get_socket_owner_uid(socket_file) != owner_uid
|
||||
):
|
||||
continue
|
||||
if self._is_own_socket_file(socket_file):
|
||||
return socket_file
|
||||
if self._is_socket_active(socket_file):
|
||||
@@ -253,14 +277,27 @@ class driver(remoteDriver):
|
||||
def _route_main_socket_command(self, data, client_sock, socket_file):
|
||||
if socket_file != MAIN_SOCKET_FILE:
|
||||
return False
|
||||
|
||||
owner_uid = None
|
||||
if not self._has_own_private_socket():
|
||||
return False
|
||||
peer_uid = self._get_peer_uid(client_sock)
|
||||
main_socket_uid = self._get_socket_owner_uid(MAIN_SOCKET_FILE)
|
||||
if peer_uid < 0 or peer_uid == main_socket_uid:
|
||||
return False
|
||||
owner_uid = peer_uid
|
||||
|
||||
peer_pid = self._get_peer_pid(client_sock)
|
||||
ancestor_socket = ""
|
||||
if peer_pid > 1:
|
||||
ancestor_socket = self._find_ancestor_private_socket(peer_pid)
|
||||
target_socket = self._find_available_private_socket(ancestor_socket)
|
||||
if owner_uid is None:
|
||||
target_socket = self._find_available_private_socket(
|
||||
ancestor_socket
|
||||
)
|
||||
else:
|
||||
target_socket = self._find_available_private_socket(
|
||||
ancestor_socket, owner_uid=owner_uid
|
||||
)
|
||||
if not target_socket:
|
||||
return False
|
||||
|
||||
|
||||
Reference in New Issue
Block a user