Class: Session

Inherits:
Object
  • Object
show all
Defined in:
backend/app/model/session.rb

Constant Summary

SESSION_ID_LENGTH =
32

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Session) initialize(sid = nil, store = nil)

Returns a new instance of Session



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
# File 'backend/app/model/session.rb', line 11

def initialize(sid = nil, store = nil)
  if not sid
    # Create a new session in the DB
    DB.open do |db|

      while true
        sid = SecureRandom.hex(SESSION_ID_LENGTH)

        completed = DB.attempt {
          db[:session].insert(:session_id => Digest::SHA1.hexdigest(sid),
                              :session_data => [Marshal.dump({})].pack("m*"),
                              :system_mtime => Time.now)
          true
        }.and_if_constraint_fails {
          # Retry with a different session ID.
          false
        }

        break if completed
      end

      @id = sid
      @store = {}
    end
  else
    @id = sid
    @store = store
  end
end

Instance Attribute Details

- (Object) id (readonly)

Returns the value of attribute id



8
9
10
# File 'backend/app/model/session.rb', line 8

def id
  @id
end

Class Method Details

+ (Object) expire(sid)



55
56
57
58
59
# File 'backend/app/model/session.rb', line 55

def self.expire(sid)
  DB.open do |db|
    db[:session].filter(:session_id => Digest::SHA1.hexdigest(sid)).delete
  end
end

+ (Object) expire_old_sessions



62
63
64
65
66
67
68
# File 'backend/app/model/session.rb', line 62

def self.expire_old_sessions
  max_age = AppConfig[:session_expire_after_seconds] || (7 * 24 * 60 * 60)

  DB.open do |db|
    db[:session].where {system_mtime < (Time.now - max_age)}.filter(:expirable => 1).delete
  end
end

+ (Object) find(sid)



42
43
44
45
46
47
48
49
50
51
52
# File 'backend/app/model/session.rb', line 42

def self.find(sid)
  DB.open do |db|
    session_data = db[:session].filter(:session_id => Digest::SHA1.hexdigest(sid)).get(:session_data)

    if session_data
      Session.new(sid, Marshal.load(session_data.unpack("m*").first))
    else
      nil
    end
  end
end

Instance Method Details

- (Object) [](key)



76
77
78
# File 'backend/app/model/session.rb', line 76

def [](key)
  return @store[key]
end

- (Object) []=(key, val)



71
72
73
# File 'backend/app/model/session.rb', line 71

def []=(key, val)
  @store[key] = val
end

- (Object) age



101
102
103
104
105
106
107
108
109
# File 'backend/app/model/session.rb', line 101

def age
  system_mtime = 0
  DB.open do |db|
    system_mtime = db[:session]
      .filter(:session_id => Digest::SHA1.hexdigest(@id))
      .get(:system_mtime)
  end
  (Time.now - system_mtime).to_i
end

- (Object) save



81
82
83
84
85
86
87
88
89
# File 'backend/app/model/session.rb', line 81

def save
  DB.open do |db|
    db[:session]
      .filter(:session_id => Digest::SHA1.hexdigest(@id))
      .update(:session_data => [Marshal.dump(@store)].pack("m*"),
              :expirable => @store[:expirable] ? 1 : 0,
              :system_mtime => Time.now)
  end
end

- (Object) touch



92
93
94
95
96
97
98
# File 'backend/app/model/session.rb', line 92

def touch
  DB.open do |db|
    db[:session]
      .filter(:session_id => Digest::SHA1.hexdigest(@id))
      .update(:system_mtime => Time.now)
  end
end