}
$lock_opener = $request->FailIfLocked();
if ($add_member) {
    $request->path = $request->dav_name() . uuid();
    $dest = new DAVResource($request->path);
    if ($dest->Exists()) {
        $request->path = $request->dav_name() . uuid();
        $dest = new DAVResource($request->path);
        if ($dest->Exists()) {
            throw new Exception("Failed to generate unique segment name for add-member!");
        }
    }
} else {
    $dest = new DAVResource($request->path);
}
$container = $dest->GetParentContainer();
if ($container->IsCalendar()) {
    $request->PreconditionFailed(412, 'urn:ietf:params:xml:ns:caldav:supported-calendar-data', translate('Incorrect content type for calendar: ') . $request->content_type);
} else {
    if ($container->IsAddressbook()) {
        $request->PreconditionFailed(412, 'urn:ietf:params:xml:ns:carddav:supported-address-data', translate('Incorrect content type for addressbook: ') . $request->content_type);
    }
}
if (!$dest->Exists()) {
    if ($container->IsPrincipal()) {
        $request->DoResponse(403, translate('A DAViCal principal collection may only contain collections'));
    }
    if (!$container->Exists()) {
        $request->DoResponse(409, translate('Destination collection does not exist'));
    }
    $container->NeedPrivilege('DAV::bind');
Beispiel #2
0
<?php

/**
* CalDAV Server - handle DELETE method
*
* @package   davical
* @subpackage   caldav
* @author    Andrew McMillan <*****@*****.**>
* @copyright Catalyst .Net Ltd, Morphoss Ltd <http://www.morphoss.com/>
* @license   http://gnu.org/copyleft/gpl.html GNU GPL v2 or later
*/
dbg_error_log("delete", "DELETE method handler");
require_once 'DAVResource.php';
$dav_resource = new DAVResource($request->path);
$container = $dav_resource->GetParentContainer();
$container->NeedPrivilege('DAV::unbind');
$lock_opener = $request->FailIfLocked();
require_once 'schedule-functions.php';
function delete_collection($id)
{
    $params = array(':collection_id' => $id);
    $qry = new AwlQuery('SELECT child.collection_id AS child_id FROM collection child JOIN collection parent ON (parent.dav_name = child.parent_container) WHERE parent.collection_id = :collection_id', $params);
    if ($qry->Exec('DELETE', __LINE__, __FILE__) && $qry->rows() > 0) {
        while ($row = $qry->Fetch()) {
            delete_collection($row->child_id);
        }
    }
    if ($qry->QDo("SELECT write_sync_change(collection_id, 404, caldav_data.dav_name) FROM caldav_data WHERE collection_id = :collection_id", $params) && $qry->QDo("DELETE FROM property WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params) && $qry->QDo("DELETE FROM locks WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params) && $qry->QDo("DELETE FROM caldav_data WHERE collection_id = :collection_id", $params) && $qry->QDo("DELETE FROM collection WHERE collection_id = :collection_id", $params)) {
        @dbg_error_log("DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
        return true;
    }
    if ($fh) {
        fwrite($fh, $request->raw_post);
        fclose($fh);
    }
}
controlRequestContainer($dav_resource->GetProperty('username'), $dav_resource->GetProperty('user_no'), $dav_resource->bound_from(), true);
$lock_opener = $request->FailIfLocked();
if ($dav_resource->IsCollection()) {
    if ($dav_resource->IsPrincipal() || $dav_resource->IsBinding() || !isset($c->readonly_webdav_collections) || $c->readonly_webdav_collections == true) {
        $request->DoResponse(405);
        // Method not allowed
        return;
    }
    $appending = isset($_GET['mode']) && $_GET['mode'] == 'append';
    /**
     * CalDAV does not define the result of a PUT on a collection.  We treat that
     * as an import. The code is in caldav-PUT-functions.php
     */
    import_collection($request->raw_post, $request->user_no, $request->path, true, $appending);
    $request->DoResponse(200);
    return;
}
$etag = md5($request->raw_post);
$request->CheckEtagMatch($dav_resource->Exists(), $dav_resource->unique_tag());
$put_action_type = $dav_resource->Exists() ? 'UPDATE' : 'INSERT';
$collection = $dav_resource->GetParentContainer();
write_resource($dav_resource, $request->raw_post, $collection, $session->user_no, $etag, $put_action_type, true, true);
if (isset($etag)) {
    header(sprintf('ETag: "%s"', $etag));
}
$request->DoResponse($dav_resource->Exists() ? 204 : 201);