Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <room-alias> <new admin>` - unmanage room
* `!invite-member <room-alias> <user>` - manually add an external member as unmanaged standard user
* `!kick-member <room-alias> <user>` - manually kick an unmanaged, external member
Expand Down
37 changes: 25 additions & 12 deletions inviter/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <room-alias> [new admin]` - unmanage room\n"
"* `invite-member <room-alias> [user]` - manually add an external member as unmanaged standard user\n"
"* `kick-member <room-alias> [user]` - manually kick an unmanaged, external member\n"
Expand Down Expand Up @@ -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)
Expand Down
13 changes: 8 additions & 5 deletions inviter/ldap_connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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):
Expand Down
2 changes: 1 addition & 1 deletion maubot.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down