]> arthur.barton.de Git - bup.git/blob - lib/bup/t/tmetadata.py
Add metadata test_restore_restricted_user_group().
[bup.git] / lib / bup / t / tmetadata.py
1 import tempfile
2 import subprocess
3 from bup import metadata
4 from bup.helpers import detect_fakeroot
5 from wvtest import *
6
7
8 @wvtest
9 def test__normalize_ts():
10     normalize = metadata._normalize_ts
11     bns = 10**9
12     for ts in ((0, 0), (-1, 0), (0, bns - 1), (-1, bns - 1)):
13         WVPASSEQ(normalize(ts), ts)
14     WVPASSEQ(normalize((0, -1)), (-1, bns - 1))
15     WVPASSEQ(normalize((-1, -1)), (-2, bns - 1))
16     WVPASSEQ(normalize((0, bns)), (1, 0))
17     WVPASSEQ(normalize((0, bns + 1)), (1, 1))
18     WVPASSEQ(normalize((0, -bns)), (-1, 0))
19     WVPASSEQ(normalize((0, -(bns + 1))), (-2, bns - 1))
20     WVPASSEQ(normalize((0, 3 * bns)), (3, 0))
21     WVPASSEQ(normalize((0, -3 * bns)), (-3, 0))
22
23
24 @wvtest
25 def test_clean_up_archive_path():
26     cleanup = metadata._clean_up_path_for_archive
27     WVPASSEQ(cleanup('foo'), 'foo')
28     WVPASSEQ(cleanup('/foo'), 'foo')
29     WVPASSEQ(cleanup('///foo'), 'foo')
30     WVPASSEQ(cleanup('/foo/bar'), 'foo/bar')
31     WVPASSEQ(cleanup('foo/./bar'), 'foo/bar')
32     WVPASSEQ(cleanup('/foo/./bar'), 'foo/bar')
33     WVPASSEQ(cleanup('/foo/./bar/././baz'), 'foo/bar/baz')
34     WVPASSEQ(cleanup('/foo/./bar///././baz'), 'foo/bar/baz')
35     WVPASSEQ(cleanup('//./foo/./bar///././baz/.///'), 'foo/bar/baz/')
36     WVPASSEQ(cleanup('./foo/./.bar'), 'foo/.bar')
37     WVPASSEQ(cleanup('./foo/.'), 'foo')
38     WVPASSEQ(cleanup('./foo/..'), '.')
39     WVPASSEQ(cleanup('//./..//.../..//.'), '.')
40     WVPASSEQ(cleanup('//./..//..././/.'), '...')
41     WVPASSEQ(cleanup('/////.'), '.')
42     WVPASSEQ(cleanup('/../'), '.')
43     WVPASSEQ(cleanup(''), '.')
44
45
46 @wvtest
47 def test_risky_path():
48     risky = metadata._risky_path
49     WVPASS(risky('/foo'))
50     WVPASS(risky('///foo'))
51     WVPASS(risky('/../foo'))
52     WVPASS(risky('../foo'))
53     WVPASS(risky('foo/..'))
54     WVPASS(risky('foo/../'))
55     WVPASS(risky('foo/../bar'))
56     WVFAIL(risky('foo'))
57     WVFAIL(risky('foo/'))
58     WVFAIL(risky('foo///'))
59     WVFAIL(risky('./foo'))
60     WVFAIL(risky('foo/.'))
61     WVFAIL(risky('./foo/.'))
62     WVFAIL(risky('foo/bar'))
63     WVFAIL(risky('foo/./bar'))
64
65
66 @wvtest
67 def test_clean_up_extract_path():
68     cleanup = metadata._clean_up_extract_path
69     WVPASSEQ(cleanup('/foo'), 'foo')
70     WVPASSEQ(cleanup('///foo'), 'foo')
71     WVFAIL(cleanup('/../foo'))
72     WVFAIL(cleanup('../foo'))
73     WVFAIL(cleanup('foo/..'))
74     WVFAIL(cleanup('foo/../'))
75     WVFAIL(cleanup('foo/../bar'))
76     WVPASSEQ(cleanup('foo'), 'foo')
77     WVPASSEQ(cleanup('foo/'), 'foo/')
78     WVPASSEQ(cleanup('foo///'), 'foo///')
79     WVPASSEQ(cleanup('./foo'), './foo')
80     WVPASSEQ(cleanup('foo/.'), 'foo/.')
81     WVPASSEQ(cleanup('./foo/.'), './foo/.')
82     WVPASSEQ(cleanup('foo/bar'), 'foo/bar')
83     WVPASSEQ(cleanup('foo/./bar'), 'foo/./bar')
84     WVPASSEQ(cleanup('/'), '.')
85     WVPASSEQ(cleanup('./'), './')
86     WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
87     WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
88
89
90 @wvtest
91 def test_from_path_error():
92     if os.geteuid == 0 or detect_fakeroot():
93         return
94     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
95     try:
96         path = tmpdir + '/foo'
97         subprocess.call(['mkdir', path])
98         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
99         WVPASSEQ(m.path, path)
100         subprocess.call(['chmod', '000', path])
101         WVEXCEPT(metadata.MetadataAcquisitionError,
102                  metadata.from_path,
103                  path,
104                  archive_path=path,
105                  save_symlinks=True)
106     finally:
107         subprocess.call(['rm', '-rf', tmpdir])
108
109
110 @wvtest
111 def test_apply_to_path_error():
112     if os.geteuid == 0 or detect_fakeroot():
113         return
114     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
115     try:
116         path = tmpdir + '/foo'
117         subprocess.call(['mkdir', path])
118         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
119         WVPASSEQ(m.path, path)
120         subprocess.call(['chmod', '000', tmpdir])
121         WVEXCEPT(metadata.MetadataApplicationError,
122                  m.apply_to_path, path)
123         subprocess.call(['chmod', '700', tmpdir])
124     finally:
125         subprocess.call(['rm', '-rf', tmpdir])
126
127
128 @wvtest
129 def test_restore_restricted_user_group():
130     if os.geteuid == 0 or detect_fakeroot():
131         return
132     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
133     try:
134         path = tmpdir + '/foo'
135         subprocess.call(['mkdir', path])
136         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
137         WVPASSEQ(m.path, path)
138         WVPASSEQ(m.apply_to_path(path), None)
139         orig_uid = m.uid
140         m.uid = 0;
141         WVEXCEPT(metadata.MetadataApplicationError,
142                  m.apply_to_path, path, restore_numeric_ids=True)
143         m.uid = orig_uid
144         m.gid = 0;
145         WVEXCEPT(metadata.MetadataApplicationError,
146                  m.apply_to_path, path, restore_numeric_ids=True)
147     finally:
148         subprocess.call(['rm', '-rf', tmpdir])