diff --git a/README.md b/README.md index a43b45f..e0714c9 100644 --- a/README.md +++ b/README.md @@ -208,7 +208,8 @@ Use `!inviter` to list available commands. * `!idp` - list rooms and members defined in the linked IdP * `!joined` - list joined rooms * `!managed` - list managed rooms -* `!sync [dry]` - trigger manual sync +* `!sync` - trigger manual sync +* `!dryrun` - trigger test sync (Without actually inviting/kickin members.) * `!unmanage ` - unmanage room * `!invite-member ` - manually add an external member as unmanaged standard user * `!kick-member ` - manually kick an unmanaged, external member diff --git a/inviter/bot.py b/inviter/bot.py index 96a035a..ccbf169 100644 --- a/inviter/bot.py +++ b/inviter/bot.py @@ -85,7 +85,8 @@ async def help(self, evt: MessageEvent) -> None: "* `idp` - list rooms and members defined in IdP\n" "* `joined` - list joined rooms\n" "* `managed` - list managed rooms\n" - "* `sync [dry]` - trigger manual sync\n" + "* `dryrun` - trigger manual dry sync\n" + "* `sync` - trigger manual sync\n" "* `unmanage [new admin]` - unmanage room\n" "* `invite-member [user]` - manually add an external member as unmanaged standard user\n" "* `kick-member [user]` - manually kick an unmanaged, external member\n" @@ -157,25 +158,37 @@ async def managed(self, evt: MessageEvent) -> None: await evt.respond(helper.generate_message_content(message)) @command.new(name='sync') - @command.argument("dry", "dry run", pass_raw=True, required=False, matches=r'dry') - async def sync(self, evt: MessageEvent, dry: str) -> None: + async def sync(self, evt: MessageEvent) -> None: + """Command to perform a manual sync. + + :param evt: Relating message event + :return: + """ + await self._perform_sync(evt, False) + + @command.new(name='dryrun') + async def dryrun(self, evt: MessageEvent) -> None: + """Command to perform a manual dry sync without applying changes. + + :param evt: Relating message event + :return: + """ + await self._perform_sync(evt, True) + + async def _perform_sync(self, evt: MessageEvent, dry_run:bool) -> None: """Command to perform a manual sync. Optionally do a dry sync without applying changes. :param evt: Relating message event - :param dry: The dry argument + :param dry_run: Whether a dry_run should be performed :return: """ if not await self.is_admin_room(evt): return - inviting = kicking = True - if dry and 'dry' in dry: - inviting = kicking = False - self.log.info("Performing a dry sync...") - await evt.respond(helper.generate_message_content("Performing a dry sync...")) - else: - self.log.info("Performing a full sync...") - await evt.respond(helper.generate_message_content("Performing a full sync...")) + inviting = kicking = not dry_run + action = "dry" if dry_run else "full" + self.log.info(f"Performing a {action} sync...") + await evt.respond(helper.generate_message_content(f"Performing a {action} sync...")) try: room_struct = await helper.get_room_struct_from_idp(self.config) diff --git a/inviter/ldap_connector.py b/inviter/ldap_connector.py index d8f71fb..c5940a6 100644 --- a/inviter/ldap_connector.py +++ b/inviter/ldap_connector.py @@ -68,7 +68,7 @@ def get_rooms(config: Config) -> Optional[List[Room]]: bind_dn=ldap_config.get("bind_dn"), bind_pass=ldap_config.get("bind_password")) - if not connection.search(base_dn_groups, "(&(objectClass=group)(cn=xxx*))", attributes=["cn"]): + if not connection.search(base_dn_groups, "(&(objectClass=groupOfNames)(cn=xxx*))", attributes=["cn"]): logging.getLogger("maubot").warning(f"LDAP search not successful: {connection.result}") return None @@ -104,13 +104,14 @@ def get_rooms(config: Config) -> Optional[List[Room]]: config.get_renamed_mxid(MXID(group_member[0], homeserver)), power_level) ) + # logging.getLogger("maubot").warning(f"Room members: {room_members}") rooms.append(Room(RoomAlias.from_str(group), room_members)) return rooms def get_group_members(connection: Connection, group_dn: str, user_dn: str, username_attribute: str, search_filter: str = '(objectClass=*)')\ - -> List[Tuple[str, bool]]: + -> List[Tuple[str, str]]: """Return members of a given user-group. :param connection: Connection with bind @@ -124,17 +125,19 @@ def get_group_members(connection: Connection, group_dn: str, user_dn: str, usern connection.search(user_dn, search, attributes=[username_attribute, "nsAccountLock"]) entries = connection.entries for element in entries: - members.append((str(getattr(element, username_attribute)), element.nsAccountLock.value)) + # logging.getLogger("maubot").warning(f"Element {element}") + # logging.getLogger("maubot").warning(f"getattr {getattr(element, 'nsAccountLock', 'FALSE')}") + members.append((str(getattr(element, username_attribute)), getattr(element, "nsAccountLock", "FALSE"))) return members -def is_account_enabled(group_member: Tuple[str, bool]) -> Optional[bool]: +def is_account_enabled(group_member: Tuple[str, str]) -> Optional[bool]: """Dumb wrapper function returning if a user is enabled or not. :param group_member: A user tuple with user-id and nsAccountLock boolean :return: Boolean whether account is enabled """ - return not group_member[1] + return group_member[1] != "TRUE" class LDAPConnectorException(Exception): diff --git a/maubot.yaml b/maubot.yaml index 58bdd14..7de413d 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.2.0 id: de.in4md-service.inviterbot -version: 0.1.6 +version: 0.2.0 license: GPLv3 modules: - inviter