module Devise
Copy of constant deprecation module from Rails / Active Support version 6, so we can use it with Rails <= 5.0 versions. This can be removed once we support only Rails 5.1 or greater.
Constants
- ALL
Constants which holds devise configuration for extensions. Those should not be modified by the “end user” (this is why they are constants).
- CONTROLLERS
- NO_INPUT
Strategies
that do not require user input.- ROUTES
- STRATEGIES
- TRUE_VALUES
True values used to check params
- URL_HELPERS
- VERSION
Public Class Methods
Small method that adds a mapping to Devise
.
# File lib/devise.rb, line 360 def self.add_mapping(resource, options) mapping = Devise::Mapping.new(resource, options) @@mappings[mapping.name] = mapping @@default_scope ||= mapping.name @@helpers.each { |h| h.define_helpers(mapping) } mapping end
Register available devise modules. For the standard modules that Devise
provides, this method is called from lib/devise/modules.rb. Third-party modules need to be added explicitly using this method.
Note that adding a module using this method does not cause it to be used in the authentication process. That requires that the module be listed in the arguments passed to the ‘devise’ method in the model class definition.
Options:¶ ↑
+model+ - String representing the load path to a custom *model* for this module (to autoload.) +controller+ - Symbol representing the name of an existing or custom *controller* for this module. +route+ - Symbol representing the named *route* helper for this module. +strategy+ - Symbol representing if this module got a custom *strategy*. +insert_at+ - Integer representing the order in which this module's model will be included
All values, except :model, accept also a boolean and will have the same name as the given module name.
Examples:¶ ↑
Devise.add_module(:party_module) Devise.add_module(:party_module, strategy: true, controller: :sessions) Devise.add_module(:party_module, model: 'party_module/model') Devise.add_module(:party_module, insert_at: 0)
# File lib/devise.rb, line 393 def self.add_module(module_name, options = {}) options.assert_valid_keys(:strategy, :model, :controller, :route, :no_input, :insert_at) ALL.insert (options[:insert_at] || -1), module_name if strategy = options[:strategy] strategy = (strategy == true ? module_name : strategy) STRATEGIES[module_name] = strategy end if controller = options[:controller] controller = (controller == true ? module_name : controller) CONTROLLERS[module_name] = controller end NO_INPUT << strategy if options[:no_input] if route = options[:route] case route when TrueClass key, value = module_name, [] when Symbol key, value = route, [] when Hash key, value = route.keys.first, route.values.flatten else raise ArgumentError, ":route should be true, a Symbol or a Hash" end URL_HELPERS[key] ||= [] URL_HELPERS[key].concat(value) URL_HELPERS[key].uniq! ROUTES[module_name] = key end if options[:model] path = (options[:model] == true ? "devise/models/#{module_name}" : options[:model]) camelized = ActiveSupport::Inflector.camelize(module_name.to_s) Devise::Models.send(:autoload, camelized.to_sym, path) end Devise::Mapping.add_module module_name end
# File lib/devise.rb, line 340 def self.available_router_name router_name || :main_app end
# File lib/devise.rb, line 524 def self.deprecator @deprecator ||= ActiveSupport::Deprecation.new("5.0", "Devise") end
Generate a friendly string randomly to be used as token. By default, length is 20 characters.
# File lib/devise.rb, line 507 def self.friendly_token(length = 20) # To calculate real characters, we must perform this operation. # See SecureRandom.urlsafe_base64 rlength = (length * 3) / 4 SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz') end
Include helpers in the given scope to AC and AV.
# File lib/devise.rb, line 463 def self.include_helpers(scope) ActiveSupport.on_load(:action_controller) do include scope::Helpers if defined?(scope::Helpers) include scope::UrlHelpers end ActiveSupport.on_load(:action_view) do include scope::UrlHelpers end end
Get the mailer class from the mailer reference object.
# File lib/devise.rb, line 349 def self.mailer @@mailer_ref.get end
Set the mailer reference object to access the mailer.
# File lib/devise.rb, line 354 def self.mailer=(class_name) @@mailer_ref = ref(class_name) end
Specify an OmniAuth
provider.
config.omniauth :github, APP_ID, APP_SECRET
# File lib/devise.rb, line 457 def self.omniauth(provider, *args) config = Devise::OmniAuth::Config.new(provider, args) @@omniauth_configs[config.strategy_name.to_sym] = config end
# File lib/devise.rb, line 344 def self.omniauth_providers omniauth_configs.keys end
# File lib/devise.rb, line 332 def self.ref(arg) # TODO: Remove AS::Dependencies usage when dropping support to Rails < 7. if ActiveSupport::Dependencies.respond_to?(:reference) ActiveSupport::Dependencies.reference(arg) end Getter.new(arg) end
Regenerates url helpers considering Devise.mapping
# File lib/devise.rb, line 475 def self.regenerate_helpers! Devise::Controllers::UrlHelpers.remove_helpers! Devise::Controllers::UrlHelpers.generate_helpers! end
constant-time comparison algorithm to prevent timing attacks
# File lib/devise.rb, line 515 def self.secure_compare(a, b) return false if a.blank? || b.blank? || a.bytesize != b.bytesize l = a.unpack "C#{a.bytesize}" res = 0 b.each_byte { |byte| res |= byte ^ l.shift } res == 0 end
Default way to set up Devise
. Run rails generate devise_install to create a fresh initializer with all configuration values.
# File lib/devise.rb, line 313 def self.setup yield self end
Sets warden configuration using a block that will be invoked on warden initialization.
Devise.setup do |config| config.allow_unconfirmed_access_for = 2.days config.warden do |manager| # Configure warden to use other strategies, like oauth. manager.oauth(:twitter) end end
# File lib/devise.rb, line 449 def self.warden(&block) @@warden_config_blocks << block end