@@ -114,40 +114,54 @@ def verify_json_objects_for_server(self, server_and_json):
114114 server_name. The deferreds run their callbacks in the sentinel
115115 logcontext.
116116 """
117+ # a list of VerifyKeyRequests
117118 verify_requests = []
119+ handle = preserve_fn (_handle_key_deferred )
118120
119- for server_name , json_object in server_and_json :
121+ def process (server_name , json_object ):
122+ """Process an entry in the request list
120123
124+ Given a (server_name, json_object) pair from the request list,
125+ adds a key request to verify_requests, and returns a deferred which will
126+ complete or fail (in the sentinel context) when verification completes.
127+ """
121128 key_ids = signature_ids (json_object , server_name )
129+
122130 if not key_ids :
123- logger .warn ("Request from %s: no supported signature keys" ,
124- server_name )
125- deferred = defer .fail (SynapseError (
126- 400 ,
127- "Not signed with a supported algorithm" ,
128- Codes .UNAUTHORIZED ,
129- ))
130- else :
131- deferred = defer .Deferred ()
131+ return defer .fail (
132+ SynapseError (
133+ 400 ,
134+ "Not signed by %s" % (server_name ,),
135+ Codes .UNAUTHORIZED ,
136+ )
137+ )
132138
133139 logger .debug ("Verifying for %s with key_ids %s" ,
134140 server_name , key_ids )
135141
142+ # add the key request to the queue, but don't start it off yet.
136143 verify_request = VerifyKeyRequest (
137- server_name , key_ids , json_object , deferred
144+ server_name , key_ids , json_object , defer . Deferred (),
138145 )
139-
140146 verify_requests .append (verify_request )
141147
142- run_in_background (self ._start_key_lookups , verify_requests )
148+ # now run _handle_key_deferred, which will wait for the key request
149+ # to complete and then do the verification.
150+ #
151+ # We want _handle_key_request to log to the right context, so we
152+ # wrap it with preserve_fn (aka run_in_background)
153+ return handle (verify_request )
143154
144- # Pass those keys to handle_key_deferred so that the json object
145- # signatures can be verified
146- handle = preserve_fn (_handle_key_deferred )
147- return [
148- handle (rq ) for rq in verify_requests
155+ results = [
156+ process (server_name , json_object )
157+ for server_name , json_object in server_and_json
149158 ]
150159
160+ if verify_requests :
161+ run_in_background (self ._start_key_lookups , verify_requests )
162+
163+ return results
164+
151165 @defer .inlineCallbacks
152166 def _start_key_lookups (self , verify_requests ):
153167 """Sets off the key fetches for each verify request
0 commit comments