From 6b11ab7028de7df7480e380b4aa46fbd0a1dd7de Mon Sep 17 00:00:00 2001 From: Francesco Picone Date: Sat, 25 Jul 2026 19:43:29 +0200 Subject: [PATCH 1/2] ++ fix permessi assegnazioni --- ...e_settings_manage_from_assistente_role.php | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 database/migrations/2026_07_25_000001_revoke_settings_manage_from_assistente_role.php diff --git a/database/migrations/2026_07_25_000001_revoke_settings_manage_from_assistente_role.php b/database/migrations/2026_07_25_000001_revoke_settings_manage_from_assistente_role.php new file mode 100644 index 0000000..6b68760 --- /dev/null +++ b/database/migrations/2026_07_25_000001_revoke_settings_manage_from_assistente_role.php @@ -0,0 +1,51 @@ +forgetCachedPermissions(); + + $role = Role::where('name', 'assistente')->first(); + $permission = Permission::where('name', 'settings.manage')->first(); + + if ($role && $permission && $role->hasPermissionTo($permission)) { + $role->revokePermissionTo($permission); + } + + app(PermissionRegistrar::class)->forgetCachedPermissions(); + } + + /** + * Intentionally irreversible. Re-granting settings.manage to the + * assistente role would reintroduce the very ability this migration + * removes, so rolling back must not do it. + */ + public function down(): void + { + // no-op + } +}; From 3ec2422fbc2ccebd555560aab68e635d373807e6 Mon Sep 17 00:00:00 2001 From: Francesco Picone Date: Sat, 25 Jul 2026 19:53:12 +0200 Subject: [PATCH 2/2] ++ update HANDOFF.md --- HANDOFF.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/HANDOFF.md b/HANDOFF.md index 12cd74c..7f1a59c 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -4,7 +4,7 @@ Stato del progetto per chi ci mette mano dopo. Per installazione, deploy e uso quotidiano vedi [README.md](README.md); qui c'è il contesto che il README non può dare: perché le cose sono come sono, e cosa resta aperto. -Ultimo aggiornamento: **18 luglio 2026**. +Ultimo aggiornamento: **25 luglio 2026**. --- @@ -89,6 +89,29 @@ messaggio d'errore è più chiaro). Deliberato: un errore immediato è meglio di un database in produzione con password `secret`. +### Modifica/cancellazione delle assegnazioni: solo amministratore + +L'unico punto in cui un'assegnazione **esistente** si modifica o si cancella è +il CRUD del Registro (`Livewire/Registro`: `openCreate`/`openEdit`/`save`/ +`askDelete`/`deleteConfirmed`), blindato su `settings.manage` a due livelli — +`abort_if(..., 403)` nel componente e `@can('settings.manage')` in +`registro.blade.php`, che nasconde pulsanti e modali. `settings.manage` ce l'ha +solo l'`amministratore`. + +Di conseguenza gli altri ruoli **non** possono alterare le assegnazioni: la +pagina Assegna solo ne crea (`territori.assign`), la pagina Rientra solo le +chiude (`territori.return`). Nello specifico l'`assistente` (`registro.view` + +`territori.assign` + `territori.return`) vede il Registro, crea nuove +assegnazioni e le fa rientrare, ma non le modifica né le elimina. + +Poiché il seeder concede in modo additivo e non revoca mai (vedi la nota su +`syncPermissions()` più sotto), un permesso `settings.manage` concesso a mano +all'`assistente` in passato sopravviverebbe a ogni re-seed. La migration +`2026_07_25_000001_revoke_settings_manage_from_assistente_role` chiude questo +drift per i database esistenti: revoca `settings.manage` dal ruolo `assistente` +se presente. È idempotente (no-op sul baseline) e volutamente irreversibile — +il `down()` non ripristina il permesso. + ### Un solo container esegue le migrazioni Solo `app` migra. `queue-worker` e `scheduler` usano `queue-entrypoint.sh`, che