Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Formally type the UserProfile in user searches
Browse files Browse the repository at this point in the history
  • Loading branch information
David Robertson committed Mar 17, 2022
1 parent 12d1f82 commit 7fe7b42
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 12 deletions.
7 changes: 3 additions & 4 deletions synapse/events/spamcheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
Awaitable,
Callable,
Collection,
Dict,
List,
Optional,
Tuple,
Expand All @@ -31,7 +30,7 @@
from synapse.rest.media.v1._base import FileInfo
from synapse.rest.media.v1.media_storage import ReadableFileWrapper
from synapse.spam_checker_api import RegistrationBehaviour
from synapse.types import RoomAlias
from synapse.types import RoomAlias, UserProfile
from synapse.util.async_helpers import maybe_awaitable

if TYPE_CHECKING:
Expand All @@ -50,7 +49,7 @@
USER_MAY_CREATE_ROOM_CALLBACK = Callable[[str], Awaitable[bool]]
USER_MAY_CREATE_ROOM_ALIAS_CALLBACK = Callable[[str, RoomAlias], Awaitable[bool]]
USER_MAY_PUBLISH_ROOM_CALLBACK = Callable[[str, str], Awaitable[bool]]
CHECK_USERNAME_FOR_SPAM_CALLBACK = Callable[[Dict[str, str]], Awaitable[bool]]
CHECK_USERNAME_FOR_SPAM_CALLBACK = Callable[[UserProfile], Awaitable[bool]]
LEGACY_CHECK_REGISTRATION_FOR_SPAM_CALLBACK = Callable[
[
Optional[dict],
Expand Down Expand Up @@ -383,7 +382,7 @@ async def user_may_publish_room(self, userid: str, room_id: str) -> bool:

return True

async def check_username_for_spam(self, user_profile: Dict[str, str]) -> bool:
async def check_username_for_spam(self, user_profile: UserProfile) -> bool:
"""Checks if a user ID or display name are considered "spammy" by this server.
If the server considers a username spammy, then it will not be included in
Expand Down
4 changes: 2 additions & 2 deletions synapse/handlers/user_directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
from synapse.api.constants import EventTypes, HistoryVisibility, JoinRules, Membership
from synapse.handlers.state_deltas import MatchChange, StateDeltasHandler
from synapse.metrics.background_process_metrics import run_as_background_process
from synapse.storage.databases.main.user_directory import SearchResult
from synapse.storage.roommember import ProfileInfo
from synapse.types import JsonDict
from synapse.util.metrics import Measure

if TYPE_CHECKING:
Expand Down Expand Up @@ -78,7 +78,7 @@ def __init__(self, hs: "HomeServer"):

async def search_users(
self, user_id: str, search_term: str, limit: int
) -> JsonDict:
) -> SearchResult:
"""Searches for users in directory
Returns:
Expand Down
4 changes: 2 additions & 2 deletions synapse/rest/client/user_directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from synapse.http.server import HttpServer
from synapse.http.servlet import RestServlet, parse_json_object_from_request
from synapse.http.site import SynapseRequest
from synapse.types import JsonDict
from synapse.types import JsonMapping

from ._base import client_patterns

Expand All @@ -38,7 +38,7 @@ def __init__(self, hs: "HomeServer"):
self.auth = hs.get_auth()
self.user_directory_handler = hs.get_user_directory_handler()

async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonMapping]:
"""Searches for users in directory
Returns:
Expand Down
22 changes: 18 additions & 4 deletions synapse/storage/databases/main/user_directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
Sequence,
Set,
Tuple,
TypedDict,
cast,
)

Expand All @@ -40,7 +41,12 @@
from synapse.storage.databases.main.state import StateFilter
from synapse.storage.databases.main.state_deltas import StateDeltasStore
from synapse.storage.engines import PostgresEngine, Sqlite3Engine
from synapse.types import JsonDict, get_domain_from_id, get_localpart_from_id
from synapse.types import (
JsonDict,
UserProfile,
get_domain_from_id,
get_localpart_from_id,
)
from synapse.util.caches.descriptors import cached

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -591,6 +597,11 @@ async def update_user_directory_stream_pos(self, stream_id: Optional[int]) -> No
)


class SearchResult(TypedDict):
limited: bool
results: List[UserProfile]


class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
# How many records do we calculate before sending it to
# add_users_who_share_private_rooms?
Expand Down Expand Up @@ -777,7 +788,7 @@ async def get_user_directory_stream_pos(self) -> Optional[int]:

async def search_user_dir(
self, user_id: str, search_term: str, limit: int
) -> JsonDict:
) -> SearchResult:
"""Searches for users in directory
Returns:
Expand Down Expand Up @@ -910,8 +921,11 @@ async def search_user_dir(
# This should be unreachable.
raise Exception("Unrecognized database engine")

results = await self.db_pool.execute(
"search_user_dir", self.db_pool.cursor_to_dict, sql, *args
results = cast(
List[UserProfile],
await self.db_pool.execute(
"search_user_dir", self.db_pool.cursor_to_dict, sql, *args
),
)

limited = len(results) > limit
Expand Down
11 changes: 11 additions & 0 deletions synapse/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
Optional,
Tuple,
Type,
TypedDict,
TypeVar,
Union,
)
Expand Down Expand Up @@ -63,6 +64,10 @@
# JSON types. These could be made stronger, but will do for now.
# A JSON-serialisable dict.
JsonDict = Dict[str, Any]
# A JSON-serialisable mapping; roughly speaking an immutable JSONDict.
# Useful when you have a TypedDict which isn't going to be mutated and you don't want
# to cast to JsonDict everywhere.
JsonMapping = Mapping[str, Any]
# A JSON-serialisable object.
JsonSerializable = object

Expand Down Expand Up @@ -791,3 +796,9 @@ class UserInfo:
is_deactivated: bool
is_guest: bool
is_shadow_banned: bool


class UserProfile(TypedDict):
user_id: str
display_name: Optional[str]
avatar_url: Optional[str]

0 comments on commit 7fe7b42

Please sign in to comment.