Browse Source

remove signess warnings, fixed PROPFIND listings, send 404 in PROPPATCH if resource doesn't exist

git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-merge-1.4.x@595 152afb58-edef-0310-8abb-c4023f1b3aa9
svn/tags/lighttpd-1.4.2
Jan Kneschke 17 years ago
parent
commit
71d3dad979
  1. 61
      src/mod_webdav.c

61
src/mod_webdav.c

@ -9,6 +9,16 @@
#include <fcntl.h>
#include <stdio.h>
#include "config.h"
#if defined(HAVE_LIBXML_H) && defined(HAVE_SQLITE3_H)
#define USE_PROPPATCH
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <sqlite3.h>
#endif
#include "base.h"
#include "log.h"
#include "buffer.h"
@ -16,18 +26,9 @@
#include "plugin.h"
#include "config.h"
#include "stream.h"
#include "stat_cache.h"
#if defined(HAVE_LIBXML_H) && defined(HAVE_SQLITE3_H)
#define USE_PROPPATCH
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <sqlite3.h>
#endif
/**
* this is a webdav for a lighttpd plugin
@ -337,7 +338,7 @@ URIHANDLER_FUNC(mod_webdav_uri_handler) {
if (p->conf.is_readonly) {
response_header_insert(srv, con, CONST_STR_LEN("Allow"), CONST_STR_LEN("PROPFIND"));
} else {
response_header_insert(srv, con, CONST_STR_LEN("Allow"), CONST_STR_LEN("PROPFIND, DELETE, MKCOL, PUT, MOVE, COPY"));
response_header_insert(srv, con, CONST_STR_LEN("Allow"), CONST_STR_LEN("PROPFIND, DELETE, MKCOL, PUT, MOVE, COPY, PROPPATCH"));
}
break;
default:
@ -350,7 +351,7 @@ URIHANDLER_FUNC(mod_webdav_uri_handler) {
static int webdav_gen_prop_tag(server *srv, connection *con,
char *prop_name,
char *prop_ns,
const char *value,
char *value,
buffer *b) {
UNUSED(srv);
@ -532,6 +533,8 @@ static int webdav_copy_file(server *srv, connection *con, plugin_data *p, physic
stream s;
int status = 0, ofd;
UNUSED(con);
if (stream_open(&s, src->path)) {
return 403;
}
@ -780,7 +783,7 @@ static int webdav_get_property(server *srv, connection *con, plugin_data *p, phy
/* it is the PK */
while (SQLITE_ROW == sqlite3_step(p->conf.stmt_select_prop)) {
/* there is a row for us, we only expect a single col 'value' */
webdav_gen_prop_tag(srv, con, prop_name, prop_ns, sqlite3_column_text(p->conf.stmt_select_prop, 0), b);
webdav_gen_prop_tag(srv, con, prop_name, prop_ns, (char *)sqlite3_column_text(p->conf.stmt_select_prop, 0), b);
found = 1;
}
#endif
@ -829,7 +832,7 @@ static int webdav_get_props(server *srv, connection *con, plugin_data *p, physic
prop = props->ptr[i];
if (0 != webdav_get_property(srv, con, p,
&(con->physical), prop->prop, prop->ns, b_200)) {
dst, prop->prop, prop->ns, b_200)) {
webdav_gen_prop_tag(srv, con, prop->prop, prop->ns, NULL, b_404);
}
}
@ -927,8 +930,8 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
}
req_props->ptr[req_props->used] = malloc(sizeof(webdav_property));
req_props->ptr[req_props->used]->ns = xmlStrdup(prop->ns ? prop->ns->href : (xmlChar *)"");
req_props->ptr[req_props->used]->prop = xmlStrdup(prop->name);
req_props->ptr[req_props->used]->ns = (char *)xmlStrdup(prop->ns ? prop->ns->href : (xmlChar *)"");
req_props->ptr[req_props->used]->prop = (char *)xmlStrdup(prop->name);
req_props->used++;
}
} else if (0 == xmlStrcmp(cmd->name, BAD_CAST "propname")) {
@ -1038,6 +1041,9 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
BUFFER_APPEND_SLASH(d.rel_path);
buffer_append_string(d.rel_path, de->d_name);
buffer_reset(prop_200);
buffer_reset(prop_404);
webdav_get_props(srv, con, p, &d, req_props, prop_200, prop_404);
buffer_append_string(b,"<D:response>\n");
@ -1369,8 +1375,10 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
}
if (con->request.http_method == HTTP_METHOD_MOVE) {
b = buffer_init();
webdav_delete_dir(srv, con, p, &(con->physical), b);
webdav_delete_dir(srv, con, p, &(con->physical), b); /* content */
buffer_free(b);
rmdir(con->physical.path->ptr);
}
con->http_status = 201;
} else {
@ -1452,6 +1460,19 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
return HANDLER_FINISHED;
}
case HTTP_METHOD_PROPPATCH: {
if (p->conf.is_readonly) {
con->http_status = 403;
return HANDLER_FINISHED;
}
/* check if destination exists */
if (-1 == stat(con->physical.path->ptr, &st)) {
switch(errno) {
case ENOENT:
con->http_status = 404;
break;
}
}
#ifdef USE_PROPPATCH
if (con->request.content_length) {
@ -1515,12 +1536,12 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
con->uri.path->used - 1,
SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2,
prop->name,
(char *)prop->name,
strlen((char *)prop->name),
SQLITE_TRANSIENT);
if (prop->ns) {
sqlite3_bind_text(stmt, 3,
prop->ns->href,
(char *)prop->ns->href,
strlen((char *)prop->ns->href),
SQLITE_TRANSIENT);
} else {
@ -1531,8 +1552,8 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
}
if (stmt == p->conf.stmt_update_prop) {
sqlite3_bind_text(stmt, 4,
xmlNodeGetContent(prop),
strlen(xmlNodeGetContent(prop)),
(char *)xmlNodeGetContent(prop),
strlen((char *)xmlNodeGetContent(prop)),
SQLITE_TRANSIENT);
}

Loading…
Cancel
Save