PR #282 merged: fix: маскировать env-переменные БД по умолчанию и учитывать reveal (#276)
Закрывает #276.
Суть проблемы
Действие list инструмента env_vars обещает (в собственном описании инструмента), что значения секретов по умолчанию маскируются как *** и отдаются в открытом виде только при явном reveal=true. Для приложений и сервисов это так и работает. Для баз данных — нет:
CoolifyClient.listDatabaseEnvVars(uuid)вызывался без опций и не содержал логики маскирования — возвращал сырой ответ API, то есть все значения в открытом виде.- Флаг
revealникуда не пробрасывался и просто игнорировался:true,falseили отсутствие флага давали один и тот же открытый текст.
Env-переменные базы данных — самые чувствительные данные, к которым прикасается этот сервер (пароли, строки подключения), поэтому баг обходил ровно ту защиту, ради которой существует слой маскирования, и молча противоречил заявленному в документации поведению по умолчанию.
Исправление
listDatabaseEnvVarsтеперь принимаетoptions?: { reveal?: boolean }и по умолчанию маскируетvalue/real_valueчерезmaskEnvVar, отдавая открытый текст только приreveal === true— идентичноlistServiceEnvVars.- Ветка
database→listинструментаenv_varsтеперь пробрасываетrevealв клиент.
Тесты
- Клиент (
coolify-client.test.ts): маска по умолчанию,reveal=trueвозвращает открытый текст,reveal=falseмаскирует. Обновлён старый тест «should list database env vars», который ожидал открытый текст. - Инструмент (
mcp-server.test.ts):revealпробрасывается вlistDatabaseEnvVars; вызов по умолчанию передаётreveal: undefined, поэтому значения остаются замаскированными. - Смоук (
smoke.integration.test.ts): находит живую базу данных, проверяет, что список по умолчанию полностью замаскирован, аreveal=trueвозвращает реальные значения.
npm test → 424 теста проходят. npm run build / npm run lint чисто (только ранее существовавшие предупреждения).
О проверке на живом инстансе
Живую репродукцию на момент ревью воспроизвести не удалось: инстанс из .env отдаёт HTTP 503, а на доступном netcup-эстейте у обеих баз (Dragonfly/Redis) не заданы env-переменные. Корневая причина однозначна по коду и полностью покрыта юнит-тестами; добавленный смоук-тест прогонит сценарий вживую, как только будет доступна БД с переменными.