class ActionDispatch::Session::CodeIgniterStore

A session store for Rails to handle Pyro sessions.

Constants

ACTION_DISPATCH_LOGGER_KEY

The request env hash key has the logger instance.

SESSION_RECORD_KEY

The key name used to store the session model in the request env.

Public Class Methods

new(app, options={}) click to toggle source

@param [Object] app @param [Hash] options @option options [String] :key ('default_pyrocms') The session cookie name.

Calls superclass method
# File lib/action_dispatch/session/code_igniter_store.rb, line 18
def initialize(app, options={})
  super(app, { key: 'default_pyrocms' }.merge(options))
end

Private Instance Methods

commit_session?(req, session, options) click to toggle source

Should the session be persisted?

@note This is called from +Rack::Session::Abstract::Persisted#commit_session+.

@!visibility public

@see www.rubydoc.info/gems/rack/Rack/Session/Abstract/Persisted#commit_session-instance_method

Rack::Session::Abstract::Persisted#commit_session

@see api.rubyonrails.org/classes/ActionDispatch/Request.html ActionDispatch::Request

@param [ActionDispatch::Request] req @param [Hash] session @param [Hash] options @return [Boolean] when true write_session will be called

Calls superclass method
# File lib/action_dispatch/session/code_igniter_store.rb, line 57
def commit_session?(req, session, options)
  # If session_filter returns true then let super decide if we commit the session.
  Firebug.config.session_filter.call(req) ? super : false
end
delete_session(req, sid, options) click to toggle source

Deletes then creates a new session in the database.

@!visibility public

@see api.rubyonrails.org/classes/ActionDispatch/Request.html ActionDispatch::Request

@param [ActionDispatch::Request] req @param [String] sid @param [Hash] options @return [String, nil] the new session id or nil if options[:drop].

# File lib/action_dispatch/session/code_igniter_store.rb, line 102
def delete_session(req, sid, options)
  silence_logger(req) do
    # Get the current database record for this session then delete it.
    find_session_model(req, sid).delete
    return if options[:drop]

    req.env[SESSION_RECORD_KEY] = nil
    # Generate a new one and return its ID
    find_session_model(req).tap { |s| s.save if options[:renew] }.session_id
  end
end
extract_session_id(req) click to toggle source

Tries to find the session ID in the requests cookies.

@!visibility public

@see api.rubyonrails.org/classes/ActionDispatch/Request.html ActionDispatch::Request

@param [ActionDispatch::Request] req @return [String, nil]

# File lib/action_dispatch/session/code_igniter_store.rb, line 122
def extract_session_id(req)
  sid = req.cookies[@key]
  # the request didn't have the session cookie so create a new session ID.
  return generate_sid if sid.nil?
  # sometimes the cookie contains just the session ID.
  return sid if sid.size <= 32

  Firebug.decrypt_cookie(sid)[:session_id]
end
find_by_params(req, sid) click to toggle source

The parameters used to find a session in the database.

@param [ActionDispatch::Request] req @param [String, Rack::Session::SessionId] sid @return [Hash]

# File lib/action_dispatch/session/code_igniter_store.rb, line 160
def find_by_params(req, sid)
  # the +sid+ can sometimes be a +Rack::Session::SessionId+ if a +ActionDispatch::Session::AbstractSecureStore+
  # is used, so if it's not a string then get the +public_id+.
  params = { session_id: sid.is_a?(String) ? sid : sid.public_id }
  params[:ip_address] = req.remote_ip if Firebug.config.match_ip_address.call(req)
  if Firebug.config.match_user_agent.call(req)
    params[:user_agent] = Firebug.config.truncate_user_agent ? req.user_agent&.slice(0...120) : req.user_agent
  end
  params
end
find_session(req, sid) click to toggle source

Finds an existing session or creates a new one.

@!visibility public

@see api.rubyonrails.org/classes/ActionDispatch/Request.html ActionDispatch::Request

@param [ActionDispatch::Request] req @param [String, Rack::Session::SessionId] sid @return [Array<String, Hash, Array>]

# File lib/action_dispatch/session/code_igniter_store.rb, line 33
def find_session(req, sid)
  silence_logger(req) do
    model = find_session_model(req, sid)
    req.env[SESSION_RECORD_KEY] = model
    # +Rack::Session::Abstract::Persisted#load_session+ expects this to return an Array with the first value being
    # the session ID and the second the actual session data.
    [model.session_id, model.user_data]
  end
end
find_session_model(req, sid=nil) click to toggle source

Attempts to find an existing session record or returns a new one.

@param [ActionDispatch::Request] req @param [String, Rack::Session::SessionId] sid @return [Firebug::Session]

# File lib/action_dispatch/session/code_igniter_store.rb, line 137
def find_session_model(req, sid=nil)
  if sid
    model = req.env[SESSION_RECORD_KEY] || Firebug::Session.find_by(find_by_params(req, sid))
    return model if model

    # use a different session ID in case the reason for not finding the record is that the user_agent
    # or ip_address didn't match.
    sid = generate_sid
  end

  Firebug::Session.new(
    session_id: sid || generate_sid,
    last_activity: Time.current.to_i,
    user_agent: req.user_agent,
    ip_address: req.remote_ip
  )
end
silence_logger(req) { || ... } click to toggle source

If silence logger is enabled, disable logger output for the block.

@param [ActionDispatch::Request] req

# File lib/action_dispatch/session/code_igniter_store.rb, line 174
def silence_logger(req)
  logger = req.env[ACTION_DISPATCH_LOGGER_KEY] || ActiveRecord::Base.logger
  if logger.respond_to?(:silence) && Firebug.config.silence_logger
    logger.silence { yield }
  else
    yield
  end
end
write_session(req, sid, session, _options) click to toggle source

Writes the session information to the database.

@!visibility public

@see api.rubyonrails.org/classes/ActionDispatch/Request.html ActionDispatch::Request

@param [ActionDispatch::Request] req @param [String] sid @param [Hash] session @param [Hash] _options @return [String, FalseClass] encrypted and base64 encoded string of the session data or false if the

session could not be saved.
# File lib/action_dispatch/session/code_igniter_store.rb, line 74
def write_session(req, sid, session, _options)
  silence_logger(req) do
    model = find_session_model(req, sid)
    model_params = {
      session_id: model.session_id,
      user_agent: req.user_agent || '', # user_agent can't be null
      ip_address: req.remote_ip || '',  # ip_address can't be null
      user_data: session
    }
    # Returning false will cause Rack to output a warning.
    return false unless model.update(model_params)

    req.env[SESSION_RECORD_KEY] = model
    # Return the encrypted cookie format of the data. Rack sets this value as the cookie in the response.
    model.cookie_data
  end
end