Move all permissions to single object in config

This commit is contained in:
Tulir Asokan
2018-02-23 12:07:42 +02:00
parent fb37af12b4
commit 2d2fe86757
6 changed files with 88 additions and 21 deletions
+1
View File
@@ -56,6 +56,7 @@ args = parser.parse_args()
config = Config(args.config, args.registration)
config.load()
config.check_updates()
if args.generate_registration:
config.generate_registration()
+62
View File
@@ -19,6 +19,7 @@ import random
import string
yaml = YAML()
yaml.indent(4)
class DictWithRecursion:
@@ -59,6 +60,31 @@ class DictWithRecursion:
def __setitem__(self, key, value):
self.set(key, value)
def _recursive_del(self, data, key):
if '.' in key:
key, next_key = key.split('.', 1)
if key not in data:
return
next_data = data[key]
self._recursive_del(next_data, next_key)
return
try:
del data[key]
except KeyError:
pass
def delete(self, key, allow_recursion=True):
if allow_recursion and '.' in key:
self._recursive_del(self._data, key)
return
try:
del self._data[key]
except KeyError:
pass
def __delitem__(self, key):
self.delete(key)
class Config(DictWithRecursion):
def __init__(self, path, registration_path):
@@ -82,6 +108,42 @@ class Config(DictWithRecursion):
def _new_token():
return "".join(random.choice(string.ascii_lowercase + string.digits) for _ in range(64))
def update_0_1(self):
permissions = self["bridge.permissions"] or {}
for entry in self["bridge.whitelist"] or []:
permissions[entry] = "full"
for entry in self["bridge.admins"] or []:
permissions[entry] = "admin"
self["bridge.permissions"] = permissions
del self["bridge.whitelist"]
del self["bridge.admins"]
self["version"] = 1
def check_updates(self):
if self.get("version", 0) == 0:
self.update_0_1()
else:
return
self.save()
def _get_permissions(self, key):
level = self["bridge.permissions"].get(key, "")
admin = level == "admin"
whitelisted = level == "full" or admin
relaybot = level == "relaybot" or whitelisted
return relaybot, whitelisted, admin
def get_permissions(self, mxid):
permissions = self["bridge.permissions"] or {}
if mxid in permissions:
return self._get_permissions(mxid)
homeserver = mxid[mxid.index(":") + 1:]
if homeserver in permissions:
return self._get_permissions(homeserver)
return self._get_permissions("*")
def generate_registration(self):
homeserver = self["homeserver.domain"]
+3 -3
View File
@@ -119,7 +119,7 @@ class MatrixHandler:
if not portal:
return
if not user.whitelisted:
if not user.relaybot_whitelisted:
await portal.main_intent.kick(room, user.mxid,
"You are not whitelisted on this Telegram bridge.")
return
@@ -169,7 +169,7 @@ class MatrixHandler:
is_command, text = self.is_command(message)
sender = await User.get_by_mxid(sender).ensure_started()
if not sender.whitelisted:
if not sender.relaybot_whitelisted:
return
portal = Portal.get_by_mxid(room)
@@ -177,7 +177,7 @@ class MatrixHandler:
await portal.handle_matrix_message(sender, message, event_id)
return
if message["msgtype"] != "m.text":
if not sender.whitelisted or message["msgtype"] != "m.text":
return
try:
+1 -1
View File
@@ -462,7 +462,7 @@ class Portal:
if p.Puppet.get_id_from_mxid(member) or member == self.main_intent.mxid:
continue
user = await u.User.get_by_mxid(member).ensure_started()
if (has_bot and user.whitelisted) or user.has_full_access:
if (has_bot and user.relaybot_whitelisted) or user.has_full_access:
authenticated.append(user)
return authenticated
+3 -7
View File
@@ -50,13 +50,9 @@ class User(AbstractUser):
self.command_status = None
self.is_admin = self.mxid in config.get("bridge.admins", [])
whitelist = config.get("bridge.whitelist", None) or [self.mxid]
self.whitelisted = not whitelist or self.mxid in whitelist
if not self.whitelisted:
homeserver = self.mxid[self.mxid.index(":") + 1:]
self.whitelisted = homeserver in whitelist
(self.relaybot_whitelisted,
self.whitelisted,
self.is_admin) = config.get_permissions(self.mxid)
self.by_mxid[mxid] = self
if tgid: