]> code.citadel.org Git - citadel.git/blobdiff - webcit/auth.c
* shuffle auth arround...
[citadel.git] / webcit / auth.c
index b9e28faf3513db6e7cb03830012e193a89396044..863488b8c5dd1223347ecf4bb982d8776677460f 100644 (file)
@@ -27,7 +27,43 @@ void initialize_axdefs(void) {
        axdefs[6] = _("Aide");          /* chief */
 }
 
+int ReEstablish_Session(void)
+{
+       StrBuf *Buf = NewStrBuf();
+       wcsession *WCC = WC;
 
+       serv_printf("USER %s", ChrPtr(WCC->Hdr->c_username));
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 3) {
+               serv_printf("PASS %s", ChrPtr(WCC->Hdr->c_password));
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) == 2) {
+                       become_logged_in(WCC->Hdr->c_username, 
+                                        WCC->Hdr->c_password, Buf);
+                       get_preference("default_header_charset", &WCC->DefaultCharset);
+               }
+       }
+       /*
+        * If we don't have a current room, but a cookie specifying the
+        * current room is supplied, make an effort to go there.
+        */
+       if ((StrLength(WCC->wc_roomname) == 0) && (StrLength(WCC->Hdr->c_roomname) > 0)) {
+               serv_printf("GOTO %s", 
+                           ChrPtr(WCC->Hdr->c_roomname));
+               StrBuf_ServGetln(Buf);
+               if (GetServerStatus(Buf, NULL) == 2) {
+                       if (WCC->wc_roomname == NULL) {
+                               WCC->wc_roomname = NewStrBufDup(WCC->Hdr->c_roomname);
+                       }
+                       else {
+                               FlushStrBuf(WCC->wc_roomname);
+                               StrBufAppendBuf(WCC->wc_roomname, WCC->Hdr->c_roomname, 0);
+                       }
+               }
+       }
+       FreeStrBuf(&Buf);
+       return 0;
+}
 
 
 /* 
@@ -330,8 +366,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"), ChrPtr(WCC->http_host),
-                        (is_https ? "https" : "http"), ChrPtr(WCC->http_host)
+                        (is_https ? "https" : "http"), ChrPtr(WCC->Hdr->http_host),
+                        (is_https ? "https" : "http"), ChrPtr(WCC->Hdr->http_host)
                );
 
                serv_puts(buf);
@@ -379,8 +415,8 @@ void finalize_openid_login(void)
                                const char *HKey;
                                HashPos *Cursor;
                                
-                               Cursor = GetNewHashPos (WCC->urlstrings, 0);
-                               while (GetNextHashPos(WCC->urlstrings, Cursor, &HKLen, &HKey, &U)) {
+                               Cursor = GetNewHashPos (WCC->Hdr->urlstrings, 0);
+                               while (GetNextHashPos(WCC->Hdr->urlstrings, Cursor, &HKLen, &HKey, &U)) {
                                        u = (urlcontent*) U;
                                        if (!strncasecmp(u->url_key, "openid.", 7)) {
                                                serv_printf("%s|%s", &u->url_key[7], ChrPtr(u->url_data));
@@ -912,18 +948,54 @@ int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP)
 void _display_openid_login(void) {display_openid_login(NULL);}
 void _display_reg(void) {display_reg(0);}
 
+void Header_HandleAuth(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       const char *Pos = NULL;
+       if (strncasecmp(ChrPtr(Line), "Basic", 5) == 0) {
+               StrBufCutLeft(Line, 6);
+               StrBufDecodeBase64(Line);
+               StrBufExtract_NextToken(hdr->c_username, Line, &Pos, ':');
+               StrBufExtract_NextToken(hdr->c_password, Line, &Pos, ':');
+               hdr->got_auth = AUTH_BASIC;
+       }
+       else 
+               lprintf(1, "Authentication scheme not supported! [%s]\n", ChrPtr(Line));
+}
+
+void Header_HandleCookie(StrBuf *Line, ParsedHttpHdrs *hdr)
+{
+       hdr->RawCookie = Line;
+       if (hdr->DontNeedAuth)
+               return;
+/*
+       safestrncpy(c_httpauth_string, "", sizeof c_httpauth_string);
+       c_httpauth_user = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_USER));
+       c_httpauth_pass = NewStrBufPlain(HKEY(DEFAULT_HTTPAUTH_PASS));
+*/
+       cookie_to_stuff(Line, &hdr->desired_session,
+                       hdr->c_username,
+                       hdr->c_password,
+                       hdr->c_roomname);
+       hdr->got_auth = AUTH_COOKIE;
+}
+
+
 
 void 
 InitModule_AUTH
 (void)
 {
-       WebcitAddUrlHandler(HKEY("do_welcome"), do_welcome, ANONYMOUS);
-       WebcitAddUrlHandler(HKEY("login"), do_login, ANONYMOUS);
+       RegisterHeaderHandler(HKEY("COOKIE"), Header_HandleCookie);
+       RegisterHeaderHandler(HKEY("AUTHORIZATION"), Header_HandleAuth);
+
+       WebcitAddUrlHandler(HKEY(""), do_welcome, ANONYMOUS|COOKIEUNNEEDED); /* no url pattern at all? Show login. */
+       WebcitAddUrlHandler(HKEY("do_welcome"), do_welcome, ANONYMOUS|COOKIEUNNEEDED);
+       WebcitAddUrlHandler(HKEY("login"), do_login, ANONYMOUS|COOKIEUNNEEDED);
        WebcitAddUrlHandler(HKEY("display_openid_login"), _display_openid_login, ANONYMOUS);
        WebcitAddUrlHandler(HKEY("openid_login"), do_openid_login, ANONYMOUS);
        WebcitAddUrlHandler(HKEY("finalize_openid_login"), finalize_openid_login, ANONYMOUS);
        WebcitAddUrlHandler(HKEY("openid_manual_create"), openid_manual_create, ANONYMOUS);
-       WebcitAddUrlHandler(HKEY("do_logout"), do_logout, 0);
+       WebcitAddUrlHandler(HKEY("do_logout"), do_logout, ANONYMOUS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE);
        WebcitAddUrlHandler(HKEY("validate"), validate, 0);
        WebcitAddUrlHandler(HKEY("display_reg"), _display_reg, 0);
        WebcitAddUrlHandler(HKEY("display_changepw"), display_changepw, 0);