Commit 6a251f74 authored by bescoto's avatar bescoto

Final fix for unreadable file regress error?


git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup@460 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
parent ae84b3e9
...@@ -114,27 +114,23 @@ def remove_rbdir_increments(): ...@@ -114,27 +114,23 @@ def remove_rbdir_increments():
def iterate_raw_rfs(mirror_rp, inc_rp): def iterate_raw_rfs(mirror_rp, inc_rp):
"""Iterate all RegressFile objects in mirror/inc directory """Iterate all RegressFile objects in mirror/inc directory
Also changes permissions of unreadable files to allow access and Also changes permissions of unreadable files. We don't have to
then changes them back later. change them back later because regress will do that for us.
""" """
root_rf = RegressFile(mirror_rp, inc_rp, restore.get_inclist(inc_rp)) root_rf = RegressFile(mirror_rp, inc_rp, restore.get_inclist(inc_rp))
def helper(rf): def helper(rf):
mirror_rp = rf.mirror_rp mirror_rp = rf.mirror_rp
if (Globals.process_uid != 0 and if Globals.process_uid != 0:
((mirror_rp.isreg() and not mirror_rp.readable()) or if mirror_rp.isreg() and not mirror_rp.readable():
(mirror_rp.isdir() and not mirror_rp.hasfullperms()))): mirror_rp.chmod(0400 | mirror_rp.getperms())
unreadable, old_perms = 1, mirror_rp.getperms() elif mirror_rp.isdir() and not mirror_rp.hasfullperms():
if mirror_rp.isreg(): mirror_rp.chmod(0400 | old_perms) mirror_rp.chmod(0700 | mirror_rp.getperms())
else: mirror_rp.chmod(0700 | old_perms)
else: unreadable = 0
yield rf yield rf
if unreadable and mirror_rp.isreg(): mirror_rp.chmod(old_perms)
if rf.mirror_rp.isdir() or rf.inc_rp.isdir(): if rf.mirror_rp.isdir() or rf.inc_rp.isdir():
for sub_rf in rf.yield_sub_rfs(): for sub_rf in rf.yield_sub_rfs():
for sub_sub_rf in helper(sub_rf): for sub_sub_rf in helper(sub_rf):
yield sub_sub_rf yield sub_sub_rf
if unreadable and mirror_rp.isdir(): mirror_rp.chmod(old_perms)
return helper(root_rf) return helper(root_rf)
def yield_metadata(): def yield_metadata():
...@@ -249,14 +245,14 @@ class RegressITRB(rorpiter.ITRBranch): ...@@ -249,14 +245,14 @@ class RegressITRB(rorpiter.ITRBranch):
if rf.mirror_rp.isreg(): if rf.mirror_rp.isreg():
tf = TempFile.new(rf.mirror_rp) tf = TempFile.new(rf.mirror_rp)
tf.write_from_fileobj(rf.get_restore_fp()) tf.write_from_fileobj(rf.get_restore_fp())
rpath.copy_attribs(rf.metadata_rorp, tf)
tf.fsync_with_dir() # make sure tf fully written before move tf.fsync_with_dir() # make sure tf fully written before move
rpath.copy_attribs(rf.metadata_rorp, tf)
rpath.rename(tf, rf.mirror_rp) # move is atomic rpath.rename(tf, rf.mirror_rp) # move is atomic
else: else:
if rf.mirror_rp.lstat(): rf.mirror_rp.delete() if rf.mirror_rp.lstat(): rf.mirror_rp.delete()
rf.mirror_rp.write_from_fileobj(rf.get_restore_fp()) rf.mirror_rp.write_from_fileobj(rf.get_restore_fp())
rpath.copy_attribs(rf.metadata_rorp, rf.mirror_rp) rpath.copy_attribs(rf.metadata_rorp, rf.mirror_rp)
rf.mirror_rp.fsync_with_dir() # require move before inc delete rf.mirror_rp.get_parent_rp().fsync() # require move before inc delete
def start_process(self, index, rf): def start_process(self, index, rf):
"""Start processing directory""" """Start processing directory"""
......
...@@ -132,8 +132,8 @@ class RegressTest(unittest.TestCase): ...@@ -132,8 +132,8 @@ class RegressTest(unittest.TestCase):
"""Change attributes in directory, so regress will request fp""" """Change attributes in directory, so regress will request fp"""
subdir = self.output_rp.append('unreadable_dir') subdir = self.output_rp.append('unreadable_dir')
assert subdir.lstat() assert subdir.lstat()
filerp = subdir.append('to_be_unreadable') rp1_1 = subdir.append('to_be_unreadable')
filerp.chmod(0) rp1_1.chmod(0)
subdir.chmod(0) subdir.chmod(0)
......
...@@ -81,6 +81,23 @@ class HalfRoot(unittest.TestCase): ...@@ -81,6 +81,23 @@ class HalfRoot(unittest.TestCase):
rp2_3.chmod(0) rp2_3.chmod(0)
return rp1, rp2 return rp1, rp2
def cause_regress(self, rp):
"""Change some of the above to trigger regress"""
rp1_1 = rp.append('foo')
rp1_1.chmod(04)
rp_new = rp.append('lala')
rp_new.write_string('asoentuh')
rp_new.chmod(0)
assert not os.system('chown %s %s' % (user, rp_new.path))
rp1_3 = rp.append('unreadable_dir')
rp1_3.chmod(0700)
rp1_3_1 = rp1_3.append('file_inside')
rp1_3_1.chmod(01)
rp1_3.chmod(0)
rbdir = rp.append('rdiff-backup-data')
rbdir.append('current_mirror.2000-12-31T21:33:20-07:00.data').touch()
def test_backup(self): def test_backup(self):
"""Test back up, simple restores""" """Test back up, simple restores"""
in_rp1, in_rp2 = self.make_dirs() in_rp1, in_rp2 = self.make_dirs()
...@@ -128,6 +145,12 @@ class HalfRoot(unittest.TestCase): ...@@ -128,6 +145,12 @@ class HalfRoot(unittest.TestCase):
assert rout_perms == 0, rout_perms assert rout_perms == 0, rout_perms
assert outrp_perms == 0, outrp_perms assert outrp_perms == 0, outrp_perms
self.cause_regress(outrp)
cmd5 = ('su -c "rdiff-backup --check-destination-dir %s" %s' %
(outrp.path, user))
print "Executing regress: ", cmd5
assert not os.system(cmd5)
class NonRoot(unittest.TestCase): class NonRoot(unittest.TestCase):
"""Test backing up as non-root user """Test backing up as non-root user
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment