mirror of
https://github.com/naruxde/revpipyload.git
synced 2026-08-16 13:07:03 +02:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user