Skip to content
Snippets Groups Projects
Unverified Commit dcfd8649 authored by David Robertson's avatar David Robertson Committed by GitHub
Browse files

Fix reactivated users not being added to the user directory (#10782)

parent e5845344
No related branches found
No related tags found
No related merge requests found
Fix a long-standing bug which caused deactivated users that were later reactivated to be missing from the user directory.
\ No newline at end of file
...@@ -255,13 +255,16 @@ class DeactivateAccountHandler(BaseHandler): ...@@ -255,13 +255,16 @@ class DeactivateAccountHandler(BaseHandler):
Args: Args:
user_id: ID of user to be re-activated user_id: ID of user to be re-activated
""" """
# Add the user to the directory, if necessary.
user = UserID.from_string(user_id) user = UserID.from_string(user_id)
profile = await self.store.get_profileinfo(user.localpart)
await self.user_directory_handler.handle_local_profile_change(user_id, profile)
# Ensure the user is not marked as erased. # Ensure the user is not marked as erased.
await self.store.mark_user_not_erased(user_id) await self.store.mark_user_not_erased(user_id)
# Mark the user as active. # Mark the user as active.
await self.store.set_user_deactivated_status(user_id, False) await self.store.set_user_deactivated_status(user_id, False)
# Add the user to the directory, if necessary. Note that
# this must be done after the user is re-activated, because
# deactivated users are excluded from the user directory.
profile = await self.store.get_profileinfo(user.localpart)
await self.user_directory_handler.handle_local_profile_change(user_id, profile)
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from unittest.mock import Mock from unittest.mock import Mock
from urllib.parse import quote
from twisted.internet import defer from twisted.internet import defer
...@@ -20,6 +21,7 @@ from synapse.api.constants import UserTypes ...@@ -20,6 +21,7 @@ from synapse.api.constants import UserTypes
from synapse.api.room_versions import RoomVersion, RoomVersions from synapse.api.room_versions import RoomVersion, RoomVersions
from synapse.rest.client import login, room, user_directory from synapse.rest.client import login, room, user_directory
from synapse.storage.roommember import ProfileInfo from synapse.storage.roommember import ProfileInfo
from synapse.types import create_requester
from tests import unittest from tests import unittest
from tests.unittest import override_config from tests.unittest import override_config
...@@ -32,7 +34,7 @@ class UserDirectoryTestCase(unittest.HomeserverTestCase): ...@@ -32,7 +34,7 @@ class UserDirectoryTestCase(unittest.HomeserverTestCase):
servlets = [ servlets = [
login.register_servlets, login.register_servlets,
synapse.rest.admin.register_servlets_for_client_rest_resource, synapse.rest.admin.register_servlets,
room.register_servlets, room.register_servlets,
] ]
...@@ -130,6 +132,44 @@ class UserDirectoryTestCase(unittest.HomeserverTestCase): ...@@ -130,6 +132,44 @@ class UserDirectoryTestCase(unittest.HomeserverTestCase):
self.get_success(self.handler.handle_local_user_deactivated(r_user_id)) self.get_success(self.handler.handle_local_user_deactivated(r_user_id))
self.store.remove_from_user_dir.called_once_with(r_user_id) self.store.remove_from_user_dir.called_once_with(r_user_id)
def test_reactivation_makes_regular_user_searchable(self):
user = self.register_user("regular", "pass")
user_token = self.login(user, "pass")
admin_user = self.register_user("admin", "pass", admin=True)
admin_token = self.login(admin_user, "pass")
# Ensure the regular user is publicly visible and searchable.
self.helper.create_room_as(user, is_public=True, tok=user_token)
s = self.get_success(self.handler.search_users(admin_user, user, 10))
self.assertEqual(len(s["results"]), 1)
self.assertEqual(s["results"][0]["user_id"], user)
# Deactivate the user and check they're not searchable.
deactivate_handler = self.hs.get_deactivate_account_handler()
self.get_success(
deactivate_handler.deactivate_account(
user, erase_data=False, requester=create_requester(admin_user)
)
)
s = self.get_success(self.handler.search_users(admin_user, user, 10))
self.assertEqual(s["results"], [])
# Reactivate the user
channel = self.make_request(
"PUT",
f"/_synapse/admin/v2/users/{quote(user)}",
access_token=admin_token,
content={"deactivated": False, "password": "pass"},
)
self.assertEqual(channel.code, 200)
user_token = self.login(user, "pass")
self.helper.create_room_as(user, is_public=True, tok=user_token)
# Check they're searchable.
s = self.get_success(self.handler.search_users(admin_user, user, 10))
self.assertEqual(len(s["results"]), 1)
self.assertEqual(s["results"][0]["user_id"], user)
def test_private_room(self): def test_private_room(self):
""" """
A user can be searched for only by people that are either in a public A user can be searched for only by people that are either in a public
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment