티스토리 수익 글 보기

티스토리 수익 글 보기

[1.4.x] Checked object permissions on admin history view. · django/django@0e7861a · GitHub
Skip to content

Commit 0e7861a

Browse files
committed
[1.4.x] Checked object permissions on admin history view.
This is a security fix. Disclosure and advisory coming shortly. Patch by Russell Keith-Magee.
1 parent 1c60d07 commit 0e7861a

File tree

2 files changed

+48
2
lines changed

2 files changed

+48
2
lines changed

django/contrib/admin/options.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,15 +1317,21 @@ def delete_view(self, request, object_id, extra_context=None):
13171317
def history_view(self, request, object_id, extra_context=None):
13181318
"The 'history' admin view for this model."
13191319
from django.contrib.admin.models import LogEntry
1320+
# First check if the user can see this history.
13201321
model = self.model
1322+
obj = get_object_or_404(model, pk=unquote(object_id))
1323+
1324+
if not self.has_change_permission(request, obj):
1325+
raise PermissionDenied
1326+
1327+
# Then get the history for this object.
13211328
opts = model._meta
13221329
app_label = opts.app_label
13231330
action_list = LogEntry.objects.filter(
13241331
object_id = object_id,
13251332
content_type__id__exact = ContentType.objects.get_for_model(model).id
13261333
).select_related().order_by('action_time')
1327-
# If no history was found, see whether this object even exists.
1328-
obj = get_object_or_404(model, pk=unquote(object_id))
1334+
13291335
context = {
13301336
'title': _('Change history: %s') % force_unicode(obj),
13311337
'action_list': action_list,

tests/regressiontests/admin_views/tests.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,46 @@ def testChangeView(self):
10641064
self.assertContains(request, 'login-form')
10651065
self.client.get('/test_admin/admin/logout/')
10661066

1067+
def testHistoryView(self):
1068+
"""History view should restrict access."""
1069+
1070+
# add user shoud not be able to view the list of article or change any of them
1071+
self.client.get('/test_admin/admin/')
1072+
self.client.post('/test_admin/admin/', self.adduser_login)
1073+
response = self.client.get('/test_admin/admin/admin_views/article/1/history/')
1074+
self.assertEqual(response.status_code, 403)
1075+
self.client.get('/test_admin/admin/logout/')
1076+
1077+
# change user can view all items and edit them
1078+
self.client.get('/test_admin/admin/')
1079+
self.client.post('/test_admin/admin/', self.changeuser_login)
1080+
response = self.client.get('/test_admin/admin/admin_views/article/1/history/')
1081+
self.assertEqual(response.status_code, 200)
1082+
1083+
# Test redirection when using row-level change permissions. Refs #11513.
1084+
RowLevelChangePermissionModel.objects.create(id=1, name="odd id")
1085+
RowLevelChangePermissionModel.objects.create(id=2, name="even id")
1086+
for login_dict in [self.super_login, self.changeuser_login, self.adduser_login, self.deleteuser_login]:
1087+
self.client.post('/test_admin/admin/', login_dict)
1088+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/')
1089+
self.assertEqual(response.status_code, 403)
1090+
1091+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/')
1092+
self.assertEqual(response.status_code, 200)
1093+
1094+
self.client.get('/test_admin/admin/logout/')
1095+
1096+
for login_dict in [self.joepublic_login, self.no_username_login]:
1097+
self.client.post('/test_admin/admin/', login_dict)
1098+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/')
1099+
self.assertEqual(response.status_code, 200)
1100+
self.assertContains(response, 'login-form')
1101+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/')
1102+
self.assertEqual(response.status_code, 200)
1103+
self.assertContains(response, 'login-form')
1104+
1105+
self.client.get('/test_admin/admin/logout/')
1106+
10671107
def testConditionallyShowAddSectionLink(self):
10681108
"""
10691109
The foreign key widget should only show the "add related" button if the

0 commit comments

Comments
 (0)