Implement whitelist
This commit is contained in:
@@ -43,6 +43,10 @@ class MatrixHandler:
|
|||||||
|
|
||||||
def handle_puppet_invite(self, room, puppet, inviter):
|
def handle_puppet_invite(self, room, puppet, inviter):
|
||||||
self.log.debug(f"{inviter} invited puppet for {puppet.tgid} to {room}")
|
self.log.debug(f"{inviter} invited puppet for {puppet.tgid} to {room}")
|
||||||
|
if not inviter.logged_in:
|
||||||
|
puppet.intent.error_and_leave(
|
||||||
|
room, text="Please log in before inviting Telegram puppets.")
|
||||||
|
return
|
||||||
portal = Portal.get_by_mxid(room)
|
portal = Portal.get_by_mxid(room)
|
||||||
if portal:
|
if portal:
|
||||||
if portal.peer_type == "user":
|
if portal.peer_type == "user":
|
||||||
@@ -89,10 +93,10 @@ class MatrixHandler:
|
|||||||
|
|
||||||
def handle_invite(self, room, user, inviter):
|
def handle_invite(self, room, user, inviter):
|
||||||
inviter = User.get_by_mxid(inviter)
|
inviter = User.get_by_mxid(inviter)
|
||||||
if user == self.az.bot_mxid:
|
if not inviter.whitelisted:
|
||||||
self.az.intent.join_room(room)
|
|
||||||
return
|
return
|
||||||
elif not inviter.tgid:
|
elif user == self.az.bot_mxid:
|
||||||
|
self.az.intent.join_room(room)
|
||||||
return
|
return
|
||||||
puppet = self.get_puppet(user)
|
puppet = self.get_puppet(user)
|
||||||
if puppet:
|
if puppet:
|
||||||
@@ -101,9 +105,28 @@ class MatrixHandler:
|
|||||||
# These can probably be ignored
|
# These can probably be ignored
|
||||||
self.log.debug(f"{inviter} invited {user} to {room}")
|
self.log.debug(f"{inviter} invited {user} to {room}")
|
||||||
|
|
||||||
|
def handle_join(self, room, user):
|
||||||
|
user = User.get_by_mxid(user)
|
||||||
|
|
||||||
|
portal = Portal.get_by_mxid(room)
|
||||||
|
if not portal:
|
||||||
|
return
|
||||||
|
|
||||||
|
if not user.whitelisted:
|
||||||
|
portal.main_intent.kick(room, user.mxid,
|
||||||
|
"You are not whitelisted on this Telegram bridge.")
|
||||||
|
return
|
||||||
|
elif not user.logged_in:
|
||||||
|
portal.main_intent.kick(room, user.mxid,
|
||||||
|
"You are not logged into this Telegram bridge.")
|
||||||
|
return
|
||||||
|
|
||||||
|
self.log.debug(f"{user} joined {room}")
|
||||||
|
# TODO join Telegram chat if applicable
|
||||||
|
|
||||||
def handle_part(self, room, user):
|
def handle_part(self, room, user):
|
||||||
self.log.debug(f"{user} left {room}")
|
self.log.debug(f"{user} left {room}")
|
||||||
user = User.get_by_mxid(user, create=False)
|
# user = User.get_by_mxid(user, create=False)
|
||||||
|
|
||||||
def is_command(self, message):
|
def is_command(self, message):
|
||||||
text = message.get("body", "")
|
text = message.get("body", "")
|
||||||
@@ -120,7 +143,7 @@ class MatrixHandler:
|
|||||||
sender = User.get_by_mxid(sender)
|
sender = User.get_by_mxid(sender)
|
||||||
|
|
||||||
portal = Portal.get_by_mxid(room)
|
portal = Portal.get_by_mxid(room)
|
||||||
if sender.tgid and portal and not is_command:
|
if sender.has_full_access and portal and not is_command:
|
||||||
portal.handle_matrix_message(sender, message, event_id)
|
portal.handle_matrix_message(sender, message, event_id)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -142,13 +165,13 @@ class MatrixHandler:
|
|||||||
def handle_redaction(self, room, sender, event_id):
|
def handle_redaction(self, room, sender, event_id):
|
||||||
portal = Portal.get_by_mxid(room)
|
portal = Portal.get_by_mxid(room)
|
||||||
sender = User.get_by_mxid(sender)
|
sender = User.get_by_mxid(sender)
|
||||||
if sender.tgid and portal:
|
if sender.has_full_access and portal:
|
||||||
portal.handle_matrix_deletion(sender, event_id)
|
portal.handle_matrix_deletion(sender, event_id)
|
||||||
|
|
||||||
def handle_power_levels(self, room, sender, new, old):
|
def handle_power_levels(self, room, sender, new, old):
|
||||||
portal = Portal.get_by_mxid(room)
|
portal = Portal.get_by_mxid(room)
|
||||||
sender = User.get_by_mxid(sender)
|
sender = User.get_by_mxid(sender)
|
||||||
if sender.tgid and portal:
|
if sender.has_full_access and portal:
|
||||||
sender = User.get_by_mxid(sender)
|
sender = User.get_by_mxid(sender)
|
||||||
portal.handle_matrix_power_levels(sender, new["users"], old["users"])
|
portal.handle_matrix_power_levels(sender, new["users"], old["users"])
|
||||||
|
|
||||||
@@ -168,8 +191,7 @@ class MatrixHandler:
|
|||||||
elif membership == "leave":
|
elif membership == "leave":
|
||||||
self.handle_part(evt["room_id"], evt["state_key"])
|
self.handle_part(evt["room_id"], evt["state_key"])
|
||||||
elif membership == "join":
|
elif membership == "join":
|
||||||
# TODO handle when needed
|
self.handle_join(evt["room_id"], evt["state_key"])
|
||||||
pass
|
|
||||||
elif type == "m.room.message":
|
elif type == "m.room.message":
|
||||||
self.handle_message(evt["room_id"], evt["sender"], content, evt["event_id"])
|
self.handle_message(evt["room_id"], evt["sender"], content, evt["event_id"])
|
||||||
elif type == "m.room.redaction":
|
elif type == "m.room.redaction":
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ class User:
|
|||||||
self.command_status = None
|
self.command_status = None
|
||||||
self.connected = False
|
self.connected = False
|
||||||
self.client = None
|
self.client = None
|
||||||
|
whitelist = config.get("bridge", {}).get("whitelist", [self.mxid])
|
||||||
|
self.whitelisted = self.mxid in whitelist
|
||||||
|
if not self.whitelisted:
|
||||||
|
homeserver = self.mxid[self.mxid.index(":")+1:]
|
||||||
|
self.whitelisted = homeserver in whitelist
|
||||||
|
|
||||||
self.by_mxid[mxid] = self
|
self.by_mxid[mxid] = self
|
||||||
if tgid:
|
if tgid:
|
||||||
@@ -47,6 +52,10 @@ class User:
|
|||||||
def logged_in(self):
|
def logged_in(self):
|
||||||
return self.client.is_user_authorized()
|
return self.client.is_user_authorized()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def has_full_access(self):
|
||||||
|
return self.logged_in and self.whitelisted
|
||||||
|
|
||||||
# region Database conversion
|
# region Database conversion
|
||||||
|
|
||||||
def to_db(self):
|
def to_db(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user