Skip to content

Commit 05a25cb

Browse files
Merge pull request #304 from ajmirsky/bug_fix_300
a connection without peer info should be rejected (#300)
2 parents 4d43b39 + 46b9e57 commit 05a25cb

3 files changed

Lines changed: 16 additions & 1 deletion

File tree

amqtt/adapters.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,10 @@ async def drain(self) -> None:
176176
if not self.is_closed:
177177
await self._writer.drain()
178178

179-
def get_peer_info(self) -> tuple[str, int]:
179+
def get_peer_info(self) -> tuple[str, int] | None:
180180
extra_info = self._writer.get_extra_info("peername")
181+
if not extra_info or len(extra_info) < 2:
182+
return None
181183
return extra_info[0], extra_info[1]
182184

183185
def get_ssl_info(self) -> ssl.SSLObject | None:

amqtt/broker.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,8 @@ async def _client_connected(self, listener_name: str, reader: ReaderAdapter, wri
444444
remote_info = writer.get_peer_info()
445445
if remote_info is None:
446446
self.logger.warning("Remote info could not be retrieved from peer info")
447+
await writer.close() # python 3.10 needs explicit close
448+
server.release_connection()
447449
return
448450

449451
remote_address, remote_port = remote_info

tests/test_broker.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,3 +1028,14 @@ async def test_broker_with_absent_auth_plugin_filter():
10281028
await mqtt_client.connect()
10291029

10301030
await broker.shutdown()
1031+
1032+
1033+
@pytest.mark.asyncio
1034+
async def test_client_without_peer_info(broker, mock_plugin_manager):
1035+
client = MQTTClient(config={'auto_reconnect':False})
1036+
1037+
# if the broker's stream writer for this client does not have peer info, the client should fail to connect
1038+
with patch.object(asyncio.streams.StreamWriter, 'get_extra_info', return_value=None) as mock_extra_info:
1039+
with pytest.raises(ConnectError):
1040+
await client.connect("mqtt://127.0.0.1/")
1041+
await asyncio.sleep(0.01)

0 commit comments

Comments
 (0)