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

Add missing type hints to REST servlets. #10817

Merged
merged 8 commits into from
Sep 15, 2021
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Add missing type hints to key servlets.
clokep committed Sep 14, 2021

Verified

This commit was signed with the committer’s verified signature.
lucasssvaz Lucas Saavedra Vaz
commit 4476b060239cfb9ebae230a0065acd3cd5fceac6
7 changes: 6 additions & 1 deletion synapse/rest/key/v2/__init__.py
Original file line number Diff line number Diff line change
@@ -12,14 +12,19 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from typing import TYPE_CHECKING

from twisted.web.resource import Resource

from .local_key_resource import LocalKey
from .remote_key_resource import RemoteKey

if TYPE_CHECKING:
from synapse.server import HomeServer


class KeyApiV2Resource(Resource):
def __init__(self, hs):
def __init__(self, hs: "HomeServer"):
Resource.__init__(self)
self.putChild(b"server", LocalKey(hs))
self.putChild(b"query", RemoteKey(hs))
15 changes: 10 additions & 5 deletions synapse/rest/key/v2/local_key_resource.py
Original file line number Diff line number Diff line change
@@ -12,16 +12,21 @@
# See the License for the specific language governing permissions and
# limitations under the License.


import logging
from typing import TYPE_CHECKING

from canonicaljson import encode_canonical_json
from signedjson.sign import sign_json
from unpaddedbase64 import encode_base64

from twisted.web.resource import Resource
from twisted.web.server import Request

from synapse.http.server import respond_with_json_bytes
from synapse.types import JsonDict

if TYPE_CHECKING:
from synapse.server import HomeServer

logger = logging.getLogger(__name__)

@@ -58,18 +63,18 @@ class LocalKey(Resource):

isLeaf = True

def __init__(self, hs):
def __init__(self, hs: "HomeServer"):
self.config = hs.config
self.clock = hs.get_clock()
self.update_response_body(self.clock.time_msec())
Resource.__init__(self)

def update_response_body(self, time_now_msec):
def update_response_body(self, time_now_msec: int) -> None:
refresh_interval = self.config.key_refresh_interval
self.valid_until_ts = int(time_now_msec + refresh_interval)
self.response_body = encode_canonical_json(self.response_json_object())

def response_json_object(self):
def response_json_object(self) -> JsonDict:
verify_keys = {}
for key in self.config.signing_key:
verify_key_bytes = key.verify_key.encode()
@@ -94,7 +99,7 @@ def response_json_object(self):
json_object = sign_json(json_object, self.config.server.server_name, key)
return json_object

def render_GET(self, request):
def render_GET(self, request: Request) -> int:
time_now = self.clock.time_msec()
# Update the expiry time if less than half the interval remains.
if time_now + self.config.key_refresh_interval / 2 > self.valid_until_ts:
30 changes: 21 additions & 9 deletions synapse/rest/key/v2/remote_key_resource.py
Original file line number Diff line number Diff line change
@@ -13,17 +13,23 @@
# limitations under the License.

import logging
from typing import Dict
from typing import TYPE_CHECKING, Dict

from signedjson.sign import sign_json

from twisted.web.server import Request

from synapse.api.errors import Codes, SynapseError
from synapse.crypto.keyring import ServerKeyFetcher
from synapse.http.server import DirectServeJsonResource, respond_with_json
from synapse.http.servlet import parse_integer, parse_json_object_from_request
from synapse.types import JsonDict
from synapse.util import json_decoder
from synapse.util.async_helpers import yieldable_gather_results

if TYPE_CHECKING:
from synapse.server import HomeServer

logger = logging.getLogger(__name__)


@@ -85,7 +91,7 @@ class RemoteKey(DirectServeJsonResource):

isLeaf = True

def __init__(self, hs):
def __init__(self, hs: "HomeServer"):
super().__init__()

self.fetcher = ServerKeyFetcher(hs)
@@ -94,7 +100,8 @@ def __init__(self, hs):
self.federation_domain_whitelist = hs.config.federation_domain_whitelist
self.config = hs.config

async def _async_render_GET(self, request):
async def _async_render_GET(self, request: Request) -> None:
assert request.postpath is not None
if len(request.postpath) == 1:
(server,) = request.postpath
query: dict = {server.decode("ascii"): {}}
@@ -110,14 +117,19 @@ async def _async_render_GET(self, request):

await self.query_keys(request, query, query_remote_on_cache_miss=True)

async def _async_render_POST(self, request):
async def _async_render_POST(self, request: Request) -> None:
content = parse_json_object_from_request(request)

query = content["server_keys"]

await self.query_keys(request, query, query_remote_on_cache_miss=True)

async def query_keys(self, request, query, query_remote_on_cache_miss=False):
async def query_keys(
self,
request: Request,
query: JsonDict,
query_remote_on_cache_miss: bool = False,
) -> None:
logger.info("Handling query for keys %r", query)

store_queries = []
@@ -142,8 +154,8 @@ async def query_keys(self, request, query, query_remote_on_cache_miss=False):

# Note that the value is unused.
cache_misses: Dict[str, Dict[str, int]] = {}
for (server_name, key_id, _), results in cached.items():
results = [(result["ts_added_ms"], result) for result in results]
for (server_name, key_id, _), key_results in cached.items():
results = [(result["ts_added_ms"], result) for result in key_results]

if not results and key_id is not None:
cache_misses.setdefault(server_name, {})[key_id] = 0
@@ -230,6 +242,6 @@ async def query_keys(self, request, query, query_remote_on_cache_miss=False):

signed_keys.append(key_json)

results = {"server_keys": signed_keys}
response = {"server_keys": signed_keys}

respond_with_json(request, 200, results, canonical_json=True)
respond_with_json(request, 200, response, canonical_json=True)