@@ -1453,7 +1453,7 @@ def test_attribute_requirements_contains(self) -> None:
14531453 }
14541454 }
14551455 )
1456- def test_attribute_requirements_one_of (self ) -> None :
1456+ def test_attribute_requirements_one_of_succeeds (self ) -> None :
14571457 """Test that auth succeeds if userinfo attribute has multiple values and CONTAINS required value"""
14581458 # userinfo with "test": ["bar"] attribute should succeed.
14591459 userinfo = {
@@ -1475,6 +1475,81 @@ def test_attribute_requirements_one_of(self) -> None:
14751475 auth_provider_session_id = None ,
14761476 )
14771477
1478+ @override_config (
1479+ {
1480+ "oidc_config" : {
1481+ ** DEFAULT_CONFIG ,
1482+ "attribute_requirements" : [
1483+ {"attribute" : "test" , "one_of" : ["foo" , "bar" ]}
1484+ ],
1485+ }
1486+ }
1487+ )
1488+ def test_attribute_requirements_one_of_fails (self ) -> None :
1489+ """Test that auth fails if userinfo attribute has multiple values yet
1490+ DOES NOT CONTAIN a required value
1491+ """
1492+ # userinfo with "test": ["something else"] attribute should fail.
1493+ userinfo = {
1494+ "sub" : "tester" ,
1495+ "username" : "tester" ,
1496+ "test" : ["something else" ],
1497+ }
1498+ request , _ = self .start_authorization (userinfo )
1499+ self .get_success (self .handler .handle_oidc_callback (request ))
1500+ self .complete_sso_login .assert_not_called ()
1501+
1502+ @override_config (
1503+ {
1504+ "oidc_config" : {
1505+ ** DEFAULT_CONFIG ,
1506+ "attribute_requirements" : [{"attribute" : "test" }],
1507+ }
1508+ }
1509+ )
1510+ def test_attribute_requirements_does_not_exist (self ) -> None :
1511+ """OIDC login fails if the required attribute does not exist in the OIDC userinfo response."""
1512+ # userinfo lacking "test" attribute should fail.
1513+ userinfo = {
1514+ "sub" : "tester" ,
1515+ "username" : "tester" ,
1516+ }
1517+ request , _ = self .start_authorization (userinfo )
1518+ self .get_success (self .handler .handle_oidc_callback (request ))
1519+ self .complete_sso_login .assert_not_called ()
1520+
1521+ @override_config (
1522+ {
1523+ "oidc_config" : {
1524+ ** DEFAULT_CONFIG ,
1525+ "attribute_requirements" : [{"attribute" : "test" }],
1526+ }
1527+ }
1528+ )
1529+ def test_attribute_requirements_exist (self ) -> None :
1530+ """OIDC login succeeds if the required attribute exist (regardless of value)
1531+ in the OIDC userinfo response.
1532+ """
1533+ # userinfo with "test" attribute and random value should succeed.
1534+ userinfo = {
1535+ "sub" : "tester" ,
1536+ "username" : "tester" ,
1537+ "test" : random_string (5 ), # value does not matter
1538+ }
1539+ request , _ = self .start_authorization (userinfo )
1540+ self .get_success (self .handler .handle_oidc_callback (request ))
1541+
1542+ # check that the auth handler got called as expected
1543+ self .complete_sso_login .assert_called_once_with (
1544+ "@tester:test" ,
1545+ self .provider .idp_id ,
1546+ request ,
1547+ ANY ,
1548+ None ,
1549+ new_user = True ,
1550+ auth_provider_session_id = None ,
1551+ )
1552+
14781553 @override_config (
14791554 {
14801555 "oidc_config" : {
0 commit comments