Module: Merb::SessionMixin::RequestMixin

Defined in:
lib/merb-core/dispatch/session.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

Adds class methods to Merb::Request object. Sets up repository of session store types. Sets the session ID key and expiry values.

:api: private



115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/merb-core/dispatch/session.rb', line 115

def self.included(base)
  base.extend ClassMethods
  
  # Keep track of all known session store types.
  base.cattr_accessor :registered_session_types
  base.registered_session_types = Dictionary.new
  base.class_inheritable_accessor :_session_id_key, :_session_secret_key,
                                  :_session_expiry
  
  base._session_id_key        = Merb::Config[:session_id_key] || '_session_id'
  base._session_expiry        = Merb::Config[:session_expiry] || 0
  base._session_secret_key    = Merb::Config[:session_secret_key]
end

Instance Method Details

#default_cookiesObject

Assign default cookie values

:api: private



231
232
233
234
235
236
237
238
# File 'lib/merb-core/dispatch/session.rb', line 231

def default_cookies
  defaults = {}
  if route && route.allow_fixation? && params.key?(_session_id_key)
    Merb.logger.info("Fixated session id: #{_session_id_key}")
    defaults[_session_id_key] = params[_session_id_key]
  end
  defaults
end

#default_session_storeObject

The default session store type.

:api: private



148
149
150
# File 'lib/merb-core/dispatch/session.rb', line 148

def default_session_store
  Merb::Config[:session_store] && Merb::Config[:session_store].to_sym
end

Destroy the session cookie.

:api: private



266
267
268
# File 'lib/merb-core/dispatch/session.rb', line 266

def destroy_session_cookie
  cookies.delete(_session_id_key)
end

#finalize_sessionObject Also known as: finalize_sessions

Teardown and/or persist the current sessions.

:api: private



223
224
225
# File 'lib/merb-core/dispatch/session.rb', line 223

def finalize_session
  session_stores.each { |name, store| store.finalize(self) }
end

#session(session_store = nil) ⇒ Object

Returns session container. Merb is able to handle multiple session stores, hence a parameter to pick it.

Parameters

session_store<String>

The type of session store to access,

defaults to default_session_store.

Notes

If no suitable session store type is given, it defaults to cookie-based sessions.

Returns

SessionContainer

an instance of a session store extending Merb::SessionContainer.

:api: public



176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/merb-core/dispatch/session.rb', line 176

def session(session_store = nil)
  session_store ||= default_session_store
  if class_name = self.class.registered_session_types[session_store]
    session_stores[session_store] ||= Object.full_const_get(class_name).setup(self)
  elsif fallback = self.class.registered_session_types.keys.first
    Merb.logger.warn "Session store '#{session_store}' not found. Check your configuration in init file."
    Merb.logger.warn "Falling back to #{fallback} session store."
    session(fallback)
  else
    msg = "No session store set. Set it in init file like this: c[:session_store] = 'activerecord'"
    Merb.logger.error!(msg)
    raise NoSessionContainer, msg            
  end
end

#session=(new_session) ⇒ Object

Parameters

new_session<Merb::SessionContainer>

A session store instance.

Notes

The session is assigned internally by its session_store_type key.

:api: private



198
199
200
201
202
203
204
205
206
# File 'lib/merb-core/dispatch/session.rb', line 198

def session=(new_session)
  if self.session?(new_session.class.session_store_type)
    original_session_id = self.session(new_session.class.session_store_type).session_id
    if new_session.session_id != original_session_id
      set_session_id_cookie(new_session.session_id)
    end
  end
  session_stores[new_session.class.session_store_type] = new_session
end

#session?(session_store = nil) ⇒ Boolean

Whether a session has been setup

Returns

Boolean

true if the session is part of the session stores configured.

:api: private

Returns:

  • (Boolean)


214
215
216
217
218
# File 'lib/merb-core/dispatch/session.rb', line 214

def session?(session_store = nil)
  (session_store ? [session_store] : session_stores).any? do |type, store|
    store.is_a?(Merb::SessionContainer)
  end
end

Returns

String

The value of the session cookie; either the session id or the actual encoded data.

:api: private



258
259
260
# File 'lib/merb-core/dispatch/session.rb', line 258

def session_cookie_value
  cookies[_session_id_key]
end

#session_storesObject

Returns

Hash

All active session stores by type.

:api: private



156
157
158
# File 'lib/merb-core/dispatch/session.rb', line 156

def session_stores
  @session_stores ||= {}
end

Sets session cookie value.

Parameters

value<String>

The value of the session cookie; either the session id or the actual encoded data.

options<Hash>

Cookie options like domain, path and expired.

:api: private



247
248
249
250
251
# File 'lib/merb-core/dispatch/session.rb', line 247

def set_session_cookie_value(value, options = {})
  defaults = {}
  defaults[:expires] = Time.now + _session_expiry if _session_expiry > 0
  cookies.set_cookie(_session_id_key, value, defaults.merge(options))
end