6. Locking (Blocco)
La capacità di bloccare una risorsa fornisce un meccanismo per serializzare l'accesso a quella risorsa. Utilizzando un blocco, un client di authoring può fornire una garanzia ragionevole che un altro principale non modificherà una risorsa mentre viene modificata. In questo modo, un client può prevenire il problema dell'«aggiornamento perso (Lost Update)».
Questa specifica permette ai blocchi di variare su due parametri specificati dal client: il numero di principali coinvolti (blocchi esclusivi vs. blocchi condivisi) e il tipo di accesso da concedere. Questo documento definisce il blocco solo per un tipo di accesso: scrittura (Write). Tuttavia, la sintassi è estensibile e consente l'eventuale specifica del blocco per altri tipi di accesso.
6.1 Lock Model (Modello di blocco)
Questa sezione fornisce una descrizione non normativa del blocco WebDAV.
Un blocco è identificato da un token di blocco (Lock Token). I token di blocco sono URL e possono essere trasmessi tramite HTTP. Un token di blocco è associato a un solo blocco.
I blocchi possono essere esclusivi o condivisi. Il tipo di blocco determina come il server gestisce le richieste sulla risorsa bloccata:
Blocco esclusivo (Exclusive Lock):
- Solo il principale che ha creato il blocco può modificare la risorsa
- Impedisce a qualsiasi altro principale di ottenere un blocco conflittuale
Blocco condiviso (Shared Lock):
- Più principali possono detenere blocchi condivisi
- Tutti i principali che detengono blocchi condivisi possono modificare la risorsa
- Impedisce ai principali che non detengono blocchi di modificare la risorsa
I blocchi possono avere ambiti diversi:
- Blocco diretto (Direct Lock): Il blocco si applica direttamente alla risorsa
- Blocco di profondità (Depth Lock): Il blocco si applica alla risorsa e a tutti i suoi membri
Per le raccolte, la profondità può essere specificata:
- Depth: 0: Blocca solo la raccolta stessa
- Depth: infinity: Blocca la raccolta e tutti i suoi membri (ricorsivamente)
6.2 Exclusive vs. Shared Locks (Blocchi esclusivi vs. blocchi condivisi)
Il tipo di blocco più comune è il blocco esclusivo (Exclusive Lock). Lo scopo di un blocco esclusivo è imporre una politica di modifica di un particolare principale. Un uso comune di un blocco esclusivo è impedire a diversi principali di modificare una risorsa durante una lunga sessione di authoring.
I blocchi condivisi (Shared Locks) sono progettati per supportare l'authoring collaborativo, dove un gruppo di principali deve modificare una risorsa simultaneamente. La caratteristica chiave dei blocchi condivisi è che più principali possono detenere blocchi condivisi, ma i blocchi esclusivi escludono tutti gli altri blocchi.
Tabella di compatibilità dei blocchi:
| Stato attuale | Richiesta di blocco condiviso | Richiesta di blocco esclusivo |
|---|---|---|
| Nessuno | ✅ Vero | ✅ Vero |
| Blocco condiviso | ✅ Vero | ❌ Falso |
| Blocco esclusivo | ❌ Falso | ❌ Falso |
6.3 Required Support (Supporto richiesto)
Un server deve (MUST) supportare i blocchi di scrittura esclusivi (Exclusive Write Locks).
Un server può (MAY) supportare i blocchi di scrittura condivisi (Shared Write Locks). Se un server non supporta i blocchi di scrittura condivisi, il server deve (MUST) restituire un errore quando un client richiede un blocco di scrittura condiviso.
6.4 Lock Creator and Privileges (Creatore del blocco e privilegi)
Un blocco è associato al principale che ha creato il blocco. Solo i principali con il token di blocco appropriato possono sbloccare una risorsa. Questo garantisce che il creatore del blocco abbia il controllo sul ciclo di vita del blocco.
Il principale che crea un blocco deve avere i privilegi per creare blocchi sulla risorsa. I requisiti di privilegio specifici sono determinati dalla politica di controllo degli accessi del server.
6.5 Lock Tokens (Token di blocco)
Un token di blocco (Lock Token) è un URL che identifica univocamente un blocco. I token di blocco utilizzano tipicamente lo schema URI opaquelocktoken: (vedi Appendice C).
Caratteristiche dei token di blocco:
- Unicità globale: Ogni token di blocco è globalmente unico
- Imprevedibilità: I token di blocco dovrebbero essere imprevedibili per prevenire accessi non autorizzati
- Formato URL: I token di blocco sono URL validi
Esempio di token di blocco:
opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
I client inviano token di blocco tramite:
- Inclusione del token di blocco nell'header
If - Inclusione del token di blocco nell'header
Lock-Token(solo per il metodo UNLOCK)
6.6 Lock Timeout (Timeout del blocco)
I blocchi hanno una durata di vita limitata. Il server assegna un valore di timeout a ogni blocco, dopo il quale il blocco scade automaticamente.
Caratteristiche del timeout:
- I client possono suggerire un valore di timeout nell'header di richiesta
Timeout - I server possono ignorare il suggerimento del client e assegnare il proprio valore di timeout
- I server devono (MUST) restituire il valore di timeout effettivo nella risposta di blocco
- I client possono estendere la durata di vita del blocco aggiornando il blocco
Formato del timeout:
Timeout: Second-4100
Timeout: Infinite
Migliori pratiche:
- I server dovrebbero (SHOULD) consentire ai client di aggiornare i blocchi
- I client dovrebbero (SHOULD) aggiornare periodicamente i blocchi a lungo termine
- I client dovrebbero (SHOULD) sbloccare le risorse una volta completata la modifica
6.7 Lock Capability Discovery (Scoperta delle capacità di blocco)
Prima di tentare di bloccare una risorsa, i client possono scoprire le capacità di blocco del server utilizzando il metodo OPTIONS. L'header DAV nella risposta indica la classe di conformità WebDAV del server, che include il supporto del blocco.
6.8 Active Lock Discovery (Scoperta dei blocchi attivi)
I client possono scoprire i blocchi attivi su una risorsa utilizzando il metodo PROPFIND per recuperare la proprietà DAV:lockdiscovery. Questa proprietà contiene informazioni su tutti i blocchi attivi sulla risorsa, inclusi tipo di blocco, ambito, profondità, proprietario, timeout e token di blocco.