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

Commit 7fbf424

Browse files
authored
Use getClientAddress instead of getClientIP. (#12599)
getClientIP was deprecated in Twisted 18.4.0, which also added getClientAddress. The Synapse minimum version for Twisted is currently 18.9.0, so all supported versions have the new API.
1 parent 116a4c8 commit 7fbf424

File tree

16 files changed

+62
-46
lines changed

16 files changed

+62
-46
lines changed

changelog.d/12599.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Use `getClientAddress` instead of the deprecated `getClientIP`.

synapse/api/auth.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ async def _wrapped_get_user_by_req(
187187
Once get_user_by_req has set up the opentracing span, this does the actual work.
188188
"""
189189
try:
190-
ip_addr = request.getClientIP()
190+
ip_addr = request.getClientAddress().host
191191
user_agent = get_request_user_agent(request)
192192

193193
access_token = self.get_access_token_from_request(request)
@@ -356,7 +356,7 @@ async def _get_appservice_user_id_and_device_id(
356356
return None, None, None
357357

358358
if app_service.ip_range_whitelist:
359-
ip_address = IPAddress(request.getClientIP())
359+
ip_address = IPAddress(request.getClientAddress().host)
360360
if ip_address not in app_service.ip_range_whitelist:
361361
return None, None, None
362362

synapse/handlers/auth.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ async def check_ui_auth(
551551
await self.store.set_ui_auth_clientdict(sid, clientdict)
552552

553553
user_agent = get_request_user_agent(request)
554-
clientip = request.getClientIP()
554+
clientip = request.getClientAddress().host
555555

556556
await self.store.add_user_agent_ip_to_ui_auth_session(
557557
session.session_id, user_agent, clientip

synapse/handlers/identity.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ async def ratelimit_request_token_requests(
9292
"""
9393

9494
await self._3pid_validation_ratelimiter_ip.ratelimit(
95-
None, (medium, request.getClientIP())
95+
None, (medium, request.getClientAddress().host)
9696
)
9797
await self._3pid_validation_ratelimiter_address.ratelimit(
9898
None, (medium, address)

synapse/handlers/sso.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ async def complete_sso_login_request(
468468
auth_provider_id,
469469
remote_user_id,
470470
get_request_user_agent(request),
471-
request.getClientIP(),
471+
request.getClientAddress().host,
472472
)
473473
new_user = True
474474
elif self._sso_update_profile_information:
@@ -928,7 +928,7 @@ async def register_sso_user(self, request: Request, session_id: str) -> None:
928928
session.auth_provider_id,
929929
session.remote_user_id,
930930
get_request_user_agent(request),
931-
request.getClientIP(),
931+
request.getClientAddress().host,
932932
)
933933

934934
logger.info(

synapse/http/site.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ def render(self, resrc: Resource) -> None:
238238
request_id,
239239
request=ContextRequest(
240240
request_id=request_id,
241-
ip_address=self.getClientIP(),
241+
ip_address=self.getClientAddress().host,
242242
site_tag=self.synapse_site.site_tag,
243243
# The requester is going to be unknown at this point.
244244
requester=None,
@@ -381,7 +381,7 @@ def _started_processing(self, servlet_name: str) -> None:
381381

382382
self.synapse_site.access_logger.debug(
383383
"%s - %s - Received request: %s %s",
384-
self.getClientIP(),
384+
self.getClientAddress().host,
385385
self.synapse_site.site_tag,
386386
self.get_method(),
387387
self.get_redacted_uri(),
@@ -429,7 +429,7 @@ def _finished_processing(self) -> None:
429429
"%s - %s - {%s}"
430430
" Processed request: %.3fsec/%.3fsec (%.3fsec, %.3fsec) (%.3fsec/%.3fsec/%d)"
431431
' %sB %s "%s %s %s" "%s" [%d dbevts]',
432-
self.getClientIP(),
432+
self.getClientAddress().host,
433433
self.synapse_site.site_tag,
434434
requester,
435435
processing_time,

synapse/logging/opentracing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ def trace_servlet(request: "SynapseRequest", extract_context: bool = False):
884884
tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER,
885885
tags.HTTP_METHOD: request.get_method(),
886886
tags.HTTP_URL: request.get_redacted_uri(),
887-
tags.PEER_HOST_IPV6: request.getClientIP(),
887+
tags.PEER_HOST_IPV6: request.getClientAddress().host,
888888
}
889889

890890
request_name = request.request_metrics.name

synapse/rest/client/auth.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ async def on_POST(self, request: Request, stagetype: str) -> None:
112112

113113
try:
114114
await self.auth_handler.add_oob_auth(
115-
LoginType.RECAPTCHA, authdict, request.getClientIP()
115+
LoginType.RECAPTCHA, authdict, request.getClientAddress().host
116116
)
117117
except LoginError as e:
118118
# Authentication failed, let user try again
@@ -132,7 +132,7 @@ async def on_POST(self, request: Request, stagetype: str) -> None:
132132

133133
try:
134134
await self.auth_handler.add_oob_auth(
135-
LoginType.TERMS, authdict, request.getClientIP()
135+
LoginType.TERMS, authdict, request.getClientAddress().host
136136
)
137137
except LoginError as e:
138138
# Authentication failed, let user try again
@@ -161,7 +161,9 @@ async def on_POST(self, request: Request, stagetype: str) -> None:
161161

162162
try:
163163
await self.auth_handler.add_oob_auth(
164-
LoginType.REGISTRATION_TOKEN, authdict, request.getClientIP()
164+
LoginType.REGISTRATION_TOKEN,
165+
authdict,
166+
request.getClientAddress().host,
165167
)
166168
except LoginError as e:
167169
html = self.registration_token_template.render(

synapse/rest/client/login.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ async def on_POST(self, request: SynapseRequest) -> Tuple[int, LoginResponse]:
176176

177177
if appservice.is_rate_limited():
178178
await self._address_ratelimiter.ratelimit(
179-
None, request.getClientIP()
179+
None, request.getClientAddress().host
180180
)
181181

182182
result = await self._do_appservice_login(
@@ -188,19 +188,25 @@ async def on_POST(self, request: SynapseRequest) -> Tuple[int, LoginResponse]:
188188
self.jwt_enabled
189189
and login_submission["type"] == LoginRestServlet.JWT_TYPE
190190
):
191-
await self._address_ratelimiter.ratelimit(None, request.getClientIP())
191+
await self._address_ratelimiter.ratelimit(
192+
None, request.getClientAddress().host
193+
)
192194
result = await self._do_jwt_login(
193195
login_submission,
194196
should_issue_refresh_token=should_issue_refresh_token,
195197
)
196198
elif login_submission["type"] == LoginRestServlet.TOKEN_TYPE:
197-
await self._address_ratelimiter.ratelimit(None, request.getClientIP())
199+
await self._address_ratelimiter.ratelimit(
200+
None, request.getClientAddress().host
201+
)
198202
result = await self._do_token_login(
199203
login_submission,
200204
should_issue_refresh_token=should_issue_refresh_token,
201205
)
202206
else:
203-
await self._address_ratelimiter.ratelimit(None, request.getClientIP())
207+
await self._address_ratelimiter.ratelimit(
208+
None, request.getClientAddress().host
209+
)
204210
result = await self._do_other_login(
205211
login_submission,
206212
should_issue_refresh_token=should_issue_refresh_token,

synapse/rest/client/register.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ async def on_GET(self, request: Request) -> Tuple[int, JsonDict]:
352352
if self.inhibit_user_in_use_error:
353353
return 200, {"available": True}
354354

355-
ip = request.getClientIP()
355+
ip = request.getClientAddress().host
356356
with self.ratelimiter.ratelimit(ip) as wait_deferred:
357357
await wait_deferred
358358

@@ -394,7 +394,7 @@ def __init__(self, hs: "HomeServer"):
394394
)
395395

396396
async def on_GET(self, request: Request) -> Tuple[int, JsonDict]:
397-
await self.ratelimiter.ratelimit(None, (request.getClientIP(),))
397+
await self.ratelimiter.ratelimit(None, (request.getClientAddress().host,))
398398

399399
if not self.hs.config.registration.enable_registration:
400400
raise SynapseError(
@@ -441,7 +441,7 @@ def __init__(self, hs: "HomeServer"):
441441
async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
442442
body = parse_json_object_from_request(request)
443443

444-
client_addr = request.getClientIP()
444+
client_addr = request.getClientAddress().host
445445

446446
await self.ratelimiter.ratelimit(None, client_addr, update=False)
447447

tests/api/test_auth.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def test_get_user_by_req_appservice_valid_token(self):
105105
self.store.get_user_by_access_token = simple_async_mock(None)
106106

107107
request = Mock(args={})
108-
request.getClientIP.return_value = "127.0.0.1"
108+
request.getClientAddress.return_value.host = "127.0.0.1"
109109
request.args[b"access_token"] = [self.test_token]
110110
request.requestHeaders.getRawHeaders = mock_getRawHeaders()
111111
requester = self.get_success(self.auth.get_user_by_req(request))
@@ -124,7 +124,7 @@ def test_get_user_by_req_appservice_valid_token_good_ip(self):
124124
self.store.get_user_by_access_token = simple_async_mock(None)
125125

126126
request = Mock(args={})
127-
request.getClientIP.return_value = "192.168.10.10"
127+
request.getClientAddress.return_value.host = "192.168.10.10"
128128
request.args[b"access_token"] = [self.test_token]
129129
request.requestHeaders.getRawHeaders = mock_getRawHeaders()
130130
requester = self.get_success(self.auth.get_user_by_req(request))
@@ -143,7 +143,7 @@ def test_get_user_by_req_appservice_valid_token_bad_ip(self):
143143
self.store.get_user_by_access_token = simple_async_mock(None)
144144

145145
request = Mock(args={})
146-
request.getClientIP.return_value = "131.111.8.42"
146+
request.getClientAddress.return_value.host = "131.111.8.42"
147147
request.args[b"access_token"] = [self.test_token]
148148
request.requestHeaders.getRawHeaders = mock_getRawHeaders()
149149
f = self.get_failure(
@@ -190,7 +190,7 @@ def test_get_user_by_req_appservice_valid_token_valid_user_id(self):
190190
self.store.get_user_by_access_token = simple_async_mock(None)
191191

192192
request = Mock(args={})
193-
request.getClientIP.return_value = "127.0.0.1"
193+
request.getClientAddress.return_value.host = "127.0.0.1"
194194
request.args[b"access_token"] = [self.test_token]
195195
request.args[b"user_id"] = [masquerading_user_id]
196196
request.requestHeaders.getRawHeaders = mock_getRawHeaders()
@@ -209,7 +209,7 @@ def test_get_user_by_req_appservice_valid_token_bad_user_id(self):
209209
self.store.get_user_by_access_token = simple_async_mock(None)
210210

211211
request = Mock(args={})
212-
request.getClientIP.return_value = "127.0.0.1"
212+
request.getClientAddress.return_value.host = "127.0.0.1"
213213
request.args[b"access_token"] = [self.test_token]
214214
request.args[b"user_id"] = [masquerading_user_id]
215215
request.requestHeaders.getRawHeaders = mock_getRawHeaders()
@@ -236,7 +236,7 @@ def test_get_user_by_req_appservice_valid_token_valid_device_id(self):
236236
self.store.get_device = simple_async_mock({"hidden": False})
237237

238238
request = Mock(args={})
239-
request.getClientIP.return_value = "127.0.0.1"
239+
request.getClientAddress.return_value.host = "127.0.0.1"
240240
request.args[b"access_token"] = [self.test_token]
241241
request.args[b"user_id"] = [masquerading_user_id]
242242
request.args[b"org.matrix.msc3202.device_id"] = [masquerading_device_id]
@@ -268,7 +268,7 @@ def test_get_user_by_req_appservice_valid_token_invalid_device_id(self):
268268
self.store.get_device = simple_async_mock(None)
269269

270270
request = Mock(args={})
271-
request.getClientIP.return_value = "127.0.0.1"
271+
request.getClientAddress.return_value.host = "127.0.0.1"
272272
request.args[b"access_token"] = [self.test_token]
273273
request.args[b"user_id"] = [masquerading_user_id]
274274
request.args[b"org.matrix.msc3202.device_id"] = [masquerading_device_id]
@@ -288,7 +288,7 @@ def test_get_user_by_req__puppeted_token__not_tracking_puppeted_mau(self):
288288
)
289289
self.store.insert_client_ip = simple_async_mock(None)
290290
request = Mock(args={})
291-
request.getClientIP.return_value = "127.0.0.1"
291+
request.getClientAddress.return_value.host = "127.0.0.1"
292292
request.args[b"access_token"] = [self.test_token]
293293
request.requestHeaders.getRawHeaders = mock_getRawHeaders()
294294
self.get_success(self.auth.get_user_by_req(request))
@@ -305,7 +305,7 @@ def test_get_user_by_req__puppeted_token__tracking_puppeted_mau(self):
305305
)
306306
self.store.insert_client_ip = simple_async_mock(None)
307307
request = Mock(args={})
308-
request.getClientIP.return_value = "127.0.0.1"
308+
request.getClientAddress.return_value.host = "127.0.0.1"
309309
request.args[b"access_token"] = [self.test_token]
310310
request.requestHeaders.getRawHeaders = mock_getRawHeaders()
311311
self.get_success(self.auth.get_user_by_req(request))

tests/handlers/test_cas.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ def _mock_request():
204204
mock = Mock(
205205
spec=[
206206
"finish",
207-
"getClientIP",
207+
"getClientAddress",
208208
"getHeader",
209209
"setHeader",
210210
"setResponseCode",

tests/handlers/test_oidc.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,7 @@ def _build_callback_request(
13001300
"getCookie",
13011301
"cookies",
13021302
"requestHeaders",
1303-
"getClientIP",
1303+
"getClientAddress",
13041304
"getHeader",
13051305
]
13061306
)
@@ -1310,5 +1310,5 @@ def _build_callback_request(
13101310
request.args = {}
13111311
request.args[b"code"] = [code.encode("utf-8")]
13121312
request.args[b"state"] = [state.encode("utf-8")]
1313-
request.getClientIP.return_value = ip_address
1313+
request.getClientAddress.return_value.host = ip_address
13141314
return request

tests/handlers/test_saml.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ def _mock_request():
352352
mock = Mock(
353353
spec=[
354354
"finish",
355-
"getClientIP",
355+
"getClientAddress",
356356
"getHeader",
357357
"setHeader",
358358
"setResponseCode",

tests/replication/_base.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,12 @@ def handle_http_replication_attempt(self) -> SynapseRequest:
154154
self.assertEqual(port, 8765)
155155

156156
# Set up client side protocol
157-
client_protocol = client_factory.buildProtocol(None)
157+
client_address = IPv4Address("TCP", "127.0.0.1", 1234)
158+
client_protocol = client_factory.buildProtocol(("127.0.0.1", 1234))
158159

159160
# Set up the server side protocol
160-
channel = self.site.buildProtocol(None)
161+
server_address = IPv4Address("TCP", host, port)
162+
channel = self.site.buildProtocol((host, port))
161163

162164
# hook into the channel's request factory so that we can keep a record
163165
# of the requests
@@ -173,12 +175,12 @@ def request_factory(*args, **kwargs):
173175

174176
# Connect client to server and vice versa.
175177
client_to_server_transport = FakeTransport(
176-
channel, self.reactor, client_protocol
178+
channel, self.reactor, client_protocol, server_address, client_address
177179
)
178180
client_protocol.makeConnection(client_to_server_transport)
179181

180182
server_to_client_transport = FakeTransport(
181-
client_protocol, self.reactor, channel
183+
client_protocol, self.reactor, channel, client_address, server_address
182184
)
183185
channel.makeConnection(server_to_client_transport)
184186

@@ -406,19 +408,21 @@ def _handle_http_replication_attempt(self, hs, repl_port):
406408
self.assertEqual(port, repl_port)
407409

408410
# Set up client side protocol
409-
client_protocol = client_factory.buildProtocol(None)
411+
client_address = IPv4Address("TCP", "127.0.0.1", 1234)
412+
client_protocol = client_factory.buildProtocol(("127.0.0.1", 1234))
410413

411414
# Set up the server side protocol
412-
channel = self._hs_to_site[hs].buildProtocol(None)
415+
server_address = IPv4Address("TCP", host, port)
416+
channel = self._hs_to_site[hs].buildProtocol((host, port))
413417

414418
# Connect client to server and vice versa.
415419
client_to_server_transport = FakeTransport(
416-
channel, self.reactor, client_protocol
420+
channel, self.reactor, client_protocol, server_address, client_address
417421
)
418422
client_protocol.makeConnection(client_to_server_transport)
419423

420424
server_to_client_transport = FakeTransport(
421-
client_protocol, self.reactor, channel
425+
client_protocol, self.reactor, channel, client_address, server_address
422426
)
423427
channel.makeConnection(server_to_client_transport)
424428

tests/server.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ def requestDone(self, _self):
181181
self.resource_usage = _self.logcontext.get_resource_usage()
182182

183183
def getPeer(self):
184-
# We give an address so that getClientIP returns a non null entry,
184+
# We give an address so that getClientAddress/getClientIP returns a non null entry,
185185
# causing us to record the MAU
186186
return address.IPv4Address("TCP", self._ip, 3423)
187187

@@ -562,7 +562,10 @@ class FakeTransport:
562562
"""
563563

564564
_peer_address: Optional[IAddress] = attr.ib(default=None)
565-
"""The value to be returend by getPeer"""
565+
"""The value to be returned by getPeer"""
566+
567+
_host_address: Optional[IAddress] = attr.ib(default=None)
568+
"""The value to be returned by getHost"""
566569

567570
disconnecting = False
568571
disconnected = False
@@ -571,11 +574,11 @@ class FakeTransport:
571574
producer = attr.ib(default=None)
572575
autoflush = attr.ib(default=True)
573576

574-
def getPeer(self):
577+
def getPeer(self) -> Optional[IAddress]:
575578
return self._peer_address
576579

577-
def getHost(self):
578-
return None
580+
def getHost(self) -> Optional[IAddress]:
581+
return self._host_address
579582

580583
def loseConnection(self, reason=None):
581584
if not self.disconnecting:

0 commit comments

Comments
 (0)