Исправление неработающего mqttDiscovery в модуле Utilities - #3
Open
goosecrew wants to merge 1 commit into
Open
Conversation
- 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>
goosecrewforce-pushed
the
fix/mqtt-discovery
branch
from
August 25, 2026 18:22
919fb7c to
e39fd30Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что изменено
Utilities.mqttDiscoveryвwb-rules-modules/module_Utilities.jsбыл полностью неработоспособен для единственного реализованного типаswitch— исправлено; попутно устранены сопутствующие проблемы этой же функции. Модуль остаётся на строгом ES5 (движок Duktape).Исправленные баги
device_type: "switch". Переменнаяmessageприсваивалась только вdefault-ветке оператораswitch, но использовалась в блоке публикации, который выполняется только для типа"switch". В результате любой вызов с поддерживаемым типом падал с ошибкой ещё до публикации. Теперь payload сериализуется (JSON.stringify) непосредственно перед публикацией.default-веткеmessageприсваивалась без объявленияvar, создавая случайную глобальную переменную, общую для всего движка. Ветка теперь просто логирует JSON сущности.mosquitto_pubбез экранирования: одиночная кавычка в имени устройства/контрола или вsuggested_area(например, «Masha's room») ломала команду и открывала возможность инъекции shell-команд. Добавлен хелперquoteForShell(стандартное экранирование'\''), через который теперь проходят все подставляемые значения.Тестирование
Node.js-стенд (vm-песочница с заглушками
log/runShellCommand) плюс прогон сгенерированных команд через настоящий bash с заглушкойmosquitto_pub— 20 проверок:"switch"публикует две команды и возвращаетtrue;homeassistant/switch/<device>_<control>/config,.../meta/errorс retain) и структуры discovery-payload для Home Assistant — payload раскавычивается bash'ем и сверяется черезJSON.parseполе в поле;light/cover/sensor) и неизвестные типы возвращаютfalseбез публикации и без исключений;'; echo INJECTED; 'не исполняется и остаётся литеральными данными внутри JSON.Поведение не расширялось: типы
light/cover/sensor, как и раньше, не реализованы.🤖 Generated with Claude Code