Skip to content

Commit 23616e6

Browse files
committed
Reallow split packets to be processed
1 parent be9d14a commit 23616e6

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

server/network/ao_protocol.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def connection_lost(self, exc):
105105
self.server.remove_client(self.client)
106106
self.ping_timeout.cancel()
107107

108-
def _get_messages(self):
108+
def _get_messages(self) -> str:
109109
""" Parses out full messages from the buffer.
110110
111111
:return: yields messages
@@ -115,13 +115,20 @@ def _get_messages(self):
115115
self.buffer = spl[1]
116116
yield spl[0]
117117

118+
def _shortened_buffer(self) -> str:
119+
short_buffer = self.buffer
120+
if len(short_buffer) >= 512:
121+
short_buffer = short_buffer[:500] + '...' + short_buffer[-12:]
122+
123+
return f'{short_buffer} ({len(self.buffer)} bytes)'
124+
118125
def _process_message(self, msg):
119126
if len(msg) < 2:
120127
# This immediatelly kills any client that does not even try to follow the proper
121128
# client protocol
122129
msg = self.buffer if len(self.buffer) < 512 else self.buffer[:512] + '...'
123130
logger.log_server(f'Terminated {self.client.get_ipreal()} (packet too short): '
124-
f'sent {msg} ({len(self.buffer)} bytes)')
131+
f'sent {self._shortened_buffer()}.')
125132
self.client.disconnect()
126133
return False
127134

@@ -175,9 +182,8 @@ def data_received(self, data):
175182
self.buffer = self.buffer.translate({ord(c): None for c in '\0'})
176183

177184
if len(self.buffer) > 8192:
178-
msg = self.buffer if len(self.buffer) < 512 else self.buffer[:512] + '...'
179185
logger.log_server(f'Terminated {self.client.get_ipreal()} (packet too long): '
180-
f'sent {msg} ({len(self.buffer)} bytes)')
186+
f'sent {self._shortened_buffer()}.')
181187
self.client.disconnect()
182188
return
183189

@@ -187,14 +193,19 @@ def data_received(self, data):
187193
if not self._process_message(msg):
188194
return
189195

190-
if not found_message:
196+
if found_message:
197+
return
198+
199+
# Check if valid packet split by evil router on client side
200+
buffer_command = self.buffer.split('#')[0]
201+
if buffer_command not in self._net_cmd_dispatcher:
191202
# This immediatelly kills any client that does not even try to follow the proper
192203
# client protocol
193-
msg = self.buffer if len(self.buffer) < 512 else self.buffer[:512] + '...'
194204
logger.log_server(f'Terminated {self.client.get_ipreal()} (packet syntax '
195-
f'unrecognized): sent {msg} ({len(self.buffer)} bytes)')
205+
f'unrecognized): sent {self._shortened_buffer()}.')
196206
self.client.disconnect()
197207

208+
198209
def _validate_net_cmd(self, args, *types, needs_auth=True):
199210
""" Makes sure the net command's arguments match expectations.
200211

server/tsuserver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ def __init__(self, protocol: AOProtocol = None,
6969
self.release = 4
7070
self.major_version = 3
7171
self.minor_version = 4
72-
self.segment_version = 'post1'
73-
self.internal_version = '220821b'
72+
self.segment_version = 'post2'
73+
self.internal_version = 'M220829a'
7474
version_string = self.get_version_string()
7575
self.software = 'TsuserverDR {}'.format(version_string)
7676
self.version = 'TsuserverDR {} ({})'.format(version_string, self.internal_version)

0 commit comments

Comments
 (0)