/* Internal login service routine for Form-based auth */ static void loginServiceProc(Webs *wp) { WebsRoute *route; assert(wp); route = wp->route; assert(route); if (websLoginUser(wp, websGetVar(wp, "username", ""), websGetVar(wp, "password", ""))) { /* If the application defines a referrer session var, redirect to that */ char *referrer; if ((referrer = websGetSessionVar(wp, "referrer", 0)) != 0) { websRedirect(wp, referrer); } else { websRedirectByStatus(wp, HTTP_CODE_OK); } websSetSessionVar(wp, "loginStatus", "ok"); } else { if (route->askLogin) { (route->askLogin)(wp); } websSetSessionVar(wp, "loginStatus", "failed"); websRedirectByStatus(wp, HTTP_CODE_UNAUTHORIZED); } }
PUBLIC bool websAuthenticate(Webs *wp) { WebsRoute *route; char *username; int cached; assert(wp); assert(wp->route); route = wp->route; if (!route || !route->authType || autoLogin) { /* Authentication not required */ return 1; } cached = 0; if (wp->cookie && websGetSession(wp, 0) != 0) { /* Retrieve authentication state from the session storage. Faster than re-authenticating. */ if ((username = (char*) websGetSessionVar(wp, WEBS_SESSION_USERNAME, 0)) != 0) { cached = 1; wfree(wp->username); wp->username = sclone(username); } } if (!cached) { if (wp->authType && !smatch(wp->authType, route->authType)) { websError(wp, HTTP_CODE_UNAUTHORIZED, "Access denied. Wrong authentication protocol type."); return 0; } if (wp->authDetails && route->parseAuth) { if (!(route->parseAuth)(wp)) { wp->username = 0; } } if (!wp->username || !*wp->username) { if (route->askLogin) { (route->askLogin)(wp); } websRedirectByStatus(wp, HTTP_CODE_UNAUTHORIZED); return 0; } if (!(route->verify)(wp)) { if (route->askLogin) { (route->askLogin)(wp); } websRedirectByStatus(wp, HTTP_CODE_UNAUTHORIZED); return 0; } /* Store authentication state and user in session storage */ if (websGetSession(wp, 1) != 0) { websSetSessionVar(wp, WEBS_SESSION_USERNAME, wp->username); } } return 1; }
static void logoutServiceProc(Webs *wp) { assure(wp); websRemoveSessionVar(wp, WEBS_SESSION_USERNAME); if (smatch(wp->authType, "basic") || smatch(wp->authType, "digest")) { websError(wp, HTTP_CODE_UNAUTHORIZED, "Logged out."); return; } websRedirectByStatus(wp, HTTP_CODE_OK); }
PUBLIC bool websLogoutUser(Webs *wp) { assert(wp); websRemoveSessionVar(wp, WEBS_SESSION_USERNAME); if (smatch(wp->authType, "basic") || smatch(wp->authType, "digest")) { websError(wp, HTTP_CODE_UNAUTHORIZED, "Logged out."); return 0; } websRedirectByStatus(wp, HTTP_CODE_OK); return 1; }