From 159b6c8c3cb82db638570d43da668708604cc744 Mon Sep 17 00:00:00 2001 From: tursunboyevjavohir951-cmd Date: Mon, 20 Jul 2026 14:05:41 +0500 Subject: [PATCH] fix(csrf): add @csrf to all 92 Blade POST forms safely V3 script: correctly handles Blade {{ }} expressions inside form attributes by skipping over {{ }} blocks when finding the closing >. No Blade expressions were broken. No forms left unprotected. Forms now properly include @csrf directive after the opening form tag, inside the form body. VerifyCsrfToken middleware enabled in HttpKernel.php. Routes api/*, cron/*, webhook/*, install/* remain CSRF-exempt. Co-Authored-By: Claude --- app/Core/Http/HttpKernel.php | 5 ++--- app/Domain/Api/Templates/apiKey.blade.php | 1 + app/Domain/Api/Templates/delKey.blade.php | 1 + app/Domain/Api/Templates/newAPIKey.blade.php | 1 + app/Domain/Auth/Templates/requestPwLink.blade.php | 1 + app/Domain/Auth/Templates/resetPw.blade.php | 1 + app/Domain/Auth/Templates/userInvite.blade.php | 1 + app/Domain/Auth/Templates/userInvite2.blade.php | 1 + app/Domain/Auth/Templates/userInvite3.blade.php | 1 + app/Domain/Auth/Templates/userInvite4.blade.php | 1 + app/Domain/Auth/Templates/userInvite5.blade.php | 1 + app/Domain/Blueprints/Templates/boardDialog.blade.php | 1 + app/Domain/Blueprints/Templates/canvasDialog.blade.php | 1 + app/Domain/Blueprints/Templates/delCanvas.blade.php | 1 + app/Domain/Blueprints/Templates/delCanvasItem.blade.php | 1 + app/Domain/Calendar/Templates/delEvent.blade.php | 1 + app/Domain/Calendar/Templates/delExternalCal.blade.php | 1 + app/Domain/Calendar/Templates/editEvent.blade.php | 1 + .../Calendar/Templates/editExternalCalendar.blade.php | 1 + app/Domain/Calendar/Templates/export.blade.php | 1 + app/Domain/Calendar/Templates/importGCal.blade.php | 1 + app/Domain/Calendar/Templates/showAllGCals.blade.php | 1 + app/Domain/Canvas/Templates/boardDialog.blade.php | 1 + app/Domain/Canvas/Templates/canvasDialog.blade.php | 1 + app/Domain/Canvas/Templates/delCanvas.blade.php | 1 + app/Domain/Canvas/Templates/delCanvasItem.blade.php | 1 + app/Domain/Clients/Templates/delClient.blade.php | 1 + app/Domain/Clients/Templates/editClient.blade.php | 1 + app/Domain/Clients/Templates/newClient.blade.php | 1 + app/Domain/Comments/Templates/showAll.blade.php | 1 + .../Comments/Templates/submodules/generalComment.blade.php | 1 + app/Domain/Connector/Templates/integrationEntity.blade.php | 1 + app/Domain/Connector/Templates/integrationFields.blade.php | 1 + app/Domain/Dashboard/Templates/show.blade.php | 1 + app/Domain/Goalcanvas/Templates/bigRockDialog.blade.php | 1 + app/Domain/Goalcanvas/Templates/canvasDialog.blade.php | 1 + app/Domain/Goalcanvas/Templates/delCanvasItem.blade.php | 1 + app/Domain/Help/Templates/firstTaskStep.blade.php | 1 + app/Domain/Help/Templates/inviteTeamStep.blade.php | 1 + app/Domain/Help/Templates/projectDefinitionStep.blade.php | 1 + app/Domain/Help/Templates/projectIntroStep.blade.php | 1 + app/Domain/Ideas/Templates/advancedBoards.blade.php | 2 ++ app/Domain/Ideas/Templates/delCanvas.blade.php | 1 + app/Domain/Ideas/Templates/delCanvasItem.blade.php | 1 + app/Domain/Ideas/Templates/ideaDialog.blade.php | 1 + app/Domain/Ideas/Templates/showBoards.blade.php | 2 ++ app/Domain/Install/Templates/new.blade.php | 1 + app/Domain/Install/Templates/update.blade.php | 1 + .../Logicmodelcanvas/Templates/canvasDialog.blade.php | 1 + app/Domain/Projects/Templates/delProject.blade.php | 1 + app/Domain/Projects/Templates/duplicateProject.blade.php | 1 + app/Domain/Projects/Templates/newProject.blade.php | 1 + app/Domain/Projects/Templates/showAll.blade.php | 1 + app/Domain/Projects/Templates/showProject.blade.php | 6 ++++++ .../Projects/Templates/submodules/projectDetails.blade.php | 1 + app/Domain/Setting/Templates/editBoxDialog.blade.php | 1 + app/Domain/Setting/Templates/editCompanySettings.blade.php | 2 ++ app/Domain/Sprints/Templates/delSprint.blade.php | 1 + app/Domain/Sprints/Templates/sprintdialog.blade.php | 1 + app/Domain/Tickets/Templates/delMilestone.blade.php | 1 + app/Domain/Tickets/Templates/delTicket.blade.php | 1 + app/Domain/Tickets/Templates/milestoneDialog.blade.php | 1 + app/Domain/Tickets/Templates/moveTicket.blade.php | 1 + app/Domain/Tickets/Templates/newTicket.blade.php | 1 + app/Domain/Tickets/Templates/newTicketModal.blade.php | 1 + .../Tickets/Templates/partials/quickadd-form.blade.php | 1 + app/Domain/Tickets/Templates/partials/subtasks.blade.php | 1 + app/Domain/Tickets/Templates/showAll.blade.php | 1 + app/Domain/Tickets/Templates/showList.blade.php | 1 + app/Domain/Tickets/Templates/showTicket.blade.php | 3 +++ app/Domain/Tickets/Templates/showTicketModal.blade.php | 1 + app/Domain/Tickets/Templates/submodules/subTasks.blade.php | 1 + .../Tickets/Templates/submodules/ticketDetails.blade.php | 1 + app/Domain/Tickets/Templates/submodules/timesheet.blade.php | 1 + app/Domain/Timesheets/Templates/addTime.blade.php | 2 ++ app/Domain/Timesheets/Templates/delTime.blade.php | 1 + app/Domain/Timesheets/Templates/editTime.blade.php | 1 + app/Domain/Timesheets/Templates/showAll.blade.php | 1 + app/Domain/Timesheets/Templates/showMy.blade.php | 1 + app/Domain/Timesheets/Templates/showMyList.blade.php | 1 + app/Domain/TwoFA/Templates/edit.blade.php | 2 ++ app/Domain/TwoFA/Templates/verify.blade.php | 1 + app/Domain/Users/Templates/delUser.blade.php | 1 + app/Domain/Users/Templates/editOwn.blade.php | 5 +++++ app/Domain/Users/Templates/editUser.blade.php | 1 + app/Domain/Users/Templates/importLdapDialog.blade.php | 2 ++ app/Domain/Users/Templates/newUser.blade.php | 1 + app/Domain/Widgets/Templates/partials/myToDos.blade.php | 2 ++ app/Domain/Wiki/Templates/articleDialog.blade.php | 1 + app/Domain/Wiki/Templates/delArticle.blade.php | 1 + app/Domain/Wiki/Templates/delWiki.blade.php | 1 + app/Domain/Wiki/Templates/show.blade.php | 1 + app/Domain/Wiki/Templates/wikiDialog.blade.php | 1 + 93 files changed, 112 insertions(+), 3 deletions(-) diff --git a/app/Core/Http/HttpKernel.php b/app/Core/Http/HttpKernel.php index 5f8b95562d..927420b48e 100644 --- a/app/Core/Http/HttpKernel.php +++ b/app/Core/Http/HttpKernel.php @@ -59,9 +59,8 @@ class HttpKernel extends Kernel \Leantime\Core\Middleware\InitialHeaders::class, // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, - // CSRF verification is NOT yet global — ~82 legacy .tpl.php forms lack @csrf tokens. - // Enable globally only after all forms are tokenized. Until then, apply per-route. - // \Leantime\Core\Middleware\VerifyCsrfToken::class, + // CSRF protection enabled globally — all Blade forms now include @csrf. + \Leantime\Core\Middleware\VerifyCsrfToken::class, \Leantime\Core\Middleware\AuthCheck::class, \Leantime\Core\Middleware\AuthenticateSession::class, diff --git a/app/Domain/Api/Templates/apiKey.blade.php b/app/Domain/Api/Templates/apiKey.blade.php index 3e7cb44f65..b41e6ed3da 100644 --- a/app/Domain/Api/Templates/apiKey.blade.php +++ b/app/Domain/Api/Templates/apiKey.blade.php @@ -9,6 +9,7 @@ {!! $tpl->displayNotification() !!}
+@csrf diff --git a/app/Domain/Api/Templates/delKey.blade.php b/app/Domain/Api/Templates/delKey.blade.php index 8f8a2e1e24..73dacb32e4 100644 --- a/app/Domain/Api/Templates/delKey.blade.php +++ b/app/Domain/Api/Templates/delKey.blade.php @@ -18,6 +18,7 @@
{!! __('subtitles.delete_key') !!}
+ @csrf

{!! __('text.confirm_key_deletion') !!}


diff --git a/app/Domain/Api/Templates/newAPIKey.blade.php b/app/Domain/Api/Templates/newAPIKey.blade.php index 833f516e19..c7c669019a 100644 --- a/app/Domain/Api/Templates/newAPIKey.blade.php +++ b/app/Domain/Api/Templates/newAPIKey.blade.php @@ -17,6 +17,7 @@ {!! __('links.copy_key') !!} @else + @csrf diff --git a/app/Domain/Auth/Templates/requestPwLink.blade.php b/app/Domain/Auth/Templates/requestPwLink.blade.php index 0300bd7171..0b16d9029a 100644 --- a/app/Domain/Auth/Templates/requestPwLink.blade.php +++ b/app/Domain/Auth/Templates/requestPwLink.blade.php @@ -11,6 +11,7 @@
@dispatchEvent('afterRegcontentOpen') + @csrf @dispatchEvent('afterFormOpen') {!! $tpl->displayInlineNotification() !!}

{!! __('text.enter_email_address_to_reset') !!}

diff --git a/app/Domain/Auth/Templates/resetPw.blade.php b/app/Domain/Auth/Templates/resetPw.blade.php index c649f3be4d..79b6fd0ed2 100644 --- a/app/Domain/Auth/Templates/resetPw.blade.php +++ b/app/Domain/Auth/Templates/resetPw.blade.php @@ -13,6 +13,7 @@
@dispatchEvent('afterRegcontentOpen') + @csrf @dispatchEvent('afterFormOpen') {!! $tpl->displayInlineNotification() !!} diff --git a/app/Domain/Auth/Templates/userInvite.blade.php b/app/Domain/Auth/Templates/userInvite.blade.php index 870a22f119..eb3ff851ce 100644 --- a/app/Domain/Auth/Templates/userInvite.blade.php +++ b/app/Domain/Auth/Templates/userInvite.blade.php @@ -11,6 +11,7 @@ dispatchTplEvent('afterRegcontentOpen'); ?> + @csrf dispatchTplEvent('afterFormOpen'); ?> displayInlineNotification(); ?> diff --git a/app/Domain/Auth/Templates/userInvite2.blade.php b/app/Domain/Auth/Templates/userInvite2.blade.php index e1d500753c..c8d9850bf2 100644 --- a/app/Domain/Auth/Templates/userInvite2.blade.php +++ b/app/Domain/Auth/Templates/userInvite2.blade.php @@ -10,6 +10,7 @@
+ @csrf {{ $tpl->displayInlineNotification() }} diff --git a/app/Domain/Auth/Templates/userInvite3.blade.php b/app/Domain/Auth/Templates/userInvite3.blade.php index 128696900c..4156d5001b 100644 --- a/app/Domain/Auth/Templates/userInvite3.blade.php +++ b/app/Domain/Auth/Templates/userInvite3.blade.php @@ -10,6 +10,7 @@
+ @csrf {{ $tpl->displayInlineNotification() }} diff --git a/app/Domain/Auth/Templates/userInvite4.blade.php b/app/Domain/Auth/Templates/userInvite4.blade.php index 082aa05e21..a723a9a2f3 100644 --- a/app/Domain/Auth/Templates/userInvite4.blade.php +++ b/app/Domain/Auth/Templates/userInvite4.blade.php @@ -12,6 +12,7 @@
+ @csrf diff --git a/app/Domain/Auth/Templates/userInvite5.blade.php b/app/Domain/Auth/Templates/userInvite5.blade.php index ceb80e81f8..298e6096e0 100644 --- a/app/Domain/Auth/Templates/userInvite5.blade.php +++ b/app/Domain/Auth/Templates/userInvite5.blade.php @@ -9,6 +9,7 @@
+ @csrf diff --git a/app/Domain/Blueprints/Templates/boardDialog.blade.php b/app/Domain/Blueprints/Templates/boardDialog.blade.php index ca6067a9cb..ab3ade83f2 100644 --- a/app/Domain/Blueprints/Templates/boardDialog.blade.php +++ b/app/Domain/Blueprints/Templates/boardDialog.blade.php @@ -4,6 +4,7 @@ @endphp +@csrf diff --git a/app/Domain/Blueprints/Templates/canvasDialog.blade.php b/app/Domain/Blueprints/Templates/canvasDialog.blade.php index bc90535b06..09eb67743c 100644 --- a/app/Domain/Blueprints/Templates/canvasDialog.blade.php +++ b/app/Domain/Blueprints/Templates/canvasDialog.blade.php @@ -36,6 +36,7 @@ {!! $tpl->displayNotification() !!} + @csrf diff --git a/app/Domain/Blueprints/Templates/delCanvas.blade.php b/app/Domain/Blueprints/Templates/delCanvas.blade.php index b594e3bb93..9b3eb6a518 100644 --- a/app/Domain/Blueprints/Templates/delCanvas.blade.php +++ b/app/Domain/Blueprints/Templates/delCanvas.blade.php @@ -5,6 +5,7 @@

{!! __('subtitles.delete') !!}

+@csrf

{!! __('text.confirm_board_deletion') !!}


+@csrf

{!! __('text.confirm_board_item_deletion') !!}


{!! __('buttons.back') !!} diff --git a/app/Domain/Calendar/Templates/delEvent.blade.php b/app/Domain/Calendar/Templates/delEvent.blade.php index 445bb11016..f0137bf792 100644 --- a/app/Domain/Calendar/Templates/delEvent.blade.php +++ b/app/Domain/Calendar/Templates/delEvent.blade.php @@ -9,6 +9,7 @@

{!! __('subtitles.delete') !!}

+@csrf @dispatchEvent('afterFormOpen')

{!! __('text.confirm_event_deletion') !!}


@dispatchEvent('beforeSubmitButton') diff --git a/app/Domain/Calendar/Templates/delExternalCal.blade.php b/app/Domain/Calendar/Templates/delExternalCal.blade.php index 651c850549..b5e50f6e48 100644 --- a/app/Domain/Calendar/Templates/delExternalCal.blade.php +++ b/app/Domain/Calendar/Templates/delExternalCal.blade.php @@ -9,6 +9,7 @@

{!! __('subtitles.delete') !!}

+@csrf @dispatchEvent('afterFormOpen')

{!! __('text.confirm_calendar_deletion') !!}


@dispatchEvent('beforeSubmitButton') diff --git a/app/Domain/Calendar/Templates/editEvent.blade.php b/app/Domain/Calendar/Templates/editEvent.blade.php index 7fb597d381..d93a5d35a0 100644 --- a/app/Domain/Calendar/Templates/editEvent.blade.php +++ b/app/Domain/Calendar/Templates/editEvent.blade.php @@ -11,6 +11,7 @@

{!! __('subtitles.event') !!}

+@csrf @dispatchEvent('afterFormOpen') diff --git a/app/Domain/Calendar/Templates/editExternalCalendar.blade.php b/app/Domain/Calendar/Templates/editExternalCalendar.blade.php index 71c11287c5..e548f1e4aa 100644 --- a/app/Domain/Calendar/Templates/editExternalCalendar.blade.php +++ b/app/Domain/Calendar/Templates/editExternalCalendar.blade.php @@ -5,6 +5,7 @@ +@csrf diff --git a/app/Domain/Calendar/Templates/export.blade.php b/app/Domain/Calendar/Templates/export.blade.php index f4dd150a93..983e3736bd 100644 --- a/app/Domain/Calendar/Templates/export.blade.php +++ b/app/Domain/Calendar/Templates/export.blade.php @@ -11,6 +11,7 @@ {!! $tpl->displayNotification() !!} +@csrf @dispatchEvent('afterFormOpen') diff --git a/app/Domain/Calendar/Templates/importGCal.blade.php b/app/Domain/Calendar/Templates/importGCal.blade.php index eb6c234c30..f7ca08aa50 100644 --- a/app/Domain/Calendar/Templates/importGCal.blade.php +++ b/app/Domain/Calendar/Templates/importGCal.blade.php @@ -5,6 +5,7 @@ +@csrf
diff --git a/app/Domain/Calendar/Templates/showAllGCals.blade.php b/app/Domain/Calendar/Templates/showAllGCals.blade.php index 1e9899c6b6..b94141c09c 100644 --- a/app/Domain/Calendar/Templates/showAllGCals.blade.php +++ b/app/Domain/Calendar/Templates/showAllGCals.blade.php @@ -6,6 +6,7 @@