Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Ensure emails are canonicalized before fetching associated user. (#11547
Browse files Browse the repository at this point in the history
)

This should fix pushers with an email in non-canonical form is used as
the pushkey.
  • Loading branch information
clokep authored Dec 10, 2021
1 parent 3b88722 commit 9562f0c
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 4 deletions.
1 change: 1 addition & 0 deletions changelog.d/11547.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a bug introduced in Synapse 1.17.0 where a pusher created for an email with capital letters would fail to be created.
5 changes: 4 additions & 1 deletion synapse/push/pusherpool.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from synapse.replication.http.push import ReplicationRemovePusherRestServlet
from synapse.types import JsonDict, RoomStreamToken
from synapse.util.async_helpers import concurrently_execute
from synapse.util.threepids import canonicalise_email

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -113,7 +114,9 @@ async def add_pusher(
"""

if kind == "email":
email_owner = await self.store.get_user_id_by_threepid("email", pushkey)
email_owner = await self.store.get_user_id_by_threepid(
"email", canonicalise_email(pushkey)
)
if email_owner != user_id:
raise SynapseError(400, "Email not found", Codes.THREEPID_NOT_FOUND)

Expand Down
3 changes: 2 additions & 1 deletion synapse/storage/databases/main/monthly_active_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from synapse.storage._base import SQLBaseStore
from synapse.storage.database import DatabasePool, make_in_list_sql_clause
from synapse.util.caches.descriptors import cached
from synapse.util.threepids import canonicalise_email

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -103,7 +104,7 @@ async def get_registered_reserved_users(self) -> List[str]:
: self.hs.config.server.max_mau_value
]:
user_id = await self.hs.get_datastore().get_user_id_by_threepid(
tp["medium"], tp["address"]
tp["medium"], canonicalise_email(tp["address"])
)
if user_id:
users.append(user_id)
Expand Down
3 changes: 2 additions & 1 deletion synapse/storage/databases/main/registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,8 @@ async def get_user_id_by_threepid(self, medium: str, address: str) -> Optional[s
Args:
medium: threepid medium e.g. email
address: threepid address e.g. me@example.com
address: threepid address e.g. me@example.com. This must already be
in canonical form.
Returns:
The user ID or None if no user id/threepid mapping exists
Expand Down
3 changes: 2 additions & 1 deletion tests/rest/admin/test_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -1550,7 +1550,8 @@ def test_create_user_email_notif_for_new_users(self):
# Create user
body = {
"password": "abc123",
"threepids": [{"medium": "email", "address": "bob@bob.bob"}],
# Note that the given email is not in canonical form.
"threepids": [{"medium": "email", "address": "Bob@bob.bob"}],
}

channel = self.make_request(
Expand Down

0 comments on commit 9562f0c

Please sign in to comment.