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

Test that we require validated email for email pushers #9496

Merged
merged 2 commits into from
Feb 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/9496.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test that we require validated email for email pushers.
6 changes: 6 additions & 0 deletions synapse/push/pusherpool.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

from prometheus_client import Gauge

from synapse.api.errors import Codes, SynapseError
from synapse.metrics.background_process_metrics import (
run_as_background_process,
wrap_as_background_process,
Expand Down Expand Up @@ -113,6 +114,11 @@ async def add_pusher(
The newly created pusher.
"""

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

time_now_msec = self.clock.time_msec()

# create the pusher setting last_stream_ordering to the current maximum
Expand Down
34 changes: 32 additions & 2 deletions tests/push/test_email.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from twisted.internet.defer import Deferred

import synapse.rest.admin
from synapse.api.errors import Codes, SynapseError
from synapse.rest.client.v1 import login, room

from tests.unittest import HomeserverTestCase
Expand Down Expand Up @@ -100,12 +101,19 @@ def prepare(self, reactor, clock, hs):
user_tuple = self.get_success(
self.hs.get_datastore().get_user_by_access_token(self.access_token)
)
token_id = user_tuple.token_id
self.token_id = user_tuple.token_id

# We need to add email to account before we can create a pusher.
self.get_success(
hs.get_datastore().user_add_threepid(
self.user_id, "email", "[email protected]", 0, 0
)
)

self.pusher = self.get_success(
self.hs.get_pusherpool().add_pusher(
user_id=self.user_id,
access_token=token_id,
access_token=self.token_id,
kind="email",
app_id="m.email",
app_display_name="Email Notifications",
Expand All @@ -116,6 +124,28 @@ def prepare(self, reactor, clock, hs):
)
)

def test_need_validated_email(self):
"""Test that we can only add an email pusher if the user has validated
their email.
"""
with self.assertRaises(SynapseError) as cm:
self.get_success_or_raise(
self.hs.get_pusherpool().add_pusher(
user_id=self.user_id,
access_token=self.token_id,
kind="email",
app_id="m.email",
app_display_name="Email Notifications",
device_display_name="[email protected]",
pushkey="[email protected]",
lang=None,
data={},
)
)

self.assertEqual(400, cm.exception.code)
self.assertEqual(Codes.THREEPID_NOT_FOUND, cm.exception.errcode)

def test_simple_sends_email(self):
# Create a simple room with two users
room = self.helper.create_room_as(self.user_id, tok=self.access_token)
Expand Down