CLEANUP: don't declare vars before code.
[citadel.git] / webcit / context_loop.c
index 4b0208204f31d6820aea0d3e580f018301795240..ff95e825ebe5ad428d604b610d8621ae6a6a327f 100644 (file)
@@ -4,21 +4,15 @@
  * keep track of things.  If the HTTP request doesn't belong to any currently
  * active session, a new session is started.
  *
- * Copyright (c) 1996-2011 by the citadel.org team
+ * Copyright (c) 1996-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.
+ * modify 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"
@@ -178,7 +172,7 @@ wcsession *FindSession(wcsession **wclist, ParsedHttpHdrs *Hdr, pthread_mutex_t
                                && (!strcasecmp(ChrPtr(Hdr->c_password), ChrPtr(sptr->wc_password)))
                                && (sptr->killthis == 0)
                        ) {
-                               syslog(LOG_DEBUG, "\033[32m-- matched a session with the same http-auth\033[0m");
+                               syslog(LOG_DEBUG, "Matched a session with the same http-auth");
                                TheSession = sptr;
                        }
                        break;
@@ -187,14 +181,14 @@ wcsession *FindSession(wcsession **wclist, ParsedHttpHdrs *Hdr, pthread_mutex_t
                        if (    (Hdr->HR.desired_session != 0)
                                && (sptr->wc_session == Hdr->HR.desired_session)
                        ) {
-                               syslog(LOG_DEBUG, "\033[32m-- matched a session with the same cookie\033[0m");
+                               syslog(LOG_DEBUG, "Matched a session with the same cookie");
                                TheSession = sptr;
                        }
                        break;                       
                case NO_AUTH:
                        /* Any unbound session is a candidate */
                        if ( (sptr->wc_session == 0) && (sptr->inuse == 0) ) {
-                               syslog(LOG_DEBUG, "\033[32m-- reusing an unbound session\033[0m");
+                               syslog(LOG_DEBUG, "Reusing an unbound session");
                                TheSession = sptr;
                        }
                        break;
@@ -202,7 +196,7 @@ wcsession *FindSession(wcsession **wclist, ParsedHttpHdrs *Hdr, pthread_mutex_t
        }
        CtdlLogResult(pthread_mutex_unlock(ListMutex));
        if (TheSession == NULL) {
-               syslog(LOG_DEBUG, "\033[32m-- no existing session was matched\033[0m");
+               syslog(LOG_DEBUG, "No existing session was matched");
        }
        return TheSession;
 }
@@ -267,7 +261,6 @@ int ReadHttpSubject(ParsedHttpHdrs *Hdr, StrBuf *Line, StrBuf *Buf)
        void *vLine, *vHandler;
        const char *Pos = NULL;
 
-
        Hdr->HR.ReqLine = Line;
        /* The requesttype... GET, POST... */
        StrBufExtract_token(Buf, Hdr->HR.ReqLine, 0, ' ');
@@ -332,15 +325,24 @@ int ReadHttpSubject(ParsedHttpHdrs *Hdr, StrBuf *Line, StrBuf *Buf)
        }
 
        if (Hdr->HR.Handler != NULL) {
-               if ((Hdr->HR.Handler->Flags & BOGUS) != 0)
+               if ((Hdr->HR.Handler->Flags & BOGUS) != 0) {
                        return 1;
+               }
                Hdr->HR.DontNeedAuth = (
                        ((Hdr->HR.Handler->Flags & ISSTATIC) != 0) ||
                        ((Hdr->HR.Handler->Flags & ANONYMOUS) != 0)
-                       );
+               );
        }
        else {
-               Hdr->HR.DontNeedAuth = 1; /* Flat request? show him the login screen... */
+               /* If this is a "flat" request for the root, display the configured landing page. */
+               int return_value;
+               StrBuf *NewLine = NewStrBuf();
+               Hdr->HR.DontNeedAuth = 1;
+               StrBufAppendPrintf(NewLine, "GET /landing?go=%s HTTP/1.0", ChrPtr(Buf));
+               syslog(LOG_DEBUG, "Replacing with: %s", ChrPtr(NewLine));
+               return_value = ReadHttpSubject(Hdr, NewLine, Buf);
+               FreeStrBuf(&NewLine);
+               return return_value;
        }
 
        return 0;
@@ -562,15 +564,6 @@ void context_loop(ParsedHttpHdrs *Hdr)
                TheSession = CreateSession(1, 0, &SessionList, Hdr, &SessionListMutex);
        }
 
-       /*
-        * If a language was requested via a cookie, select that language now.
-        */
-       if (StrLength(Hdr->c_language) > 0) {
-               syslog(9, "Session cookie requests language '%s'", ChrPtr(Hdr->c_language));
-               set_selected_language(ChrPtr(Hdr->c_language));
-               go_selected_language();
-       }
-
        /*
         * Reject transactions which require http-auth, if http-auth was not provided
         */
@@ -579,10 +572,9 @@ void context_loop(ParsedHttpHdrs *Hdr)
                && (Hdr->HR.Handler != NULL)
                && ((XHTTP_COMMANDS & Hdr->HR.Handler->Flags) == XHTTP_COMMANDS)
        ) {
-               syslog(LOG_DEBUG, "\033[35m -- http-auth required but not provided\033[0m");
+               syslog(LOG_DEBUG, "http-auth required but not provided");
                OverrideRequest(Hdr, HKEY("GET /401 HTTP/1.0"));
                Hdr->HR.prohibit_caching = 1;                           
-               /* FIXME -- we have to clear the cookie here */
        }
 
        /*
@@ -600,8 +592,20 @@ void context_loop(ParsedHttpHdrs *Hdr)
        TheSession->lastreq = time(NULL);                       /* log */
        TheSession->Hdr = Hdr;
 
+       /*
+        * If a language was requested via a cookie, select that language now.
+        */
+       if (StrLength(Hdr->c_language) > 0) {
+               syslog(LOG_DEBUG, "Session cookie requests language '%s'", ChrPtr(Hdr->c_language));
+               set_selected_language(ChrPtr(Hdr->c_language));
+               go_selected_language();
+       }
+
+       /*
+        * do the transaction
+        */
        session_attach_modules(TheSession);
-       session_loop();                         /* do transaction */
+       session_loop();
 
        /* How long did this transaction take? */
        gettimeofday(&tx_finish, NULL);
@@ -711,7 +715,8 @@ const char *ReqStrs[eNONE] = {
        "DELETE",
        "HEAD",
        "MOVE",
-       "COPY"
+       "COPY",
+       "REPORT"
 };
 
 void
@@ -757,6 +762,10 @@ ServerStartModule_CONTEXT
        v = malloc(sizeof(long));
        *v = eCOPY;
        Put(HttpReqTypes, HKEY("COPY"), v, NULL);
+
+       v = malloc(sizeof(long));
+       *v = eREPORT;
+       Put(HttpReqTypes, HKEY("REPORT"), v, NULL);
 }
 
 void