X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fgroupdav_main.c;h=9b75c504117f88ed62bacb308956ed94c7a83eed;hb=8e165dd308679f195af8614d62dbdb4e43238495;hp=6fe89b1b927e0fd54d715255e81b6fa186843a6a;hpb=6bf8d4e117cff7649722b5237275d2e17ed6edab;p=citadel.git diff --git a/webcit/groupdav_main.c b/webcit/groupdav_main.c index 6fe89b1b9..9b75c5041 100644 --- a/webcit/groupdav_main.c +++ b/webcit/groupdav_main.c @@ -1,19 +1,17 @@ /* * $Id$ - */ -/** - * \defgroup GroupdavMain Entry point for GroupDAV functions - * \ingroup WebcitHttpServerGDav + * + * Entry point for GroupDAV functions * */ -/*@{*/ + #include "webcit.h" #include "webserver.h" #include "groupdav.h" -/** - * \brief Output HTTP headers which are common to all requests. +/* + * Output HTTP headers which are common to all requests. * * Please observe that we don't use the usual output_headers() * and wDumpContent() functions in the GroupDAV subsystem, so we @@ -21,76 +19,58 @@ * */ void groupdav_common_headers(void) { - wprintf( + hprintf( "Server: %s / %s\r\n" "Connection: close\r\n", - SERVER, serv_info.serv_software + PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software) ); } -/** - * \brief string conversion function - * \param target output string - * \param source string to process +/* + * string conversion function */ -void euid_escapize(char *target, char *source) { - int i; +void euid_escapize(char *target, const char *source) { + int i, len; int target_length = 0; strcpy(target, ""); - for (i=0; inext) { - if (!strncasecmp(rptr->line, "If-Match: ", 10)) { - safestrncpy(dav_ifmatch, &rptr->line[10], - sizeof dav_ifmatch); - } - } +void groupdav_main(void) +{ + wcsession *WCC = WC; + int i, len; - if (!WC->logged_in) { - wprintf("HTTP/1.1 401 Unauthorized\r\n"); - groupdav_common_headers(); - wprintf("WWW-Authenticate: Basic realm=\"%s\"\r\n", - serv_info.serv_humannode); - wprintf("Content-Length: 0\r\n\r\n"); - return; - } + StrBufUnescape(WCC->Hdr->HR.ReqLine, 0); - extract_token(dav_method, req->line, 0, ' ', sizeof dav_method); - extract_token(dav_pathname, req->line, 1, ' ', sizeof dav_pathname); - unescape_input(dav_pathname); + StrBufStripSlashes(WCC->Hdr->HR.ReqLine, 0); - /** - * If the request does not begin with "/groupdav", prepend it. If - * we happen to introduce a double-slash, that's ok; we'll strip it - * in the next step. - */ - if (strncasecmp(dav_pathname, "/groupdav", 9)) { - snprintf(buf, sizeof buf, "/groupdav/%s", dav_pathname); - safestrncpy(dav_pathname, buf, sizeof dav_pathname); - } - - /** Remove any stray double-slashes in pathname */ - while (ds=strstr(dav_pathname, "//"), ds != NULL) { - strcpy(ds, ds+1); - } - - /** + /* * If there's an If-Match: header, strip out the quotes if present, and * then if all that's left is an asterisk, make it go away entirely. */ - if (strlen(dav_ifmatch) > 0) { - striplt(dav_ifmatch); - if (dav_ifmatch[0] == '\"') { - strcpy(dav_ifmatch, &dav_ifmatch[1]); - for (i=0; iHdr->HR.dav_ifmatch); + if (len > 0) { + StrBufTrim(WCC->Hdr->HR.dav_ifmatch); + if (ChrPtr(WCC->Hdr->HR.dav_ifmatch)[0] == '\"') { + StrBufCutLeft(WCC->Hdr->HR.dav_ifmatch, 1); + len --; + for (i=0; iHdr->HR.dav_ifmatch)[i] == '\"') { + StrBufCutAt(WCC->Hdr->HR.dav_ifmatch, i, NULL); + len = StrLength(WCC->Hdr->HR.dav_ifmatch); } } } - if (!strcmp(dav_ifmatch, "*")) { - strcpy(dav_ifmatch, ""); + if (!strcmp(ChrPtr(WCC->Hdr->HR.dav_ifmatch), "*")) { + FlushStrBuf(WCC->Hdr->HR.dav_ifmatch); } } - /** + switch (WCC->Hdr->HR.eReqType) + { + /* * The OPTIONS method is not required by GroupDAV. This is an * experiment to determine what might be involved in supporting * other variants of DAV in the future. */ - if (!strcasecmp(dav_method, "OPTIONS")) { - groupdav_options(dav_pathname); - return; - } + case eOPTIONS: + groupdav_options(); + break; - /** + + /* * The PROPFIND method is basically used to list all objects in a * room, or to list all relevant rooms on the server. */ - if (!strcasecmp(dav_method, "PROPFIND")) { - groupdav_propfind(dav_pathname); - return; - } + case ePROPFIND: + groupdav_propfind(); + break; - /** + /* * The GET method is used for fetching individual items. */ - if (!strcasecmp(dav_method, "GET")) { - groupdav_get(dav_pathname); - return; - } - - /** + case eGET: + groupdav_get(); + break; + + /* * The PUT method is used to add or modify items. */ - if (!strcasecmp(dav_method, "PUT")) { - groupdav_put(dav_pathname, dav_ifmatch, - dav_content_type, dav_content); - return; - } - - /** + case ePUT: + groupdav_put(); + break; + + /* * The DELETE method kills, maims, and destroys. */ - if (!strcasecmp(dav_method, "DELETE")) { - groupdav_delete(dav_pathname, dav_ifmatch); - return; - } + case eDELETE: + groupdav_delete(); + break; + default: - /** + /* * Couldn't find what we were looking for. Die in a car fire. */ - wprintf("HTTP/1.1 501 Method not implemented\r\n"); - groupdav_common_headers(); - wprintf("Content-Type: text/plain\r\n" - "\r\n" - "GroupDAV method \"%s\" is not implemented.\r\n", - dav_method - ); + hprintf("HTTP/1.1 501 Method not implemented\r\n"); + groupdav_common_headers(); + hprintf("Content-Type: text/plain\r\n"); + wc_printf("GroupDAV method \"%s\" is not implemented.\r\n", + ReqStrs[WCC->Hdr->HR.eReqType]); + end_burst(); + } } -/** - * \brief Output http[s]://fqdn.example.com[:port] to the client. - */ -void output_host_prefix(void) { - if (strlen(WC->http_host) > 0) { - wprintf("%s://%s", +/* + * Output our host prefix for globally absolute URL's. + */ +void groupdav_identify_host(void) { + wcsession *WCC = WC; + + if (StrLength(WCC->Hdr->HR.http_host)!=0) { + wc_printf("%s://%s", (is_https ? "https" : "http"), - WC->http_host); + ChrPtr(WCC->Hdr->HR.http_host)); } } +/* + * Output our host prefix for globally absolute URL's. + */ +void groupdav_identify_hosthdr(void) { + wcsession *WCC = WC; -/*@}*/ + if (StrLength(WCC->Hdr->HR.http_host)!=0) { + hprintf("%s://%s", + (is_https ? "https" : "http"), + ChrPtr(WCC->Hdr->HR.http_host)); + } +} + + +void Header_HandleIfMatch(StrBuf *Line, ParsedHttpHdrs *hdr) +{ + hdr->HR.dav_ifmatch = Line; +} + +void Header_HandleDepth(StrBuf *Line, ParsedHttpHdrs *hdr) +{ + if (!strcasecmp(ChrPtr(Line), "infinity")) { + hdr->HR.dav_depth = 32767; + } + else if (strcmp(ChrPtr(Line), "0") == 0) { + hdr->HR.dav_depth = 0; + } + else if (strcmp(ChrPtr(Line), "1") == 0) { + hdr->HR.dav_depth = 1; + } +} + +void +InitModule_GROUPDAV +(void) +{ + WebcitAddUrlHandler(HKEY("groupdav"), "", 0, groupdav_main, XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE); + RegisterHeaderHandler(HKEY("IF-MATCH"), Header_HandleIfMatch); + RegisterHeaderHandler(HKEY("DEPTH"), Header_HandleDepth); + +}