Skip to content

fix(product-data): category scope для inline-edit PUT - #454

Merged
biz87 merged 1 commit into
betafrom
fix/issue-444-product-data-category-scope
Jul 29, 2026
Merged

fix(product-data): category scope для inline-edit PUT#454
biz87 merged 1 commit into
betafrom
fix/issue-444-product-data-category-scope

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Закрывает #444: inline-edit в гриде «Товары категории» шлёт PUT /api/mgr/product-data/{id} без привязки к категории — можно было менять данные чужого товара по id.

Threat model: при наличии category_id в теле запроса backend проверяет, что msProduct.parent входит в тот же scope, что и list-фильтр грида (parent = categoryId или nested descendants). Поля category_id / nested вырезаются до updateProductData(). Без category_id поведение прежнее — нужно для вкладки ProductDataFields (редактирование карточки товара вне контекста категории).

Vue-грид теперь всегда передаёт category_id + nested при inline-save.

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

  • Исправление бага (non-breaking change)

Связанные Issues

Closes #444

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

cd core/components/minishop3
php -l src/Services/Category/CategoryProductScopePolicy.php   # exit 0
php -l src/Services/Category/CategoryProductsListService.php  # exit 0
php -l src/Controllers/Api/ProductDataController.php          # exit 0
php tests/CategoryProductScopePolicyTest.php                  # exit 0
php tests/run-smoke.php                                       # exit 0 (11/11)

cd ../../../vueManager
npx eslint src/composables/useCategoryProductsInlineEdit.js src/components/CategoryProductsGrid.vue  # exit 0

Ручной сценарий:

  1. Mgr → категория A → inline-edit поля товара из A — OK.
  2. PUT /product-data/{foreignId} с category_id=A, nested=0 для товара из другой категории — 403 + lexicon ms3_err_product_not_in_category_scope.
  3. PUT /product-data/{id} без category_id из вкладки ProductData — без изменений (global save).

Gate A

AC Код Тест
Scope как list/mutations категории getAllowedProductParentCategoryIds + isProductInCategoryScope CategoryProductScopePolicyTest
product-data проверяет category context ProductDataController::update manual
Inline-edit из грида передаёт context useCategoryProductsInlineEdit manual

Чеклист

  • Lexicon ru/en (ms3_err_product_not_in_category_scope)
  • CHANGELOG — не требуется по политике релиза

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

Out of scope (отдельный issue): полное закрытие unscoped PUT /product-data/{id} — сломает ProductDataFields.vue. Category-scoped route (/categories/{id}/products/{productId}/data) — возможный follow-up.

Refs #418 — bulk mutations category products пока без scope-check в CategoryProductsController::multiple() (не входит в #444).

@Ibochkarev Ibochkarev added priority: high Важно исправить в ближайшее время bug Something isn't working labels Jul 26, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 July 26, 2026 13:34
@Ibochkarev
Ibochkarev force-pushed the fix/issue-444-product-data-category-scope branch 3 times, most recently from 51efcda to bc21cd5 Compare July 29, 2026 02:05
When category_id is sent with product-data updates, verify the product
belongs to the same parent/nested scope as the category products grid.
Closes #444.
@Ibochkarev
Ibochkarev force-pushed the fix/issue-444-product-data-category-scope branch from bc21cd5 to 32ba6fd Compare July 29, 2026 11:37
@biz87
biz87 merged commit 8c12e88 into beta Jul 29, 2026
3 checks passed
@biz87
biz87 deleted the fix/issue-444-product-data-category-scope branch July 29, 2026 17:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high Важно исправить в ближайшее время

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] ProductData API: PUT /product-data/{id} без привязки к категории (IDOR)

2 participants