module Authlogic module ActsAsAuthentic # This module is responsible for maintaining the single_access token. For more # information the single access token and how to use it, see the # Authlogic::Session::Params module. module SingleAccessToken def self.included(klass) klass.class_eval do extend Config add_acts_as_authentic_module(Methods) end end # All configuration for the single_access token aspect of acts_as_authentic. # # These methods become class methods of ::ActiveRecord::Base. module Config # The single access token is used for authentication via URLs, such as a private # feed. That being said, if the user changes their password, that token probably # shouldn't change. If it did, the user would have to update all of their URLs. So # be default this is option is disabled, if you need it, feel free to turn it on. # # * Default: false # * Accepts: Boolean def change_single_access_token_with_password(value = nil) rw_config(:change_single_access_token_with_password, value, false) end alias_method( :change_single_access_token_with_password=, :change_single_access_token_with_password ) end # All method, for the single_access token aspect of acts_as_authentic. # # This module, as one of the `acts_as_authentic_modules`, is only included # into an ActiveRecord model if that model calls `acts_as_authentic`. module Methods def self.included(klass) return unless klass.column_names.include?("single_access_token") klass.class_eval do include InstanceMethods validates_uniqueness_of :single_access_token, if: :single_access_token_changed? before_validation :reset_single_access_token, if: :reset_single_access_token? if respond_to?(:after_password_set) after_password_set( :reset_single_access_token, if: :change_single_access_token_with_password? ) end end end # :nodoc: module InstanceMethods # Resets the single_access_token to a random friendly token. def reset_single_access_token self.single_access_token = Authlogic::Random.friendly_token end # same as reset_single_access_token, but then saves the record. def reset_single_access_token! reset_single_access_token save_without_session_maintenance end protected def reset_single_access_token? single_access_token.blank? end def change_single_access_token_with_password? self.class.change_single_access_token_with_password == true end end end end end end