class Challah::Session

Attributes

ip[RW]
params[R]
persist[RW]
request[R]
return_to[RW]
store[RW]
user[RW]
user_model[R]

Public Class Methods

create(user_or_user_id, request = nil, params = nil, user_model = nil) click to toggle source

Manually create a new Session

# File lib/challah/session.rb, line 112
def self.create(user_or_user_id, request = nil, params = nil, user_model = nil)
  if user_model.nil?
    user_model = Challah.user
  end

  session = Session.new(request, params, user_model)

  user_record = if user_model === user_or_user_id
    user_or_user_id
  else
    begin
      GlobalID::Locator.locate(user_or_user_id)
    rescue ActiveRecord::RecordNotFound
      nil
    end
  end

  if user_record and user_record.valid_session?
    session.user = user_record
    session.persist = true
  end

  session
end
create!(user_or_user_id, request = nil, params = nil, user_model = nil) click to toggle source

Manually create a session, and save it.

# File lib/challah/session.rb, line 138
def self.create!(user_or_user_id, request = nil, params = nil, user_model = nil)
  session = create(user_or_user_id, request, params, user_model)
  session.save
  session
end
destroy() click to toggle source

Clear out any existing sessions

# File lib/challah/session.rb, line 145
def self.destroy
  session = Session.find
  session.destroy if session
  session
end
find(*args) click to toggle source

Load any existing session from the session store

# File lib/challah/session.rb, line 152
def self.find(*args)
  session = Session.new(*args)
  session.find
  session
end
new(request = nil, params = {}, user_model = nil) click to toggle source
# File lib/challah/session.rb, line 9
def initialize(request = nil, params = {}, user_model = nil)
  @request = request
  @params = params || {}
  @user_model = user_model || Challah.user
  @store = Challah.options[:storage_class].new(self)
end

Public Instance Methods

destroy() click to toggle source
# File lib/challah/session.rb, line 16
def destroy
  self.store.destroy

  @valid = false
  @user = nil
end
find() click to toggle source
# File lib/challah/session.rb, line 23
def find
  self.read

  # If no session was found, try and authenticate
  valid?

  if @valid.nil?
    self.authenticate!
  end

  self
end
inspect() click to toggle source
# File lib/challah/session.rb, line 36
def inspect
  "#<Session:0x#{object_id.to_s(16)} valid=#{valid?} store=#{self.store.inspect} user=#{user_id || 'nil'}>"
end
method_missing(sym, *args, &block) click to toggle source

Allow for dynamic setting of instance variables. also allows for variable? to see if it was provided

Calls superclass method
# File lib/challah/session.rb, line 99
def method_missing(sym, *args, &block)
  if @params.has_key?(sym)
    return @params[sym]
  elsif sym.to_s =~ /^[a-z0-9_]*=$/
    return @params[sym.to_s.sub(/^(.*?)=$/, '\1').to_sym] = args.shift
  elsif sym.to_s =~ /^[a-z0-9_]*\?$/
    return !!@params[sym.to_s.sub(/^(.*?)\?$/, '\1').to_sym]
  end

  super(sym, *args, &block)
end
persist?() click to toggle source
# File lib/challah/session.rb, line 40
def persist?
  !!@persist
end
read() click to toggle source
# File lib/challah/session.rb, line 44
def read
  persistence_token, user_id = self.store.read
  return false if persistence_token.nil? or user_id.nil?

  store_user = nil

  begin
    store_user = GlobalID::Locator.locate(user_id)
  rescue ActiveRecord::RecordNotFound
    nil
  end

  if store_user and store_user.valid_session? and store_user.persistence_token == persistence_token
    if store_user.valid_session?
      self.user = store_user
      @valid = true
    end
  end

  self
end
save() click to toggle source
# File lib/challah/session.rb, line 66
def save
  return false unless valid?

  if self.user and persist?
    self.store.save(self.user.persistence_token, user_id)
    return true
  end

  false
end
user_id() click to toggle source

Id of the current user.

# File lib/challah/session.rb, line 78
def user_id
  @user_id ||= self.user ? self.user.to_global_id : nil
end
username() click to toggle source
# File lib/challah/session.rb, line 82
def username
  params[:username] || params[:email] || ""
end
username?() click to toggle source
# File lib/challah/session.rb, line 86
def username?
  !username.empty?
end
valid?() click to toggle source

Returns true if this session has been authenticated and is ready to save.

# File lib/challah/session.rb, line 91
def valid?
  return @valid if @valid != nil
  return true if self.user and self.user.valid_session?
  authenticate!
end

Protected Instance Methods

authenticate!() click to toggle source

Try and authenticate against the various auth techniques. If one technique works, then just exit and make the session active.

# File lib/challah/session.rb, line 162
def authenticate!
  Challah.techniques.values.each do |klass|
    technique = klass.new(self)
    technique.user_model = user_model if technique.respond_to?(:"user_model=")

    @user = technique.authenticate

    if @user
      @persist = technique.respond_to?(:persist?) ? technique.persist? : false
      break
    end
  end

  if @user
    # Only update user record if persistence is on for the technique.
    # Otherwise this builds up quick (one session for each API call)
    if @persist
      @user.successful_authentication!(ip)
    end

    return @valid = true
  end

  @valid = false
end