src/server/webdav/operation.h

Mon, 12 Aug 2024 21:20:17 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 12 Aug 2024 21:20:17 +0200
changeset 544
27684460629f
parent 415
d938228c382e
permissions
-rw-r--r--

fix memory leak in case handle_request fails (some illegal requests)

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2019 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef OPERATION_H
#define OPERATION_H

#include "../public/webdav.h"
#include <cx/list.h>
#include <cx/map.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef int(*response_close_func)(WebdavOperation *, WebdavResource *);

typedef struct WebdavVFSOperation WebdavVFSOperation;

typedef struct WebdavCopy         WebdavCopy;
typedef struct CopyResource       CopyResource;
    
struct WebdavOperation {
    WebdavBackend             *dav;
    Request                   *rq;
    Session                   *sn;
    
    WebdavProppatchRequest    *proppatch;    /* proppatch request or NULL */
    WebdavPList               *reqprops;     /* requested properties */
    WebdavPropfindRequestList *requests;     /* backend specific request objects */
    
    WebdavResponse            *response;
    
    response_close_func       response_close;
    
    VFS_DIR                   parent;        /* current directory */
    struct stat               *stat;         /* current stat object */
};

struct WebdavVFSOperation {
    WebdavBackend          *dav;
    Request                *rq;
    Session                *sn;
    
    VFSContext             *vfs;
    
    char                   *path;
    struct stat            *stat;
    int                    stat_errno;
};

struct WebdavCopy {
    WebdavResponse response;
    Session *sn;
    Request *rq;
    CopyResource *current;
    
    char *src_href;
    char *src_path;
    char *dst_href;
    char *dst_path;
};

struct CopyResource {
    WebdavResource resource;
    CxMap *properties;
};

enum WebdavVFSOpType {
    WEBDAV_VFS_MKDIR = 0,
    WEBDAV_VFS_DELETE
};

typedef enum WebdavVFSOpType WebdavVFSOpType;

typedef int(*vfs_op_func)(WebdavVFSRequest *, WSBool *);
typedef int(*vfs_op_finish_func)(WebdavVFSRequest *, WSBool);

typedef int(*vfs_op_child_func)(
        VFSContext *,
        const char *,                     /* href */
        const char *,                     /* path */
        VFSDir *,                         /* parent dir */
        struct stat *,                    /* child stat */
        void *);                          /* user data */

/*
 * counts the number of backends
 */
size_t webdav_num_backends(WebdavBackend *dav);

WebdavOperation* webdav_create_propfind_operation(
        Session *sn,
        Request *rq,
        WebdavBackend *dav,
        WebdavPList *reqprops,
        WebdavPropfindRequestList *requests,
        WebdavResponse *response);

int webdav_op_propfind_begin(
        WebdavOperation *op,
        const char *href,
        VFS_DIR parent,
        struct stat *s);

int webdav_op_propfind_children(
        WebdavOperation *op,
        VFSContext *vfs,
        const char *href,
        const char *path);

int webdav_op_propfiond_close_resource(
        WebdavOperation *op,
        WebdavResource *resource);

int webdav_op_propfind_finish(WebdavOperation *op);

WebdavOperation* webdav_create_proppatch_operation(
        Session *sn,
        Request *rq,
        WebdavBackend *dav,
        WebdavProppatchRequest *proppatch,
        WebdavResponse *response);

int webdav_op_proppatch(
        WebdavOperation *op,
        const char *href,
        const char *path);

int webdav_op_proppatch_close_resource(
        WebdavOperation *op,
        WebdavResource *resource);


WebdavVFSOperation* webdav_vfs_op(
        Session *sn,
        Request *rq,
        WebdavBackend *dav,
        WSBool precondition);

WebdavVFSOperation webdav_vfs_sub_op(
        WebdavVFSOperation *op,
        char *path,
        struct stat *s);

int webdav_op_iterate_children(
        VFSContext *vfs,
        int depth,
        const char *href,
        const char *path,
        vfs_op_child_func func,
        void *userdata);

int webdav_vfs_stat(WebdavVFSOperation *op);

int webdav_vfs_op_do(WebdavVFSOperation *op, WebdavVFSOpType type);

int webdav_vfs_unlink(WebdavVFSOperation *op);


WebdavCopy* webdav_copy_create(
        Session *sn,
        Request *rq,
        VFSContext *vfs,
        char *from_href,
        char *from_path,
        char *to_href,
        char *to_path);

#ifdef __cplusplus
}
#endif

#endif /* OPERATION_H */

mercurial