--[[ /* * Baltisot * Copyright (C) 1999-2008 Nicolas "Pixel" Noble * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ]]-- local session_expire = 60 * 60 local session_cleanup_throttle = 60 * 10 local last_cleanup = time() local sessions = {} local function generate_new_session() local ticket = GenTicket() sessions[ticket] = { data = {}, access = time() } return ticket end local function clean_sessions() local t = time() if last_cleanup <= (t - session_cleanup_throttle) then local expired, k, v = t - session_expire for k, v in pairs(sessions) do if v.access <= expired then sessions[k] = nil end end last_cleanup = t end end function get_cookies(req) local cookies = {} if req.headers.Cookie then local cookie_strings = split(req.headers.Cookie, ";") local k, v for k, v in pairs(cookie_strings) do local cname, cvalue = string.match(v, "([^=]+)=(.+)") if cname then cookies[trim(cname)] = trim(cvalue) end end end return cookies end function set_cookie(res, key, val) res.cookies_path = "/" res.cookies = key .. "=" .. val end function get_session(req, res) local sid clean_sessions() sid = get_cookies(req)["sid"] if not sid or not sessions[sid] then sid = generate_new_session() end set_cookie(res, "sid", sid) sessions[sid].access = time() return sessions[sid].data, sid end