Repository navigation
fix(webhooks): bound the size of watch paths and deploy when a pattern cannot be evaluated - #259
Merged
Merged
Conversation
…n cannot be evaluated Что: у watchPaths появились ограничения: не больше 64 путей по 256 символов (watchPathsSchema в utils/watch-paths/limits.ts; подключена в createSchema приложения и compose, поэтому действует во всех apiSave*Provider, apiUpdateApplication и apiUpdateCompose). shouldDeploy не разбирает слишком большой набор и оборачивает micromatch в try/catch: и в том, и в другом случае деплой запускается, в лог идёт предупреждение без самих шаблонов. Зачем: проверка зависимостей через cve-now нашла braces 3.0.3 (CVE-2026-93687, высокая, исправления нет). Измерение на micromatch 4.0.8 показало, что форк её не затрагивает: micromatch(files, patterns) идёт в picomatch и до braces не доходит (braces зовутся только из micromatch.parse, .braces и .braceExpand); формы шаблонов с переполнением стека и взрывом раскрытия ({a,b} подряд до предела длины) через этот вызов завершаются за миллисекунды. Зато сам разбор вложенных скобок в picomatch растёт квадратично, а длина watchPaths не была ограничена: шаблон из 40 000 символов блокировал цикл событий на 8,6 с под Bun, на Node заканчивался SyntaxError после 8 с. Кроме того, пустая строка в watchPaths делала micromatch TypeError ("Expected pattern to be a non-empty string"), и обработчик вебхука падал. Риски: путь длиннее 256 символов или больше 64 путей нельзя сохранить, API вернёт сообщение схемы (формы показывают ошибку сохранения). Уже сохранённые длинные шаблоны не ломаются, а ведут к деплою на каждый пуш, пока их не сократят. Обычные шаблоны (src/**, {apps,packages}/*/src/**, !tests/**) оцениваются как раньше. Проверки на Linux, Bun 1.4.4, Node 26.13.0: server:build, typecheck и biome проходят; should-deploy.test.ts 17 из 17 (было 10: добавлены оценка слишком большого шаблона за миллисекунды, 65 путей, путь ровно в 256 символов, пустой путь, схемы приложения и compose); unit-тесты: 6136 прошли, 2 упали, и каждый из них так же падает на базовой ветке (backup-files под нагрузкой, service-webhook-secret обращается к настоящему Bitbucket API). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
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 free
to 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.
Зачем
Проверка зависимостей через cve-now нашла
braces3.0.3 (CVE-2026-93687 / GHSA-vfj7-8cjw-p6xm, высокая, исправленной версии нет).bracesприходит черезmicromatch, который форк вызывает в одном месте,shouldDeploy, на шаблонахwatchPaths.Я проверил, достижима ли она. На
micromatch4.0.8 сbraces3.0.3 (VM, Bun 1.4.4 и Node 26.13.0):micromatch(files, patterns)не доходит доbraces:bracesзовутся только изmicromatch.parse,micromatch.bracesиmicromatch.braceExpand. Все формы шаблонов с переполнением стека или взрывом раскрытия (подряд идущие{a,b}почти до предельной длины) на этом вызове завершаются за миллисекунды. CVE форка не затрагивает.watchPathsнет ограничения длины, а разбор вложенных скобок вpicomatchрастёт квадратично. Шаблон из 40 000 символов блокирует цикл событий на 8,6 с под Bun (на NodeSyntaxErrorпосле 8 с), а такой запрос приходит на каждый вебхук. Шаблон мог задать пользователь с правом менять сервис.watchPathsзаставляетmicromatchброситьTypeError: Expected pattern to be a non-empty string; обработчик вебхука падал.Что изменилось
packages/server/src/utils/watch-paths/limits.ts:watchPathsSchema— не больше 64 путей по 256 символов.db/schema/application.tsиdb/schema/compose.ts: полеwatchPathsвcreateSchemaтеперь использует эту схему. ЧерезcreateSchemaидутapiSave{Github,Gitlab,Bitbucket,Gitea,Git}Provider,apiUpdateApplicationиapiUpdateCompose, так что ограничение действует на всех путях сохранения.shouldDeploy: слишком большой набор не разбирается,micromatchобёрнут вtry/catch. В обоих случаях деплой запускается (как при пустомwatchPaths), в лог идёт предупреждение без самих шаблонов.should-deploy.test.ts10 → 17 тестов.Что меняется для пользователей
src/**,{apps,packages}/*/src/**,!tests/**) на порядки короче.Проверки
Linux, Bun 1.4.4, Node 26.13.0:
bun run server:build,bun run typecheck,biome checkпо изменённым файлам проходят.should-deploy.test.ts: 17 из 17.backup-files(таймаут под нагрузкой) иservice-webhook-secret > Bitbucket(обращается к настоящему Bitbucket API).Что проверить вручную на dev
watchPathsс обычным шаблоном проходит; с шаблоном длиннее 256 символов форма показывает ошибку.watchPathsпо-прежнему запускает или пропускает деплой.🤖 Generated with Claude Code