X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fdav_main.c;h=31cbfafffe1399af58ecc6876a1404b7515c2374;hb=HEAD;hp=93e114c8d54fcf6c13a3a9862ab3517ebeab9696;hpb=8c2d12e026dd60a3fa22112e739880b402f2b3f4;p=citadel.git diff --git a/webcit/dav_main.c b/webcit/dav_main.c index 93e114c8d..acabf94f6 100644 --- a/webcit/dav_main.c +++ b/webcit/dav_main.c @@ -1,27 +1,22 @@ /* * Entry point for GroupDAV functions * - * Copyright (c) 2005-2011 by the citadel.org team + * Copyright (c) 2005-2012 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * it under the terms of the GNU General Public License, version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "webcit.h" -#include "webserver.h" + #include "dav.h" +CtxType CTX_DAVNS = CTX_NONE; extern HashList *HandlerHash; HashList *DavNamespaces = NULL; @@ -105,6 +100,8 @@ void dav_main(void) wcsession *WCC = WC; int i, len; + syslog(LOG_DEBUG, "dav_main() called, logged_in=%d", WCC->logged_in ); + StrBufUnescape(WCC->Hdr->HR.ReqLine, 0); StrBufStripSlashes(WCC->Hdr->HR.ReqLine, 0); @@ -133,15 +130,13 @@ void dav_main(void) 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. + * The OPTIONS method is not required by GroupDAV but it will be + * needed for future implementations of other DAV-based protocols. */ case eOPTIONS: dav_options(); break; - /* * The PROPFIND method is basically used to list all objects in a * room, or to list all relevant rooms on the server. @@ -170,8 +165,15 @@ void dav_main(void) case eDELETE: dav_delete(); break; - default: + /* + * The REPORT method tells us that Mike Shaver is a self-righteous asshole. + */ + case eREPORT: + dav_report(); + break; + + default: /* * Couldn't find what we were looking for. Die in a car fire. */ @@ -211,6 +213,7 @@ void Header_HandleIfMatch(StrBuf *Line, ParsedHttpHdrs *hdr) hdr->HR.dav_ifmatch = Line; } + void Header_HandleDepth(StrBuf *Line, ParsedHttpHdrs *hdr) { if (!strcasecmp(ChrPtr(Line), "infinity")) { @@ -223,6 +226,8 @@ void Header_HandleDepth(StrBuf *Line, ParsedHttpHdrs *hdr) hdr->HR.dav_depth = 1; } } + + int Conditional_DAV_DEPTH(StrBuf *Target, WCTemplputParams *TP) { return WC->Hdr->HR.dav_depth == GetTemplateTokenNumber(Target, TP, 2, 0); @@ -248,6 +253,7 @@ void RegisterDAVNamespace(const char * UrlString, Put(DavNamespaces, UrlString, UrlSLen, vHandler, reference_free_handler); } + int Conditional_DAV_NS(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; @@ -266,24 +272,27 @@ int Conditional_DAV_NSCURRENT(StrBuf *Target, WCTemplputParams *TP) wcsession *WCC = WC; void *vHandler; - vHandler = CTX; + vHandler = CTX(CTX_NONE); return WCC->Hdr->HR.Handler == vHandler; } + void tmplput_DAV_NAMESPACE(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; if (TP->Filter.ContextType == CTX_DAVNS) { WebcitHandler *H; - H = (WebcitHandler*) CTX; - StrBufAppendTemplate(Target, TP, H->Name, 0); + H = (WebcitHandler*) CTX(CTX_DAVNS); + if (H != NULL) + StrBufAppendTemplate(Target, TP, H->Name, 0); } else if (WCC->Hdr->HR.Handler != NULL) { StrBufAppendTemplate(Target, TP, WCC->Hdr->HR.Handler->Name, 0); } } + int GroupdavDispatchREST(RESTDispatchID WhichAction, int IgnoreFloor) { wcsession *WCC = WC; @@ -310,9 +319,9 @@ ServerStartModule_DAV { DavNamespaces = NewHash(1, NULL); - } + void ServerShutdownModule_DAV (void) @@ -321,12 +330,11 @@ ServerShutdownModule_DAV } - - void InitModule_GROUPDAV (void) { + RegisterCTX(CTX_DAVNS); RegisterDAVNamespace(HKEY("groupdav"), HKEY("GroupDAV"), dav_main, GroupdavDispatchREST, XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE @@ -334,17 +342,16 @@ InitModule_GROUPDAV RegisterNamespace("DAV:HOSTNAME", 0, 0, tmplput_dav_HOSTNAME, NULL, CTX_NONE); - RegisterConditional(HKEY("COND:DAV:NS"), 0, Conditional_DAV_NS, CTX_NONE); + RegisterConditional("COND:DAV:NS", 0, Conditional_DAV_NS, CTX_NONE); RegisterIterator("DAV:NS", 0, DavNamespaces, NULL, NULL, NULL, CTX_DAVNS, CTX_NONE, IT_NOFLAG ); - RegisterConditional(HKEY("COND:DAV:NSCURRENT"), 0, Conditional_DAV_NSCURRENT, CTX_DAVNS); + RegisterConditional("COND:DAV:NSCURRENT", 0, Conditional_DAV_NSCURRENT, CTX_DAVNS); RegisterNamespace("DAV:NAMESPACE", 0, 1, tmplput_DAV_NAMESPACE, NULL, CTX_NONE); RegisterHeaderHandler(HKEY("IF-MATCH"), Header_HandleIfMatch); RegisterHeaderHandler(HKEY("DEPTH"), Header_HandleDepth); - RegisterConditional(HKEY("COND:DAV:DEPTH"), 1, Conditional_DAV_DEPTH, CTX_NONE); - + RegisterConditional("COND:DAV:DEPTH", 1, Conditional_DAV_DEPTH, CTX_NONE); }