Přeskočit obsah

Vouchery

Entity: Voucher (tabulka vouchers)

Funkce: clientBooking — akce purchase_voucher

Prověřeno proti commitu: rozpracováno

Testy: backend/tests/Feature/Audit/VoucheryAuditTest.php

Routy

Routa Perimetr Ochrana Controller
GET/POST/PUT/DELETE /api/vouchers interní oprávnění payments EntityCrudController CRUD
GET /api/public/vouchers veřejný redeem bez middleware, volitelný filtr code EntityCrudController::publicList
POST /api/public/clientBooking purchase_voucher interní/staff přes public dispatcher staff session FunctionsController::bookingPurchaseVoucher

Opravené nálezy

VOU-04 — Veřejný endpoint bez kódu vypíše všechny vouchery (vysoká)

Stav: opraveno

Test: VOU-04: veřejný voucher list bez kódu nevrací vouchery

Ověřený fakt — vouchers má public_list = true a public filtr code, ale EntityCrudController::publicList nevyžaduje, aby byl filtr skutečně použit. Volání /api/public/vouchers bez q tak pracuje bez WHERE omezení podle kódu.

Oprava — entita vouchers má pro public list povinný filtr code; bez něj endpoint vrací prázdný seznam.

Dopad — veřejný endpoint může prozradit aktivní voucher kódy a umožnit jejich neoprávněné uplatnění. Veřejný redeem má přijmout jen konkrétní neuhodnutelný kód a nikdy nelistovat celý seznam.

VOU-05 — Veřejný voucher lookup vrací interní a prodejní pole (střední)

Stav: opraveno

Test: VOU-05: veřejný voucher lookup nevrací interní a prodejní pole

Ověřený fakt — lookup podle kódu používá obecný public list a vrací kompletní řádek po formatRow(). Pro redeem UI jsou potřeba hlavně id, code, service_id, service_name, status a valid_until, ale odpověď může obsahovat například buyer_client_id, buyer_client_name, purchase_id, price, payment_method, internal_payment_id, invoice_id, invoice_number, purchase_date, export_to_pohoda a company_account_id.

Oprava — public sanitizace pro vouchers vrací jen pole potřebná pro redeem flow.

Dopad — znalost voucher kódu stačí k získání interních/prodejních údajů, které nejsou nutné pro klientské uplatnění voucheru.

Ověřené bez nálezu

  • Interní endpoint /api/vouchers není dostupný anonymně.
  • purchase_voucher není dostupný anonymně přes public clientBooking dispatcher.
  • Staff uživatel nevystaví voucher na službu jiné firmy.