# MEMORY.md - Stato del Plugin UrBackup ## Ultima modifica: 31/08/2026 ## 31/08/2026 — Fix campi API username/password non editabili in prod (solo UI) - **Sintomo utente**: installato il plugin sul server produttivo, nel form Server non si vede il campo API username e il campo API password è bloccato (asterischi fissi non editabili), anche per l'utente che ha installato il plugin. - **Causa**: divergenza nel controllo diritti. I front usavano `Profile::canCurrentUser()` (legge i diritti da `glpi_profilerights` su DB), ma `Server::showFormFields()` (form server) usava `Session::haveRight(self::$rightname, UPDATE)` per calcolare `$canEdit` (e idem `rawSearchOptions()` riga 308 e `showUnlinkedClientsTab()`/`showMissingClientsTab()` righe 1155/1222). `Session::haveRight` dipende dalla **cache dei diritti in sessione** (`$_SESSION['glpiactiveprofile']['rights']`), popolata al login. Dopo l'installazione/aggiornamento del plugin i diritti sono scritti in DB ma la **sessione corrente non viene ricostruita**, quindi `haveRight` resta false → ramo read-only: username stampato come testo (invisibile se vuoto), password `******` fissa. - **Fix**: sostituito `Session::haveRight(self::$rightname, ...)` con `Profile::canCurrentUser(...)` in Server.php (righe ~308, ~447-449, ~1155, ~1222) e AssetTab.php (riga ~446, tab Asset), coerente col resto del plugin, legge dal DB e aggira la cache di sessione stantia. - Nessun bump versione (nessuna modifica DB, regola 6); nessuna nuova stringa i18n. - Verifica IA: `php -l` OK; git diff autorevisione OK. **Verifica UI utente OBBLIGATORIA**: aggiornare il file su prod, poi testare il form Server (API username editabile + API password campo input con placeholder). ## 25/08/2026 — Blocco "This asset hosts the UrBackup server" in evidenza (solo UI) - **Richiesta utente**: mettere in evidenza con riquadro colorato il blocco host + nome del server UrBackup. - **Modifiche**: `AssetTab.php::showHostServerBlock()` — classi dedicate `plugin-urbackup-host-card` / `-card-header` sul card Bootstrap e `plugin-urbackup-host-server-link` sui link server; `public/css/urbackup.css` — card con bordo 2px #1e6091, header blu #1e6091 testo bianco, body #eaf3fa, link server bold 1.05rem. - Nessun bump versione (nessuna modifica DB, regola 6); nessuna nuova stringa i18n. - Verifiche IA: `php -l` OK; git diff autorevisione OK. **Verifica visiva browser: CONFERMATA dall'utente il 25/08/2026** ("ok funziona tutto"). ## 07/08/2026 — Fix dropdown "Hardware host" (0.7.3): elemento non compariva - **Sintomo utente**: scelto il tipo host (es. Computer) nel form server, il dropdown degli elementi non compariva. - **Causa 1 (405)**: `Ajax::updateItemOnSelectEvent` genera `$("#target").load(url, {params})` — jQuery `.load()` con data **oggetto** invia **POST**, mentre `front/dropdown_host.ajax.php` era GET-only (405) → div mai popolato. (Nota: il CSRF non era il blocco per `.load()`: il global `$(document).ajaxSend` in public/js/common.js aggiunge `X-Glpi-Csrf-Token` a OGNI POST AJAX, letto da `getAjaxCsrfToken()` sul ``.) - **Causa 2 (500)**: `Session::getMatchingActiveEntities()` richiede esattamente 1 argomento (è un **filtro** di entity, `@since 10.0.13`) → usare `Session::getActiveEntities()` (Session.php:2194). - **Causa 3 (parametro sbagliato)**: in `Dropdown::show` il parametro per limitare le entità è **`entity`** (default -1, riga 133), NON `entity_restrict` (che è solo l'output serializzato del config, riga 287). - **Causa 4 (scriptBlock NON emesso)**: `Html::scriptBlock()` in GLPI 11 **ritorna** la stringa (`return sprintf(...)`, Html.php:5145) — serve `echo Html::scriptBlock(...)`; senza echo lo script sparisce silenziosamente. - **Fix**: JS inline nel form via `echo Html::scriptBlock(...)`: `$(document).on('change', '#dropdown_host_itemtype$rand', ...)` → `$.get(PLUGIN_URBACKUP_WEB_DIR.'/front/dropdown_host.ajax.php', {itemtype, value:0})` → `.html()` del div `urbackup_host_items$rand` (GET = bodyless → nessun check CSRF; jQuery esegue gli script inline iniettati, incluso il `$(function(){})` del config select2). Rimosso `use Ajax;` (non più usato). - **Lezione GLPI 11 — i dropdown sono LAZY**: `Dropdown::show()` NON renderizza più le `