3838from synapse .replication .slave .storage .devices import SlavedDeviceStore
3939from synapse .replication .slave .storage .registration import SlavedRegistrationStore
4040from synapse .replication .tcp .client import ReplicationClientHandler
41+ from synapse .rest .client .v1 .base import ClientV1RestServlet , client_path_patterns
4142from synapse .rest .client .v2_alpha ._base import client_v2_patterns
4243from synapse .server import HomeServer
4344from synapse .storage .engines import create_engine
4950logger = logging .getLogger ("synapse.app.frontend_proxy" )
5051
5152
53+ class PresenceStatusStubServlet (ClientV1RestServlet ):
54+ PATTERNS = client_path_patterns ("/presence/(?P<user_id>[^/]*)/status" )
55+
56+ def __init__ (self , hs ):
57+ super (PresenceStatusStubServlet , self ).__init__ (hs )
58+ self .http_client = hs .get_simple_http_client ()
59+ self .auth = hs .get_auth ()
60+ self .main_uri = hs .config .worker_main_http_uri
61+
62+ @defer .inlineCallbacks
63+ def on_GET (self , request , user_id ):
64+ # Pass through the auth headers, if any, in case the access token
65+ # is there.
66+ auth_headers = request .requestHeaders .getRawHeaders ("Authorization" , [])
67+ headers = {
68+ "Authorization" : auth_headers ,
69+ }
70+ result = yield self .http_client .get_json (
71+ self .main_uri + request .uri ,
72+ headers = headers ,
73+ )
74+ defer .returnValue ((200 , result ))
75+
76+ @defer .inlineCallbacks
77+ def on_PUT (self , request , user_id ):
78+ yield self .auth .get_user_by_req (request )
79+ defer .returnValue ((200 , {}))
80+
81+
5282class KeyUploadServlet (RestServlet ):
5383 PATTERNS = client_v2_patterns ("/keys/upload(/(?P<device_id>[^/]+))?$" )
5484
@@ -135,6 +165,12 @@ def _listen_http(self, listener_config):
135165 elif name == "client" :
136166 resource = JsonResource (self , canonical_json = False )
137167 KeyUploadServlet (self ).register (resource )
168+
169+ # If presence is disabled, use the stub servlet that does
170+ # not allow sending presence
171+ if not self .config .use_presence :
172+ PresenceStatusStubServlet (self ).register (resource )
173+
138174 resources .update ({
139175 "/_matrix/client/r0" : resource ,
140176 "/_matrix/client/unstable" : resource ,
@@ -153,7 +189,8 @@ def _listen_http(self, listener_config):
153189 listener_config ,
154190 root_resource ,
155191 self .version_string ,
156- )
192+ ),
193+ reactor = self .get_reactor ()
157194 )
158195
159196 logger .info ("Synapse client reader now listening on port %d" , port )
0 commit comments