mirivlad
f769daa617
fix(plugins): JSON-serialize CallFunctionJSON return values + backward compat Lua args
...
Root cause: CallFunctionJSON used .String() on Lua return values, which
for tables produces 'table: 0x...' — not valid JSON. Frontend does
JSON.parse() on the result and silently caught the parse error.
Fix:
- runtime.go: convert Lua return value to JSON via luaValueToGo +
json.Marshal so tables become proper JSON arrays/objects
- main.lua: add backward compat in get_events() and update_event()
to accept both positional args (start, end) and table params
- CalendarPluginPage.svelte: show errors in UI instead of silent catch;
restructure template to always show iframe + error overlay
2026-06-08 11:31:18 +08:00
mirivlad
45cfe1b0a6
fix: финальный cleanup Lua plugin lifecycle
...
1. ActivatePlugin → error return:
- Возвращает ошибки при создании VM, загрузке main.lua, scheduler setup
- on_init failure = non-fatal (logged, activation continues)
- SetPluginEnabled сохраняет EnabledPlugins в config ТОЛЬКО после успешной активации
- При ошибке активации — rollback (deactivate + не сохраняем в config)
2. CallPluginFunction fully thread-safe:
- Новый метод LuaVM.CallFunctionJSON(segments, paramsJSON)
- JSON→Lua conversion происходит под vm.mu (внутри lock)
- Убраны parseParamsToLua/goToLua из bindings_plugins.go
- goToLua перенесён в runtime.go (под lock)
3. PluginPage → CalendarPluginPage:
- Компонент явно календарный (get-events/create-event/update-event/delete-event)
- Переименован для ясности
- Console log префиксы обновлены
4. Тесты:
- TestSetPluginEnabled_ActivateFails_NoConfigSave: проверяет что при ошибке
активации плагин НЕ сохраняется в EnabledPlugins
- TestActivatePlugin_ErrorReturn: проверяет все режимы ошибок
- TestCallFunctionJSON_ThreadSafe: JSON object/array/empty params
- TestDeactivatePlugin_Idempotent: двойная деактивация = no-op
- TestInitRuntimes_SkipsDisabled: только Enabled плагины активируются
2026-06-07 22:58:26 +08:00
mirivlad
d83c8c80e1
fix: второй стабилизационный проход Lua plugin lifecycle
...
1. Enabled/Active state separation:
- Enable() sets Enabled=true (persisted in config), does NOT create runtime
- ActivatePlugin() checks Enabled && !Active, creates VM + scheduler
- DeactivatePlugin() stops runtime, keeps Enabled=true
- InitRuntimes() iterates Enabled plugins, sets Active=true after creation
- SyncConfig() restores Enabled from config, does NOT touch Active
2. ActivatePlugin: добавлен vm.SetServices(m.Services)
3. Discover: атомарная замена списка (newPlugins slice), нет дублирования
4. CallPluginFunction: thread-safe через LuaVM.CallFunction (vm.mu + callWithTimeout)
5. Uninstall активного плагина: полная деактивация (StopScheduler → on_shutdown → CloseVM → Active=false)
6. GetPluginPanelHTML: валидация panel path (no absolute, no .., must be .html, must be within plugin dir)
7. PluginPage: убран hardcoded 'calendar-plugin', используется funcPrefix из pluginName
Тесты:
- security_test.go: +8 тестов (FullLifecycle, ActivatePlugin_Services, Discover_Idempotent,
ReloadPlugins_NoDuplicates, CallPluginFunction_Timeout, Uninstall_ActivePlugin,
GetPluginPanelHTML_PathTraversal, FullLifecycle_EndToEnd)
- manager_test.go: обновлены тесты под новую семантику Enabled/Active
2026-06-07 20:49:43 +08:00
mirivlad
4df83cd361
security: стабилизационный аудит Lua plugin system
...
Исправления:
- Install: идемпотентность (no duplicates in InstalledPlugins)
- ReloadPlugins: StopSchedulers + CallShutdownHooks перед CloseRuntimes
- StopSchedulers: обнуление scheduler=nil после остановки
- Scheduler.Stop: обнуление tasks после wg.Wait
- Lua sandbox: блокировка package.loadlib/seeall/preload/loaders/loaded/path/cpath/config/searchpath
- Lua sandbox: блокировка load (глобальная функция)
- CallPluginFunction: валидация funcName (regex [a-zA-Z_][a-zA-Z0-9_]*, max 3 segments)
- CallPluginFunction: убрана строковая сборка Lua-кодa, вызов через PCall напрямую
- PluginPage.svelte: проверка e.source === iframeEl.contentWindow
- PluginPage.svelte: type checking для msg.source, msg.action
Тесты:
- security_test.go: 18 новых тестов (sandbox, lifecycle, validation)
- Все существующие тесты проходят
Документация:
- docs/plugins-security.md: модель безопасности, sandbox, протокол, lifecycle
2026-06-07 19:19:44 +08:00