Skip to content

Commit 57938b0

Browse files
committed
Converted many cases of plain-text 403 messages to use a properly styled page instead, with a login link when appropriate. Also changed some API endpoint 400 responses to a more correct 403.
- Legacy-Id: 18339
1 parent ab7abb5 commit 57938b0

27 files changed

Lines changed: 182 additions & 157 deletions

File tree

ietf/api/tests.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def test_api_set_session_video_url(self):
8383
badrole.person.user.last_login = timezone.now()
8484
badrole.person.user.save()
8585
r = self.client.post(url, {'apikey': badapikey.hash()} )
86-
self.assertContains(r, "Restricted to role Recording Manager", status_code=403)
86+
self.assertContains(r, "Restricted to role: Recording Manager", status_code=403)
8787

8888
r = self.client.post(url, {'apikey': apikey.hash()} )
8989
self.assertContains(r, "Too long since last regular login", status_code=400)
@@ -173,7 +173,7 @@ def test_api_upload_bluesheet(self):
173173
badrole.person.user.last_login = timezone.now()
174174
badrole.person.user.save()
175175
r = self.client.post(url, {'apikey': badapikey.hash()} )
176-
self.assertContains(r, "Restricted to roles Recording Manager, Secretariat", status_code=403)
176+
self.assertContains(r, "Restricted to roles: Recording Manager, Secretariat", status_code=403)
177177

178178
r = self.client.post(url, {'apikey': apikey.hash()} )
179179
self.assertContains(r, "Too long since last regular login", status_code=400)
@@ -257,7 +257,7 @@ def test_api_v2_person_export_view(self):
257257
badrole.person.user.last_login = timezone.now()
258258
badrole.person.user.save()
259259
r = self.client.post(url, {'apikey': badapikey.hash()})
260-
self.assertContains(r, "Restricted to role Secretariat", status_code=403)
260+
self.assertContains(r, "Restricted to role: Secretariat", status_code=403)
261261

262262
r = self.client.post(url, {'apikey': apikey.hash()})
263263
self.assertContains(r, "Too long since last regular login", status_code=400)
@@ -292,7 +292,7 @@ def test_api_new_meeting_registration(self):
292292
}
293293
url = urlreverse('ietf.api.views.api_new_meeting_registration')
294294
r = self.client.post(url, reg)
295-
self.assertContains(r, 'Invalid apikey', status_code=400)
295+
self.assertContains(r, 'Invalid apikey', status_code=403)
296296
oidcp = PersonFactory(user__is_staff=True)
297297
# Make sure 'oidcp' has an acceptable role
298298
RoleFactory(name_id='robot', person=oidcp, email=oidcp.email(), group__acronym='secretariat')

ietf/community/views.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import json
88
import uuid
99

10-
from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect, Http404
10+
from django.http import HttpResponse, HttpResponseRedirect, Http404
1111
from django.shortcuts import get_object_or_404, render
1212
from django.contrib.auth.decorators import login_required
1313
from django.utils.html import strip_tags
@@ -21,6 +21,7 @@
2121
from ietf.community.utils import states_of_significant_change, reset_name_contains_index_for_rule
2222
from ietf.doc.models import DocEvent, Document
2323
from ietf.doc.utils_search import prepare_document_table
24+
from ietf.utils.response import permission_denied
2425

2526
def view_list(request, username=None):
2627
clist = lookup_community_list(username)
@@ -45,7 +46,7 @@ def manage_list(request, username=None, acronym=None, group_type=None):
4546
clist = lookup_community_list(username, acronym)
4647

4748
if not can_manage_community_list(request.user, clist):
48-
return HttpResponseForbidden("You do not have permission to access this view")
49+
permission_denied(request, "You do not have permission to access this view")
4950

5051
action = request.POST.get('action')
5152

@@ -129,7 +130,7 @@ def track_document(request, name, username=None, acronym=None):
129130
if request.method == "POST":
130131
clist = lookup_community_list(username, acronym)
131132
if not can_manage_community_list(request.user, clist):
132-
return HttpResponseForbidden("You do not have permission to access this view")
133+
permission_denied(request, "You do not have permission to access this view")
133134

134135
if clist.pk is None:
135136
clist.save()
@@ -151,7 +152,7 @@ def untrack_document(request, name, username=None, acronym=None):
151152
doc = get_object_or_404(Document, docalias__name=name)
152153
clist = lookup_community_list(username, acronym)
153154
if not can_manage_community_list(request.user, clist):
154-
return HttpResponseForbidden("You do not have permission to access this view")
155+
permission_denied(request, "You do not have permission to access this view")
155156

156157
if request.method == "POST":
157158
if clist.pk is not None:

ietf/dbtemplate/views.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from django.http import HttpResponseForbidden, HttpResponseRedirect
1+
# Copyright The IETF Trust 2012-2020, All Rights Reserved
2+
3+
from django.http import HttpResponseRedirect
24
from django.shortcuts import get_object_or_404, render
35

46
import debug # pyflakes:ignore
@@ -7,13 +9,14 @@
79
from ietf.dbtemplate.forms import DBTemplateForm
810
from ietf.group.models import Group
911
from ietf.ietfauth.utils import has_role
12+
from ietf.utils.response import permission_denied
1013

1114

1215
def group_template_list(request, acronym):
1316
group = get_object_or_404(Group, acronym=acronym)
1417
chairs = group.role_set.filter(name__slug='chair')
1518
if not has_role(request.user, "Secretariat") and not (request.user.id and chairs.filter(person__user=request.user).count()):
16-
return HttpResponseForbidden("You are not authorized to access this view")
19+
permission_denied(request, "You are not authorized to access this view.")
1720

1821
template_list = DBTemplate.objects.filter(group=group)
1922
return render(request, 'dbtemplate/template_list.html',
@@ -28,7 +31,7 @@ def group_template_edit(request, acronym, template_id, base_template='dbtemplate
2831
extra_context = extra_context or {}
2932

3033
if not has_role(request.user, "Secretariat") and not (request.user.id and chairs.filter(person__user=request.user).count()):
31-
return HttpResponseForbidden("You are not authorized to access this view")
34+
permission_denied(request, "You are not authorized to access this view.")
3235

3336
template = get_object_or_404(DBTemplate, id=template_id, group=group)
3437
if request.method == 'POST':
@@ -52,7 +55,7 @@ def group_template_show(request, acronym, template_id, base_template='dbtemplate
5255
extra_context = extra_context or {}
5356

5457
if not has_role(request.user, "Secretariat") and not (request.user.id and chairs.filter(person__user=request.user).count()):
55-
return HttpResponseForbidden("You are not authorized to access this view")
58+
permission_denied(request, "You are not authorized to access this view.")
5659

5760
template = get_object_or_404(DBTemplate, id=template_id, group=group)
5861

ietf/doc/tests_ballot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ def test_ballot_downref_approve(self):
739739
# Only Secretariat can use this URL
740740
login_testing_unauthorized(self, "ad", url)
741741
r = self.client.get(url)
742-
self.assertContains(r, "Restricted to role Secretariat", status_code=403)
742+
self.assertContains(r, "Restricted to role: Secretariat", status_code=403)
743743

744744
# There are no downrefs, the page should say so
745745
login_testing_unauthorized(self, "secretary", url)

ietf/doc/views_ballot.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from django import forms
1010
from django.conf import settings
11-
from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect, Http404
11+
from django.http import HttpResponse, HttpResponseRedirect, Http404
1212
from django.shortcuts import render, get_object_or_404, redirect
1313
from django.template.defaultfilters import striptags
1414
from django.template.loader import render_to_string
@@ -28,6 +28,7 @@
2828
generate_issue_ballot_mail, generate_ballot_writeup, generate_ballot_rfceditornote,
2929
generate_approval_mail, email_irsg_ballot_closed, email_irsg_ballot_issued )
3030
from ietf.doc.lastcall import request_last_call
31+
from ietf.doc.templatetags.ietf_filters import can_ballot
3132
from ietf.iesg.models import TelechatDate
3233
from ietf.ietfauth.utils import has_role, role_required, is_authorized_in_doc_stream
3334
from ietf.mailtrigger.utils import gather_address_lists
@@ -38,7 +39,7 @@
3839
from ietf.utils import log
3940
from ietf.utils.mail import send_mail_text, send_mail_preformatted
4041
from ietf.utils.decorators import require_api_key
41-
from ietf.doc.templatetags.ietf_filters import can_ballot
42+
from ietf.utils.response import permission_denied
4243

4344
BALLOT_CHOICES = (("yes", "Yes"),
4445
("noobj", "No Objection"),
@@ -213,7 +214,7 @@ def edit_position(request, name, ballot_id):
213214
old_pos = None
214215
if not has_role(request.user, "Secretariat") and not can_ballot(request.user, doc):
215216
# prevent pre-ADs from voting
216-
return HttpResponseForbidden("Must be a proper Area Director in an active area or IRSG Member to cast ballot")
217+
permission_denied(request, "Must be a proper Area Director in an active area or IRSG Member to cast ballot")
217218

218219
form = EditPositionForm(request.POST, ballot_type=ballot.ballot_type)
219220
if form.is_valid():
@@ -682,7 +683,7 @@ def ballot_rfceditornote(request, name):
682683
doc = get_object_or_404(Document, docalias__name=name)
683684

684685
if not is_authorized_in_doc_stream(request.user, doc):
685-
return HttpResponseForbidden("You do not have the necessary permissions to change the RFC Editor Note for this document")
686+
permission_denied(request, "You do not have the necessary permissions to change the RFC Editor Note for this document")
686687

687688
login = request.user.person
688689

ietf/doc/views_charter.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import os
99
import textwrap
1010

11-
from django.http import HttpResponseRedirect, HttpResponseNotFound, HttpResponseForbidden, Http404
11+
from django.http import HttpResponseRedirect, HttpResponseNotFound, Http404
1212
from django.shortcuts import get_object_or_404, redirect, render
1313
from django.urls import reverse as urlreverse
1414
from django import forms
@@ -32,16 +32,17 @@
3232
change_group_state_after_charter_approval, fix_charter_revision_after_approval,
3333
split_charter_name)
3434
from ietf.doc.mails import email_state_changed, email_charter_internal_review
35+
from ietf.group.mails import email_admin_re_charter
3536
from ietf.group.models import Group, ChangeStateGroupEvent, MilestoneGroupEvent
3637
from ietf.group.utils import save_group_in_history, save_milestone_in_history, can_manage_group_type
38+
from ietf.group.views import fill_in_charter_info
3739
from ietf.ietfauth.utils import has_role, role_required
3840
from ietf.name.models import GroupStateName
3941
from ietf.person.models import Person
4042
from ietf.utils.history import find_history_active_at
4143
from ietf.utils.mail import send_mail_preformatted
4244
from ietf.utils.textupload import get_cleaned_text_file_content
43-
from ietf.group.mails import email_admin_re_charter
44-
from ietf.group.views import fill_in_charter_info
45+
from ietf.utils.response import permission_denied
4546

4647
class ChangeStateForm(forms.Form):
4748
charter_state = forms.ModelChoiceField(State.objects.filter(used=True, type="charter"), label="Charter state", empty_label=None, required=False)
@@ -70,7 +71,7 @@ def change_state(request, name, option=None):
7071
group = charter.group
7172

7273
if not can_manage_group_type(request.user, group):
73-
return HttpResponseForbidden("You don't have permission to access this view")
74+
permission_denied(request, "You don't have permission to access this view.")
7475

7576
chartering_type = get_chartering_type(charter)
7677

@@ -261,7 +262,7 @@ def change_title(request, name, option=None):
261262
charter = get_object_or_404(Document, type="charter", name=name)
262263
group = charter.group
263264
if not can_manage_group_type(request.user, group):
264-
return HttpResponseForbidden("You don't have permission to access this view")
265+
permission_denied(request, "You don't have permission to access this view.")
265266
by = request.user.person
266267
if request.method == 'POST':
267268
form = ChangeTitleForm(request.POST, charter=charter)
@@ -374,7 +375,7 @@ def submit(request, name, option=None):
374375
charter_rev = "00-00"
375376

376377
if not can_manage_group_type(request.user, group) or not group.features.has_chartering_process:
377-
return HttpResponseForbidden("You don't have permission to access this view")
378+
permission_denied(request, "You don't have permission to access this view.")
378379

379380

380381
path = os.path.join(settings.CHARTER_PATH, '%s-%s.txt' % (charter_canonical_name, charter_rev))

ietf/doc/views_doc.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
from urllib.parse import quote
4545

46-
from django.http import HttpResponse, Http404 , HttpResponseForbidden
46+
from django.http import HttpResponse, Http404
4747
from django.shortcuts import render, get_object_or_404, redirect
4848
from django.template.loader import render_to_string
4949
from django.urls import reverse as urlreverse
@@ -76,6 +76,7 @@
7676
from ietf.review.utils import can_request_review_of_doc, review_assignments_to_list_for_docs
7777
from ietf.review.utils import no_review_from_teams_on_doc
7878
from ietf.utils import markup_txt
79+
from ietf.utils.response import permission_denied
7980
from ietf.utils.text import maybe_split
8081

8182

@@ -1199,7 +1200,7 @@ def add_comment(request, name):
11991200
can_add_comment = has_role(request.user, ("Area Director", "Secretariat", "IRTF Chair"))
12001201
if not can_add_comment:
12011202
# The user is a chair or secretary, but not for this WG or RG
1202-
return HttpResponseForbidden("You need to be a chair or secretary of this group to add a comment.")
1203+
permission_denied(request, "You need to be a chair or secretary of this group to add a comment.")
12031204

12041205
if request.method == 'POST':
12051206
form = AddCommentForm(request.POST)
@@ -1272,7 +1273,7 @@ def edit_notify(request, name):
12721273
doc = get_object_or_404(Document, name=name)
12731274

12741275
if not ( is_authorized_in_doc_stream(request.user, doc) or user_is_person(request.user, doc.shepherd and doc.shepherd.person) or has_role(request.user, ["Area Director"]) ):
1275-
return HttpResponseForbidden("You do not have permission to perform this action")
1276+
permission_denied(request, "You do not have permission to perform this action")
12761277

12771278
init = { "notify" : doc.notify }
12781279

0 commit comments

Comments
 (0)