X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.c;h=da57d4723a717f8e00315d11a1e3ce1860279bd0;hb=fcb8c4169baa629eb3c1a4979c7c8c32f1560389;hp=f7f7931699831e20ec9f5bb65c07cc19413cb873;hpb=c27e730a913cb5cd2fdd7ab6825b84892b832bf4;p=citadel.git diff --git a/webcit/webcit.c b/webcit/webcit.c index f7f793169..da57d4723 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -1,6 +1,4 @@ /* - * $Id$ - * * This is the main transaction loop of the web service. It maintains a * persistent session to the Citadel server, handling HTTP WebCit requests as * they arrive and presenting a user interface. @@ -16,6 +14,14 @@ StrBuf *csslocal = NULL; HashList *HandlerHash = NULL; +void PutRequestLocalMem(void *Data, DeleteHashDataFunc DeleteIt) +{ + wcsession *WCC = WC; + int n; + + n = GetCount(WCC->Hdr->HTTPHeaders); + Put(WCC->Hdr->HTTPHeaders, IKEY(n), Data, DeleteIt); +} void DeleteWebcitHandler(void *vHandler) { @@ -48,11 +54,6 @@ void tmplput_HANDLER_DISPLAYNAME(StrBuf *Target, WCTemplputParams *TP) StrBufAppendTemplate(Target, TP, WCC->Hdr->HR.Handler->DisplayName, 0); } -void tmplput_HOST_DISPLAYNAME(StrBuf *Target, WCTemplputParams *TP) -{ - wcsession *WCC = WC; - StrBufAppendTemplate(Target, TP, WCC->Hdr->HR.http_host, 0); -} /* * web-printing funcion. uses our vsnprintf wrapper @@ -121,17 +122,17 @@ void wDumpContent(int print_standard_html_footer) /* * Output HTTP headers and leading HTML for a page */ -void output_headers( int do_httpheaders, /* 1 = output HTTP headers */ +void output_headers( int do_httpheaders, /* 1 = output HTTP headers */ int do_htmlhead, /* 1 = output HTML section and opener */ - int do_room_banner, /* 0=no, 1=yes, + int do_room_banner, /* 0=no, 1=yes, * 2 = I'm going to embed my own, so don't open the - *
either. + *
either. */ int unset_cookies, /* 1 = session is terminating, so unset the cookies */ - int suppress_check, /* 1 = suppress check for instant messages */ - int cache /* 1 = allow browser to cache this page */ + int suppress_check, /* 1 = suppress check for instant messages */ + int cache /* 1 = allow browser to cache this page */ ) { wcsession *WCC = WC; char httpnow[128]; @@ -185,7 +186,7 @@ void output_headers( int do_httpheaders, /* 1 = output HTTP headers wc_printf("
\n" ""); StrEscAppend(WCC->WBuf, NULL, WCC->ImportantMessage, 0, 0); - wc_printf("
\n" + wc_printf("
\n" "
\n" ); StrBufAppendBufPlain(WCC->trailing_javascript, @@ -198,7 +199,7 @@ void output_headers( int do_httpheaders, /* 1 = output HTTP headers wc_printf("
\n" ""); StrEscAppend(WCC->WBuf, WCC->ImportantMsg, NULL, 0, 0); - wc_printf("
\n" + wc_printf("
\n" "
\n" ); StrBufAppendBufPlain(WCC->trailing_javascript, @@ -212,9 +213,7 @@ void output_headers( int do_httpheaders, /* 1 = output HTTP headers } if (do_room_banner == 1) { - wc_printf("
\n"); - embed_room_banner(NULL); - wc_printf("
\n"); + tmplput_roombanner(NULL, NULL); } } @@ -251,15 +250,10 @@ void http_redirect(const char *whichpage) { /* * Output a piece of content to the web browser using conformant HTTP and MIME semantics */ -void http_transmit_thing(const char *content_type, - int is_static) { +void http_transmit_thing(const char *content_type, int is_static) +{ -#ifndef TECH_PREVIEW - lprintf(9, "http_transmit_thing(%s)%s\n", - content_type, - ((is_static > 0) ? " (static)" : "") - ); -#endif + lprintf(9, "http_transmit_thing(%s)%s\n", content_type, ((is_static > 0) ? " (static)" : "")); output_headers(0, 0, 0, 0, 0, is_static); hprintf("Content-type: %s\r\n" @@ -327,8 +321,7 @@ void display_success(char *successmessage) /* - * Authorization required page - * This is probably temporary and should be revisited + * Authorization required page (sends a 401, causing the browser to request login credentials) */ void authorization_required(void) { @@ -367,21 +360,21 @@ void begin_ajax_response(void) { wcsession *WCC = WC; FlushStrBuf(WCC->HBuf); - output_headers(0, 0, 0, 0, 0, 0); + output_headers(0, 0, 0, 0, 0, 0); - hprintf("Content-type: text/html; charset=UTF-8\r\n" - "Server: %s\r\n" - "Connection: close\r\n" + hprintf("Content-type: text/html; charset=UTF-8\r\n" + "Server: %s\r\n" + "Connection: close\r\n" , - PACKAGE_STRING); - begin_burst(); + PACKAGE_STRING); + begin_burst(); } /* * print ajax response footer */ void end_ajax_response(void) { - wDumpContent(0); + wDumpContent(0); } @@ -483,23 +476,22 @@ void seconds_since_last_gexp(void) int ReadPostData(void) { int rc; - int body_start = 0; + int urlencoded_post = 0; wcsession *WCC = WC; StrBuf *content = NULL; + urlencoded_post = (strncasecmp(ChrPtr(WCC->Hdr->HR.ContentType), "application/x-www-form-urlencoded", 33) == 0) ; + content = NewStrBufPlain(NULL, WCC->Hdr->HR.ContentLength + 256); - StrBufPrintf(content, + if (!urlencoded_post) + { + StrBufPrintf(content, "Content-type: %s\n" - "Content-length: %ld\n\n", - ChrPtr(WCC->Hdr->HR.ContentType), + "Content-length: %ld\n\n", + ChrPtr(WCC->Hdr->HR.ContentType), WCC->Hdr->HR.ContentLength); -/* - hprintf("Content-type: %s\n" - "Content-length: %d\n\n", - ContentType, ContentLength); -*/ - body_start = StrLength(content); + } /** Read the entire input data at once. */ rc = client_read_to(WCC->Hdr, content, @@ -509,8 +501,7 @@ int ReadPostData(void) return rc; - if (!strncasecmp(ChrPtr(WCC->Hdr->HR.ContentType), "application/x-www-form-urlencoded", 33)) { - StrBufCutLeft(content, body_start); + if (urlencoded_post) { ParseURLParams(content); } else if (!strncasecmp(ChrPtr(WCC->Hdr->HR.ContentType), "multipart", 9)) { char *Buf; @@ -628,6 +619,14 @@ void session_loop(void) Buf = NewStrBuf(); WCC->trailing_javascript = NewStrBuf(); + /* Convert base64-encoded URL's back to plain text */ + if (!strncmp(ChrPtr(WCC->Hdr->this_page), "/B64", 4)) { + StrBufCutLeft(WCC->Hdr->this_page, 4); + StrBufDecodeBase64(WCC->Hdr->this_page); + http_redirect(ChrPtr(WCC->Hdr->this_page)); + goto SKIP_ALL_THIS_CRAP; + } + /* If there are variables in the URL, we must grab them now */ if (WCC->Hdr->PlainArgs != NULL) ParseURLParams(WCC->Hdr->PlainArgs); @@ -652,7 +651,17 @@ void session_loop(void) * connection now. */ if (!WCC->connected) { - if (GetConnected ()) + if (GetConnected()) { + hprintf("HTTP/1.1 503 Service Unavailable\r\n"); + hprintf("Content-Type: text/html\r\n"); + begin_burst(); + wc_printf("503 Service Unavailable\n"); + wc_printf(_("This program was unable to connect or stay " + "connected to the Citadel server. Please report " + "this problem to your system administrator.") + ); + wc_printf("\n"); + end_burst(); goto SKIP_ALL_THIS_CRAP; } @@ -725,7 +734,10 @@ void session_loop(void) } if (WCC->Hdr->HR.Handler != NULL) { - if (!WCC->logged_in && ((WCC->Hdr->HR.Handler->Flags & ANONYMOUS) == 0)) { + if ( (!WCC->logged_in) + && ((WCC->Hdr->HR.Handler->Flags & ANONYMOUS) == 0) + && (WCC->serv_info->serv_supports_guest == 0) + ) { display_login(); } else { @@ -740,17 +752,19 @@ void session_loop(void) end_ajax_response(); } } - /* When all else fais, display the main menu. */ + /* When all else fails, display the default landing page or a main menu. */ else { /* * ordinary browser users get a nice login screen, DAV etc. requsets * are given a 401 so they can handle it appropriate. */ if (!WCC->logged_in) { - if (xhttp) + if (xhttp) { authorization_required(); - else - display_login(); + } + else { + display_default_landing_page(); + } } /* * Toplevel dav requests? or just a flat browser request? @@ -769,6 +783,23 @@ SKIP_ALL_THIS_CRAP: } + +/* + * Display the appropriate landing page for this site. + */ +void display_default_landing_page(void) { + if (WC->serv_info->serv_supports_guest) { + /* default action. probably revisit this. */ + StrBuf *teh_lobby = NewStrBufPlain(HKEY("_BASEROOM_")); + smart_goto(teh_lobby); + FreeStrBuf(&teh_lobby); + } + else { + display_login(); + } +} + + /* * Replacement for sleep() that uses select() in order to avoid SIGALRM */ @@ -860,7 +891,6 @@ InitModule_WEBCIT RegisterNamespace("IMPORTANTMESSAGE", 0, 0, tmplput_importantmessage, NULL, CTX_NONE); RegisterNamespace("TRAILING_JAVASCRIPT", 0, 0, tmplput_trailing_javascript, NULL, CTX_NONE); RegisterNamespace("URL:DISPLAYNAME", 0, 1, tmplput_HANDLER_DISPLAYNAME, NULL, CTX_NONE); - RegisterNamespace("URL:HOSTNAME", 0, 1, tmplput_HOST_DISPLAYNAME, NULL, CTX_NONE); snprintf(dir, SIZ, "%s/webcit.css", static_local_dir);