]> arthur.barton.de Git - bup.git/commitdiff
Accommodate missing owner or group name during metadata save/restore.
authorRob Browning <rlb@defaultvalue.org>
Wed, 5 Jan 2011 06:00:08 +0000 (00:00 -0600)
committerRob Browning <rlb@defaultvalue.org>
Wed, 5 Jan 2011 06:00:08 +0000 (00:00 -0600)
When saving metadata, call add_error() for a missing owner or group
name, and record the name as ''.  When restoring, call add_error() for
any attempt to use an empty owner or group.

lib/bup/metadata.py

index ce92d4f29fad218e5f7bc1d90a82901ce621f111..7c46286f7f8881797938e09aea93f9a1ea6f7f2c 100644 (file)
@@ -178,8 +178,15 @@ class Metadata:
         self.atime = st.st_atime
         self.mtime = st.st_mtime
         self.ctime = st.st_ctime
-        self.owner = pwd.getpwuid(st.st_uid)[0]
-        self.group = grp.getgrgid(st.st_gid)[0]
+        self.owner = self.group = ''
+        try:
+            self.owner = pwd.getpwuid(st.st_uid)[0]
+        except KeyError, e:
+            add_error(e)
+        try:
+            self.group = grp.getgrgid(st.st_gid)[0]
+        except KeyError, e:
+            add_error(e)
 
     def _encode_common(self):
         atime = self.atime.to_timespec()
@@ -279,21 +286,29 @@ class Metadata:
             uid = self.uid
             gid = self.gid
             if not restore_numeric_ids:
-                if os.geteuid() == 0:
-                    try:
-                        uid = pwd.getpwnam(self.owner)[2]
-                    except KeyError:
-                        uid = -1
-                        log('bup: ignoring unknown owner %s for "%s"\n'
-                            % (self.owner, path))
+                if not self.owner:
+                    uid = -1
+                    add_error('bup: ignoring missing owner for "%s"\n' % path)
                 else:
-                    uid = -1 # Not root; assume we can't change owner.
-                try:
-                    gid = grp.getgrnam(self.group)[2]
-                except KeyError:
+                    if os.geteuid() != 0:
+                        uid = -1 # Not root; assume we can't change owner.
+                    else:
+                        try:
+                            uid = pwd.getpwnam(self.owner)[2]
+                        except KeyError:
+                            uid = -1
+                            fmt = 'bup: ignoring unknown owner %s for "%s"\n'
+                            add_error(fmt % (self.owner, path))
+                if not self.group:
                     gid = -1
-                    log('bup: ignoring unknown group %s for "%s"\n'
-                        % (self.group, path))
+                    add_error('bup: ignoring missing group for "%s"\n' % path)
+                else:
+                    try:
+                        gid = grp.getgrnam(self.group)[2]
+                    except KeyError:
+                        gid = -1
+                        add_error('bup: ignoring unknown group %s for "%s"\n'
+                                  % (self.group, path))
             os.lchown(path, uid, gid)
 
             if _have_lchmod: