Browse Source

get_item_uid_gid: do not require item.uid/gid, see #7249

if uid is not present, fall back to uid_default.
if gid is not present, fall back to gid_default.
Thomas Waldmann 2 years ago
parent
commit
4f9cda1aab
2 changed files with 30 additions and 4 deletions
  1. 4 4
      src/borg/archive.py
  2. 26 0
      src/borg/testsuite/archive.py

+ 4 - 4
src/borg/archive.py

@@ -410,15 +410,15 @@ def get_item_uid_gid(item, *, numeric, uid_forced=None, gid_forced=None, uid_def
         uid = uid_forced
     else:
         uid = None if numeric else user2uid(item.get("user"))
-        uid = item.uid if uid is None else uid
-        if uid < 0:
+        uid = item.get("uid") if uid is None else uid
+        if uid is None or uid < 0:
             uid = uid_default
     if gid_forced is not None:
         gid = gid_forced
     else:
         gid = None if numeric else group2gid(item.get("group"))
-        gid = item.gid if gid is None else gid
-        if gid < 0:
+        gid = item.get("gid") if gid is None else gid
+        if gid is None or gid < 0:
             gid = gid_default
     return uid, gid
 

+ 26 - 0
src/borg/testsuite/archive.py

@@ -356,3 +356,29 @@ def test_get_item_uid_gid():
     # because item uid/gid seems valid, do not use the given uid/gid defaults
     assert uid == 9
     assert gid == 10
+
+    # item metadata only has uid/gid, but no user/group.
+    item = Item(path="filename", uid=13, gid=14)
+
+    uid, gid = get_item_uid_gid(item, numeric=False)
+    # it'll check user/group first, but as there is nothing in the item, falls back to uid/gid.
+    assert uid == 13
+    assert gid == 14
+
+    uid, gid = get_item_uid_gid(item, numeric=True)
+    # does not check user/group, directly returns uid/gid.
+    assert uid == 13
+    assert gid == 14
+
+    # item metadata has no uid/gid/user/group.
+    item = Item(path="filename")
+
+    uid, gid = get_item_uid_gid(item, numeric=False, uid_default=15)
+    # as there is nothing, it'll fall back to uid_default/gid_default.
+    assert uid == 15
+    assert gid == 0
+
+    uid, gid = get_item_uid_gid(item, numeric=True, gid_default=16)
+    # as there is nothing, it'll fall back to uid_default/gid_default.
+    assert uid == 0
+    assert gid == 16