final touches on dkim test harness
[citadel.git] / webcit / dav_main.c
index 2b8ca189d2c91e6514f1e93731d1ef2fe2ad03f9..acabf94f6219d639e20ae53792a2ac9ed035c421 100644 (file)
@@ -1,27 +1,22 @@
 /*
  * Entry point for GroupDAV functions
  *
- * Copyright (c) 2005-2010 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;
@@ -34,7 +29,7 @@ HashList *DavNamespaces = NULL;
  * do our own header stuff here.
  *
  */
-void groupdav_common_headers(void) {
+void dav_common_headers(void) {
        hprintf(
                "Server: %s / %s\r\n"
                "Connection: close\r\n",
@@ -100,13 +95,14 @@ void euid_unescapize(char *target, const char *source) {
 /*
  * Main entry point for GroupDAV requests
  */
-void groupdav_main(void)
+void dav_main(void)
 {
        wcsession *WCC = WC;
        int i, len;
 
-       StrBufUnescape(WCC->Hdr->HR.ReqLine, 0);
+       syslog(LOG_DEBUG, "dav_main() called, logged_in=%d", WCC->logged_in );
 
+       StrBufUnescape(WCC->Hdr->HR.ReqLine, 0);
        StrBufStripSlashes(WCC->Hdr->HR.ReqLine, 0);
 
        /*
@@ -134,50 +130,55 @@ void groupdav_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:
-               groupdav_options();
+               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.
         */
        case ePROPFIND:
-               groupdav_propfind();
+               dav_propfind();
                break;
 
        /*
         * The GET method is used for fetching individual items.
         */
        case eGET:
-               groupdav_get();
+               dav_get();
                break;
        
        /*
         * The PUT method is used to add or modify items.
         */
        case ePUT:
-               groupdav_put();
+               dav_put();
                break;
        
        /*
         * The DELETE method kills, maims, and destroys.
         */
        case eDELETE:
-               groupdav_delete();
+               dav_delete();
+               break;
+
+       /*
+        * The REPORT method tells us that Mike Shaver is a self-righteous asshole.
+        */
+       case eREPORT:
+               dav_report();
                break;
-       default:
 
+       default:
        /*
         * Couldn't find what we were looking for.  Die in a car fire.
         */
                hprintf("HTTP/1.1 501 Method not implemented\r\n");
-               groupdav_common_headers();
+               dav_common_headers();
                hprintf("Content-Type: text/plain\r\n");
                wc_printf("GroupDAV method \"%s\" is not implemented.\r\n",
                        ReqStrs[WCC->Hdr->HR.eReqType]);
@@ -189,12 +190,12 @@ void groupdav_main(void)
 /*
  * Output our host prefix for globally absolute URL's.
  */  
-void groupdav_identify_host(void) {
+void dav_identify_host(void) {
        wc_printf("%s", ChrPtr(site_prefix));
 }
 
 
-void tmplput_dav.hOSTNAME(StrBuf *Target, WCTemplputParams *TP) 
+void tmplput_dav_HOSTNAME(StrBuf *Target, WCTemplputParams *TP) 
 {
        StrBufAppendPrintf(Target, "%s", ChrPtr(site_prefix));
 }
@@ -202,7 +203,7 @@ void tmplput_dav.hOSTNAME(StrBuf *Target, WCTemplputParams *TP)
 /*
  * Output our host prefix for globally absolute URL's.
  */  
-void groupdav_identify_hosthdr(void) {
+void dav_identify_hosthdr(void) {
        hprintf("%s", ChrPtr(site_prefix));
 }
 
@@ -212,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")) {
@@ -224,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);
@@ -249,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;
@@ -267,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;
@@ -311,9 +319,9 @@ ServerStartModule_DAV
 {
 
        DavNamespaces = NewHash(1, NULL);
-
 }
 
+
 void 
 ServerShutdownModule_DAV
 (void)
@@ -322,32 +330,28 @@ ServerShutdownModule_DAV
 }
 
 
-
-
 void 
 InitModule_GROUPDAV
 (void)
 {
-/*
-       WebcitAddUrlHandler(HKEY("groupdav"), "", 0, groupdav_main, XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
- */
+       RegisterCTX(CTX_DAVNS);
        RegisterDAVNamespace(HKEY("groupdav"), HKEY("GroupDAV"), 
-                            groupdav_main, GroupdavDispatchREST, 
-                            XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
+                            dav_main, GroupdavDispatchREST, 
+                            XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE
+       );
 
-       RegisterNamespace("DAV:HOSTNAME", 0, 0, tmplput_dav.hOSTNAME, NULL, CTX_NONE);
+       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);
-
+                        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);
 }