newRouter = import("router.noja").new; serve = import("server.noja").serve; cookie = import("cookie.noja"); Request = import("request.noja").Request; respond = import("response.noja").new; urlencoded = import("urlencoded.noja"); fun getCookie(req: Request, name: String) { src = req.headers["Cookie"]; if src == none: return none; cookies, error = cookie.parseCookieHeader(src); if error != none: return none, error; return cookies[name]; } fun getSessionID(req: Request) { session_id, error = getCookie(req, "SESSID"); if error != none: return none, error; session_id = string.toInt(session_id); return session_id; } fun getUsername(req: Request) { session_id, error = getSessionID(req); if error != none: return none, none, error; username = session_table[session_id]; return username, session_id; } fun redirect(endpoint) { fun callback() return respond(307, none, {'Location': endpoint}); return callback; } user_table = {}; session_table = {}; router = newRouter(); router->plug("/", {GET: redirect("/login")}); router->plug("/home", { fun GET(req: Request) { username, _, error = getUsername(req); if error != none: return respond(400, error); if username == none: return respond(401, "You're not logged in"); content = string.cat( "", "", "Homepage", "", "", "Hello, ", username, "!", "", "" ); return respond(200, content); } }); router->plug("/login", { GET: 'pages/login.html', fun POST(req: Request) { username, _, error = getUsername(req); if error != none: return respond(400, error); if username != none: return respond(400, "You're already logged in"); fun areValid(params) { expect = {user: String, pass: String}; return istypeof(expect, params) and count(params.user) > 0 and count(params.pass) > 0; } params = urlencoded.parse(req.body); if not areValid(params): return respond(400, "Invalid parameters"); username = params.user; password = params.pass; info = user_table[username]; if info == none: return respond(200, "No such user"); if info.pass != password: return respond(200, "Wrong password"); # Log-in succeded # Create a new session session_id = random.generate(0, 1000); session_table[session_id] = username; message = string.cat("Welcome, ", username, "!"); headers = { "Location" : "/home", "Set-Cookie": string.cat("SESSID=", toString(session_id)) }; return respond(303, message, headers); } }); router->plug("/signup", { GET: 'pages/signup.html', fun POST(req: Request) { username, _, error = getUsername(req); if error != none: return respond(400, error); if username != none: return respond(400, "You're already logged in"); fun areValid(params) { expect = {user: String, pass: String}; return istypeof(expect, params) and count(params.user) > 0 and count(params.pass) > 0; } params = urlencoded.parse(req.body); if not areValid(params): return respond(400, "Invalid parameters"); username = params.user; password = params.pass; if user_table[password] != none: return respond(200, "User already exists"); # Signed up! user_table[username] = {pass: password}; session_id = random.generate(0, 1000); session_table[session_id] = username; # Respond message = string.cat("Welcome, ", username, "!"); headers = { "Location" : "/home", "Set-Cookie": string.cat("SESSID=", toString(session_id)) }; return respond(303, message, headers); } }); router->plug("/logout", { fun GET(req: Request) { username, session_id, error = getUsername(req); if error != none: return respond(400, error); if username == none: return respond(401, "You're not logged in"); session_table[session_id] = none; return respond(303, "Goodbye!", {"Location": "/login"}); } }); error(serve("127.0.0.1", 8080, router));