retval = self._shortcmd('STAT')
rets = retval.split()
if self._debugging: print('*stat*', repr(rets))
- numMessages = int(rets[1])
- sizeMessages = int(rets[2])
+
+ # Check if the response has enough elements
+ # RFC 1939 requires at least 3 elements (+OK, message count, mailbox size)
+ # but allows additional data after the required fields
+ if len(rets) < 3:
+ raise error_proto("Invalid STAT response format")
+
+ try:
+ numMessages = int(rets[1])
+ sizeMessages = int(rets[2])
+ except ValueError:
+ raise error_proto("Invalid STAT response data: non-numeric values")
+
return (numMessages, sizeMessages)
def test_stat(self):
self.assertEqual(self.client.stat(), (10, 100))
+ original_shortcmd = self.client._shortcmd
+ def mock_shortcmd_invalid_format(cmd):
+ if cmd == 'STAT':
+ return b'+OK'
+ return original_shortcmd(cmd)
+
+ self.client._shortcmd = mock_shortcmd_invalid_format
+ with self.assertRaises(poplib.error_proto):
+ self.client.stat()
+
+ def mock_shortcmd_invalid_data(cmd):
+ if cmd == 'STAT':
+ return b'+OK abc def'
+ return original_shortcmd(cmd)
+
+ self.client._shortcmd = mock_shortcmd_invalid_data
+ with self.assertRaises(poplib.error_proto):
+ self.client.stat()
+
+ def mock_shortcmd_extra_fields(cmd):
+ if cmd == 'STAT':
+ return b'+OK 1 2 3 4 5'
+ return original_shortcmd(cmd)
+
+ self.client._shortcmd = mock_shortcmd_extra_fields
+
+ result = self.client.stat()
+ self.assertEqual(result, (1, 2))
+
+ self.client._shortcmd = original_shortcmd
+
def test_list(self):
self.assertEqual(self.client.list()[1:],
([b'1 1', b'2 2', b'3 3', b'4 4', b'5 5'],