*/
void do_openid_login(void)
{
+ wcsession *WCC = WC;
char buf[4096];
if (havebstr("language")) {
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);
StrBuf *dav_content,
int Offset
) {
+ wcsession *WCC = WC;
void *vLine;
char dav_ifmatch[256];
int dav_depth;
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)) {
* 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));
}
}
email,
subtype,
(is_https ? "https" : "http"),
- WC->http_host
+ ChrPtr(WC->http_host)
);
serv_getln(buf, sizeof buf);
if (buf[0] == '2') {
*/
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') {
* \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;
len = sizeof(cs);
if (getpeername(client_socket, (struct sockaddr *) &cs, &len) < 0) {
- strcpy(tbuf, "<unknown>");
+ StrBufAppendBufPlain(tbuf, HKEY("<unknown>"), 0);
return;
}
if ((ch = gethostbyaddr((char *) &cs.sin_addr, sizeof(cs.sin_addr),
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);
}
/*@}*/
wprintf("<br /><textarea name=\"g_input\" rows=10 cols=80 width=80></textarea><br />\n");
wprintf("<font size=-2>");
- 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("</font>\n");
wprintf("<input type=\"submit\" name=\"sc_button\" value=\"%s\">", _("Send command"));
wprintf(" ");
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);
void offer_start_page(StrBuf *Target, WCTemplputParams *TP)
{
wprintf("<a href=\"change_start_page?startpage=");
- urlescputs(WC->this_page);
+ urlescputs(ChrPtr(WC->this_page));
wprintf("\">");
wprintf(_("Make this my start page"));
wprintf("</a>");
* 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);
wprintf(_("The URL for subscribe/unsubscribe is: "));
wprintf("<TT>%s://%s/listsub</TT></td></tr>\n",
(is_https ? "https" : "http"),
- WC->http_host);
+ ChrPtr(WC->http_host));
/* Public posting? */
wprintf("<tr><td>");
wprintf(_("Allow non-subscribers to mail to this room."));
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");
* 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];
/** 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);
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;
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)
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) {
}
/* 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);
* 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);
}
FreeStrBuf(&c_roomname);
FreeStrBuf(&c_httpauth_user);
FreeStrBuf(&c_httpauth_pass);
+ FreeStrBuf(&WCC->this_page);
fflush(stdout);
if (content != NULL) {
FreeStrBuf(&content);
*/
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 */
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();
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);
#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);