feat: Add unix group support for XML-RPC server socket permissions

- Introduced `unixgroup` configuration for XML-RPC in
  `revpipyload.conf`.
- Updated `UnixStreamXMLRPCServer` to set socket group ownership and
  permissions.

Signed-off-by: Sven Sager <akira@narux.de>
This commit is contained in:
2026-08-06 11:42:29 +02:00
parent aad540593d
commit 565ecf5d8b
3 changed files with 57 additions and 5 deletions
+1
View File
@@ -28,6 +28,7 @@ watchdog = 1
xmlrpc = 1 xmlrpc = 1
aclfile = /etc/revpipyload/aclxmlrpc.conf aclfile = /etc/revpipyload/aclxmlrpc.conf
bindip = socket bindip = socket
unixgroup = picontrol
[MQTT] [MQTT]
mqtt = 0 mqtt = 0
+2 -1
View File
@@ -331,6 +331,7 @@ class RevPiPyLoad:
self.xmlrpcbindip = "127.0.0.1" self.xmlrpcbindip = "127.0.0.1"
self.xmlrpcport = self.globalconfig.getint("XMLRPC", "port", fallback=55123) self.xmlrpcport = self.globalconfig.getint("XMLRPC", "port", fallback=55123)
self.xmlrpcunixgroup = self.globalconfig.get("XMLRPC", "unixgroup", fallback="picontrol")
# Workdirectory wechseln # Workdirectory wechseln
if not os.access(self.plcworkdir, os.R_OK | os.W_OK | os.X_OK): if not os.access(self.plcworkdir, os.R_OK | os.W_OK | os.X_OK):
@@ -414,9 +415,9 @@ class RevPiPyLoad:
self.xsrv = UnixStreamXMLRPCServer( self.xsrv = UnixStreamXMLRPCServer(
self.xmlrpcbindip, self.xmlrpcbindip,
requestHandler=UnixStreamXMLRPCRequestHandler,
logRequests=False, logRequests=False,
allow_none=True, allow_none=True,
unixgroup=self.xmlrpcunixgroup
) )
else: else:
+50
View File
@@ -4,6 +4,8 @@ __author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager" __copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv2" __license__ = "GPLv2"
import grp
import os
import socket import socket
from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
@@ -127,6 +129,54 @@ class UnixStreamXMLRPCServer(SimpleXMLRPCServer):
"""XML-RPC Server fuer Unix Domain Sockets.""" """XML-RPC Server fuer Unix Domain Sockets."""
address_family = socket.AF_UNIX address_family = socket.AF_UNIX
def __init__(
self, addr, logRequests=True, allow_none=False, unixgroup="picontrol"):
"""Init UnixStreamXMLRPCServer class."""
proginit.logger.debug("enter UnixStreamXMLRPCServer.__init__()")
self.timeout = 0.5
self.unixgroup = unixgroup
# Create subdirectories for Unix Domain Socket
socket_dir = os.path.dirname(addr)
if socket_dir:
os.makedirs(socket_dir, exist_ok=True)
super().__init__(
addr=addr,
requestHandler=UnixStreamXMLRPCRequestHandler,
logRequests=logRequests,
allow_none=allow_none,
encoding="utf-8",
bind_and_activate=False,
)
proginit.logger.debug("leave UnixStreamXMLRPCServer.__init__()")
def server_bind(self):
"""Ueberschreibt server_bind um Berechtigungen zu setzen."""
super().server_bind()
# Gruppe setzen
try:
gid = grp.getgrnam(self.unixgroup).gr_gid
# -1 will leave the owner unchanged
os.chown(self.server_address, -1, gid)
except (KeyError, PermissionError):
proginit.logger.warning(
"can not set group of socket {0} to '{1}'"
"".format(self.server_address, self.unixgroup)
)
# Berechtigungen fuer restliche Benutzer entziehen
try:
os.chmod(self.server_address, 0o660)
except PermissionError:
proginit.logger.warning(
"can not set permissions of socket {0}"
"".format(self.server_address)
)
def _dispatch(self, method, params): def _dispatch(self, method, params):
"""Prueft ACL Level fuer angeforderte Methode. """Prueft ACL Level fuer angeforderte Methode.