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

Commit 37f329c

Browse files
authored
Fix that sending server notices fail if avatar is None (#13566)
Indroduced in #11846.
1 parent 9385c41 commit 37f329c

File tree

4 files changed

+64
-4
lines changed

4 files changed

+64
-4
lines changed

changelog.d/13566.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix a bug introduced in Synapse 1.52.0 where sending server notices fails if `max_avatar_size` or `allowed_avatar_mimetypes` is set and not `system_mxid_avatar_url`.

synapse/handlers/room_member.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ async def update_membership_locked(
689689
errcode=Codes.BAD_JSON,
690690
)
691691

692-
if "avatar_url" in content:
692+
if "avatar_url" in content and content.get("avatar_url") is not None:
693693
if not await self.profile_handler.check_avatar_size_and_mime_type(
694694
content["avatar_url"],
695695
):

tests/rest/admin/test_server_notice.py

+56
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,62 @@ def test_invalid_parameter(self) -> None:
159159
self.assertEqual(Codes.UNKNOWN, channel.json_body["errcode"])
160160
self.assertEqual("'msgtype' not in content", channel.json_body["error"])
161161

162+
@override_config(
163+
{
164+
"server_notices": {
165+
"system_mxid_localpart": "notices",
166+
"system_mxid_avatar_url": "somthingwrong",
167+
},
168+
"max_avatar_size": "10M",
169+
}
170+
)
171+
def test_invalid_avatar_url(self) -> None:
172+
"""If avatar url in homeserver.yaml is invalid and
173+
"check avatar size and mime type" is set, an error is returned.
174+
TODO: Should be checked when reading the configuration."""
175+
channel = self.make_request(
176+
"POST",
177+
self.url,
178+
access_token=self.admin_user_tok,
179+
content={
180+
"user_id": self.other_user,
181+
"content": {"msgtype": "m.text", "body": "test msg"},
182+
},
183+
)
184+
185+
self.assertEqual(500, channel.code, msg=channel.json_body)
186+
self.assertEqual(Codes.UNKNOWN, channel.json_body["errcode"])
187+
188+
@override_config(
189+
{
190+
"server_notices": {
191+
"system_mxid_localpart": "notices",
192+
"system_mxid_display_name": "test display name",
193+
"system_mxid_avatar_url": None,
194+
},
195+
"max_avatar_size": "10M",
196+
}
197+
)
198+
def test_displayname_is_set_avatar_is_none(self) -> None:
199+
"""
200+
Tests that sending a server notices is successfully,
201+
if a display_name is set, avatar_url is `None` and
202+
"check avatar size and mime type" is set.
203+
"""
204+
channel = self.make_request(
205+
"POST",
206+
self.url,
207+
access_token=self.admin_user_tok,
208+
content={
209+
"user_id": self.other_user,
210+
"content": {"msgtype": "m.text", "body": "test msg"},
211+
},
212+
)
213+
self.assertEqual(200, channel.code, msg=channel.json_body)
214+
215+
# user has one invite
216+
self._check_invite_and_join_status(self.other_user, 1, 0)
217+
162218
def test_server_notice_disabled(self) -> None:
163219
"""Tests that server returns error if server notice is disabled"""
164220
channel = self.make_request(

tests/server_notices/test_resource_limits_server_notices.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,19 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
1514
from unittest.mock import Mock
1615

16+
from twisted.test.proto_helpers import MemoryReactor
17+
1718
from synapse.api.constants import EventTypes, LimitBlockingTypes, ServerNoticeMsgType
1819
from synapse.api.errors import ResourceLimitError
1920
from synapse.rest import admin
2021
from synapse.rest.client import login, room, sync
22+
from synapse.server import HomeServer
2123
from synapse.server_notices.resource_limits_server_notices import (
2224
ResourceLimitsServerNotices,
2325
)
26+
from synapse.util import Clock
2427

2528
from tests import unittest
2629
from tests.test_utils import make_awaitable
@@ -52,7 +55,7 @@ def default_config(self):
5255

5356
return config
5457

55-
def prepare(self, reactor, clock, hs):
58+
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
5659
self.server_notices_sender = self.hs.get_server_notices_sender()
5760

5861
# relying on [1] is far from ideal, but the only case where
@@ -251,7 +254,7 @@ def default_config(self):
251254
c["admin_contact"] = "mailto:[email protected]"
252255
return c
253256

254-
def prepare(self, reactor, clock, hs):
257+
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
255258
self.store = self.hs.get_datastores().main
256259
self.server_notices_sender = self.hs.get_server_notices_sender()
257260
self.server_notices_manager = self.hs.get_server_notices_manager()

0 commit comments

Comments
 (0)