module Authlogic
module Session
# Authlogic tries to check the state of the record before creating the session. If
# your record responds to the following methods and any of them return false,
# validation will fail:
#
# Method name Description
# active? Is the record marked as active?
# approved? Has the record been approved?
# confirmed? Has the record been confirmed?
#
# Authlogic does nothing to define these methods for you, its up to you to define what
# they mean. If your object responds to these methods Authlogic will use them,
# otherwise they are ignored.
#
# What's neat about this is that these are checked upon any type of login. When
# logging in explicitly, by cookie, session, or basic http auth. So if you mark a user
# inactive in the middle of their session they wont be logged back in next time they
# refresh the page. Giving you complete control.
#
# Need Authlogic to check your own "state"? No problem, check out the hooks section
# below. Add in a before_validation to do your own checking. The sky is the limit.
module MagicStates
def self.included(klass)
klass.class_eval do
extend Config
include InstanceMethods
validate :validate_magic_states, unless: :disable_magic_states?
end
end
# Configuration for the magic states feature.
module Config
# Set this to true if you want to disable the checking of active?, approved?, and
# confirmed? on your record. This is more or less of a convenience feature, since
# 99% of the time if those methods exist and return false you will not want the
# user logging in. You could easily accomplish this same thing with a
# before_validation method or other callbacks.
#
# * Default: false
# * Accepts: Boolean
def disable_magic_states(value = nil)
rw_config(:disable_magic_states, value, false)
end
alias_method :disable_magic_states=, :disable_magic_states
end
# The methods available for an Authlogic::Session::Base object that make up the
# magic states feature.
module InstanceMethods
private
def disable_magic_states?
self.class.disable_magic_states == true
end
# @api private
def required_magic_states_for(record)
%i[active approved confirmed].select { |state|
record.respond_to?("#{state}?")
}
end
def validate_magic_states
return true if attempted_record.nil?
required_magic_states_for(attempted_record).each do |required_status|
next if attempted_record.send("#{required_status}?")
errors.add(
:base,
I18n.t(
"error_messages.not_#{required_status}",
default: "Your account is not #{required_status}"
)
)
return false
end
true
end
end
end
end
end