diff --git a/packages/overlays/matrix-synapse/patches/0031-Add-the-ability-to-exclude-remote-users-in-user-dire.patch b/packages/overlays/matrix-synapse/patches/0031-Add-the-ability-to-exclude-remote-users-in-user-dire.patch
deleted file mode 100644
index b751f04..0000000
--- a/packages/overlays/matrix-synapse/patches/0031-Add-the-ability-to-exclude-remote-users-in-user-dire.patch
+++ /dev/null
@@ -1,247 +0,0 @@
-From fe8bb620de8e5830328c6d23127657560f449af0 Mon Sep 17 00:00:00 2001
-From: Will Lewis <1543626+wrjlewis@users.noreply.github.com>
-Date: Fri, 2 May 2025 15:38:02 +0100
-Subject: [PATCH 31/74] Add the ability to exclude remote users in user
- directory search results (#18300)
-
-This change adds a new configuration
-`user_directory.exclude_remote_users`, which defaults to False.
-When set to True, remote users will not appear in user directory search
-results.
-
-### Pull Request Checklist
-
-<!-- Please read
-https://element-hq.github.io/synapse/latest/development/contributing_guide.html
-before submitting your pull request -->
-
-* [x] Pull request is based on the develop branch
-* [x] Pull request includes a [changelog
-file](https://element-hq.github.io/synapse/latest/development/contributing_guide.html#changelog).
-The entry should:
-- Be a short description of your change which makes sense to users.
-"Fixed a bug that prevented receiving messages from other servers."
-instead of "Moved X method from `EventStore` to `EventWorkerStore`.".
- - Use markdown where necessary, mostly for `code blocks`.
- - End with either a period (.) or an exclamation mark (!).
- - Start with a capital letter.
-- Feel free to credit yourself, by adding a sentence "Contributed by
-@github_username." or "Contributed by [Your Name]." to the end of the
-entry.
-* [x] [Code
-style](https://element-hq.github.io/synapse/latest/code_style.html) is
-correct
-(run the
-[linters](https://element-hq.github.io/synapse/latest/development/contributing_guide.html#run-the-linters))
-
----------
-
-Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com>
----
- changelog.d/18300.feature | 1 +
- .../configuration/config_documentation.md | 2 +
- synapse/config/user_directory.py | 3 +
- synapse/handlers/user_directory.py | 3 +
- .../storage/databases/main/user_directory.py | 18 ++++--
- tests/handlers/test_user_directory.py | 61 +++++++++++++++++++
- 6 files changed, 84 insertions(+), 4 deletions(-)
- create mode 100644 changelog.d/18300.feature
-
-diff --git a/changelog.d/18300.feature b/changelog.d/18300.feature
-new file mode 100644
-index 0000000000..92bea77556
---- /dev/null
-+++ b/changelog.d/18300.feature
-@@ -0,0 +1 @@
-+Add config option `user_directory.exclude_remote_users` which, when enabled, excludes remote users from user directory search results.
-\ No newline at end of file
-diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md
-index 19dc9dd356..5351bef83a 100644
---- a/docs/usage/configuration/config_documentation.md
-+++ b/docs/usage/configuration/config_documentation.md
-@@ -4095,6 +4095,7 @@ This option has the following sub-options:
- * `prefer_local_users`: Defines whether to prefer local users in search query results.
- If set to true, local users are more likely to appear above remote users when searching the
- user directory. Defaults to false.
-+* `exclude_remote_users`: If set to true, the search will only return local users. Defaults to false.
- * `show_locked_users`: Defines whether to show locked users in search query results. Defaults to false.
-
- Example configuration:
-@@ -4103,6 +4104,7 @@ user_directory:
- enabled: false
- search_all_users: true
- prefer_local_users: true
-+ exclude_remote_users: false
- show_locked_users: true
- ```
- ---
-diff --git a/synapse/config/user_directory.py b/synapse/config/user_directory.py
-index c67796906f..fe4e2dc65c 100644
---- a/synapse/config/user_directory.py
-+++ b/synapse/config/user_directory.py
-@@ -38,6 +38,9 @@ class UserDirectoryConfig(Config):
- self.user_directory_search_all_users = user_directory_config.get(
- "search_all_users", False
- )
-+ self.user_directory_exclude_remote_users = user_directory_config.get(
-+ "exclude_remote_users", False
-+ )
- self.user_directory_search_prefer_local_users = user_directory_config.get(
- "prefer_local_users", False
- )
-diff --git a/synapse/handlers/user_directory.py b/synapse/handlers/user_directory.py
-index f88d39b38f..33edef5f14 100644
---- a/synapse/handlers/user_directory.py
-+++ b/synapse/handlers/user_directory.py
-@@ -108,6 +108,9 @@ class UserDirectoryHandler(StateDeltasHandler):
- self.is_mine_id = hs.is_mine_id
- self.update_user_directory = hs.config.worker.should_update_user_directory
- self.search_all_users = hs.config.userdirectory.user_directory_search_all_users
-+ self.exclude_remote_users = (
-+ hs.config.userdirectory.user_directory_exclude_remote_users
-+ )
- self.show_locked_users = hs.config.userdirectory.show_locked_users
- self._spam_checker_module_callbacks = hs.get_module_api_callbacks().spam_checker
- self._hs = hs
-diff --git a/synapse/storage/databases/main/user_directory.py b/synapse/storage/databases/main/user_directory.py
-index d6cd0774a8..391f0dd638 100644
---- a/synapse/storage/databases/main/user_directory.py
-+++ b/synapse/storage/databases/main/user_directory.py
-@@ -1037,11 +1037,11 @@ class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
- }
- """
-
-+ join_args: Tuple[str, ...] = (user_id,)
-+
- if self.hs.config.userdirectory.user_directory_search_all_users:
-- join_args = (user_id,)
- where_clause = "user_id != ?"
- else:
-- join_args = (user_id,)
- where_clause = """
- (
- EXISTS (select 1 from users_in_public_rooms WHERE user_id = t.user_id)
-@@ -1055,6 +1055,14 @@ class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
- if not show_locked_users:
- where_clause += " AND (u.locked IS NULL OR u.locked = FALSE)"
-
-+ # Adjust the JOIN type based on the exclude_remote_users flag (the users
-+ # table only contains local users so an inner join is a good way to
-+ # to exclude remote users)
-+ if self.hs.config.userdirectory.user_directory_exclude_remote_users:
-+ join_type = "JOIN"
-+ else:
-+ join_type = "LEFT JOIN"
-+
- # We allow manipulating the ranking algorithm by injecting statements
- # based on config options.
- additional_ordering_statements = []
-@@ -1086,7 +1094,7 @@ class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
- SELECT d.user_id AS user_id, display_name, avatar_url
- FROM matching_users as t
- INNER JOIN user_directory AS d USING (user_id)
-- LEFT JOIN users AS u ON t.user_id = u.name
-+ %(join_type)s users AS u ON t.user_id = u.name
- WHERE
- %(where_clause)s
- ORDER BY
-@@ -1115,6 +1123,7 @@ class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
- """ % {
- "where_clause": where_clause,
- "order_case_statements": " ".join(additional_ordering_statements),
-+ "join_type": join_type,
- }
- args = (
- (full_query,)
-@@ -1142,7 +1151,7 @@ class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
- SELECT d.user_id AS user_id, display_name, avatar_url
- FROM user_directory_search as t
- INNER JOIN user_directory AS d USING (user_id)
-- LEFT JOIN users AS u ON t.user_id = u.name
-+ %(join_type)s users AS u ON t.user_id = u.name
- WHERE
- %(where_clause)s
- AND value MATCH ?
-@@ -1155,6 +1164,7 @@ class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
- """ % {
- "where_clause": where_clause,
- "order_statements": " ".join(additional_ordering_statements),
-+ "join_type": join_type,
- }
- args = join_args + (search_query,) + ordering_arguments + (limit + 1,)
- else:
-diff --git a/tests/handlers/test_user_directory.py b/tests/handlers/test_user_directory.py
-index a75095a79f..a9e9d7d7ea 100644
---- a/tests/handlers/test_user_directory.py
-+++ b/tests/handlers/test_user_directory.py
-@@ -992,6 +992,67 @@ class UserDirectoryTestCase(unittest.HomeserverTestCase):
- [self.assertIn(user, local_users) for user in received_user_id_ordering[:3]]
- [self.assertIn(user, remote_users) for user in received_user_id_ordering[3:]]
-
-+ @override_config(
-+ {
-+ "user_directory": {
-+ "enabled": True,
-+ "search_all_users": True,
-+ "exclude_remote_users": True,
-+ }
-+ }
-+ )
-+ def test_exclude_remote_users(self) -> None:
-+ """Tests that only local users are returned when
-+ user_directory.exclude_remote_users is True.
-+ """
-+
-+ # Create a room and few users to test the directory with
-+ searching_user = self.register_user("searcher", "password")
-+ searching_user_tok = self.login("searcher", "password")
-+
-+ room_id = self.helper.create_room_as(
-+ searching_user,
-+ room_version=RoomVersions.V1.identifier,
-+ tok=searching_user_tok,
-+ )
-+
-+ # Create a few local users and join them to the room
-+ local_user_1 = self.register_user("user_xxxxx", "password")
-+ local_user_2 = self.register_user("user_bbbbb", "password")
-+ local_user_3 = self.register_user("user_zzzzz", "password")
-+
-+ self._add_user_to_room(room_id, RoomVersions.V1, local_user_1)
-+ self._add_user_to_room(room_id, RoomVersions.V1, local_user_2)
-+ self._add_user_to_room(room_id, RoomVersions.V1, local_user_3)
-+
-+ # Create a few "remote" users and join them to the room
-+ remote_user_1 = "@user_aaaaa:remote_server"
-+ remote_user_2 = "@user_yyyyy:remote_server"
-+ remote_user_3 = "@user_ccccc:remote_server"
-+ self._add_user_to_room(room_id, RoomVersions.V1, remote_user_1)
-+ self._add_user_to_room(room_id, RoomVersions.V1, remote_user_2)
-+ self._add_user_to_room(room_id, RoomVersions.V1, remote_user_3)
-+
-+ local_users = [local_user_1, local_user_2, local_user_3]
-+ remote_users = [remote_user_1, remote_user_2, remote_user_3]
-+
-+ # The local searching user searches for the term "user", which other users have
-+ # in their user id
-+ results = self.get_success(
-+ self.handler.search_users(searching_user, "user", 20)
-+ )["results"]
-+ received_user_ids = [result["user_id"] for result in results]
-+
-+ for user in local_users:
-+ self.assertIn(
-+ user, received_user_ids, f"Local user {user} not found in results"
-+ )
-+
-+ for user in remote_users:
-+ self.assertNotIn(
-+ user, received_user_ids, f"Remote user {user} should not be in results"
-+ )
-+
- def _add_user_to_room(
- self,
- room_id: str,
---
-2.49.0
-
|