login

<     >

2022-02-27 22:21:37 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

use cookies for session management

diff --git a/app.lua b/app.lua
index 14f3a57..b891752 100644
--- a/app.lua
+++ b/app.lua
@@ -68,12 +68,24 @@ local conf = dofile(path.."/conf.lua")
 git.init()
 local groups = scan.scanrepos(path)
 
-local me
+local sessions = {}
+
+local function get_user(cookies)
+    local session_id = cookies["sid"]
+    if session_id == nil then
+        return nil
+    end
+    local uname = sessions[session_id]
+    if uname == nil then
+        return nil
+    end
+    return conf.users[uname]
+end
 
 local routes = {
     {"GET", "/?",
     function (req)
-        local user = conf.users[me]
+        local user = get_user(req.cookies)
         local gnames = {}
         for gname in pairs(groups) do
             if allowed(user, gname) then
@@ -101,9 +113,11 @@ local routes = {
             salt = lud.crypt.b64_dec(user.salt)
             h = hash.hash_pass(pass, salt)
             if h == lud.crypt.b64_dec(user.hash) then
-                me = uname
+                local session_id = lud.crypt.b64_enc(lud.crypt.uuid4())
+                sessions[session_id] = uname
                 conf.log(LOG_INFO, "logged in as "..uname)
-                return "/", 303
+                local cookie = {key="sid", val=session_id, path="/", age=2*60*60}
+                return "/", 303, "See Other", {cookie}
             else
                 conf.log(LOG_INFO, "invalid password")
             end
@@ -112,12 +126,15 @@ local routes = {
     end},
     {"GET", "/logout",
     function (req)
-        me = nil
+        local session_id = req.cookies["sid"]
+        if session_id ~= nil then
+            sessions[session_id] = nil
+        end
         return "/", 303
     end},
     {"GET", "/group/([%w_-]+)",
     function (req, gname)
-        local user = conf.users[me]
+        local user = get_user(req.cookies)
         if not allowed(user, gname) then
             return "/login", 303
         end
@@ -130,7 +147,7 @@ local routes = {
     end},
     {"GET", "/group/([%w_-]+)/repo/([%w_-]+)",
     function (req, gname, rname)
-        local user = conf.users[me]
+        local user = get_user(req.cookies)
         if not allowed(user, gname) then
             return "/login", 303
         end
@@ -145,7 +162,7 @@ local routes = {
     end},
     {"GET", "/group/([%w_-]+)/repo/([%w_-]+)/history/([%w_-]+)",
     function (req, gname, rname, first)
-        local user = conf.users[me]
+        local user = get_user(req.cookies)
         if not allowed(user, gname) then
             return "/login", 303
         end
@@ -160,7 +177,7 @@ local routes = {
     end},
     {"GET", "/group/([%w_-]+)/repo/([%w_-]+)/commit/([%w_-]+)",
     function (req, gname, rname, cid)
-        local user = conf.users[me]
+        local user = get_user(req.cookies)
         if not allowed(user, gname) then
             return "/login", 303
         end
@@ -178,7 +195,7 @@ local routes = {
     end},
     {"GET", "/group/([%w_-]+)/repo/([%w_-]+)/commit/([%w_-]+)/tree/(.*)",
     function (req, gname, rname, cid, path)
-        local user = conf.users[me]
+        local user = get_user(req.cookies)
         if not allowed(user, gname) then
             return "/login", 303
         end