mirror of
				https://github.com/matrix-org/synapse.git
				synced 2025-10-31 00:01:33 +01:00 
			
		
		
		
	Merge pull request #2545 from matrix-org/dbkr/auto_join_rooms
Add config option to auto-join new users to rooms
This commit is contained in:
		
						commit
						4e242b3e20
					
				| @ -41,6 +41,8 @@ class RegistrationConfig(Config): | |||||||
|             self.allow_guest_access and config.get("invite_3pid_guest", False) |             self.allow_guest_access and config.get("invite_3pid_guest", False) | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|  |         self.auto_join_rooms = config.get("auto_join_rooms", []) | ||||||
|  | 
 | ||||||
|     def default_config(self, **kwargs): |     def default_config(self, **kwargs): | ||||||
|         registration_shared_secret = random_string_with_symbols(50) |         registration_shared_secret = random_string_with_symbols(50) | ||||||
| 
 | 
 | ||||||
| @ -70,6 +72,11 @@ class RegistrationConfig(Config): | |||||||
|             - matrix.org |             - matrix.org | ||||||
|             - vector.im |             - vector.im | ||||||
|             - riot.im |             - riot.im | ||||||
|  | 
 | ||||||
|  |         # Users who register on this homeserver will automatically be joined | ||||||
|  |         # to these rooms | ||||||
|  |         #auto_join_rooms: | ||||||
|  |         #    - "#example:example.com" | ||||||
|         """ % locals() |         """ % locals() | ||||||
| 
 | 
 | ||||||
|     def add_arguments(self, parser): |     def add_arguments(self, parser): | ||||||
|  | |||||||
| @ -17,8 +17,10 @@ | |||||||
| from twisted.internet import defer | from twisted.internet import defer | ||||||
| 
 | 
 | ||||||
| import synapse | import synapse | ||||||
|  | import synapse.types | ||||||
| from synapse.api.auth import get_access_token_from_request, has_access_token | from synapse.api.auth import get_access_token_from_request, has_access_token | ||||||
| from synapse.api.constants import LoginType | from synapse.api.constants import LoginType | ||||||
|  | from synapse.types import RoomID, RoomAlias | ||||||
| from synapse.api.errors import SynapseError, Codes, UnrecognizedRequestError | from synapse.api.errors import SynapseError, Codes, UnrecognizedRequestError | ||||||
| from synapse.http.servlet import ( | from synapse.http.servlet import ( | ||||||
|     RestServlet, parse_json_object_from_request, assert_params_in_request, parse_string |     RestServlet, parse_json_object_from_request, assert_params_in_request, parse_string | ||||||
| @ -170,6 +172,7 @@ class RegisterRestServlet(RestServlet): | |||||||
|         self.auth_handler = hs.get_auth_handler() |         self.auth_handler = hs.get_auth_handler() | ||||||
|         self.registration_handler = hs.get_handlers().registration_handler |         self.registration_handler = hs.get_handlers().registration_handler | ||||||
|         self.identity_handler = hs.get_handlers().identity_handler |         self.identity_handler = hs.get_handlers().identity_handler | ||||||
|  |         self.room_member_handler = hs.get_handlers().room_member_handler | ||||||
|         self.device_handler = hs.get_device_handler() |         self.device_handler = hs.get_device_handler() | ||||||
|         self.macaroon_gen = hs.get_macaroon_generator() |         self.macaroon_gen = hs.get_macaroon_generator() | ||||||
| 
 | 
 | ||||||
| @ -340,6 +343,14 @@ class RegisterRestServlet(RestServlet): | |||||||
|                 generate_token=False, |                 generate_token=False, | ||||||
|             ) |             ) | ||||||
| 
 | 
 | ||||||
|  |             # auto-join the user to any rooms we're supposed to dump them into | ||||||
|  |             fake_requester = synapse.types.create_requester(registered_user_id) | ||||||
|  |             for r in self.hs.config.auto_join_rooms: | ||||||
|  |                 try: | ||||||
|  |                     yield self._join_user_to_room(fake_requester, r) | ||||||
|  |                 except Exception as e: | ||||||
|  |                     logger.error("Failed to join new user to %r: %r", r, e) | ||||||
|  | 
 | ||||||
|             # remember that we've now registered that user account, and with |             # remember that we've now registered that user account, and with | ||||||
|             #  what user ID (since the user may not have specified) |             #  what user ID (since the user may not have specified) | ||||||
|             self.auth_handler.set_session_data( |             self.auth_handler.set_session_data( | ||||||
| @ -372,6 +383,29 @@ class RegisterRestServlet(RestServlet): | |||||||
|     def on_OPTIONS(self, _): |     def on_OPTIONS(self, _): | ||||||
|         return 200, {} |         return 200, {} | ||||||
| 
 | 
 | ||||||
|  |     @defer.inlineCallbacks | ||||||
|  |     def _join_user_to_room(self, requester, room_identifier): | ||||||
|  |         room_id = None | ||||||
|  |         if RoomID.is_valid(room_identifier): | ||||||
|  |             room_id = room_identifier | ||||||
|  |         elif RoomAlias.is_valid(room_identifier): | ||||||
|  |             room_alias = RoomAlias.from_string(room_identifier) | ||||||
|  |             room_id, remote_room_hosts = ( | ||||||
|  |                 yield self.room_member_handler.lookup_room_alias(room_alias) | ||||||
|  |             ) | ||||||
|  |             room_id = room_id.to_string() | ||||||
|  |         else: | ||||||
|  |             raise SynapseError(400, "%s was not legal room ID or room alias" % ( | ||||||
|  |                 room_identifier, | ||||||
|  |             )) | ||||||
|  | 
 | ||||||
|  |         yield self.room_member_handler.update_membership( | ||||||
|  |             requester=requester, | ||||||
|  |             target=requester.user, | ||||||
|  |             room_id=room_id, | ||||||
|  |             action="join", | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|     @defer.inlineCallbacks |     @defer.inlineCallbacks | ||||||
|     def _do_appservice_registration(self, username, as_token, body): |     def _do_appservice_registration(self, username, as_token, body): | ||||||
|         user_id = yield self.registration_handler.appservice_register( |         user_id = yield self.registration_handler.appservice_register( | ||||||
|  | |||||||
| @ -47,6 +47,7 @@ class RegisterRestServletTestCase(unittest.TestCase): | |||||||
|         self.hs.get_auth_handler = Mock(return_value=self.auth_handler) |         self.hs.get_auth_handler = Mock(return_value=self.auth_handler) | ||||||
|         self.hs.get_device_handler = Mock(return_value=self.device_handler) |         self.hs.get_device_handler = Mock(return_value=self.device_handler) | ||||||
|         self.hs.config.enable_registration = True |         self.hs.config.enable_registration = True | ||||||
|  |         self.hs.config.auto_join_rooms = [] | ||||||
| 
 | 
 | ||||||
|         # init the thing we're testing |         # init the thing we're testing | ||||||
|         self.servlet = RegisterRestServlet(self.hs) |         self.servlet = RegisterRestServlet(self.hs) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user