Back to index

webcit  8.12-dfsg
Functions | Variables
dav_main.c File Reference
#include "webcit.h"
#include "webserver.h"
#include "dav.h"

Go to the source code of this file.

Functions

void dav_common_headers (void)
void euid_escapize (char *target, const char *source)
void euid_unescapize (char *target, const char *source)
void dav_main (void)
void dav_identify_host (void)
void tmplput_dav_HOSTNAME (StrBuf *Target, WCTemplputParams *TP)
void dav_identify_hosthdr (void)
void Header_HandleIfMatch (StrBuf *Line, ParsedHttpHdrs *hdr)
void Header_HandleDepth (StrBuf *Line, ParsedHttpHdrs *hdr)
int Conditional_DAV_DEPTH (StrBuf *Target, WCTemplputParams *TP)
void RegisterDAVNamespace (const char *UrlString, long UrlSLen, const char *DisplayName, long dslen, WebcitHandlerFunc F, WebcitRESTDispatchID RID, long Flags)
int Conditional_DAV_NS (StrBuf *Target, WCTemplputParams *TP)
int Conditional_DAV_NSCURRENT (StrBuf *Target, WCTemplputParams *TP)
void tmplput_DAV_NAMESPACE (StrBuf *Target, WCTemplputParams *TP)
int GroupdavDispatchREST (RESTDispatchID WhichAction, int IgnoreFloor)
void ServerStartModule_DAV (void)
void ServerShutdownModule_DAV (void)
void InitModule_GROUPDAV (void)

Variables

HashList * HandlerHash
HashList * DavNamespaces = NULL

Function Documentation

int Conditional_DAV_DEPTH ( StrBuf *  Target,
WCTemplputParams TP 
)

Definition at line 230 of file dav_main.c.

{
       return WC->Hdr->HR.dav_depth == GetTemplateTokenNumber(Target, TP, 2, 0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int Conditional_DAV_NS ( StrBuf *  Target,
WCTemplputParams TP 
)

Definition at line 256 of file dav_main.c.

{
       wcsession *WCC = WC;
       void *vHandler;
       const char *NS;
       long NSLen;

       GetTemplateTokenString(NULL, TP, 2, &NS, &NSLen);
       GetHash(HandlerHash, NS, NSLen, &vHandler);
       return WCC->Hdr->HR.Handler == vHandler;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int Conditional_DAV_NSCURRENT ( StrBuf *  Target,
WCTemplputParams TP 
)

Definition at line 269 of file dav_main.c.

{
       wcsession *WCC = WC;
       void *vHandler;

       vHandler = CTX;
       return WCC->Hdr->HR.Handler == vHandler;
}

Here is the caller graph for this function:

void dav_common_headers ( void  )

Definition at line 31 of file dav_main.c.

                              {
       hprintf(
              "Server: %s / %s\r\n"
              "Connection: close\r\n",
              PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
       );
}

Here is the call graph for this function:

Here is the caller graph for this function:

void dav_identify_host ( void  )

Definition at line 192 of file dav_main.c.

                             {
       wc_printf("%s", ChrPtr(site_prefix));
}

Here is the call graph for this function:

Here is the caller graph for this function:

void dav_identify_hosthdr ( void  )

Definition at line 205 of file dav_main.c.

                                {
       hprintf("%s", ChrPtr(site_prefix));
}

Here is the call graph for this function:

Here is the caller graph for this function:

void dav_main ( void  )

Definition at line 97 of file dav_main.c.

{
       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);

       /*
        * 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.
        */
       len = StrLength(WCC->Hdr->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; i<len; ++i) {
                            if (ChrPtr(WCC->Hdr->HR.dav_ifmatch)[i] == '\"') {
                                   StrBufCutAt(WCC->Hdr->HR.dav_ifmatch, i, NULL);
                                   len = StrLength(WCC->Hdr->HR.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 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.
        */
       case ePROPFIND:
              dav_propfind();
              break;

       /*
        * The GET method is used for fetching individual items.
        */
       case eGET:
              dav_get();
              break;
       
       /*
        * The PUT method is used to add or modify items.
        */
       case ePUT:
              dav_put();
              break;
       
       /*
        * The DELETE method kills, maims, and destroys.
        */
       case eDELETE:
              dav_delete();
              break;

       /*
        * 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.
        */
              hprintf("HTTP/1.1 501 Method not implemented\r\n");
              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]);
              end_burst();
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void euid_escapize ( char *  target,
const char *  source 
)

Definition at line 44 of file dav_main.c.

                                                     {
       int i, len;
       int target_length = 0;

       strcpy(target, "");
       len = strlen(source);
       for (i=0; i<len; ++i) {
              if ( (isalnum(source[i])) || (source[i]=='-') || (source[i]=='_') ) {
                     target[target_length] = source[i];
                     target[++target_length] = 0;
              }
              else {
                     sprintf(&target[target_length], "=%02X", (0xFF & source[i]));
                     target_length += 3;
              }
       }
}

Here is the caller graph for this function:

void euid_unescapize ( char *  target,
const char *  source 
)

Definition at line 65 of file dav_main.c.

                                                       {
       int a, b, len;
       char hex[3];
       int target_length = 0;

       strcpy(target, "");

       len = strlen(source);
       for (a = 0; a < len; ++a) {
              if (source[a] == '=') {
                     hex[0] = source[a + 1];
                     hex[1] = source[a + 2];
                     hex[2] = 0;
                     b = 0;
                     b = decode_hex(hex);
                     target[target_length] = b;
                     target[++target_length] = 0;
                     a += 2;
              }
              else {
                     target[target_length] = source[a];
                     target[++target_length] = 0;
              }
       }
}

Here is the caller graph for this function:

int GroupdavDispatchREST ( RESTDispatchID  WhichAction,
int  IgnoreFloor 
)

Definition at line 294 of file dav_main.c.

{
       wcsession *WCC = WC;
       void *vDir;
       
       switch(WhichAction){
       case ExistsID:
              GetHash(WCC->Directory, IKEY(WCC->ThisRoom->nRoomNameParts + 1), &vDir);
              return locate_message_by_uid(ChrPtr((StrBuf*)vDir)) != -1;
              /* TODO: remember euid */
       case PutID:
       case DeleteID:
              break;


       }
       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void Header_HandleDepth ( StrBuf *  Line,
ParsedHttpHdrs hdr 
)

Definition at line 216 of file dav_main.c.

{
       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;
       }
}

Here is the caller graph for this function:

void Header_HandleIfMatch ( StrBuf *  Line,
ParsedHttpHdrs hdr 
)

Definition at line 210 of file dav_main.c.

{
       hdr->HR.dav_ifmatch = Line;
}

Here is the caller graph for this function:

void InitModule_GROUPDAV ( void  )

Definition at line 333 of file dav_main.c.

Here is the call graph for this function:

Here is the caller graph for this function:

void RegisterDAVNamespace ( const char *  UrlString,
long  UrlSLen,
const char *  DisplayName,
long  dslen,
WebcitHandlerFunc  F,
WebcitRESTDispatchID  RID,
long  Flags 
)

Definition at line 236 of file dav_main.c.

{
       void *vHandler;

       /* first put it in... */
       WebcitAddUrlHandler(UrlString, UrlSLen, DisplayName, dslen, F, Flags|PARSE_REST_URL);
       /* get it out again... */
       GetHash(HandlerHash, UrlString, UrlSLen, &vHandler);
       ((WebcitHandler*)vHandler)->RID = RID;
       /* and keep a copy of it, so we can compare it later */
       Put(DavNamespaces, UrlString, UrlSLen, vHandler, reference_free_handler);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void ServerShutdownModule_DAV ( void  )

Definition at line 325 of file dav_main.c.

{
       DeleteHash(&DavNamespaces);
}

Here is the caller graph for this function:

void ServerStartModule_DAV ( void  )

Definition at line 316 of file dav_main.c.

{

       DavNamespaces = NewHash(1, NULL);
}

Here is the caller graph for this function:

void tmplput_dav_HOSTNAME ( StrBuf *  Target,
WCTemplputParams TP 
)

Definition at line 197 of file dav_main.c.

{
       StrBufAppendPrintf(Target, "%s", ChrPtr(site_prefix));
}

Here is the caller graph for this function:

void tmplput_DAV_NAMESPACE ( StrBuf *  Target,
WCTemplputParams TP 
)

Definition at line 279 of file dav_main.c.

{
       wcsession *WCC = WC;

       if (TP->Filter.ContextType == CTX_DAVNS) {
              WebcitHandler *H;
              H = (WebcitHandler*) CTX;
              StrBufAppendTemplate(Target, TP, H->Name, 0);
       }
       else if (WCC->Hdr->HR.Handler != NULL) {
              StrBufAppendTemplate(Target, TP, WCC->Hdr->HR.Handler->Name, 0);
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

HashList* DavNamespaces = NULL

Definition at line 21 of file dav_main.c.

HashList* HandlerHash

Definition at line 20 of file webcit.c.