Skip to content

Commit c79302a

Browse files
committed
remove placeholder email logic
1 parent 3cca425 commit c79302a

File tree

5 files changed

+28
-138
lines changed

5 files changed

+28
-138
lines changed

app/eventyay/base/models/auth.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
from eventyay.common.text.path import path_with_hash
4141
from eventyay.common.urls import EventUrls
4242
from eventyay.helpers.urls import build_absolute_uri
43-
from eventyay.person.utils import is_placeholder_email
4443
from eventyay.talk_rules.person import is_administrator
4544

4645
from ...helpers.u2f import pub_key_from_der, websafe_decode
@@ -361,8 +360,7 @@ def get_full_name(self) -> str:
361360
def send_security_notice(self, messages, email=None):
362361
from eventyay.base.services.mail import SendMailException, mail
363362

364-
# Skip email notifications for placeholder Wikimedia emails
365-
if is_placeholder_email(self.email):
363+
if not self.email:
366364
return
367365

368366
try:
@@ -384,8 +382,7 @@ def send_security_notice(self, messages, email=None):
384382
def send_password_reset(self, request: HttpRequest):
385383
from eventyay.base.services.mail import mail
386384

387-
# Skip email notifications for placeholder Wikimedia emails
388-
if is_placeholder_email(self.email):
385+
if not self.email:
389386
return
390387

391388
subject = _('Password recovery')
@@ -703,8 +700,7 @@ def reset_password(self, event, user=None, mail_text=None, orga=False):
703700

704701
self.log_action(action='eventyay.user.password.reset', user=user)
705702

706-
# Skip email notifications for placeholder Wikimedia emails
707-
if is_placeholder_email(self.email):
703+
if not self.email:
708704
return
709705

710706
context = {
@@ -750,8 +746,7 @@ def change_password(self, new_password):
750746

751747
self.log_action(action='eventyay.user.password.changed', user=self)
752748

753-
# Skip email notifications for placeholder Wikimedia emails
754-
if is_placeholder_email(self.email):
749+
if not self.email:
755750
return
756751

757752
context = {

app/eventyay/person/utils.py

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,3 @@
1-
def get_or_create_email_for_wikimedia_user(username, email=None, user_id=None):
2-
"""
3-
Generate an email for Wikimedia users.
4-
5-
Sanitizes username to ensure valid email format and uniqueness.
6-
Falls back to user ID if username is empty or invalid.
7-
8-
Args:
9-
username (str): Wikimedia username
10-
email (str): Email from Wikimedia profile (can be None)
11-
user_id: Wikimedia user ID for uniqueness and fallback
12-
13-
Returns:
14-
str: Email address
15-
"""
16-
if email and email.strip():
17-
return email
18-
19-
# Sanitize username: lowercase, strip, replace whitespace with dots, remove invalid chars
20-
if username:
21-
sanitized = username.lower().strip()
22-
sanitized = sanitized.replace(' ', '.').replace('_', '.')
23-
sanitized = ''.join(c for c in sanitized if c.isalnum() or c in '.-')
24-
while '..' in sanitized:
25-
sanitized = sanitized.replace('..', '.')
26-
sanitized = sanitized.strip('.')
27-
else:
28-
sanitized = None
29-
30-
# If sanitized username is empty or invalid, use user ID as fallback
31-
if sanitized:
32-
if user_id:
33-
return f"{sanitized}.{user_id}@wikimedia.local"
34-
return f"{sanitized}@wikimedia.local"
35-
else:
36-
# Fallback: use Wikimedia user ID only
37-
if user_id:
38-
return f"wm.{user_id}@wikimedia.local"
39-
else:
40-
41-
42-
43-
def is_placeholder_email(email):
44-
"""
45-
Check if an email is a placeholder (non-routable) Wikimedia address.
46-
These emails should never have messages sent to them.
47-
48-
Args:
49-
email (str): Email address to check
50-
51-
Returns:
52-
bool: True if the email is a placeholder Wikimedia email
53-
"""
54-
if not email:
55-
return False
56-
return email.endswith('@wikimedia.local')
57-
58-
591
def is_wikimedia_user(user):
602
"""
613
Check if user is authenticated via Wikimedia OAuth

app/eventyay/plugins/socialauth/views.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
from eventyay.control.permissions import AdministratorPermissionRequiredMixin
1919
from eventyay.eventyay_common.views.auth import process_login_and_set_cookie
2020
from eventyay.helpers.urls import build_absolute_uri
21-
from eventyay.person.utils import get_or_create_email_for_wikimedia_user
22-
2321
from .schemas.login_providers import LoginProviders
2422
from .schemas.oauth2_params import OAuth2Params
2523

@@ -108,15 +106,9 @@ def get_or_create_user(request: HttpRequest) -> User:
108106
# Use social account ID as fallback
109107
wikimedia_username = f"wm_{social_account.uid}"
110108

111-
# Generate placeholder email for Wikimedia users without email
112-
final_email = get_or_create_email_for_wikimedia_user(
113-
wikimedia_username,
114-
email,
115-
user_id=social_account.uid if social_account else None
116-
)
109+
final_email = email if (email and str(email).strip()) else None
117110

118111
# For Wikimedia users, look up by wikimedia_username instead of email
119-
# to avoid collisions between placeholder emails
120112
if social_account:
121113
user, created = User.objects.get_or_create(
122114
wikimedia_username=wikimedia_username,

app/eventyay/presale/forms/checkout.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,13 @@ def __init__(self, *args, **kwargs):
3838
# Make email optional for Wikimedia users
3939
if self.request and self.request.user and is_wikimedia_user(self.request.user):
4040
self.fields['email'].required = False
41-
self.fields['email'].help_text = _('E-mail (optional for Wikimedia users)')
42-
else:
43-
self.fields['email'].required = True
41+
self.fields['email'].help_text = _('E-mail address (optional for Wikimedia users)')
4442

4543
if self.event.settings.order_email_asked_twice:
4644
self.fields['email_repeat'] = forms.EmailField(
4745
label=_('E-mail address (repeated)'),
4846
help_text=_('Please enter the same email address again to make sure you typed it correctly.'),
4947
)
50-
# Make email_repeat optional for Wikimedia users too
5148
if self.request and self.request.user and is_wikimedia_user(self.request.user):
5249
self.fields['email_repeat'].required = False
5350

@@ -94,11 +91,9 @@ def __init__(self, *args, **kwargs):
9491

9592
def clean(self):
9693
cleaned_data = super().clean()
97-
9894
# For Wikimedia users, skip email validation
9995
if self.request and self.request.user and is_wikimedia_user(self.request.user):
10096
return cleaned_data
101-
10297
# Validate email_repeat matches email if both are provided
10398
if (
10499
self.event.settings.order_email_asked_twice
Lines changed: 22 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,22 @@
11
"""
2-
Tests for Wikimedia email registration functionality.
2+
Tests for Wikimedia user utilities.
33
"""
44
from django.test import TestCase
55
from django.contrib.auth import get_user_model
66

7-
from eventyay.person.utils import (
8-
get_or_create_email_for_wikimedia_user,
9-
is_wikimedia_user,
10-
is_placeholder_email,
11-
)
7+
from eventyay.person.utils import is_wikimedia_user
128

139
User = get_user_model()
1410

1511

16-
class WikimediaEmailUtilsTests(TestCase):
17-
"""Test utilities for Wikimedia OAuth users."""
18-
19-
def test_placeholder_email_with_real_email(self):
20-
"""Real email takes precedence over placeholder generation."""
21-
result = get_or_create_email_for_wikimedia_user('testuser', '[email protected]')
22-
self.assertEqual(result, '[email protected]')
23-
24-
def test_placeholder_email_without_email(self):
25-
"""Placeholder email generated when no email provided."""
26-
result = get_or_create_email_for_wikimedia_user('testuser', None, user_id=123)
27-
self.assertEqual(result, '[email protected]')
28-
29-
def test_sanitize_username_with_spaces(self):
30-
"""Spaces converted to dots."""
31-
result = get_or_create_email_for_wikimedia_user('Test User', None, user_id=456)
32-
self.assertTrue(result.startswith('test.user'))
33-
self.assertIn('@wikimedia.local', result)
34-
35-
def test_sanitize_username_with_underscores(self):
36-
"""Underscores converted to dots."""
37-
result = get_or_create_email_for_wikimedia_user('test_user_name', None, user_id=789)
38-
self.assertEqual(result, '[email protected]')
39-
40-
def test_remove_special_characters(self):
41-
"""Special characters removed from username."""
42-
result = get_or_create_email_for_wikimedia_user('test@user#123', None, user_id=101)
43-
self.assertEqual(result, '[email protected]')
44-
45-
def test_empty_username_fallback(self):
46-
"""Empty username uses ID-based fallback."""
47-
result = get_or_create_email_for_wikimedia_user('', None, user_id=789)
48-
self.assertEqual(result, '[email protected]')
49-
50-
def test_is_placeholder_email_true(self):
51-
"""Wikimedia.local emails identified as placeholders."""
52-
self.assertTrue(is_placeholder_email('[email protected]'))
53-
54-
def test_is_placeholder_email_false(self):
55-
"""Real emails not identified as placeholders."""
56-
self.assertFalse(is_placeholder_email('[email protected]'))
57-
self.assertFalse(is_placeholder_email(None))
12+
class WikimediaUserUtilsTests(TestCase):
13+
"""Test utilities for identifying Wikimedia OAuth users."""
5814

5915
def test_is_wikimedia_user_true(self):
6016
"""Wikimedia users correctly identified."""
6117
user = User.objects.create_user(
62-
18+
19+
wikimedia_username='testuser',
6320
is_wikimedia_user=True
6421
)
6522
self.assertTrue(is_wikimedia_user(user))
@@ -69,13 +26,22 @@ def test_is_wikimedia_user_false(self):
6926
user = User.objects.create_user(email='[email protected]')
7027
self.assertFalse(is_wikimedia_user(user))
7128

72-
def test_wikimedia_user_creation(self):
73-
"""Wikimedia user can be created with placeholder email."""
74-
email = get_or_create_email_for_wikimedia_user('wikiuser', None, user_id=999)
29+
def test_is_wikimedia_user_no_email(self):
30+
"""Wikimedia users can have no email."""
7531
user = User.objects.create_user(
76-
email=email,
77-
wikimedia_username='wikiuser',
32+
email=None,
33+
wikimedia_username='testuser',
7834
is_wikimedia_user=True
7935
)
80-
self.assertEqual(user.email, '[email protected]')
81-
self.assertTrue(user.is_wikimedia_user)
36+
self.assertTrue(is_wikimedia_user(user))
37+
self.assertIsNone(user.email)
38+
39+
def test_is_wikimedia_user_unauthenticated(self):
40+
"""Unauthenticated users are not Wikimedia users."""
41+
user = User.objects.create_user(
42+
43+
wikimedia_username='testuser',
44+
is_wikimedia_user=True
45+
)
46+
user.is_authenticated = False
47+
self.assertFalse(is_wikimedia_user(user))

0 commit comments

Comments
 (0)