From 91e6a73f339cabdbaa65d5560ec8442bcdbc8b0a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 30 Nov 2019 15:21:47 +0200 Subject: [PATCH] Fix incorrectly case sensitive username finding in db. Fixes #384 --- mautrix_telegram/db/portal.py | 4 ++-- mautrix_telegram/db/puppet.py | 4 ++-- mautrix_telegram/db/user.py | 4 ++-- mautrix_telegram/portal/base.py | 4 +++- mautrix_telegram/puppet.py | 4 +++- mautrix_telegram/user.py | 4 +++- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/mautrix_telegram/db/portal.py b/mautrix_telegram/db/portal.py index dcc418d8..bae8c76a 100644 --- a/mautrix_telegram/db/portal.py +++ b/mautrix_telegram/db/portal.py @@ -15,7 +15,7 @@ # along with this program. If not, see . from typing import Optional -from sqlalchemy import Column, Integer, String, Boolean, Text +from sqlalchemy import Column, Integer, String, Boolean, Text, func from mautrix.types import RoomID from mautrix.util.db import Base @@ -53,4 +53,4 @@ class Portal(Base): @classmethod def get_by_username(cls, username: str) -> Optional['Portal']: - return cls._select_one_or_none(cls.c.username == username) + return cls._select_one_or_none(func.lower(cls.c.username) == username) diff --git a/mautrix_telegram/db/puppet.py b/mautrix_telegram/db/puppet.py index c647b8d3..46143b98 100644 --- a/mautrix_telegram/db/puppet.py +++ b/mautrix_telegram/db/puppet.py @@ -16,7 +16,7 @@ from typing import Optional, Iterable from sqlalchemy import Column, Integer, String, Boolean -from sqlalchemy.sql import expression +from sqlalchemy.sql import expression, func from mautrix.types import UserID, SyncToken from mautrix.util.db import Base @@ -53,7 +53,7 @@ class Puppet(Base): @classmethod def get_by_username(cls, username: str) -> Optional['Puppet']: - return cls._select_one_or_none(cls.c.username == username) + return cls._select_one_or_none(func.lowercase(cls.c.username) == username) @classmethod def get_by_displayname(cls, displayname: str) -> Optional['Puppet']: diff --git a/mautrix_telegram/db/user.py b/mautrix_telegram/db/user.py index 36b9d7b7..81affda2 100644 --- a/mautrix_telegram/db/user.py +++ b/mautrix_telegram/db/user.py @@ -15,7 +15,7 @@ # along with this program. If not, see . from typing import Optional, Iterable, Tuple -from sqlalchemy import Column, ForeignKey, ForeignKeyConstraint, Integer, String +from sqlalchemy import Column, ForeignKey, ForeignKeyConstraint, Integer, String, func from mautrix.types import UserID from mautrix.util.db import Base @@ -46,7 +46,7 @@ class User(Base): @classmethod def get_by_username(cls, username: str) -> Optional['User']: - return cls._select_one_or_none(cls.c.tg_username == username) + return cls._select_one_or_none(func.lower(cls.c.tg_username) == username) @property def contacts(self) -> Iterable[TelegramID]: diff --git a/mautrix_telegram/portal/base.py b/mautrix_telegram/portal/base.py index bbea89a1..6dc32b32 100644 --- a/mautrix_telegram/portal/base.py +++ b/mautrix_telegram/portal/base.py @@ -354,8 +354,10 @@ class BasePortal(ABC): if not username: return None + username = username.lower() + for _, portal in cls.by_tgid.items(): - if portal.username and portal.username.lower() == username.lower(): + if portal.username and portal.username.lower() == username: return portal dbportal = DBPortal.get_by_username(username) diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index b8f7c24f..cf9c478f 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -384,8 +384,10 @@ class Puppet(CustomPuppetMixin): if not username: return None + username = username.lower() + for _, puppet in cls.cache.items(): - if puppet.username and puppet.username.lower() == username.lower(): + if puppet.username and puppet.username.lower() == username: return puppet dbpuppet = DBPuppet.get_by_username(username) diff --git a/mautrix_telegram/user.py b/mautrix_telegram/user.py index ea7e2032..3afce211 100644 --- a/mautrix_telegram/user.py +++ b/mautrix_telegram/user.py @@ -424,8 +424,10 @@ class User(AbstractUser, BaseUser): if not username: return None + username = username.lower() + for _, user in cls.by_tgid.items(): - if user.username and user.username.lower() == username.lower(): + if user.username and user.username.lower() == username: return user puppet = DBUser.get_by_username(username)