Skip to content

Исправление неработающего mqttDiscovery в модуле Utilities - #3

Open
goosecrew wants to merge 1 commit into
bthos:mainfrom
goosecrew:fix/mqtt-discovery
Open

Исправление неработающего mqttDiscovery в модуле Utilities#3
goosecrew wants to merge 1 commit into
bthos:mainfrom
goosecrew:fix/mqtt-discovery

Conversation

@goosecrew

Copy link
Copy Markdown

Что изменено

Utilities.mqttDiscovery в wb-rules-modules/module_Utilities.js был полностью неработоспособен для единственного реализованного типа switch — исправлено; попутно устранены сопутствующие проблемы этой же функции. Модуль остаётся на строгом ES5 (движок Duktape).

Исправленные баги

  • ReferenceError при вызове с device_type: "switch". Переменная message присваивалась только в default-ветке оператора switch, но использовалась в блоке публикации, который выполняется только для типа "switch". В результате любой вызов с поддерживаемым типом падал с ошибкой ещё до публикации. Теперь payload сериализуется (JSON.stringify) непосредственно перед публикацией.
  • Неявная глобальная переменная. В default-ветке message присваивалась без объявления var, создавая случайную глобальную переменную, общую для всего движка. Ветка теперь просто логирует JSON сущности.
  • Отсутствие экранирования аргументов shell-команды. Топики и JSON-payload подставлялись в строку mosquitto_pub без экранирования: одиночная кавычка в имени устройства/контрола или в suggested_area (например, «Masha's room») ломала команду и открывала возможность инъекции shell-команд. Добавлен хелпер quoteForShell (стандартное экранирование '\''), через который теперь проходят все подставляемые значения.

Тестирование

Node.js-стенд (vm-песочница с заглушками log/runShellCommand) плюс прогон сгенерированных команд через настоящий bash с заглушкой mosquitto_pub — 20 проверок:

  • регрессия на ReferenceError: вызов с "switch" публикует две команды и возвращает true;
  • корректность топиков (homeassistant/switch/<device>_<control>/config, .../meta/error с retain) и структуры discovery-payload для Home Assistant — payload раскавычивается bash'ем и сверяется через JSON.parse поле в поле;
  • нереализованные (light/cover/sensor) и неизвестные типы возвращают false без публикации и без исключений;
  • значения с одиночными кавычками и shell-метасимволами доходят до MQTT байт-в-байт: попытка инъекции '; echo INJECTED; ' не исполняется и остаётся литеральными данными внутри JSON.

Поведение не расширялось: типы light/cover/sensor, как и раньше, не реализованы.

🤖 Generated with Claude Code

- mqttDiscovery падал с ReferenceError на типе устройства "switch":
переменная message присваивалась только в ветке default оператора
switch, а использовалась в блоке публикации, поэтому единственный
реализованный тип устройства не работал ни разу. Теперь полезная
нагрузка сериализуется в JSON непосредственно перед публикацией.
- Ветка default присваивала message без объявления, создавая случайную
глобальную переменную; теперь она просто логирует JSON сущности.
- Топики и полезная нагрузка пропускаются через хелпер экранирования
для шелла, поэтому значения с одинарными кавычками больше не ломают
командную строку mosquitto_pub и не позволяют подставить свои
команды.
Проверено на стенде под Node.js (песочница vm с перехватом
runShellCommand) плюс реальный прогон сформированных команд через bash
с подменённым mosquitto_pub: топики и полезная нагрузка проходят
экранирование байт в байт, включая значения с одинарными кавычками и
метасимволами шелла (20 проверок).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@goosecrew