# UrBackup API Actions (testati) Server: http://localhost:55414 Credenziali: utente admin, password 12345678 API Version: 2 ## Riepilogo dei test (aggiornato 05/08/2026 — login 2-fasi VERIFICATO) - **Login (2-fasi salt/PBKDF2)**: ✅ FUNZIONANTE — POST `username=admin` a `/x?a=salt` → `{"salt":"...","pbkdf2_rounds":10000,"rnd":"...","ses":"..."}`; poi POST `username=admin&password=&ses=` a `/x?a=login` → `{"success":true,...}`. Hash = md5(md5_bin(salt+password) passato a PBKDF2-SHA256 con i rounds del salt, poi md5(rnd+risultato)). Con `admin`/`12345678` il 05/08/2026: `hash=4b640fe71c904e43c04ab17aa3fe3f5e` → `success:true`. - **Login (stile v1 `u=admin&p=12345678`)**: ❌ fallisce (`{"success":false}`) — il server locale richiede il flusso 2-fasi. - **Salt**: ✅ accessibile SENZA autenticazione (POST `username=admin`); l'eventuale `{"error":1}` era dovuto alla richiesta GET/v1. - **Status**: ✅ testabile con sessione valida (`POST /x?a=status&ses=...`). - **Version**: Non supportato; → "Error: Unknown action [version]" - **Server Identity**: Non supportato; → "Error: Unknown action [server_identity]" - **Backups**: Testabile con sessione valida. - **Livelog**: Non testato (azione disponibile nel codice) - **Start Backup**: Non testato (azione disponibile nel codice) - **Add Client**: Non testato (azione disponibile nel codice) - **Remove Client**: Non testato (azione disponibile nel codice) - **Clientsettings**: Non testato (azione disponibile nel codice) - **Clientsettings_save**: Non testato (azione disponibile nel codice) ## API Actions disponibili nel codice (UrbackupApiClient.php) ### Client Status - `getStatus()`: Ottiene tutti i client → endpoint `status` - `getClientStatusByName(string $client_name)`: Ricerca client per nome - `getClientIdByName(string $client_name)`: Ottiene ID client per nome ### Client Settings - `getClientSettings(string $client_name)`: Ottiene impostazioni client → endpoint `settings` con `sa=clientsettings` - `updateClientSettings(string $client_name, string $key, string $value)`: Aggiorna impostazioni client - `saveInternetMode(string $client_name, bool $enabled)`: Salva impostazione internet mode - `getClientAuthKey(string $client_name)`: Ottiene chiave di autenticazione internet client ### Client Operations - `addClient(string $client_name)`: Aggiunge client → endpoint `add_client` - `removeClient(string $client_name)`: Rimuove client → endpoint `remove_client` ### Backup Operations - `startIncrementalFileBackup(string $client_name)`: Avvia backup file incrementale - `startFullFileBackup(string $client_name)`: Avvia backup file completo - `startIncrementalImageBackup(string $client_name)`: Avvia backup immagine incrementale - `startFullImageBackup(string $client_name)`: Avvia backup immagine completo - `getRecentBackups(string $client_name, int $limit = 40)`: Ottiene backup recenti → endpoint `backups` ### Log Operations - `getClientLogs(string $client_name, int $limit = 50)`: Ottiene log client → endpoint `livelog` ### Server Operations - `getServerIdentity()`: Ottiene identità server → endpoint `server_identity` ## Dettaglio del payload delle API ### Login (2-fasi, come implementato in `UrbackupApiClient::login()`) ``` Fase 1 — GET/POST /x?a=salt Parametri: username= Risposta: {"salt":"...","pbkdf2_rounds":10000,"rnd":"...","ses":"..."} Fase 2 — POST /x?a=login Parametri: username=, password=, ses= hash = md5( pbkdf2_sha256( md5_bin(salt . password), salt, pbkdf2_rounds ) . rnd ) (md5_bin = md5 binario, non esadecimale) Risposta attesa: {"success": true, ...} ``` - Esempio verificato il 05/08/2026 con `admin`/`12345678`: `hash=4b640fe71c904e43c04ab17aa3fe3f5e` → `"success":true`. - Lo stile v1 (`u=`/`p=hash MD5`) NON funziona sul server locale. ### Salt ``` Endpoint: POST /x?a=salt?username=... Risposta attesa: {"success": true, "salt": "...", "rnd": "...", "pbkdf2_rounds": ...} ``` ### Status ``` Endpoint: POST /x?a=status Con sessione: ?ses=... Risposta attesa: {"success": true, "status": [{"id":...,"name":...}]} ``` ### Settings (clientsettings) ``` Endpoint: POST /x?a=settings Parametri: sa=clientsettings t_clientid=id_client use=valore value=valore value_client=valore_client value_group=valore_group ``` ### Settings Save (clientsettings_save) ``` Endpoint: POST /x?a=settings Parametri: sa=clientsettings_save t_clientid=id_client overwrite=true key=valore ``` ### Backups ``` Endpoint: POST /x?a=backups Con sessione: ?ses=... Parametri: sa=backups clientid=id_client ``` ### Livelog ``` Endpoint: POST /x?a=livelog Con sessione: ?ses=... Parametri: clientid=id_client lastid=ultimo_id ``` ### Start Backup ``` Endpoint: POST /x?a=start_backup Con sessione: ?ses=... Parametri: start_client=clientid start_type=tipo (incr_file/full_file/incr_image/full_image) ``` ### Add Client ``` Endpoint: POST /x?a=add_client Con sessione: ?ses=... Parametri: clientname=nome_client ``` ### Remove Client ``` Endpoint: POST /x?a=remove_client Con sessione: ?ses=... Parametri: clientid=id_client (opzionale) clientname=nome_client ``` ### Server Identity ``` Endpoint: POST /x?a=server_identity Con sessione: ?ses=... Risposta attesa: {"server_identity": "nome_server"} ``` ## Struct delle impostazioni (clientsettings) ``` { "use": "bool", "value": "mixed", "value_client": "string", "value_group": "string" } ``` ## Struct dei backup (backups) ``` { "backup_id": backup id, "machine_name": server machine name, "starttime": "timestamp", "endtime": "timestamp", "status": "status", "size": "size" } ``` ## Struttura del log (livelog) ``` { "time": "timestamp", "level": "level", "message": "message", "id": "log id" } ``` ## Note sull'autenticazione Il client implementa un flusso di autenticazione a due fasi: 1. Inizia il login con username → endpoint `login` 2. Se salta, chiama `/x?a=salt` con username per ottenere salt e RNG 3. Calcola hash password: `hash_pbkdf2('sha256', md5(salt_str . password), salt_str, pbkdf2_rounds) + md5(rnd + passwordMd5)` 4. Completa il login con username/password/hash/rnd/ses ## Errori riscontrati 1. **Autenticazione**: u=admin&p=12345678 non valido; potrebbe non esistere nel server UrBackup 2. **Salt**: Fallisce senza autenticazione corretta 3. **URL endpoint**: Alcuni test con `?a=server_identity` falliscono, suggerendo potrebbero usare un nome azione diverso ## Passaggi successivi 1. Verificare esistenza utente admin nel server UrBackup (potrebbe non esistere) 2. Usare u=admin&p=12345678 non valido; ottenere credenziali corrette 3. Tentare di ottenere session token tramite il corretto flusso di autenticazione a due fasi 4. La maggior parte delle API funziona ma richiede autenticazione valida ## Correzione del codice necessaria per future chiamate API Il codice UrbackupApiClient.php usa una sessione con ses obbligatorio in tutte le chiamate API autenticate. La libreria del client non implementa yet gestione automatica del token di autenticazione a due fasi per tutte le azioni.