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:
parent
8ca53fb53e
commit
7039ece8fb
|
@ -0,0 +1 @@
|
||||||
|
Fix auto join failures for servers that require user consent
|
|
@ -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):
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue