login

<     >

2023-07-19 18:18:34 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

read basic config from DB

diff --git a/cogit/cfg.lua b/cogit/cfg.lua
new file mode 100644
index 0000000..4780053
--- /dev/null
+++ b/cogit/cfg.lua
@@ -0,0 +1,57 @@
+local lud = require "ludweb"
+
+local schema = [[
+CREATE TABLE IF NOT EXISTS Config (
+    id INTEGER PRIMARY KEY AUTOINCREMENT,
+    name TEXT NOT NULL,
+    title TEXT NOT NULL,
+    port INTEGER NOT NULL,
+    pg_size INTEGER NOT NULL,
+    ses_age INTEGER NOT NULL,
+    log_lvl INTEGER NOT NULL
+);
+]]
+
+local CFG = {}
+CFG.__index = CFG
+
+function CFG:add_defaults()
+    self.db:execute[[
+    INSERT INTO Config(id, name, title, port, pg_size, ses_age, log_lvl) Values
+    (1, "default", "cogit", 8080, 20, 72*60*60, 2);
+    ]]
+    return 1
+end
+
+function CFG:init()
+    self.db:execute_many(schema)
+    local config = self.db:execute("SELECT * FROM Config;")[1]
+    if config == nil then
+        self.cid = self:add_defaults()
+    else
+        self.cid = config.id
+    end
+end
+
+function CFG:set_cid(cid) self.cid = cid end
+
+function CFG:get_config(col)
+    return self.db:execute("SELECT * FROM Config WHERE id = ?;", self.cid)[1][col]
+end
+
+function CFG:title()    return self:get_config("title") end
+function CFG:port()     return self:get_config("port") end
+function CFG:pg_size()  return self:get_config("pg_size") end
+function CFG:ses_age()  return self:get_config("ses_age") end
+function CFG:log_lvl()  return self:get_config("log_lvl") end
+
+function CFG:close() self.db:close() end
+
+local function new_cfg(path)
+    local self = setmetatable({}, CFG)
+    self.db = lud.sqlite.open(path)
+    self:init()
+    return self
+end
+
+return {new_cfg=new_cfg}

diff --git a/cogit/cogit.lua b/cogit/cogit.lua
index becf486..919fe37 100644
--- a/cogit/cogit.lua
+++ b/cogit/cogit.lua
@@ -1,6 +1,7 @@
 local git = require "cogit.git"
 local scan = require "cogit.scan"
 local hash = require "cogit.hash"
+local cfg = require "cogit.cfg"
 
 local lud = require "ludweb"
 
@@ -79,8 +80,9 @@ end
 
 function Cogit:run()
     self:init()
-    self:log(LOG_INFO, "server running on port "..self.conf.port)
-    self.app:run(self.conf.port)
+    local port = self.cfg:port()
+    self:log(LOG_INFO, "server running on port "..port)
+    self.app:run(port)
 end
 
 function Cogit:scan()
@@ -102,17 +104,16 @@ function Cogit:get_user(cookies)
     if session_id == nil then
         return nil
     end
-    local uname = sessions[session_id]
+    local uname = self.sessions[session_id]
     if uname == nil then
         return nil
     end
-    return self.conf.users[uname]
+    return self.users[uname]
 end
 
 function Cogit:routes()
-    local conf = self.conf
-    title = conf.title
-    sessions = self.sessions
+    local title = self.cfg:title()
+    local limit = self.cfg:pg_size()
     return {
     {"GET", "/?",
     function (req)
@@ -140,7 +141,7 @@ function Cogit:routes()
     function (req)
         local uname = req.form.username
         local pass = req.form.password
-        local user = conf.users[uname]
+        local user = self.users[uname]
         local salt, h
         if user == nil then
             -- hash something as if we're trying to login anyway
@@ -152,9 +153,9 @@ function Cogit:routes()
             h = hash.hash_pass(pass, salt)
             if h == lud.crypt.b64_dec(user.hash) then
                 local session_id = lud.crypt.b64_enc(lud.crypt.uuid4())
-                sessions[session_id] = uname
+                self.sessions[session_id] = uname
                 self:log(LOG_INFO, "logged in as "..uname)
-                local age = conf.session_age
+                local age = self.cfg:ses_age()
                 local cookie = {key="sid", val=session_id, path="/", age=age}
                 return "/", 303, "See Other", {cookie}
             else
@@ -167,8 +168,8 @@ function Cogit:routes()
     function (req)
         local session_id = req.cookies["sid"]
         if session_id ~= nil then
-            self:log(LOG_INFO, "logged out as "..sessions[session_id])
-            sessions[session_id] = nil
+            self:log(LOG_INFO, "logged out as "..self.sessions[session_id])
+            self.sessions[session_id] = nil
         end
         return "/", 303
     end},
@@ -208,10 +209,10 @@ function Cogit:routes()
         end
         local repo = self.groups[gname][rname]
         local commit = repo:commit(first)
-        local prev = repo:find_prev(commit:id(), conf.limit)
+        local prev = repo:find_prev(commit:id(), limit)
         local env = {
             title=title, user=user, gname=gname, rname=rname, bname=bname,
-            commit=commit, limit=conf.limit, prev=prev, first=first,
+            commit=commit, limit=limit, prev=prev, first=first,
         }
         return lud.template.render_file("view/history.html", env)
     end},
@@ -271,7 +272,8 @@ local function new_cogit(path)
     self.sessions = {}
     self.initialized = false
     self.log_level = LOG_INFO
-    self.conf = dofile(path.."/conf.lua")
+    self.users = dofile(path.."/conf.lua")
+    self.cfg = cfg.new_cfg(path.."/conf.db")
     self:init()
     self:scan()
     self.app = lud.app.new_app(self:routes())

diff --git a/conf.lua b/conf.lua
index 56b7c07..b3f029e 100644
--- a/conf.lua
+++ b/conf.lua
@@ -3,17 +3,11 @@ Put this file on the same folder as public/ and customize it.
 ]]
 
 return {
-    title = "cogit",
-    port = 8080,
-    limit = 20, -- page size, for pagination
-    session_age = 2*60*60, -- login session duration in seconds
-    users = {
-        ["guest"] = {
-            salt = "GfwhQ/F6HYnv6g5qrpv58NgMWmOF6nsQXc8RVr6C8Fc=",
-            hash = "uxfQEiPSWAuu96rYpqYfi0kcue0ZiTvSCDX3ngFjC3RqLa7v9OouFd5UglJ7vh52nNDh2E9cG/f0RlVrLzIE9Q==",
-            nick = "guest",
-            name = "Guest",
-            groups = {"guests"},
-        },
+    ["guest"] = {
+        salt = "GfwhQ/F6HYnv6g5qrpv58NgMWmOF6nsQXc8RVr6C8Fc=",
+        hash = "uxfQEiPSWAuu96rYpqYfi0kcue0ZiTvSCDX3ngFjC3RqLa7v9OouFd5UglJ7vh52nNDh2E9cG/f0RlVrLzIE9Q==",
+        nick = "guest",
+        name = "Guest",
+        groups = {"guests"},
     },
 }