Résumé complet de l'audit de sécurité
Ce qui a été corrigé
app/Livewire/QuoteLine.php — 9 méthodes sécurisées
Méthode | Correctif appliqué
-- | --
storeQuoteLine() | Vérifie quotes_id === QuoteId
editQuoteLine($id) | Vérifie que la ligne appartient au devis courant
updateQuoteLine() | Vérifie que quote_lines_id appartient au devis courant
enableCalculatedPrice($id) | Vérification ownership
disableCalculatedPrice($id) | Vérification ownership
upQuoteLine($id) | Vérification ownership
downQuoteLine($id) | Vérification ownership
duplicateLine($id) | Vérification ownership
createProduct($id) | Vérification ownership
breakDown($id) | Vérification ownership
applyPriceIncreaseToAllLines() | abort_unless(auth()->check())
storeOrder($quoteId) | Vérifie quoteId === QuoteId
Route guest NC + contrôleur
- routes/web.php :
/guest/nonConformitie/{uuid}/{id} — le UUID de livraison est maintenant requis - QualityNonConformityController.php : vérifie que la ligne de livraison appartient au UUID fourni
- guest-delivery-info.blade.php : le lien inclut le UUID
app/Models/Workflow/Orders.php
'id' retiré de $fillable (mass-assign de la PK = toujours faux)
Résumé complet de l'audit de sécurité
Ce qui a été corrigé
[app/Livewire/QuoteLine.php](vscode-webview://1ee0llmsdfm3lei7d2ssnjlsu31562b20pnlt2nu908vd4s8l3db/app/Livewire/QuoteLine.php) — 9 méthodes sécurisées
Méthode Correctif appliqué
storeQuoteLine() Vérifie quotes_id === QuoteId
editQuoteLine($id) Vérifie que la ligne appartient au devis courant
updateQuoteLine() Vérifie que quote_lines_id appartient au devis courant
enableCalculatedPrice($id) Vérification ownership
disableCalculatedPrice($id) Vérification ownership
upQuoteLine($id) Vérification ownership
downQuoteLine($id) Vérification ownership
duplicateLine($id) Vérification ownership
createProduct($id) Vérification ownership
breakDown($id) Vérification ownership
applyPriceIncreaseToAllLines() abort_unless(auth()->check())
storeOrder($quoteId) Vérifie quoteId === QuoteId
app/Livewire/OrderLine.php — 5 méthodes sécurisées
Méthode Correctif appliqué
edit($id) Vérifie que la ligne appartient à la commande courante
enableCalculatedPrice($id) Vérification ownership
disableCalculatedPrice($id) Vérification ownership
duplicateLine($id) Vérification ownership
applyPriceIncreaseToAllLines() abort_unless(auth()->check())
Route guest NC + contrôleur
routes/web.php : /guest/nonConformitie/{uuid}/{id} — le UUID de livraison est maintenant requis
QualityNonConformityController.php : vérifie que la ligne de livraison appartient au UUID fourni
guest-delivery-info.blade.php : le lien inclut le UUID
app/Models/Workflow/Orders.php
'id' retiré de $fillable (mass-assign de la PK = toujours faux)
Ce qui reste à corriger manuellement (non fait — risque réel mais scope plus large)
- Champs de révision dans les FormRequests — CRITIQUE
UpdateQuoteRequest et UpdateOrderRequest autorisent reviewed_by, review_decision, change_approved_at dans le formulaire standard. N'importe quel utilisateur authentifié peut s'auto-approuver un devis/commande via POST.
Correctif requis dans app/Http/Requests/Workflow/UpdateQuoteRequest.php et UpdateOrderRequest.php — créer une route dédiée POST /quotes/{id}/review protégée par rôle, et retirer ces champs de la validation de l'update général.
- Autres composants Livewire — CRITIQUE
Les composants QuotesIndex, OrdersIndex, ProductsIndex, InvoicesRequest, DeliverysRequest, CompaniesLines ont les mêmes problèmes de storeXxx sans ownership check. Appliquer le même pattern abort_unless(auth()->check(), 403) sur leurs méthodes store/create.
- $fillable — Analyse finale
Les modèles QuoteLines et OrderLines ont selling_price, discount, delivery_status, invoice_status dans $fillable. Le vrai risque n'est pas le $fillable en soi (protégé par Livewire + validation) mais l'absence de vérification de rôle avant de laisser un utilisateur modifier ces champs financiers. À protéger par un rôle can-edit-prices via spatie/laravel-permission (déjà installé).
- /pointage et /order/ratings sans auth
Ces routes sont volontairement publiques (terminaux atelier, feedback client). Acceptable en contexte interne à condition que le serveur soit derrière un VPN ou réseau privé. À documenter explicitement.
Résumé complet de l'audit de sécurité
Ce qui a été corrigé
app/Livewire/QuoteLine.php — 9 méthodes sécurisées
Méthode | Correctif appliqué -- | -- storeQuoteLine() | Vérifie quotes_id === QuoteId editQuoteLine($id) | Vérifie que la ligne appartient au devis courant updateQuoteLine() | Vérifie que quote_lines_id appartient au devis courant enableCalculatedPrice($id) | Vérification ownership disableCalculatedPrice($id) | Vérification ownership upQuoteLine($id) | Vérification ownership downQuoteLine($id) | Vérification ownership duplicateLine($id) | Vérification ownership createProduct($id) | Vérification ownership breakDown($id) | Vérification ownership applyPriceIncreaseToAllLines() | abort_unless(auth()->check()) storeOrder($quoteId) | Vérifie quoteId === QuoteIdRoute guest NC + contrôleur
/guest/nonConformitie/{uuid}/{id}— le UUID de livraison est maintenant requisapp/Models/Workflow/Orders.php
Résumé complet de l'audit de sécurité Ce qui a été corrigé [app/Livewire/QuoteLine.php](vscode-webview://1ee0llmsdfm3lei7d2ssnjlsu31562b20pnlt2nu908vd4s8l3db/app/Livewire/QuoteLine.php) — 9 méthodes sécurisées'id'retiré de$fillable(mass-assign de la PK = toujours faux)Méthode Correctif appliqué
storeQuoteLine() Vérifie quotes_id === QuoteId
editQuoteLine($id) Vérifie que la ligne appartient au devis courant
updateQuoteLine() Vérifie que quote_lines_id appartient au devis courant
enableCalculatedPrice($id) Vérification ownership
disableCalculatedPrice($id) Vérification ownership
upQuoteLine($id) Vérification ownership
downQuoteLine($id) Vérification ownership
duplicateLine($id) Vérification ownership
createProduct($id) Vérification ownership
breakDown($id) Vérification ownership
applyPriceIncreaseToAllLines() abort_unless(auth()->check())
storeOrder($quoteId) Vérifie quoteId === QuoteId
app/Livewire/OrderLine.php — 5 méthodes sécurisées
Méthode Correctif appliqué
edit($id) Vérifie que la ligne appartient à la commande courante
enableCalculatedPrice($id) Vérification ownership
disableCalculatedPrice($id) Vérification ownership
duplicateLine($id) Vérification ownership
applyPriceIncreaseToAllLines() abort_unless(auth()->check())
Route guest NC + contrôleur
routes/web.php : /guest/nonConformitie/{uuid}/{id} — le UUID de livraison est maintenant requis
QualityNonConformityController.php : vérifie que la ligne de livraison appartient au UUID fourni
guest-delivery-info.blade.php : le lien inclut le UUID
app/Models/Workflow/Orders.php
'id' retiré de $fillable (mass-assign de la PK = toujours faux)
Ce qui reste à corriger manuellement (non fait — risque réel mais scope plus large)
UpdateQuoteRequest et UpdateOrderRequest autorisent reviewed_by, review_decision, change_approved_at dans le formulaire standard. N'importe quel utilisateur authentifié peut s'auto-approuver un devis/commande via POST.
Correctif requis dans app/Http/Requests/Workflow/UpdateQuoteRequest.php et UpdateOrderRequest.php — créer une route dédiée POST /quotes/{id}/review protégée par rôle, et retirer ces champs de la validation de l'update général.
Les composants QuotesIndex, OrdersIndex, ProductsIndex, InvoicesRequest, DeliverysRequest, CompaniesLines ont les mêmes problèmes de storeXxx sans ownership check. Appliquer le même pattern abort_unless(auth()->check(), 403) sur leurs méthodes store/create.
Les modèles QuoteLines et OrderLines ont selling_price, discount, delivery_status, invoice_status dans $fillable. Le vrai risque n'est pas le $fillable en soi (protégé par Livewire + validation) mais l'absence de vérification de rôle avant de laisser un utilisateur modifier ces champs financiers. À protéger par un rôle can-edit-prices via spatie/laravel-permission (déjà installé).
Ces routes sont volontairement publiques (terminaux atelier, feedback client). Acceptable en contexte interne à condition que le serveur soit derrière un VPN ou réseau privé. À documenter explicitement.