Skip to content

Commit 78031d2

Browse files
committed
[fix] Simplified implementation
1 parent eb3c3ad commit 78031d2

File tree

2 files changed

+17
-39
lines changed

2 files changed

+17
-39
lines changed

openwisp_radius/saml/views.py

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
from urllib.parse import parse_qs, quote, urlencode, urlparse
33

44
import swapper
5-
from allauth.account.models import EmailAddress
65
from allauth.account.utils import send_email_confirmation
7-
from allauth.utils import ValidationError
6+
from allauth.utils import valid_email_or_none
87
from django import forms
98
from django.conf import settings
109
from django.contrib.auth import get_user_model, logout
@@ -24,7 +23,7 @@
2423
from .. import settings as app_settings
2524
from ..api.views import RadiusTokenMixin
2625
from ..utils import get_organization_radius_settings, load_model
27-
from .utils import get_email_from_ava, get_url_or_path
26+
from .utils import get_url_or_path
2827

2928
logger = logging.getLogger(__name__)
3029

@@ -75,42 +74,20 @@ def post_login_hook(self, request, user, session_info):
7574
try:
7675
user.registered_user
7776
except ObjectDoesNotExist:
78-
email = None
79-
uid_is_email = 'email' in getattr(
80-
settings, 'SAML_ATTRIBUTE_MAPPING', {}
81-
).get('uid', ())
82-
if uid_is_email:
83-
email = session_info['name_id'].text
84-
if email is None:
85-
email = get_email_from_ava(session_info['ava'])
86-
if email:
87-
user.email = email
88-
try:
89-
user.full_clean()
90-
user.save()
91-
EmailAddress.objects.create(
92-
user=user, email=email, verified=True, primary=True
93-
)
94-
except ValidationError:
95-
assertion_email = get_email_from_ava(session_info['ava'])
96-
if assertion_email and assertion_email != email:
97-
user.email = assertion_email
98-
try:
99-
user.full_clean()
100-
user.save()
101-
EmailAddress.objects.create(
102-
user=user,
103-
email=assertion_email,
104-
verified=True,
105-
primary=True,
106-
)
107-
except ValidationError:
108-
raise ValidationError('Email Verification Failed')
10977
registered_user = RegisteredUser(
11078
user=user, method='saml', is_verified=app_settings.SAML_IS_VERIFIED
11179
)
11280
registered_user.full_clean()
11381
registered_user.save()
82+
# The user is just created, it will not have an email address
83+
if user.email:
84+
email = valid_email_or_none(user.email)
85+
if not email:
86+
logger.exception(
87+
f'Failed email validation for "{user}"'
88+
' during SAML user creation'
89+
)
90+
send_email_confirmation(request, user, signup=True, email=user.email)
11491

11592
def customize_relay_state(self, relay_state):
11693
"""

openwisp_radius/tests/test_saml/test_views.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
from urllib.parse import parse_qs, urlparse
44

55
import swapper
6-
from allauth.account.models import EmailAddress
76
from django.conf import settings
87
from django.contrib.auth import SESSION_KEY, get_user_model
98
from django.core import mail
10-
from django.core.validators import ValidationError
119
from django.test import TestCase, override_settings
1210
from django.urls import reverse, reverse_lazy
1311
from djangosaml2.tests import auth_response, conf
@@ -73,8 +71,7 @@ def _post_successful_auth_assertions(self, query_params, org_slug):
7371
self.assertEqual(User.objects.count(), 1)
7472
user_id = self.client.session[SESSION_KEY]
7573
user = User.objects.get(id=user_id)
76-
email = EmailAddress.objects.filter(user=user)
77-
self.assertEqual(email.count(), 1)
74+
self.assertEqual(user.emailaddress_set.count(), 1)
7875
self.assertEqual(user.username, '[email protected]')
7976
self.assertEqual(OrganizationUser.objects.count(), 1)
8077
org_user = OrganizationUser.objects.get(user_id=user_id)
@@ -118,14 +115,18 @@ def test_invalid_email_raise_validation_error(self):
118115
saml_response, relay_state = self._get_saml_response_for_acs_view(
119116
relay_state, uid=invalid_email
120117
)
121-
with self.assertRaises(ValidationError):
118+
with patch('logging.Logger.exception') as mocked_logger:
122119
self.client.post(
123120
reverse('radius:saml2_acs'),
124121
{
125122
'SAMLResponse': self.b64_for_post(saml_response),
126123
'RelayState': relay_state,
127124
},
128125
)
126+
mocked_logger.assert_called_once_with(
127+
'Failed email validation for "invalid_email@example" during'
128+
' SAML user creation'
129+
)
129130

130131
@capture_any_output()
131132
def test_relay_state_relative_path(self):

0 commit comments

Comments
 (0)