element-hq / element-ios

A glossy Matrix collaboration client for iOS
https://element.io
GNU Affero General Public License v3.0
1.73k stars 498 forks source link

Element requests thumbnails in 0x0 pixel resolution #7176

Open FlyveHest opened 1 year ago

FlyveHest commented 1 year ago

Steps to reproduce

Being the homeserver operator, I can't tell you exactly what the user is doing, but I am pretty sure they are just using the client as intended.

Outcome

What did you expect?

Normal operation

What happened instead?

I can see in the reverse proxy log that the Element client makes a request like the following:

x.x.x.x - - [15/Dec/2022:09:34:16 +0100] "GET /_matrix/media/r0/thumbnail/matrix-server.example/rAgGyDiZgIGXzumIIYcQhWPB?width=0&height=0&method=scale HTTP/1.1" 500 5701 "-" "Element/1.9.13 (iPhone 14 Pro Max; iOS 16.2; Scale/3.00)"

Notice the width=0&height=0 part

This results in an error on the homeserver:

x/media/r0/thumbnail/matrix.gladblad.dk/rAgGyDiZgIGXzumIIYcQhWPB?width=0&height=0&method=scale' clientproto='HTTP/1.1' site='8008'>
Dec 15 09:34:16 matrix docker/synapse[1641]: Traceback (most recent call last):
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/http/server.py", line 307, in _async_render_wrapper
Dec 15 09:34:16 matrix docker/synapse[1641]:     callback_return = await self._async_render(request)
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/http/server.py", line 337, in _async_render
Dec 15 09:34:16 matrix docker/synapse[1641]:     callback_return = await raw_callback_return
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnail_resource.py", line 76, in _async_render_GET
Dec 15 09:34:16 matrix docker/synapse[1641]:     await self._select_or_generate_local_thumbnail(
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnail_resource.py", line 178, in _select_or_generate_local_thumbnail
Dec 15 09:34:16 matrix docker/synapse[1641]:     file_path = await self.media_repo.generate_local_exact_thumbnail(
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/media_repository.py", line 592, in generate_local_exact_thumbnail
Dec 15 09:34:16 matrix docker/synapse[1641]:     t_byte_source = await defer_to_thread(
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/twisted/python/threadpool.py", line 244, in inContext
Dec 15 09:34:16 matrix docker/synapse[1641]:     result = inContext.theWork()  # type: ignore[attr-defined]
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/twisted/python/threadpool.py", line 260, in <lambda>
Dec 15 09:34:16 matrix docker/synapse[1641]:     inContext.theWork = lambda: context.call(  # type: ignore[attr-defined]
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/twisted/python/context.py", line 117, in callWithContext
Dec 15 09:34:16 matrix docker/synapse[1641]:     return self.currentContext().callWithContext(ctx, func, *args, **kw)
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/twisted/python/context.py", line 82, in callWithContext
Dec 15 09:34:16 matrix docker/synapse[1641]:     return func(*args, **kw)
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/logging/context.py", line 969, in g
Dec 15 09:34:16 matrix docker/synapse[1641]:     return f(*args, **kwargs)
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/media_repository.py", line 562, in _generate_thumbnail
Dec 15 09:34:16 matrix docker/synapse[1641]:     return thumbnailer.scale(t_width, t_height, t_type)
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnailer.py", line 143, in scale
Dec 15 09:34:16 matrix docker/synapse[1641]:     with self._resize(width, height) as scaled:
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnailer.py", line 135, in _resize
Dec 15 09:34:16 matrix docker/synapse[1641]:     return self.image.resize((width, height), Image.ANTIALIAS)
Dec 15 09:34:16 matrix docker/synapse[1641]:   File "/usr/local/lib/python3.9/site-packages/PIL/Image.py", line 2115, in resize
Dec 15 09:34:16 matrix docker/synapse[1641]:     return self._new(self.im.resize(size, resample, box))
Dec 15 09:34:16 matrix docker/synapse[1641]: ValueError: height and width must be > 0

Which again results in an error 500, and, what I suspect, is an empty image on the client.

Error is also reported in the Synapse project here

It would be nice if a check for 0x0 sized thumbnails could be made, and either fix the size or just not make requests if the size of the thumbnail is 0 in either width or height.

Your phone model

iPhone 11, 12 and 14

Operating system version

IOS 16, IOS 16.2

Application version

Element 1.9.13

Homeserver

Synapse 1.73.0

Will you send logs?

Yes

FlyveHest commented 1 year ago

A little bit more information, it looks like all the images that are requested in 0x0 resolution are user avatar pictures. (At least, the 10 or so I checked)