From a2a2883a42ce80c586cdaeee6bcd62f3871177c4 Mon Sep 17 00:00:00 2001 From: Andrew McMillan Date: Wed, 6 Dec 2006 19:32:41 +1300 Subject: [PATCH] Add support for UNLOCK of resources. --- inc/caldav-LOCK.php | 54 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/inc/caldav-LOCK.php b/inc/caldav-LOCK.php index ef871c90..81fd6daf 100644 --- a/inc/caldav-LOCK.php +++ b/inc/caldav-LOCK.php @@ -137,6 +137,40 @@ function lock_resource( $user_no, $path ) { return $lock; } +function unlock_resource( $user_no, $path ) { + global $request, $lockinfo; + + dbg_error_log( "LOCK", "Attempting to unlock resource '%s'", $path); + if ( ($lock_token = $request->IsLocked()) ) { // NOTE Assignment in if() is expected here. + dbg_error_log( "LOCK", "Lock exists, checking token validity."); + if ( $request->ValidateLockToken($lock_token) ) { + $sql = "DELETE FROM locks WHERE opaquelocktoken = ?;"; + $qry = new PgQuery($sql, $lock_token ); + $qry->Exec("LOCK",__LINE__,__FILE__); + $request->DoResponse( 204 ); + } + else { + /** + * Invalid lock token. RFC2518 doesn't seem to define the respons in this case. + * - we'll return a 423, but there are lots of 'reasonable' choices. + */ + $response = array( + new XMLElement( 'href', $request->path ), + new XMLElement( 'status', 'HTTP/1.1 423 Resource Locked') + ); + $response = new XMLElement( "multistatus", new XMLElement( 'response', $response), array('xmlns'=>'DAV:') ); + $xmldoc = $response->Render(0,''); + $request->DoResponse( 423, $xmldoc, 'text/xml; charset="utf-8"' ); + } + } + else { + /** + * A fresh lock + */ + $request->DoResponse( 204 ); + } +} + if ( count($unsupported) > 0 ) { /** @@ -159,13 +193,25 @@ if ( count($unsupported) > 0 ) { $url = $c->protocol_server_port_script . $request->path ; $url = preg_replace( '#/$#', '', $url); -if ( $request->IsCollection() ) { - $response = lock_collection( $request->depth, (isset($request->user_no) ? $request->user_no : $session->user_no), $request->path ); + +if ( $request->method == "LOCK" ) { + if ( $request->IsCollection() ) { + $response = lock_collection( $request->depth, (isset($request->user_no) ? $request->user_no : $session->user_no), $request->path ); + } + else { + $response = lock_resource( (isset($request->user_no) ? $request->user_no : $session->user_no), $request->path ); + } } -else { - $response = lock_resource( (isset($request->user_no) ? $request->user_no : $session->user_no), $request->path ); +elseif ( $request->method == "UNLOCK" ) { + if ( $request->IsCollection() ) { + $response = unlock_collection( $request->depth, (isset($request->user_no) ? $request->user_no : $session->user_no), $request->path ); + } + else { + $response = unlock_resource( (isset($request->user_no) ? $request->user_no : $session->user_no), $request->path ); + } } + $prop = new XMLElement( "prop", $response, array('xmlns'=>'DAV:') ); // dbg_log_array( "LOCK", "XML", $response, true ); $xmldoc = $prop->Render(0,'');