14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
19
"""Tests for bzr setting permissions.
28
28
# TODO: jam 20051215 There are no tests for ftp yet, because we have no ftp server
29
# TODO: jam 20051215 Currently the default behavior for 'bzr branch' is just
29
# TODO: jam 20051215 Currently the default behavior for 'bzr branch' is just
30
30
# defined by the local umask. This isn't terrible, is it
31
31
# the truly desired behavior?
36
from cStringIO import StringIO
36
from bzrlib import urlutils
37
39
from bzrlib.branch import Branch
38
from bzrlib.controldir import ControlDir
40
from bzrlib.bzrdir import BzrDir
41
from bzrlib.lockable_files import LockableFiles, TransportLock
39
42
from bzrlib.tests import TestCaseWithTransport, TestSkipped
40
43
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
44
from bzrlib.transport import get_transport
41
45
from bzrlib.workingtree import WorkingTree
62
66
:param dir_mode: The mode for all directories
63
67
:param include_base: If false, only check the subdirectories
65
t = test.get_transport()
69
t = get_transport(".")
67
71
test.assertTransportMode(t, base, dir_mode)
68
72
for root, dirs, files in os.walk(base):
70
p = '/'.join([urlutils.quote(x) for x in root.split('/\\') + [d]])
74
p = '/'.join([urllib.quote(x) for x in root.split('/\\') + [d]])
71
75
test.assertTransportMode(t, p, dir_mode)
73
77
p = os.path.join(root, f)
74
p = '/'.join([urlutils.quote(x) for x in root.split('/\\') + [f]])
78
p = '/'.join([urllib.quote(x) for x in root.split('/\\') + [f]])
75
79
test.assertTransportMode(t, p, file_mode)
94
98
# although we are modifying the filesystem
95
99
# underneath the objects, they are not locked, and thus it must
96
# be safe for most operations. But here we want to observe a
100
# be safe for most operations. But here we want to observe a
97
101
# mode change in the control bits, which current do not refresh
98
102
# when a new lock is taken out.
99
103
t = WorkingTree.open('.')
101
105
self.assertEqualMode(0755, b.control_files._dir_mode)
102
106
self.assertEqualMode(0644, b.control_files._file_mode)
103
self.assertEqualMode(0755, b.bzrdir._get_dir_mode())
104
self.assertEqualMode(0644, b.bzrdir._get_file_mode())
106
108
# Modifying a file shouldn't break the permissions
107
with open('a', 'wb') as f: f.write('foo2\n')
109
open('a', 'wb').write('foo2\n')
109
111
# The mode should be maintained after commit
110
112
check_mode_r(self, '.bzr', 0644, 0755)
112
114
# Adding a new file should maintain the permissions
113
with open('b', 'wb') as f: f.write('new b\n')
115
open('b', 'wb').write('new b\n')
115
117
t.commit('new b')
116
118
check_mode_r(self, '.bzr', 0644, 0755)
123
125
self.assertEqualMode(0775, b.control_files._dir_mode)
124
126
self.assertEqualMode(0664, b.control_files._file_mode)
125
self.assertEqualMode(0775, b.bzrdir._get_dir_mode())
126
self.assertEqualMode(0664, b.bzrdir._get_file_mode())
128
with open('a', 'wb') as f: f.write('foo3\n')
128
open('a', 'wb').write('foo3\n')
130
130
check_mode_r(self, '.bzr', 0664, 0775)
132
with open('c', 'wb') as f: f.write('new c\n')
132
open('c', 'wb').write('new c\n')
134
134
t.commit('new c')
135
135
check_mode_r(self, '.bzr', 0664, 0775)
137
def test_new_files_group_sticky_bit(self):
138
if sys.platform == 'win32':
139
raise TestSkipped('chmod has no effect on win32')
140
elif sys.platform == 'darwin' or 'freebsd' in sys.platform:
141
# FreeBSD-based platforms create temp dirs with the 'wheel' group,
142
# which users are not likely to be in, and this prevents us from
143
# setting the sgid bit
144
os.chown(self.test_dir, os.getuid(), os.getgid())
146
t = self.make_branch_and_tree('.')
149
137
# Test the group sticky bit
150
138
# Recursively update the modes of all files
151
139
chmod_r('.bzr', 0664, 02775)
155
143
self.assertEqualMode(02775, b.control_files._dir_mode)
156
144
self.assertEqualMode(0664, b.control_files._file_mode)
157
self.assertEqualMode(02775, b.bzrdir._get_dir_mode())
158
self.assertEqualMode(0664, b.bzrdir._get_file_mode())
160
with open('a', 'wb') as f: f.write('foo4\n')
146
open('a', 'wb').write('foo4\n')
162
148
check_mode_r(self, '.bzr', 0664, 02775)
164
with open('d', 'wb') as f: f.write('new d\n')
150
open('d', 'wb').write('new d\n')
166
152
t.commit('new d')
167
153
check_mode_r(self, '.bzr', 0664, 02775)
155
def test_disable_set_mode(self):
156
# TODO: jam 20051215 Ultimately, this test should probably test that
157
# extra chmod calls aren't being made
159
transport = get_transport(self.get_url())
160
transport.put_bytes('my-lock', '')
161
lockable = LockableFiles(transport, 'my-lock', TransportLock)
162
self.assertNotEqual(None, lockable._dir_mode)
163
self.assertNotEqual(None, lockable._file_mode)
165
LockableFiles._set_dir_mode = False
166
transport = get_transport('.')
167
lockable = LockableFiles(transport, 'my-lock', TransportLock)
168
self.assertEqual(None, lockable._dir_mode)
169
self.assertNotEqual(None, lockable._file_mode)
171
LockableFiles._set_file_mode = False
172
transport = get_transport('.')
173
lockable = LockableFiles(transport, 'my-lock', TransportLock)
174
self.assertEqual(None, lockable._dir_mode)
175
self.assertEqual(None, lockable._file_mode)
177
LockableFiles._set_dir_mode = True
178
transport = get_transport('.')
179
lockable = LockableFiles(transport, 'my-lock', TransportLock)
180
self.assertNotEqual(None, lockable._dir_mode)
181
self.assertEqual(None, lockable._file_mode)
183
LockableFiles._set_file_mode = True
184
transport = get_transport('.')
185
lockable = LockableFiles(transport, 'my-lock', TransportLock)
186
self.assertNotEqual(None, lockable._dir_mode)
187
self.assertNotEqual(None, lockable._file_mode)
189
LockableFiles._set_dir_mode = True
190
LockableFiles._set_file_mode = True
170
193
class TestSftpPermissions(TestCaseWithSFTPServer):
194
217
b_local = t.branch
195
218
self.assertEqualMode(0755, b_local.control_files._dir_mode)
196
219
self.assertEqualMode(0644, b_local.control_files._file_mode)
197
self.assertEqualMode(0755, b_local.bzrdir._get_dir_mode())
198
self.assertEqualMode(0644, b_local.bzrdir._get_file_mode())
201
222
sftp_url = self.get_url('sftp')
202
b_sftp = ControlDir.create_branch_and_repo(sftp_url)
223
b_sftp = BzrDir.create_branch_and_repo(sftp_url)
204
225
b_sftp.pull(b_local)
209
230
b_sftp = Branch.open(sftp_url)
210
231
self.assertEqualMode(0755, b_sftp.control_files._dir_mode)
211
232
self.assertEqualMode(0644, b_sftp.control_files._file_mode)
212
self.assertEqualMode(0755, b_sftp.bzrdir._get_dir_mode())
213
self.assertEqualMode(0644, b_sftp.bzrdir._get_file_mode())
215
with open('local/a', 'wb') as f: f.write('foo2\n')
234
open('local/a', 'wb').write('foo2\n')
216
235
t_local.commit('foo2')
217
236
b_sftp.pull(b_local)
218
237
# The mode should be maintained after commit
219
238
check_mode_r(self, 'sftp/.bzr', 0644, 0755)
221
with open('local/b', 'wb') as f: f.write('new b\n')
240
open('local/b', 'wb').write('new b\n')
223
242
t_local.commit('new b')
224
243
b_sftp.pull(b_local)
232
251
b_sftp = Branch.open(sftp_url)
233
252
self.assertEqualMode(0775, b_sftp.control_files._dir_mode)
234
253
self.assertEqualMode(0664, b_sftp.control_files._file_mode)
235
self.assertEqualMode(0775, b_sftp.bzrdir._get_dir_mode())
236
self.assertEqualMode(0664, b_sftp.bzrdir._get_file_mode())
238
with open('local/a', 'wb') as f: f.write('foo3\n')
255
open('local/a', 'wb').write('foo3\n')
239
256
t_local.commit('foo3')
240
257
b_sftp.pull(b_local)
241
258
check_mode_r(self, 'sftp/.bzr', 0664, 0775)
243
with open('local/c', 'wb') as f: f.write('new c\n')
260
open('local/c', 'wb').write('new c\n')
245
262
t_local.commit('new c')
246
263
b_sftp.pull(b_local)