1
0
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:
Otto Winter
2018-04-27 13:15:45 +02:00
committed by Pascal Vizeli
parent 4b06392442
commit 9d1f9fe204
2 changed files with 93 additions and 15 deletions

View File

@@ -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