Možnost zamknout soubor a zabránit tak úpravě jiným uživatelem je jednou z nejdůležitějších funkcí, které od software pro kolektivní spolupráci požadujeme. Jelikož byl WebDAV vyvíjen hlavně pro zajištění vzdálené spolupráce, byla podpora zámků do standardu zabudována.

Předem bych rád upozornil, že problematika zámků a jejich použití je relativně komplikovaná a já se nemohu věnovat všem detailům. Bližší informace najdete v dokumentu RFC 2518.

Specifikace WebDAVu nám umožňuje, jak už jsme zmínili v prvním díle, použít pro tyto účely dva typy zámků, Shared a Exclusive. Specifikace WebDAVu upravuje pouze chování takzvaného Write Lock (zámek proti zápisu). Nicméně syntaxe všech příkazů a XML elementů je značně variabilní a umožňuje tak vytvoření vlastních typů zámků. Soubor se specifikovaným zámkem proti zápisu může být čten jakýmkoliv uživatelem. Ovšem pokud se uživatel neprokáže platným klíčem, neumožní mu jej server uložit.

Ještě jednou upozorňuji, že server kompatibilní s technologií WebDAV nemusí zámky podporovat. Před jejich použitím si proto pečlivě prostudujte možnosti vámi používaného serveru.

Zámky jsou ovládány dvěma příkazy, LOCK a UNLOCK. Názvy napovídají, že první příkaz slouží k vytvoření zámku a druhý k jeho zrušení.

Každý zámek je jednoznačně určen zvláštním řetězcem (klíčem), tzv. Lock Token (hodnota elementu locktoken), který server vrátí v odpovědi na příkaz LOCK, nebo jej najdete v rámci vlastnosti lockdiscovery. Zde by se mohli někteří z vás pozastavit. Takto definované klíče lze totiž zjistit velmi jednoduchým způsobem a i neoprávněný uživatel by mohl ukládat uzamčené soubory. Klíče sami o sobě totiž nezaručují žádná zvláštní přístupová práva. To, zda k souboru bude mít přístup pouze oprávněný uživatel, musí zajistit server prostřednictvím svých autorizačních mechanismů. Pokud by server žádnou autorizaci nevyžadoval, mohl by si jakýkoliv uživatel zjisti hodnotu klíče odesláním příkazu PROPFIND.

Pro zámky obecně platí, že každému uživateli, který má ke zdroji přístup, musí být vygenerován zvláštní klíč. Pokud tedy vytvoříme Shared Lock pro tři uživatele, pak pro daný zdroj musí existovat tři klíče.

Write Lock

Zámek proti zápisu je jediným, který specifikace WebDAVu popisuje. Vytvoření zámku tohoto typu pro daný zdroj musí zabránit úspěšnému vykonání příkazů PUT, POST, PROPPATCH, LOCK, UNLOCK, MOVE, DELETE, MKCOL. Ostatní příkazy můžeme využít bez ohledu na existující zámek.

LOCK

Příkaz LOCK, jak už jsme se zmínili dříve, nám umožňuje vytvořit zámek pro soubor či kolekci. Samo použití příkazu LOCK je poněkud složitější a tak si jej nejdříve ukážeme na příkladu.

Hlavičky

Pouze s příkazem LOCK lze použít novou hlavičku Timeout, jejíž hodnota sděluje serveru, kdy má vytvořený zámek vypršet. Hlavička Timeout se zapisuje v následujícím tvaru:

Timeout: „Infinite“, „Second-„počet sekund nebo „Extend>“

V hlavičce můžeme uvést i více hodnot oddělených čárkami, přičemž by měly být seřazeny podle priority zleva doprava. Server nemusí akceptovat hned první zadanou hodnotu, což je možné vidět i na výše uvedeném příkladě. Server akceptuje až hodnotu stanovenou počtem sekund.

Pokud chceme uzamknout kolekci, můžeme chování příkazu LOCK ovlivnit odesláním hlavičky Depth, jejíž popis jsme si uvedli v předchozím článku.

Poslední hlavičkou, kterou jsme v příkladě použili, je Authorization. Server používá metodu Digest jako metodu autorizace. Popis této hlavičky i použité metody je nad rámec článku, takže se jím nebudeme zabývat. Detaily najdete v dokumentech RFC 2616 (HTTP protokol) a RFC 2069 (Přístupová autentifikace Digest).

XML dokument

S příkazem LOCK musí být spojený XML dokument, popisující charakter a typ zámku. Kořenovým elementem je element lockinfo, který v elementech lockscope, locktype a owner obsahuje informace o typu zámku a jeho majiteli. Následující tabulka obsahuje seznam elementů a hodnot, které lze při popisu zámku použít:

Element Popis Hodnota
lockinfo kořenový element element lockscope, locktype a owner
lockscope určuje rozsah zámku jeden z prázdných elementů exclusive, shared
locktype* specifikuje přístupový typ zámku prázdný element write
owner informace o majiteli zámku jakýkoliv element např. href

* lze použít i jiný typ zámku pokud jej zdroj podporuje. Podporované typy zámků zjistíme z hodnoty vlastnosti suportedlock (resp. vlastností locktype a lockscope).

Odpověď serveru obsahuje element prop a výpis vlastnosti lockdiscovery, který popisuje vlastnosti zámku (přístupový typ, rozsah působnosti, majitele, čas vypršení zámku, a klíč) v odpovídajících elementech. Hodnota klíče je obsahem elementu locktoken (resp. href). Klíč je uveden slovem opaquelocktoken, které pouze popisuje použité schéma při vytváření klíče.

Pokud celá akce proběhla v pořádku, pak server vrátí stavový kód 200 (OK). V případě, že zdroj je již zamknutý, pak server vrátí stavový kód 423 (Locked).

Jak použít příkaz LOCK pro obnovení zámku (stanovení časový limit je dán opět hodnotou hlavičky Timeout) ukazuje následující příklad.

UNLOCK

Příkaz UNLOCK slouží k odebrání existujícího zámku. Klíč se neodesílá prostřednictvím XML dokumentu, ale jako hodnota hlavičky Lock-Token, jejíž syntaxe je následující:

Lock-Token: <klíč>

Následující příklad ilustruje použití příkazu UNLOCK. Standardní hodnotou stavového kódu, který server v případě úspěšného použití příkazu UNLOCK vrátí, je 204 (No Content).

Odkazy, zdroje

Žádný příspěvek v diskuzi

Odpovědět