Skip to content

Commit 06bbe40

Browse files
Fixes based on the code review (redmine-58907)
1 parent 95d564b commit 06bbe40

4 files changed

Lines changed: 131 additions & 47 deletions

File tree

admin/templates/loa/list.html

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,21 +89,9 @@ <h2>{% trans "Level of Assurance" %}</h2>
8989
{% endblock content %}
9090

9191
{% block bottom_js %}
92-
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
93-
<script>window.jQuery || document.write('<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">\x3C/script>')</script>
9492
<script type="application/javascript">
95-
function escapeHtml(unsafe) {
96-
return unsafe
97-
.replace(/&/g, "&amp;")
98-
.replace(/</g, "&lt;")
99-
.replace(/>/g, "&gt;")
100-
.replace(/"/g, "&quot;")
101-
.replace(/'/g, "&#039;");
102-
}
103-
10493
document.getElementById("institution_id").addEventListener("change", function change_institution() {
10594
window.location = window.location.origin + "{% url 'loa:list' %}" + '?institution_id=' + document.getElementById("institution_id").value;
10695
});
107-
10896
</script>
10997
{% endblock %}

api/institutions/authentication.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,17 @@ def get_next(obj, *args):
255255
if loa:
256256
if loa.aal == 2:
257257
if not re.search(OSF_AAL2_STR, str(aal)):
258-
mfa_url = mfa_url_tmp
258+
if mfa_url_tmp:
259+
mfa_url = mfa_url_tmp
260+
else:
261+
# MFA URL cannot be generated (e.g. p_idp is not a string).
262+
# Without MFA redirect, allowing login would silently bypass
263+
# the AAL2 requirement — reject the login instead.
264+
message = (
265+
'Institution login failed: Does not meet the required AAL.'
266+
'<br />MFA redirect is not available for this institution.'
267+
)
268+
loa_flag = False
259269
elif loa.aal == 1:
260270
if not aal:
261271
message = (

api_tests/institutions/views/test_institution_auth.py

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def test_new_user_created(self, app, url_auth_institution, institution):
117117

118118
with capture_signals() as mock_signals:
119119
res = app.post(url_auth_institution, make_payload(institution, username))
120-
assert res.status_code == 204 or res.status_code == 200
120+
assert res.status_code == 200
121121
assert mock_signals.signals_sent() == set([signals.user_confirmed])
122122

123123
user = OSFUser.objects.filter(username=username).first()
@@ -134,7 +134,7 @@ def test_existing_user_found_but_not_affiliated(self, app, institution, url_auth
134134

135135
with capture_signals() as mock_signals:
136136
res = app.post(url_auth_institution, make_payload(institution, username))
137-
assert res.status_code == 204 or res.status_code == 200
137+
assert res.status_code == 200
138138
assert not mock_signals.signals_sent()
139139

140140
user.reload()
@@ -150,7 +150,7 @@ def test_user_found_and_affiliated(self, app, institution, url_auth_institution)
150150

151151
with capture_signals() as mock_signals:
152152
res = app.post(url_auth_institution, make_payload(institution, username))
153-
assert res.status_code == 204 or res.status_code == 200
153+
assert res.status_code == 200
154154
assert not mock_signals.signals_sent()
155155

156156
user.reload()
@@ -174,7 +174,7 @@ def test_new_user_names_guessed_if_not_provided(self, app, institution, url_auth
174174

175175
username = 'user_created_with_fullname_only@osf.edu'
176176
res = app.post(url_auth_institution, make_payload(institution, username))
177-
assert res.status_code == 204 or res.status_code == 200
177+
assert res.status_code == 200
178178
user = OSFUser.objects.filter(username=username).first()
179179
assert user
180180
assert user.fullname == 'Fake User'
@@ -189,7 +189,7 @@ def test_new_user_names_used_when_provided(self, app, institution, url_auth_inst
189189
url_auth_institution,
190190
make_payload(institution, username, given_name='Foo', family_name='Bar')
191191
)
192-
assert res.status_code == 204 or res.status_code == 200
192+
assert res.status_code == 200
193193
user = OSFUser.objects.filter(username=username).first()
194194
assert user
195195
assert user.fullname == 'Fake User'
@@ -216,7 +216,7 @@ def test_user_active(self, app, institution, url_auth_institution):
216216
department='Fake Department',
217217
)
218218
)
219-
assert res.status_code == 204 or res.status_code == 200
219+
assert res.status_code == 200
220220
assert not mock_signals.signals_sent()
221221

222222
user = OSFUser.objects.filter(username=username).first()
@@ -255,7 +255,7 @@ def test_user_unclaimed(self, app, institution, url_auth_institution):
255255
department='Fake Department',
256256
)
257257
)
258-
assert res.status_code == 204 or res.status_code == 200
258+
assert res.status_code == 200
259259
assert mock_signals.signals_sent() == set([signals.user_confirmed])
260260

261261
user = OSFUser.objects.filter(username=username).first()
@@ -290,7 +290,7 @@ def test_user_unconfirmed(self, app, institution, url_auth_institution):
290290
fullname='Fake User'
291291
)
292292
)
293-
assert res.status_code == 204 or res.status_code == 200
293+
assert res.status_code == 200
294294
assert mock_signals.signals_sent() == set([signals.user_confirmed])
295295

296296
user = OSFUser.objects.filter(username=username).first()
@@ -412,7 +412,7 @@ def test_authenticate_jaSurname_and_jaGivenName_are_valid(
412412
jaGivenName=jagivenname, jaSurname=jasurname),
413413
expect_errors=True
414414
)
415-
assert res.status_code == 204 or res.status_code == 200
415+
assert res.status_code == 200
416416
user = OSFUser.objects.filter(username=username).first()
417417
assert user
418418
assert user.ext.data['idp_attr']['fullname_ja'] == jagivenname + ' ' + jasurname
@@ -426,7 +426,7 @@ def test_authenticate_jaGivenName_is_valid(
426426
make_payload(institution, username, jaGivenName=jagivenname),
427427
expect_errors=True
428428
)
429-
assert res.status_code == 204 or res.status_code == 200
429+
assert res.status_code == 200
430430
user = OSFUser.objects.filter(username=username).first()
431431
assert user
432432
assert user.given_name_ja == jagivenname
@@ -440,7 +440,7 @@ def test_authenticate_jaSurname_is_valid(
440440
make_payload(institution, username, jaSurname=jasurname),
441441
expect_errors=True
442442
)
443-
assert res.status_code == 204 or res.status_code == 200
443+
assert res.status_code == 200
444444
user = OSFUser.objects.filter(username=username).first()
445445
assert user
446446
assert user.family_name_ja == jasurname
@@ -454,7 +454,7 @@ def test_authenticate_jaMiddleNames_is_valid(
454454
make_payload(institution, username, jaMiddleNames=middlename),
455455
expect_errors=True
456456
)
457-
assert res.status_code == 204 or res.status_code == 200
457+
assert res.status_code == 200
458458
user = OSFUser.objects.filter(username=username).first()
459459
assert user
460460
assert user.middle_names_ja == middlename
@@ -468,7 +468,7 @@ def test_authenticate_givenname_is_valid(
468468
make_payload(institution, username, given_name=given_name),
469469
expect_errors=True
470470
)
471-
assert res.status_code == 204 or res.status_code == 200
471+
assert res.status_code == 200
472472
user = OSFUser.objects.filter(username=username).first()
473473
assert user
474474
assert user.given_name == given_name
@@ -482,7 +482,7 @@ def test_authenticate_familyname_is_valid(
482482
make_payload(institution, username, family_name=family_name),
483483
expect_errors=True
484484
)
485-
assert res.status_code == 204 or res.status_code == 200
485+
assert res.status_code == 200
486486
user = OSFUser.objects.filter(username=username).first()
487487
assert user
488488
assert user.family_name == family_name
@@ -496,7 +496,7 @@ def test_authenticate_middlename_is_valid(
496496
make_payload(institution, username, middle_names=middle_names),
497497
expect_errors=True
498498
)
499-
assert res.status_code == 204 or res.status_code == 200
499+
assert res.status_code == 200
500500
user = OSFUser.objects.filter(username=username).first()
501501
assert user
502502
assert user.middle_names == middle_names
@@ -515,7 +515,7 @@ def test_authenticate_jaOrganizationalUnitName_is_valid(
515515
organizationName=organizationname),
516516
expect_errors=True
517517
)
518-
assert res.status_code == 204 or res.status_code == 200
518+
assert res.status_code == 200
519519
user = OSFUser.objects.filter(username='tmp_eppn_' + username).first()
520520
assert user
521521
assert user.jobs[0]['department_ja'] == jaorganizationname
@@ -534,11 +534,37 @@ def test_authenticate_OrganizationalUnitName_is_valid(
534534
organizationName=organizationname),
535535
expect_errors=True
536536
)
537-
assert res.status_code == 204 or res.status_code == 200
537+
assert res.status_code == 200
538538
user = OSFUser.objects.filter(username='tmp_eppn_' + username).first()
539539
assert user
540540
assert user.jobs[0]['department'] == organizationnameunit
541541

542+
def test_authenticate__check_user_extended_data(self, app, institution, url_auth_institution):
543+
username, fullname, password = 'user_active@user.edu', 'Foo Bar', 'FuAsKeEr'
544+
user = make_user(username, fullname)
545+
user.set_password(password)
546+
user.save()
547+
548+
with capture_signals() as mock_signals:
549+
res = app.post(
550+
url_auth_institution,
551+
make_payload(
552+
institution,
553+
username,
554+
family_name='User',
555+
given_name='Fake',
556+
fullname='Fake User',
557+
department='Fake Department',
558+
login_availability='can login',
559+
)
560+
)
561+
assert res.status_code == 200
562+
assert not mock_signals.signals_sent()
563+
564+
# confirm login availability extended data
565+
extended_data = UserExtendedData.objects.get(user=user)
566+
assert extended_data.data.get('idp_attr', {}).get('login_availability') == 'can login'
567+
542568
@mock.patch('api.institutions.authentication.login_by_eppn')
543569
def test_with_new_attribute(self, mock, app, institution, url_auth_institution):
544570
mock.return_value = True
@@ -569,7 +595,7 @@ def test_with_new_attribute(self, mock, app, institution, url_auth_institution):
569595
gakunin_identity_assurance_method_reference=gakunin_identity_assurance_method_reference,)
570596
)
571597

572-
assert res.status_code == 204 or res.status_code == 200
598+
assert res.status_code == 200
573599
user = OSFUser.objects.filter(username='tmp_eppn_' + username).first()
574600
assert user
575601

0 commit comments

Comments
 (0)