|
|
@@ -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"
|
|
|
|
|
|
-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])
|
|
|
+ group = utils.unknown_if_empty(path.group())
|
|
|
except (KeyError, NotImplementedError):
|
|
|
- s = "path=%r owner=UNKNOWN(unsupported on this system)" % (path)
|
|
|
+ group = "UNKNOWN"
|
|
|
+
|
|
|
+ return [owner, uid, group, gid, mode]
|
|
|
+
|
|
|
+
|
|
|
+def path_permissions_as_string(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
|