Skip to content

Commit 9afcdc5

Browse files
SMEWebifyclaude
andcommitted
fix(setup): ferme le wizard une fois la société configurée
Les routes /setup/* étaient derrière auth seul, donc n'importe quel utilisateur authentifié pouvait ré-écrire Factory row 1 (nom, SIREN, IBAN, logo) post-install. Le nouveau middleware setup.open coupe les endpoints dès que Factory + comptes de base sont peuplés ; le paramétrage post-install passe par les écrans admin dédiés. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 99ed53f commit 9afcdc5

3 files changed

Lines changed: 51 additions & 1 deletion

File tree

app/Http/Kernel.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class Kernel extends HttpKernel
7070
'localeCookieRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
7171
'localeViewPath' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class,
7272
'check.factory' => \App\Http\Middleware\CheckFactory::class,
73+
'setup.open' => \App\Http\Middleware\BlockOnceFactoryConfigured::class,
7374
'has.role' => \App\Http\Middleware\CheckUserRole::class,
7475
'check.task.status' => \App\Http\Middleware\CheckTaskStatus::class,
7576
'customer' => \App\Http\Middleware\EnsureCustomerIsAuthenticated::class,
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace App\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
use App\Models\Admin\Factory;
8+
use App\Models\Accounting\AccountingVat;
9+
use App\Models\Accounting\AccountingPaymentConditions;
10+
use App\Models\Accounting\AccountingPaymentMethod;
11+
use App\Models\Accounting\AccountingDelivery;
12+
use App\Models\Methods\MethodsUnits;
13+
use Symfony\Component\HttpFoundation\Response;
14+
15+
/**
16+
* Ferme le wizard d'installation une fois que la société est configurée.
17+
*
18+
* Miroir inversé de CheckFactory : ce middleware coupe l'accès aux routes
19+
* /setup/* dès que les six tables de base sont peuplées, pour qu'un
20+
* utilisateur authentifié post-install ne puisse pas ré-écrire la
21+
* ligne Factory ni écraser les référentiels comptables via le wizard.
22+
*
23+
* Le paramétrage post-install passe par les écrans admin dédiés
24+
* (FactoryController, AccountingVatController, etc.).
25+
*/
26+
class BlockOnceFactoryConfigured
27+
{
28+
public function handle(Request $request, Closure $next): Response
29+
{
30+
if (
31+
Factory::exists()
32+
&& AccountingVat::exists()
33+
&& AccountingPaymentConditions::exists()
34+
&& AccountingPaymentMethod::exists()
35+
&& AccountingDelivery::exists()
36+
&& MethodsUnits::exists()
37+
) {
38+
if ($request->expectsJson()) {
39+
abort(403, 'Setup wizard is closed.');
40+
}
41+
42+
return redirect()->route('dashboard');
43+
}
44+
45+
return $next($request);
46+
}
47+
}

routes/web.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@
7070
Route::get('/pending-role', fn () => view('pending-role'))->middleware(['auth', 'verified'])->name('pending.role');
7171

7272
// --- Setup wizard (installation initiale) ---
73-
Route::middleware(['auth'])->prefix('setup')->name('setup.')->group(function () {
73+
// setup.open ferme les endpoints dès que Factory + comptes de base sont créés,
74+
// pour qu'un utilisateur post-install ne puisse pas ré-écrire la config société.
75+
Route::middleware(['auth', 'setup.open'])->prefix('setup')->name('setup.')->group(function () {
7476
Route::get('/', 'App\Http\Controllers\Setup\SetupController@index')->name('index');
7577
Route::post('/company', 'App\Http\Controllers\Setup\SetupController@saveCompany')->name('company');
7678
Route::post('/vat', 'App\Http\Controllers\Setup\SetupController@saveVat')->name('vat');

0 commit comments

Comments
 (0)