1
1
local extension = ...
2
2
3
3
local class = require (' jls.lang.class' )
4
+ local serialization = require (' jls.lang.serialization' )
4
5
local logger = extension :getLogger ()
6
+ local File = require (' jls.io.File' )
5
7
local HttpExchange = require (' jls.net.http.HttpExchange' )
6
8
local HttpFilter = require (' jls.net.http.HttpFilter' )
7
9
local Url = require (' jls.net.Url' )
@@ -64,6 +66,10 @@ local function refreshUsers(users)
64
66
end
65
67
end
66
68
69
+ local function getSessionsFile ()
70
+ return File :new (extension :getEngine ():getWorkDirectory (), ' sessions.dat' )
71
+ end
72
+
67
73
local sessionFilter
68
74
69
75
extension :subscribeEvent (' startup' , function ()
@@ -73,10 +79,24 @@ extension:subscribeEvent('startup', function()
73
79
sessionFilter :close ()
74
80
end
75
81
sessionFilter = HttpFilter .session (configuration .maxAge , configuration .idleTimeout )
82
+ if configuration .keepSessions then
83
+ local sessionsFile = getSessionsFile ()
84
+ if sessionsFile :isFile () then
85
+ local status , sessions = pcall (serialization .deserialize , sessionsFile :readAll (), ' {jls.net.http.HttpSession}' )
86
+ if status then
87
+ logger :info (' restoring %l session(s)' , sessions )
88
+ sessionFilter :addSessions (sessions )
89
+ sessionFilter :cleanup ()
90
+ sessionsFile :delete ()
91
+ else
92
+ logger :warn (' unable to read sessions due to %s' , sessions )
93
+ end
94
+ end
95
+ end
76
96
cleanup ()
77
97
refreshUsers (configuration .users )
78
98
function sessionFilter :onCreated (session )
79
- session .attributes .user = nil
99
+ session .attributes .userName = nil
80
100
session .attributes .permission = configuration .defaultPermission or ' '
81
101
end
82
102
extension :addContext (' /logout' , function (exchange )
@@ -95,7 +115,7 @@ extension:subscribeEvent('startup', function()
95
115
local user = userMap [info .name ]
96
116
if user and user :checkPassword (encrypt (info .password )) then
97
117
local session = exchange :getSession ()
98
- session .attributes .user = user
118
+ session .attributes .userName = info . name
99
119
if user .permission then
100
120
session .attributes .permission = user .permission
101
121
end
@@ -155,5 +175,13 @@ extension:subscribeEvent('refresh', function()
155
175
end )
156
176
157
177
extension :subscribeEvent (' shutdown' , function ()
178
+ if extension :getConfiguration ().keepSessions then
179
+ sessionFilter :cleanup ()
180
+ local sessions = sessionFilter :getSessions ()
181
+ if # sessions > 0 then
182
+ local s = serialization .serialize (sessions )
183
+ getSessionsFile ():write (s )
184
+ end
185
+ end
158
186
cleanup ()
159
187
end )
0 commit comments