diff --git a/synapse-auth-module/README.md b/synapse-auth-module/README.md index 4f97a09..1459ed6 100644 --- a/synapse-auth-module/README.md +++ b/synapse-auth-module/README.md @@ -16,6 +16,8 @@ modules: ppfunurl: "http://local.pixelplanet.url:port" # if true, only mail-verified users can log in verified: true + # rooms that will be automatically joined on login + autojoin_rooms: ['#pp_en:pixelplanet.fun', '#pp_int:pixelplanet.fun'] ``` ## References diff --git a/synapse-auth-module/ppfun_auth.py b/synapse-auth-module/ppfun_auth.py index 930ce99..e73a1d0 100644 --- a/synapse-auth-module/ppfun_auth.py +++ b/synapse-auth-module/ppfun_auth.py @@ -4,11 +4,12 @@ # All the self.api._underline using methods could break on updates # -from typing import Awaitable, Callable, Optional, Tuple +from typing import Awaitable, Callable, Optional, Tuple, List import logging import synapse from synapse import module_api +from synapse.types import RoomAlias logger = logging.getLogger(__name__) @@ -26,11 +27,9 @@ class PPfunAuthProvider: self.check_verified = config['verified'] else: self.check_verified = False - - self.credentials = { - "bob": "building", - "@scoop:matrix.org": "digging", - } + if 'autojoin_rooms' in config: + self.parsed_rooms = False + self.autojoin_rooms = config["autojoin_rooms"] api.register_password_auth_provider_callbacks( check_3pid_auth = self.check_3pid_pass, @@ -39,6 +38,21 @@ class PPfunAuthProvider: }, ) + # resolve room_aliases to room_ids + async def translate_room_aliases_to_ids( + self, + room_aliases: List[str], + ) -> List[str]: + room_ids = [] + logger.info('Translating room_aliases to ids') + for alias in room_aliases: + aliasObject = RoomAlias.from_string(alias) + room = await self.api._store.get_association_from_room_alias(aliasObject) + if room is not None: + logger.info('Map alias %s to room %s', alias, room.room_id) + room_ids.append(room.room_id) + return room_ids; + async def check_credentials( self, query, @@ -87,11 +101,21 @@ class PPfunAuthProvider: await registration_handler._register_email_threepid(user_id, threepid_dict, None) return True + async def join_auto_rooms( + self, + user_id: str, + ) -> None: + if not self.parsed_rooms: + self.autojoin_rooms = await self.translate_room_aliases_to_ids(self.autojoin_rooms) + self.parsed_rooms = True + for room_id in self.autojoin_rooms: + await self.api.update_room_membership(user_id, user_id, room_id, 'join') + async def login( self, - ppfun_id, - ppfun_name, - ppfun_email, + ppfun_id: str, + ppfun_name: str, + ppfun_email: str, ) -> Optional[ Tuple[ str, @@ -114,6 +138,7 @@ class PPfunAuthProvider: return None else: await self.set_email(user_id, ppfun_email) + await self.join_auto_rooms(user_id) logger.info('User %s logged in via ppfun %s', user_id, ppfun_name) return user_id, None @@ -159,7 +184,7 @@ class PPfunAuthProvider: } if username.startswith('@pp_'): query['id'] = username[4: username.index(':')] - elif username.startswith('pp_') and username.endswith(f':{self.api._server_name}'): + elif username.startswith('pp_') and username.endswith(f':{self.api.server_name}'): query['id'] = username[3: username.index(':')] else: query['name'] = username