-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathsessions.rb
106 lines (89 loc) · 2.96 KB
/
sessions.rb
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
require 'sqlite3'
class Session
def initialize(row)
@sid = row["sid"];
@uid = row["uid"];
@user_agent = row["user_agent"];
@remote_ip = row["remote_ip"];
@creation = row["creation"];
@validity = row["validity"];
end
def Session.create(sid, uid, user_agent, ip, creation, validity)
row = {
"sid" => sid,
"uid" => uid,
"user_agent" => user_agent,
"remote_ip" => ip,
"creation" => creation,
"validity" => validity }
Session.new(row)
end
attr_accessor :sid
attr_accessor :uid
attr_accessor :user_agent
attr_accessor :remote_ip
attr_accessor :creation
attr_accessor :validity
end
class Sessions
def initialize()
@lastSessionsCleanUpTime = 0;
end
def load(db)
@db = db
sql = <<SQL
PRAGMA foreign_keys = ON;
create table if not exists sessions (
sid TEXT PRIMARY KEY,
uid INTEGER UNSIGNED,
user_agent TEXT,
remote_ip TEXT,
creation INTEGER,
validity INTEGER,
FOREIGN KEY(uid) REFERENCES users(uid) ON UPDATE CASCADE ON DELETE CASCADE);
SQL
@db.execute_batch(sql);
end
def get(uid, remote_ip, user_agent)
@db.execute("SELECT * FROM sessions WHERE uid='#{uid}' AND user_agent='#{user_agent}' AND remote_ip='#{remote_ip}' LIMIT 1") do |row|
return Session.new(row)
end
nil;
end
def insert(s)
@db.execute("INSERT INTO sessions (sid, uid, user_agent, remote_ip, creation, validity) VALUES ('#{s.sid}', '#{s.uid}', '#{s.user_agent}', '#{s.remote_ip}', #{s.creation}, #{s.validity})")
end
def purge()
currentTime = Time.now()
diff = currentTime - @lastSessionsCleanUpTime
if(diff.to_i > 60 * 10) # 10min
now = currentTime.strftime("%s");
debug("[DB] invalidate_sessions");
@db.execute("DELETE FROM sessions WHERE validity <= ?", now);
@lastSessionsCleanUpTime = currentTime;
end
end
def check( sid, remote_ip, user_agent )
#TODO Change a flag in order to add a message to the response when the user try to access an invalidated session
now = (Time.now()).strftime("%s");
debug("[DB] check_session");
@db.execute("SELECT uid FROM sessions WHERE sid='#{sid}' AND user_agent='#{user_agent}' AND remote_ip='#{remote_ip}' AND VALIDITY > ? LIMIT 1", now) do |row|
return row["uid"]
end
nil;
end
def create(uid, remote_ip, user_agent)
return false if(uid == nil)
s = get(uid, remote_ip, user_agent)
return s if(s)
now = Time.now()
creation = now.strftime("%s");
#TODO constant for session validity
validity = (now + (24*60*60)).strftime("%s");
r = Random.new();
hash = [ r.bytes(32) ].pack("m").strip
s = Session.create(hash, uid, user_agent, remote_ip, creation, validity);
insert(s)
s
end
end