Currently context.elevated is just doing a copy.copy(self).
This needs to be changed to use copy.deepcopy so that the
list reference is not shared between objects which leaves
the possibility of an admin role leak.
This fix changes context.elevated use copy.deepcopy.
Change-Id: I349c53ccbe9e02ad2a3e84ae897424db9785a170
Closes-bug:
1386932
def elevated(self, read_deleted=None, overwrite=False):
"""Return a version of this context with admin flag set."""
- context = copy.copy(self)
+ context = self.deepcopy()
context.is_admin = True
if 'admin' not in context.roles:
'read_deleted',
True)
+ def test_request_context_elevated(self):
+ user_context = context.RequestContext(
+ 'fake_user', 'fake_project', admin=False)
+ self.assertFalse(user_context.is_admin)
+ admin_context = user_context.elevated()
+ self.assertFalse(user_context.is_admin)
+ self.assertTrue(admin_context.is_admin)
+ self.assertFalse('admin' in user_context.roles)
+ self.assertTrue('admin' in admin_context.roles)
+
def test_service_catalog_nova_and_swift(self):
service_catalog = [
{u'type': u'compute', u'name': u'nova'},