X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcontext_loop.c;h=fd0b0fe045ca1adcba8b556856c3663e15775967;hb=f9f7ec055df428b8dfb9d221d9230d6e323ac1b8;hp=c2943f07e221142ce7fb28f89edebf4f3ab777b2;hpb=8a38099b09f3080925ce7c4a62a016d6884f31bf;p=citadel.git diff --git a/webcit/context_loop.c b/webcit/context_loop.c index c2943f07e..fd0b0fe04 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -14,50 +14,48 @@ /* Only one thread may manipulate SessionList at a time... */ pthread_mutex_t SessionListMutex; -struct wcsession *SessionList = NULL; /**< our sessions ????*/ +wcsession *SessionList = NULL; /**< our sessions ????*/ pthread_key_t MyConKey; /**< TSD key for MySession() */ -/* - * free the memory used for viewing atachments - */ -void free_attachment(void *vattach) { - wc_attachment *att = (wc_attachment*) vattach; - FreeStrBuf(&att->content_type); - FreeStrBuf(&att->filename); - free(att->data); - free(att); -} - -void DestroySession(struct wcsession **sessions_to_kill) +void DestroySession(wcsession **sessions_to_kill) { close((*sessions_to_kill)->serv_sock); close((*sessions_to_kill)->chat_sock); +/* // if ((*sessions_to_kill)->preferences != NULL) { // free((*sessions_to_kill)->preferences); // } +*/ if ((*sessions_to_kill)->cache_fold != NULL) { free((*sessions_to_kill)->cache_fold); } DeleteHash(&((*sessions_to_kill)->attachments)); free_march_list((*sessions_to_kill)); DeleteHash(&((*sessions_to_kill)->hash_prefs)); - DeleteHash(&((*sessions_to_kill)->IconBarSetttings)); + DeleteHash(&((*sessions_to_kill)->IconBarSettings)); DeleteHash(&((*sessions_to_kill)->ServCfg)); FreeStrBuf(&((*sessions_to_kill)->UrlFragment1)); FreeStrBuf(&((*sessions_to_kill)->UrlFragment2)); + FreeStrBuf(&((*sessions_to_kill)->UrlFragment3)); FreeStrBuf(&((*sessions_to_kill)->WBuf)); FreeStrBuf(&((*sessions_to_kill)->HBuf)); FreeStrBuf(&((*sessions_to_kill)->CLineBuf)); + FreeStrBuf(&((*sessions_to_kill)->wc_username)); + FreeStrBuf(&((*sessions_to_kill)->wc_fullname)); + FreeStrBuf(&((*sessions_to_kill)->wc_password)); + FreeStrBuf(&((*sessions_to_kill)->wc_roomname)); + FreeStrBuf(&((*sessions_to_kill)->httpauth_user)); + FreeStrBuf(&((*sessions_to_kill)->httpauth_pass)); free((*sessions_to_kill)); (*sessions_to_kill) = NULL; } void shutdown_sessions(void) { - struct wcsession *sptr; + wcsession *sptr; for (sptr = SessionList; sptr != NULL; sptr = sptr->next) { sptr->killthis = 1; @@ -66,8 +64,8 @@ void shutdown_sessions(void) void do_housekeeping(void) { - struct wcsession *sptr, *ss; - struct wcsession *sessions_to_kill = NULL; + wcsession *sptr, *ss; + wcsession *sessions_to_kill = NULL; int num_sessions = 0; static int num_threads = MIN_WORKER_THREADS; @@ -133,8 +131,8 @@ void do_housekeeping(void) } -/** - * \brief Wake up occasionally and clean house +/* + * Wake up occasionally and clean house */ void housekeeping_loop(void) { @@ -145,13 +143,10 @@ void housekeeping_loop(void) } -/** - * \brief Create a Session id +/* + * Create a Session id * Generate a unique WebCit session ID (which is not the same thing as the * Citadel session ID). - * - * \todo FIXME ... ensure that session number is truly unique - * */ int GenerateSessionID(void) { @@ -164,45 +159,6 @@ int GenerateSessionID(void) return ++seq; } - -/* - * Collapse multiple cookies on one line - */ -////int req_gets(int *sock, char *buf, char *hold, size_t hlen) -////{ -//// int a, b; -//// -//// if (IsEmptyStr(hold)) { -//// strcpy(buf, ""); -//// a = client_getln(sock, buf, SIZ); -//// if (a<1) return(-1); -//// } else { -//// safestrncpy(buf, hold, SIZ); -//// } -//// strcpy(hold, ""); -//// -//// if (!strncasecmp(buf, "Cookie: ", 8)) { -//// int len; -//// len = strlen(buf); -//// for (a = 0; a < len; ++a) -//// if (buf[a] == ';') { -//// // we don't refresh len, because of we -//// // only exit from here. -//// snprintf(hold, hlen, "Cookie: %s", &buf[a + 1]); -//// buf[a] = 0; -//// b = 8; -//// while (isspace(hold[b])) -//// b++; -//// -//// memmove(&hold[8], &hold[b], len - b + 1); -//// return(0); -//// } -//// } -//// -//// return(0); -////} - - /* * Collapse multiple cookies on one line */ @@ -252,28 +208,26 @@ int lingering_close(int fd) -/** - * \brief sanity requests - * Check for bogus requests coming from brain-dead Windows boxes. - * - * \param http_cmd The HTTP request to check +/* + * Look for commonly-found probes of malware such as worms, viruses, trojans, and Microsoft Office. + * Short-circuit these requests so we don't have to send them through the full processing loop. */ int is_bogus(StrBuf *http_cmd) { const char *url; int i, max; + const char *bogus_prefixes[] = { + "/scripts/root.exe", /* Worms and trojans and viruses, oh my! */ + "/c/winnt", + "/MSADC/", + "/_vti", /* Broken Microsoft DAV implementation */ + "/MSOffice", /* Stoopid MSOffice thinks everyone is IIS */ + "/nonexistenshit" /* Exploit found in the wild January 2009 */ + }; url = ChrPtr(http_cmd); if (IsEmptyStr(url)) return(1); ++url; - char *bogus_prefixes[] = { - "/scripts/root.exe", /**< Worms and trojans and viruses, oh my! */ - "/c/winnt", - "/MSADC/", - "/_vti", /**< Broken Microsoft DAV implementation */ - "/MSOffice" /**< Stoopid MSOffice thinks everyone is IIS */ - }; - max = sizeof(bogus_prefixes) / sizeof(char *); for (i=0; i 0); FreeStrBuf(&HeaderName); -//// dbg_PrintHash(HTTPHeaders, nix, NULL); +/*/// dbg_PrintHash(HTTPHeaders, nix, NULL); */ - /** + /* * Can we compress? */ if (GetHash(HTTPHeaders, HKEY("ACCEPT-ENCODING"), &vLine) && @@ -394,30 +348,30 @@ void context_loop(int *sock) } } - /** + /* * Browser-based sessions use cookies for session authentication */ if (GetHash(HTTPHeaders, HKEY("COOKIE"), &vLine) && (vLine != NULL)) { cookie_to_stuff(vLine, &desired_session, - NULL, 0, NULL, 0, NULL, 0); + NULL, NULL, NULL); got_cookie = 1; } - /** + /* * GroupDAV-based sessions use HTTP authentication */ if (GetHash(HTTPHeaders, HKEY("AUTHORIZATION"), &vLine) && (vLine != NULL)) { Line = (StrBuf*)vLine; - if (strncasecmp(ChrPtr(Line), "Basic ", 6)) { + if (strncasecmp(ChrPtr(Line), "Basic", 5) == 0) { StrBufCutLeft(Line, 6); CtdlDecodeBase64(httpauth_string, ChrPtr(Line), StrLength(Line)); extract_token(httpauth_user, httpauth_string, 0, ':', sizeof httpauth_user); extract_token(httpauth_pass, httpauth_string, 1, ':', sizeof httpauth_pass); } else - lprintf(1, "Authentication sheme not supported! [%s]\n", ChrPtr(Line)); + lprintf(1, "Authentication scheme not supported! [%s]\n", ChrPtr(Line)); } if (GetHash(HTTPHeaders, HKEY("IF-MODIFIED-SINCE"), &vLine) && @@ -431,12 +385,6 @@ void context_loop(int *sock) } - /** - * If the request is prefixed by "/webcit" then chop that off. This - * allows a front end web server to forward all /webcit requests to us - * while still using the same web server port for other things. - */ - ReqType = NewStrBuf(); HTTPVersion = NewStrBuf(); StrBufExtract_token(HTTPVersion, ReqLine, 2, ' '); @@ -444,16 +392,20 @@ void context_loop(int *sock) StrBufCutLeft(ReqLine, StrLength(ReqType) + 1); StrBufCutRight(ReqLine, StrLength(HTTPVersion) + 1); - if ((StrLength(ReqLine) >= 8) && - (ptr = strstr(ChrPtr(ReqLine), "/webcit/"), /*< Handle "/webcit/" */ - (ptr != NULL))) { + /* + * If the request is prefixed by "/webcit" then chop that off. This + * allows a front end web server to forward all /webcit requests to us + * while still using the same web server port for other things. + */ + if ( (StrLength(ReqLine) >= 8) && (strstr(ChrPtr(ReqLine), "/webcit/")) ) { StrBufCutLeft(ReqLine, 7); } - /** Begin parsing the request. */ + /* Begin parsing the request. */ #ifdef TECH_PREVIEW if ((strncmp(ChrPtr(ReqLine), "/sslg", 5) != 0) && (strncmp(ChrPtr(ReqLine), "/static/", 8) != 0) && + (strncmp(ChrPtr(ReqLine), "/tiny_mce/", 10) != 0) && (strncmp(ChrPtr(ReqLine), "/wholist_section", 16) != 0) && (strstr(ChrPtr(ReqLine), "wholist_section") == NULL)) { #endif @@ -517,8 +469,8 @@ void context_loop(int *sock) /** If HTTP-AUTH, look for a session with matching credentials */ if ( (!IsEmptyStr(httpauth_user)) - &&(!strcasecmp(sptr->httpauth_user, httpauth_user)) - &&(!strcasecmp(sptr->httpauth_pass, httpauth_pass)) ) { + &&(!strcasecmp(ChrPtr(sptr->httpauth_user), httpauth_user)) + &&(!strcasecmp(ChrPtr(sptr->httpauth_pass), httpauth_pass)) ) { TheSession = sptr; } @@ -536,9 +488,9 @@ void context_loop(int *sock) */ if (TheSession == NULL) { lprintf(3, "Creating a new session\n"); - TheSession = (struct wcsession *) - malloc(sizeof(struct wcsession)); - memset(TheSession, 0, sizeof(struct wcsession)); + TheSession = (wcsession *) + malloc(sizeof(wcsession)); + memset(TheSession, 0, sizeof(wcsession)); TheSession->serv_sock = (-1); TheSession->chat_sock = (-1); @@ -555,8 +507,17 @@ void context_loop(int *sock) TheSession->wc_session = desired_session; } - strcpy(TheSession->httpauth_user, httpauth_user); - strcpy(TheSession->httpauth_pass, httpauth_pass); + if (TheSession->httpauth_user != NULL){ + FlushStrBuf(TheSession->httpauth_user); + StrBufAppendBufPlain(TheSession->httpauth_user, httpauth_user, -1, 0); + } + else TheSession->httpauth_user = NewStrBufPlain(httpauth_user, -1); + if (TheSession->httpauth_user != NULL){ + FlushStrBuf(TheSession->httpauth_pass); + StrBufAppendBufPlain(TheSession->httpauth_pass, httpauth_user, -1, 0); + } + else TheSession->httpauth_pass = NewStrBufPlain(httpauth_user, -1); + TheSession->hash_prefs = NewHash(1,NULL); /* Get a hash table for the user preferences */ pthread_mutex_init(&TheSession->SessionMutex, NULL); pthread_mutex_lock(&SessionListMutex); @@ -620,16 +581,30 @@ void context_loop(int *sock) } -void tmpl_nonce(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType) +void tmplput_nonce(StrBuf *Target, WCTemplputParams *TP) { - struct wcsession *WCC = WC; + wcsession *WCC = WC; StrBufAppendPrintf(Target, "%ld", (WCC != NULL)? WCC->nonce:0); } +void tmplput_current_user(StrBuf *Target, WCTemplputParams *TP) +{ + StrBufAppendTemplate(Target, TP, WC->wc_fullname, 0); +} + +void tmplput_current_room(StrBuf *Target, WCTemplputParams *TP) +{ + StrBufAppendTemplate(Target, TP, WC->wc_roomname, 0); +} + + + void InitModule_CONTEXT (void) { - RegisterNamespace("NONCE", 0, 0, tmpl_nonce, 0); + RegisterNamespace("CURRENT_USER", 0, 1, tmplput_current_user, CTX_NONE); + RegisterNamespace("CURRENT_ROOM", 0, 1, tmplput_current_room, CTX_NONE); + RegisterNamespace("NONCE", 0, 0, tmplput_nonce, 0); }