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/vouchersnení dostupný anonymně. purchase_vouchernení dostupný anonymně přes publicclientBookingdispatcher.- Staff uživatel nevystaví voucher na službu jiné firmy.