Module: DeviseTwoFactorable::Controllers::Helpers

Defined in:
lib/devise_two_factorable/helpers.rb,
lib/devise_two_factorable/controllers/helpers.rb

Instance Method Summary collapse

Instance Method Details

#authenticate_scope!Object



7
8
9
10
# File 'lib/devise_two_factorable/helpers.rb', line 7

def authenticate_scope!
  send(:"authenticate_#{resource_name}!", force: true)
  self.resource = send("current_#{resource_name}")
end

#ensure_resource!Object

Sanity check for resource validity

Raises:

  • (ArgumentError)


39
40
41
# File 'lib/devise_two_factorable/helpers.rb', line 39

def ensure_resource!
  raise ArgumentError, 'Should not happen' if resource.nil?
end

#is_otp_trusted_device_for?(resource) ⇒ Boolean

is the current browser trusted?

Returns:

  • (Boolean)


67
68
69
70
71
72
73
74
75
# File 'lib/devise_two_factorable/helpers.rb', line 67

def is_otp_trusted_device_for?(resource)
  return false unless resource.class.otp_trust_persistence
  if cookies[otp_scoped_persistence_cookie].present?
    cookies.signed[otp_scoped_persistence_cookie] ==
      [resource.to_key, resource.authenticatable_salt, resource.otp_persistence_seed]
  else
    false
  end
end

#needs_credentials_refresh?(resource) ⇒ Boolean

check if the resource needs a credentials refresh. IE, they need to be asked a password again to access this resource.

Returns:

  • (Boolean)


49
50
51
52
53
54
# File 'lib/devise_two_factorable/helpers.rb', line 49

def needs_credentials_refresh?(resource)
  return false unless resource.class.otp_credentials_refresh

  (!session[otp_scoped_refresh_property].present? ||
      (session[otp_scoped_refresh_property] < DateTime.now)).tap { |need| otp_set_refresh_return_url if need }
end

#otp_authenticator_token_image(resource) ⇒ Object

returns the URL for the QR Code to initialize the Authenticator device



127
128
129
130
131
132
133
# File 'lib/devise_two_factorable/helpers.rb', line 127

def otp_authenticator_token_image(resource)
  data = resource.otp_provisioning_uri
  qrcode = RQRCode::QRCode.new(data, level: :m, mode: :byte_8bit)
  png = qrcode.as_png(fill: 'white', color: 'black', border_modules: 1, module_px_size: 4)
  url = "data:image/png;base64,#{Base64.encode64(png.to_s).strip}"
  image_tag(url, alt: 'OTP Authenticator QRCode')
end

#otp_clear_trusted_device_for(_resource) ⇒ Object

make the current browser NOT trusted



112
113
114
# File 'lib/devise_two_factorable/helpers.rb', line 112

def otp_clear_trusted_device_for(_resource)
  cookies.delete(otp_scoped_persistence_cookie)
end

#otp_fetch_refresh_return_urlObject



93
94
95
# File 'lib/devise_two_factorable/helpers.rb', line 93

def otp_fetch_refresh_return_url
  session.delete(otp_scoped_refresh_return_url_property) { :root }
end

#otp_refresh_credentials_for(resource) ⇒ Object

credentials are refreshed



59
60
61
62
# File 'lib/devise_two_factorable/helpers.rb', line 59

def otp_refresh_credentials_for(resource)
  return false unless resource.class.otp_credentials_refresh
  session[otp_scoped_refresh_property] = (Time.now + resource.class.otp_credentials_refresh)
end

#otp_reset_persistence_for(resource) ⇒ Object

clears the persistence list for this kind of resource



119
120
121
122
# File 'lib/devise_two_factorable/helpers.rb', line 119

def otp_reset_persistence_for(resource)
  otp_clear_trusted_device_for(resource)
  resource.reset_otp_persistence!
end


105
106
107
# File 'lib/devise_two_factorable/helpers.rb', line 105

def otp_scoped_persistence_cookie
  "otp_#{resource_name}_device_trusted"
end

#otp_scoped_refresh_propertyObject



101
102
103
# File 'lib/devise_two_factorable/helpers.rb', line 101

def otp_scoped_refresh_property
  "otp_#{resource_name}refresh_after".to_sym
end

#otp_scoped_refresh_return_url_propertyObject



97
98
99
# File 'lib/devise_two_factorable/helpers.rb', line 97

def otp_scoped_refresh_return_url_property
  "otp_#{resource_name}refresh_return_url".to_sym
end

#otp_set_flash_message(key, kind, options = {}) ⇒ Object

similar to DeviseController#set_flash_message, but sets the scope inside the otp controller



16
17
18
19
20
21
22
23
# File 'lib/devise_two_factorable/helpers.rb', line 16

def otp_set_flash_message(key, kind, options = {})
  options[:scope] ||= "devise.two_factor.#{controller_name}"
  options[:default] = Array(options[:default]).unshift(kind.to_sym)
  options[:resource_name] = resource_name
  options = devise_i18n_options(options) if respond_to?(:devise_i18n_options, true)
  message = I18n.t("#{options[:resource_name]}.#{kind}", options)
  flash[key] = message if message.present?
end

#otp_set_refresh_return_urlObject



89
90
91
# File 'lib/devise_two_factorable/helpers.rb', line 89

def otp_set_refresh_return_url
  session[otp_scoped_refresh_return_url_property] = request.fullpath
end

#otp_set_trusted_device_for(resource) ⇒ Object

make the current browser trusted



80
81
82
83
84
85
86
87
# File 'lib/devise_two_factorable/helpers.rb', line 80

def otp_set_trusted_device_for(resource)
  return unless resource.class.otp_trust_persistence
  cookies.signed[otp_scoped_persistence_cookie] = {
    httponly: true,
    expires: Time.now + resource.class.otp_trust_persistence,
    value: [resource.to_key, resource.authenticatable_salt, resource.otp_persistence_seed]
  }
end

#otp_tObject



25
26
# File 'lib/devise_two_factorable/helpers.rb', line 25

def otp_t
end

#recovery_enabled?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/devise_two_factorable/helpers.rb', line 32

def recovery_enabled?
  resource_class.otp_recovery_tokens && (resource_class.otp_recovery_tokens > 0)
end

#trusted_devices_enabled?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/devise_two_factorable/helpers.rb', line 28

def trusted_devices_enabled?
  resource.class.otp_trust_persistence && (resource.class.otp_trust_persistence > 0)
end