From ca3fd9a3ffaaf61362f882c08757cde886b5774a Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Mon, 1 Sep 2025 20:31:23 +0200 Subject: [PATCH] Improve: user/group retrievement for running service and directories --- radicale/pathutils.py | 37 ++++++++++++++++++++++++++++++------- radicale/utils.py | 42 +++++++++++++++++++++++++++++++++--------- 2 files changed, 63 insertions(+), 16 deletions(-) diff --git a/radicale/pathutils.py b/radicale/pathutils.py index 8ee25b4e..e4e65928 100644 --- a/radicale/pathutils.py +++ b/radicale/pathutils.py @@ -31,7 +31,7 @@ import threading from tempfile import TemporaryDirectory from typing import Iterator, Type, Union -from radicale import storage, types +from radicale import storage, types, utils if sys.platform == "win32": import ctypes @@ -320,13 +320,36 @@ def name_from_path(path: str, collection: "storage.BaseCollection") -> str: def path_permissions(path): path = pathlib.Path(path) - return [path.owner(), path.group(), path.stat().st_mode] + + try: + uid = utils.unknown_if_empty(path.stat().st_uid) + except (KeyError, NotImplementedError): + uid = "UNKNOWN" + + try: + gid = utils.unknown_if_empty(path.stat().st_gid) + except (KeyError, NotImplementedError): + gid = "UNKNOWN" + + try: + mode = utils.unknown_if_empty("%o" % path.stat().st_mode) + except (KeyError, NotImplementedError): + mode = "UNKNOWN" + + try: + owner = utils.unknown_if_empty(path.owner()) + except (KeyError, NotImplementedError): + owner = "UNKNOWN" + + try: + group = utils.unknown_if_empty(path.group()) + except (KeyError, NotImplementedError): + group = "UNKNOWN" + + return [owner, uid, group, gid, mode] def path_permissions_as_string(path): - try: - pp = path_permissions(path) - s = "path=%r owner=%s group=%s mode=%o" % (path, pp[0], pp[1], pp[2]) - except (KeyError, NotImplementedError): - s = "path=%r owner=UNKNOWN(unsupported on this system)" % (path) + pp = path_permissions(path) + s = "path=%r owner=%s(%s) group=%s(%s) mode=%s" % (path, pp[0], pp[1], pp[2], pp[3], pp[4]) return s diff --git a/radicale/utils.py b/radicale/utils.py index 096864b6..ed6c4ab2 100644 --- a/radicale/utils.py +++ b/radicale/utils.py @@ -226,25 +226,49 @@ def ssl_get_protocols(context): return protocols +def unknown_if_empty(value): + if value == "": + return "UNKNOWN" + else: + return value + + def user_groups_as_string(): if sys.platform != "win32": euid = os.geteuid() - egid = os.getegid() try: username = pwd.getpwuid(euid)[0] + user = "%s(%d)" % (unknown_if_empty(username), euid) except Exception: # name of user not found - s = "user=(%d) group=(%d)" % (euid, egid) - return s - gids = os.getgrouplist(username, egid) + user = "UNKNOWN(%d)" % euid + + egid = os.getegid() groups = [] - for gid in gids: + try: + gids = os.getgrouplist(username, egid) + for gid in gids: + try: + gi = grp.getgrgid(gid) + groups.append("%s(%d)" % (unknown_if_empty(gi.gr_name), gid)) + except Exception: + groups.append("UNKNOWN(%d)" % gid) + except Exception: try: - gi = grp.getgrgid(gid) - groups.append("%s(%d)" % (gi.gr_name, gid)) + groups.append("%s(%d)" % (grp.getgrnam(egid)[0], egid)) except Exception: - groups.append("%s(%d)" % (gid, gid)) - s = "user=%s(%d) groups=%s" % (username, euid, ','.join(groups)) + # workaround to get groupid by name + groups_all = grp.getgrall() + found = False + for entry in groups_all: + if entry[2] == egid: + groups.append("%s(%d)" % (unknown_if_empty(entry[0]), egid)) + found = True + break + if not found: + groups.append("UNKNOWN(%d)" % egid) + + s = "user=%s groups=%s" % (user, ','.join(groups)) else: username = os.getlogin() s = "user=%s" % (username)