This repository has been archived by the owner on Feb 6, 2021. It is now read-only.
/
session.lua
115 lines (91 loc) · 2.65 KB
/
session.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
-- Luawa
-- File: session.lua
-- Desc: deals with session management (memory-based, shared between ngx workers)
local table = table
local json = require('cjson.safe')
local luawa = require('luawa.core')
local session = {
config = {
expire = 24 * 3600
}
}
-- Init
function session:_init()
self.request = luawa.request
self.utils = luawa.utils
end
-- Request start
function session:_start()
--get session id, or set
ngx.ctx.session_id = self.request.cookie.luawa_sessionid or self:generateId()
--is there a session in the memory? set to empty json string
if not ngx.shared[luawa.shm_prefix .. 'session']:get(ngx.ctx.session_id) then
ngx.shared[luawa.shm_prefix .. 'session']:set(ngx.ctx.session_id, '{}')
end
end
--generate & set an ID
function session:generateId()
--generate random id
local id = self.utils.digest(self.utils.random_string(32))
--send to user via cookie (expires in 24h)
self.request:setCookie('luawa_sessionid', id, self.config.expire)
return id
end
--set session data
function session:set(key, value)
--get table assign value
local data = self:get()
if not data then return false end
data[key] = value
--encode + set to session
ngx.shared[luawa.shm_prefix .. 'session']:set(ngx.ctx.session_id, json.encode(data))
end
--get session data
function session:get(key)
--get + decode
local data, err = json.decode(ngx.shared[luawa.shm_prefix .. 'session']:get(ngx.ctx.session_id))
if not data then return false end
--return data.key or data
if not key then return data else return data[key] end
end
--delete session data
function session:delete(key)
--get + remove
local data = self:get()
data[key] = nil
--encode + set to session
ngx.shared[luawa.shm_prefix .. 'session']:set(ngx.ctx.session_id, json.encode(data))
end
--get/generate token
function session:getToken()
local token = self:get('token')
--generate token
if not token then
token = self.utils.random_string(16)
self:set('token', token)
end
return token
end
--validate token
function session:checkToken(token)
--check token
local result = self:get('token') == token
--delete token, get a new one
self:delete('token')
self:getToken()
return result
end
--add message
function session:addMessage(type, text)
local messages = self:get('_messages') or {}
table.insert(messages, { type = type, text = text })
self:set('_messages', messages)
end
--get messages
function session:getMessages()
local messages = self:get('_messages') or {}
self:set('_messages', {})
return messages
end
--return
return session