* Store the language setting in the session cookie instead of as a preference. Resol...
authorArt Cancro <ajc@citadel.org>
Thu, 21 May 2009 16:25:50 +0000 (16:25 +0000)
committerArt Cancro <ajc@citadel.org>
Thu, 21 May 2009 16:25:50 +0000 (16:25 +0000)
webcit/auth.c
webcit/context_loop.c
webcit/cookie_conversion.c
webcit/webcit.c
webcit/webcit.h

index 8dfce2214e839c7422098e687df52ada03960bcf..3704061f7f4c8ae61402aea8c1987de079848872 100644 (file)
@@ -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;
 }
 
index 6c8950d50d1b1aa9ef17564b143474fea52ac559..50334cea88eb3fbe1de1d9c6a1ba5bd5794d7eb8 100644 (file)
@@ -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();
+               }
        }
 
        /*
index 1d9638ad68644f9bdf6bffd9530ec36a69b67d9c..58a5742f93903d759537f37e2a5083271f760035 100644 (file)
@@ -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, '|');
+       }
 }
-/*@}*/
index afa7ac886a8abf84764a0c91b70f039db092bd23..5629c9ec124fd471d6a5582912bc03fe7a3681d4 100644 (file)
@@ -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);
index 074b4f8da307303f908a4fd294d7378206e69a1d..7cbc14e458f6a09e3409a94eba87f085e9e4bb99 100644 (file)
@@ -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);