Skip to content

fix(mgr-api): whitelist filter_* на списках customers - #457

Merged
biz87 merged 2 commits into
betafrom
fix/issue-420-customer-filter-whitelist
Jul 29, 2026
Merged

biz87 merged 2 commits into
betafrom
fix/issue-420-customer-filter-whitelist

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

CustomersController::getList принимал любые filter_* и строил LIKE по произвольной колонке. filter_token=<prefix> давал oracle по секретному полю, хотя token не попадает в ответ списка.

Добавлен ManagerListFilterPolicy: whitelist полей UI-фильтров + blocklist секретных колонок. Тот же guard применён к спискам deliveries/payments (как в #420).

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

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

Связанные Issues

Closes #420

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

cd core/components/minishop3
php -l src/Services/Grid/ManagerListFilterPolicy.php   # exit 0
php -l src/Controllers/Api/Manager/CustomersController.php  # exit 0
php -l src/Controllers/Api/Manager/DeliveriesController.php   # exit 0
php -l src/Controllers/Api/Manager/PaymentsController.php     # exit 0
php tests/ManagerListFilterPolicyTest.php            # exit 0
composer ci:php                                    # exit 0 (14 smoke tests)
  • Ручное тестирование
  • Автоматические тесты (composer ci:php)
  • Тестирование на разных версиях PHP/MODX

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

  • MiniShop3: branch fix/issue-420-customer-filter-whitelist
  • MODX: не требовался (smoke без MODX)
  • PHP: 8.2+

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

n/a

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en) — n/a
  • PHPStan проходит без новых ошибок (локально; в CI пока нет)
  • ESLint проходит без ошибок — n/a (Vue не затронут)
  • Обновлён CHANGELOG.md — по политике релиза не требуется

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

Whitelist customers: customer_name, email, phone, is_active (+ alias active).

Blocklist (все grids): token, password, properties, class, validation_rules.

Бонус: customer_name теперь ищет по first_name/last_name (раньше LIKE шёл по несуществующей колонке).

Follow-up: унификация whitelist в OrdersController::applyFilter — отдельная задача.

@Ibochkarev Ibochkarev added priority: medium Средний приоритет bug Something isn't working labels Jul 27, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 July 27, 2026 03:15
@Ibochkarev
Ibochkarev force-pushed the fix/issue-420-customer-filter-whitelist branch 2 times, most recently from 25db24a to b3fe297 Compare July 29, 2026 02:05
Reject filter queries on secret msCustomer columns (token, password)
and route UI filter keys through ManagerListFilterPolicy. Apply the same
guard to deliveries and payments list endpoints.
Move OrdersController applyFilter whitelist into shared policy with explicit
ORDER_FILTER_MAP and blocklist. Align filter param guards with other grids.
@Ibochkarev
Ibochkarev force-pushed the fix/issue-420-customer-filter-whitelist branch from b3fe297 to 12f57d4 Compare July 29, 2026 11:32
@biz87
biz87 merged commit 86120e4 into beta Jul 29, 2026
3 checks passed
@biz87
biz87 deleted the fix/issue-420-customer-filter-whitelist branch July 29, 2026 18:47
biz87 pushed a commit that referenced this pull request Aug 1, 2026
Fixes storefront + account login/session (#285): session did not persist after login, redirects bounced back to login, re-login failed, and the manager password did not match the storefront check.

Backend:
- AuthManager::establishCustomerSession() — mint a fresh API token on login/register (no guest-token upgrade → token fixation safe), transfer the guest cart to the new token when the previous owner is guest/own, revoke the old browser token, session_regenerate_id(true).
- AuthManager::logoutCurrentCustomer() — shared logout for API + snippet: revokes the customer's API tokens, clears session and cookie.
- TokenService::restoreSessionFromCookie() + persistApiToken()/sessionTokenBelongsToCustomer() single mint/hydrate path; a guest token no longer overwrites an authenticated customer_id; resolveOrCreateToken() completed (session → cookie → mint).
- PasswordAuthProvider::normalizeEmail()/hashPassword(); manager update uses the same hash path. SessionHelper::ensureActive().
- web.php: POST /api/v1/customer/logout -> Logout processor (+ tokenMiddleware).

Frontend: ApiClient.getPayload() reads data with an object fallback; AuthUI takes redirect from getPayload.

Adds CustomerAuthNormalizeEmailTest + CustomerAuthSessionSemanticsTest. Rebased on beta (trivial use-import conflict with #457 resolved).

Closes #285.
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: medium Средний приоритет

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Manager API: filter_* на произвольные колонки msCustomer (в т.ч. token oracle)

2 participants