From 5a825607ef9581165e382ab6989c1c4d7cdf1254 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Sun, 25 Jan 2009 21:31:24 +0000 Subject: [PATCH] * shuffled members of wcsession -> do a make clean or everything will burst in your face * moved two more wcsession-members to strbuf --- webcit/auth.c | 5 +- webcit/groupdav_main.c | 12 +++-- webcit/listsub.c | 10 ++-- webcit/locate_host.c | 8 +-- webcit/mainmenu.c | 2 +- webcit/openid.c | 10 ++-- webcit/preferences.c | 2 +- webcit/roomops.c | 8 +-- webcit/rss.c | 2 +- webcit/serv_func.c | 12 ++--- webcit/webcit.c | 40 +++++++-------- webcit/webcit.h | 114 +++++++++++++++++++++++++---------------- webcit/webserver.c | 2 + 13 files changed, 131 insertions(+), 96 deletions(-) diff --git a/webcit/auth.c b/webcit/auth.c index 082321604..e48c4e69c 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -332,6 +332,7 @@ void openid_manual_create(void) */ void do_openid_login(void) { + wcsession *WCC = WC; char buf[4096]; if (havebstr("language")) { @@ -347,8 +348,8 @@ void do_openid_login(void) snprintf(buf, sizeof buf, "OIDS %s|%s://%s/finalize_openid_login|%s://%s", bstr("openid_url"), - (is_https ? "https" : "http"), WC->http_host, - (is_https ? "https" : "http"), WC->http_host + (is_https ? "https" : "http"), ChrPtr(WCC->http_host), + (is_https ? "https" : "http"), ChrPtr(WCC->http_host) ); serv_puts(buf); diff --git a/webcit/groupdav_main.c b/webcit/groupdav_main.c index 19b060c13..a2c3f169d 100644 --- a/webcit/groupdav_main.c +++ b/webcit/groupdav_main.c @@ -92,6 +92,7 @@ void groupdav_main(HashList *HTTPHeaders, StrBuf *dav_content, int Offset ) { + wcsession *WCC = WC; void *vLine; char dav_ifmatch[256]; int dav_depth; @@ -101,11 +102,10 @@ void groupdav_main(HashList *HTTPHeaders, strcpy(dav_ifmatch, ""); dav_depth = 0; - if (IsEmptyStr(WC->http_host) && + if ((StrLength(WCC->http_host) == 0) && GetHash(HTTPHeaders, HKEY("HOST"), &vLine) && (vLine != NULL)) { - safestrncpy(WC->http_host, ChrPtr((StrBuf*)vLine), - sizeof WC->http_host); + WCC->http_host = (StrBuf*)vLine; } if (GetHash(HTTPHeaders, HKEY("IF-MATCH"), &vLine) && (vLine != NULL)) { @@ -243,9 +243,11 @@ void groupdav_main(HashList *HTTPHeaders, * Output our host prefix for globally absolute URL's. */ void groupdav_identify_host(void) { - if (!IsEmptyStr(WC->http_host)) { + wcsession *WCC = WC; + + if (StrLength(WCC->http_host)!=0) { wprintf("%s://%s", (is_https ? "https" : "http"), - WC->http_host); + ChrPtr(WCC->http_host)); } } diff --git a/webcit/listsub.c b/webcit/listsub.c index a694cd227..8a2f2f5ac 100644 --- a/webcit/listsub.c +++ b/webcit/listsub.c @@ -61,7 +61,7 @@ void do_listsub(void) email, subtype, (is_https ? "https" : "http"), - WC->http_host + ChrPtr(WC->http_host) ); serv_getln(buf, sizeof buf); if (buf[0] == '2') { @@ -99,10 +99,10 @@ void do_listsub(void) */ else if (!strcasecmp(cmd, "unsubscribe")) { serv_printf("SUBS unsubscribe|%s|%s|%s://%s/listsub", - room, - email, - (is_https ? "https" : "http"), - WC->http_host + room, + email, + (is_https ? "https" : "http"), + ChrPtr(WC->http_host) ); serv_getln(buf, sizeof buf); if (buf[0] == '2') { diff --git a/webcit/locate_host.c b/webcit/locate_host.c index 7b5869907..8b03833d5 100644 --- a/webcit/locate_host.c +++ b/webcit/locate_host.c @@ -15,7 +15,7 @@ * \param tbuf the returnbuffer * \param client_socket the sock fd where the client is connected */ -void locate_host(char *tbuf, int client_socket) +void locate_host(StrBuf *tbuf, int client_socket) { struct sockaddr_in cs; struct hostent *ch; @@ -25,7 +25,7 @@ void locate_host(char *tbuf, int client_socket) len = sizeof(cs); if (getpeername(client_socket, (struct sockaddr *) &cs, &len) < 0) { - strcpy(tbuf, ""); + StrBufAppendBufPlain(tbuf, HKEY(""), 0); return; } if ((ch = gethostbyaddr((char *) &cs.sin_addr, sizeof(cs.sin_addr), @@ -35,10 +35,10 @@ void locate_host(char *tbuf, int client_socket) a2 = ((*i++) & 0xff); a3 = ((*i++) & 0xff); a4 = ((*i++) & 0xff); - sprintf(tbuf, "%d.%d.%d.%d", a1, a2, a3, a4); + StrBufPrintf(tbuf, "%d.%d.%d.%d", a1, a2, a3, a4); return; } - safestrncpy(tbuf, ch->h_name, 64); + StrBufAppendBufPlain(tbuf, ch->h_name, -1, 0); } /*@}*/ diff --git a/webcit/mainmenu.c b/webcit/mainmenu.c index 82c28918b..5233204e1 100644 --- a/webcit/mainmenu.c +++ b/webcit/mainmenu.c @@ -243,7 +243,7 @@ void display_generic(void) wprintf("

\n"); wprintf(""); - wprintf(_("Detected host header is %s://%s"), (is_https ? "https" : "http"), WC->http_host); + wprintf(_("Detected host header is %s://%s"), (is_https ? "https" : "http"), ChrPtr(WC->http_host)); wprintf("\n"); wprintf("", _("Send command")); wprintf(" "); diff --git a/webcit/openid.c b/webcit/openid.c index dc6d09838..a4af9d257 100644 --- a/webcit/openid.c +++ b/webcit/openid.c @@ -67,13 +67,15 @@ void openid_attach(void) { char buf[4096]; if (havebstr("attach_button")) { + wcsession *WCC = WC; + lprintf(CTDL_DEBUG, "Attempting to attach %s\n", bstr("openid_url")); snprintf(buf, sizeof buf, - "OIDS %s|%s://%s/finalize_openid_login|%s://%s", - bstr("openid_url"), - (is_https ? "https" : "http"), WC->http_host, - (is_https ? "https" : "http"), WC->http_host + "OIDS %s|%s://%s/finalize_openid_login|%s://%s", + bstr("openid_url"), + (is_https ? "https" : "http"), ChrPtr(WCC->http_host), + (is_https ? "https" : "http"), ChrPtr(WCC->http_host) ); serv_puts(buf); diff --git a/webcit/preferences.c b/webcit/preferences.c index 860bafa0a..732ee1f59 100644 --- a/webcit/preferences.c +++ b/webcit/preferences.c @@ -838,7 +838,7 @@ void DeleteGVSNHash(HashList **KillMe) void offer_start_page(StrBuf *Target, WCTemplputParams *TP) { wprintf("this_page); + urlescputs(ChrPtr(WC->this_page)); wprintf("\">"); wprintf(_("Make this my start page")); wprintf(""); diff --git a/webcit/roomops.c b/webcit/roomops.c index c180b529d..30cc875e9 100644 --- a/webcit/roomops.c +++ b/webcit/roomops.c @@ -496,8 +496,10 @@ void embed_room_banner(char *got, int navbar_style) { * we want it to remember the URL as a "/dotskip" one instead of * a "skip" or "gotonext" or something like that. */ - snprintf(WC->this_page, sizeof(WC->this_page), "dotskip&room=%s", - ChrPtr(WC->wc_roomname)); + FreeStrBuf(&WC->this_page); + StrBufPrintf(WC->this_page, + "dotskip&room=%s", + ChrPtr(WC->wc_roomname)); /** Check for new mail. */ WC->new_mail = extract_int(&got[4], 9); @@ -1794,7 +1796,7 @@ void display_editroom(void) wprintf(_("The URL for subscribe/unsubscribe is: ")); wprintf("%s://%s/listsub\n", (is_https ? "https" : "http"), - WC->http_host); + ChrPtr(WC->http_host)); /* Public posting? */ wprintf(""); wprintf(_("Allow non-subscribers to mail to this room.")); diff --git a/webcit/rss.c b/webcit/rss.c index 536de9512..60f097844 100644 --- a/webcit/rss.c +++ b/webcit/rss.c @@ -165,7 +165,7 @@ void display_rss(const StrBuf *roomname, StrBuf *request_method) SVPutBuf("ROOM", WCC->wc_roomname, 1); SVPutBuf("NODE", serv_info.serv_humannode, 1); /* TODO: Fix me */ - svprintf(HKEY("ROOM_LINK"), WCS_STRING, "%s://%s/", (is_https ? "https" : "http"), WCC->http_host); + svprintf(HKEY("ROOM_LINK"), WCS_STRING, "%s://%s/", (is_https ? "https" : "http"), ChrPtr(WCC->http_host)); /** Get room info for description */ serv_puts("RINF"); diff --git a/webcit/serv_func.c b/webcit/serv_func.c index 0e25c28d9..cbd53634e 100644 --- a/webcit/serv_func.c +++ b/webcit/serv_func.c @@ -12,7 +12,7 @@ struct serv_info serv_info; /**< our connection data to the server */ * browser_host the citadell we want to connect to * user_agent which browser uses our client? */ -void get_serv_info(char *browser_host, char *user_agent) +void get_serv_info(StrBuf *browser_host, char *user_agent) { StrBuf *Buf; char buf[SIZ]; @@ -20,11 +20,11 @@ void get_serv_info(char *browser_host, char *user_agent) /** Tell the server what kind of client is connecting */ serv_printf("IDEN %d|%d|%d|%s|%s", - DEVELOPER_ID, - CLIENT_ID, - CLIENT_VERSION, - user_agent, - browser_host + DEVELOPER_ID, + CLIENT_ID, + CLIENT_VERSION, + user_agent, + ChrPtr(browser_host) ); serv_getln(buf, sizeof buf); diff --git a/webcit/webcit.c b/webcit/webcit.c index 53bf0046f..7abf512d6 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -548,7 +548,7 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method StrBuf *UrlLine = NULL; StrBuf *content = NULL; const char *content_end = NULL; - char browser_host[256]; + StrBuf *browser_host = NULL; char user_agent[256]; int body_start = 0; int is_static = 0; @@ -576,7 +576,6 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method safestrncpy(c_httpauth_string, "", sizeof c_httpauth_string); c_httpauth_user = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_USER)); c_httpauth_pass = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_PASS)); - strcpy(browser_host, ""); WCC= WC; if (WCC->WBuf == NULL) @@ -655,27 +654,22 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method if ((follow_xff) && GetHash(HTTPHeaders, HKEY("X-FORWARDED-HOST"), &vLine) && (vLine != NULL)) { - safestrncpy(WCC->http_host, - ChrPtr((StrBuf*)vLine), - sizeof WCC->http_host); + WCC->http_host = (StrBuf*)vLine; } - if (IsEmptyStr(WCC->http_host) && + if ((StrLength(WCC->http_host) == 0) && GetHash(HTTPHeaders, HKEY("HOST"), &vLine) && (vLine!=NULL)) { - safestrncpy(WCC->http_host, - ChrPtr((StrBuf*)vLine), - sizeof WCC->http_host); - + WCC->http_host = (StrBuf*)vLine; } + if (GetHash(HTTPHeaders, HKEY("X-FORWARDED-FOR"), &vLine) && (vLine!=NULL)) { - safestrncpy(browser_host, - ChrPtr((StrBuf*) vLine), - sizeof browser_host); - while (num_tokens(browser_host, ',') > 1) { - remove_token(browser_host, 0, ','); + browser_host = (StrBuf*) vLine; + + while (StrBufNum_tokens(browser_host, ',') > 1) { + StrBufRemove_token(browser_host, 0, ','); } - striplt(browser_host); + StrBufTrim(browser_host); } if (ContentLength > 0) { @@ -705,9 +699,9 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method } /* make a note of where we are in case the user wants to save it */ - safestrncpy(WCC->this_page, ChrPtr(ReqLine), sizeof(WCC->this_page)); - remove_token(WCC->this_page, 2, ' '); - remove_token(WCC->this_page, 0, ' '); + WCC->this_page = NewStrBufDup(ReqLine); + StrBufRemove_token(WCC->this_page, 2, ' '); + StrBufRemove_token(WCC->this_page, 0, ' '); /* If there are variables in the URL, we must grab them now */ UrlLine = NewStrBufDup(ReqLine); @@ -821,7 +815,12 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method * unless we are following X-Forwarded-For: headers * and such a header has already turned up something. */ - if ( (!follow_xff) || (strlen(browser_host) == 0) ) { + if ( (!follow_xff) || (StrLength(browser_host) == 0) ) { + if (browser_host == NULL) { + browser_host = NewStrBuf(); + Put(HTTPHeaders, HKEY("FreeMeWithTheOtherHeaders"), + browser_host, HFreeStrBuf); + } locate_host(browser_host, WCC->http_sock); } @@ -1027,6 +1026,7 @@ SKIP_ALL_THIS_CRAP: FreeStrBuf(&c_roomname); FreeStrBuf(&c_httpauth_user); FreeStrBuf(&c_httpauth_pass); + FreeStrBuf(&WCC->this_page); fflush(stdout); if (content != NULL) { FreeStrBuf(&content); diff --git a/webcit/webcit.h b/webcit/webcit.h index ea9ed2a3a..afc4bdf56 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -328,86 +328,112 @@ enum { */ typedef struct wcsession wcsession; struct wcsession { +/* infrastructural members */ wcsession *next; /**< Linked list */ + pthread_mutex_t SessionMutex; /**< mutex for exclusive access */ int wc_session; /**< WebCit session ID */ + int killthis; /**< Nonzero == purge this session */ + int is_mobile; /**< Client is a handheld browser */ + int ctdl_pid; /**< Session ID on the Citadel server */ + int nonce; /**< session nonce (to prevent session riding) */ + +/* Session local Members */ + int http_sock; /**< HTTP server socket */ + int serv_sock; /**< Client socket to Citadel server */ + int chat_sock; /**< Client socket to Citadel server - for chat */ + time_t lastreq; /**< Timestamp of most recent HTTP */ + time_t last_pager_check; /**< last time we polled for instant msgs */ +/* Request local Members */ + StrBuf *CLineBuf; /**< linebuffering client stuff */ + StrBuf *UrlFragment1; /**< first urlfragment, if NEED_URL is specified by the handler*/ + StrBuf *UrlFragment2; /**< second urlfragment, if NEED_URL is specified by the handler*/ + StrBuf *UrlFragment3; /**< third urlfragment, if NEED_URL is specified by the handler*/ + StrBuf *WBuf; /**< Our output buffer */ + StrBuf *HBuf; /**< Our HeaderBuffer */ + StrBuf *this_page; /**< URL of current page */ + HashList *urlstrings; /**< variables passed to webcit in a URL */ + HashList *vars; /**< HTTP variable substitutions for this page */ + StrBuf *http_host; /**< HTTP Host: header */ + int is_ajax; /** < are we doing an ajax request? */ + int gzip_ok; /**< Nonzero if Accept-encoding: gzip */ + + StrBuf *trailing_javascript; /**< extra javascript to be appended to page */ + char ImportantMessage[SIZ]; /**< ??? todo */ + +/* accounting */ StrBuf *wc_username; /**< login name of current user */ + StrBuf *httpauth_user; /**< only for GroupDAV sessions */ StrBuf *wc_fullname; /**< Screen name of current user */ StrBuf *wc_password; /**< Password of current user */ - StrBuf *wc_roomname; /**< Room we are currently in */ - int connected; /**< nonzero == we are connected to Citadel */ - int logged_in; /**< nonzero == we are logged in */ + StrBuf *httpauth_pass; /**< only for GroupDAV sessions */ int axlevel; /**< this user's access level */ int is_aide; /**< nonzero == this user is an Aide */ int is_room_aide; /**< nonzero == this user is a Room Aide in this room */ - int http_sock; /**< HTTP server socket */ - int serv_sock; /**< Client socket to Citadel server */ - int chat_sock; /**< Client socket to Citadel server - for chat */ + int connected; /**< nonzero == we are connected to Citadel */ + int logged_in; /**< nonzero == we are logged in */ + int need_regi; /**< This user needs to register. */ + int need_vali; /**< New users require validation. */ + +/* Preferences */ + char cs_inet_email[256]; /**< User's preferred Internet addr. */ + char reply_to[512]; /**< reply-to address */ + HashList *hash_prefs; /**< WebCit preferences for this user */ + StrBuf *DefaultCharset; /**< Charset the user preferes */ + int downloaded_prefs; /** Has the client download its prefs yet? */ + int SavePrefsToServer; /**< Should we save our preferences to the server at the end of the request? */ + int selected_language; /**< Language selected by user */ + int time_format_cache; /**< which timeformat does our user like? */ + +/* current room related */ + StrBuf *wc_roomname; /**< Room we are currently in */ unsigned room_flags; /**< flags associated with the current room */ unsigned room_flags2; /**< flags associated with the current room */ int wc_view; /**< view for the current room */ int wc_default_view; /**< default view for the current room */ int wc_is_trash; /**< nonzero == current room is a Trash folder */ int wc_floor; /**< floor number of current room */ + int is_mailbox; /**< the current room is a private mailbox */ + +/* next/previous room thingabob */ + struct march *march; /**< march mode room list */ char ugname[128]; /**< where does 'ungoto' take us */ long uglsn; /**< last seen message number for ungoto */ + +/* Uploading; mime attachments for composing messages */ + HashList *attachments; /**< list of attachments for 'enter message' */ int upload_length; /**< content length of http-uploaded data */ char *upload; /**< pointer to http-uploaded data */ char upload_filename[PATH_MAX]; /**< filename of http-uploaded data */ char upload_content_type[256]; /**< content type of http-uploaded data */ + int new_mail; /**< user has new mail waiting */ int remember_new_mail; /**< last count of new mail messages */ - int need_regi; /**< This user needs to register. */ - int need_vali; /**< New users require validation. */ - char cs_inet_email[256]; /**< User's preferred Internet addr. */ - pthread_mutex_t SessionMutex; /**< mutex for exclusive access */ - time_t lastreq; /**< Timestamp of most recent HTTP */ - int killthis; /**< Nonzero == purge this session */ - struct march *march; /**< march mode room list */ - char reply_to[512]; /**< reply-to address */ + +/* Roomiew control */ HashList *summ; /**< list of messages for mailbox summary view */ /** Perhaps these should be within a struct instead */ long startmsg; /**< message number to start at */ long maxmsgs; /**< maximum messages to display */ long num_displayed; /**< number of messages actually displayed */ - int is_mobile; /**< Client is a handheld browser */ - HashList *urlstrings; /**< variables passed to webcit in a URL */ - HashList *vars; /**< HTTP variable substitutions for this page */ - char this_page[512]; /**< URL of current page */ - char http_host[512]; /**< HTTP Host: header */ - HashList *hash_prefs; /**< WebCit preferences for this user */ - int SavePrefsToServer; /**< Should we save our preferences to the server at the end of the request? */ HashList *disp_cal_items; /**< sorted list of calendar items; startdate is the sort criteria. */ - HashList *attachments; /**< list of attachments for 'enter message' */ + + char last_chat_user[256]; /**< ??? todo */ - char ImportantMessage[SIZ]; /**< ??? todo */ - int ctdl_pid; /**< Session ID on the Citadel server */ - StrBuf *httpauth_user; /**< only for GroupDAV sessions */ - StrBuf *httpauth_pass; /**< only for GroupDAV sessions */ - int gzip_ok; /**< Nonzero if Accept-encoding: gzip */ - int is_mailbox; /**< the current room is a private mailbox */ + +/* Iconbar controls */ struct folder *cache_fold; /**< cache the iconbar room list */ int cache_max_folders; /**< ??? todo */ int cache_num_floors; /**< ??? todo */ time_t cache_timestamp; /**< ??? todo */ HashList *IconBarSettings; /**< which icons should be shown / not shown? */ const StrBuf *floordiv_expanded; /**< which floordiv currently expanded */ - int selected_language; /**< Language selected by user */ - time_t last_pager_check; /**< last time we polled for instant msgs */ - int nonce; /**< session nonce (to prevent session riding) */ - int time_format_cache; /**< which timeformat does our user like? */ - StrBuf *UrlFragment1; /**< first urlfragment, if NEED_URL is specified by the handler*/ - StrBuf *UrlFragment2; /**< second urlfragment, if NEED_URL is specified by the handler*/ - StrBuf *UrlFragment3; /**< third urlfragment, if NEED_URL is specified by the handler*/ - StrBuf *WBuf; /**< Our output buffer */ - StrBuf *HBuf; /**< Our HeaderBuffer */ - StrBuf *CLineBuf; /**< linebuffering client stuff */ - StrBuf *DefaultCharset; /**< Charset the user preferes */ + + + +/* cache stuff for templates. TODO: find a smartrer way */ HashList *ServCfg; /**< cache our server config for editing */ HashList *InetCfg; /**< Our inet server config for editing */ - StrBuf *trailing_javascript; /**< extra javascript to be appended to page */ - int is_ajax; /** < are we doing an ajax request? */ - int downloaded_prefs; /** Has the client download its prefs yet? */ }; /* values for WC->current_iconbar */ @@ -488,7 +514,7 @@ void cookie_to_stuff(StrBuf *cookie, int *session, StrBuf *user, StrBuf *pass, StrBuf *room); -void locate_host(char *, int); +void locate_host(StrBuf *TBuf, int); void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_response); void openid_manual_create(void); void display_login(); @@ -499,7 +525,7 @@ void display_main_menu(void); void display_aide_menu(void); void display_advanced_menu(void); void slrp_highest(void); -void get_serv_info(char *, char *); +void get_serv_info(StrBuf *, char *); int uds_connectsock(char *); int tcp_connectsock(char *, char *); int serv_getln(char *strbuf, int bufsize); diff --git a/webcit/webserver.c b/webcit/webserver.c index edd3c85cf..788eb25e6 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -641,6 +641,8 @@ int main(int argc, char **argv) #endif /* ENABLE_NLS */ char uds_listen_path[PATH_MAX]; /* listen on a unix domain socket? */ + WildFireInitBacktrace(argv[0], 2); + HandlerHash = NewHash(1, NULL); PreferenceHooks = NewHash(1, NULL); WirelessTemplateCache = NewHash(1, NULL); -- 2.30.2