Neilj/fix autojoin (#4223)

* Fix auto join failures for servers that require user consent

* Fix auto join failures for servers that require user consent
This commit is contained in:
Neil Johnson 2018-11-28 11:24:57 +00:00 committed by Amber Brown
parent 8ca53fb53e
commit 7039ece8fb
5 changed files with 36 additions and 3 deletions

1
changelog.d/4223.bugfix Normal file
View File

@ -0,0 +1 @@
Fix auto join failures for servers that require user consent

View File

@ -217,7 +217,19 @@ class RegistrationHandler(BaseHandler):
user_id = None user_id = None
token = None token = None
attempts += 1 attempts += 1
if not self.hs.config.user_consent_at_registration:
yield self._auto_join_rooms(user_id)
defer.returnValue((user_id, token))
@defer.inlineCallbacks
def _auto_join_rooms(self, user_id):
"""Automatically joins users to auto join rooms - creating the room in the first place
if the user is the first to be created.
Args:
user_id(str): The user to join
"""
# auto-join the user to any rooms we're supposed to dump them into # auto-join the user to any rooms we're supposed to dump them into
fake_requester = create_requester(user_id) fake_requester = create_requester(user_id)
@ -226,7 +238,6 @@ class RegistrationHandler(BaseHandler):
if self.hs.config.autocreate_auto_join_rooms: if self.hs.config.autocreate_auto_join_rooms:
count = yield self.store.count_all_users() count = yield self.store.count_all_users()
should_auto_create_rooms = count == 1 should_auto_create_rooms = count == 1
for r in self.hs.config.auto_join_rooms: for r in self.hs.config.auto_join_rooms:
try: try:
if should_auto_create_rooms: if should_auto_create_rooms:
@ -256,7 +267,15 @@ class RegistrationHandler(BaseHandler):
except Exception as e: except Exception as e:
logger.error("Failed to join new user to %r: %r", r, e) logger.error("Failed to join new user to %r: %r", r, e)
defer.returnValue((user_id, token)) @defer.inlineCallbacks
def post_consent_actions(self, user_id):
"""A series of registration actions that can only be carried out once consent
has been granted
Args:
user_id (str): The user to join
"""
yield self._auto_join_rooms(user_id)
@defer.inlineCallbacks @defer.inlineCallbacks
def appservice_register(self, user_localpart, as_token): def appservice_register(self, user_localpart, as_token):

View File

@ -457,6 +457,7 @@ class RegisterRestServlet(RestServlet):
yield self.store.user_set_consent_version( yield self.store.user_set_consent_version(
registered_user_id, self.hs.config.user_consent_version, registered_user_id, self.hs.config.user_consent_version,
) )
yield self.registration_handler.post_consent_actions(registered_user_id)
defer.returnValue((200, return_dict)) defer.returnValue((200, return_dict))

View File

@ -89,6 +89,7 @@ class ConsentResource(Resource):
self.hs = hs self.hs = hs
self.store = hs.get_datastore() self.store = hs.get_datastore()
self.registration_handler = hs.get_handlers().registration_handler
# this is required by the request_handler wrapper # this is required by the request_handler wrapper
self.clock = hs.get_clock() self.clock = hs.get_clock()
@ -199,6 +200,7 @@ class ConsentResource(Resource):
if e.code != 404: if e.code != 404:
raise raise
raise NotFoundError("Unknown user") raise NotFoundError("Unknown user")
yield self.registration_handler.post_consent_actions(qualified_user_id)
try: try:
self._render_template(request, "success.html") self._render_template(request, "success.html")

View File

@ -150,7 +150,6 @@ class RegistrationTestCase(unittest.TestCase):
self.hs.config.auto_join_rooms = [room_alias_str] self.hs.config.auto_join_rooms = [room_alias_str]
res = yield self.handler.register(localpart='jeff') res = yield self.handler.register(localpart='jeff')
rooms = yield self.store.get_rooms_for_user(res[0]) rooms = yield self.store.get_rooms_for_user(res[0])
directory_handler = self.hs.get_handlers().directory_handler directory_handler = self.hs.get_handlers().directory_handler
room_alias = RoomAlias.from_string(room_alias_str) room_alias = RoomAlias.from_string(room_alias_str)
room_id = yield directory_handler.get_association(room_alias) room_id = yield directory_handler.get_association(room_alias)
@ -184,3 +183,14 @@ class RegistrationTestCase(unittest.TestCase):
res = yield self.handler.register(localpart='jeff') res = yield self.handler.register(localpart='jeff')
rooms = yield self.store.get_rooms_for_user(res[0]) rooms = yield self.store.get_rooms_for_user(res[0])
self.assertEqual(len(rooms), 0) self.assertEqual(len(rooms), 0)
@defer.inlineCallbacks
def test_auto_create_auto_join_where_no_consent(self):
self.hs.config.user_consent_at_registration = True
self.hs.config.block_events_without_consent_error = "Error"
room_alias_str = "#room:test"
self.hs.config.auto_join_rooms = [room_alias_str]
res = yield self.handler.register(localpart='jeff')
yield self.handler.post_consent_actions(res[0])
rooms = yield self.store.get_rooms_for_user(res[0])
self.assertEqual(len(rooms), 0)