X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcontext_loop.c;h=ff95e825ebe5ad428d604b610d8621ae6a6a327f;hb=a648fdc96cf64d183b394f9b46822b4104192528;hp=4b0208204f31d6820aea0d3e580f018301795240;hpb=b075ed1dc5c3c2e1df3368a4f0791eeab07b4ceb;p=citadel.git diff --git a/webcit/context_loop.c b/webcit/context_loop.c index 4b0208204..ff95e825e 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -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