Skip to content

ensureRegistered requires forcing for the appservice bot user. #525

Description

@Gnuxie

Context, trying to use ensureRegistered followed by setDisplayName doesn't register the profile in Synapse.

2026-04-16 09:48:05,148 - synapse.http.server - 147 - ERROR - PUT-389 - Failed handle request via 'ProfileFieldRestServlet': <SynapseRequest at 0x7ff078e142d0 method='PUT' uri='/_matrix/client/v3/profile/%40draupnir-moderation%3Alocalhost%3A9999/displayname' clientproto='HTTP/1.0' s
ite='8008'>
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/synapse/http/server.py", line 335, in _async_render_wrapper
    callback_return = await self._async_render(request)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/synapse/http/server.py", line 576, in _async_render
    callback_return = await raw_callback_return
                      ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/synapse/rest/client/profile.py", line 208, in on_PUT
    await self.profile_handler.set_displayname(
        user, requester, new_value, by_admin=is_admin, propagate=propagate
    )
  File "/usr/local/lib/python3.13/site-packages/synapse/handlers/profile.py", line 255, in set_displayname
    await self.store.set_profile_displayname(target_user, displayname_to_set)
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/databases/main/profile.py", line 402, in set_profile_displayname
    await self.db_pool.runInteraction(
        "set_profile_displayname", set_profile_displayname
    )
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/database.py", line 1015, in runInteraction
    return await delay_cancellation(_runInteraction())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/twisted/internet/defer.py", line 1187, in __iter__
    yield self
  File "/usr/local/lib/python3.13/site-packages/twisted/internet/defer.py", line 1853, in _inlineCallbacks
    result = context.run(
        cast(Failure, result).throwExceptionIntoGenerator, gen
    )
  File "/usr/local/lib/python3.13/site-packages/twisted/python/failure.py", line 467, in throwExceptionIntoGenerator
    return g.throw(self.value.with_traceback(self.tb))
           ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/database.py", line 981, in _runInteraction
    result: R = await self.runWithConnection(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<11 lines>...
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/database.py", line 1117, in runWithConnection
    return await make_deferred_yieldable(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        self._db_pool.runWithConnection(inner_func, *args, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/twisted/internet/defer.py", line 1187, in __iter__
    yield self
  File "/usr/local/lib/python3.13/site-packages/twisted/python/threadpool.py", line 269, in inContext
    result = inContext.theWork()  # type: ignore[attr-defined]
  File "/usr/local/lib/python3.13/site-packages/twisted/python/threadpool.py", line 285, in <lambda>
    inContext.theWork = lambda: context.call(  # type: ignore[attr-defined]
                                ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ctx, func, *args, **kw
        ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/twisted/python/context.py", line 117, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/twisted/python/context.py", line 82, in callWithContext
    return func(*args, **kw)
  File "/usr/local/lib/python3.13/site-packages/twisted/enterprise/adbapi.py", line 282, in _runWithConnection
    result = func(conn, *args, **kw)
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/database.py", line 1110, in inner_func
    return func(db_conn, *args, **kwargs)
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/database.py", line 819, in new_transaction
    r = func(cursor, *args, **kwargs)
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/databases/main/profile.py", line 388, in set_profile_displayname
    self._check_profile_size(
    ~~~~~~~~~~~~~~~~~~~~~~~~^
        txn, user_id, ProfileFields.DISPLAYNAME, new_displayname
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/synapse/storage/databases/main/profile.py", line 354, in _check_profile_size
    (row[0] - 1 if row[0] else 0)
                   ~~~^^^
TypeError: 'NoneType' object is not subscriptable
2026-04-16 09:48:05,151 - synapse.access.http.8008 - 643 - INFO - PUT-389 - ::ffff:10.10.0.1 - 8008 - {@draupnir-moderation:localhost:9999} Processed request: 0.003sec/0.000sec ru=(0.002sec, 0.000sec) db=(0.000sec/0.000sec/1) 55B 500 "PUT /_matrix/client/v3/profile/%40draupnir-moder
ation%3Alocalhost%3A9999/displayname HTTP/1.0" "-" [0 dbevts]

has to be worked around by using ensureRegistered(true)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions