mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
Improve MQTT topic validation (#14099)
* Improve MQTT topic validation * Fix test * Improve length check
This commit is contained in:
committed by
Pascal Vizeli
parent
4b06392442
commit
9d1f9fe204
@@ -131,10 +131,56 @@ class TestMQTTComponent(unittest.TestCase):
|
||||
self.hass.data['mqtt'].async_publish.call_args[0][2], 2)
|
||||
self.assertFalse(self.hass.data['mqtt'].async_publish.call_args[0][3])
|
||||
|
||||
def test_invalid_mqtt_topics(self):
|
||||
"""Test invalid topics."""
|
||||
def test_validate_topic(self):
|
||||
"""Test topic name/filter validation."""
|
||||
# Invalid UTF-8, must not contain U+D800 to U+DFFF.
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_topic, '\ud800')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_topic, '\udfff')
|
||||
# Topic MUST NOT be empty
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_topic, '')
|
||||
# Topic MUST NOT be longer than 65535 encoded bytes.
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_topic, 'ü' * 32768)
|
||||
# UTF-8 MUST NOT include null character
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_topic, 'bad\0one')
|
||||
|
||||
# Topics "SHOULD NOT" include these special characters
|
||||
# (not MUST NOT, RFC2119). The receiver MAY close the connection.
|
||||
mqtt.valid_topic('\u0001')
|
||||
mqtt.valid_topic('\u001F')
|
||||
mqtt.valid_topic('\u009F')
|
||||
mqtt.valid_topic('\u009F')
|
||||
mqtt.valid_topic('\uffff')
|
||||
|
||||
def test_validate_subscribe_topic(self):
|
||||
"""Test invalid subscribe topics."""
|
||||
mqtt.valid_subscribe_topic('#')
|
||||
mqtt.valid_subscribe_topic('sport/#')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'sport/#/')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'foo/bar#')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'foo/#/bar')
|
||||
|
||||
mqtt.valid_subscribe_topic('+')
|
||||
mqtt.valid_subscribe_topic('+/tennis/#')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'sport+')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'sport+/')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'sport/+1')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'sport/+#')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'bad+topic')
|
||||
mqtt.valid_subscribe_topic('sport/+/player1')
|
||||
mqtt.valid_subscribe_topic('/finance')
|
||||
mqtt.valid_subscribe_topic('+/+')
|
||||
mqtt.valid_subscribe_topic('$SYS/#')
|
||||
|
||||
def test_validate_publish_topic(self):
|
||||
"""Test invalid publish topics."""
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_publish_topic, 'pub+')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_publish_topic, 'pub/+')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_publish_topic, '1#')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_publish_topic, 'bad+topic')
|
||||
self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'bad\0one')
|
||||
mqtt.valid_publish_topic('//')
|
||||
|
||||
# Topic names beginning with $ SHOULD NOT be used, but can
|
||||
mqtt.valid_publish_topic('$SYS/')
|
||||
|
||||
|
||||
# pylint: disable=invalid-name
|
||||
|
||||
Reference in New Issue
Block a user