티스토리 수익 글 보기

티스토리 수익 글 보기

[1.3.x] Checked object permissions on admin history view. · django/django@d3a45e1 · GitHub
Skip to content

Commit d3a45e1

Browse files
carljmaaugustin
authored andcommitted
[1.3.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 d19a270 commit d3a45e1

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
@@ -1242,15 +1242,21 @@ def delete_view(self, request, object_id, extra_context=None):
12421242
def history_view(self, request, object_id, extra_context=None):
12431243
"The 'history' admin view for this model."
12441244
from django.contrib.admin.models import LogEntry
1245+
# First check if the user can see this history.
12451246
model = self.model
1247+
obj = get_object_or_404(model, pk=unquote(object_id))
1248+
1249+
if not self.has_change_permission(request, obj):
1250+
raise PermissionDenied
1251+
1252+
# Then get the history for this object.
12461253
opts = model._meta
12471254
app_label = opts.app_label
12481255
action_list = LogEntry.objects.filter(
12491256
object_id = object_id,
12501257
content_type__id__exact = ContentType.objects.get_for_model(model).id
12511258
).select_related().order_by('action_time')
1252-
# If no history was found, see whether this object even exists.
1253-
obj = get_object_or_404(model, pk=unquote(object_id))
1259+
12541260
context = {
12551261
'title': _('Change history: %s') % force_unicode(obj),
12561262
'action_list': action_list,

tests/regressiontests/admin_views/tests.py

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

830+
def testHistoryView(self):
831+
"""History view should restrict access."""
832+
833+
# add user shoud not be able to view the list of article or change any of them
834+
self.client.get('/test_admin/admin/')
835+
self.client.post('/test_admin/admin/', self.adduser_login)
836+
response = self.client.get('/test_admin/admin/admin_views/article/1/history/')
837+
self.assertEqual(response.status_code, 403)
838+
self.client.get('/test_admin/admin/logout/')
839+
840+
# change user can view all items and edit them
841+
self.client.get('/test_admin/admin/')
842+
self.client.post('/test_admin/admin/', self.changeuser_login)
843+
response = self.client.get('/test_admin/admin/admin_views/article/1/history/')
844+
self.assertEqual(response.status_code, 200)
845+
846+
# Test redirection when using row-level change permissions. Refs #11513.
847+
RowLevelChangePermissionModel.objects.create(id=1, name="odd id")
848+
RowLevelChangePermissionModel.objects.create(id=2, name="even id")
849+
for login_dict in [self.super_login, self.changeuser_login, self.adduser_login, self.deleteuser_login]:
850+
self.client.post('/test_admin/admin/', login_dict)
851+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/')
852+
self.assertEqual(response.status_code, 403)
853+
854+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/')
855+
self.assertEqual(response.status_code, 200)
856+
857+
self.client.get('/test_admin/admin/logout/')
858+
859+
for login_dict in [self.joepublic_login, self.no_username_login]:
860+
self.client.post('/test_admin/admin/', login_dict)
861+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/')
862+
self.assertEqual(response.status_code, 200)
863+
self.assertContains(response, 'login-form')
864+
response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/')
865+
self.assertEqual(response.status_code, 200)
866+
self.assertContains(response, 'login-form')
867+
868+
self.client.get('/test_admin/admin/logout/')
869+
830870
def testConditionallyShowAddSectionLink(self):
831871
"""
832872
The foreign key widget should only show the "add related" button if the

0 commit comments

Comments
 (0)