Skip to content

Единая валидация context в публичном каталоге - #665

Open
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-658-catalog-context-validation
Open

Единая валидация context в публичном каталоге#665
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-658-catalog-context-validation

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Публичные каталожные эндпоинты принимали context только через trim(). Правила выровнены с CatalogResolve::sanitizeContext из #644 (на beta ещё нет): charset [a-zA-Z0-9_-]+, длина ≤ 100, запрет префикса mgr.

Явный невалидный context → HTTP 400 (ms3_err_catalog_context_invalid). Пустой / отсутствующий параметр → прежний fallback. Fallback-ключ тоже проходит тот же валидатор (иначе web). В product/filters контекст проверяется до чтения facet-кэша.

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Клиенты, которые слали context=mgr или мусор и получали пустой список / «как получится», теперь получают 400.

Связанные Issues

Closes #658

Как это было протестировано?

cd core/components/minishop3
php -l src/Services/Catalog/CatalogQuery.php
php -l src/Services/Catalog/CatalogContextException.php
php -l src/Services/Product/ProductFacetService.php
php -l src/Controllers/Api/Web/ProductController.php
php -l src/Controllers/Api/Web/CategoryController.php
php tests/CatalogQueryTest.php

Результаты: php -l OK, CatalogQueryTest OK, exit 0.

  • Ручное тестирование
  • Автоматические тесты (composer ci:php / composer test, npm run lint:ci, composer stan / GitHub Actions CI)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка fix/issue-658-catalog-context-validation от beta
  • MODX: n/a (smoke unit)
  • PHP: локальный CLI 8.x

Скриншоты (если применимо)

До После

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint проходит без ошибок (npm run lint:ci для Vue)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

CatalogResolve на beta ещё нет: CatalogQuery::sanitizeContext() готов к делегированию после merge #644. Объединение CatalogContextException с ProductCatalogFilterException в один base-тип отложено.

Reject invalid explicit context (charset, length, mgr*) with HTTP 400
across product/category catalog paths, and sanitize fallback keys so
manager context cannot slip into queries via modx->context->key.
@Ibochkarev Ibochkarev added priority: low Низкий приоритет, когда будет время tech-debt Maintainability / refactor / architecture debt labels Sep 8, 2026
@Ibochkarev Ibochkarev self-assigned this Sep 8, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 September 8, 2026 03:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

priority: low Низкий приоритет, когда будет время tech-debt Maintainability / refactor / architecture debt

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Публичный каталог не валидирует параметр context (асимметрия с CatalogResolve)

1 participant