(self, initgroups, setuid, setgid,
getpwuid, parse_gid, parse_uid, getuid, geteuid,
getgid, getegid)
| 218 | @patch('celery.platforms.setuid') |
| 219 | @patch('celery.platforms.initgroups') |
| 220 | def test_with_uid(self, initgroups, setuid, setgid, |
| 221 | getpwuid, parse_gid, parse_uid, getuid, geteuid, |
| 222 | getgid, getegid): |
| 223 | geteuid.return_value = 10 |
| 224 | getuid.return_value = 10 |
| 225 | |
| 226 | class pw_struct: |
| 227 | pw_gid = 50001 |
| 228 | |
| 229 | def raise_on_second_call(*args, **kwargs): |
| 230 | setuid.side_effect = OSError() |
| 231 | setuid.side_effect.errno = errno.EPERM |
| 232 | |
| 233 | setuid.side_effect = raise_on_second_call |
| 234 | getpwuid.return_value = pw_struct() |
| 235 | parse_uid.return_value = 5001 |
| 236 | parse_gid.return_value = 5001 |
| 237 | maybe_drop_privileges(uid='user') |
| 238 | parse_uid.assert_called_with('user') |
| 239 | getpwuid.assert_called_with(5001) |
| 240 | setgid.assert_called_with(50001) |
| 241 | initgroups.assert_called_with(5001, 50001) |
| 242 | setuid.assert_has_calls([call(5001), call(0)]) |
| 243 | |
| 244 | setuid.side_effect = raise_on_second_call |
| 245 | |
| 246 | def to_root_on_second_call(mock, first): |
| 247 | return_value = [first] |
| 248 | |
| 249 | def on_first_call(*args, **kwargs): |
| 250 | ret, return_value[0] = return_value[0], 0 |
| 251 | return ret |
| 252 | |
| 253 | mock.side_effect = on_first_call |
| 254 | |
| 255 | to_root_on_second_call(geteuid, 10) |
| 256 | to_root_on_second_call(getuid, 10) |
| 257 | with pytest.raises(SecurityError): |
| 258 | maybe_drop_privileges(uid='user') |
| 259 | |
| 260 | getuid.return_value = getuid.side_effect = None |
| 261 | geteuid.return_value = geteuid.side_effect = None |
| 262 | getegid.return_value = 0 |
| 263 | getgid.return_value = 0 |
| 264 | setuid.side_effect = raise_on_second_call |
| 265 | with pytest.raises(SecurityError): |
| 266 | maybe_drop_privileges(gid='group') |
| 267 | |
| 268 | getuid.reset_mock() |
| 269 | geteuid.reset_mock() |
| 270 | setuid.reset_mock() |
| 271 | getuid.side_effect = geteuid.side_effect = None |
| 272 | |
| 273 | def raise_on_second_call(*args, **kwargs): |
| 274 | setuid.side_effect = OSError() |
| 275 | setuid.side_effect.errno = errno.ENOENT |
| 276 | |
| 277 | setuid.side_effect = raise_on_second_call |
nothing calls this directly
no test coverage detected