From: Art Cancro Date: Thu, 21 May 2009 16:25:50 +0000 (+0000) Subject: * Store the language setting in the session cookie instead of as a preference. Resol... X-Git-Tag: v7.86~1145 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=502b5f3d4e7ce4ad732e408a1fde39c5bbc873d8 * Store the language setting in the session cookie instead of as a preference. Resolves bug 359. --- diff --git a/webcit/auth.c b/webcit/auth.c index 8dfce2214..3704061f7 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -116,7 +116,6 @@ void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_respo wcsession *WCC = WC; StrBuf *Buf; StrBuf *FloorDiv; - StrBuf *Language = NULL; WCC->logged_in = 1; @@ -160,15 +159,6 @@ void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_respo WCC->cs_inet_email = NewStrBuf(); StrBufExtract_NextToken(WCC->cs_inet_email, Buf, &pch, '|'); } - if (havebstr("language")) - set_preference("language", NewStrBufDup(SBSTR("language")), 1); - else { - get_preference("language", &Language); - if (Language != NULL) { - set_selected_language(ChrPtr(Language)); - go_selected_language(); /* set locale */ - } - } get_preference("floordiv_expanded", &FloorDiv); WCC->floordiv_expanded = FloorDiv; FreeStrBuf(&Buf); @@ -183,6 +173,8 @@ void do_login(void) wcsession *WCC = WC; StrBuf *Buf; + lprintf(9, "SELECTED LANGUAGE: '%s'\n", bstr("language")); + if (havebstr("language")) { set_selected_language(bstr("language")); go_selected_language(); @@ -974,10 +966,14 @@ void Header_HandleCookie(StrBuf *Line, ParsedHttpHdrs *hdr) hdr->c_password = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_PASS)); if (hdr->c_roomname == NULL) hdr->c_roomname = NewStrBuf(); + if (hdr->c_language == NULL) + hdr->c_language = NewStrBuf(); cookie_to_stuff(Line, &hdr->desired_session, hdr->c_username, hdr->c_password, - hdr->c_roomname); + hdr->c_roomname, + hdr->c_language + ); hdr->got_auth = AUTH_COOKIE; } diff --git a/webcit/context_loop.c b/webcit/context_loop.c index 6c8950d50..50334cea8 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -540,6 +540,12 @@ TODO HKEY("/static/nocookies.html?force_close_session=yes")); TheSession->is_mobile = -1; SessionList = TheSession; pthread_mutex_unlock(&SessionListMutex); + + if (StrLength(Hdr.c_language) > 0) { + lprintf(9, "Session cookie requests language '%s'\n", ChrPtr(Hdr.c_language)); + set_selected_language(ChrPtr(Hdr.c_language)); + go_selected_language(); + } } /* diff --git a/webcit/cookie_conversion.c b/webcit/cookie_conversion.c index 1d9638ad6..58a5742f9 100644 --- a/webcit/cookie_conversion.c +++ b/webcit/cookie_conversion.c @@ -1,43 +1,28 @@ /* * $Id$ */ -/** - * \defgroup CookieConversion Grep Cookies - * Utility functions which convert the HTTP cookie format we use to and - * from user/password/room strings. - * - * \ingroup WebcitHttpServer - */ -/*@{*/ -#include "webcit.h" +#include "webcit.h" -#define TRUE 1 /**< for sure? */ -#define FALSE 0 /**< nope. */ - -typedef unsigned char byte; /**< Byte type */ +typedef unsigned char byte; /* Byte type used by cookie_to_stuff() */ -/** - * \brief find cookie +/* * Pack all session info into one easy-to-digest cookie. Healthy and delicious! - * \param cookie cookie string to create??? - * \param session the session we want to convert into a cookie - * \param user the user to be associated with the cookie - * \param pass his passphrase - * \param room the room he wants to enter */ void stuff_to_cookie(char *cookie, size_t clen, int session, - StrBuf *user, StrBuf *pass, StrBuf *room) + StrBuf *user, StrBuf *pass, StrBuf *room, char *language) { char buf[SIZ]; int i; int len; - len = snprintf(buf, SIZ, "%d|%s|%s|%s|", - session, - ChrPtr(user), - ChrPtr(pass), - ChrPtr(room)); + len = snprintf(buf, SIZ, "%d|%s|%s|%s|%s|", + session, + ChrPtr(user), + ChrPtr(pass), + ChrPtr(room), + language + ); strcpy(cookie, ""); for (i=0; (i < len) && (i * 2 < clen); ++i) { @@ -45,11 +30,8 @@ void stuff_to_cookie(char *cookie, size_t clen, int session, } } -/** - * \brief Convert unpacked hex string to an integer - * \param in Input hex string - * \param len the length of the string - * \return the corrosponding integer value +/* + * Convert unpacked hex string to an integer */ int xtoi(const char *in, size_t len) { @@ -71,41 +53,29 @@ int xtoi(const char *in, size_t len) return val; } -/** - * \brief Extract all that fun stuff out of the cookie. - * \param cookie the cookie string - * \param session the corrosponding session to return - * \param user the user string - * \param user_len the user stringlength - * \param pass the passphrase - * \param pass_len length of the passphrase string - * \param room the room he is in - * \param room_len the length of the room string +/* + * Extract all that fun stuff out of the cookie. */ -void cookie_to_stuff(StrBuf *cookie, int *session, - StrBuf *user, - StrBuf *pass, - StrBuf *room) +void cookie_to_stuff(StrBuf *cookie, + int *session, + StrBuf *user, + StrBuf *pass, + StrBuf *room, + StrBuf *language) { -/* debug - char t[256]; - extract_token(t, buf, 0, '|', sizeof t); - lprintf(9, "SESS: %s\n", t); - extract_token(t, buf, 1, '|', sizeof t); - lprintf(9, "USER: %s\n", t); - extract_token(t, buf, 2, '|', sizeof t); - lprintf(9, "PASS: %s\n", t); - extract_token(t, buf, 3, '|', sizeof t); - lprintf(9, "ROOM: %s\n", t); - debug */ - - if (session != NULL) + if (session != NULL) { *session = StrBufExtract_int(cookie, 0, '|'); - if (user != NULL) + } + if (user != NULL) { StrBufExtract_token(user, cookie, 1, '|'); - if (pass != NULL) + } + if (pass != NULL) { StrBufExtract_token(pass, cookie, 2, '|'); - if (room != NULL) + } + if (room != NULL) { StrBufExtract_token(room, cookie, 3, '|'); + } + if (language != NULL) { + StrBufExtract_token(language, cookie, 4, '|'); + } } -/*@}*/ diff --git a/webcit/webcit.c b/webcit/webcit.c index afa7ac886..5629c9ec1 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -157,8 +157,12 @@ void output_headers( int do_httpheaders, /* 1 = output HTTP headers } stuff_to_cookie(cookie, 1024, - WCC->wc_session, WCC->wc_username, - WCC->wc_password, WCC->wc_roomname); + WCC->wc_session, + WCC->wc_username, + WCC->wc_password, + WCC->wc_roomname, + get_selected_language() + ); if (unset_cookies) { hprintf("Set-cookie: webcit=%s; path=/\r\n", unset); diff --git a/webcit/webcit.h b/webcit/webcit.h index 074b4f8da..7cbc14e45 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -420,6 +420,7 @@ typedef struct _ParsedHttpHdrs { StrBuf *c_username; StrBuf *c_password; StrBuf *c_roomname; + StrBuf *c_language; StrBuf *RawCookie; int desired_session; @@ -630,13 +631,20 @@ void InitialiseSemaphores(void); void begin_critical_section(int which_one); void end_critical_section(int which_one); - -void stuff_to_cookie(char *cookie, size_t clen, int session, - StrBuf *user, StrBuf *pass, StrBuf *room); -void cookie_to_stuff(StrBuf *cookie, int *session, - StrBuf *user, - StrBuf *pass, - StrBuf *room); +void stuff_to_cookie(char *cookie, size_t clen, + int session, + StrBuf *user, + StrBuf *pass, + StrBuf *room, + char *language +); +void cookie_to_stuff(StrBuf *cookie, + int *session, + StrBuf *user, + StrBuf *pass, + StrBuf *room, + StrBuf *language +); void locate_host(StrBuf *TBuf, int); void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_response); void openid_manual_create(void);