6. Locking (Verrouillage)
La capacité de verrouiller une ressource fournit un mécanisme pour sérialiser l'accès à cette ressource. En utilisant un verrou, un client de création peut fournir une garantie raisonnable qu'un autre principal ne modifiera pas une ressource pendant qu'elle est en cours d'édition. De cette manière, un client peut prévenir le problème de la « mise à jour perdue (Lost Update) ».
Cette spécification permet aux verrous de varier sur deux paramètres spécifiés par le client : le nombre de principaux impliqués (verrous exclusifs vs. verrous partagés) et le type d'accès à accorder. Ce document définit le verrouillage pour un seul type d'accès : écriture (Write). Cependant, la syntaxe est extensible et permet la spécification éventuelle du verrouillage pour d'autres types d'accès.
6.1 Lock Model (Modèle de verrou)
Cette section fournit une description non normative du verrouillage WebDAV.
Un verrou est identifié par un jeton de verrou (Lock Token). Les jetons de verrou sont des URLs et peuvent être transmis via HTTP. Un jeton de verrou est associé à un seul verrou.
Les verrous peuvent être exclusifs ou partagés. Le type de verrou détermine comment le serveur traite les requêtes sur la ressource verrouillée :
Verrou exclusif (Exclusive Lock) :
- Seul le principal qui a créé le verrou peut modifier la ressource
- Empêche tout autre principal d'obtenir un verrou conflictuel
Verrou partagé (Shared Lock) :
- Plusieurs principaux peuvent détenir des verrous partagés
- Tous les principaux détenant des verrous partagés peuvent modifier la ressource
- Empêche les principaux ne détenant pas de verrous de modifier la ressource
Les verrous peuvent avoir différentes portées :
- Verrou direct (Direct Lock) : Le verrou s'applique directement à la ressource
- Verrou de profondeur (Depth Lock) : Le verrou s'applique à la ressource et à tous ses membres
Pour les collections, la profondeur peut être spécifiée :
- Depth: 0 : Verrouille uniquement la collection elle-même
- Depth: infinity : Verrouille la collection et tous ses membres (récursivement)
6.2 Exclusive vs. Shared Locks (Verrous exclusifs vs. verrous partagés)
Le type de verrou le plus courant est le verrou exclusif (Exclusive Lock). Le but d'un verrou exclusif est d'imposer une politique d'édition d'un principal particulier. Une utilisation courante d'un verrou exclusif est d'empêcher différents principaux de modifier une ressource pendant une longue session de création.
Les verrous partagés (Shared Locks) sont conçus pour prendre en charge la création collaborative, où un groupe de principaux doit modifier une ressource simultanément. La caractéristique clé des verrous partagés est que plusieurs principaux peuvent détenir des verrous partagés, mais les verrous exclusifs excluent tous les autres verrous.
Table de compatibilité des verrous :
| État actuel | Demande de verrou partagé | Demande de verrou exclusif |
|---|---|---|
| Aucun | ✅ Vrai | ✅ Vrai |
| Verrou partagé | ✅ Vrai | ❌ Faux |
| Verrou exclusif | ❌ Faux | ❌ Faux |
6.3 Required Support (Support requis)
Un serveur doit (MUST) prendre en charge les verrous d'écriture exclusifs (Exclusive Write Locks).
Un serveur peut (MAY) prendre en charge les verrous d'écriture partagés (Shared Write Locks). Si un serveur ne prend pas en charge les verrous d'écriture partagés, le serveur doit (MUST) retourner une erreur lorsqu'un client demande un verrou d'écriture partagé.
6.4 Lock Creator and Privileges (Créateur de verrou et privilèges)
Un verrou est associé au principal qui a créé le verrou. Seuls les principaux avec le jeton de verrou approprié peuvent déverrouiller une ressource. Cela garantit que le créateur du verrou a le contrôle sur le cycle de vie du verrou.
Le principal créant un verrou doit avoir les privilèges nécessaires pour créer des verrous sur la ressource. Les exigences de privilèges spécifiques sont déterminées par la politique de contrôle d'accès du serveur.
6.5 Lock Tokens (Jetons de verrou)
Un jeton de verrou (Lock Token) est une URL qui identifie de manière unique un verrou. Les jetons de verrou utilisent généralement le schéma URI opaquelocktoken: (voir Annexe C).
Caractéristiques des jetons de verrou :
- Unicité globale : Chaque jeton de verrou est globalement unique
- Imprévisibilité : Les jetons de verrou doivent être imprévisibles pour empêcher l'accès non autorisé
- Format URL : Les jetons de verrou sont des URLs valides
Exemple de jeton de verrou :
opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
Les clients soumettent des jetons de verrou en :
- Incluant le jeton de verrou dans l'en-tête
If - Incluant le jeton de verrou dans l'en-tête
Lock-Token(pour la méthode UNLOCK uniquement)
6.6 Lock Timeout (Délai d'expiration du verrou)
Les verrous ont une durée de vie limitée. Le serveur attribue une valeur de délai d'expiration à chaque verrou, après quoi le verrou expire automatiquement.
Caractéristiques du délai d'expiration :
- Les clients peuvent suggérer une valeur de délai d'expiration dans l'en-tête de requête
Timeout - Les serveurs peuvent ignorer la suggestion du client et attribuer leur propre valeur de délai d'expiration
- Les serveurs doivent (MUST) retourner la valeur de délai d'expiration réelle dans la réponse de verrou
- Les clients peuvent prolonger la durée de vie du verrou en rafraîchissant le verrou
Format du délai d'expiration :
Timeout: Second-4100
Timeout: Infinite
Meilleures pratiques :
- Les serveurs devraient (SHOULD) permettre aux clients de rafraîchir les verrous
- Les clients devraient (SHOULD) rafraîchir périodiquement les verrous à long terme
- Les clients devraient (SHOULD) déverrouiller les ressources une fois l'édition terminée
6.7 Lock Capability Discovery (Découverte des capacités de verrouillage)
Avant de tenter de verrouiller une ressource, les clients peuvent découvrir les capacités de verrouillage du serveur en utilisant la méthode OPTIONS. L'en-tête DAV dans la réponse indique la classe de conformité WebDAV du serveur, qui inclut le support du verrouillage.
6.8 Active Lock Discovery (Découverte des verrous actifs)
Les clients peuvent découvrir les verrous actifs sur une ressource en utilisant la méthode PROPFIND pour récupérer la propriété DAV:lockdiscovery. Cette propriété contient des informations sur tous les verrous actifs sur la ressource, y compris le type de verrou, la portée, la profondeur, le propriétaire, le délai d'expiration et le jeton de verrou.