15
15
# limitations under the License.
16
16
import logging
17
17
from collections import namedtuple
18
+ from typing import Iterable , List
18
19
19
20
import six
20
21
21
22
from twisted .internet import defer
22
- from twisted .internet .defer import DeferredList
23
+ from twisted .internet .defer import Deferred , DeferredList
24
+ from twisted .python .failure import Failure
23
25
24
26
from synapse .api .constants import MAX_DEPTH , EventTypes , Membership
25
27
from synapse .api .errors import Codes , SynapseError
29
31
RoomVersion ,
30
32
)
31
33
from synapse .crypto .event_signing import check_event_content_hash
34
+ from synapse .crypto .keyring import Keyring
32
35
from synapse .events import EventBase , make_event_from_dict
33
36
from synapse .events .utils import prune_event
34
37
from synapse .http .servlet import assert_params_in_dict
@@ -56,7 +59,12 @@ def __init__(self, hs):
56
59
57
60
@defer .inlineCallbacks
58
61
def _check_sigs_and_hash_and_fetch (
59
- self , origin , pdus , room_version , outlier = False , include_none = False
62
+ self ,
63
+ origin : str ,
64
+ pdus : List [EventBase ],
65
+ room_version : str ,
66
+ outlier : bool = False ,
67
+ include_none : bool = False ,
60
68
):
61
69
"""Takes a list of PDUs and checks the signatures and hashs of each
62
70
one. If a PDU fails its signature check then we check if we have it in
@@ -69,11 +77,11 @@ def _check_sigs_and_hash_and_fetch(
69
77
a new list.
70
78
71
79
Args:
72
- origin (str)
73
- pdu (list)
74
- room_version (str)
75
- outlier (bool) : Whether the events are outliers or not
76
- include_none (str) : Whether to include None in the returned list
80
+ origin
81
+ pdu
82
+ room_version
83
+ outlier: Whether the events are outliers or not
84
+ include_none: Whether to include None in the returned list
77
85
for events that have failed their checks
78
86
79
87
Returns:
@@ -82,7 +90,7 @@ def _check_sigs_and_hash_and_fetch(
82
90
deferreds = self ._check_sigs_and_hashes (room_version , pdus )
83
91
84
92
@defer .inlineCallbacks
85
- def handle_check_result (pdu , deferred ):
93
+ def handle_check_result (pdu : EventBase , deferred : Deferred ):
86
94
try :
87
95
res = yield make_deferred_yieldable (deferred )
88
96
except SynapseError :
@@ -96,8 +104,10 @@ def handle_check_result(pdu, deferred):
96
104
97
105
if not res and pdu .origin != origin :
98
106
try :
107
+ # This should not exist in the base implementation, until
108
+ # this is fixed, ignore it for typing. See issue #6997.
99
109
res = yield defer .ensureDeferred (
100
- self .get_pdu (
110
+ self .get_pdu ( # type: ignore
101
111
destinations = [pdu .origin ],
102
112
event_id = pdu .event_id ,
103
113
room_version = room_version ,
@@ -127,21 +137,23 @@ def handle_check_result(pdu, deferred):
127
137
else :
128
138
return [p for p in valid_pdus if p ]
129
139
130
- def _check_sigs_and_hash (self , room_version , pdu ) :
140
+ def _check_sigs_and_hash (self , room_version : str , pdu : EventBase ) -> Deferred :
131
141
return make_deferred_yieldable (
132
142
self ._check_sigs_and_hashes (room_version , [pdu ])[0 ]
133
143
)
134
144
135
- def _check_sigs_and_hashes (self , room_version , pdus ):
145
+ def _check_sigs_and_hashes (
146
+ self , room_version : str , pdus : List [EventBase ]
147
+ ) -> List [Deferred ]:
136
148
"""Checks that each of the received events is correctly signed by the
137
149
sending server.
138
150
139
151
Args:
140
- room_version (str) : The room version of the PDUs
141
- pdus (list[FrozenEvent]) : the events to be checked
152
+ room_version: The room version of the PDUs
153
+ pdus: the events to be checked
142
154
143
155
Returns:
144
- list[Deferred]: for each input event, a deferred which:
156
+ For each input event, a deferred which:
145
157
* returns the original event if the checks pass
146
158
* returns a redacted version of the event (if the signature
147
159
matched but the hash did not)
@@ -152,7 +164,7 @@ def _check_sigs_and_hashes(self, room_version, pdus):
152
164
153
165
ctx = LoggingContext .current_context ()
154
166
155
- def callback (_ , pdu ):
167
+ def callback (_ , pdu : EventBase ):
156
168
with PreserveLoggingContext (ctx ):
157
169
if not check_event_content_hash (pdu ):
158
170
# let's try to distinguish between failures because the event was
@@ -189,7 +201,7 @@ def callback(_, pdu):
189
201
190
202
return pdu
191
203
192
- def errback (failure , pdu ):
204
+ def errback (failure : Failure , pdu : EventBase ):
193
205
failure .trap (SynapseError )
194
206
with PreserveLoggingContext (ctx ):
195
207
logger .warning (
@@ -215,16 +227,18 @@ class PduToCheckSig(
215
227
pass
216
228
217
229
218
- def _check_sigs_on_pdus (keyring , room_version , pdus ):
230
+ def _check_sigs_on_pdus (
231
+ keyring : Keyring , room_version : str , pdus : Iterable [EventBase ]
232
+ ) -> List [Deferred ]:
219
233
"""Check that the given events are correctly signed
220
234
221
235
Args:
222
- keyring (synapse.crypto.Keyring) : keyring object to do the checks
223
- room_version (str) : the room version of the PDUs
224
- pdus (Collection[EventBase]) : the events to be checked
236
+ keyring: keyring object to do the checks
237
+ room_version: the room version of the PDUs
238
+ pdus: the events to be checked
225
239
226
240
Returns:
227
- List[Deferred]: a Deferred for each event in pdus, which will either succeed if
241
+ A Deferred for each event in pdus, which will either succeed if
228
242
the signatures are valid, or fail (with a SynapseError) if not.
229
243
"""
230
244
@@ -329,7 +343,7 @@ def event_err(e, pdu_to_check):
329
343
return [_flatten_deferred_list (p .deferreds ) for p in pdus_to_check ]
330
344
331
345
332
- def _flatten_deferred_list (deferreds ) :
346
+ def _flatten_deferred_list (deferreds : List [ Deferred ]) -> Deferred :
333
347
"""Given a list of deferreds, either return the single deferred,
334
348
combine into a DeferredList, or return an already resolved deferred.
335
349
"""
@@ -341,7 +355,7 @@ def _flatten_deferred_list(deferreds):
341
355
return defer .succeed (None )
342
356
343
357
344
- def _is_invite_via_3pid (event ) :
358
+ def _is_invite_via_3pid (event : EventBase ) -> bool :
345
359
return (
346
360
event .type == EventTypes .Member
347
361
and event .membership == Membership .INVITE
0 commit comments